pax_global_header00006660000000000000000000000064126213030410014502gustar00rootroot0000000000000052 comment=0b39d434a0047a37b6dcb630ecfeb334bf223fbc php-text-captcha-1.0.2/000077500000000000000000000000001262130304100146545ustar00rootroot00000000000000php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/000077500000000000000000000000001262130304100173575ustar00rootroot00000000000000php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/LICENSE000066400000000000000000000026751262130304100203760ustar00rootroot00000000000000Copyright (c) 2004, The PHP Group All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/README000066400000000000000000000010751262130304100202420ustar00rootroot00000000000000This package is http://pear.php.net/package/Text_CAPTCHA and has been migrated from http://svn.php.net/repository/pear/packages/Text_CAPTCHA Please report all new issues via the PEAR bug tracker. If this package is marked as unmaintained and you have fixes, please submit your pull requests and start discussion on the pear-qa mailing list. To test, run $ phing test To build, simply $ phing package To install from scratch $ phing package $ pear install build/dist/Text_CAPTCHA-1.0.0.tgz To upgrade $ phing package $ pear upgrade -f build/dist/Text_CAPTCHA-1.0.0.tgzphp-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/000077500000000000000000000000001262130304100203035ustar00rootroot00000000000000php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA.php000066400000000000000000000101121262130304100220520ustar00rootroot00000000000000 * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ /** * Require Exception class for error handling. */ require_once 'Text/CAPTCHA/Exception.php'; /** * Require Text_Password class for generating the phrase. */ require_once 'Text/Password.php'; /** * Text_CAPTCHA - creates a CAPTCHA for Turing tests. * Class to create a Turing test for websites by creating an image, ASCII art or * something else with some (obfuscated) characters. * * @category Text * @package Text_CAPTCHA * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA { /** * driver for Text_CAPTCHA * * @var Text_CAPTCHA_Driver_Base */ private $_driver; /** * check if an initial driver init was done. * * @var bool */ private $_driverInitDone = false; /** * Constructor for the TEXT_CAPTCHA object with the given driver. * * @param Text_CAPTCHA_Driver $driver driver * * @throws Text_CAPTCHA_Exception no driver given */ function __construct($driver) { if (is_null($driver)) { throw new Text_CAPTCHA_Exception("No driver given"); } $this->_driver = $driver; $this->_driverInitDone = false; } /** * Create a new Text_CAPTCHA object. * * @param string $driver name of driver class to initialize * * @return Text_CAPTCHA a newly created Text_CAPTCHA object * @throws Text_CAPTCHA_Exception when driver could not be loaded * */ public static function factory($driver) { $driver = basename($driver); $class = 'Text_CAPTCHA_Driver_' . $driver; $file = str_replace('_', '/', $class) . '.php'; //check if it exists and can be loaded if (!@fclose(@fopen($file, 'r', true))) { throw new Text_CAPTCHA_Exception( 'Driver ' . $driver . ' cannot be loaded.' ); } //continue with including the driver include_once $file; $driver = new $class; return new Text_CAPTCHA($driver); } /** * Create random CAPTCHA phrase * * @param boolean|string $newPhrase new Phrase to use or true to generate a new * one * * @return void * @throws Text_CAPTCHA_Exception when driver is not initialized */ public final function generate($newPhrase = false) { if (!$this->_driverInitDone) { throw new Text_CAPTCHA_Exception("Driver not initialized"); } if ($newPhrase === true || is_null($this->_driver->getPhrase())) { $this->_driver->createPhrase(); } else if (strlen($newPhrase) > 0) { $this->_driver->setPhrase($newPhrase); } $this->_driver->createCAPTCHA(); } /** * Reinitialize the entire Text_CAPTCHA object. * * @param array $options Options to pass in. * * @return void */ public final function init($options = array()) { $this->_driver->resetDriver(); $this->_driver->initDriver($options); $this->_driverInitDone = true; $this->generate(); } /** * Place holder for the real getCAPTCHA() method used by extended classes to * return the generated CAPTCHA (as an image resource, as an ASCII text, ...). * * @return string|object */ public final function getCAPTCHA() { return $this->_driver->getCAPTCHA(); } /** * Return secret CAPTCHA phrase. * * @return string secret phrase */ public final function getPhrase() { return $this->_driver->getPhrase(); } }php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/000077500000000000000000000000001262130304100213465ustar00rootroot00000000000000php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/Driver.php000066400000000000000000000025361262130304100233200ustar00rootroot00000000000000 * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ /** * Interface for Text_CAPTCHA drivers * * @category Text * @package Text_CAPTCHA * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ interface Text_CAPTCHA_Driver { /** * Clear the internal state of the driver. * * @return void */ function resetDriver(); /** * Initialize the driver with the given options. * * @param array $options options for the driver as array * * @return void * @throws Text_CAPTCHA_Exception something went wrong during init */ function initDriver($options); /** * Generate the CAPTCHA. * * @return void * @throws Text_CAPTCHA_Exception something went wrong during creation of CAPTCHA */ function createCAPTCHA(); /** * Generate the phrase for the CAPTCHA. * * @return void * @throws Text_CAPTCHA_Exception something went wrong during creation of phrase */ function createPhrase(); }php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/Driver/000077500000000000000000000000001262130304100226015ustar00rootroot00000000000000php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/Driver/Base.php000066400000000000000000000041401262130304100241630ustar00rootroot00000000000000 * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA/Driver.php'; /** * Base class file for all Text_CAPTCHA drivers. * * @category Text * @package Text_CAPTCHA * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ abstract class Text_CAPTCHA_Driver_Base implements Text_CAPTCHA_Driver { /** * Captcha * * @var object|string */ private $_captcha; /** * Phrase * * @var string */ private $_phrase; /** * Sets secret CAPTCHA phrase. * This method sets the CAPTCHA phrase (use null for a random phrase) * * @param string $phrase The (new) phrase * * @return void */ public final function setPhrase($phrase) { $this->_phrase = $phrase; } /** * Return secret CAPTCHA phrase * This method returns the CAPTCHA phrase * * @return string secret phrase */ public final function getPhrase() { return $this->_phrase; } /** * Sets the generated captcha. * * @param object|string $captcha the generated captcha * * @return void */ protected final function setCaptcha($captcha) { $this->_captcha = $captcha; } /** * Place holder for the real getCAPTCHA() method * used by extended classes to return the generated CAPTCHA * (as an image resource, as an ASCII text, ...) * * @return string|object */ public final function getCAPTCHA() { return $this->_captcha; } /** * Reset the phrase and the CAPTCHA. * * @return void */ public function resetDriver() { $this->setPhrase(null); $this->setCaptcha(null); } }php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/Driver/Equation.php000066400000000000000000000145031262130304100251020ustar00rootroot00000000000000 * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA/Driver/Base.php'; /** * Equation driver for Text_CAPTCHA. * Returns simple equations as string, e.g. "9 - 2" * * @category Text * @package Text_CAPTCHA * @author Christian Weiske * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Driver_Equation extends Text_CAPTCHA_Driver_Base { /** * Operators that may be used in the equation. Two numbers have to be filled in, * and %s is needed since number2text conversion may be applied and strings * filled in. * * @var array */ private $_operators = array( '%s * %s', '%s + %s', '%s - %s', 'min(%s, %s)', 'max(%s, %s)' ); /** * Minimal number to use in an equation. * * @var int */ private $_min = 1; /** * Maximum number to use in an equation. * * @var int */ private $_max = 10; /** * Whether numbers shall be converted to text. * * @var bool */ private $_numbersToText = false; /** * This variable holds the locale for Numbers_Words. * * @var string */ private $_locale = ''; /** * Complexity of the generated equations.
* 1 - simple ones such as "1 + 10"
* 2 - harder ones such as "(3-2)*(min(5,6))" * * @var int */ private $_severity = 1; /** * Initialize the driver. * * @param array $options CAPTCHA options with these keys:
* min minimum numeric value * max maximum numeric value * numbersToText boolean for number to text conversion * locale locale for number to text conversion * severity number for complexity * * @return void * @throws Text_CAPTCHA_Exception when numbersToText is true, but Number_Words * package is not available */ public function initDriver($options = array()) { if (isset($options['min'])) { $this->_min = (int)$options['min']; } else { $this->_min = 1; } if (isset($options['max'])) { $this->_max = (int)$options['max']; } else { $this->_max = 10; } if (isset($options['numbersToText'])) { $this->_numbersToText = (bool)$options['numbersToText']; } else { $this->_numbersToText = false; } if (isset($options['locale'])) { $this->_locale = (string)$options['locale']; } else { $this->_locale = ''; } if (isset($options['severity'])) { $this->_severity = (int)$options['severity']; } else { $this->_severity = 1; } if ($this->_numbersToText) { include_once 'Numbers/Words.php'; if (!class_exists('Numbers_Words')) { throw new Text_CAPTCHA_Exception('Number_Words package required'); } } } /** * Create random CAPTCHA equation. * This method creates a random equation. * * @return void * @throws Text_CAPTCHA_Exception when invalid severity is specified */ public function createCAPTCHA() { switch ($this->_severity) { case 1: list($equation, $phrase) = $this->_createSimpleEquation(); break; case 2: list($eq1, $sol1) = $this->_createSimpleEquation(); list($eq2, $sol2) = $this->_createSimpleEquation(); $op3 = $this->_operators[mt_rand(0, count($this->_operators) - 1)]; list(, $phrase) = $this->_solveSimpleEquation($sol1, $sol2, $op3); $equation = sprintf($op3, '(' . $eq1 . ')', '(' . $eq2 . ')'); break; default: throw new Text_CAPTCHA_Exception( 'Equation complexity of ' . $this->_severity . ' not supported' ); } $this->setCaptcha($equation); $this->setPhrase($phrase); } /** * Creates a simple equation of type (number operator number). * * @return array Array with equation and solution */ private function _createSimpleEquation() { $one = mt_rand($this->_min, $this->_max); $two = mt_rand($this->_min, $this->_max); $operator = $this->_operators[mt_rand(0, count($this->_operators) - 1)]; return $this->_solveSimpleEquation($one, $two, $operator); } /** * Solves a simple equation with two given numbers and one operator as defined * in $this->_operators. * Also converts the numbers to words if required. * * @param int $one First number * @param int $two Second number * @param string $operator Operator used with those two numbers * * @return array Array with equation and solution */ private function _solveSimpleEquation($one, $two, $operator) { $equation = sprintf($operator, $one, $two); $function = create_function('', 'return ' . $equation . ';'); if ($this->_numbersToText) { $numberWords = new Numbers_Words(); $equation = sprintf( $operator, $numberWords->toWords($one, $this->_locale), $numberWords->toWords($two, $this->_locale) ); } return array($equation, $function()); } /** * Creates the captcha. This method is a placeholder, since the equation is * created in createCAPTCHA() * * @return void * @see createCAPTCHA() */ public function createPhrase() { $this->setPhrase(null); } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/Driver/Figlet.php000066400000000000000000000144651262130304100245360ustar00rootroot00000000000000 * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA/Driver/Base.php'; require_once 'Text/Figlet.php'; /** * Text_CAPTCHA_Driver_Figlet - Text_CAPTCHA driver Figlet based CAPTCHAs * * @category Text * @package Text_CAPTCHA * @author Aaron Wormus * @author Christian Wenz * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA * @todo define an obfuscation algorithm */ class Text_CAPTCHA_Driver_Figlet extends Text_CAPTCHA_Driver_Base { /** * Text_Password options. * * @var array */ private $_textPasswordOptions; /** * Width of CAPTCHA * * @var int */ private $_width; /** * Length of CAPTCHA * * @var int */ private $_length; /** * Figlet font * * @var string */ private $_font; /** * Figlet font * * @var array */ private $_style = array(); /** * Output Format * * @var string */ private $_output; /** * init function * * Initializes the new Text_CAPTCHA_Driver_Figlet object and creates a GD image * * @param array $options CAPTCHA options * * @return void * @throws Text_CAPTCHA_Exception when no options are given */ public function initDriver($options = array()) { if (!empty($options['output'])) { $this->_output = (string)$options['output']; } else { $this->_output = 'html'; } if (isset($options['width']) && $options['width']) { $this->_width = (int)$options['width']; } else { $this->_width = 200; } if (!empty($options['length'])) { $this->_length = $options['length']; } else { $this->_length = 6; } if (!isset($options['phrase']) || empty($options['phrase'])) { $phraseOptions = (isset($options['phraseOptions']) && is_array($options['phraseOptions'])) ? $options['phraseOptions'] : array(); $this->_textPasswordOptions = $phraseOptions; } else { $this->setPhrase($options['phrase']); } if (!empty($options['style']) && is_array($options['style']) ) { $this->_style = $options['style']; } if (empty($this->_style['padding'])) { $this->_style['padding'] = '5px'; } if (!empty($options['font_file'])) { if (is_array($options['font_file'])) { $arr = $options['font_file']; $this->_font = $arr[array_rand($arr)]; } else { $this->_font = $options['font_file']; } } } /** * Create the passphrase. * * @return string */ public function createPhrase() { $options = $this->_textPasswordOptions; $textPassword = new Text_Password(); if (!is_array($options) || count($options) === 0) { $this->setPhrase($textPassword->create($this->_length)); } else { if (count($options) === 1) { $this->setPhrase($textPassword->create($this->_length, $options[0])); } else { $this->setPhrase( $textPassword->create($this->_length, $options[0], $options[1]) ); } } } /** * Create CAPTCHA image. * * This method creates a CAPTCHA image. * * @return void on error * @throws Text_CAPTCHA_Exception when loading font fails */ public function createCAPTCHA() { $pear = new PEAR(); $figlet = new Text_Figlet(); if ($pear->isError($figlet->loadFont($this->_font))) { throw new Text_CAPTCHA_Exception('Error loading Text_Figlet font'); } $outputString = $figlet->lineEcho($this->getPhrase()); switch ($this->_output) { case 'text': $this->setCaptcha($outputString); break; case 'html': $this->setCaptcha($this->_getCAPTCHAAsHTML($outputString)); break; case 'javascript': $this->setCaptcha($this->_getCAPTCHAAsJavascript($outputString)); break; default: throw new Text_CAPTCHA_Exception('Invalid output option given'); } } /** * Return CAPTCHA as HTML. * * This method returns the CAPTCHA as HTML. * * @param string $figletOutput output string from Figlet. * * @return string HTML Figlet image or PEAR error */ private function _getCAPTCHAAsHTML($figletOutput) { $charWidth = strpos($figletOutput, "\n"); $data = str_replace("\n", '
', $figletOutput); $textSize = ($this->_width / $charWidth) * 1.4; $cssOutput = ""; foreach ($this->_style as $key => $value) { $cssOutput .= "$key: $value;"; } $htmlOutput = '
'; $htmlOutput .= '
' . $data . '
'; return $htmlOutput; } /** * Return CAPTCHA as Javascript version of HTML. * * This method returns the CAPTCHA as a Javascript string. * I'm not exactly sure what the point of doing this would be. * * @param string $figletOutput output string from Figlet. * * @return string javascript string or PEAR error */ private function _getCAPTCHAAsJavascript($figletOutput) { $obfusData = rawurlencode($figletOutput); $javascript = ""; return $javascript; } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/Driver/Image.php000066400000000000000000000213361262130304100243410ustar00rootroot00000000000000 * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA/Driver/Base.php'; require_once 'Image/Text.php'; /** * Text_CAPTCHA_Driver_Image - Text_CAPTCHA driver graphical CAPTCHAs * * Class to create a graphical Turing test * * @category Text * @package Text_CAPTCHA * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA * @todo refine the obfuscation algorithm :-) * @todo consider removing Image_Text dependency */ class Text_CAPTCHA_Driver_Image extends Text_CAPTCHA_Driver_Base { /** * Text_Password options. * * @var array */ private $_textPasswordOptions; /** * Width of CAPTCHA * * @var int */ private $_width; /** * Height of CAPTCHA * * @var int */ private $_height; /** * CAPTCHA output format * * @var string */ private $_output; /** * Further options (here: for Image_Text) * * @var array */ private $_imageOptions = array( 'font_size' => 24, 'font_path' => './', 'font_file' => 'COUR.TTF', 'text_color' => '#000000', 'lines_color' => '#CACACA', 'background_color' => '#555555', 'antialias' => false); /** * Init function * * Initializes the new Text_CAPTCHA_Driver_Image object and creates a GD image * * @param array $options CAPTCHA options * * @return void */ public function initDriver($options = array()) { if (is_array($options)) { if (isset($options['width']) && is_int($options['width'])) { $this->_width = $options['width']; } else { $this->_width = 200; } if (isset($options['height']) && is_int($options['height'])) { $this->_height = $options['height']; } else { $this->_height = 80; } if (!isset($options['phrase']) || empty($options['phrase'])) { $phraseOptions = (isset($options['phraseOptions']) && is_array($options['phraseOptions'])) ? $options['phraseOptions'] : array(); $this->_textPasswordOptions = $phraseOptions; } else { $this->setPhrase($options['phrase']); } if (!isset($options['output']) || empty($options['output'])) { $this->_output = 'resource'; } else { $this->_output = $options['output']; } if (isset($options['imageOptions']) && is_array($options['imageOptions']) && count($options['imageOptions']) > 0 ) { $this->_imageOptions = array_merge( $this->_imageOptions, $options['imageOptions'] ); } } } /** * Create CAPTCHA image. * * This method creates a CAPTCHA image. * * @return void * @throws Text_CAPTCHA_Exception when image generation with Image_Text produces * an error */ public function createCAPTCHA() { $options['canvas'] = array( 'width' => $this->_width, 'height' => $this->_height ); $options['width'] = $this->_width - 20; $options['height'] = $this->_height - 20; $options['cx'] = ceil(($this->_width) / 2 + 10); $options['cy'] = ceil(($this->_height) / 2 + 10); $options['angle'] = rand(0, 30) - 15; $options['font_size'] = $this->_imageOptions['font_size']; $options['font_path'] = $this->_imageOptions['font_path']; $options['font_file'] = $this->_imageOptions['font_file']; $options['color'] = array($this->_imageOptions['text_color']); $options['background_color'] = $this->_imageOptions['background_color']; $options['max_lines'] = 1; $options['mode'] = 'auto'; do { $imageText = new Image_Text($this->getPhrase(), $options); $imageText->init(); $result = $imageText->measurize(); } while ($result === false && --$options['font_size'] > 0); if ($result === false) { throw new Text_CAPTCHA_Exception( 'The text provided does not fit in the image dimensions' ); } $imageText->render(); $image = $imageText->getImg(); if ($this->_imageOptions['antialias'] && function_exists('imageantialias')) { imageantialias($image, true); } $colors = Image_Text::convertString2RGB( $this->_imageOptions['lines_color'] ); $linesColor = imagecolorallocate( $image, $colors['r'], $colors['g'], $colors['b'] ); //some obfuscation for ($i = 0; $i < 3; $i++) { $x1 = rand(0, $this->_width - 1); $y1 = rand(0, round($this->_height / 10, 0)); $x2 = rand(0, round($this->_width / 10, 0)); $y2 = rand(0, $this->_height - 1); imageline($image, $x1, $y1, $x2, $y2, $linesColor); $x1 = rand(0, $this->_width - 1); $y1 = $this->_height - rand(1, round($this->_height / 10, 0)); $x2 = $this->_width - rand(1, round($this->_width / 10, 0)); $y2 = rand(0, $this->_height - 1); imageline($image, $x1, $y1, $x2, $y2, $linesColor); $cx = rand(0, $this->_width - 50) + 25; $cy = rand(0, $this->_height - 50) + 25; $w = rand(1, 24); imagearc($image, $cx, $cy, $w, $w, 0, 360, $linesColor); } if ($this->_output == 'gif' && imagetypes() & IMG_GIF) { $this->setCaptcha($this->_getCAPTCHAAsGIF($image)); } else if (($this->_output == 'jpg' && imagetypes() & IMG_JPG) || ($this->_output == 'jpeg' && imagetypes() & IMG_JPEG) ) { $this->setCaptcha($this->_getCAPTCHAAsJPEG($image)); } else if ($this->_output == 'png' && imagetypes() & IMG_PNG) { $this->setCaptcha($this->_getCAPTCHAAsPNG($image)); } else if ($this->_output == 'resource') { $this->setCaptcha($image); } else { throw new Text_CAPTCHA_Exception( "Unknown or unsupported output type specified" ); } imagedestroy($image); } /** * Return CAPTCHA as PNG. * * This method returns the CAPTCHA as PNG. * * @param resource $image generated image * * @return string image contents */ private function _getCAPTCHAAsPNG($image) { ob_start(); imagepng($image); $data = ob_get_contents(); ob_end_clean(); return $data; } /** * Return CAPTCHA as JPEG. * * This method returns the CAPTCHA as JPEG. * * @param resource $image generated image * * @return string image contents */ private function _getCAPTCHAAsJPEG($image) { ob_start(); imagejpeg($image); $data = ob_get_contents(); ob_end_clean(); return $data; } /** * Return CAPTCHA as GIF. * * This method returns the CAPTCHA as GIF. * * @param resource $image generated image * * @return string image contents */ private function _getCAPTCHAAsGIF($image) { ob_start(); imagegif($image); $data = ob_get_contents(); ob_end_clean(); return $data; } /** * Create random CAPTCHA phrase, Image edition (with size check). * * This method creates a random phrase, maximum 8 characters or width / 25, * whatever is smaller. * * @return void */ public function createPhrase() { $len = intval(min(8, $this->_width / 25)); $options = $this->_textPasswordOptions; $textPassword = new Text_Password(); if (!is_array($options) || count($options) === 0) { $this->setPhrase($textPassword->create($len)); } else { if (count($options) === 1) { $this->setPhrase($textPassword->create($len, $options[0])); } else { $this->setPhrase( $textPassword->create($len, $options[0], $options[1]) ); } } } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/Driver/Numeral.php000066400000000000000000000167671262130304100247360ustar00rootroot00000000000000 * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA/Driver/Base.php'; /** * Class used for numeral captchas * * This class is intended to be used to generate numeral captchas as such as: * Example: * Give me the answer to "54 + 2" to prove that you are human. * * @category Text * @package Text_CAPTCHA * @author David Coallier * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Driver_Numeral extends Text_CAPTCHA_Driver_Base { /** * This variable holds the minimum range value default set to "1". * * @var integer $_minValue The minimum value of the number range. */ private $_minValue = 1; /** * This variable holds the maximum range value default set to "50". * * @var integer $_maxValue The maximum value of the number range. */ private $_maxValue = 50; /** * The valid operators to use in the numeral captcha. We could use / and * but * not yet. * * @var array $_operators The operations for the captcha. */ private $_operators = array('-', '+'); /** * This variable is basically the operation that we're going to be using in the * numeral captcha we are about to generate. * * @var string $_operator The operation's operator to use. */ private $_operator = ''; /** * This variable holds the first number of the numeral operation we are about to * generate. * * @var integer $_firstNumber The first number of the operation. */ private $_firstNumber = 0; /** * This variable holds the value of the second variable of the operation we are * about to generate for the captcha. * * @var integer $_secondNumber The second number of the operation. */ private $_secondNumber = 0; /** * Initialize numeric CAPTCHA. * * @param array $options CAPTCHA options with these keys:
* minValue minimum value
* maxValue maximum value * * @return void */ public function initDriver($options = array()) { if (isset($options['minValue'])) { $this->_minValue = (int)$options['minValue']; } else { $this->_minValue = 1; } if (isset($options['maxValue'])) { $this->_maxValue = (int)$options['maxValue']; } else { $this->_maxValue = 50; } if (isset($options['operator'])) { $this->_operator = $options['operator']; } else { $this->_operator = ''; } if (isset($options['firstValue'])) { $this->_firstNumber = (int)$options['firstValue']; } else { $this->_firstNumber = 0; } if (isset($options['secondValue'])) { $this->_secondNumber = (int)$options['secondValue']; } else { $this->_secondNumber = 0; } } /** * Create the CAPTCHA (the numeral expression). * * This function determines a random numeral expression and set the associated * class properties. * * @return void * @see _generateFirstNumber() * @see _generateSecondNumber() * @see _generateOperator() * @see _generateOperation() */ public function createCAPTCHA() { if ($this->_firstNumber == 0) { $this->_firstNumber = $this->_generateNumber(); } if ($this->_secondNumber == 0) { $this->_secondNumber = $this->_generateNumber(); } if (empty($this->_operator)) { $this->_operator = $this->_operators[array_rand($this->_operators)]; } $this->_generateOperation(); } /** * Set operation. * * This variable sets the operation variable by taking the firstNumber, * secondNumber and operator. * * @return void * @see _operation * @see _firstNumber * @see _operator * @see _secondNumber */ private function _setOperation() { $this->setCaptcha( $this->_firstNumber . ' ' . $this->_operator . ' ' . $this->_secondNumber ); } /** * Generate a number. * * This function takes the parameters that are in the $this->_maxValue and * $this->_minValue and get the random number from them using mt_rand(). * * @return integer Random value between _minValue and _maxValue * @see _minValue * @see _maxValue */ private function _generateNumber() { return mt_rand($this->_minValue, $this->_maxValue); } /** * Adds values. * * This function will add the firstNumber and the secondNumber value and then * call setAnswer to set the answer value. * * @return void * @see _firstNumber * @see _secondNumber * @see _setAnswer() */ private function _doAdd() { $phrase = $this->_firstNumber + $this->_secondNumber; $this->setPhrase($phrase); } /** * Does a subtract on the values. * * This function executes a subtraction on the firstNumber and the secondNumber * to then call $this->setAnswer to set the answer value. * * If the _firstNumber value is smaller than the _secondNumber value then we * regenerate the first number and regenerate the operation. * * @return void * @see _firstNumber * @see _secondNumber * @see _setOperation() * @see Text_CAPTCHA::setPhrase() */ private function _doSubtract() { $first = $this->_firstNumber; $second = $this->_secondNumber; /** * Check if firstNumber is smaller than secondNumber */ if ($first < $second) { $this->_firstNumber = $second; $this->_secondNumber = $first; $this->_setOperation(); } $phrase = $this->_firstNumber - $this->_secondNumber; $this->setPhrase($phrase); } /** * Generate the operation * * This function will call the _setOperation() function to set the operation * string that will be called to display the operation, and call the function * necessary depending on which operation is set by this->operator. * * @return void * @see _setOperation() * @see _operator * @see _doAdd() * @see _doSubtract() */ private function _generateOperation() { $this->_setOperation(); switch ($this->_operator) { case '+': $this->_doAdd(); break; case '-': $this->_doSubtract(); break; default: $this->_operator = "+"; $this->_setOperation(); $this->_doAdd(); break; } } /** * Create random CAPTCHA phrase. This method is a placeholder, since the equation * is created in createCAPTCHA() * * @return string */ public function createPhrase() { $this->setCaptcha(null); } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/Driver/Word.php000066400000000000000000000072121262130304100242270ustar00rootroot00000000000000 * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA/Driver/Base.php'; require_once 'Numbers/Words.php'; /** * Require Numbers_Words class for generating the text. * * @category Text * @package Text_CAPTCHA * @author Tobias Schlitt * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Driver_Word extends Text_CAPTCHA_Driver_Base { /** * Phrase length. * This variable holds the length of the Word. * * @var integer */ private $_length; /** * Numbers_Words mode. * This variable holds the mode for Numbers_Words. * * @var String */ private $_mode; /** * Locale * This variable holds the locale for Numbers_Words * * @var string */ private $_locale; /** * Initializes the new Text_CAPTCHA_Driver_Word object. * * @param array $options CAPTCHA options with these keys:
* phrase The "secret word" of the CAPTCHA
* length The number of characters in the phrase
* locale The locale for Numbers_Words
* mode The mode for Numbers_Words * * @return void */ public function initDriver($options = array()) { if (isset($options['length']) && is_int($options['length'])) { $this->_length = $options['length']; } else { $this->_length = 4; } if (isset($options['phrase']) && !empty($options['phrase'])) { $this->setPhrase((string)$options['phrase']); } else { $this->createPhrase(); } if (isset($options['mode']) && !empty($options['mode'])) { $this->_mode = $options['mode']; } else { $this->_mode = 'single'; } if (isset($options['locale']) && !empty($options['locale'])) { $this->_locale = $options['locale']; } else { $this->_locale = 'en_US'; } } /** * Create random CAPTCHA phrase, "Word edition" (numbers only). * This method creates a random phrase * * @return void */ public function createPhrase() { $phrase = new Text_Password(); $this->setPhrase( $phrase->create( $this->_length, 'unpronounceable', 'numeric' ) ); } /** * Place holder for the real _createCAPTCHA() method * used by extended classes to generate CAPTCHA from phrase * * @return void */ public function createCAPTCHA() { $res = ''; $numberWords = new Numbers_Words(); $phrase = $this->getPhrase(); if ($this->_mode == 'single') { $phraseArr = str_split($phrase); for ($i = 0; $i < strlen($phrase); $i++) { $res .= ' ' . $numberWords->toWords($phraseArr[$i], $this->_locale); } } else { $res = $numberWords->toWords($phrase, $this->_locale); } $this->setCaptcha($res); } }php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/Text/CAPTCHA/Exception.php000066400000000000000000000013441262130304100240170ustar00rootroot00000000000000 * @author Christian Wenz * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'PEAR/Exception.php'; /** * Exception for Text_CAPTCHA * * @category Text * @package Text_CAPTCHA * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Exception extends PEAR_Exception { }php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/examples/000077500000000000000000000000001262130304100211755ustar00rootroot00000000000000php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/examples/SimpleExample.php000066400000000000000000000036351262130304100244620ustar00rootroot00000000000000 * @author Michael Cramer * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ // Start PHP session support session_start(); $ok = false; $msg = 'Please enter the text in the image in the field below!'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (isset($_POST['phrase']) && is_string($_SESSION['phrase']) && isset($_SESSION['phrase']) && strlen($_POST['phrase']) > 0 && strlen($_SESSION['phrase']) > 0 && $_POST['phrase'] == $_SESSION['phrase'] ) { $msg = 'OK!'; $ok = true; unset($_SESSION['phrase']); } else { $msg = 'Please try again!'; } unlink(sha1(session_id()) . '.png'); } print "

$msg

"; if (!$ok) { require_once 'Text/CAPTCHA.php'; // Set CAPTCHA image options (font must exist!) $imageOptions = array( 'font_size' => 24, 'font_path' => './', 'font_file' => 'COUR.TTF', 'text_color' => '#DDFF99', 'lines_color' => '#CCEEDD', 'background_color' => '#555555' ); // Set CAPTCHA options $options = array( 'width' => 200, 'height' => 80, 'output' => 'png', 'imageOptions' => $imageOptions ); // Generate a new Text_CAPTCHA object, Image driver $c = Text_CAPTCHA::factory('Image'); $c->init($options); // Get CAPTCHA secret passphrase $_SESSION['phrase'] = $c->getPhrase(); // Get CAPTCHA image (as PNG) $png = $c->getCAPTCHA(); file_put_contents(sha1(session_id()) . '.png', $png); echo '
' . '' . '' . '
'; }php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/tests/000077500000000000000000000000001262130304100205215ustar00rootroot00000000000000php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/tests/Text_CAPTCHA_Driver_Equation_Test.php000066400000000000000000000043321262130304100274620ustar00rootroot00000000000000 * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA.php'; /** * Class Text_CAPTCHA_Driver_Equation_Test * * @category Text * @package Text_CAPTCHA * @author Michael Cramer * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Driver_Equation_Test extends PHPUnit_Framework_TestCase { /** * Test instance * * @var Text_CAPTCHA instance */ private $_captcha; /** * Create the test instance. * * @return void */ protected function setUp() { $this->_captcha = Text_CAPTCHA::factory("Equation"); } /** * Simple test. * * @return void */ public function testSimple() { $this->_captcha->init(); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * Advanced Test * * @return void */ public function testAdvanced() { $this->_captcha->init( array( 'severity' => 2 ) ); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * invalid complexity * * @return void */ public function testInvalidComplexity() { $this->setExpectedException("Text_CAPTCHA_Exception"); $this->_captcha->init( array( 'severity' => 99 ) ); } /** * test NumbersToText * * @return void */ public function testNumbersToText() { $this->_captcha->init( array( 'min' => 1, 'max' => 4, 'locale' => 'de', 'numbersToText' => true, 'severity' => 2 ) ); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/tests/Text_CAPTCHA_Driver_Figlet_Test.php000066400000000000000000000145041262130304100271110ustar00rootroot00000000000000 * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA.php'; /** * Class Text_CAPTCHA_Driver_Figlet_Test * * @category Text * @package Text_CAPTCHA * @author Michael Cramer * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Driver_Figlet_Test extends PHPUnit_Framework_TestCase { /** * Test instance * * @var Text_CAPTCHA instance */ private $_captcha; /** * Create the test instance. * * @return void */ protected function setUp() { $this->_captcha = Text_CAPTCHA::factory("Figlet"); } /** * Simple test. * * @return void */ public function testSimple() { $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf') ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test reinitialization * * @return void */ public function testReInit() { $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf') ); $this->_captcha->init($options); $phrase1 = $this->_captcha->getPhrase(); $this->_captcha->init($options); $phrase2 = $this->_captcha->getPhrase(); $this->assertNotEquals($phrase1, $phrase2); } /** * test font_file * * @return void */ public function testFontFile() { $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf') ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); $options = array( 'font_file' => dirname(__FILE__) . '/data/makisupa.flf' ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test with given phrase * * @return void */ public function testGivenPhrase() { $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf'), 'phrase' => 'Text_CAPTCHA' ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertEquals('Text_CAPTCHA', $this->_captcha->getPhrase()); } /** * test phrase length * * @return void */ public function testPhraseLength() { $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf'), 'length' => 10 ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertEquals(10, strlen($this->_captcha->getPhrase())); } /** * test text and javascript output * * @return void */ public function testDifferentOutput() { $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf'), 'output' => 'text' ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf'), 'output' => 'javascript' ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test invalid output type * * @return void */ public function testInvalidOutputType() { $this->setExpectedException('Text_CAPTCHA_Exception'); $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf'), 'output' => 'image' ); $this->_captcha->init($options); } /** * test phrase options for Text_Password * * @return void */ public function testPhraseOptions() { $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf'), 'phraseOptions' => array('unpronounceable', 'ABCDEFG') ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf'), 'phraseOptions' => array('unpronounceable') ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test width option * * @return void */ public function testWidth() { $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf'), 'width' => 123, 'output' => 'html' ); $this->_captcha->init($options); $captcha = $this->_captcha->getCAPTCHA(); $this->assertNotNull($captcha); $this->assertContains('width:123px;', $captcha); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test style options * * @return void */ public function testStyleOptions() { $options = array( 'font_file' => glob(dirname(__FILE__) . '/data/*.flf'), 'style' => array( 'border' => '1px dashed red', 'color' => 'yellow', 'background' => 'black' ), 'output' => 'html' ); $this->_captcha->init($options); $captcha = $this->_captcha->getCAPTCHA(); $this->assertNotNull($captcha); $this->assertContains('border: 1px dashed red;', $captcha); $this->assertContains('color: yellow;', $captcha); $this->assertContains('background: black;', $captcha); $this->assertNotNull($this->_captcha->getPhrase()); } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/tests/Text_CAPTCHA_Driver_Image_Test.php000066400000000000000000000144521262130304100267230ustar00rootroot00000000000000 * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA.php'; /** * Class Text_CAPTCHA_Driver_Image_Test * * @category Text * @package Text_CAPTCHA * @author Michael Cramer * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Driver_Image_Test extends PHPUnit_Framework_TestCase { /** * Test instance * * @var Text_CAPTCHA instance */ private $_captcha; /** * Create the test instance. * * @return void */ protected function setUp() { $this->_captcha = Text_CAPTCHA::factory("Image"); } /** * Simple test. * * @return void */ public function testSimple() { $imageOptions = array( 'font_path' => dirname(__FILE__) . '/data/', 'font_file' => 'cour.ttf', ); $options = array( 'imageOptions' => $imageOptions ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test resizing of text * * @return void */ public function testTooLong() { $imageOptions = array( 'font_path' => dirname(__FILE__) . '/data/', 'font_file' => 'cour.ttf', ); $options = array( 'imageOptions' => $imageOptions, 'phrase' => 'tooLongForDefaultFontSizeReallyTooLong1234567890' ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test resizing of text * * @return void */ public function testTooLong2() { $this->setExpectedException("Image_Text_Exception"); $imageOptions = array( 'font_path' => dirname(__FILE__) . '/data/', 'font_file' => 'cour.ttf', ); $options = array( 'width' => 10, 'height' => 10, 'imageOptions' => $imageOptions, 'phrase' => 'tooLongForDefaultFontSizeReallyTooLong1234567890' ); $this->_captcha->init($options); $this->fail("should not reach that point"); } /** * test resizing of text * * @return void */ public function testTooHeight() { $this->setExpectedException("Text_CAPTCHA_Exception"); $imageOptions = array( 'font_path' => dirname(__FILE__) . '/data/', 'font_file' => 'cour.ttf', ); $options = array( 'height' => 1, 'imageOptions' => $imageOptions, ); $this->_captcha->init($options); $this->fail("should not reach that point"); } /** * test different outputs * * @return void */ public function testDifferentOutputs() { $imageOptions = array( 'font_path' => dirname(__FILE__) . '/data/', 'font_file' => 'cour.ttf', ); $options = array( 'imageOptions' => $imageOptions, 'output' => 'png' ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $options['output'] = 'jpg'; $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $options['output'] = 'jpeg'; $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $options['output'] = 'gif'; $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $options['output'] = 'resource'; $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); } /** * test invalid output type * * @return void */ public function testInvalidOutput() { $this->setExpectedException("Text_CAPTCHA_Exception"); $imageOptions = array( 'font_path' => dirname(__FILE__) . '/data/', 'font_file' => 'cour.ttf', ); $options = array( 'imageOptions' => $imageOptions, 'output' => 'unknown' ); $this->_captcha->init($options); } /** * test phrase options for Text_Password * * @return void */ public function testPhraseOptions() { $imageOptions = array( 'font_path' => dirname(__FILE__) . '/data/', 'font_file' => 'cour.ttf', ); $options = array( 'imageOptions' => $imageOptions, 'phraseOptions' => array('unpronounceable', 'ABCDEFG') ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); $options = array( 'imageOptions' => $imageOptions, 'phraseOptions' => array('unpronounceable') ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test antialias * * @return void */ public function testAntialias() { $imageOptions = array( 'font_path' => dirname(__FILE__) . '/data/', 'font_file' => 'cour.ttf', 'antialias' => true ); $options = array( 'imageOptions' => $imageOptions ); $this->_captcha->init($options); } /** * test imagesize * * @return void */ public function testImageSize() { $imageOptions = array( 'font_path' => dirname(__FILE__) . '/data/', 'font_file' => 'cour.ttf', ); $options = array( 'width' => 234, 'height' => 123, 'imageOptions' => $imageOptions ); $this->_captcha->init($options); $captcha = $this->_captcha->getCAPTCHA(); $this->assertNotNull($captcha); } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/tests/Text_CAPTCHA_Driver_Numeral_Test.php000066400000000000000000000075621262130304100273100ustar00rootroot00000000000000 * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA.php'; /** * Class Text_CAPTCHA_Driver_Numeral_Test * * @category Text * @package Text_CAPTCHA * @author Michael Cramer * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Driver_Numeral_Test extends PHPUnit_Framework_TestCase { /** * Test instance * * @var Text_CAPTCHA instance */ private $_captcha; /** * Create the test instance. * * @return void */ protected function setUp() { $this->_captcha = Text_CAPTCHA::factory("Numeral"); } /** * Simple test. * * @return void */ public function testSimple() { $this->_captcha->init(); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test min/maxValue * * @return void */ public function testMinMaxValue() { $this->_captcha->init( array( 'minValue' => 52, 'maxValue' => 52, 'operator' => '-' ) ); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertEquals(0, $this->_captcha->getPhrase()); } /** * test operator * * @return void */ public function testOperator() { $this->_captcha->init(array('operator' => '-')); $captcha = $this->_captcha->getCAPTCHA(); $function = create_function('', 'return ' . $captcha . ';'); $this->assertNotNull($captcha); $this->assertEquals($function(), $this->_captcha->getPhrase()); $this->_captcha->init(array('operator' => '+')); $captcha = $this->_captcha->getCAPTCHA(); $function = create_function('', 'return ' . $captcha . ';'); $this->assertNotNull($captcha); $this->assertEquals($function(), $this->_captcha->getPhrase()); $this->_captcha->init(array('operator' => '**')); $captcha = $this->_captcha->getCAPTCHA(); $function = create_function('', 'return ' . $captcha . ';'); $this->assertNotNull($captcha); $this->assertEquals($function(), $this->_captcha->getPhrase()); } /** * test difference * * @return void */ public function testDifference() { $this->_captcha->init( array('firstValue' => 5, 'secondValue' => 10, 'operator' => '-') ); $captcha = $this->_captcha->getCAPTCHA(); $function = create_function('', 'return ' . $captcha . ';'); $this->assertNotNull($captcha); $this->assertEquals($function(), $this->_captcha->getPhrase()); $this->assertEquals(5, $function()); $this->_captcha->init( array('firstValue' => 10, 'secondValue' => 5, 'operator' => '-') ); $captcha = $this->_captcha->getCAPTCHA(); $function = create_function('', 'return ' . $captcha . ';'); $this->assertNotNull($captcha); $this->assertEquals($function(), $this->_captcha->getPhrase()); $this->assertEquals(5, $function()); } /** * test difference * * @return void */ public function testAdd() { $this->_captcha->init( array('firstValue' => 5, 'secondValue' => 10, 'operator' => '+') ); $captcha = $this->_captcha->getCAPTCHA(); $function = create_function('', 'return ' . $captcha . ';'); $this->assertNotNull($captcha); $this->assertEquals($function(), $this->_captcha->getPhrase()); $this->assertEquals(15, $function()); } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/tests/Text_CAPTCHA_Driver_Word_Test.php000066400000000000000000000035501262130304100266110ustar00rootroot00000000000000 * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA.php'; /** * Class Text_CAPTCHA_Driver_Word_Test * * @category Text * @package Text_CAPTCHA * @author Michael Cramer * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Driver_Word_Test extends PHPUnit_Framework_TestCase { /** * Test instance * * @var Text_CAPTCHA instance */ private $_captcha; /** * Create the test instance. * * @return void */ protected function setUp() { $this->_captcha = Text_CAPTCHA::factory("Word"); } /** * Simple test. * * @return void */ public function testSimple() { $this->_captcha->init(array('length' => 8, 'locale' => 'de')); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } /** * test with given phrase * * @return void */ public function testGivenPhrase() { $options = array( 'phrase' => 'Text_CAPTCHA' ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertEquals('Text_CAPTCHA', $this->_captcha->getPhrase()); } /** * test with given phrase * * @return void */ public function testMode() { $options = array( 'mode' => 'together' ); $this->_captcha->init($options); $this->assertNotNull($this->_captcha->getCAPTCHA()); $this->assertNotNull($this->_captcha->getPhrase()); } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/tests/Text_CAPTCHA_Test.php000066400000000000000000000041351262130304100243030ustar00rootroot00000000000000 * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ require_once 'Text/CAPTCHA.php'; /** * Class Text_CAPTCHA_Test * * @category Text * @package Text_CAPTCHA * @author Michael Cramer * @license BSD License * @link http://pear.php.net/package/Text_CAPTCHA */ class Text_CAPTCHA_Test extends PHPUnit_Framework_TestCase { /** * test invalid driver name. * * @return void */ public function testInvalidDriverName() { $this->setExpectedException("Text_CAPTCHA_Exception"); Text_CAPTCHA::factory('invalidDriver'); } /** * test invalid driver name. * * @return void */ public function testNoDriverName() { $this->setExpectedException("Text_CAPTCHA_Exception"); Text_CAPTCHA::factory(''); } /** * test generate function * * @return void */ public function testGenerate() { $captcha = Text_CAPTCHA::factory('Word'); $captcha->init(); $phraseAfterInit = $captcha->getPhrase(); $captcha->generate(true); $phraseAfterGenerate = $captcha->getPhrase(); $this->assertNotEquals($phraseAfterInit, $phraseAfterGenerate); $captcha->generate("Testphrase"); $phraseAfterSet = $captcha->getPhrase(); $this->assertNotEquals($phraseAfterGenerate, $phraseAfterSet); $this->assertEquals('Testphrase', $phraseAfterSet); } /** * test driver init. * * @return void */ public function testInit() { $this->setExpectedException("Text_CAPTCHA_Exception"); $captcha = Text_CAPTCHA::factory('Word'); $captcha->generate(); } /** * test null driver in constructor. * * @return void */ public function testNullDriver() { $this->setExpectedException("Text_CAPTCHA_Exception"); new Text_CAPTCHA(null); } } php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/tests/data/000077500000000000000000000000001262130304100214325ustar00rootroot00000000000000php-text-captcha-1.0.2/Text_CAPTCHA-1.0.2/tests/data/cour.ttf000066400000000000000000011203001262130304100231160ustar00rootroot00000000000000`DSIGEBDTL\iXEBLC+\mL4GDEF̥ rGSUBLcu|sNOS/2 0MVVDMX2M'BbdatL\bloc+\4cmapX[Bcvt adfpgm62_gasp+ @glyfvhead)xl6hhea {<$hmtxYlp Rloca x.0maxp | x name 3Ppostv7L2 prepT` fwS{_< %Qaɩ+ &"Ir/U 33af zMono@ ~g@$FNXZf~&    l . f  @\  \  -    S )    6 3) Z |.\     X Z  f ~  &    l . f  @ \           $$*2-@       Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1994. All Rights ReservedMonotype:Courier New:version 2.90 (Microsoft)RegularVersion 2.90CourierNewPSMTCourier!" Trademark of The Monotype Corporation plc registered in certain countries.NOTIFICATION OF LICENSE AGREEMENT This typeface is the property of Monotype Typography and its use by you is covered under the terms of a license agreement. You have obtained this typeface software either directly from Monotype or together with software distributed by one of Monotype's licensees. This software is a valuable asset of Monotype. Unless you have entered into a specific license agreement granting you additional rights, your use of this software is limited to your workstation for your own publishing use. You may not copy or distribute this software. If you have any question concerning your rights you should review the license agreement you received with the software or contact Monotype for a copy of the license agreement. Monotype can be contacted at: USA - (847) 718-0400 UK - 01144 01737 765959 http://www.monotype.comHoward KettlerDesigned as a typewriter face for IBM, Courier was re drawn by Adrian Frutiger for IBM Selectric series. A typical fixed pitch design, monotone in weight and slab serif in concept. Used to emulate typewriter output for reports, tabular work and technical documentation.http://www.monotype.com/html/mtname/ms_couriernew.htmlhttp://www.monotype.com/html/mtname/ms_welcome.htmlhttp://www.monotype.com/html/type/license.htmlTypeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1994. All Rights ReservedMonotype:Courier New:version 2.90 (Microsoft)RegularVersion 2.90CourierNewPSMTCourier Trademark of The Monotype Corporation plc registered in certain countries.NOTIFICATION OF LICENSE AGREEMENT This typeface is the property of Monotype Typography and its use by you is covered under the terms of a license agreement. You have obtained this typeface software either directly from Monotype or together with software distributed by one of Monotype's licensees. This software is a valuable asset of Monotype. Unless you have entered into a specific license agreement granting you additional rights, your use of this software is limited to your workstation for your own publishing use. You may not copy or distribute this software. If you have any question concerning your rights you should review the license agreement you received with the software or contact Monotype for a copy of the license agreement. Monotype can be contacted at: USA - (847) 718-0400 UK - 01144 01737 765959 http://www.monotype.comHoward KettlerDesigned as a typewriter face for IBM, Courier was re drawn by Adrian Frutiger for IBM Selectric series. A typical fixed pitch design, monotone in weight and slab serif in concept. Used to emulate typewriter output for reports, tabular work and technical documentation.http://www.monotype.com/html/mtname/ms_couriernew.htmlhttp://www.monotype.com/html/mtname/ms_welcome.htmlhttp://www.monotype.com/html/type/license.htmlNormalnyoby ejnnormalStandardNormaaliNormlneNormaleStandaard1KG=K9NavadnothngArrunta , 2 pp~Y #~ O\_ :Rkmqt~    " & 0 3 : < > D  !!!!"!&!.!T!^!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k; 0 6<>ADQYm} 2DOYbjpu0? Y #~Q^ !@`mpt~   & 0 2 9 < > D  !!!!"!&!.!S![!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j2 *8>@CFVjz1?NX^jms0<-vjqi+*)(zxtjfJ<i3%][w}ujy+ߨߖޖޢދަq_0@3$FE<9630)"ۿ۾۷ۥۯEBA$"!/+( I>ln(NvvxtLNJ,6jvgbcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,  -   ./0 !"12#3$%&'()*+   4}?Avw|pqrtvuxw|56  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ pp~Y #~ O\_ :Rkmqt~    " & 0 3 : < > D  !!!!"!&!.!T!^!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k; 0 6<>ADQYm} 2DOYbjpu0? Y #~Q^ !@`mpt~   & 0 2 9 < > D  !!!!"!&!.!S![!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j2 *8>@CFVjz1?NX^jms0<-vjqi+*)(zxtjfJ<i3%][w}ujy+ߨߖޖޢދަq_0@3$FE<9630)"ۿ۾۷ۥۯEBA$"!/+( I>ln(NvvxtLNJ,6jvgbcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,  -   ./0 !"12#3$%&'()*+   4}?Avw|pqrtvuxw|56pppp$HN T  n* R" p!!"r#<$&(*,r./1,25r68;.;>@CDGIDJKM~OZRUWYVYZ`Z[[\>^:_aFbce<fhijn$nqsutw0yz}F~&^J60rN \(ZV,h,xnn pJJ*B\ D2ZŒFƺ\z\pͲΆ26ӄ\Lղ֘@z׮Fܨfx2>rP2z*\F `RF|TP\0*rF<p6j  N    b    &X Dx,`>n2dJ"Zh4  "4""$R'('()")*+,,-.T./8/00:0j0011J1122^233X344n455560667H788~99h9:^:;$;<>??2?`??DLTUU@UUVVJW$WXxYZ\~]_H`xabbcdg@i.iZiiklllm\mnnBnvnno"oVoopp<ptppqqTqqqr,t*vxyyByxyyz{|}~~B~f,PtNrRN6.dP4br@t$4lDj bLL\l 0@P`p,<L$.T"`*l$Błhx<\̮PφDxѦ0ӺBRbդմJۨ8&6L0*VDTPV&z  X0rVbrt"R$%()@)t+V-$-V/F/v000012467$7b89:;=?B?@ABAB6BCTCCDBDEE\EEF0FhFGHHIJ@JKKLLMBMNVODOPQ8QRPSSTUNVdWFWXY YZJZ[,[\](]z]^^_Z___``>`bbbDbtbbbc4dZdee.eeefghjFkklm m.m\mmoo<pqJqrsvtufuvVwx:xyyz{||}p~Tj4xjNJjv6LDHx$Bh v*b p,<x LZ€¸ LŲ ȘX˔˴ 0h̶\ͼ0jъѢӪն8 >jخڬ4ی,܂ܸtV T<NH*h4 ` 4~d*~FN~ ,v@b  H   L  T B$  TTd4*V  * : t"P"""#2#f##$%>&`&&&&' 'D'V'h'z''''(&(l(()))$)6)H)Z)l)~)))** *T*****+ ++.+d++,,$,6,H,Z,l,~,,,-<-V-h-z/^11111222,4|6::.:@:R:d:v:::;4;f;<>==?@ABlC DjEFGI"J8KM<NxOQQSVTX[n^^^`ce@fh>ij.jkkkldmmno6opqlrrrtjuuvHvw wxHyyzt{.{|}h}z}}}}~6~^p@$Jt:44X,6^.zD@>d>LBt .R(NxVDj$T(X<b8Nf^"v &xdxV     !"#$%&'()!*!+",#-#.$/%0%1&2'3*4+5+6,7-8-9.:.;/<1=1>2?3@3A4B5C5D6E7F8G9H9I:J;K;L<M<N>O?P?Q@RASATBUBVEWGXGYHZI[I\J]J^K_L`MaNbOcOdPeQfQgRhRiTjUkUlVmWnWoXpXqYr[s[t\u]v]w^x`yazb{c|d}e~efgghhjkklmmnnopqrssttuvvxyy||}~~    !"#$%&'()!*!+",#-#.$/%0%1&2'3(4+5+6,7-8-9.:.;/<1=1>2?3@3A4B5C5D6E7F8G9H9I:J;K;L<M<N>O?P?Q@RASATBUBVEWGXGYHZI[I\J]J^K_L`MaNbOcOdPeQfQgRhRiTjUkUlVmWnWoXpXqYr[s[t\u]v]w^x`yazb{c|d}e~efgghhjkklmmnnopqrssttuvvxyy||}~~    !"#$%&'()!*!+",#-#.$/%0%1&2'3*4+5+6,7-8-9.:.;/<1=1>2?3@3A4B5C5D6E7F8G9H9I:J;K;L<M<N>O?P?Q@RASATBUDVEWGXGYHZI[I\J]K^K_L`MaNbOcOdPeQfQgRhRiTjUkUlVmWnWoXpXqYr[s[t\u]v]w^x`yazb{c|d}e~efgghhjkklmmnnoqqrssttuvvxyy||}~~TU3@:3@$2 2 3?A/p_?_?$@$2A!^!_!**;A GO27<2GO27<2A!)2!)222A YV2XV2WV2A`UUTT_TOTUToUoT?U?T?T/T/TTTRS)QJ)PE%OJ%NI%MG%LJKEJFIEDHFDGFD0ApF_EDD/D?DDDDD_DDD/DDDCCAA@@/@@@??>>===@<</<?<O<_<<<<< 505@5P5`5,/,,,-$! @A P`pA/O_?O@ ??OO@)<<2@)362@)2@) 2Ar))))/)?)))'''''O'_'''''''o'''''''/'O'_'(/(_(((('(P(((""?"O"/"?""" :A7O/?//?O))''((""!!  @++_5o555555aa``@ A\ \ \ r\ @\ @\ \ \ \ \ X\ N\ F\ /\ b@+ + + V+ 6+ 5+ 3+ )+ AYW W BW 2W "W W [!'!!!![!;!0!g,!&!$!U+@,_@9.-('#  @+JKKSBKcKb S# QZ#BKKTB7+KR8+K P[XY8+TXCX,,YYK PXYv??>9FD>9FD>9FD>9FD>9F`D>9F`D+++++++++++++++++++++++7+KSXY2KSXYKS \X86ED76EDYX 8ERX8 DYYKS \X 8ED!8EDYX ERX DYYKS \X7ED%7EDYX ERX DYYKS \X=!ED!!EDYX =ERX= DYYKS \Xg!ED!!EDYX gERXg DYYKS \X!!ED!!EDYX!ERX!DYYKS \X!!ED!EDYX!ERX!DYYKS \X!!ED%!EDYX!ERX!DYY+++++++++++eB++++++++++++++++++++++++++++JֱCzEe#E`#Ee`#E`vhb CEe#E &`bch &ae#eDC#D JzEe#E &`bch &aez#eDJ#DzETXz@eDJ@JE#aDYGa*Ee#E`#Ee`#E`vhb *aEe#E &`bch &aea#eD*#D GEe#E &`bch &ae#eDG#DETX@eDG@GE#aDYKSBKPXBYC\XBY CX`!YBp>CX;!~ +Y #B #BCX-A-A +Y#B#BCX~;! +Y#B#BEiDEiDssEiDEiDEiDEiDEiDEiDEiDEiDEiDEiDEiDEiDEiDEiDEiDssst^s^sssstsstssstusst++++sstC\XA ssYt+++++suEiDstEiDsEiDEiDEiDsEiDEiDEiDutsss++++++++++++sssssssssssssssss+++++++susu++++su++++++s++sssstu++++++@AT@?>=<;:987543210/.-,+*)('&%$#"!  ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,#p>#pE: -,E#DE#D-, E%EadPQXED!!Y-,Cc#b#B+-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+#Dz-,E+#D-,CXE+#DzEi #D QX+#Dz!zYY-,-,%F`F@aH-,KS \XYXY-, %E#DE#DEe#E %`j #B#hj`a Ry!@E TX#!?#YaDRy@ E TX#!?#YaD-,C#C -,C#C -, C#C -, C#Ce -,C#Ce -,C#Ce -,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KdQXEi C`:!!!Y-,%# `#-,%# a#-,%-, ` <<-, a <<-,++**-,CC -,>**-,5-,vi#p iE PXaY:/-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,&&&&Eh:-,&&&&Ehe:-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CXY-,CXY-,KTC\ZX8!!Y-,C\X %% d#dadQX%% F`H F`HY !!!!Y-,C\X %% d#dadQX%% F`H F`HY !!!!Y-,KS#KQZX:+!!Y-,KS#KQZX;+!!Y-,KS#KQZC\ZX8!!Y-, KT&KTZ C\ZX8!!Y-,F#F`F# F`ab# #&&pE` PXaFY`h:-,B#Q@SZX TXC`BY$QX @TXC`BY$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BYYYY-b~TTTTTTTMTTTdmT3@TX<wUT!,9h}8e<+*0-<TX* <<T_,0b<"1mTU`u|Y=Xe+`RU(IboENP%AZZTvx{ TU=Zb4:@v9HTd+U\}  ),8Lm(*,?+, 3G#'8=DEMWby  #RSu8l+WT68CU]ps|(HKU~=Nm4M44:<UYs0IVX`hopq{|++cSXq{,0M`yzmb.Dk 0<Ygs} ,?CIMVWYffhju..;=Uf&,23>`q1Sd[TTTT>lP<}PPC;Hm!!`-W& tPZ`HRv_> AA>q-m =ZP;#Z#I9MW8J9ll8rP1~qT9j"p"|U$f cY<.~4m,6e(H0@U!&8,]`L|liAOesFA3AC9<4>gghggY!_zHH^QKV !0I<$ q Q^u|{'9LT\bi-0258>BDILPVZ`dfnqx@KU^bfjqsw{~!vi@VS$Qi7<Z)4TTBCg ]-+8beWXkY.hhXS%Pc=<-~}Ul-[;8e<X.hSl[[[[Q|oY?ePmbbZ+6(&=pSceh%cgkT+=XXXhSSS<(<:;<V<c-vUc}~~XX.l.lhXXS[S[gZb{}}}}e}}}}}}}g|&AlZ .AiioXXX}}}kUk>Y.llXzS[S[S[S[%8cPp%8%8%8c<Z  @A*WeXkY.hdcP<dbWFVATJEWEu(WWuX#w,dWWJXr((w#khd,cPY)W{Z::x3kk-<weMF!!K$3>x<k+1h%JII$$K$6<wIhsmvOz[e8hsOwC`$d?T7'J 'EmRb`%% e p?++++++]- p%%%%%%QQee  8qpvgaL J] uk&cA&jt<u]]%% +GGXhS[+$^D}+++((((B+B+XXXXXXXXhhhhhhhhhhhhS[S[S[S[S[S[S[ccchS[S[S[S[S[/wxwxkkbbPe)FklBhF      O{+N >[I N+]??9910q#"&'&5463232##"&546&%/##.e'+=>*'+=>Z   "..# =+,<=*-< `@    @ 0oP+]]?<<<<10!#"&'!#"&'  F  g F  &&&&~BGKK@3PPGH&%IA@7,-6[I@5I1;1K#$J [J"5J$5J5J5J CTX@=D@)- $[K[H@[7?[8>74H4K4 [ [>@*4@"5@:4@5_P@-M.[5-[6%[I$[J5>64I4PJJ4[[P>@ *4LQ+]+]]]]++++Y//++++<<<<<<<<<(>87,,>72D / c+??]]9/]9/]9910Cy@T-C<4>(:68(@0>(B.8(( (( (=3;(97;(?1A(C-A(( (((++++++++++++++++KSK%QZX@ B:A>> $/)@5/:@]&U:$011#9A 82@15515521281##11$  A$0 #9*A$0 #9.[''&,@$ @8 ?, *5C![ <,B$+NMN<?M?</<9999.+}=9//ć}ć<10q]]!'#"&5467&&54632632&&#"6732#32#327T@Zx{lJi"D"+ AA"EgZ=#R'0>9GCTcSpIcj wK(c  #f?As ]V {Ue~)@M N+]?10!#"&' F! *!!*]P@') * >M $ʺ+N]M<?$M+N]M<?[ @ [/+]/10q]]#"&5476632\  $X%  / #-)A (' -*@#)"m.' "#!=,= =̶1$=0,+NM??99999910Cy@Z.&'&(&)&*&   &"$@ @+%@-/@#!@!@& ,@.,@+++++++++****+888888888888888888888C\X@????"@@?'?'?'?'?#?' ?# ?? ?-  ? ?!?"@!??#? > >++++++++++++++++++++++Y#"&'&&'&5576324&'&'&#"325eJ.EeK.DTC*(9GC+(9H|;5!=Vs|;5"54&#"#"&546632qT{n ia&[vغT!u|ohO(l~] 0^ڊ:astܡ8l8@3225:$I$J%C8r!85858/"$4@$4) +(/!# (&,[ ,&=3=#=6 @ =9:/  93 ,+??NMN9/M9/99999910Cy@45$%%4#@@$5&@@++++++8]q88q#"&'&5463232654&&#"&54632654&#"#"&547632tzl.a]Hq|W, Wyb4b\0spKS[^<4 (=UT!@  !`@ !!g! [! [[[@gn![@ " $+??NqM]q<<<<<<<<<<<<9.+}<<10q!5332##32#!"&54633#ӯFFF,W_a'_!,@"  " ):-)L)_)n))"$4@$4 # $![%[!@ = &%@ = =)l%g%$ݷ-% $+??NM<<]<9/9999910Cy@ @ @@@++++8++]q6632#"'&'&5463232654&#"#"&5!2#J=wnN@& Je޵5%7!ɧE-#0@ ."$4"+!&@5;CKUZ%޳$4 ޳$4"޳#4$@ $4)+$ @&&*:K[jy$$    &$ %!e c!y!y(s/p0"* Z#!  "$ % & 0/.,()+* $1-= @='= =** *0**2$$ "=018,+N]M]??9/99910Cy@%, ! ,*@ "@& $@%$(*@+-@!@ % '@)'@+++++<+++**q]8888++++]88888+6632#"&'&547>32#"'&#"32654&#"lNeоm6C?0|T8 )=&opeaZ<snߤҞie" !ѶS7 `@* g    g   [ ,+NM??<<<<9999.+}=9/105!#"&55!#"&547l&J %1@D" +-W+e  '+-' + +y!1-#ݲ0#.(($ݲ*("%'"!@+(@#=))=/= #@))&==?O@ 3 =,= 2,+NM]9/??9/10Cy@0-1 @@.,@0&@@@-/@1/@++++++++8888888888888888]]qqC\X+?!?!@0 ?? ?? ? ??? ? ?++++++++++++Y#"&5467&'&5463274&#"3264&#"326ikࠠkj\*:Ֆ:) utvw3`ڕ_459QbϊbP:ljbonr%3P@-*+.$$&"$4#,$4$4 24 "2423,',@[1#*.1޳$4#'"2@-24111^ $& ' ( *  ' && $)= @ /= != &$ @ $=5=,48,+NM?9/?999910Cy@''."#  %* ,@( &@'&"$@.,@+)@')@#!-/@++++++<+++**]+888+q]8888+++++q#"&&54632#"'&546323254'&&#"32676A^W`r4C9&\~Z9 '325ikf;s3!stdjvP/?" 3*˓@@+b 1@   m+NUQQ-Dp)VE ș^R=+,<=*-<~=G]4@ 4 @4?444C@4@/ #h =69@ 662=G>D@ 1,>[ =@,DD $, 9>6 F@  >56$>G$66A,/@ $-$-P,,H+]<]<<<??9/99<]10Cy@R?C%4*+)+(+'+&+/&3%? A(%_0_ 2 (CA(@>(+_._ 4(BD(++++++++++++**q]+++++++5#"&546354&#"327632#"&'&&'&57632#3267[*{êfG?+0EK<`P-NlRj Dmb%. l{an$$?G &=;4:QpPEi  TLf*.@+699>,7-GIL,F-PP__,P-*+**,.- @   )  #)@&&3*&&)*#*, @3 -@V"@H)",**--$## +.... -,&&X,>@*&@ ?,0&-&> ?@ ?O,/El,+]q++]q+?<<9/]<YTz_/^Tb6#j7OHj9@x>L8@x-/?OVedi.psp 760JJ6[[5jh5/ 31 "72 #  #+%7 %+7+ &`!&&:&11/1?119y,+N]MNM???9999999910K SK$QZX8888888Y]q]q54632#"&'&'&#"3267632#"'.554632VtaV@&B'lP+Ri[^H^2;TAY+-N_FX^_/\]#HW|v, @!  !')* (' )!@ '!C@ )@5).+ $& ., O-9,+N]@%%$ R/6Jo+N]@,$$#&"& PR 5+N]q-6*!<&6/&6f55!%i@ *% f..->'&=o,+N]MN3 00??NC @@KOO @ 6  @ 6@ 6@'6&&&& O +N]&@|~z   f2& #5   % @ ?@ ?(f@ ?@ ?'+N]++Wc6GG(QYBd@]-6A$35376G![Ag!lAw!|A@A@AAA363E3W4"+6F4A5V1?@A"1i"i14-6"-6 2B1 @ +  @3  *0@ --0---1--01*1@3@ +)#@P&&&0&&+"&&#")"!A4@6?B"1!"!!"!1" 0&*#&*))1"" &&87&>??&@ z!! 2X BB1B&2"z@@P1`1p11@1P1111A7X ?6@D! CJT,+N]qN^8'@:FJ8 %''&8GW X @) %@"P"")&""%&/5@ 2362256/ @ 3 @).(@+P++)'++('.@ 8@ %&&@J87&./'6&// & &'8876'@'_'o''''@')4'@5''''''@_y@ O9o+N]M<<9/9/9/]q]++q<9/9/<?<<<<94F_,.,o@   @ ) %+@((),((+,% @ 3 @ +$@"!3!!$+&%%&$$z&z@  ,@,@%5,O,_,o,,,,.z@_o-:k,+Nq] >? ?? ?@ >> ">++++++++++++++++++++++++Y]#"324#"325ˉUFYXFE[#-@%5E+ *'@u'* @ +  @ 6@1+,&#%$?$$$ )%/-.y,+Nchh.:@_+04+4(*.j1i3 '+'+-&J0C4C6I9K:]$Z%V']0S3U4W7[9\:d+d1g4`70470347:+0"0 7: 0$ 713@Y+ ')-)95(?*:-:9I$G+$'+.06$'+.06++9046:679:430,&"#"##"f%V f@%8& 2%))# f,] ,@5/%,, ,0,,,w5%&;Cz,+NM]??/?CTX 4+Y.+}9910]8888888888qqC\X@F#<?.d?+(?. ?6?4?6?4?6?6?4?6 ?4 ?+ ?++++++++++++++Y]632327632#"&#"#"&5477&5324#"32rpS6XU+>[5f1u1+:1J1ZX1t t,x55*1& &-&& 1EF!x,,, !+  @ +  @ 3@;+, *+!"-,#.6&&-/.@ ?.@ ?..)#&** z-@ 73%&&](@ "P"""""@@/8Jl,+N]q5TPl8TD@*=3LO3]3w9B I FAAB6@Y+@)=;720#.4  &<<4%C .'4%!C'! &`7%_oF%@1&#&@Ao))))))E,+N]MN]M????9/99999910888]q]54632#"&'&&#"#"'#"&55463232654&'&'&'&54632.L`fAWYۃFE0\\ӭ>Ta2R3'^ˉ0\lBg#HH<#@* 5 "6##56# oo@ /`?O_p%o+]q<<?w#S|0"@"w  @3*0@--)--0* @ ) )#@G&3"&&#")0&**#&))& &% "!oO_2O _ o   1:k,+N]Bbx BLc+Y@0LJ+`+  @3 "*@&p&&&`&&&&)+&&*+"+ @oo) !@I3!+*&"&!& & "!! ++&0P>@ &/_>г,Eld+]]]]?          %(CTX@(&  $)9?<<<"/PC3@5:!8#5C@ OO.A8Q _].Q8a nn.a8.8"!4C!4C4?C"2CC#"#!432!44C!4!!42#22&&&& &&!& &B&C&4&5&;1&2& x@#&* ;*44&CC?88?##..'C(@?A&  (@/?O_E2&#('f&!(@ O_oD&+N]MN]M9/9/9/9/9/9/9/9/]????.+C\X@@2?@-?@(?"? ? ?++++++Y}ć.+C\XԳ2?Գ-?Գ(??Գ ?Բ ?++++++Y}10q]C\X3@????@?!?C???2?>+++++++++++Y32#!"&5463332#!"&54663#"&546332###"&546332## 3^DB^ WB]ch2"?"@5?" # 2#2i#i2Z^_Z!!d"""!#! #!# @ 5   @ +! !!"+1..@ 2..12+2@ 5@ *$@3'+#''$#*#""" 2#1&+$&+* &*!& #&P22&@!&O3:k,+N]M<<]?@  2 2  $?e+N]ȟݟK*! ?@, ?%'!%'$'D M%M'U ]%Z'jji% @sYVk%f'))% #&  !) !# ;Y,!&@ ?&&&&&+Ď,+N]q+MN]qM???999999910q]88q]++54632#"&'&&#"3267632#"5432֪bRe  GꗣHP+Bk ~*I*h*@/"@/" "( ] c(! c@ "!  ,%!+*,+qN]qM<<<???<99=9/=9/]10KSK$QZX88YK SK$QZX* '&#$888888Y]32##5#"&&546632#"&54634&#"326pŒryysܖppؕؖmywxzȠܠ/ @i 2BRc *48JL\Zol~u !! T;p@" ;;o!*,+N]qM]q??9/<<10K SK$QZX88888Y]q]q!3267632#"5432&&#"-^A0 WՓ>32Wɷ󁋮Z4@%@ P 1 +++  " 4.11".@@"$("%])! .-  "@ 6, @ /@p5u+N]M]<<<?@*"2@Rct X"  X" " _@ OQ+N],Ys]@4bs X" X""   OQ+N]F*@<789:<=@CE & 6 ,'6Ubbtt62EEU07=@::F>::=>"7@ P@F"%@"""F"""%60@333F/330/"6F@@eCCF?CC@?"-/&.-(*7@;F*!! 766%%  @50& '&@50&&&>/ ?>@ ?>>>>G*+N]+>>+++Y]632663232##4&#"32##4&#"32##"&54633#"&5463klAb!8s:[6GGN3.fAFO1-,=CGGGbUsEFFE;LZ@TEeCW)dlW8@7qcdd{j@F")/@ ,\0,,/0") @F  "("@%%%\!%%"!"(82@ 5F15521"2;8 c@!)(( @:! 10009Ga+N]>?@? ? ?<++++++++++++++++Y#"54324&#"326<Uᠠᠠߝ-~W%1-@?1 9' 95-QU] deek t{*r.   '1 ,{@ /"@ "%@A"/"""% )/;;/! )!;%&!3, O_o2^,+N]B4B4B > B>B"4 WZ8i8j;z8~;8; ;Q+)#&1@=<4 9420#.6  ;==!!C 5 ..@&6!!;U9!O_oF1T#;)!@@?@Yo))EC& ! ^,+????N]M+N]M]9/9999999910Cy@87B %%>;97 9B?>=:<;<86A++<<+<<+++++++KSK$QZX;4 D>7"<888888888Y]qq]C\X8@ ?; ?8@?;?D?D ?D ??8??++++++++++Y]4632#"&'&'&#"#"'#"&55463232654'&$&&54632|8RN;F0Da_ #oQRLjLԓ+<'89+5<(#|Hke".0?zDN// 4h++++++Y}ć.+C\X@#62?,-?@(? #?? ?"<>+++++++Y}CTX 43 4++Y10q]]qC\X3@  ? ?3@J ? > >CA?A?C7?7?C7?7?C??!  >4 >2>?2??Cij>@ >#<>!<>+++++++++++++++++++++++Y]2#!"&5463332#!"&54663"&&546332###"&546332#&&$dd$ 9 qH  ~b2@?"+ !55O @" KJ"hhxx"""""22 @ / " """""#+1.0..@ 2..12"+2 @" @0/"2*$@m''/#''$#"*#"22 #"##" 2#" ";;; ; $;*1;++*Pp4P p3*!,+N]q]q?9I 2Ech7KK7h^} J7?M< !3@ 4$e+Nh8J 3Dd7KK7^} K7g?N%y@J%& )Yj$    ![  ![ [oo'&c+N]q/M.+}9999910]q]2#"&'&&#"#"&547663232766I-\U9;#= Bh1)P?e1GP#3P6"G! !R?'9]f% &$ 0@/AAA/A_AoAAAH+>),++]q55C&$2@ 5555@ H+ 2:2,>^]^55+]]q55L&&@ 97H'=),++X/<&( @< <<$iH+9)++]5.&1 (@AAA0APAAH+6),++]]q5&2 @  & @))++55S|&8 !@CCCH+@),++]55V0&D=_H':),++V0&DC"@ ;0;@;P;;H+>),++]5V&D&@AA A0A`AAh+D),++]]5V&D'@I I0I`IIIjH+:),++]55V&D'@ `KKK@KK̴H+@),++]]5VT&D8@=_=O=== =0=P=`=p==/F( +??N]M<<]<<99999910q]]q]%!2676632#!"&5463676654'#"&54633&54632#"'&#"32##t&5jEc+$5: 9xiOkW} / ;T75So&6RC1Lz(g~W#+>;`~==V@8 H'H*U7<0;2K0 S%);{0& #''0 0TTJ70>00GGJ>=@ 0=0J=@((#'0?O00J>0+&0+F W0F@@ 7>90 C0444WPd+N]M<<<//]<<<<9/9/<<10]]#"&55!"#!54632!2654'&''&'&5467&54663#"676654'&''&& Nr%6q66sm";vPj Xdb&3:;pr"?CAb56;qGx800@iKeCC=>`30AlLjB)-67[IZ8=%&->VI><o^t 2 A@Oo H~+N]qM?10#"&54632^fffg}ggf~*8C@D%F'g/v//  @%0 !""08255020@0*=)0!0 #0C @290221009""@ =) )0))DcO+]]<<<<?<<<</<<<9<]<]<<<10]q32##"&54663#2#!"&54633&'.554767663!2#!  v_8m0##3uV18Jc  y%[N:aA;*&G  SM7(F( YG@@`b445GAD/"A:@=99"@-+(/0&% 2% '05.!''@5!c@A@ ! !+]!2!!I@ 89 HG+NJX   @@   YzLX3IO%  @Wa@co_EHff>>    7  qG3Z"Y  l/Y20U G@Bbob`n~qq ``ko o o``pp  ppEG7Z$1A +F73ڵ F0FF@ =Z  5ڲ:4(  Zn/@ CZH KD+?NM]]10Cy@*   ++++++++q]]#"54324#"3254632#"&'&'&#"327632#"&'&554632ffD?>   0BTd:NetX `U6wHff>>"  1$2?VjSkk tU]5Iaj`<@JVV,-y<W-,.<,-f,92,7-Wz,XX-e,**-<,I,.<@ -.--.,@C-,--,O_-<566$$%%: **)) 0;: * 6$%1 5 @0 /..,,++ @ .;,-@ @!/?@ 4 / ?  @2  0  -3p333333@3P3`33388;""''*/0<;+*@;--0-P--/]q33/lhL:9  cP}!)1B@?"%/-. +4>::&2./ ' /& .? 2?&2.* ) "))( *110 )*"1  )*"1    )*"1 )*"1 X@,% $%f/% 0|@ '% 2 C+??NM]9999.+}993399<<<<<<<<10Cy@-.%& %'.-/.& $..,.++++]]]]%#"&5477&53276632#"&#"3254'# 5˷ ʸyf6ygh X vۿCy6ėm`N ,ɷ @ A *$,@ ,,@ [!!P!!@',p-O{+N]]]]M]]?10Cy@0%)%''')'''&$''(*''++++++++]632#"'#"&5463232654&#"&&#"326g~d|y`TH^|`Xc3BMS@7~Wf4?QO>?zde}dE{bb^3OC@SII\5PBDOT=5p@=[ [,[ +[![1[[ 0&&6! P+?/N]@eAA=AA>=2D=<=<<$MLM<;ML;<<$+,+<=+,;,+"0ML=H <4TMNM!M $NMTT*M+M$$ED43 Q '#=HL 50LL@ $#";@ 5;@0,,?0O0_0o0?0O00UO{+N]qM]+<<<<<<]+??<<<<9/<9/]<<999.+}ć.+}=9//=9//=9/=9//=9//=9/10]!2#!32#!"&546335!"&5463!5!"&54633#"&546332###"&546332##32#E2Q77R0   ( Z~Xb,}@D  /"N"!'$$F "'')' !+ (   . @-Ga+N] >0>> E$ +??]<<<<<<<<9999910!32##"'&&546633#"'&&546763!2##32#"&'&547633:Y2,  *( (H73  /72 4*,% *,(/7O""M+%447 @ 46""2e+//]N]M]9999999999999910Cy@*03!2313&%0!4_ (3 /_(++<+<+++*#"&546323276654''&546632#"&'&'&#"CHE72AGmTR:C?:PT-V)l5=k:5/@TiKt34'OPF-L:VS7Q(: }Fl B_S[%2]BC\LH"3;y>(lpb'/@b) '  '(/(//('  -%/('  "* % -*"!*!  ]! -0-@-P-- @%! o  0*,+N]M]????999999.+}99<<<<<<<<<<<<10Cy@+,#$ # %#+-#$ "#,*#++++%#"&5477&54327632#"&#"32654'@~{{ʧ}zzʢja?j`B~c}Kᛉo8Lᛍlxw 1@51-J[jfs -1 (o$$c@-!,O,; _ 23!@////2!;_&&3+]]9/]<9/]??]99910q]q]#"&54633254632326754632#"&546T+=>*T+=>P-BuT.NNy=*-<=+-;UPQ.Do(DzF ə^{n O@ @t> [>I N+?]9910q#"&5463326632#"&54z'+=>*'+=>%&.##/=+-;=*-"$ /]3/3/3/3/]33/3///9/39.+}ć.+}10] '%o"-Co[@O?&7@$y#5: :4' 0,;;#!]! /!*]%3!( (2  hh@ ,;$$T8(+]<<//<9910q]32###"'&5463232765#"&5463354632#"'&#"Ȳ}DB, ?3Z5FȷJ@(!--i7J ƒ_|Czw@C6; l|<-,L9:F~v(4=@o`` `-e.d0`1o4'0 67*6*766;6567567;<*+-0567;0567;<%+-13+-1 + -13;+-18%,+,-"1.72=71+-138+-138+-137;,)$)=<5   $<9= 5= ,!!9!&&!!2!;))> @  ?/!>! ",+??N]MN]9/M<<9/<<999999910Cy@-1 &%- /#1/#.,#02#++++++K SK$QZX.%4*88888Yq]q]8!3276632#"&'#"'&5476326324&#"326%&'&#"T_/Lo. /B\FL.2LsYuq[qM.gnNONOM;@@:MsET# ($3z}vpЋoxvٲ˲WBAW<s @ $ P+N/M10!"&5463!2; u @ $ <1+N/M10!"&5463!2z  D@    [ t t c+?<<9910]3#"'3#"'ګ ګ Q (Q ( ?@  t  @tǫ+?<<99103#"&5473#"&547 \ #( #(  :@&   B+?]910q]!#"'#$ #2 :@,| n +?]910q!#"&547&#2# o=# !-Y@0A^1%p+4 p4@ [ "p((p.P+NM</<<10q]#"&54632!"'&&546763!2#"&546320!"00"!0=O  OO  0"!00!"0"00"!0/+"//""//3 l@ )% @@MMMM  == P+NM=<?<?<=9/<9910] # ^oy9Tg7;ag~&\<!@0EEEH+6)$++]55ch&< @ E"H'B),++g!g /3//3/10#"&547632Gm  }NOA@S@@/!9AIAR1t1t2z!z"u445&6964d4k@iA424;<!!!"141@ 41# ) @!4@$ 4*0@ 4>oop777@0473%> %-&*&9 #0) *&/]qr99<22<??+q?]]9/+<<++r<<10]++]]]q]qqqqq]]#"54335#"54336325432#"'&&#"!2#!!2#!327632#"&&S((PP((T  Ж***'ڃox G**-**ɞ(ETZ";8893^h}Z'Wd3kdC@$        OM+N]<]??99910q]632#"'k9TjdB@p    S{+]>N::"AKQN/JJ"Q)%Y#;(],!!;2Q21BA %%RSJI_T9:0N5c: I@  /Ra+]<<<<<<<9/?<<ANEE">N"7=::N66"=GMJ/FF"M%!;$](!M;..->=  !!NOFE56J!j@ ,,6 E /Na+]<<<<<9/?<<~1@# 22!""21+.2+& p[s@[++*" 4 44)$##"2e+N<< J@  [ t  @ [t +/]]<<99103#"&5473#"&547 \ $( $( =.=IXdc@c@4[@4H@4@@4@4@4a4]4F4C4B44@T4OPOSOYNJL NM/L5L8M>OJ h h9hOhT?P?S?YZ \8ZP\S>:< >=/<5<8=>?J H H9HOHTM%!-M(@ +!!:++:\7Ub7NA7:G7377 77!/e+Y7J@ _7RR>7/D77eN 3 S+???]NM9/9/10]]]]]]+++++++++++++#"'&546324&#"326#"&54767%632#"'&546324&#"326%#"'&546324&#"326/?KK?/oJK?/>Y""YZ!!Z    f.@KK>0oJK@.=Z!"ZZ"!ZW/?KK?/oJK?/>Y""YY"!Z$B@YXABCXAB7gg76hg  BAXWBBBX@B6hh67hh7BAXWBBBX@B6hh67hh,&$7@////////?/o/////sh+<),++]qr5X/)&( &@6 6`6p6666$h+C)++]5<&$' 55H+2),++5X/&( +@@HHHH HPHH$H+E)++]]55X/<&(C @  BB$H+=)++]5<&, N&lH+#)++]5)&,  մh'-)++&, @02@22ZH+/)++]55<&,C $@,, ,0,@,,-H+')++]5<&2 @  ) @)++5)&2 @ * @!)++5<&2C S|<&8 @ 7@@4),++5S|)&8 @ 11h+>),++]5S|<&8C -@= == =`=p==LH+8),++]qq5b`@8#2@Pcq X" X""   OQ+N] &M-O+8(;`D <4 @$  q+N]/M10!"&5463!Y!4:#@, [[q+NM/<102326767632#"&546d;:^]u 9--Z9 ZZ  1 B+NM?10#"&54632<*+<<+*<{*<<*+<<T Q@ @ (4@ (4 (4 (477 7 @ 7m|+N]M/10++++#"&546324&#"326jKKjjKKjKE/l  D9',$`=)1D% &%;0@\    vv vv q+/NM]]]]<]9999999910#"&5477632#"&5477632OT@  X7 7 M 7e+?9999910327632#"&54632 $:50.  ->IVd= D-#/ RBFg<d@BI F h h x o     vov @ vv q+//NM<]]]]10]qq%&&546327632g   VW7Q@2&&=35'%%^  ('') ()'   '@ 517@ 454471@   0*@B-5)--*)0 $ (%  ) ''  '$  ' ) &)&1109 )@ $0$@$P$$80Cy,+??N]M<T   $P\   .@z4#7$<2 8%Ooo   &%%' &'   X" X "(.+''".#/0 &# .%%   %/ 0 % .. ;h 'h0""/. Q#+??]<<<99999.+}99999<<<<<<<10]]7632!2#!"&5463!#"&54677#"&5463  JJ  h   h   &6 @OOOOOCh+E),++]5&V@OOoOOCh+E),++]5&=_$$h+)++]5&]%@ oh+)$++]q5<)k@"'&$#  )'#%%@44$  *e+N<<<4>4:>; > !" !"$* e& 8+( -692$( %+!0 ;/%%%9 ;9! 0@2! #--@A6!  A&4%:<#?<#36#;9#=2#52#++++++++]q]7632#"5432&&'#"&546767&'&&5463226654&#"՟_5$'&cY(CG'^b٤i:  ~D.!>up*  N^hו^dch3&<9"eH'6),++~1&\9H'7)$++[-7@@151516$!+%%6'*+&&.7367 @    @&/.O@&3%   9&%8y+Nc-~W%1@@'+-1)/""%"/" /%)!/! !&&0&&&&@, o2^+N],@$$$   @+[> [ *xd+N$!2S<1   .uxD&0pcYe7~@ do' P7@,1)%7177",4>,9,> 81~!+/?NMN]M]q]910]q#"&'&5463232654&'&&546326654&#"#"&5476632?FwGN]UjldOB&QGg6  !tBg{!^1K~5 1[56[ 6,G9 $-iB,!-*T@:#$$##$#$UO+>#6$,+b7764M556>7EtLb b@[MI>+[64@V;,OV[ /@ UL6 I;:Ot[[@ 4NLU++<]<<<<<<<?/]?]<<<<9/]q<<99999.+}ć.+}9=9/=9/10]32#!"&54633#"&5467#"&547632!5332##32##"&546335#{  }m  | Q  ( N"9^ {  j7Gfj+@)IJ@I@K@i@jPIPJPiPj`J`i`j 899 @A@@Aijj'@2JKJJK@9A8Qk9@gh8AMjJjbVIIfihUKWfb__^b%b)@%b11_KK^ iUK@ LLMMVVWhgJj;I@gHHbbbfQ[f;Wl"!4!4]],Y k"+NM]<<<<<<<?/]?/9/<<<9/<<999999.+}ć.+}10]]#"&'&5463232654&'&&546326654&#"#"&5476632#"&547632!5332##32##"&546335#}?FwGN]UjldOB&QGg6  !tBg{!m  | Q^1K~5 1[56[ 6,G9 $-iB,!-cN"9^ {  jtF@5$FF*$ $* [[/@3$+#$+*>=D=$7@ +,3,[2H4 =@  $&""GPS+<<<<<<<?<?<9/<<9/1032##!2#!"&546335#"&54633#"&54763!#"&55!!54632#"&55! qqqq }.B K__&*4 TH'Q),++}~~&JKK&H+H),++]5&,&pH'#)++&6ECH'H),++&V@ M!(H'I),++L9&&H?7H'<),++K1&FF1)H'.),++L&&/@ CC7$h+9),++]5K&F9@ 55)h++),++]5~6BC@#  O@ ;?;@#++++++]q]32##32##5#"&&546632#"'&&54676335#"&546334&#"326n gpŒryysܖG  GpUؕؖ3  uywxz'_Ƞܠ< @  ر|+N/M10!"&5463!2m<E  1 +NM/10#"&54632<*+<<+*<*<<*+<<&$ /FFFpH+C),++]5V&D #@ pNNNNH+K),++]5&$!:@G@GPGGGGGGGG !4GH+3),+++]]q5&D"8@FQWPVSVUOO4O@ 4OH+;),++++]5]v&' %@ 77 7077,h+-),++]5~$6@z z 65@ 4/@ 4$ @ /"@/""111&&&+."! .@! %.(3@ 433((. @!  7*+q3/q<</X&(9@"NPNNNNNN N@NpNN N0NN$ضH+:)++]]q]]5/&H!l@`97OH';),++Z1&U2H'0)++X&5(@BB BBBBB7h+8),++q]5Z&U6h',)++9&6IKCH'H),++1&V=KCH'H),++G<67@ 0000000@+]]5G;6W@6 66666@+]5<&7.ִh'$)++;5@ 4@> 4O ( ((twv  @ 4 / ? O  r@"3+;//;!!!& #@55 1-p)) )0))))6*+]]]<<<?2/?<<?=9/Cy@'('(++9/]3/3/+9?3/3/]10qq]]q]++#"54767#"546332!2#!3267632#"&5#"543354328% > T.& J888\X8 (󈓮88*+L:!I -{+*WT2! *(bu/*+88S|\&8(@  7P7`7p77MH+4),++]55[YT&X!`..H++)$++]55S|8&8a@ GeH'D),++[Y0&XH!..[H+,)$++]559&=L@  H')++1&]P /P H+)$++]5&=@ `  H+)++]5&] / H+)$++]5W@  @ 5  @ 5 @+5   &&  y+/]<<3/]<<??W8888WW8888Zr&,2@ / 42 4(4+@4t(t+{/{2-.',"&$b@ $$&"!b@ !  b@   b@>-'%@"!.,%@ 1%*%C+/]q<<3/]3/]?<q<gޮg****g߭x^g**** r0bq'@$ 224PPWww '@ #$4! 4$@4 $4 4@4" 4$@i4 9?)Y''   &! !!!#!    R+/]q/3/3/33/q99?†rw||yJWL)#."%*&F?&N;ThSDj0 @pYy$4@ $4@ $4 $4@9 $4I W``!   ! !!  *+/]/]3/]9??<<10]+++++#"54663!2#!"32654&Wksw88?uܠ+;uL*+SkߜbN@-!  /   P/]<<2/3/]3/]?<>< +<</]10!"&5463!2!"&5463!2mm''=@H'o9 )+]+.:@021+.222+ 2$*'##2*4:7332:"+:@ ,+* $@ #$32;:H+///N^)  O :)/^@O7,8Uj    N3#3O"-[&@I j kw| 2 22r"`$`##$,-$[vvn,@/5M[.X/S@:4S t,};,G}@  ,z\[lb@ r,[4 @!C2(,C27$K7[$UUK-$PD+N>T#Q" $ (K9Q f8h@!  g w  00@  4 4M@t t KD+NBE1(&f8d@+hx  0 0 44M@ t tKD+N3Sy@vg9@ 0@ 0 0@/0tMtMtt M MKD+//NvT3-PNR,4Tv}nOM@ t  Mt @20444 4     0 FHx+<<<<<<<<//<<<<<<<<<<10r3&'67#&&'5566!!W8n[Zo9__pY[n`^/z4,RQ,3{>vT3-PNR,4Tv6?.@$ $4KD+</(4 ,''"i&T U /3/3/?3/3/?103#"&5463232765ZQ{=M3$ !%{o=0(4)$(#gU///3/10!5!3“TU/3/??103 UU/3//?/3/10!#UUU//3/?/3/10!5!#“DT//3/?/3/103!T//3/?/3/10!5!3P“TTU//3/<??/3/103!! !TU//3/<??/3/10!5!3)TUU///3/?/3/<10!5!!#“T///3/?/3/<10!5!3!3“T 0 T U@   ///3/<<??/3/<<10!5!3!!#“T"@ /////3/3/3/10!5!!5!33b-}P,TTUU@ /]3/3/3/????103!3-   '@ U /3/]^uv$'GQHRK]T^Wahbkulvoxvwbc~r}sfgznyojkx//?:;6723\YXUTQPMLIH_Z[VWRSNOJKtqpmliheda`wrsnojkfgbc}|yx~z{۸@ EFuvº @-.DG]^tw@,/AB\_qr@)*@CYZps@ (+=>X[mn@ %&;:7632/.A!   ,-   @+*YVURQNMJIFXWTSPOLKHG[^_bcfgjk()\a`edihml'& ~}zyvurqn |{xwtspo$%#"  ! CZ] B@YX[\?@VW^a~>@UT_`}|;@RSbez{:@QPcdyx7 @NOfivw6@MLghut3  @JKjmrs2!  @IHklqp/ @$,+FG('no$# -*)&%"!E0C. @D-*FGZ)]&n o%" !EDA@=<985410./ĉŠAP"? 0 0 [[@,  , $,H#q+<</910Cy@." (((" ( ( ((!(++<+<+++++&&546323##!5!"32654&CmwvlK$UxxUUyxAkyymEExUUyyUUx2>@*))%`0@ .!%&%#&0&'''(&(+1$% M#%MA  &M@3,19,+#%4>%M @"#%M&M6<,(6,.0..?+cd+/N]M9/999.+}10]]]]7&'&'&54763232632#"'&'#"&54632"32654&t#I7 @?^I  ,TxxxGGY|}XX||  EY?C 'SSQo|uxK|XX}|YX|L"@!(CC4WVL JU[ [Tk iED @` 4 4& )  > _0O/3/]]q9/9/3/3/3/3//??<9/]<9/9/10r]]]++]]q+#"'!7266'#"&54767676glJZcK|Y-SZ -pM8lE_c %%d__YJ;S[srS3@u +,* *,< <,I I,\ \,ee 0]Q0131 0  #4 .. )4   3>>&. . . @ &@&P&&&//]9/9/3/3/993/2/??/9/]9/9/3/]9910q]]]!!7676654'#"&54632&&5463267632#"&'&' 5Qf;Zt\=f*vuDT"dq=1#3X\="#!3mzrus3DH)qmX`'sw<3$X<(laxT@4i @ @  FO{+<?2910]q&&'&'&&546326632ilp+&feK9$!WeQv}mʔ)Al8hH7jvt^U/4F ų   FP+?10&'&'&'676eY]LO+LxeuƗgO߶2@q(sҜl@{  ;@' M $ ,/?O+N]]M9/<<9/?99910]3#654&'#"&546323K2:_/;sAk9:wS-/ReFTuww |6-Lu Z:!@  !!! !!  ;@@ 4Dd @  0@` !;@  v  $/?#!$v"+NM<<<D@ApAAPA`AAAAb@ AAD >=7@ :V6::76=  b@   b@ b@ b@>.&*1&$ D&>7&>=**=1&&&&  66!555 5055r@ ..-&''&`&&ԴE&+<<]q<<]]<?<?<9/?<?99=9/=9/=9/=9/=9/=9/]]]qCy@/4"%3%2#5-0%.9/.%&4"1-/%19++<<+++10]]32#!"&54633#"&5463!2#!#"'5463232765#"&5463!2#Zqsn.T3P1@>E9>Q~ :C@9,,,E,E9("%@ !%%"!"(  @ "@ " @" @(!;)";)(7;/6;/0@; ; ; ; _?)3@ :*):) 0!!__@ T ;+]<<<]<<]<<?<?<< d+?<10!#"&547+ '+  %'$ H'OH'++*>JV¹4@4U@4M@4S4O@457,,N+766N7HT7B 7#) @7)Q7EK7;>_?o??@ X7> 7p@ 71>P&`&&WǼ+]<<]??9/9/10++++++47632#"&'&&#"327632#"&54632#"&54767%632#"&546324&#"326  aS^wx_V 8[pqrl   mmmm/}ZY~~YY~  j (Gx_[wU %+ 7666=Ga+]<<]<<9/<3/3/]???<<<3/+<3/99=9/=9/=9/]=9/=9/]Cy@%&&$%'++10KSK$QZX**) 88Yq]#"''#"54763232#!"54334&#"32#!"5433#"543t#&#^8899^}zNtw_8888_q88&*q****V<****>*+koAE@$$$ <@@ >+A>>@A< @+ @)  .2@000+30023.;7@ 9+69976; @   )  @+-)@,+++(++)(-!'EBED43BC56"& DC45@6 455; && & & .--<<; (3@433333@GA06@66O666_6o66FJ+]]q<]q+<?<<*+********+*********괴>n9@` pr    @1 2,+;-;1@%)41@41@ 4118  ////6@ \"&*@ (\+((*+"&@\  "%!@###\ ##! "%84@(666/36643"8&! &%%8  @ ;9 3+++:Ga+]<<]<<???<<<99=9/]=9/]=9/]=9/=9/3/]9/9/+++<<<<<<Tv7 !j2ҦJl~..@1....dd.  {)*j)*) @ \! !"@ \"'#@ %F"%%#""#;')@!,  ; @ 0( "!/Ga+N?? 02F%- 7,;a@2,F ,A/--ղA>+/]q<<<??<<]9/+<<2/q<<]33+10]]#"5433&'#"5433&54632#"'&#"32##32##!27632#!"5476658888{lPj^v8888vf &*Ybp8/Mp**#>**i:x%gP8k**;&** ҕl/.@*'Z|Hy@FKV @ 4@@ 4  4 @ 4 /+<3/+9///9/+]9/+399910]]3267#"5432'&#"AxHHuy*0 瀬yyv+k=@ $4D $4N@ $4H $4J$4  N YNY@#-@F!! O/?O(P(!!OPO@bFF(:b@2/2?2O222Lb(  #7-=!///I!++%7!555C!%%P[ [ O<3/9/r3/9/r23?3/92/YY>=[]HH][JLY( *N*7jPqqPi88[HnnH][4LJ61ED5PP55TV.<Q]i@-VIAIEwBwNgNN=>HgB=>H=HGLIN@$4 $4S $4]@ $4W $4Y@ $4_*$4i@ $4c $4e@a$4=H[a0/;76492260/79;4/00 67667O999/9?9O999CP22222*C;;j44kj[baaCUb@M/M?MOMMMgbC @LP`p*%%%%!p  bO!b*=RHX!JJJd!FF@R!PPP^!@@k'' @!--! /3/]9/283/3/3/9/r3/9/r23?3/q2/]3/]9/]]9?3/]q9/9/9/9/]r9/]]q.+}999910++++++++++qq]]]]qr#"&543232654&'&54332654&#"#"54632#"547632#"&547&54632'4&#"3264&#"3267LrO"N]Qnt\-+)AMOIg6 $Zd~Pl + +"v``xk^^KZ>>Y[<=[UPH]^GLY]5N{E1Y7:WC+*I9NfE^*N*4lOrqPi88[HnmI][6JJ62DD.WP57RV $2GS_@6LI7I;w8wDgDD>g83434>3>GBIDI $4S@ $4M $4O@ $4U*$4_@ $4Y $4[@`$43>QW&%1-,*/((,&%-/1*%&& ,-,,-///9((((((911`**a`QbWW9Kb@C/C?COCCC]b9 b @ 4b@  0    @-3H>N!@@@Z!<<6H!FFFT!66a[ """! /3/3/]3/<3/9/r3/9/r23?3/]]]2/+9/92/?3/]q9/9/9/9/]]q9/].+}999910++++++++qq]]]]]]qr632#"&543232654&#"#"5!2##"547632#"&547&54632'4&#"3264&#"326FLisc#O`XcWLGO $f..m + *va`xk]^JWA>ZY?:^ TQH]^GH]zZdY=jKBX#"*N*4lOrqPi88[HnmI][4LI71EB.WP57RS!5AMz@1:I%I)w&y)w2g22,g&"",",G0I27 $4A@ $4; $4=@ $4C*$4M@ $4G $4I@*$4",?E     '@k ''  NON?bEE'9b@1/1?1O111Kb' b"6,O #@ P@ 4##/3/]9//]2/+rq/3/102#"&543232654'&54YHG(p .+#1\6es/F  !011 %^@  o   @p#p p P+//3/?<<<]9910#"5477632#"&54632#"&54632++*g/#"//""00!"0/#"/++!10" 10!"00" 10@ .2@/58"9031FI"I0F1   !&&  @))-@++3.++-.).0@31!@ /?_@ !($&&&@I!4&)#&&$#(#"/..0211"0..#"##"())/2222011&"!"X@ 0O0_000@ .& #0#@#P##(@ 4&1&P>@ O3&+]qr]]]q?<<<<9/]<@"$&<>@    !&& ? O _ ? o  04@22 22)522450/+@ -+*--+*/"&@ $+'$$&'"!@!/O!@ @ +<@@ >+A>>@A<;7@:9999 99+69976;)(0//""!;<<5*6*A?AOA_AA6@C''?@/B+]]q<q]<?<<72&51) * 0`@! #   &&?  +/---@ 0--/0+0*&@((+%((&%*%$"@ ?  +# "##$@ @8%0$%$$%$#$$#$$+**%&000@ &P#&Jo+/<]<<]q?**V2#+1$*TU124U@88⣱貤 882&51) 1&ζH+%)++555$WY%eg@:fiiiigxw&&ooo@ OCz+/]32/]9]/9?<**********0.1: %3; @ 5  @ 5,(@ *5'**(',/3@ 15&113&/#@4 4 #0###@ 4/?&'&&-.&/?,@' (('- ,,O-_--%! 0  ,@&33&.//.o+/<<<<<<]<99!99W8899VV998899!992dh%-@ "$ "$@+@+ $@ "+%""$% @ +@ + @= +  &%_oOO@  'J+3/q<************[3@F GV W    @ V @^`p6        &&   /Oo+/]<<532##32#!"5433.55#"5433#"543!2#s>99WG‡z9988{CW88?h{88I99>Z**x****"ɸ**絤Ss****<+@ 86 HG YV p   ֳ4"@4 4 44"4 4"@3 4)) )))$%&&%%&%@ %@ O  %p$$@+'&&!%O_o&T+/]q3/<<]<**TU121U@88⣱貣88&,?  H+#)++]55ch&<#@ 3?33H+6)++]r55bq1&.@ .#H++)++51&04@?O?? dH+<)++q5~1&5@,,,xH+))++]5o1&OH+)++]5Wv1&#)@******H+6)++]]555~+@:IW@!$4(4@4@4*4 4(@84!"#"&; &! &! ! )!  0G+/]< "$4 $4 4$  O_ K      @ " /? @ ",(@ */'**('", @ 0/" !%@]#/&##%&"!   -!--,  !  - 0 o  - '& &&&*+/]<532###"5&&5#"5433432ke*88pQ}*+p88#er+*3>ox+*PE88)*+zaK{99uX0@/ $4 $4" $4 $4!,$4,$4$4@1$4DDD, !. "'' %% !++ @4 ! +/]<<3/9/+3/9/9?<33?<<9/9910]q++++++++%#"&54323254323265'&&5432#"&f }9mF,*vR*+Wp),)[m9}ySG *hŨcD99DBg*G(x&)@pεH+)++]]55Wv&#)@++@+`+++H+()++]q55<1&R@H+)++]5Wv1&#@ +dH+()++5uX1&&"@ /7?7O7_77H+4)++]5X/&( 5@HHH@HPHHHH HH$H+E)++]]]q55:8485b@   b@> '&9 ""/""")& &3&/)&99/ &&116$&޴&& @6&O,_,,<&;ET+NMN]M<<9/?Nu.**SN)~@:|**** g{u5>ٱ98@#;-!@ 4@ 4@ 40@ 44@ 42@ 4@/?)@ )!@)!"&@ $+'$$&'"04@22222)522450@ ) @ / ?  ) &&>>&((! 65&0"!!/00'66&5@%*45@0445@ 45@455o555555 :&,,,@&  0  ?l+N]q@@$ @ 4@ 4 @ 4   b@   b@  b@  #!b@@$!!#$&)) )):@4::/:::=$&&1 =%&1<&8'&+8޳>&$@+&@+?Eo+N]M<<<?>O>_>>4> 4> H+A)++++]q5dh,F @ +  @+ @ +@ +  &"@ $+!$$"!&@C+& "&*&'' (& !!&@.&0@O_o-J+]q]q]<<<<9/?<<5#"543!2##32#"5!.p+)D=sFF!GGWW-)+YAD*~****2DA~X/(c@A  #6AR#((88KC@EDT@U_YY\_ZZ$#C4,5(5*5c5_5a@+5-@51@5/@5Z@5^@5\@4-@ 41@ 4/@ 4, 4( 4* 4_ 4c 4a@ 4^@ 4Z@ 4\@ 4^Z@ \+Y\\ZY^_c@ a+aac_,(@ *+'**(',-1@/+2//12-588@B@@B$!!SUUDFDDFCB58@!$-3SFUDH&cZ&^&?&;Kf/?_?OX&& 333^;;,-_^^Q58B@=UDSFI2$!'C@"%4C@4C@4C 4C=2"%444@2 4' I&MM&/   AMA= pP@ '==O===@2'Y'_22@222&T+/]q<<]]]]q]q]9++++9++++9999?<<GGA)vbwAGGFF@ubv*BFF?xRg.]B;),)"f[MNA&@FFGG>aMW+sA;nyU-;**&" ****%**&90ƋDn:@s+XS****rF?@$6 4!<: @>$&77'3'';& ;&"&;& CT@ 4)5&1f%&)@&>A&A &@ 4@Cy+N+MNM9/+9q??9/9/9/?9/91088888888]]+]q#"$5463232654&&##"5433 54&#"#"547654'&5432327632:  y:GG:' &!  `?΄+ I5sSy#*+my+'B'\W':=u('I*!!@+@ +  @+ @ 3 @ +#'@\%+%%'#! "!""!! "'&# &##""! ! O_o) _o(:k+N]@*  34//3784EH4W 5FU 2 ($&b@ #&&$#()-++b@ .++-.)b@ !b@_"!"422/246/& 6 & <<6-$&(&6)(!& 24> >&:(@p  @.#0""?9l+N]****S)}B; _****0ko+2dh%- $@ "+%""$% @+@ +@+@ + @2 + $$ & &%%%%%%@4%@'  0@O_o&J+]q<<+]q<<?<<************[3L&<7,,^@%Xwxyy w"!! !" '#@%%)"%%#"'"!(,@**+**,(@+  @u P ` p `  )     "!""!! '& ,,#&'('!  "&@P"  5 .""@ 4"-o+N+]+]<]M9?<<<<<e****j_k(yE@yCYx****cj%-4)@E //U(X,X/() ,(),/(,/235() +0,/@ 23#T  @ \ " 4&&@%*44@ .-&@@%*4@4@ ; %; !*;1;@.- o_+/]qr<<<<?<\\(,)(\\,)*+ `O ~ P;Yx*$ @ "+"" $%)@ '+*'')*%@ +@ + @$ +  ) &%$$&  *@ &@ 4@4,44+J+N++88**L**_[":@vv @ +  )%@'''+$''%$)*.@ ,+/,,./*6:@888+#88:#651@ 3+033105@+@4+&"" :&61&5&&%&).&* & )** 655& 4@.40/#$_$$_$o$$$@4$<_;+N]qL******`l ********WY"@ @ +  @ +@+&"" & & &@ 4$@ 4#Jy+N+L******_[NS/@O4y/N+]5)5@@{{y y   ,-@ 6,5 "@ / ?  ) "#'@ %+(%%'(#@/?)@9+)&'&""#&.& 3& *&O_1&@47(@4@46l+N]++JKWT.),,=suA+F@9?-`3** #Ƴ****S" **Ɔ?"_.?9@F+Au{6*++*F4ķ62 @1  ! $!.@:5.@ 4..&"!0&?&&@ 4& .@=+"!0! (;33Y;`pp6-;$;(Yo  @4 5*+N+]MN]qM]9/]???/+]9/q99/++108]888]#"$5463232654&!#"5433 54&# #"55432632`=Cf ⴵ7FF70 %)+sMw]4 `iQ\M'.FS6,HH?}p:b'ox'!%@ #/&##%&"! @/" @/"@ \" @ /" @ \ " ' '''; A@B&&%%; !!  ''& O_) O_(^a+N]1!*;8/&;+*#; ; 46<  @;<`   B0 % $0$$A!+N]fFFFFffFF!FFf>QVG{ll3+) +g! 4}** k@*****++*0WJ/s<53sb+'+@))\))+"'&"@ $/!$$"!"& @  \ "@H\"! ;  +";'& !  O_-;O_o,%a+]N]9994F9999TG*****+Q+*G****kbb3!@ @ @ "!"&$$ @ '$$&'"" @ "@ O @ "-)@ +\(++)("-.2@00\30023".@\" @I \ " )22 ;&;"!!-.. 3 'O(_(((((5   4Ga+N] @   "@4""&?,,!&;9Y=7& &:T/4/Y11C& ;'c@;4;@ .// "::+/]<<<</<"S}@@ @4p+*+]+5$&2X@F55 8"v(v,z.z2,.2(,. ys(s,|.|2#&(,.2# @ "@/"@/" @a   \ ";; ; ;0;*;$ ';@!4o-;o!!!!4    3Ĺ"+Nq]*+N]>n9]@   '  @8@ 44@ 46@ 484@ 6/36643"8@\  "@ \"%!@###\ ##! "%&*@"(\+((*+"&1 --@4 4;8!&! @ 4 !!*;&%&  /c@+9 3 + ;+++:Ga+N]M]<<<9/?<<<<<>>?>> oH+A)++]qr5kbb,)!%## @ &##%&"!  @ "  @  " @ ",(@ *\'**('", @B \ "( ;, %;! ;  &O'_'''.  -Ga+N]**'A****-=.3Q****47DCSP::33++ +heb%[@HOO O O @@@@?? ? ? 0000// / /         !%@##/##%"!@/" @0 @  \ " @ /" @?O\"@1/"% !  O 0G+/]<BBBBCAAC>CC>BBBB@BBBBBBBB>ABBBBBBBIsYP;4R@ 4RR\@  0  9/]3/]<</2/+10#"543232##"54#"5432sBBBB000*BBBBBBB1010BBBIsY [ ; 4R@ 4RR\@  O_"!9/]]<</+<2/10#"5432#"54332###"5#"5432sBBBBKE0000F10BBBBBBBd1010}00MBBB$WR.RO/]?10#"5432?CC?BBBX7 R.R@!4[ R@ p9/]+?<<10&'436&'436>BC>>BC>AACDAACWSR@ @ 4RR R@!4[ R@ p9/]+9//2/+<<10&'43&'43&'43AACBAACBmAACBAAC?AACAAC4V ;.@   3/]3/?10!2#!"54<0001010H4V+@;   9/]/]3/<10#"543!2###"56n00<00m101010}00$y!R@ 4RO/]?+10'&'6?<BBBBBBBCCBBBB$R R@ 4RO/]/+10#"562BCBBBBJ6X @ p 9/]/]/10432#"61010000 @ [  3/3//10"543!2#0000****{4 (;D@@ 4  3/]3/+]?10!2#!"54<0001010< "@  [ 4 3/+<<?/10%432#"<****%00v0zRR/?10#"5&2BCHBBBDz>RR/?10#"562>BCBBBBH  @    /<<?2/106636#&6636'&\9<_SF@VU@<_UF@VVK=N@=KHiECO?9PH(@*! fg    (z   @; !"!" ((  $"" ( (( ("!  &  & &; ;,@$("!    O  /]3//]q3/9?3/?3?99999.+}33<<<<910888888]]q8qq32##47'&5432$55#"5433'#"'㿋00 *o00 )iR**o(\**Y (-/[,@  ; O/]3//3/?<99?10%32#!"543!4&#!"543!2w0000dYgd00~T****QW**}@ # <5 C @$0D ; ;,@ ?`  /]3/]/]9/??39/3.+}]10888]#"''#"547$4&##"54332)@\*+L(I00ag@%%d(" O!F@>**Q.6@  ;, @ $4/]+3/3/?<99?10!"543!2###"500+00******00.  ;, I H3/??)cgZ00k+3lm;**m N @; ; , E F3/99?<99?108888!!47#"543!24&##"(`00&zTgg:**RJ@-B{ y @  ; ;;,  N@  M<993/2/]???9910888]]qq8863 !"54334#"#"5#"543xr.00**o00Ӿ@**Ty 00Z**v! 7; /;,  @ P`/]q<??10#"543!2##k0000**** -; ; ,@   /3/]3/]q??10!!"543!#"543!O00]00**+**Of@+F M6 =    ; ;, E@ @4 G3/+?<99?10888]qq]#"543!2# %4&#!! !00BvʑoK **s2 xjkt@#BTe@ ; ; ;, P@    O]3/3/2/]?<?<991088q]]!!"5433#"54333 #"543H00z00]b00>**+**r**!Qa;/ ;s; ,@ O_p@ 4  /]2/+]/]<??10]88332##"5! 32##4#F=k|00~%r00GI****k@ @ ; ; ;, 4@ O  0/]3//]<+??9/1088888q]! !!"543!254#!332##"5%00f=kv00xo**yGI**!r @   ;;/[ ;,@% / O   0P`/]</]]?<?9/10]q8886655#"543332###"54300Ԓ0000*ς9**&**^**$@$*4EFfm6>Gw@$; ; ;$,@4 /_  o    /   " ""/]]3//]]3/]q?<?93310888rq88q$55#"5433!"543!54&'&5#"54300L00_L00)fd**00>0$ ;,@  0 P `  //]??10!"543!2#"54&800**G**00mm$@ [ ",; ,@!$  @ 4   _   @$ 4 @O_`p /]q+/]qr+9/q?<)++5/+++5 &'uk@@E5@6:4@ 4""..@**@" 4*& @,,@'+4,@!$4,@4,,, 4,$>)+/+]+++r5++]5+5/+++5l@#BTe@; ; ;, P@    O]3/3/2/]?<?<1088q]]!!"5433#"54333 #"543H00z00]b00>**+**r**&^@ %% @+@)++5&@ ))@+@)++5&^@ -- @3@)++5&@ 11@3@)++5& 1,@+5H& ,1@+5(0(@.! fg   "( (z   +R@CP/`/// !"!" ((  $""$( (( ("!  &  & &; ;,@("!    4 )R@----- O  /]2/]3/+/]q3/9?3/?3?99999.+}33<<<<99/]10888888]]q8qq32##47'&5432$55#"5433'#"'#"5432㿋00 *o00 )BCCBiR**o(\**Y (BBC-&@@+]5&# 4#@++5.&@ 4@++5&  @+5e&A@ 4@++r58& 4δ@++]q5h (#R'@ 4'p'''' [ ' @ 4 ;; ,!R@ 0%%%%?[ @ 4 @4  I@ *o L)]3/]/2/++]9/]?/+3?9/]q+108888]! 54#"#"554632! #"543#"5432 ed**cQ00hBCCBhvu;00;\n4V**5BBCs <  R;,R@@   @ 4/+3/q?q/]10#"543!#"5'#"5432k00**eBCCB**x00qBBC!'&@ 4@++]5&@  @+]5 &uC""@" 4" @$$@'+4$@!$4$@4$$$ 4$/+]+++r5++]5&2 " @+5&@ 4@++5O!@  F M6 =  R@ ; ;,R@:;4 E@ #@4 G"3/+9/]qr+?<99?9/10888qq]#"543!2# %4&#!! #"5432!00BvʑoK BCCB**s2 xjkBBC!Q"R!!;/ ;s; ,R@@74@ 4M@B4=5@ 95@ O_ 4B  /]+/]<]r+++]++??3/10332##"5! 32##4##"5432F=k6008%r00ەBCCBGI****BBC&@ !R@%%; ; ;,*74M#R0@@ O  0/]3//]<]+??9/3/1088888q]! !!"543!254#!332##"5&'43%00f=k4006@=C>o**yGI**֫=?C$,@1Ffm*4E+8NIIw6>G'R@+@ 4+$; ; ;$,%R`)))4)@> 4))" /_  o    / O   " "O""/]]3//]]3/]q3/++]?<?933/+1088888rqq]qq$55#"5433!"543!54&'&5#"543&'4300L00_L00+>=C;>C_#-ŵ'7R"@ 4""$,0&; ;,R  '(4 4 4 4 ) a@  /) /Oo) %%O_o/]3//]3/]3/++++q??/?.+}9/+108888]32##54676655!"543&'432432#"QTbF00Y{R'P00A=C<]****k+3lm;**>)fd**>?C00>0&@ @+]5$,'R@+++[ ",; ,%R@!)@ 4))$ @ 4   _  @& 4 @O_`p /]q+/qr+9/9/+?<>+UmJ77VEoOD77=,,<=++>@H  4CFGE 4 @"@ 4 @ 4  /p/]3/]<9/q+32/39/33/+2/]+3|/9310qqq+q767#"54632&&#"327 F)RX^,;E6I8@$2\[9'./3T*{/2t8$>7/7_ ;/7R'- 4@ 4 ]]]++55 =   @?o@4@ 4/++/]]10"54772 i @!4( @)4 @ @"*4@ 4 l@@.?4@%4@PoT/2/]]++2/++3/3399/92/+3/3/3310qr+567&54632"'&'#"7654#"7>X' 1$,wO*' @O'1-};#3@3 >2=Op 4+]5# @ 4@064@ 4@ 4GG4364 4@(@(-4@ 40T/]3/]++9/2/3/9//3/]+++2/3/]+++9/+10#"5432327632327632#"h'3D +!" 4"\V\T CB$%A@m3J> @#5 4!4 @@&,4@ 4pn@4@*,4 4 0T/]2/+]q++/q2/+]q+10q++r#"&546323254&#"h4+3F?8=VIH$3BTD3CiU82E%X@$ 44LC9;;__@ 4ff/3/+/3/10]]]]+&'67*~^8f~AUpZd I@ E@4bW Z@  O  T/]3/]3/3?}ŜAX 6|]p!@  F Z ^  ] 4 Y@   Vc@  c@ /? T/3/3/]]9/39/]3/?]3|/]?3/+]/3/9?<10]]q##7327632327632#"8q"pg$ 1)]djl݊=E L $?s@ Fof ::4::4س 4@'45 E W )  $  \Z ] W@/ @ 4 jig/]3/3/]3/+33/]3??9/9910]qr]]++++]%&$54$5467s2y9ڧ+`Cn#y'N{{ 7p `X[EEx:-!&RN|IUTwqJK@ 04047 ^]f O  ho/]3/]//10]++]%"&54>32"32654&SxIgC8)'_o2^EBZ}wg[X7gPI5:#A?DE/????0QQJU@!.4UUU0U@U`UU@ ][[b\_Taa`\484\4\@ `@484`@4`@$^0bb??<>@4>>/hG.OY+slI+~  56$_^LLBLHJBy/?5;9?+~hJE 76$.03@dgQ3gf3dU`>||>4~,  ~DIACGHC6dN<E@6666@ 46@46@&)469@4`99999@@@+q]+55+++]q5506@K,@HL4,@8A4,@)/4,@!&4,@!,4_,,,,,,/,?,,,,,@4/,?,,,,@ 4,.@::4.@KK4.... ...]qr++55+]+qqr+++++55D2 )+;-D!*@,4 4@4 4 4!>F4 4@64 @@/14@)+4__4@ 40 @4@ 4@   k@/@ 4@ 4 T/]3/++]<22/]9/]3/93/++/]]3/++r3/r++3}/3993/+++]10+++r++767&54632&#"32754772/bN3P I 3h(%3 +!%T:pI5+$@Ii'D!,m@,4 4@4 4 4"&,&&'4'*04''!64@ 4 @@/14@)+4__4@ 4 0*@4*@ 4*@ $$@4@ 4@   k@/@ 4@ 4 T/]3/++]<22/]9/]3/93/++3/++/]3/++r3/r++3}/3993/++]3/++]10++r+++r767&54632&#"327"54772"54772/bN3P I 3i(%3  +!%T9qI5+$@Iii !F@!,4 4!@4 4 4   @@ 04 !!4! 4!! /14 @ )+4P  p?@U5@ 4@4@4@ 4??4::4@4!!k@/ !!@ 4!@ 4!!  T/]3/++]<33/]9/]3/93/+++++/+++]r2|/2/r++33/++r993/+]]10+++r++"54772767&54632&#"327 .bN3P I 3i(#5ni+!%T:pI5+#AI ,p@,,4 4'(,@4 4 4   @ @*04@4@ @ 04 )+,,4, 4,,/14@ )+4P""$p?@U5@ 4@4@4@ 4@ @4@ 4 @4 ,""   ,&k@/+,,@ 4,@ 4,, T/]3/++]<33/]9/]3/93/+++3/++/+++]r2|/2/r++33/++r993/+]2/++]10+++r++"54772"54772767&54632&#"327   .bN3P I 3i(#5ii+!%T:pI5+#AI +j@(&'+#5 4HY+,4 4@4 4@ 4 4H  4@@ 4(*++4+ 4++/14@ )+4P!!#p?@U5@ 4@4n4 4 @0+!!+%k@/*++@ 4+@ 4++ T/]3/++]<33/]9/]3/93/]2/+]+/+++]r2|/2/r++33/++r993/+]2/+]10q++++++q+rr#"&546323254&#"767&54632&#"327h4.0G>8=VIH$3.bN3P I 3i(#5BTI.DhT92Dy+!%T;oI5+#AIm+6C@& 4'?'_''/'?'''/''@ 4'T+]]]q55]+55R)1H,4&,4 @(-4&CDHY%%%1&H,43 46@45 43@ 4((@ 4# @#4 @ .#..% *@##@ 4/#?#O#_##5EGHH4H 4HH332/142@ )+4P222>>@p:?::@6U5:@ 4:@4: *,%0#"@4"@ 4""  @ 4 r6S4@ 4 0n@,@.?4,@&4,,@,P,,,0n@75H>><<<N 4/-;&8Bb;6%@ o 4]+55]55`6@o+!@+55]55%6PNP]55%6QN6RN@Oo ]]]556SN7 w6TMT595@"4P55 5@55/404444/444]]q55]]+556UM@@/@5P5556@66@66666P6`6666066]]]]qr55]55`6VMS;%%@!4@%P%%%% %%/(((0(((]]55]]+q556WM_8@(&&&&&'o'`''''0''''']]]q55]q556NsB@1,@%)4, ,P,,,,,,,+/++?+0+O++++]qr55]qr+55:BFb.4-@4! 4 4 @4E U lzCCFEED@FFB;?<>AAB@==>BB<@>@@>o>>oo3510:Z1@ 0@ 400%%"+DFFC@ EE>=A=@;?@ 4???@ 45100007s@ :P''' {T/3/]/<9/2/]3923+//q+3=9/<9/<3/=9/</2//2/2/+?9]2]/q]3/2/=9/9/993/=9/9/10]]+++++!!"'&54732767#"'&54767&&#"#"5476323&#"3!'77'7T ÕzcWK3BI @>GIe;6.}UWWOVVVWWW0'YFL#{Q=&)HQ?juɾv:4jPF857TJ{ "7xWWVNUVXOVVV6N6N .289@+55\6Mb@@_]55]55eZ6Ml"@%@!4%@""0"""]q55+55,JL@C4'$G5GMYj{z 4 4 4 4@! 4 ,yx,x++ %*--/I<<8@ >/>?>>>/@ I@ 4I 4!}!@::------5Eo11Ak@55555 5055 45y@ ****%p 4sT/2/+/33/9/]/+]]]q3/3/]]2///3/+]/+2/]q3/9/910]]+++++]rq# &546323>54%&&54667654'&54632&#"#"3ZZ^4Wb#!!X, g_IJW%$ PO0'/y~@<Sb7N-QL:tdSHH,PT $+]w -O,6)' 8)N3Q[@)JFIJ$N5NMj{02* 22)Գ 4(Գ 4'Գ 4&@! 4u&( 1$ 446PCC?@ E/E?EEE6@P@ 4 PPPPP 4!} -.@1.AA4@4440n7J1W4M!l g_IJV%#!PO0(- `xSHH,QS 7!\+c ",j?Wve( SR.{~Rz,7)% 8)P@- %dtTT444@4, 4, 4, 4  }@  y p  /8@ */nb#!!WibBK7J\CZivb( t0+{xOa\SHH,OV ,&7E!&-i?%@# %'$$!% !67$  4 4 4 4@@4@ 4# }@`  y##p@ T/$733#"&&'#!c:=K7J12l~dF`$.\FZ.'7D!&-i?Wvb( sU{0VA /+@ '"""W@4   !"#$%&((l%% ** s sT/2//3/9//?2/9/9910+]]]&#"# 463232$54.5432#39^lc?t|`% ##CF~H{;#F53Xd YZ;uugI'3!.%92p{'@ @4 44@4  J Z c s  #&4 г &4 '(4 @ 584 't## 'x t/2///<9///]/3/99++++]]10]++++!"'&#"#"&54632!2$54'&54633,?@LF>Ǵ^%3T}~}E3ʩ[&[VD12)L6X6v6YAx&@ )?''o''']q5+6XLJ@ @'`''(( 4(+]5]56XMd@ ,,0,`,,]55/26Zg*@8O88777777/7O77]]q5]q5/26Z6gL-C:@*)8O88;@4;@ 4;777777/7O77]]q5++5]q5+p6>I*@;0;P;o;;;;?:::@ 4:+]q5]q5p7@ )44)@$44 63F3((-   4 +**5@" 4$"& (& @ 4&s@ +*** 1{ //3/33/]399/3/+99/99+/2//9/3/9/+]239]10]++]# '&'&5%&!"676767654'&'67&#"32$p[H!i*'4E%&<#3'54-eǶikS MLCzJAMHX^)E >7%,M7J)5?tl,R! wLhV\Yp6>o>@O;;;?;;;:@4:::::: :?:O::]]qr+5]]5?5@ 4@ 4 4@40@40@4 000& *($ [c4 @76654'67cuQh*34 H>% 9&!X8<#=*P*7YP3iV>be@7Di{ ),57$&,.S1R(<8Pe%lM#:+@$%@4**e%v%*****4@ &(4  &@  @ 4 t@ 0)x $u/2//9/]33/]3/+3/9/9999//9/9/3+q10+q]]+]%67654'&'67#"&5432!2$54& i*49)/*G3XǴ[(""PNE#*6 ba,UW,aIa-3'8  OO;-,.:#:6AL-!-@).@ 4.....]+5+L6XGM@ @((O((]q5*6Y@& &o&&O''']5]q56XL@(@4 (0(_(((]+5Yv6YL-'&@)'@ 4'@4'o''']q++5+)1R,4&,4 @-4Y%%%1&((@ 4# @#4 @ .#..% *@####O##@ *4##D@ 4DDL8@0648@ 48@ 4888LLHGG4H364H 4HQ@@'4QQ4 *,%0#"@4"@ 4"" @ 4 o6S4@ 4 0n@,@.?4,@&4,,@,P,,,0n@&22NLLN88DD6N@(-4N@ 4NNN6066T/]3/]++9/2/3/9/2/]2/]]++]3/+r+2/+2/3/++3993399/3/+++2/3/]+++9/+2/+]qr92/3/9/3/+3/+3/910qrr+++567654#"#"5463267&54632"'#"7654#"#"5432327632327632#"  G*$J5:\# %/"C$y-+$+1B + #  5$ %;%C4.J"K>2t8$>7/7_ ;/7jV^R BA#%?Am3HG!,7.@ 4@064@ 4@ 4GG4364 4 @ @D4@ 4',&,,@ "@*04"@4""27177@ -*@4*@ 4*@ $$5@45@ 45@(////@(.4@ 40T/]3/]++9/2/3/9/2/q++3/++/]2/++]2/++3/+++2/3/]+++9/+10rq#"54632327632327632#"5477254772s*2B + #  :    TT8 BC$$?@j.Eik +   @ @64@ 4@ 4%@074@ 4@ 4%%!GG4!364! 4!*@ *** @4@ 4@# '%%''@(-4'@ 4'''0T/]3/]++9/2/3/9/2/++/3/]+++2/3/]+++9/+2/++]1054772#"5432327632327632" k'3D +!" 4"jV\T CB$%A@m3I>> @!4( @)4 @@ 4@ 4@;4@ 40@ 4008$@064$@ 4$@ 4$$$884GG443644 44=,@ == @"*4@ 4 l@@.?4@&4@Po@!:88:$$00":@(-4:@ 4:::0""T/]3/]++9/2/3/9/2/2/]]++2/++3/3399/3/+++2/3/]+++9/+2/++++92/+3/3/3310q+567&56632"'#"7654#"#"5432327632327632#"6;V&"#1NuR)'+1B +#  5$ AN%5-{:$1B1% =3A?DDCE@@?CCA@?EE?ECCBD?AA@D@ 4@@ >BBB;==<:)s@"@P`p n@ //p!sT/2/]/<9/9/]]]q/=9/6[L^@  333366@+]5(6\7-LLD@077773303P30333322O6_666666]5]5]qr5]5+6]LT@7 47@#$)47777`7776@4?6O6666]+5]]r++5+AI44@40** 4=4@+-4 < <@)4545kk44545-$@ 4$ ;;;-@ 4EFBECHHGIDDCGGE@CIIC 4@?oIGGFHCEEDHD 4DBFFF1s@"@P`p n@ 77  p&&&)s T/2/]/<9/9/]]]q/]3+=9/<9/</]3+=9/<9/</3/2/=9/9/99+/]//+9q]/]3/2/=9/9/9910]+++]q++'77#"'&'&#"# 5476324327654&''&5476323'77~lnndmnnD(*/?A?DDCE@@?CCA@?EE?ECCBD?AA@D@ 4@@ >BBB-s@"@P`pn@ 33p"""%sT/2/]/<9/9/]]]q/=9/@)5@555 55?11_44 404p44400]5]]5]5]]]5h6_L(E@3""""_"""@""" ""!@4!5!0!_!!!]q++5]]]]qr5XO6OLY@GG GGGJJ@+]]5gx6_M 6*@"O"""" "@""0&&&]55]qr556d$ @6O66555@ 45+q]5]5*2@))% +,T v+@ 4!"+-$1"@ !!!11-@ @4_@!-+ /$$'v@ //!""!T/@+"$Gg,0(/ /D$S$$4$г4ж4$;- ))--@   3$ 33! Z$&791m@ 55&=u&&  =s! T/-JF'=B'.$bb5Vq\~]?V*JI%):0rnt"N4=f9^@&C$i @@T!-D{RgW_ll?a)99p_g6h-,,@ @4  "  Z@$ ,(&*""$ *s 4$@/ _    /$:;xj.S!6h@ 0000]q5 K@(: @ /^+VW,eU\J9bn04V{wm)+2KV88LN9tm6mf ) ))]5tm%@B"i JJJ ""@ I @  @4 @ "/$.863!&&3:s`666>!u@ ?3o33/333>u@ ,O@@@Dv//]2/]33/7&5467᧬4#"67654654#"fybh0(I] !ZWOa'!<&8&r=U&#g; lA%a6;UWkU5ZEEK g9UdA8 M{"LS\w#K07F"V+W 2+ iIsY'%wv8JIf6^7LV4f@99988@88@748881@1`1p111 1@1P110@4 00O0_00000]q+5]]q5]+qr5]56^LV>@01@1`1p1111 1@1P110@4 00O0_00000]q+5]]q56^7LVR@<?1O115@5`5p5555 5@5P554@4 44O4_4444400]5]q+5]]q5]5`@6_LH@ 0!_!!!!]56fMb<@*B@*24BBOBBBBAAAA0APA`AA]]qr55]qr+55+6@&?&&(.@+55]]55;+6*@ ?  `p 0]]55]]55] 0/]2/<//1047632#"'&&]<' n^^n %@sR#   "J-"@  //]2/<//10]#"&547654'&54632<' n^^n %@s"  HH  "1@"# $ ,#$,' & 6 F (@ 4.!0@ 4@4  @4 4 Z@ $#!,.&((*@&&  /;:G8';$T\_@4KJKL:LK=KA)L9=:JJ)=)J = J==/0 4 @@ 4AU,([)0@ VV/VVVVV[))#39#ZE@7RLA@ 4@43LJGAC=;O@$&4Ou@G@GPGGGGC@$&4Cu@ ;;50VU(3v@ 22`222X{,/3/]922/+2/]]+33323/]3/]++r9/2/3/9////?/9/2/]q9923/+3/+2/3/]9/810]q]]]]]#"5432327632327632#"#".'$&5466%&'7325467673254&67#"&'32(4D )#  6"B]g' ZB>GV T0ww R% dh!/u IYDN)M7ZG7GI  ;x6 "@@!4]5]q+56 0@"&&&&&&(((@(((((]]q5]]q5;C6@   ]]5C6@ _]]5f6A,@&@4&/&O&&&&& &0&p&&]]5]q+5f6A,@-@4-/-O----- -0-p--]]5]q+56O0p 4@ 5/? @+]5++]56/%#@ 4###_]]5]+5 /65@,@,, ,0,,]]55p66k(5l6Rl)@/ ]]5]5i6SB&(@  /  p]]5]]q5;r B`@  @4 |OT/]+99/9/?]/10%457(h;X?Z @ @ 4  w/>>/>>>>?>>@4>=O======]]q5+]qr5g6g6( $@4  E$Ze u   0&@  "{0T/]3//9/39/2/]/2/2/]9/]10]]+]#"'&54767&'&#"#"5476323"32$[꒜@4#= g[aKe,ܽⓈ{ NSGIe;6-0'YFL#{Q=&)HQ?juɾv:3jOF857TJ{ "7xq@ IIFl~@MO  Z@   /L{W*((@xkky 6 7C6o@ +)@,,]5+56W@ >>=;'0@+5]5626@ O,,,,]5-c@%9u  m@ @ 4n/2/+q]3/2//2//810q]r7!"&5463232654Zpv 9eIa=X"Y$ !61QRL@    vm/`C-?? }j~2{6M7V@ @>>;;]55]556M7V@ @LLCC]55]55o6MK@3?33222]55]556M'J@::?::@==q55]55q(3@&%I..5%E%U% '!@ ////*)'Z)p@#@ 4s,t# 4/2}/+/9/]32/+39/]/?<2292/]9/3/10]]%#"&&543243254'6732#"7!254&#"=av*1 n_Y7A 8;\GabH<:!UA Gu}pzZwA{vW*S"~p-8@Ii 3 33@ 4##*@ 4444 &(/. 1,.p@(((,&!#@ 4## s&&&1t@0,@,P,p,,,,/,,,, 4/,@$O$$@###0#P### ###]]q5]q5)'0@)9$$%$$)G%v!@O,,,(#@  4@ @ 4( v@ //o///(&t s/2//222/]q9/+3+=9/<9/<//2/]3//]]3/2/=9/9/9910]rq]]'77"&&5432# &543232654''&&#"lnndmnnpmJvKR# /&&6momdlmo< /(i-9aa9z:?96+4@-   uggt@@ 4@4+'//+ ,"!! Z@ 4 4@ @ 42,o$@ 2222!,w**o0  + /<3/]3/332/]q/2/9/+3+=9/9/</?<<<2/9//++3/2/=9/9/9910]]r]]7''7## 46323 7654'# 54323#&&#"3nnncknkd.R]O 2kf *~LM]R6-(9=mmndjojeïM^nV}ip]֑pE86VL'$:@*%%@%%%%%%$@4$@ 4$$$$$]]q++5]]]5R6WL97@"""`""""# 4#@ 4###]++5]qr5#A@:E::@" 4  & $>6 4>"""$$&@33/@ 5/5?555&@@ 11$$,<o((8kP,,@ 4,"! @ 4r nT/2//2/+3/9/9999/+]3/3/2//2///]2/]q3/9/10]]+q]7! &5463233 54&67654'&54632&#"#"BR!GE  f`JIW%#!OP/(.!y==m/mvJtl3j a^;",6(% 8)N8+I@2BEBB%5%F4FZ$]%mk#m%n&;;7@ =/=?===.H  *99,,4Do00@k@#@44444&%#(#**(_(((#r  oT/2//<3/2/q3/9/9/9999/]]q3/3/2//2///2/2/]q3/10q]]]]]q33"&'# &54632!2>54&'6767654'&54632&#"#"!XG!LS2 #qd$)f g_IJW%$"PP.)/-5 7R'A>0$O6O{mU DD-DI8<>=Bq/r@vvI+,! @%'!!##@ 4sp +,T/^?BW,eNcx@fu @ O  Os@  />7!RNwW?6i՞ļKKPi@D $ 4 e Z@  @v/{#6irMvNnA;z@,   Tet4@  @ 4@ 4 4w/2/+/=9/Օ,&Sqamnm>WGFmtZ&@'br!" ""  !$% @ !$%4@ 4 4w /2/+/=9/U*;vBa;pXb;TK]{7G"_"JéXuhS2#"w*wWtXX"*3-J$#@4$$$B#B$E%#$%@ 4$, 4, 41I(85 4@ ( (((@//?///+ #"ZZ@  +1 - t##-n@&0&`&&& &&&&t1P111-p@0 `  0  "T/6 Zt@ 4@ 4444]+56 E"@O11111?111/33]5]]56@)o)))))))]q56F@o&&o&&&&&]q56))** 4*+]5+6o&@ )/&O&&@4&+]5+ (@AL""9;#V""#! O_#@ ! ~ m''@ 4''## /33/3/+]3/332/9/9//3/]3/3398310rq]]q]]#!767''676546732654:0.&iR`!,uI9/&m>pO+Gtx+icKXL9 "G:߈+ %@KHJ  c t B   f HIH Y    %@@   =Ms !!%/<3/q9/2/3/3//3/3/39910]]]]]q]]]q!".#"'$67&'&'&547654'73ͮF1GS  .Q)?:N' '4W4v N+,;(.L!Rog)W2$/=9/</=9/<10'7moonnmI.Y.a6@4o4444444]q55Lj6@?o???????]q555',z.Sv84Q. O{ .Jg:. ]5. /]5. /##]55]]6#@>o>>>>>>>T]q555 6,@)o)))))))EEEE]55]q5556U@<[o[[[[[[[_````O``66666@46@46++]qr55]]555]q5550I.4^.K.uH.0J.2G.m *Pe;6))* 4*+55+6))* 4*+555+@% P%uT6F@o11o11111]q55k6F*@o<<o<<<<<AAA]555]q555Eq% /  ]5@c%+H%&F %c^1% ]5 %%6F@o;;o;;;;;]q555Aq6F@o&&o&&&&&]q555&b6F=@(oXXoXXXXX]]O]_]]5@45+55]]555]q555'I% /  ]55+U% K% lH%'J%) G%%@@P 0]]5(;6?$&@)/&O&P&&&@4&+]55+6=)&@)/&O&P&&&&@4&+]555+5Ej; ,]@ ,4 4 @4 4 4   @@,4@ 04  @@/14@)+4_   4 @ 4   @ 4 &!&@4@ 4@  k@5/   @ 4 @ 4 O   %!!%&&$#",*)('+@4+|O%%T/]+99/9/33/]q3/++]<33/]9/]3/93/++//3/+]3/++r3/]r++3|/3993/++]10+++r++"54772767&54632&#"3274'57u .bN3P I 3i( Of i +"$T:pI5+#AIOwZt;J *6@*,4 4%&'*@4 4 4   @ @*04@4@ O   @")4 @ 04 1)* @"@/14"@)+4_"""")**4*@ 4**@ 40+0@4@ 4@ @4@ 4 @4 * *$k@1/)**@ 4*@ 4** /++/00.-,643215@45|O//T/]+99/9/3/]3/++]<33/]9/]3/93/+++3/++//3/+]3/++r3/]r++3|/3993/++rq]2/++]10+++r++"54772"54772767&54632&#"3274'57  .bN3P I 3i( Ofii+"$T:pI5+#AIOwZn <~KO;] +7@.&'+#5 4!4+,4 4@4 4 4 @@&,4@ 4p@@*4@ 4(*+!!@#@/14#@)+4_####*++4+@ 4++@ 41,1n@4@*-4 4 @0+!!+%k@1/*++@ 4+@ 4++ 0,,011/.-754326@46|O00T/]+99/9/3/]3/++]<33/]9/]3/93/]2/+]q++//3/+]3/++r3/]r++3|/3993/++q2/+]q+10+++++q++r#"&546323254&#"767&54632&#"3274'57yh4+3F?7>VIH$3.bN3P I 3i( OfBTD3CiT92El+"$T:pI5+#AIOwZ;6B @!!4126( 6,4! 4$@4# 4!@ 4@)4 @@24?@ 4(#356! ,,(@.@/14.@)+4_.... 56646@) 466  @ 4 <7< @"*4@ 4 l@@.?4@&4@Po@%#6,,****60k@1/%%%! 566@ 46@ 466  ;77;<<:98B@?>=A@4A|O;;T/]+99/9/3/]3/++]<33/]9/]3/93/2/]]++2/++3/3399//3/+]3/++r3/]r++3|/3993/+q+92/+3/3/3310+++++qr+567&54632"'&'#"7654#"767&54632&#"3274'577>X' 1$,wO*&+.bN3P I 3i( Of @O'1-};#3@3 >2=+"$T:pI5+#AIOwZ;(0GSF%,4&,4 @,-4Y%%&0&GBCGG,42 45@44 42@ 4''@ 4# @$4 @ -#--% )@#@264#@*4##@ 4##94DFG21==9@?@/14?@)+4_????1FGG4G@8 4GG11@ 411MHM )+%/#"@4"@ 4""  @ 4 r6S4@ 4 0n@+@.?4+@&4++@+P+++/n@64G==;;;;GAk@1/66621FGG@ 4G@ 4GG 111LHHLMMKJISQPONR@4R|OLLT/]+99/9/3/]3/++]<33/]9/]3/93/2/]]++]3/+r+2/+r2/3/++3993399//3/+]3/++r3/]r++3|/3993/+q++92/3/9/3/+3/+3/910+++++r]qrr+++r567654#"#"5463267&54632"'#"7654#"767&54632&#"3274'57  E+%J5:\# %/"Ck_+$*.bN3P I 3i( Of %;%B4-K"K>2t8$>7/ ;/7+"$T:pI5+#AIOwZKI`KHUJuVG@   ##r55]555D )+]pO@ 40p]+5]qR'.@ 4@ 4 ]]+]+556J4 4++556J4 4++555i|v}4OO4@7<4@ 4/3+=9/<9/</3/2/=9/9/9910r+++'77lnndmnnmomdlmoGB v}4@ 7<4@@d4@4    @    /3=9/<9/<3/=9/</3/2/=9/9/993/++=9/9/10r++'7'77nnnlnndmnnnnmmomdlmo} @@ @4   @ /3=9/<9/<3/=9/</]=9/9/2/+3/=9/9/9910]'77'7lnndmnnnnnnomckmodnnmX/7@c@012@0@1@2*@ 4, 4@47) 8 1Գ41Գ40@4 4>61 4$$%@ 5 555@/ :t00:n3@ 433`3p3333't>P>>>:p@ 0'%%$@ 4$$"u'T/H 1KbDL8N9%@0,<KwYX A Z@ @ 4su/3/+9/3/?<S$)+Q!!@,4&@ 4  @   O O _  @ 4 A Z q@@ 4s#T/<222/+]?<Z^:*C0Aa'{N@(53)}?х@7 @,    A Z@  uw @ 4 /lF{qq{k(>S%)+QL%@ 4 4@4@ 4 4@0#(4P@ 4   @4!!@$@4@4$}@ $$$ |T/3/]3/]9/]393/+3/+3//?2/]9/]3/+9/]3/+r9+++9++810+&#"&#"#&'&54%&'&'632>@7-\\b96 8>!869L 4y=TK^GdSD~(Y43@@"$4@4@ 4.p@P`&"(4 r@?1111/111,4,s_)x@` p  $u/2/]/]3/]3/]32+3/]]9+//]rq?9/+++9/+++999/10]++++%672665#"&5432#"&54632!2$54&&#"32Qi)\A=lzWZd=ȳ[(""O\*C0@`&H+7)I0-%pOS+BɨK ST;R,.:Yx92Ur,@U, +-4(),649,&VFI,&&&%&$Jc}y9)""()Z$s@)o@ 0 () //<9/]2/9/339/r?3/2/?3/9/2210]]]]]q]]]+##"''&543232$656&'732763233#"&7dl]o;5"FFBy~<_?g!8beoKt8.b``%%{di/@",&*4Hv---)h k W /Z!! #%) )+u@  4# @ 4 !!((4t /v//<9/+9/2/3/+999/+?3//9/2292/?10]q]]+!#"&'##"&543232654'7327632331tuk3}{'(8`|@J' @j76U.0󱙹Bfjw}JK%%+S3ƹ @94$w1/40 4 'F'V T'f d''  ''' 4'@ 4' "A ."%s@p n@ ++`psT/2/]/<9/9/]]q////99++]qr10++]]+%#"&'&#"# 4623$54''&&54323̓>@0-1=^Q.s}`% ##|(Y:3~,6,=.{{3UP}9"$A,3Xd YZ;nt]L@ + dR"-@(),,u,)+@ ++@  !P!!!'  +#l@   T/7632#"'.#"-`3TmkcL6C^@miY)8P $@[mPsLy'JGM{gt-N0A?er`l/,W<,l#X' 1$,wO*&!.bN3P I 3i( O8ni7$R .E @O'1-};#3@3 >2=+"$T:pI5+#AI{iEM^k[ڈb5Vb(0G^H@ I LL@K,4&,4 @+-4BCGY%%%0&G,42 4K@ 45@44 42@ 4''@ 4# @$4 @ -#--% )@#@*4#@ 4##94DFG21==9@?@/14?@)+4_????1FGG4G@ 4GG11@ 411T]^IHZ@(ST )+%/#"@4"@ 4""  @ 4 r6S4@ 4 0n@+@.?4+@&4++@+P+++/n@64G==;;;;GAk@!/66621FGG@ 4G@ 4GG 111SMTTVw@ MMMH^T/2t8$>7/ ;/7+"$T:pI5+#AI{iEM^k[ڈb5Vbj6/6/8D@$k>k@{>{@e>'M@(M M@M <,@1B,7-M@4,M 57 M@ M 74M@-5M ,*M@'M (9,*@?,M@ M M@M E2+/10]]#"&547677&547'&546326327632#"''#"4&#"326t tJHrr[zx[rrHIss`sswlkkkPs  sass`rrIIr  r_sw^ssHXllks #.48DHLRY`hb@ [[ ``cBB(-W]]]]]'V(((/ GG G23/3gWgg<^'' ''R F"OM7K R6JMa@9P99999999'W^O'o'''''$---4--SgSS,S+ZZI0ZZ$!6 5## ! #je??????IJN/MMN1EQ2FN/]/]q]r^]q^]q^]3^]q^]q]]/<<<<]^]r^]/<<<<^]]9/rr910rr#5#53#53#53#"'73253%#53#5353%##32##53#53#"&54632#53#53#5334##324##32%4#"32<Y<<3 ,9F<5Gk<b\\aa\\b<<<<>b6=[gCK_xwwx<<</S#<<}p7 <}hsshiss<<4 @ =>4=>4 =>4?5@5!@'IK4%%%% % Yi@>5#%(0(((-%@ 4w%C,]+9/q33+]q??<3/]+++++++++++++++++++10++++++++++]]q]q4'&#"3276#"'&763 67654632w|}|w>ЖW +FԜ㜔⠬ #C2%@ %@ 4 4 4@ 4 4 44@4'w""44 @4 4 4 $4 @' $4( $4( $4 ! !$$o$$$! $$@<5$ !@ 4!0`@!o&]]q3/+33+q?<3/]q?++++10+++++]]q++++++++4&#"3264632#"54326ᠠᠠT+f"Š$Iߝ0$@sBcx****BÛOc**7%@3#-[~0@  '('&$4#$4'@4$4 ++' % "///)"-  " %!  F/ (-)@ +++N( 4(2"  / 41+]<+<]<<3/???<4 @ 4 4 4 @  0  /]q3/?+10+++#"''&5432++/ ++tWH8@ 4@;<4/ 4 /3/?3/+qr+10+'&5477%,) $H o   ot^H8@ 4@;<4/ 4 /3/?3/+qr+10+'&5477%3) $H o   oC5 4@ 4  4 4 /3/?+10+++32#"54?++C++ g 4۲@ 4۲۳ FL44/+q+3/2/?+M9/10+274#"#"5476632#"55rLS9D  m-CMvz*;& $B3TGCi@ '4#@4#۲@4@ @ @4 /3/+M2/+M?2/+2/9/10+254#"#"547632#"5'kEK3=  )nj#F8 -%Ca@ 4۵۲۳ FL44/+q+3/2/?2/]2/9/10+254#"#"5476632#"57dLS9D  m-CMv3;& $B3]((LCi@ '4#@4#۲@4@ @ @4 /3/+M2/+M?2/+2/9/10+254#"#"547632#"5'_EK3=  )nj#F8 -+_-_ 4@$ 4 4 ,@@<5_ ,@ //3/]?}qr+M9/9/10+++2#"'&#"#"5476323276* &9'(@m: (=)3M;8jF %N',O+8(';I0D $uC_ 4@$ 4 4 ,@@<5_ ,@ //3/]?}qr+M9/9/10+++2#"'&#"#"5476323276x* '8('Al;)<)3L<7kF $O',O+8(';I0D uCg 4@+ 4 4 ,@@<5_ ,P@ //3/]?]}qr+M9/9/10+++2#"'&#"#"5476323276l* '8'(Al;)<)3L<7kF %N',O+8(';I0D ^|gY `7=4C5PS4@ 4@ /3/?8+M+++q10232767632#"'&5418RP8,'JMxxNIg8)++)8D\hT@ #4 #444@ 4_ @ 4 @  /?8+}r9+10++++#"''#"547P'  %h|  ff  }J  1//10#"&54632J<*+<<+*<*<<*+<<0<N5494549@ 44 =7E@ 4EE 7:7(7 @ 4 +47@' 4+7/--$$*7JJ1*70  PAA776/3/3/]<<<<3///9/9/?3/+9/+<<3/9/3/+9910++++32##32##5#"'&5466325#"'&5476335#"54334&#"326"'&54763!2#wM HN((fX*UQh33N((5!@B5!@VW4o  c.d<<]+++++++]qr]+??++++10761h(k@ 4 @ 4-@ 46@ 4!@ E$@ 4E 5000/0@0000040 40&50 50@50.50@<50@>50@B50@VW4 r=s<<++++++++++]qrr++]??++++10]13@ 4  4 4@ @ 4 /3//++10++32#"54?++1++ 13@ 4  4 4@ @ 4 /3//++10++32#"54?++1++ 1; @ 4 4 4@ @ 4  0  /]q3//++10++#"''&5432++ ++1; @ 4 4 4@ @ 4  0  /]q3//++10++#"''&5432++ ++g 4۲@ 4۲۳ FL44/+q+3/2/?+M9/10+274#"#"5476632#"55nLS9D  m-CMv]*;& $B3TGg 4۲@ 4۲۳ FL44/+q+3/2/?+M9/10+274#"#"5476632#"55nLS9D  m-CMv]*;& $B3TG+_-_ 4@$ 4 4 ,@@<5_ ,@ //3/]?}qr+M9/9/10+++2#"'&#"#"5476323276* &9'(@m: (=)3M;8jF %N',O+8(';I0D +_-_ 4@$ 4 4 ,@@<5_ ,@ //3/]?}qr+M9/9/10+++2#"'&#"#"5476323276* &9'(@m: (=)3M;8jF %N',O+8(';I0D +_-_ 4@$ 4 4 ,@@<5_ ,@ //3/]?}qr+M9/9/10+++2#"'&#"#"5476323276* &9'(@m: (=)3M;8jF %N',O+8(';I0D (\ 4@. 4 4 , @ @<5 _  ,//3/]|/}qr+M9/9/10+++2#"'&#"#"&5476323276| (7&)@m: (=3N:> &M-O+8(;`D (\ 4@. 4 4 , @ @<5 _  ,//3/]|/}qr+M9/9/10+++2#"'&#"#"&5476323276| (7&)@m: (=3N:> &M-O+8(;`D (\ 4@. 4 4 , @ @<5 _  ,//3/]|/}qr+M9/9/10+++2#"'&#"#"&5476323276| (7&)@m: (=3N:> &M-O+8(;`D |||||C>4 @ 4 4 4 @  0  /]q3/?+10+++#"''&5432++/ ++C5 4@ 4  4 4 /3/?+10+++32#"54?++C++ (\ 4@. 4 4 , @ @<5 _  ,//3/]|/}qr+M9/9/10+++2#"'&#"#"&5476323276| (7&)@m: (=3N:> &M-O+8(;`D ||||||||||BuC_ 4@$ 4 4 ,@@<5_ ,@ //3/]?}qr+M9/9/10+++2#"'&#"#"5476323276* '8('Al;)<)3L<7kF $O',O+8(';I0D +_-_ 4@$ 4 4 ,@@<5_ ,@ //3/]?}qr+M9/9/10+++2#"'&#"#"5476323276* &9'(@m: (=)3M;8jF %N',O+8(';I0D BuC_ 4@$ 4 4 ,@@<5_ ,@ //3/]?}qr+M9/9/10+++2#"'&#"#"5476323276* '8('Al;)<)3L<7kF $O',O+8(';I0D +_-_ 4@$ 4 4 ,@@<5_ ,@ //3/]?}qr+M9/9/10+++2#"'&#"#"5476323276* &9'(@m: (=)3M;8jF %N',O+8(';I0D &$|5/*@,+5V&D|H =7!@+5&$s&@H HPH0HPHpHHHHHHHC-,@+]q5V&D@ P0P`PPK@+]5H&$&{pHIII4I/8H+<@4<<0@H+NpNNNNH+K),++]5+]qr+5C&$&zx@@YIE=@EEEE4E4E@ 4E=-,@,++++]5+5VC&D& y.@cS>>@NpNNNNH+K),++]5+5g&$&z|F@MG*@EEEE4E4E@ 4E=-,@A),+++++]5+5V&D& |H.@WQ!@NpNNNNH+K),++]5+5X/&(|<<δ<6 @+]5/&H|'!@+5X/&(s@ OOJ#@+q5/&H :5@+5X/&( 0J@JPJJ9@?)++]5/&H@ 5$@*)++5X/H&(&{p&PPP4P68@ H+C9#@+5++]5/C&H&r.@_>o>>>>>1HH++h+.),++5+]q5X/H&(&{m'J@ 4JJJ6@ H+C9#@+5+]+5/C&H&oP2@P8`8p8888&@ H++h+.),++5+]q5X/C&(&{t@]X66@C9#@+5+5/C&H&u !@MI!!@+h+.),++5+5X/C&(&{x@XHC9@C9#@+5+5/C&H&y !@F61%@+h+.),++5+5X/h&(&{|(LL@LF @C9#@A)++5+]5/&H&|$@:4@+h+.),++5+5&,s 94@+5& 2-@+5&,| & @+5&L| #@+5&2|  @+5<&R| @+5&2s 3. @+5<&R 1, @+5H&2&{pt&444448@ H+' @+5++]5<C&R&r.@_5o55555(HH+" h'%),+++]q5H&2&{m'.@ 4...@ H+' @+5+]+5<C&R&oP2@P/`/p////@ H+" h'%),+++]q5C&2&{t@A<@' @+5+5<C&R&u %@DD@@" h'%),+++q5C&2&{x@<,'@' @+5+5<C&R&y!@=-(@" h'%),+++5h&2&{|@0*@' @%)++5+5<&R&|!@1+@" h'%),+++5h<&i, 2H+/)++51&j@ ,5 @()++5h<&iC @ 80881@3)++]51&jC@ ++ H+,)++]5h&is E@@+5&j ?: @+5h&i @ @/@5)++5&j@ :) @/)++5h&i|@ `2p22,@+q5&j| ,&@+5S|&8| 71@+5[Yb&X| .(@+5S|&8s@ JJJE"@+]5[Y&X#@AAA`ApAAAAA<@+]q5S<&k @ 9B@5)++5[1&l@ 7@!(@4)++5S<&kC *@? ?? ?`?p??LH+:)++]qq5[1&lC@ 5%H+8)++5S&ks@ LLLG@+]5[&l@J`JpJJJJJE!(@+]q5S&k @ G6@<)++5[&l@ E4!(@:)++5S2&k| 93@+5[~&l| 71!(@+5ch&<| 93@+5~b&\| 99@+5ch&<s LG@+5~&\(LG@+5ch&< @ G6@<)++5~&\<@ G6@<)++56$!@@3O333/33/)+/]]q5V6D"@p7707`777@7)++]]56,@  @ )++56h+)++562@  @)++5<6R@  @)++5S|68@ 11@1)++5[Y6X>@,0(@(( (0(((((`(p(((((( @()++]]]qqr5S|B68 MM/]555[Y6X6O@4@D`DoDDDD_.o.../...AAA?A`AA+)+/]qr5/]]q55/]]q5S|C68 R/555[Y,6X6Qo@QFF/FFF_.o.../...C CCCCCCCCC?COCCC/C?CCC/CC+)+/]]]]]q5/]]q55/]qr5S|C68 @ SOSS/]555[Y6X6j@KD@D`DpDD/DOD_DDD_.o.../...@O@@@@/@?@O@/@@@@+)+/]]]]q5/]]q55/]]qr5S|C68 [Y,6X6Cny@ZPD@DDDDD/DDD_.o.../...G GGGGGGGGG?GOGGG/G?GGG/GG+)+/]]]]]q5/]]q55/]qqr5/B !   @P4@)24  #[ :;Kk{;[/_/?O  @0@G0@`#@*?P>@Pp 0/]qr^]^]^]^]c8888NK*! ****!!**@b'Y@2  )$  ! !!&! ??99//]/]]9/10#"5!32##32#!"5433#"5433#"543!@+*988888ȵ8888p88N+*****G+**+o8@=??+-++--+0GG/GGD055 55')'))')*$' ikiikihkVSSgegeSgegTOb]]/]]kokLL LLO /b&YIi)'CPV=T?P:_33D*hP&g+e-0 ! OD&I0&:I'&!&k&/??9/99999/999/]]]]9+}99+}99+}]]99+}10#"55#"&'&'#32##"5433###"543367&'&'&##"554763233#"54332##3276767632#"5532),$)vcvAGGFF@tcv(BFF?xRg-^5 17,) %q=E< <3@FFGGA;8""D> .,..,4..,1C1 66 66( (*(**+%(F/ hjhhjghjUSS fdffd;dfdNa \\/\\j jNK  4^^O.d,fa&U>S@OXHg+*h(BO& " NC&H1&;H(&"&j& /??9/99999999//]]99]+}99+}]99+}]99]+}10#"55#"&''&'#32##"5433###"5433767&'&'&##"55476323#"54332##3276767632#"55"32*+6'ncn:GGGG;ncn  '9FF9oKb)Q1+8*+ %d:(>kD;GGGG:26 ?C9\,),8,.Q)]QnG-DA "Ư****S**Ɔ?!L.?9@F( / g*++*D bh2,F@9?.J4-wG@X ACAAC@AC-,,?=??=?=(:5CCI($?=77):&,-)0"AC@)& '&"&C&/??9/9999999/99/]99+}99+}10#"5'#"&'&'&##32#!"5433#"543!2##32767632#"55"32),y'DfFFFFffFF!FFf>V3$An!Nv2 +)T1Kj6K4@-DA bI*****++*!O?/s<5l&[!4[-wO@d755IGIIGIG3D?MKMKKMJKM3 /_MMQ"'+IGAA,D!57,:%KMJ11,!  *!%!M!/?99//999/99999/99/]]9/99+}99+}10%##"&'&'#"5&##32#!"5433#"543!2##32754326767632#"55"32Fy'SS**%2@mGGFFkkFF-GGm@3$**,EV#G|4 *+Y9F/|k|F** #&,88  ********a 999t#E 0oEAh@y2xbQ@m866 IGIIGWGFG'G7GIG4D ?O  OMOOMJMO4 0OS#(, IGAA-D!68-;&MOJ22 -!   + !&!O! ??99//999/99999/99/]9/99+}99]]]+}10%##"'&''&'#"55&##32#!"5433#"543!2##32754326767632#"55"32Fv3NS**%+>fFFFFffFF!FFf>-#**"(n!Nv2 +)T1Kj6K4@vF** s88*****++*99S1?/s<5l&[!4[k8p@A04 +'  :"&0(3&- '& %& & 4&/??9//]]]]10#"55!"5433!32#!"5433#"54332##!#"54332##32)-88pq8888_49988q-p88994n-C@**********L****-k-b8f@8 04 +' :"& 0(3!- '! %! 4  /??9//]]]10#"55!"5433!32#!"5433#"54332##!#"54332##32*,88__8888_A8888A!@9988An-DA**I*****++**++*G-bh&o@:" &$&& ??9/93/3͇+}ć+}10##32#!"5433#"54332###"54332h9088E8828888Q77R889h*F****0****(**~b)n@=%" !"! " ! "  0p"!' !! ! /?3?/]3͇+}ć+}10#32#!"5433#"5476332###"54332 -|9988x8 88qWRq8897 ****. * +*O+*bh4@C(+0-,,,++,,   # -&2& &,+ && &??99//3/͇+}ć+}10##!2#!32#!"5433!"543!5#"54332###"54332h90))88E88((28888Q77R889h*!****]!0****(**~b5@P1.),-.-,. -,, ".  0p.!3',!' !-/ !0@/]?]3?/]3͇+}ć+}10#!2#!32#!"54335!"543!#"5476332###"54332 -|))9988((y8 88qWRq8897 **** * +*O+*P9@X+(#&  3 4 35&'(5&( 95 ((3 3 03&  5&5&5 4'o  3(&-!&&! &5 &/??/]333݇+}͇+}10#"55!"543332#!"54763#"54332###"54332##32)-88888 38899^DB^9988 .-C@**B*******]****-e-hb:@,,,)))$$$'''   p   5 6 57'()7') '  7'77') 5 )) : 7/7/777777 1)/5?5555 'p0  6( 5)!."(6  '!" !7 ! /??9/3332]q3]2]q2+}ć+}]]]]]]]]10#"55#"543332#!"54763"'&54332###"54332#2h*,99888'1 988dd998 $-DA**9*** qH *+*+*+ -)aB@'''''''':J )0 ,$73 @<@?@O@_@@@D!!!$..)?4&933333U363F331111v1e1V151E1'1111+)&  $&@&??99//3]3322]qqqqqqq2]]]]qqq9//]]]9/]10qq]]]qqq%#!"5433#"55#"'&5#"543!2##32743267#"543!2##32aF_FFJR\**C:ZFF FFr$.z**ubFFFF\\F****6<88\Ob****9J99*o****F_b?@X$$9= . (!440A! <1 6++0.(&  ! =  ??99//]3332229//]]]]9/]10]%#!"5433#"55# 5#"543!2##327543267#"543!2##32_FqGGj}**"UFFGGk/,h!**mzYGGFFWWF****:JV88I*++*f(&99N*++*Gk2X@1/4($0 &((++'&"&0&??9/3]2/]]]10%#!"54334'&#"32#!"5433#"543!2##763232FFFr#-|bFFFF\\FFFFJC:ZF****X8IS********-6g\Olb1Z@5. 3($$$ 0 !****'!"!/! ??9/]/]]]10%#!"543354'&#"32#!"5433#"543!2##63232FGGk/+iYGGFFWWFFGGϏBFUF+++*g(%*++*****t;?Bp#,@b(((!E!U!  %%O_o.%%&%-&%*%*% ???99//9q]]]q10]]]]]]]]]#"55!54'&'&#"#"554326325!32pDG`[Ztl~'***ӒTzĹ IБnv{-*=Fk3988;՟11/!m@J   M ] m ; !#!o! !! ??99///]q]q210]]]]]]]]#"7!&&#"#"54767632!326/Xݐ(>wi&Vmj}ӧq*?("WUhh%@~$$:$($  4 ' w&6x9(9  6 69o  &oOo0%"%"% ??9//]]qr2r210]]]]]]]]]]]]]]]]]]]]]]]]]#"'&547632&'&#"!3276h?D|w攆yrADXcw}jTzoFSPƳVQfTސ< @qK[k9dEU7 !`p!oo !! ! ??9//]]q2]]]qqq210]]]]]]]]]]]]#"5432&&#"!326<W ݕpc _q obT~_p#T&  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     .nullnonmarkingreturnmu1pi1OhmEurodmacron overscoremiddotAbreveabreveAogonekaogonekDcarondcaronDslashEogonekeogonekEcaronecaronLacutelacuteLcaronlcaronLdotldotNacutenacuteNcaronncaron Odblacute odblacuteRacuteracuteRcaronrcaronSacutesacuteTcedillatcedillaTcarontcaronUringuring Udblacute udblacuteZacutezacuteZdotzdotGammaThetaPhialphadeltaepsilonsigmatauphi underscoredbl exclamdbl nsuperiorpeseta arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbse orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtSF100000SF110000SF010000SF030000SF020000SF040000SF080000SF090000SF060000SF070000SF050000SF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockdnblockblocklfblockrtblockltshadeshadedkshade filledbox filledrecttriaguptriagrttriagdntriaglfcircle invbullet invcircle smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedblIJij napostropheminutesecond afii61248 afii61289H22073H18543H18551H18533 openbulletAmacronamacron Ccircumflex ccircumflexCdotcdotEmacronemacronEbreveebreveEdotedot Gcircumflex gcircumflexGdotgdotGcedillagcedilla Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek Jcircumflex jcircumflexKcedillakcedilla kgreenlandicLcedillalcedillaNcedillancedillaEngengOmacronomacronObreveobreveRcedillarcedilla Scircumflex scircumflexTbartbarUtildeutildeUmacronumacronUbreveubreveUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexlongs Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute anoteleiaWgravewgraveWacutewacute Wdieresis wdieresisYgraveygrave quotereversed radicalex afii08941 estimated oneeighth threeeighths fiveeighths seveneighths commaaccentundercommaaccenttonos dieresistonos Alphatonos EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaDeltaEpsilonZetaEtaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosbetagammazetaetathetaiotakappalambdanuxiomicronrhosigma1upsilonchipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098 afii00208 afii61352sheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuqalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintav doublevavvavyod doubleyodgeresh gershayim newsheqelsign vavshindot finalkafshevafinalkafqamats lamedholamlamedholamdageshaltayin shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindageshtavdagesvavholambetrafekafrafeperafe aleflamedzerowidthnonjoinerzerowidthjoinerlefttorightmarkrighttoleftmark afii57388 afii57403 afii57407 afii57409 afii57440 afii57451 afii57452 afii57453 afii57454 afii57455 afii57456 afii57457 afii57458 afii57392 afii57393 afii57394 afii57395 afii57396 afii57397 afii57398 afii57399 afii57400 afii57401 afii57381 afii57461 afii63167 afii57459 afii57543 afii57534 afii57494 afii62843 afii62844 afii62845 afii64240 afii64241 afii63954 afii57382 afii64242 afii62881 afii57504 afii57369 afii57370 afii57371 afii57372 afii57373 afii57374 afii57375 afii57391 afii57471 afii57460 afii52258 afii57506 afii62958 afii62956 afii52957 afii57505 afii62889 afii62887 afii62888 afii57507 afii62961 afii62959 afii62960 afii57508 afii62962 afii57567 afii62964 afii52305 afii52306 afii57509 afii62967 afii62965 afii62966 afii57555 afii52364 afii63753 afii63754 afii63759 afii63763 afii63795 afii62891 afii63808 afii62938 afii63810 afii62942 afii62947 afii63813 afii63823 afii63824 afii63833 afii63844 afii62882 afii62883 afii62884 afii62885 afii62886 afii63846 afii63849 afii63850 afii63851 afii63852 afii63855 afii63856 afii63761 afii63882 afii63825 afii63885 afii63888 afii63896 afii63897 afii63898 afii63899 afii63900 afii63901 afii63902 afii63903 afii63904 afii63905 afii63906 afii63908 afii63910 afii63912 afii62927 afii63941 afii62939 afii63943 afii62943 afii62946 afii63946 afii62951 afii63948 afii62953 afii63950 afii63951 afii63952 afii63953 afii63956 afii63958 afii63959 afii63960 afii63961 afii64046 afii64058 afii64059 afii64060 afii64061 afii62945 afii64184 afii52399 afii52400 afii62753 afii57411 afii62754 afii57412 afii62755 afii57413 afii62756 afii57414 afii62759 afii62757 afii62758 afii57415 afii62760 afii57416 afii62763 afii62761 afii62762 afii57417 afii62764 afii57418 afii62767 afii62765 afii62766 afii57419 afii62770 afii62768 afii62769 afii57420 afii62773 afii62771 afii62772 afii57421 afii62776 afii62774 afii62775 afii57422 afii62779 afii62777 afii62778 afii57423 afii62780 afii57424 afii62781 afii57425 afii62782 afii57426 afii62783 afii57427 afii62786 afii62784 afii62785 afii57428 afii62789 afii62787 afii62788 afii57429 afii62792 afii62790 afii62791 afii57430 afii62795 afii62793 afii62794 afii57431 afii62798 afii62796 afii62797 afii57432 afii62801 afii62799 afii62800 afii57433 afii62804 afii62802 afii62803 afii57434 afii62807 afii62805 afii62806 afii57441 afii62810 afii62808 afii62809 afii57442 afii62813 afii62811 afii62812 afii57443 afii62816 afii57410 afii62815 afii57444 afii62819 afii62817 afii62818 afii57445 afii62822 afii62820 afii62821 afii57446 afii62825 afii62823 afii62824 afii57447 afii62828 afii57470 afii62827 afii57448 afii62829 afii57449 afii62830 afii57450 afii62833 afii62831 afii62832 afii62834 afii62835 afii62836 afii62837 afii62838 afii62839 afii62840 afii62841 glyph1021 afii57543-2 afii57454-2 afii57451-2 glyph1025 glyph1026 afii57471-2 afii57458-2 afii57457-2 afii57494-2 afii57459-2 afii57455-2 afii57452-2 glyph1034 glyph1035 glyph1036 afii62884-2 afii62881-2 afii62886-2 afii62883-2 afii62885-2 afii62882-2 afii57504-2 afii57456-2 afii57453-2 glyph1046 glyph1047 afii57543-3 afii57454-3 afii57451-3 glyph1051 glyph1052 afii57471-3 afii57458-3 afii57457-3 afii57494-3 afii57459-3 afii57455-3 afii57452-3 glyph1060 glyph1061 glyph1062 afii62884-3 afii62881-3 afii62886-3 afii62883-3 afii62885-3 afii62882-3 afii57504-3 afii57456-3 afii57453-3 glyph1072 glyph1073 afii57543-4 afii57454-4 afii57451-4 glyph1077 glyph1078 afii57471-4 afii57458-4 afii57457-4 afii57494-4 afii57459-4 afii57455-4 afii57452-4 glyph1086 glyph1087 glyph1088 afii62884-4 afii62881-4 afii62886-4 afii62883-4 afii62885-4 afii62882-4 afii57504-4 afii57456-4 afii57453-4 glyph1098 glyph1099 glyph1100 glyph1101 glyph1102 glyph1103 glyph1104 glyph1105 glyph1106 glyph1107 glyph1108 glyph1109 glyph1110 glyph1111 glyph1112 glyph1113 glyph1114 glyph1115 glyph1116 glyph1117 glyph1118 glyph1119 glyph1120 glyph1121 glyph1122 glyph1123 glyph1124 glyph1125 glyph1126uniFFFCOhornohornUhornuhornf006f007f009combininghookabovef010f013f011f01cf015combiningtildeaccentf02cdongsignonethird twothirdsf008f00ff012f014f016f017f018f019f01af01bf01ef01ff020f021f022combininggraveaccentcombiningacuteaccentf01dcombiningdotbelowf023f029f02af02bf024f025f026f027f028f02df02ef02ff030 Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelow Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni0492uni0493uni0496uni0497uni049auni049buni049cuni049duni04a2uni04a3uni04aeuni04afuni04b0uni04b1uni04b2uni04b3uni04b8uni04b9uni04bauni04bbuni018funi0259uni04e8uni04e9fwUU@]u@0ZZZP0 ZZZZ____"H$/"H$"@W}_W    VjVjVj  WWWT@*T@UUUUUUUUUUUU@UW_UW_  TPT@ T *W_W_ #B1#B1 UUUUUUUU UUUUUUUU #B1#B1" UUUUUUUUU UUUUUUUUU"$H"D"$H"DUUUUUUUUUUUUUUUUUUU*_WU_WU  "DH$D"DH$D"D@ ZUZUZUZUP UWUWUWUWU  "$H"D"$H"D"$@  UjVUjVUjVUjVUjV  UWUWUWUWUWF"Db!F"Db!F"UUUUUUUUUUUUUUUUUUUUUUUUUUUP*ʯ*ʯ*F"Db!F"Db!F"UUUUUUUUUUUUUUUUUUUUUUUUUUUP*ʯ*ʯ*  @ $@ $@ $@ $@ $@  UZUZUZUZUZUZUZUZUZUZUZ  U_U_U_U_U_U_U_U_U_U_U_""DH"$D""DH"$D""DH" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@*UU_WUUU_WUUU_Whsususususu  su   su   su 4  su L  su d  su|  su  su su su su su susu susu,suEsu_sun  su 'su  su$7su (=suH*@su su6Rsu:Xsun  su  su Flsu&   -     67FGKL{|}~    #$&'/0124567=>@AIJKL_`f &jarabinit medi&fina,liga2mset< N$x @ R&!%)/3[`bghijsx&#'-1579:=>?@CE@"&*04#'-15h1 $(,.26NT1#'+-158D 0:D~$.8J&`r|"(.478XYZ[\ LMNO &,9]^_`a PQRS :bcdefy ;<&.6>DJPV\bhntz ~=>?@ABghijk  lmno"(.4CDpqrs TUt &,EFuvwx VW!)z >h &,GHIJK $ &PzblvT $56>?@ $`abcd JK ef  &,28>DJPV\56>?@JK{   &,28>DJPV\`abcdefz  $    $$%&  01 "(.4:@FL     "(.4:@FL$%&01 < . ` !"'()*5678EFLNORSTUV[\almnox-  "''(*5678EFGKLLNORV[\aaloxx  T#"! (,*'+)&4=3<98;2:B7FDAEC GHIJK<, .   v  !"'()*+,56789:;<=>?@ABCDEFLMNOPQRSTUVWXYZ[\]agklpuvwx1  "'*+,567:;;<@AABCDDEFLNOOPQRUV]aaggklppux4 /.- IHGfwUU@]u@0ZZZP0 ZZZZ____"H$/"H$"@W}_W    VjVjVj  WWWT@*T@UUUUUUUUUUUU@UW_UW_  TPT@ T *W_W_ #B1#B1 UUUUUUUU UUUUUUUU #B1#B1" UUUUUUUUU UUUUUUUUU"$H"D"$H"DUUUUUUUUUUUUUUUUUUU*_WU_WU  "DH$D"DH$D"D@ ZUZUZUZUP UWUWUWUWU  "$H"D"$H"D"$@  UjVUjVUjVUjVUjV  UWUWUWUWUWF"Db!F"Db!F"UUUUUUUUUUUUUUUUUUUUUUUUUUUP*ʯ*ʯ*F"Db!F"Db!F"UUUUUUUUUUUUUUUUUUUUUUUUUUUP*ʯ*ʯ*  @ $@ $@ $@ $@ $@  UZUZUZUZUZUZUZUZUZUZUZ  U_U_U_U_U_U_U_U_U_U_U_""DH"$D""DH"$D""DH" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@*UU_WUUU_WUUU_Whsususususu  su   su   su 4  su L  su d  su|  su  su su su su su susu susu,suEsu_sun  su 'su  su$7su (=suH*@su su6Rsu:Xsun  su  su Flsu&  0 *H x0t10 *H 0` +7R0P0, +7<<<Obsolete>>>0 0 *H uP"xt@#0@0Ǐ7ے(<g0  *H 0a10UInternet10U VeriSign, Inc.1301U *VeriSign Commercial Software Publishers CA0 960409000000Z 040107235959Z0a10UInternet10U VeriSign, Inc.1301U *VeriSign Commercial Software Publishers CA00  *H 0ieRT(bTUDEJ;~Ȁ k)vsb<ulMԘisbN1 }GQod5}gwQ>wCʣA="HH0  *H ujdxç2ur&`0LH4RJQS-{1eAA/czszAЎ:84Duqā85J>2!8\8dT_݈)Oqd1<<00M,3{TT0  *H 010U VeriSign Trust Network10U VeriSign, Inc.1,0*U #VeriSign Time Stamping Service Root1402U +NO LIABILITY ACCEPTED, (c)97 VeriSign, Inc.0 991116000000Z 040106235959Z010U VeriSign, Inc.10U VeriSign Trust Network1F0DU =www.verisign.com/repository/RPA Incorp. by Ref.,LIAB.LTD(c)981.0,U%VeriSign Time Stamping Service CA SW10"0  *H 0 Ԙgm*2,/O_rϩEA/@˒-Mb/3@հmՆO_I޷ Ne E# );7FдX#`Rv p#aܲpb Hrɇ7 S,)H2&,4PNJJ0b+GqS EQ22w0򹅒RנI93才`YVB%00U% 0 +0OU H0F0D `HE0503+'https://www.verisign.com/repository/RPA0U00 U0  *H |C!{XyKl?!^5˓QC-,qǵ1%$sLGu ;맕O`fcHd(r_XiU(42P[0<U 5Digital ID Class 3 - Microsoft Software Validation v21 0 UUS10U Washington10URedmond10UMicrosoft Corporation10U Microsoft Corporation00  *H 0I&8bURDF3aѲg@ 6@YQmQt+n]n: ;Q]NZ0V0 U00 U0U0{Ch8n; c0a10UInternet10U VeriSign, Inc.1301U *VeriSign Commercial Software Publishers CAǏ7ے(<g0!U000  +70 U 0@06 +7 #0)'https://www.verisign.com/repository/CPSThis certificate incorporates by reference, and its use is strictly subject to, the VeriSign Certification Practice Statement (CPS) version 1.0, available in the VeriSign repository at: https://www.verisign.com; by E-mail at CPS-requests@verisign.com; or by mail at VeriSign, Inc., 2593 Coast Ave., Mountain View, CA 94043 USA Copyright (c)1996 VeriSign, Inc. All Rights Reserved. CERTAIN WARRANTIES DISCLAIMED AND LIABILITY LIMITED. WARNING: THE USE OF THIS CERTIFICATE IS STRICTLY SUBJECT TO THE VERISIGN CERTIFICATION PRACTICE STATEMENT. THE ISSUING AUTHORITY DISCLAIMS CERTAIN IMPLIED AND EXPRESS WARRANTIES, INCLUDING WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, AND WILL NOT BE LIABLE FOR CONSEQUENTIAL, PUNITIVE, AND CERTAIN OTHER DAMAGES. SEE THE CPS FOR DETAILS. Contents of the VeriSign registered nonverifiedSubjectAttributes extension value shall not be considered as accurate information validated by the IA. 64https://www.verisign.com/repository/verisignlogo.gif0U000  `HE0This certificate incorporates by reference, and its use is strictly subject to, the VeriSign Certification Practice Statement (CPS), available at: https://www.verisign.com/CPS; by E-mail at CPS-requests@verisign.com; or by mail at VeriSign, Inc., 2593 Coast Ave., Mountain View, CA 94043 USA Tel. +1 (415) 961-8830 Copyright (c) 1996 VeriSign, Inc. All Rights Reserved. CERTAIN WARRANTIES DISCLAIMED and LIABILITY LIMITED. `HE `HE0,0*(https://www.verisign.com/repository/CPS 0 +700  *H A s#piafH)1ئnǨ{ x3eXKZnffD]dXՍN6?+2ojQm<LOJuϼB!w B]1(0$0u0a10UInternet10U VeriSign, Inc.1301U *VeriSign Commercial Software Publishers CAumRKe\0 *H 0 *H  1  +70 +7 10  +70 *H  1S/f\Hϙl0Z +7 1L0J" Courier New font$"http://www.microsoft.com/truetype/0  *H %~&` ™hi!2ob_RD!e]INRgEx UhSP;(S3Y=W'Df)Hq\6XeyH?Xp&M0I *H  1:060010U VeriSign Trust Network10U VeriSign, Inc.1,0*U #VeriSign Time Stamping Service Root1402U +NO LIABILITY ACCEPTED, (c)97 VeriSign, Inc.,3{TT0 *H Y0 *H  1  *H 0 *H  1 000824134606Z0 *H  1R> K5 Text_CAPTCHA pear.php.net Generation of CAPTCHAs Implementation of CAPTCHAs (completely automated public Turing test to tell computers and humans apart) Christian Wenz wenz wenz@php.net no Michael Cramer bigmichi1 michael@bigmichi1.de yes Christian Weiske cweiske cweiske@php.net no Aaron Wormus wormus wormus@php.net no David Coallier davidc davidc@agoraproduction.com no Tobias Schlitt toby schlitt@php.net no 2014-02-28 1.0.2 1.0.0 stable stable New BSD * Fixed some invalid/broken tags in package.xml 5.1.0 1.4.6 Text_Password pear.php.net 1.1.1 Numbers_Words pear.php.net Text_Figlet pear.php.net Image_Text pear.php.net 0.7.0 gd 1.0.2 1.0.0 stable stable 2014-02-28 New BSD * Fixed some invalid/broken tags in package.xml 1.0.1 1.0.0 stable stable 2014-02-17 New BSD * Bug #20201 license file does not exist, causing error on upgrade. 1.0.0 1.0.0 stable stable 2014-02-17 New BSD First stable release * no changes since last beta release 0.5.0 0.5.0 beta beta 2013-08-07 New BSD First PHP5 release * use phing to build package * extend test cases * Bug #19858 Figlet: _createPhrase duplicates parent method * Bug #19891 undefined function init() * Request #5055 Enhance _createCAPTCHA method to use user-defined colours * Request #19854 No reason for Figlet double-options: $options['options']['font_file'] * dependency for Image_Text to version 0.7.0 0.4.1 0.4.0 alpha alpha 2010-10-25 New BSD QA release * Request #11653 Text_Password::create() call * Bug #12578 incorrect/incomplete license in package.xml * Request #16433 Image Driver: If image is too small, no text is created 0.4.0 0.4.0 alpha alpha 2009-07-27 New BSD + ** license change from PHP license to BSD license ** + implemented feature request #16433 (fixing behavior from bug #13478): If image is too small, no text is created (patch by tacker) + implemented feature request #11653: new 'phraseOptions' setting to provide options to Text_Password::create() call + updated and new examples + various cosmetic changes 0.3.1 0.3.0 alpha alpha 2007-09-02 PHP License + implemented feature request #11957: Providing better Image driver error messages in various places + fixed example/documentation bug #11960 + various cosmetic changes 0.3.0 0.3.0 alpha alpha 2007-08-01 PHP License + new feature: now supports setting background and line color for image CAPTCHAs (see CAPTCHA_test.php example file). Requires Image_Text >= 0.6.0beta to work. Many thanks to isnull! + bugfix: CAPTCHA drivers now also load Text/CAPTCHA.php via require_once (suggested by Philippe Jausions) 0.2.1 0.2.1 alpha alpha 2007-02-18 PHP License + bugfix: image height could not be set (reported by Hendrik Vorwerk) + cosmetic changes 0.2.0 0.2.0 alpha alpha 2006-12-24 PHP License *********************************** ********* MERRY CHRISTMAS ********* *********************************** *********************************** *** Upcoming BC BREAKING CHANGES ** *********************************** + CAPTCHA options are now provided as one array (wormus' suggestion) + image CAPTCHA is now only created upon request, making it serializable (jausions' suggestion) + New drivers: Figlet (wormus), Word (toby), Numeral (davidc), Equation (cweiske) + some other stuff ... 0.1.6 0.1.6 alpha alpha 2005-10-27 PHP License + fixed a bug in the sample (noticed by Nima Sadjadi) 0.1.5 0.1.5 alpha alpha 2005-09-26 PHP License + cosmetic changes (CS) + small changes sample script (suggested by Lukas Smith, thanks!) 0.1.4 0.1.4 alpha alpha 2005-08-11 PHP License + cosmetic changes (whitespace, line endings) 0.1.3 0.1.3 alpha alpha 2005-06-19 PHP License + better check for errors thrown from Image_Text + updated examples + cosmetic changes 0.1.2 0.1.2 alpha alpha 2005-01-26 PHP License Bugfix release + fixed bug #3271 (thanks to Justin) + some cosmetic changes 0.1.1 0.1.1 alpha alpha 2004-11-08 PHP License Bugfix release (Int'l PHP Conference Edition) + fixed bug #2584 (thanks to wormus) + various small fixes 0.1.0 0.1.0 alpha alpha 2004-10-21 PHP License Initial release (PHP World, Munich)