File manager - Edit - /home/u478019808/domains/bestandroidphones.store/public_html/static/img/logo/fonts.tar
Back
class-wp-font-utils.php 0000644 00000021270 15024463243 0011115 0 ustar 00 <?php /** * Font Utils class. * * Provides utility functions for working with font families. * * @package WordPress * @subpackage Fonts * @since 6.5.0 */ /** * A class of utilities for working with the Font Library. * * These utilities may change or be removed in the future and are intended for internal use only. * * @since 6.5.0 * @access private */ class WP_Font_Utils { /** * Adds surrounding quotes to font family names that contain special characters. * * It follows the recommendations from the CSS Fonts Module Level 4. * @link https://www.w3.org/TR/css-fonts-4/#font-family-prop * * @since 6.5.0 * * @param string $item A font family name. * @return string The font family name with surrounding quotes, if necessary. */ private static function maybe_add_quotes( $item ) { // Matches strings that are not exclusively alphabetic characters or hyphens, and do not exactly follow the pattern generic(alphabetic characters or hyphens). $regex = '/^(?!generic\([a-zA-Z\-]+\)$)(?!^[a-zA-Z\-]+$).+/'; $item = trim( $item ); if ( preg_match( $regex, $item ) ) { $item = trim( $item, "\"'" ); return '"' . $item . '"'; } return $item; } /** * Sanitizes and formats font family names. * * - Applies `sanitize_text_field`. * - Adds surrounding quotes to names containing any characters that are not alphabetic or dashes. * * It follows the recommendations from the CSS Fonts Module Level 4. * @link https://www.w3.org/TR/css-fonts-4/#font-family-prop * * @since 6.5.0 * @access private * * @see sanitize_text_field() * * @param string $font_family Font family name(s), comma-separated. * @return string Sanitized and formatted font family name(s). */ public static function sanitize_font_family( $font_family ) { if ( ! $font_family ) { return ''; } $output = sanitize_text_field( $font_family ); $formatted_items = array(); if ( str_contains( $output, ',' ) ) { $items = explode( ',', $output ); foreach ( $items as $item ) { $formatted_item = self::maybe_add_quotes( $item ); if ( ! empty( $formatted_item ) ) { $formatted_items[] = $formatted_item; } } return implode( ', ', $formatted_items ); } return self::maybe_add_quotes( $output ); } /** * Generates a slug from font face properties, e.g. `open sans;normal;400;100%;U+0-10FFFF` * * Used for comparison with other font faces in the same family, to prevent duplicates * that would both match according the CSS font matching spec. Uses only simple case-insensitive * matching for fontFamily and unicodeRange, so does not handle overlapping font-family lists or * unicode ranges. * * @since 6.5.0 * @access private * * @link https://drafts.csswg.org/css-fonts/#font-style-matching * * @param array $settings { * Font face settings. * * @type string $fontFamily Font family name. * @type string $fontStyle Optional font style, defaults to 'normal'. * @type string $fontWeight Optional font weight, defaults to 400. * @type string $fontStretch Optional font stretch, defaults to '100%'. * @type string $unicodeRange Optional unicode range, defaults to 'U+0-10FFFF'. * } * @return string Font face slug. */ public static function get_font_face_slug( $settings ) { $defaults = array( 'fontFamily' => '', 'fontStyle' => 'normal', 'fontWeight' => '400', 'fontStretch' => '100%', 'unicodeRange' => 'U+0-10FFFF', ); $settings = wp_parse_args( $settings, $defaults ); if ( function_exists( 'mb_strtolower' ) ) { $font_family = mb_strtolower( $settings['fontFamily'] ); } else { $font_family = strtolower( $settings['fontFamily'] ); } $font_style = strtolower( $settings['fontStyle'] ); $font_weight = strtolower( $settings['fontWeight'] ); $font_stretch = strtolower( $settings['fontStretch'] ); $unicode_range = strtoupper( $settings['unicodeRange'] ); // Convert weight keywords to numeric strings. $font_weight = str_replace( array( 'normal', 'bold' ), array( '400', '700' ), $font_weight ); // Convert stretch keywords to numeric strings. $font_stretch_map = array( 'ultra-condensed' => '50%', 'extra-condensed' => '62.5%', 'condensed' => '75%', 'semi-condensed' => '87.5%', 'normal' => '100%', 'semi-expanded' => '112.5%', 'expanded' => '125%', 'extra-expanded' => '150%', 'ultra-expanded' => '200%', ); $font_stretch = str_replace( array_keys( $font_stretch_map ), array_values( $font_stretch_map ), $font_stretch ); $slug_elements = array( $font_family, $font_style, $font_weight, $font_stretch, $unicode_range ); $slug_elements = array_map( function ( $elem ) { // Remove quotes to normalize font-family names, and ';' to use as a separator. $elem = trim( str_replace( array( '"', "'", ';' ), '', $elem ) ); // Normalize comma separated lists by removing whitespace in between items, // but keep whitespace within items (e.g. "Open Sans" and "OpenSans" are different fonts). // CSS spec for whitespace includes: U+000A LINE FEED, U+0009 CHARACTER TABULATION, or U+0020 SPACE, // which by default are all matched by \s in PHP. return preg_replace( '/,\s+/', ',', $elem ); }, $slug_elements ); return sanitize_text_field( implode( ';', $slug_elements ) ); } /** * Sanitizes a tree of data using a schema. * * The schema structure should mirror the data tree. Each value provided in the * schema should be a callable that will be applied to sanitize the corresponding * value in the data tree. Keys that are in the data tree, but not present in the * schema, will be removed in the sanitized data. Nested arrays are traversed recursively. * * @since 6.5.0 * * @access private * * @param array $tree The data to sanitize. * @param array $schema The schema used for sanitization. * @return array The sanitized data. */ public static function sanitize_from_schema( $tree, $schema ) { if ( ! is_array( $tree ) || ! is_array( $schema ) ) { return array(); } foreach ( $tree as $key => $value ) { // Remove keys not in the schema or with null/empty values. if ( ! array_key_exists( $key, $schema ) ) { unset( $tree[ $key ] ); continue; } $is_value_array = is_array( $value ); $is_schema_array = is_array( $schema[ $key ] ) && ! is_callable( $schema[ $key ] ); if ( $is_value_array && $is_schema_array ) { if ( wp_is_numeric_array( $value ) ) { // If indexed, process each item in the array. foreach ( $value as $item_key => $item_value ) { $tree[ $key ][ $item_key ] = isset( $schema[ $key ][0] ) && is_array( $schema[ $key ][0] ) ? self::sanitize_from_schema( $item_value, $schema[ $key ][0] ) : self::apply_sanitizer( $item_value, $schema[ $key ][0] ); } } else { // If it is an associative or indexed array, process as a single object. $tree[ $key ] = self::sanitize_from_schema( $value, $schema[ $key ] ); } } elseif ( ! $is_value_array && $is_schema_array ) { // If the value is not an array but the schema is, remove the key. unset( $tree[ $key ] ); } elseif ( ! $is_schema_array ) { // If the schema is not an array, apply the sanitizer to the value. $tree[ $key ] = self::apply_sanitizer( $value, $schema[ $key ] ); } // Remove keys with null/empty values. if ( empty( $tree[ $key ] ) ) { unset( $tree[ $key ] ); } } return $tree; } /** * Applies a sanitizer function to a value. * * @since 6.5.0 * * @param mixed $value The value to sanitize. * @param callable $sanitizer The sanitizer function to apply. * @return mixed The sanitized value. */ private static function apply_sanitizer( $value, $sanitizer ) { if ( null === $sanitizer ) { return $value; } return call_user_func( $sanitizer, $value ); } /** * Returns the expected mime-type values for font files, depending on PHP version. * * This is needed because font mime types vary by PHP version, so checking the PHP version * is necessary until a list of valid mime-types for each file extension can be provided to * the 'upload_mimes' filter. * * @since 6.5.0 * * @access private * * @return string[] A collection of mime types keyed by file extension. */ public static function get_allowed_font_mime_types() { $php_7_ttf_mime_type = PHP_VERSION_ID >= 70300 ? 'application/font-sfnt' : 'application/x-font-ttf'; return array( 'otf' => 'application/vnd.ms-opentype', 'ttf' => PHP_VERSION_ID >= 70400 ? 'font/sfnt' : $php_7_ttf_mime_type, 'woff' => PHP_VERSION_ID >= 80112 ? 'font/woff' : 'application/font-woff', 'woff2' => PHP_VERSION_ID >= 80112 ? 'font/woff2' : 'application/font-woff2', ); } } class-wp-font-face.php 0000644 00000024016 15024463243 0010654 0 ustar 00 <?php /** * WP_Font_Face class. * * @package WordPress * @subpackage Fonts * @since 6.4.0 */ /** * Font Face generates and prints `@font-face` styles for given fonts. * * @since 6.4.0 */ class WP_Font_Face { /** * The font-face property defaults. * * @since 6.4.0 * * @var string[] */ private $font_face_property_defaults = array( 'font-family' => '', 'font-style' => 'normal', 'font-weight' => '400', 'font-display' => 'fallback', ); /** * Valid font-face property names. * * @since 6.4.0 * * @var string[] */ private $valid_font_face_properties = array( 'ascent-override', 'descent-override', 'font-display', 'font-family', 'font-stretch', 'font-style', 'font-weight', 'font-variant', 'font-feature-settings', 'font-variation-settings', 'line-gap-override', 'size-adjust', 'src', 'unicode-range', ); /** * Valid font-display values. * * @since 6.4.0 * * @var string[] */ private $valid_font_display = array( 'auto', 'block', 'fallback', 'swap', 'optional' ); /** * Array of font-face style tag's attribute(s) * where the key is the attribute name and the * value is its value. * * @since 6.4.0 * * @var string[] */ private $style_tag_attrs = array(); /** * Creates and initializes an instance of WP_Font_Face. * * @since 6.4.0 */ public function __construct() { if ( function_exists( 'is_admin' ) && ! is_admin() && function_exists( 'current_theme_supports' ) && ! current_theme_supports( 'html5', 'style' ) ) { $this->style_tag_attrs = array( 'type' => 'text/css' ); } } /** * Generates and prints the `@font-face` styles for the given fonts. * * @since 6.4.0 * * @param array[][] $fonts Optional. The font-families and their font variations. * See {@see wp_print_font_faces()} for the supported fields. * Default empty array. */ public function generate_and_print( array $fonts ) { $fonts = $this->validate_fonts( $fonts ); // Bail out if there are no fonts are given to process. if ( empty( $fonts ) ) { return; } $css = $this->get_css( $fonts ); /* * The font-face CSS is contained within <style> tags and can only be interpreted * as CSS in the browser. Using wp_strip_all_tags() is sufficient escaping * to avoid malicious attempts to close </style> and open a <script>. */ $css = wp_strip_all_tags( $css ); // Bail out if there is no CSS to print. if ( empty( $css ) ) { return; } printf( $this->get_style_element(), $css ); } /** * Validates each of the font-face properties. * * @since 6.4.0 * * @param array $fonts The fonts to valid. * @return array Prepared font-faces organized by provider and font-family. */ private function validate_fonts( array $fonts ) { $validated_fonts = array(); foreach ( $fonts as $font_faces ) { foreach ( $font_faces as $font_face ) { $font_face = $this->validate_font_face_declarations( $font_face ); // Skip if failed validation. if ( false === $font_face ) { continue; } $validated_fonts[] = $font_face; } } return $validated_fonts; } /** * Validates each font-face declaration (property and value pairing). * * @since 6.4.0 * * @param array $font_face Font face property and value pairings to validate. * @return array|false Validated font-face on success, or false on failure. */ private function validate_font_face_declarations( array $font_face ) { $font_face = wp_parse_args( $font_face, $this->font_face_property_defaults ); // Check the font-family. if ( empty( $font_face['font-family'] ) || ! is_string( $font_face['font-family'] ) ) { // @todo replace with `wp_trigger_error()`. _doing_it_wrong( __METHOD__, __( 'Font font-family must be a non-empty string.' ), '6.4.0' ); return false; } // Make sure that local fonts have 'src' defined. if ( empty( $font_face['src'] ) || ( ! is_string( $font_face['src'] ) && ! is_array( $font_face['src'] ) ) ) { // @todo replace with `wp_trigger_error()`. _doing_it_wrong( __METHOD__, __( 'Font src must be a non-empty string or an array of strings.' ), '6.4.0' ); return false; } // Validate the 'src' property. foreach ( (array) $font_face['src'] as $src ) { if ( empty( $src ) || ! is_string( $src ) ) { // @todo replace with `wp_trigger_error()`. _doing_it_wrong( __METHOD__, __( 'Each font src must be a non-empty string.' ), '6.4.0' ); return false; } } // Check the font-weight. if ( ! is_string( $font_face['font-weight'] ) && ! is_int( $font_face['font-weight'] ) ) { // @todo replace with `wp_trigger_error()`. _doing_it_wrong( __METHOD__, __( 'Font font-weight must be a properly formatted string or integer.' ), '6.4.0' ); return false; } // Check the font-display. if ( ! in_array( $font_face['font-display'], $this->valid_font_display, true ) ) { $font_face['font-display'] = $this->font_face_property_defaults['font-display']; } // Remove invalid properties. foreach ( $font_face as $property => $value ) { if ( ! in_array( $property, $this->valid_font_face_properties, true ) ) { unset( $font_face[ $property ] ); } } return $font_face; } /** * Gets the style element for wrapping the `@font-face` CSS. * * @since 6.4.0 * * @return string The style element. */ private function get_style_element() { $attributes = $this->generate_style_element_attributes(); return "<style class='wp-fonts-local'{$attributes}>\n%s\n</style>\n"; } /** * Gets the defined <style> element's attributes. * * @since 6.4.0 * * @return string A string of attribute=value when defined, else, empty string. */ private function generate_style_element_attributes() { $attributes = ''; foreach ( $this->style_tag_attrs as $name => $value ) { $attributes .= " {$name}='{$value}'"; } return $attributes; } /** * Gets the `@font-face` CSS styles for locally-hosted font files. * * This method does the following processing tasks: * 1. Orchestrates an optimized `src` (with format) for browser support. * 2. Generates the `@font-face` for all its fonts. * * @since 6.4.0 * * @param array[] $font_faces The font-faces to generate @font-face CSS styles. * @return string The `@font-face` CSS styles. */ private function get_css( $font_faces ) { $css = ''; foreach ( $font_faces as $font_face ) { // Order the font's `src` items to optimize for browser support. $font_face = $this->order_src( $font_face ); // Build the @font-face CSS for this font. $css .= '@font-face{' . $this->build_font_face_css( $font_face ) . '}' . "\n"; } // Don't print the last newline character. return rtrim( $css, "\n" ); } /** * Orders `src` items to optimize for browser support. * * @since 6.4.0 * * @param array $font_face Font face to process. * @return array Font-face with ordered src items. */ private function order_src( array $font_face ) { if ( ! is_array( $font_face['src'] ) ) { $font_face['src'] = (array) $font_face['src']; } $src = array(); $src_ordered = array(); foreach ( $font_face['src'] as $url ) { // Add data URIs first. if ( str_starts_with( trim( $url ), 'data:' ) ) { $src_ordered[] = array( 'url' => $url, 'format' => 'data', ); continue; } $format = pathinfo( $url, PATHINFO_EXTENSION ); $src[ $format ] = $url; } // Add woff2. if ( ! empty( $src['woff2'] ) ) { $src_ordered[] = array( 'url' => $src['woff2'], 'format' => 'woff2', ); } // Add woff. if ( ! empty( $src['woff'] ) ) { $src_ordered[] = array( 'url' => $src['woff'], 'format' => 'woff', ); } // Add ttf. if ( ! empty( $src['ttf'] ) ) { $src_ordered[] = array( 'url' => $src['ttf'], 'format' => 'truetype', ); } // Add eot. if ( ! empty( $src['eot'] ) ) { $src_ordered[] = array( 'url' => $src['eot'], 'format' => 'embedded-opentype', ); } // Add otf. if ( ! empty( $src['otf'] ) ) { $src_ordered[] = array( 'url' => $src['otf'], 'format' => 'opentype', ); } $font_face['src'] = $src_ordered; return $font_face; } /** * Builds the font-family's CSS. * * @since 6.4.0 * * @param array $font_face Font face to process. * @return string This font-family's CSS. */ private function build_font_face_css( array $font_face ) { $css = ''; /* * Wrap font-family in quotes if it contains spaces * and is not already wrapped in quotes. */ if ( str_contains( $font_face['font-family'], ' ' ) && ! str_contains( $font_face['font-family'], '"' ) && ! str_contains( $font_face['font-family'], "'" ) ) { $font_face['font-family'] = '"' . $font_face['font-family'] . '"'; } foreach ( $font_face as $key => $value ) { // Compile the "src" parameter. if ( 'src' === $key ) { $value = $this->compile_src( $value ); } // If font-variation-settings is an array, convert it to a string. if ( 'font-variation-settings' === $key && is_array( $value ) ) { $value = $this->compile_variations( $value ); } if ( ! empty( $value ) ) { $css .= "$key:$value;"; } } return $css; } /** * Compiles the `src` into valid CSS. * * @since 6.4.0 * * @param array $value Value to process. * @return string The CSS. */ private function compile_src( array $value ) { $src = ''; foreach ( $value as $item ) { $src .= ( 'data' === $item['format'] ) ? ", url({$item['url']})" : ", url('{$item['url']}') format('{$item['format']}')"; } $src = ltrim( $src, ', ' ); return $src; } /** * Compiles the font variation settings. * * @since 6.4.0 * * @param array $font_variation_settings Array of font variation settings. * @return string The CSS. */ private function compile_variations( array $font_variation_settings ) { $variations = ''; foreach ( $font_variation_settings as $key => $value ) { $variations .= "$key $value"; } return $variations; } } class-wp-font-library.php 0000644 00000006653 15024463243 0011431 0 ustar 00 <?php /** * Font Library class. * * This file contains the Font Library class definition. * * @package WordPress * @subpackage Fonts * @since 6.5.0 */ /** * Font Library class. * * @since 6.5.0 */ class WP_Font_Library { /** * Font collections. * * @since 6.5.0 * @var array */ private $collections = array(); /** * Container for the main instance of the class. * * @since 6.5.0 * @var WP_Font_Library|null */ private static $instance = null; /** * Register a new font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. May only contain alphanumeric characters, dashes, * and underscores. See sanitize_title(). * @param array $args Font collection data. See wp_register_font_collection() for information on accepted arguments. * @return WP_Font_Collection|WP_Error A font collection if it was registered successfully, * or WP_Error object on failure. */ public function register_font_collection( string $slug, array $args ) { $new_collection = new WP_Font_Collection( $slug, $args ); if ( $this->is_collection_registered( $new_collection->slug ) ) { $error_message = sprintf( /* translators: %s: Font collection slug. */ __( 'Font collection with slug: "%s" is already registered.' ), $new_collection->slug ); _doing_it_wrong( __METHOD__, $error_message, '6.5.0' ); return new WP_Error( 'font_collection_registration_error', $error_message ); } $this->collections[ $new_collection->slug ] = $new_collection; return $new_collection; } /** * Unregisters a previously registered font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection was unregistered successfully and false otherwise. */ public function unregister_font_collection( string $slug ) { if ( ! $this->is_collection_registered( $slug ) ) { _doing_it_wrong( __METHOD__, /* translators: %s: Font collection slug. */ sprintf( __( 'Font collection "%s" not found.' ), $slug ), '6.5.0' ); return false; } unset( $this->collections[ $slug ] ); return true; } /** * Checks if a font collection is registered. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection is registered and false otherwise. */ private function is_collection_registered( string $slug ) { return array_key_exists( $slug, $this->collections ); } /** * Gets all the font collections available. * * @since 6.5.0 * * @return array List of font collections. */ public function get_font_collections() { return $this->collections; } /** * Gets a font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return WP_Font_Collection|null Font collection object, or null if the font collection doesn't exist. */ public function get_font_collection( string $slug ) { if ( $this->is_collection_registered( $slug ) ) { return $this->collections[ $slug ]; } return null; } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 6.5.0 * * @return WP_Font_Library The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } dashicons.woff2 0000644 00000063024 15024463243 0007474 0 ustar 00 wOF2 f �H e� BV �v ��@��@6$�P�* �"�S�'�ݗPn |�M�1�F"�� ��tV �59���3�Ș�T.i�un"��hU���k�T��J��;O�p��c��� 7��ݧ`��������yZ��5Q �W8�exh������2q��$�}~�fð��$l�%����j淴��B,���w~��K|{�ս?�t���`�95y��!9j��/�2z0�ىU�^<�K�>���<[��e�Y_��:Chg�,��O��/���Zwa�L�̅�%���cd�Lw���cW���:Q�C�v9k v�+�Z�Q�N��@@km�^LB1�x�$��C"Z�f� R���`�1�� ��i$���0�T��y��+�J�T]��z�X�7���r�+\�J�]T�Ja�ap� �$����0N�sF40]�E�,EVu��u�8���X �s@��r/�m}��f#`{:@@�����������I�����<�m��Ό0�J \��b :�% �U.�Li�2�MKlX0����^�c[�Ϸ�[�mI�90,0=�r�����姕�ŀ_����\�������wA���P����|{'�3��܁��9wr�sO;w2���=��;yD#�օ��EM� 35-U���Wf����_K+9��A?D0N�@cض�7�!�j����H�vZ�S��Uֵ/v�/��} �A�D�H5��B���E�H�g"1M)��MN�()$�H{�R$�ɩrJm��v9Y�����l��*=���_{4u�ݾ/���T���4*\�_� ajMB� 'Qf+�Jk�ǔO?���9@�D��F�1]��.� $��/��aLU0����x�C�<�nØZEMnjE��1�6KM@A��"�"P]���.&T����:�@bW�P�K��- ����K�эRAփh������(TPj�<�'S�HE ��+��h0����𬉭XR�}P�����AC��Q���ZmX�x���d���?FU����o��F������q����g��� �ԟFD�F�r�����u����m,�/����S,��,}%#6om[���[6��d -ƈ�s�ou���\|iRH����)7L��]�x�c���c��162��5�j�ґY�)).� ��Ti�f��Mъ�FX�/���.�C8S����C��?8O���Bc�q�u]��5'�t�1��R�r�*)���a��23�5ۈQc�M���J4��턓N9�W�Sx�w�D>B!�"e��j�I���(������s[�o1�� ~�o�ܭ�3���9�b���XBL���('�i�oȏ��{�OFu�6i_�?�*�}qZ���̐�dB/����)H#\����x��&� $K��PZA�����-[g}�����_�%��t/��J]�b���36�z�|CV�c�<�}��ET���d����JY����ծC�~]:�y 7�k�G�2oOM���n)ڟ`ⷌ.�\0*e�W&��BA � aP�b@�"���2@�b�&qP�xXM�K��$�$C%R�0� %�42M:T#�L'��Er�&���\J�!�R e�B(G���PB����`?�R��cT���050�Zb�:Skh��h��4���(-0�V�_ɦ�����t�T��=Ђ^�AL�f3 s���&��#ДQh��f63#��-L�"�� 0[����e����1��2[!*�Dm ��Nl�@��E�m��x�]��G��I�$�A�r*s���(����q�� ���p��6N�M��88�9� ��ø3��B�\%t��0����0�[$�����u�sp� ����p<!O��3��s����KX�+��k8�8�[8�;8�{��x�����7�3��� ���o��w����I��" ����/��G��O &��8(�(��P�@ � %a*��APBea��PFBa.T�qPfC�Ua2T�iP�C 5a"Ԃ�PFA� uaԃ�PVCx �4���nA8 M�4C@sd �@AK�"������ �� �!�;`��7�RTF� �a��Ѱ����-��o� H*�`l��p�@���i�����0�f!�2i �������!��,��+x ��2`1T,A*��kX�T,�/�pV�!X `5\�5P� � }� J և"� �(`C���6�� ����������|� � �_���/A=�2�|j���| ��a'|cBm` |÷a!|�w���φ�� ��>���?DZ~C��0~��P�3�-��H+�/ /�â� ��'�w� ~ �C:~��������'x�����+������ ��?��¿��>�=����TA�2�4��"X��,��V�#��!�B�.�"T�РB���#L聰�3N� �?����"@z"큈`?"�S��"2d"�Y�V!ʉ�*�������t��&���b Cp Fڱp � ���o�s��pJ"���XA |b��p��f����7@9ߣ �p-)?�%�c3@���+��Y��3V`z�#�|<�Rd�&Qx�N�7���BSA@N�,��b[10��I�&e�e�H�D��$�y��|��dI^��w�<��¼=�M %,�˙��ZYb+ �e%L��,��KP� �k� :x��_��IM�T��I� S�L�*ɫMJ�,�x4���L��2�ǻlv��ؙ*Db�)�e*K̳�9��=q6��䔽oK��݆���5�ӄ� ����n����łT�n��W�oU�|����`����yo�_�#��=��?���ܧ���s�'d��M|v#&K#�P;�f�/G��LU��W�j���']�[�x��3 �d�����`E��#�3�cO#��z?���7| q+�`ꩅf�Pu�ծ�2n�!��ͧ�3n#k|Qn.�Ӵ�E�%���6)y�E�3� E&��`�..cm]t����h��G��ފ��`�ec��j��� ���}�T~}x���F�yT���n}�ݾ�-�[yh�b �ގ�"�����e(�X��օRqb0w��1����%M��m���l��w�=ɷŘ�:�z�$��������$�{�d���,��c��A��f ���$k-F���)���g ��)@8�U��z*� \�a{�c���U>fp��]K�yK�Ʋ� �|ɀD���L�=���'�r���hU��{J7Ly��}�#�+\�� �E�բ唽�9�6M.�m�wB���>����@Ȗ;�F+������V�4>�W��Q&�K��o^V̱��BIt�=�/J�L*Ò�ј�#��Y�HNE����� (5�� C���P*��eD���c��A/hJ�>��ǽ� ��2�]���_HF��!��z�l���i�N�2 <�5�gz"B>���Y2�)3s�nK��\��ޅ�T�tZ0dQp�H�<�Z#?� c��E{�3���ٜ���Pك�o��|�y;)46.�6F�o�ה�.���y�;�/;W���8cH�:�=�:K9�ʅi����*�7�d�b�4H�A7-[��,]1��Jf����6�+��eaƋ.�a5)ǐV��8u�5-r�,ꮰFz�����t(�r� E鈈���4]�>�����А+gד�`�"%�c0c�R`&��W�����f�C-,[��XD�eɨ� ��aoOR��I��W̏����+��������[��x�(E}BV�׃a3N�lg�����CT��eTH��ub6�,�kC*���=� f�JE� Kb��%�l�0�M��Z���N��u���XW>W���q=:���GL{@=�Ҁ.5R|�Hc� �l��<��;!�Q��P�O ��qt�:i�yzi�������?�۠T���t�:����O�uq��c�T@��HAW]���_��`�����K�,n�h�f�u�c�L�Lq�Z�t�/�Vt3m��teOuV������y�i�s�z�{�ſQ�Z��7n��(���f�7b�1�͆ ���ڿ��:3d=���.��/~����a� tZP��w#���c�<m}�����Ŵg!#��+e�O�·/��@�Nʳݎ{[]�B��Uj�!,o�����¢I����d�6!$Aݤ�t�L��20�~9]�����e�-?��be;/��\K�^��.�uz8�a?��.Rg<5 ��|�T��ڣ�^��E�0W@!d�(�4�z��F������i�6i~��,s���4�a��yQ }U:�T�_M�� |�P#\��������tE2%�M_�o����7����3�]=�D�t�fo��'�~s�y�7ޚe���h�w�U�.�����;�G�-5�PT��N^��+',<a� h~���S5�3܂�:+�q[80�^ӛ7Sc?W艵)mY�+ �n?r�lG����mB��M֙�0��,*�&�X�_�M�!:x��<Ղ�r��q<,� *A�� �AE`<�6���~�{�Q��|�E��� �J�ypi�q�JJr<%ʩ��H`\..���W�9�+��0���x %��ԝ�:N�<g��@��"J�ᰂ�d���0����y�����l�_�~���DF��s('�J%ӡ.^��`��w� nS7��c����r���vaܡ�*����F�� S���ߙ]=GBn�͐1��d����(�#�1��a���݄m��WF��R������.u|�7M �$�w �3S�r��� s��r�Ǽ|�oT�p���k%�% �JiE�'D(�>E�� ����O ���φ%���ڼ��(�^��l S<����<�����Z���{2�N� ��f��5W�T���`c�)�n��Q��g�s�"�,e�)1�F����,~ "Y�O�U�ĕZ�y�\�]&�a��L�\��� �c�ȯՋ7(e ��O����Ls�#Li��2��F��{E8��K�𬥎t�9���c��Vѻ�vDMx�O��ǎ�|�~,?�)����2~p��j�bӱ.���)��/�ǁ�2������ ��{T�m���n�D^�x�s�z��DG\M�����hq���~"���Q����#y�)�^#Q�����d0 e��V�a y�����j�K�糂}�A�U���#>��.�Ԇ`��>�>-Ν����D�T�C�����6�F&��t:��͕�g@��� @�3O\/:���wZ��a�G.a}�ƛ��|��,$�)i��ଽ�/\��������:ԕ�W0 �n~�u%��P z>>ӯ�V:j襌�� ���~�n�,^I��~��X_��Xny��h�_��8qѧ\)�����E�۵��v�m/2��9�K���ƣStԖo��5�˾�|�B��[� u�����s �%]6z���9�::]�Y�2&�=�ma��vy=�'$L�)�2�b��\S�3�TT$���������$C"�y��%<�*�bt��9.p�7~�9`]a�� 8��z`:�h��6g�{��K�@�+Mь�a$S���:���Y=��Hg��2<� �^8k�BJޭg�Ka�a5�?=�eկ$7�@�77t��HR�#�"�?J�Ѓ˺ ]"�á�a,v�䉉�ߝ�5�n��B!�0����Uk����Mݘ��Le.=���01Y���,-�qI��cV��T����%�R����Q%r�_� 4�rP�`�QQ|1Q*f���X���n7�B��|��+:W�1lp��#�b�gNͿNY'�g��\aPFnX�e�}6/�D'�� ��E�>��'�ьݖ�i8��1���4����8�l��:�M�䷯����C����%$�s\��� ��j~�`�~�f� k��}H�y���� �C(�OFr0&�>�)TT�p�X4�T�p���5��t�J��ӻbv[ƃ���l�p�Q����[��o�^�eY�ۺ�U�5��|G�e���T{�s���y?_)�%]����#��e�[����X�4m�X��(�k�,���HͲ��j�`��H��0 ɵ��2%�MS �vl1x�*i�� Ώ ΌËYo��i��5g�꠆'���i�� ư��vݦ M]�&1N�>��{n�Z{#��&�B.g�J�����1��xZН\&�Z�B�㷃�K�[���X�0~G�$���:p���ؙf��[�0�s�Q)x�ؔ��Kd7$|���ʃ�X�x�1����^��?OC�l���A���]�x�e`͂��e� �4c��m�| yb�� )0Q1��ZX�~0 RA���g"��#K�������@������h�K r�Ա�Z�'J�!��$Ox�ښ�{�E<���"E�.�D��궥l8�O:��f�$��� cJ��2z���GRU�B�[XM�(2��B��^��o��{�w͝���'b��%�W���3J�]��bc-��R�x��s��2� ߊ ��Q�LU����[#2�p�bD�6MU�I�ۙ�aU�9t� - �<�?��r��-ܓ���뺋��双��|�� �X �TJ�y�6�d����@�4�?^D>mr�~���NH�����Pm�)C=�e��n��I�v��ц58t�+��XӀ����PI�p��T�C�m�:�|����No����+��uY��D��sf��m�Na)m2�6ҩ�L�'/_y-�_t��"�(���IE�P]���fcȺ��W��b�qv�l���S<�`���yR�jH^�mOf��j�qLɮ��;<�'I���jz�s�)�����.�$[�l�����,����K�gd#�� �s��85���"߉^QΦ- z���`��e/w2n{ Ux�Qϑ��A��']�m(�=X��J�~Tz�iw�ݗ��lr �H4:����ע�{��K{�{z�H��d�}�� ��y���FU�W����)(+P@�%���gԪ�"�� L��"+���g_:��Ă��|�'���>#e��#�>�A>5����8�&UhO��эBF%۠�TXtR�E^��7oS��m��d�_?0X�}h��鍊c�u �m9�m%��ga�����JeQ�c}���2���[ �H� W�;+HV�Y�.�`���b��e�50.r�xY�"��O�Ŷ�ȗ�w6�����/�"����U�D)�^��+��� MR�3�>6�%࣠�������=A�BBֆ��^�X���cGP/��{M�]��^#�_��1}�.��z=S1�|�Vj�Ց?;lS9��boL(���t}5E���3�M��W�ޏIR����_�w�_��b��oҙ�^�/sJ?�3'?�Cx9�BE�} �/�5���o���<� ����X�H~@�4 �צ��"��8��'n����=��5�0�7��wܼܤ��tC ���]�@�,�G����V�&�Ѝ��]���v����lw<�k�*O�c!���:>�l�b�)���[�!��<�k+7�|��T|BØϦ(S��J�����R]����� ��k��|^j��bK�4@�v���.u��������ބ�g�0p�4�B��b���߃C�M��j?�S�* �|�S�hR�t�tH��_l�Tu�R$0O�s$>�9Swz;$)Pq\�r������ίZ�t��R��:J)�H��b|�A� ���m*g"#YOA���i \�{W�́yx;ԇ�)f�[� ���ox��0}xs����^��]��N,<�_W�U�u!�ѕB�<� �qI�E2�@I�Oj��uw ���g��qv� q��; ���[|�� ���d�7`y�j@(QEN)��/m8���J�V}+=p&��4!��.��$�HCVL�U��@cRewz���W��������h��D�$��e����M�"z�>��N% )�PUy�5���M�9&BL�=Jw�̱7o �WH��#�=4n��=c�:� W*�'�^x��: jZk��l<Ty��b����!r<![i��ݘ%_�\�Y�i������Z؋M�áU��I�L��B<�����~%q����>�$��L2&AAm�-�Uh�����Q�ցH�O-��19a����0�����ءԓ D�~�b�u�4Ydz�D��c���Ȓ�/<:��t � �6��Oa�Y���D����f��}���HkqSn#���o6��$�m� Z��#D��H��Rh<?̮���� Ƌ�)�=dI����� �o�Z^��� B�b�Ы4i�: i�[=�ƃ̙CP��O�mRj�e�V�����ab��(�IbE}�l��N78$�Ꮷ��/�g�Ũ Y$X��`�d{���8� ��*�&�n��+LԺd��Z�NjS�Ϫ��_z�ئxrj�`P>�̶r����/sU|���UO ����2�:YM����x�ҹ���I�.C��� Q���H���P���E��q9:�J���G}�L��M+�W ��� #�g�62����3ձ�˧B��o���{P.��*;�pp��(�`���0KD1��~]���Tr�L�J�-�r�HWuD��>G��&'=��tB�TȗY�n�N���4%Ug�ߓ�a��!*�k���P���-gb�_j�Tc�ؒ�� F�s�4��q�}���HPː0bK��,!�ZTM�.f ��Y(SA��)�)���O��?�I�{_��ې�|:�B+��^�YK�s���!��<lb0W%rgS��p3�bnb���ƛd�6�և�4�iH�y�Rv�N�eAe�a%�0q�)�y�æ�и���b}����5�K�F�N�����®�� �C|� ��7�*����LBm����.�[7�����C9��F X�7(F_���<r�-�U�jR�u�0�ŀ�����r�+T��t(wx�p7���E}���e%C��5]� �-�q�y[nbN����q��n<�v>�v��'1ֱ:�YAS�x��(q1�2�ƇXd���`_Z�����n��y�M����q��6;�y��c�V��=d���X�PE��˩�P)�#��1p:�fɛCx#�9f�j+��]QT�S̢��$�\ �L(�Md�*�%'���{��6��\RU�a�����B??kh��v�<���[W�������C!��Zu4qԕ,�I�+U���$�<l��L��'hD����t�,]��;�o���v�J�<��1����3�z'���ST��-N&&� �˿��l�p*�jnX}A��"^�n��<r; ��Ԉh�����<:��aP�����uT*A>�nN�Ӥy�&[�$��R����mV���K�8�v����AL$��o�}����Xx7�t�K�����i�j�!��7LN.����܇O3�fm~$ڝ_�kɬ��i�TE�X� *�Th��K����B��g�f�TgDk;$W�18��&bC=��xY�K�h,����/<2��㏾�h�m�Z�_����.|�cO�X���m�G���G��ָ�W����Et+9����I����v�O��pd N���3:�M����zO]��&�D3B@��D i�����M�kP�iz�e���^�HYD�T0��,�� z�� N�7����b�[���0�#s&�sG��di�,����m3���$���8�̉�nD���a�K��^#ö`Y��q���yy��������1���m�m��Ϭ/�\O=�+�P��ں�dP�1��e��!�N O0�"�'ww��;H�w�.I9����Au�$��e�&����q�2� B�d�����8ݩc��S�w�+���\�ʄ���GG��N�Y��o�H,�+��uojT8D�da��e��F��5�r)�Y /`P�D2}�A�����4�Kh����:�$�_7��l)⽄���?�N(w~L��i�nт�W����*�< �ZS�YF�3�G����,<�p�N�A��/�ÔiQ��|gpE{�gJ:����j�T�L��r"���@L�7�J��p;�ƞ�G��`�q��C_���̋ �Ⱥ���?����,� �ъ�9Q�d7[�^�?�Z�t���Ҍ:�f�G�W�Seq�)���D�*�Z�^�aL�[�}5�!�ؗ�U�q���"ř�WQ-כ�T�)IOkNk��scV�YaKj˲Ļ�Z�>y��I��)j�i��ٜ�F���W����qرu����,�_��s���t?�7��Iװ �^���sX��Q����Z���U�fY�����yS�z�kmW+�3mY��֭c���Dƣ�+��-�֩a˥(� �fn��\16����&�}-���_Q��=����B����1uBV��*ޒ�&E�6>yQa���/���ñ-�2Mj^r�lI��=����S�lS7���f,�J�aDž��@� AlcSTf�vZdxBH۽�>n����Z��{�����푛����Z��q;K!z!9Do�LY{�m����$��/R_wb�-�����0�*#^%�/��ATQik��CC��U�.����!�#����m�C���1{�G�Q2��=_|�2B�:�v��Y_W=�\�yhs����/�v��xL4$�v��l���Wj]t�F�~*?s�:Զ�^=�}�h�њ��������]/{, ���[�0�FGig��x<~gs'�ߘ��WN\���d��nMGލʄ�-r�Ѷ �&.K|�Պ�I-�G.W����6?~l&�OΚ�2�V�܊�n�tM���)��u�O]8k��T�t�Ɓҗ�0/�H9��bl|�1�� ~8c�4� �yL�g�+�+ukLZ�_�[�dhet�-�;C�����$�f���ם�������48s�/��d��ZQ定x���z���O{�&��Ǎ3ӢK0��_��y!�нȔ��,f���$ �8�ax��l.*�UYj��;1��%�Lπ�T>�iDs�.T���>��z�o��M�Q���Ʋ��i]�;}�J~&��ƦR�y ���z��3���b�Д���DS���`t�i"�6�� ��(�@4~D�i� �hd�qϴY�����ky9����q�_�]�������.��������sݽ��qO�����;"V��stt���}�s �My�z�sۼX����K�rL��?����@��G��t�̴+��?�����j�?����۟����oݯ/ v�]m�W��)�XiF{�b�x}�5Y ���.���H�j�깞�ɇ]1�+���7?*�U-�]]��L�����e*uCf �Km6��:3����jT�����jZ2���E�2a!OE�Jx�TQ�s�����ȿ��#];�~75��|���78���y�E?��Of�T-!�o�=������ħp����*��1v5,��:?/�`[ͻ�ʿ�>j�[ |{2Y���+�q��u�0�<#�innvΰ�_w��5�k �R��_����(���h(3"�f��s�)3*�?D����P�o�fg���W��~�B:�E�[�hg������� 2��߷�͎�#�eX��a��n#�2l��uew2� �'t�b����� �q�p��]nx�Ģ���r����4��{���y!텹�cL�o���հ�a���sa���X:�y�ލ(���%�ǂ%eAD�O��Y�6��-TS}�8�&�TYv�d$sY�U�-t����l�H�XԬ�h�}t�6e���R�7+s��W��Q��&!��1�5�K��}y?q���U b���1j\���$�J D�&��q(�oZ�0�J��{��ou/�� ���/��ʥYB��z� q�x�3D?�� ��c ?H�|lK� �P��љ;�*(�C�j��\˫ ��Դn�hBdd*l�ػ [�~�{na&���lu2�2�\�ἁ# �L=`������p4rj��˻ޝ3�13w������}���2J�>�o��:؊�-۳<��Νi�>��Ѵws�o��V�e�H�p�H��ÝO���g|7�(X�����x�4��o���:q�=>�ܴ�~z�Of�f�OqD�tM��~�"���fW�L����>����%Ăǹ8�t:���B�M~Q�K�i��xޢʄ�#�� �G�Q�{��`jL}�y�[���TV����w�x��RVq�L�zVFss�d���8�'�����d5�+a�b9s璴��?v�z�z5�R?Z�Gf�T�S��>b[�%�%+w�)�J^B4��_� >�kD�B�%�%��dE�1/R��m<9U�A�@F� �k�|�<)`B��^hB6�a��,��S��֊8��+�8;�X�sE���P�`�k|������{E �>Z�$^��,Ώn}g�}�@��7[�𛈰�Z��v���硊� !Y���>�����r�)���ƈXVu_���Η�CMcZBi��e���;n�f4�O@Tv�����W�Ă�p�R���'�� �u�xT^�\fO��q��m����L�o4��N.�n#�$MnLJj�H.��bS�(|�N�\�*���fW��W�^���erCޣ��J��q�q&gI��/C�F�:�%�]�u�"�p��K��/��)bS%4%z�pg�кY9���i\B^���[&'�i�� �[4�jE�&q��\�q�-]��'p����.��7��_w�W��@%6�-�|s��W�"P������j(1P��UR���#��_��'܀=s���?�����\�!���>_�ڞc�]E6l�eL1Ph�1 MA(c�d,� ���C��>��" �'