$pwd_hash1 = encrypt_password($password);
$pwd_hash2 = encrypt_password($password, $login);
$login = db_escape_string($login);
+ $otp = db_escape_string($_REQUEST["otp"]);
+
+ if (get_schema_version($this->link) > 96) {
+ $result = db_query($this->link, "SELECT otp_enabled,salt FROM ttrss_users WHERE
+ login = '$login'");
+
+ require_once "lib/otphp/vendor/base32.php";
+ require_once "lib/otphp/lib/otp.php";
+ require_once "lib/otphp/lib/totp.php";
+
+ $base32 = new Base32();
+
+ $otp_enabled = sql_bool_to_bool(db_fetch_result($result, 0, "otp_enabled"));
+ $secret = $base32->encode(sha1(db_fetch_result($result, 0, "salt")));
+
+ $topt = new \OTPHP\TOTP($secret);
+ $otp_check = $topt->now();
+
+ if ($otp_enabled) {
+ if ($otp) {
+ if ($otp != $otp_check) {
+ return false;
+ }
+ } else {
+ ?><html>
+ <head><title>Tiny Tiny RSS</title></head>
+ <body>
+ <form method="POST">
+ <input type="hidden" name="login_action" value="do_login">
+ <input type="hidden" name="login" value="<?php echo htmlspecialchars($login) ?>">
+ <input type="hidden" name="password" value="<?php echo htmlspecialchars($password) ?>">
+
+ <label><?php echo __("Please enter your one time password:") ?></label>
+ <input type="password" size="6" name="otp"/>
+ <input type="submit" value="Continue"/>
+ </form>
+ </form>
+ <?php
+ exit;
+ }
+ }
+ }
if (get_schema_version($this->link) > 87) {
$new_password_hash = encrypt_password($new_password, $new_salt, true);
db_query($this->link, "UPDATE ttrss_users SET
- pwd_hash = '$new_password_hash', salt = '$new_salt'
+ pwd_hash = '$new_password_hash', salt = '$new_salt', otp_enabled = false
WHERE id = '$owner_uid'");
$_SESSION["pwd_hash"] = $new_password_hash;
print "<table width=\"100%\" class=\"prefPrefsList\">";
- $result = db_query($this->link, "SELECT email,full_name,
+ print "<h2>" . __("Personal data") . "</h2>";
+
+ $result = db_query($this->link, "SELECT email,full_name,otp_enabled,
access_level FROM ttrss_users
WHERE id = ".$_SESSION["uid"]);
$email = htmlspecialchars(db_fetch_result($result, 0, "email"));
$full_name = htmlspecialchars(db_fetch_result($result, 0, "full_name"));
+ $otp_enabled = sql_bool_to_bool(db_fetch_result($result, 0, "otp_enabled"));
print "<tr><td width=\"40%\">".__('Full name')."</td>";
print "<td class=\"prefValue\"><input dojoType=\"dijit.form.ValidationTextBox\" name=\"full_name\" required=\"1\"
if ($authenticator && method_exists($authenticator, "change_password")) {
+ print "<h2>" . __("Password") . "</h2>";
+
$result = db_query($this->link, "SELECT id FROM ttrss_users
WHERE id = ".$_SESSION["uid"]." AND pwd_hash
= 'SHA1:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8'");
print "</form>";
+ if ($_SESSION["auth_module"] == "internal") {
+
+ print "<h2>" . __("One time passwords / Authenticator") . "</h2>";
+
+ if ($otp_enabled) {
+
+ print "<p>".__("One time passwords are currently enabled. Change your current password and refresh this page to reconfigure.") . "</p>";
+
+ } else {
+
+ print "<p>".__("You will need a compatible Authenticator to use this. Changing your password would automatically disable OTP.") . "</p>";
+
+ print "<p>".__("Scan the following code by the Authenticator application:")."</p>";
+
+ $csrf_token = $_SESSION["csrf_token"];
+
+ print "<img src=\"backend.php?op=pref-prefs&method=otpqrcode&csrf_token=$csrf_token\">";
+
+ print "<form dojoType=\"dijit.form.Form\" id=\"changeOtpForm\">";
+
+ print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"pref-prefs\">";
+ print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"changeotp\">";
+
+ print "<script type=\"dojo/method\" event=\"onSubmit\" args=\"evt\">
+ evt.preventDefault();
+ if (this.validate()) {
+ notify_progress('Saving data...', true);
+
+ new Ajax.Request('backend.php', {
+ parameters: dojo.objectToQuery(this.getValues()),
+ onComplete: function(transport) {
+ window.location.reload();
+ } });
+
+ }
+ </script>";
+
+ print "<input dojoType=\"dijit.form.CheckBox\" required=\"1\"
+ type=\"checkbox\" id=\"enable_otp\" name=\"enable_otp\"/> ";
+ print "<label for=\"enable_otp\">".__("I have scanned the code and would like to enable OTP")."</label>";
+
+ print "<p><button dojoType=\"dijit.form.Button\" type=\"submit\">".
+ __("Save OTP setting")."</button>";
+
+ print "</form>";
+
+ }
+
+ }
}
print "</div>"; #pane
function toggleAdvanced() {
$_SESSION["prefs_show_advanced"] = !$_SESSION["prefs_show_advanced"];
}
+
+ function otpqrcode() {
+ require_once "lib/otphp/vendor/base32.php";
+ require_once "lib/otphp/lib/otp.php";
+ require_once "lib/otphp/lib/totp.php";
+ require_once "lib/phpqrcode/phpqrcode.php";
+
+ $result = db_query($this->link, "SELECT login,salt
+ FROM ttrss_users
+ WHERE id = ".$_SESSION["uid"]);
+
+ $base32 = new Base32();
+
+ $login = db_fetch_result($result, 0, "login");
+ $secret = $base32->encode(sha1(db_fetch_result($result, 0, "salt")));
+
+ $topt = new \OTPHP\TOTP($secret);
+
+ print QRcode::png($topt->provisioning_uri($login));
+ }
+
+ function changeotp() {
+ $enable_otp = $_REQUEST["enable_otp"];
+
+ if ($enable_otp == "on") {
+ db_query($this->link, "UPDATE ttrss_users SET otp_enabled = true WHERE
+ id = " . $_SESSION["uid"]);
+ }
+ }
}
?>
<?php
define('EXPECTED_CONFIG_VERSION', 26);
- define('SCHEMA_VERSION', 96);
+ define('SCHEMA_VERSION', 97);
$fetch_last_error = false;
--- /dev/null
+Copyright (c) 2011 Le Lag
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
--- /dev/null
+<?php
+/*
+ * Copyright (c) 2011 Le Lag
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace OTPHP {
+ /**
+ * HOTP - One time password generator
+ *
+ * The HOTP class allow for the generation
+ * and verification of one-time password using
+ * the HOTP specified algorithm.
+ *
+ * This class is meant to be compatible with
+ * Google Authenticator
+ *
+ * This class was originally ported from the rotp
+ * ruby library available at https://github.com/mdp/rotp
+ */
+ class HOTP extends OTP {
+ /**
+ * Get the password for a specific counter value
+ * @param integer $count the counter which is used to
+ * seed the hmac hash function.
+ * @return integer the One Time Password
+ */
+ public function at($count) {
+ return $this->generateOTP($count);
+ }
+
+
+ /**
+ * Verify if a password is valid for a specific counter value
+ *
+ * @param integer $otp the one-time password
+ * @param integer $counter the counter value
+ * @return bool true if the counter is valid, false otherwise
+ */
+ public function verify($otp, $counter) {
+ return ($otp == $this->at($counter));
+ }
+
+ /**
+ * Returns the uri for a specific secret for hotp method.
+ * Can be encoded as a image for simple configuration in
+ * Google Authenticator.
+ *
+ * @param string $name the name of the account / profile
+ * @param integer $initial_count the initial counter
+ * @return string the uri for the hmac secret
+ */
+ public function provisioning_uri($name, $initial_count) {
+ return "otpauth://hotp/".urlencode($name)."?secret={$this->secret}&counter=$initial_count";
+ }
+ }
+
+}
--- /dev/null
+<?php
+/*
+ * Copyright (c) 2011 Le Lag
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace OTPHP {
+/**
+ * One Time Password Generator
+ *
+ * The OTP class allow the generation of one-time
+ * password that is described in rfc 4xxx.
+ *
+ * This is class is meant to be compatible with
+ * Google Authenticator.
+ *
+ * This class was originally ported from the rotp
+ * ruby library available at https://github.com/mdp/rotp
+ */
+class OTP {
+ /**
+ * The base32 encoded secret key
+ * @var string
+ */
+ public $secret;
+
+ /**
+ * The algorithm used for the hmac hash function
+ * @var string
+ */
+ public $digest;
+
+ /**
+ * The number of digits in the one-time password
+ * @var integer
+ */
+ public $digits;
+
+ /**
+ * Constructor for the OTP class
+ * @param string $secret the secret key
+ * @param array $opt options array can contain the
+ * following keys :
+ * @param integer digits : the number of digits in the one time password
+ * Currently Google Authenticator only support 6. Defaults to 6.
+ * @param string digest : the algorithm used for the hmac hash function
+ * Google Authenticator only support sha1. Defaults to sha1
+ *
+ * @return new OTP class.
+ */
+ public function __construct($secret, $opt = Array()) {
+ $this->digits = isset($opt['digits']) ? $opt['digits'] : 6;
+ $this->digest = isset($opt['digest']) ? $opt['digest'] : 'sha1';
+ $this->secret = $secret;
+ }
+
+ /**
+ * Generate a one-time password
+ *
+ * @param integer $input : number used to seed the hmac hash function.
+ * This number is usually a counter (HOTP) or calculated based on the current
+ * timestamp (see TOTP class).
+ * @return integer the one-time password
+ */
+ public function generateOTP($input) {
+ $hash = hash_hmac($this->digest, $this->intToBytestring($input), $this->byteSecret());
+ foreach(str_split($hash, 2) as $hex) { // stupid PHP has bin2hex but no hex2bin WTF
+ $hmac[] = hexdec($hex);
+ }
+ $offset = $hmac[19] & 0xf;
+ $code = ($hmac[$offset+0] & 0x7F) << 24 |
+ ($hmac[$offset + 1] & 0xFF) << 16 |
+ ($hmac[$offset + 2] & 0xFF) << 8 |
+ ($hmac[$offset + 3] & 0xFF);
+ return $code % pow(10, $this->digits);
+ }
+
+ /**
+ * Returns the binary value of the base32 encoded secret
+ * @access private
+ * This method should be private but was left public for
+ * phpunit tests to work.
+ * @return binary secret key
+ */
+ public function byteSecret() {
+ return \Base32::decode($this->secret);
+ }
+
+ /**
+ * Turns an integer in a OATH bytestring
+ * @param integer $int
+ * @access private
+ * @return string bytestring
+ */
+ public function intToBytestring($int) {
+ $result = Array();
+ while($int != 0) {
+ $result[] = chr($int & 0xFF);
+ $int >>= 8;
+ }
+ return str_pad(join(array_reverse($result)), 8, "\000", STR_PAD_LEFT);
+ }
+ }
+}
--- /dev/null
+<?php
+/*
+ * Copyright (c) 2011 Le Lag
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+require_once dirname(__FILE__).'/../vendor/libs.php';
+require_once dirname(__FILE__).'/otp.php';
+require_once dirname(__FILE__).'/hotp.php';
+require_once dirname(__FILE__).'/totp.php';
+
--- /dev/null
+<?php
+/*
+ * Copyright (c) 2011 Le Lag
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace OTPHP {
+ /**
+ * TOTP - One time password generator
+ *
+ * The TOTP class allow for the generation
+ * and verification of one-time password using
+ * the TOTP specified algorithm.
+ *
+ * This class is meant to be compatible with
+ * Google Authenticator
+ *
+ * This class was originally ported from the rotp
+ * ruby library available at https://github.com/mdp/rotp
+ */
+ class TOTP extends OTP {
+ /**
+ * The interval in seconds for a one-time password timeframe
+ * Defaults to 30
+ * @var integer
+ */
+ public $interval;
+
+ public function __construct($s, $opt = Array()) {
+ $this->interval = isset($opt['interval']) ? $opt['interval'] : 30;
+ parent::__construct($s, $opt);
+ }
+
+ /**
+ * Get the password for a specific timestamp value
+ *
+ * @param integer $timestamp the timestamp which is timecoded and
+ * used to seed the hmac hash function.
+ * @return integer the One Time Password
+ */
+ public function at($timestamp) {
+ return $this->generateOTP($this->timecode($timestamp));
+ }
+
+ /**
+ * Get the password for the current timestamp value
+ *
+ * @return integer the current One Time Password
+ */
+ public function now() {
+ return $this->generateOTP($this->timecode(time()));
+ }
+
+ /**
+ * Verify if a password is valid for a specific counter value
+ *
+ * @param integer $otp the one-time password
+ * @param integer $timestamp the timestamp for the a given time, defaults to current time.
+ * @return bool true if the counter is valid, false otherwise
+ */
+ public function verify($otp, $timestamp = null) {
+ if($timestamp === null)
+ $timestamp = time();
+ return ($otp == $this->at($timestamp));
+ }
+
+ /**
+ * Returns the uri for a specific secret for totp method.
+ * Can be encoded as a image for simple configuration in
+ * Google Authenticator.
+ *
+ * @param string $name the name of the account / profile
+ * @return string the uri for the hmac secret
+ */
+ public function provisioning_uri($name) {
+ return "otpauth://totp/".urlencode($name)."?secret={$this->secret}";
+ }
+
+ /**
+ * Transform a timestamp in a counter based on specified internal
+ *
+ * @param integer $timestamp
+ * @return integer the timecode
+ */
+ protected function timecode($timestamp) {
+ return (int)( (((int)$timestamp * 1000) / ($this->interval * 1000)));
+ }
+ }
+
+}
--- /dev/null
+<?php
+
+/**
+ * Encode in Base32 based on RFC 4648.
+ * Requires 20% more space than base64
+ * Great for case-insensitive filesystems like Windows and URL's (except for = char which can be excluded using the pad option for urls)
+ *
+ * @package default
+ * @author Bryan Ruiz
+ **/
+class Base32 {
+
+ private static $map = array(
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 7
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
+ 'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
+ '=' // padding char
+ );
+
+ private static $flippedMap = array(
+ 'A'=>'0', 'B'=>'1', 'C'=>'2', 'D'=>'3', 'E'=>'4', 'F'=>'5', 'G'=>'6', 'H'=>'7',
+ 'I'=>'8', 'J'=>'9', 'K'=>'10', 'L'=>'11', 'M'=>'12', 'N'=>'13', 'O'=>'14', 'P'=>'15',
+ 'Q'=>'16', 'R'=>'17', 'S'=>'18', 'T'=>'19', 'U'=>'20', 'V'=>'21', 'W'=>'22', 'X'=>'23',
+ 'Y'=>'24', 'Z'=>'25', '2'=>'26', '3'=>'27', '4'=>'28', '5'=>'29', '6'=>'30', '7'=>'31'
+ );
+
+ /**
+ * Use padding false when encoding for urls
+ *
+ * @return base32 encoded string
+ * @author Bryan Ruiz
+ **/
+ public static function encode($input, $padding = true) {
+ if(empty($input)) return "";
+ $input = str_split($input);
+ $binaryString = "";
+ for($i = 0; $i < count($input); $i++) {
+ $binaryString .= str_pad(base_convert(ord($input[$i]), 10, 2), 8, '0', STR_PAD_LEFT);
+ }
+ $fiveBitBinaryArray = str_split($binaryString, 5);
+ $base32 = "";
+ $i=0;
+ while($i < count($fiveBitBinaryArray)) {
+ $base32 .= self::$map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)];
+ $i++;
+ }
+ if($padding && ($x = strlen($binaryString) % 40) != 0) {
+ if($x == 8) $base32 .= str_repeat(self::$map[32], 6);
+ else if($x == 16) $base32 .= str_repeat(self::$map[32], 4);
+ else if($x == 24) $base32 .= str_repeat(self::$map[32], 3);
+ else if($x == 32) $base32 .= self::$map[32];
+ }
+ return $base32;
+ }
+
+ public static function decode($input) {
+ if(empty($input)) return;
+ $paddingCharCount = substr_count($input, self::$map[32]);
+ $allowedValues = array(6,4,3,1,0);
+ if(!in_array($paddingCharCount, $allowedValues)) return false;
+ for($i=0; $i<4; $i++){
+ if($paddingCharCount == $allowedValues[$i] &&
+ substr($input, -($allowedValues[$i])) != str_repeat(self::$map[32], $allowedValues[$i])) return false;
+ }
+ $input = str_replace('=','', $input);
+ $input = str_split($input);
+ $binaryString = "";
+ for($i=0; $i < count($input); $i = $i+8) {
+ $x = "";
+ if(!in_array($input[$i], self::$map)) return false;
+ for($j=0; $j < 8; $j++) {
+ $x .= str_pad(base_convert(@self::$flippedMap[@$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
+ }
+ $eightBits = str_split($x, 8);
+ for($z = 0; $z < count($eightBits); $z++) {
+ $binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:"";
+ }
+ }
+ return $binaryString;
+ }
+}
+
--- /dev/null
+<?php
+/*
+ * Copyright (c) 2011 Le Lag
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+// Add any needed third party library to this directory
+
+//require_once dirname(__FILE__).'/some_lib/lib.php';
+require_once dirname(__FILE__).'/base32.php';
--- /dev/null
+* 1.0.0 build 2010031920 \r
+\r
+ - first public release\r
+ - help in readme, install\r
+ - cleanup ans separation of QRtools and QRspec\r
+ - now TCPDF binding requires minimal changes in TCPDF, having most of job\r
+ done in QRtools tcpdfBarcodeArray\r
+ - nicer QRtools::timeBenchmark output\r
+ - license and copyright notices in files\r
+ - indent cleanup - from tab to 4spc, keep it that way please :)\r
+ - sf project, repository, wiki\r
+ - simple code generator in index.php\r
+ \r
+* 1.1.0 build 2010032113\r
+\r
+ - added merge tool wich generate merged version of code\r
+ located in phpqrcode.php\r
+ - splited qrconst.php from qrlib.php\r
+ \r
+* 1.1.1 build 2010032405\r
+\r
+ - patch by Rick Seymour allowing saving PNG and displaying it at the same time\r
+ - added version info in VERSION file\r
+ - modified merge tool to include version info into generated file\r
+ - fixed e-mail in almost all head comments\r
+ \r
+* 1.1.2 build 2010032722\r
+\r
+ - full integration with TCPDF thanks to Nicola Asuni, it's author\r
+ - fixed bug with alphanumeric encoding detection\r
+ \r
+* 1.1.3 build 2010081807\r
+\r
+ - short opening tags replaced with standard ones\r
+ \r
+* 1.1.4 build 2010100721\r
+\r
+ - added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC)\r
--- /dev/null
+== REQUIREMENTS ==\r
+\r
+ * PHP5\r
+ * PHP GD2 extension with JPEG and PNG support\r
+ \r
+== INSTALLATION ==\r
+\r
+If you want to recreate cache by yourself make sure cache directory is\r
+writable and you have permisions to write into it. Also make sure you are\r
+able to read files in it if you have cache option enabled\r
+ \r
+== CONFIGURATION ==\r
+\r
+Feel free to modify config constants in qrconfig.php file. Read about it in\r
+provided comments and project wiki page (links in README file)\r
+\r
+== QUICK START ==\r
+\r
+Notice: probably you should'nt use all of this in same script :)\r
+\r
+<?phpb\r
+\r
+//include only that one, rest required files will be included from it\r
+include "qrlib.php"\r
+\r
+//write code into file, Error corection lecer is lowest, L (one form: L,M,Q,H)\r
+//each code square will be 4x4 pixels (4x zoom)\r
+//code will have 2 code squares white boundary around \r
+\r
+QRcode::png('PHP QR Code :)', 'test.png', 'L', 4, 2);\r
+\r
+//same as above but outputs file directly into browser (with appr. header etc.)\r
+//all other settings are default\r
+//WARNING! it should be FIRST and ONLY output generated by script, otherwise\r
+//rest of output will land inside PNG binary, breaking it for sure\r
+QRcode::png('PHP QR Code :)');\r
+\r
+//show benchmark\r
+QRtools::timeBenchmark();\r
+\r
+//rebuild cache\r
+QRtools::buildCache();\r
+\r
+//code generated in text mode - as a binary table\r
+//then displayed out as HTML using Unicode block building chars :)\r
+$tab = $qr->encode('PHP QR Code :)');\r
+QRspec::debug($tab, true);\r
+\r
+== TCPDF INTEGRATION ==\r
+\r
+Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php.\r
+Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge)\r
+2dbarcodes.php \r
+\r
+Then use similar as example #50 from TCPDF examples:\r
+\r
+<?php\r
+\r
+$style = array(\r
+ 'border' => true,\r
+ 'padding' => 4,\r
+ 'fgcolor' => array(0,0,0),\r
+ 'bgcolor' => false, //array(255,255,255)\r
+);\r
+\r
+//code name: QR, specify error correction level after semicolon (L,M,Q,H)\r
+$pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N');\r
--- /dev/null
+ GNU LESSER GENERAL PUBLIC LICENSE\r
+ Version 3, 29 June 2007\r
+\r
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\r
+ Everyone is permitted to copy and distribute verbatim copies\r
+ of this license document, but changing it is not allowed.\r
+\r
+\r
+ This version of the GNU Lesser General Public License incorporates\r
+the terms and conditions of version 3 of the GNU General Public\r
+License, supplemented by the additional permissions listed below.\r
+\r
+ 0. Additional Definitions.\r
+\r
+ As used herein, "this License" refers to version 3 of the GNU Lesser\r
+General Public License, and the "GNU GPL" refers to version 3 of the GNU\r
+General Public License.\r
+\r
+ "The Library" refers to a covered work governed by this License,\r
+other than an Application or a Combined Work as defined below.\r
+\r
+ An "Application" is any work that makes use of an interface provided\r
+by the Library, but which is not otherwise based on the Library.\r
+Defining a subclass of a class defined by the Library is deemed a mode\r
+of using an interface provided by the Library.\r
+\r
+ A "Combined Work" is a work produced by combining or linking an\r
+Application with the Library. The particular version of the Library\r
+with which the Combined Work was made is also called the "Linked\r
+Version".\r
+\r
+ The "Minimal Corresponding Source" for a Combined Work means the\r
+Corresponding Source for the Combined Work, excluding any source code\r
+for portions of the Combined Work that, considered in isolation, are\r
+based on the Application, and not on the Linked Version.\r
+\r
+ The "Corresponding Application Code" for a Combined Work means the\r
+object code and/or source code for the Application, including any data\r
+and utility programs needed for reproducing the Combined Work from the\r
+Application, but excluding the System Libraries of the Combined Work.\r
+\r
+ 1. Exception to Section 3 of the GNU GPL.\r
+\r
+ You may convey a covered work under sections 3 and 4 of this License\r
+without being bound by section 3 of the GNU GPL.\r
+\r
+ 2. Conveying Modified Versions.\r
+\r
+ If you modify a copy of the Library, and, in your modifications, a\r
+facility refers to a function or data to be supplied by an Application\r
+that uses the facility (other than as an argument passed when the\r
+facility is invoked), then you may convey a copy of the modified\r
+version:\r
+\r
+ a) under this License, provided that you make a good faith effort to\r
+ ensure that, in the event an Application does not supply the\r
+ function or data, the facility still operates, and performs\r
+ whatever part of its purpose remains meaningful, or\r
+\r
+ b) under the GNU GPL, with none of the additional permissions of\r
+ this License applicable to that copy.\r
+\r
+ 3. Object Code Incorporating Material from Library Header Files.\r
+\r
+ The object code form of an Application may incorporate material from\r
+a header file that is part of the Library. You may convey such object\r
+code under terms of your choice, provided that, if the incorporated\r
+material is not limited to numerical parameters, data structure\r
+layouts and accessors, or small macros, inline functions and templates\r
+(ten or fewer lines in length), you do both of the following:\r
+\r
+ a) Give prominent notice with each copy of the object code that the\r
+ Library is used in it and that the Library and its use are\r
+ covered by this License.\r
+\r
+ b) Accompany the object code with a copy of the GNU GPL and this license\r
+ document.\r
+\r
+ 4. Combined Works.\r
+\r
+ You may convey a Combined Work under terms of your choice that,\r
+taken together, effectively do not restrict modification of the\r
+portions of the Library contained in the Combined Work and reverse\r
+engineering for debugging such modifications, if you also do each of\r
+the following:\r
+\r
+ a) Give prominent notice with each copy of the Combined Work that\r
+ the Library is used in it and that the Library and its use are\r
+ covered by this License.\r
+\r
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license\r
+ document.\r
+\r
+ c) For a Combined Work that displays copyright notices during\r
+ execution, include the copyright notice for the Library among\r
+ these notices, as well as a reference directing the user to the\r
+ copies of the GNU GPL and this license document.\r
+\r
+ d) Do one of the following:\r
+\r
+ 0) Convey the Minimal Corresponding Source under the terms of this\r
+ License, and the Corresponding Application Code in a form\r
+ suitable for, and under terms that permit, the user to\r
+ recombine or relink the Application with a modified version of\r
+ the Linked Version to produce a modified Combined Work, in the\r
+ manner specified by section 6 of the GNU GPL for conveying\r
+ Corresponding Source.\r
+\r
+ 1) Use a suitable shared library mechanism for linking with the\r
+ Library. A suitable mechanism is one that (a) uses at run time\r
+ a copy of the Library already present on the user's computer\r
+ system, and (b) will operate properly with a modified version\r
+ of the Library that is interface-compatible with the Linked\r
+ Version.\r
+\r
+ e) Provide Installation Information, but only if you would otherwise\r
+ be required to provide such information under section 6 of the\r
+ GNU GPL, and only to the extent that such information is\r
+ necessary to install and execute a modified version of the\r
+ Combined Work produced by recombining or relinking the\r
+ Application with a modified version of the Linked Version. (If\r
+ you use option 4d0, the Installation Information must accompany\r
+ the Minimal Corresponding Source and Corresponding Application\r
+ Code. If you use option 4d1, you must provide the Installation\r
+ Information in the manner specified by section 6 of the GNU GPL\r
+ for conveying Corresponding Source.)\r
+\r
+ 5. Combined Libraries.\r
+\r
+ You may place library facilities that are a work based on the\r
+Library side by side in a single library together with other library\r
+facilities that are not Applications and are not covered by this\r
+License, and convey such a combined library under terms of your\r
+choice, if you do both of the following:\r
+\r
+ a) Accompany the combined library with a copy of the same work based\r
+ on the Library, uncombined with any other library facilities,\r
+ conveyed under the terms of this License.\r
+\r
+ b) Give prominent notice with the combined library that part of it\r
+ is a work based on the Library, and explaining where to find the\r
+ accompanying uncombined form of the same work.\r
+\r
+ 6. Revised Versions of the GNU Lesser General Public License.\r
+\r
+ The Free Software Foundation may publish revised and/or new versions\r
+of the GNU Lesser General Public License from time to time. Such new\r
+versions will be similar in spirit to the present version, but may\r
+differ in detail to address new problems or concerns.\r
+\r
+ Each version is given a distinguishing version number. If the\r
+Library as you received it specifies that a certain numbered version\r
+of the GNU Lesser General Public License "or any later version"\r
+applies to it, you have the option of following the terms and\r
+conditions either of that published version or of any later version\r
+published by the Free Software Foundation. If the Library as you\r
+received it does not specify a version number of the GNU Lesser\r
+General Public License, you may choose any version of the GNU Lesser\r
+General Public License ever published by the Free Software Foundation.\r
+\r
+ If the Library as you received it specifies that a proxy can decide\r
+whether future versions of the GNU Lesser General Public License shall\r
+apply, that proxy's public statement of acceptance of any version is\r
+permanent authorization for you to choose that version for the\r
+Library.\r
--- /dev/null
+This is PHP implementation of QR Code 2-D barcode generator. It is pure-php\r
+LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi.\r
+\r
+== LICENSING ==\r
+\r
+Copyright (C) 2010 by Dominik Dzienia \r
+\r
+This library is free software; you can redistribute it and/or modify it under\r
+the terms of the GNU Lesser General Public License as published by the Free\r
+Software Foundation; either version 3 of the License, or any later version.\r
+\r
+This library is distributed in the hope that it will be useful, but WITHOUT ANY\r
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\r
+PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file)\r
+for more details.\r
+\r
+You should have received a copy of the GNU Lesser General Public License along\r
+with this library; if not, write to the Free Software Foundation, Inc., 51\r
+Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+\r
+== INSTALATION AND USAGE ==\r
+\r
+ * INSTALL file\r
+ * http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page\r
+\r
+== CONTACT ==\r
+\r
+Fell free to contact me via e-mail (deltalab at poczta dot fm) or using\r
+folowing project pages:\r
+\r
+ * http://sourceforge.net/projects/phpqrcode/\r
+ * http://phpqrcode.sourceforge.net/\r
+ \r
+== ACKNOWLEDGMENTS ==\r
+\r
+Based on C libqrencode library (ver. 3.1.1) \r
+Copyright (C) 2006-2010 by Kentaro Fukuchi\r
+http://megaui.net/fukuchi/works/qrencode/index.en.html\r
+\r
+QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other\r
+countries.\r
+\r
+Reed-Solomon code encoder is written by Phil Karn, KA9Q.\r
+Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q\r
+
\ No newline at end of file
--- /dev/null
+1.1.4\r
+2010100721
\ No newline at end of file
--- /dev/null
+<?php
+//============================================================+
+// File name : qrcode.php
+// Begin : 2010-03-22
+// Last Update : 2010-03-29
+// Version : 1.0.002
+// License : GNU LGPL v.3 (http://www.gnu.org/copyleft/lesser.html)
+// ----------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 3 of the License, or any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+// or browse http://www.gnu.org/copyleft/lesser.html
+//
+// ----------------------------------------------------------------------------
+//
+// DESCRIPTION :
+//
+// Class to create QR-code arrays for TCPDF class.
+// QR Code symbol is a 2D barcode that can be scanned by
+// handy terminals such as a mobile phone with CCD.
+// The capacity of QR Code is up to 7000 digits or 4000
+// characters, and has high robustness.
+// This class supports QR Code model 2, described in
+// JIS (Japanese Industrial Standards) X0510:2004
+// or ISO/IEC 18004.
+// Currently the following features are not supported:
+// ECI and FNC1 mode, Micro QR Code, QR Code model 1,
+// Structured mode.
+//
+// This class is derived from the following projects:
+// ---------------------------------------------------------
+// "PHP QR Code encoder"
+// License: GNU-LGPLv3
+// Copyright (C) 2010 by Dominik Dzienia <deltalab at poczta dot fm>
+// http://phpqrcode.sourceforge.net/
+// https://sourceforge.net/projects/phpqrcode/
+//
+// The "PHP QR Code encoder" is based on
+// "C libqrencode library" (ver. 3.1.1)
+// License: GNU-LGPL 2.1
+// Copyright (C) 2006-2010 by Kentaro Fukuchi
+// http://megaui.net/fukuchi/works/qrencode/index.en.html
+//
+// Reed-Solomon code encoder is written by Phil Karn, KA9Q.
+// Copyright (C) 2002-2006 Phil Karn, KA9Q
+//
+// QR Code is registered trademark of DENSO WAVE INCORPORATED
+// http://www.denso-wave.com/qrcode/index-e.html
+// ---------------------------------------------------------
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright 2010:
+// Nicola Asuni
+// Tecnick.com S.r.l.
+// Via della Pace, 11
+// 09044 Quartucciu (CA)
+// ITALY
+// www.tecnick.com
+// info@tecnick.com
+//============================================================+
+
+/**
+ * Class to create QR-code arrays for TCPDF class.
+ * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
+ * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
+ * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
+ * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
+ *
+ * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
+ * Please read comments on this class source file for full copyright and license information.
+ *
+ * @package com.tecnick.tcpdf
+ * @abstract Class for generating QR-code array for TCPDF.
+ * @author Nicola Asuni
+ * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ * @version 1.0.002
+ */
+
+// definitions
+if (!defined('QRCODEDEFS')) {
+
+ /**
+ * Indicate that definitions for this class are set
+ */
+ define('QRCODEDEFS', true);
+
+ // -----------------------------------------------------
+
+ // Encoding modes (characters which can be encoded in QRcode)
+
+ /**
+ * Encoding mode
+ */
+ define('QR_MODE_NL', -1);
+
+ /**
+ * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_NM', 0);
+
+ /**
+ * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_AN', 1);
+
+ /**
+ * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_8B', 2);
+
+ /**
+ * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_KJ', 3);
+
+ /**
+ * Encoding mode STRUCTURED (currently unsupported)
+ */
+ define('QR_MODE_ST', 4);
+
+ // -----------------------------------------------------
+
+ // Levels of error correction.
+ // QRcode has a function of an error correcting for miss reading that white is black.
+ // Error correcting is defined in 4 level as below.
+
+ /**
+ * Error correction level L : About 7% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_L', 0);
+
+ /**
+ * Error correction level M : About 15% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_M', 1);
+
+ /**
+ * Error correction level Q : About 25% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_Q', 2);
+
+ /**
+ * Error correction level H : About 30% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_H', 3);
+
+ // -----------------------------------------------------
+
+ // Version. Size of QRcode is defined as version.
+ // Version is from 1 to 40.
+ // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases.
+ // So version 40 is 177*177 matrix.
+
+ /**
+ * Maximum QR Code version.
+ */
+ define('QRSPEC_VERSION_MAX', 40);
+
+ /**
+ * Maximum matrix size for maximum version (version 40 is 177*177 matrix).
+ */
+ define('QRSPEC_WIDTH_MAX', 177);
+
+ // -----------------------------------------------------
+
+ /**
+ * Matrix index to get width from $capacity array.
+ */
+ define('QRCAP_WIDTH', 0);
+
+ /**
+ * Matrix index to get number of words from $capacity array.
+ */
+ define('QRCAP_WORDS', 1);
+
+ /**
+ * Matrix index to get remainder from $capacity array.
+ */
+ define('QRCAP_REMINDER', 2);
+
+ /**
+ * Matrix index to get error correction level from $capacity array.
+ */
+ define('QRCAP_EC', 3);
+
+ // -----------------------------------------------------
+
+ // Structure (currently usupported)
+
+ /**
+ * Number of header bits for structured mode
+ */
+ define('STRUCTURE_HEADER_BITS', 20);
+
+ /**
+ * Max number of symbols for structured mode
+ */
+ define('MAX_STRUCTURED_SYMBOLS', 16);
+
+ // -----------------------------------------------------
+
+ // Masks
+
+ /**
+ * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column)
+ */
+ define('N1', 3);
+
+ /**
+ * Down point base value for case 2 mask pattern (module block of same color)
+ */
+ define('N2', 3);
+
+ /**
+ * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column)
+ */
+ define('N3', 40);
+
+ /**
+ * Down point base value for case 4 mask pattern (ration of dark modules in whole)
+ */
+ define('N4', 10);
+
+ // -----------------------------------------------------
+
+ // Optimization settings
+
+ /**
+ * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+ */
+ define('QR_FIND_BEST_MASK', true);
+
+ /**
+ * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+ */
+ define('QR_FIND_FROM_RANDOM', 2);
+
+ /**
+ * when QR_FIND_BEST_MASK === false
+ */
+ define('QR_DEFAULT_MASK', 2);
+
+ // -----------------------------------------------------
+
+} // end of definitions
+
+// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
+
+if (!class_exists('QRcode', false)) {
+
+ // for compaibility with PHP4
+ if (!function_exists('str_split')) {
+ /**
+ * Convert a string to an array (needed for PHP4 compatibility)
+ * @param string $string The input string.
+ * @param int $split_length Maximum length of the chunk.
+ * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element.
+ */
+ function str_split($string, $split_length=1) {
+ if ((strlen($string) > $split_length) OR (!$split_length)) {
+ do {
+ $c = strlen($string);
+ $parts[] = substr($string, 0, $split_length);
+ $string = substr($string, $split_length);
+ } while ($string !== false);
+ } else {
+ $parts = array($string);
+ }
+ return $parts;
+ }
+ }
+
+ // #####################################################
+
+ /**
+ * Class to create QR-code arrays for TCPDF class.
+ * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
+ * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
+ * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
+ * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
+ *
+ * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
+ * Please read comments on this class source file for full copyright and license information.
+ *
+ * @name QRcode
+ * @package com.tecnick.tcpdf
+ * @abstract Class for generating QR-code array for TCPDF.
+ * @author Nicola Asuni
+ * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ * @version 1.0.002
+ */
+ class QRcode {
+
+ /**
+ * @var barcode array to be returned which is readable by TCPDF
+ * @access protected
+ */
+ protected $barcode_array = array();
+
+ /**
+ * @var QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix.
+ * @access protected
+ */
+ protected $version = 0;
+
+ /**
+ * @var Levels of error correction. See definitions for possible values.
+ * @access protected
+ */
+ protected $level = QR_ECLEVEL_L;
+
+ /**
+ * @var Encoding mode
+ * @access protected
+ */
+ protected $hint = QR_MODE_8B;
+
+ /**
+ * @var if true the input string will be converted to uppercase
+ * @access protected
+ */
+ protected $casesensitive = true;
+
+ /**
+ * @var structured QR code (not supported yet)
+ * @access protected
+ */
+ protected $structured = 0;
+
+ /**
+ * @var mask data
+ * @access protected
+ */
+ protected $data;
+
+ // FrameFiller
+
+ /**
+ * @var width
+ * @access protected
+ */
+ protected $width;
+
+ /**
+ * @var frame
+ * @access protected
+ */
+ protected $frame;
+
+ /**
+ * @var X position of bit
+ * @access protected
+ */
+ protected $x;
+
+ /**
+ * @var Y position of bit
+ * @access protected
+ */
+ protected $y;
+
+ /**
+ * @var direction
+ * @access protected
+ */
+ protected $dir;
+
+ /**
+ * @var single bit
+ * @access protected
+ */
+ protected $bit;
+
+ // ---- QRrawcode ----
+
+ /**
+ * @var data code
+ * @access protected
+ */
+ protected $datacode = array();
+
+ /**
+ * @var error correction code
+ * @access protected
+ */
+ protected $ecccode = array();
+
+ /**
+ * @var blocks
+ * @access protected
+ */
+ protected $blocks;
+
+ /**
+ * @var Reed-Solomon blocks
+ * @access protected
+ */
+ protected $rsblocks = array(); //of RSblock
+
+ /**
+ * @var counter
+ * @access protected
+ */
+ protected $count;
+
+ /**
+ * @var data length
+ * @access protected
+ */
+ protected $dataLength;
+
+ /**
+ * @var error correction length
+ * @access protected
+ */
+ protected $eccLength;
+
+ /**
+ * @var b1
+ * @access protected
+ */
+ protected $b1;
+
+ // ---- QRmask ----
+
+ /**
+ * @var run length
+ * @access protected
+ */
+ protected $runLength = array();
+
+ // ---- QRsplit ----
+
+ /**
+ * @var input data string
+ * @access protected
+ */
+ protected $dataStr = '';
+
+ /**
+ * @var input items
+ * @access protected
+ */
+ protected $items;
+
+ // Reed-Solomon items
+
+ /**
+ * @var Reed-Solomon items
+ * @access protected
+ */
+ protected $rsitems = array();
+
+ /**
+ * @var array of frames
+ * @access protected
+ */
+ protected $frames = array();
+
+ /**
+ * @var alphabet-numeric convesion table
+ * @access protected
+ */
+ protected $anTable = array(
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, //
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, //
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, //
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, //
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 //
+ );
+
+ /**
+ * @var array Table of the capacity of symbols
+ * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
+ * @access protected
+ */
+ protected $capacity = array(
+ array( 0, 0, 0, array( 0, 0, 0, 0)), //
+ array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
+ array( 25, 44, 7, array( 10, 16, 22, 28)), //
+ array( 29, 70, 7, array( 15, 26, 36, 44)), //
+ array( 33, 100, 7, array( 20, 36, 52, 64)), //
+ array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
+ array( 41, 172, 7, array( 36, 64, 96, 112)), //
+ array( 45, 196, 0, array( 40, 72, 108, 130)), //
+ array( 49, 242, 0, array( 48, 88, 132, 156)), //
+ array( 53, 292, 0, array( 60, 110, 160, 192)), //
+ array( 57, 346, 0, array( 72, 130, 192, 224)), // 10
+ array( 61, 404, 0, array( 80, 150, 224, 264)), //
+ array( 65, 466, 0, array( 96, 176, 260, 308)), //
+ array( 69, 532, 0, array( 104, 198, 288, 352)), //
+ array( 73, 581, 3, array( 120, 216, 320, 384)), //
+ array( 77, 655, 3, array( 132, 240, 360, 432)), // 15
+ array( 81, 733, 3, array( 144, 280, 408, 480)), //
+ array( 85, 815, 3, array( 168, 308, 448, 532)), //
+ array( 89, 901, 3, array( 180, 338, 504, 588)), //
+ array( 93, 991, 3, array( 196, 364, 546, 650)), //
+ array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20
+ array(101, 1156, 4, array( 224, 442, 644, 750)), //
+ array(105, 1258, 4, array( 252, 476, 690, 816)), //
+ array(109, 1364, 4, array( 270, 504, 750, 900)), //
+ array(113, 1474, 4, array( 300, 560, 810, 960)), //
+ array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25
+ array(121, 1706, 4, array( 336, 644, 952, 1110)), //
+ array(125, 1828, 4, array( 360, 700, 1020, 1200)), //
+ array(129, 1921, 3, array( 390, 728, 1050, 1260)), //
+ array(133, 2051, 3, array( 420, 784, 1140, 1350)), //
+ array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30
+ array(141, 2323, 3, array( 480, 868, 1290, 1530)), //
+ array(145, 2465, 3, array( 510, 924, 1350, 1620)), //
+ array(149, 2611, 3, array( 540, 980, 1440, 1710)), //
+ array(153, 2761, 3, array( 570, 1036, 1530, 1800)), //
+ array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35
+ array(161, 3034, 0, array( 600, 1120, 1680, 1980)), //
+ array(165, 3196, 0, array( 630, 1204, 1770, 2100)), //
+ array(169, 3362, 0, array( 660, 1260, 1860, 2220)), //
+ array(173, 3532, 0, array( 720, 1316, 1950, 2310)), //
+ array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40
+ );
+
+ /**
+ * @var array Length indicator
+ * @access protected
+ */
+ protected $lengthTableBits = array(
+ array(10, 12, 14),
+ array( 9, 11, 13),
+ array( 8, 16, 16),
+ array( 8, 10, 12)
+ );
+
+ /**
+ * @var array Table of the error correction code (Reed-Solomon block)
+ * See Table 12-16 (pp.30-36), JIS X0510:2004.
+ * @access protected
+ */
+ protected $eccTable = array(
+ array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), //
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), //
+ array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), //
+ array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), //
+ array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
+ array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), //
+ array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), //
+ array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), //
+ array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), //
+ array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10
+ array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), //
+ array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), //
+ array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), //
+ array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), //
+ array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15
+ array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), //
+ array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), //
+ array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), //
+ array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), //
+ array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20
+ array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), //
+ array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), //
+ array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), //
+ array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), //
+ array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), //
+ array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), //
+ array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), //
+ array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), //
+ array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30
+ array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), //
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), //
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), //
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), //
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35
+ array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), //
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), //
+ array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), //
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), //
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40
+ );
+
+ /**
+ * @var array Positions of alignment patterns.
+ * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them.
+ * See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
+ * @access protected
+ */
+ protected $alignmentPattern = array(
+ array( 0, 0),
+ array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40
+ );
+
+ /**
+ * @var array Version information pattern (BCH coded).
+ * See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
+ * size: [QRSPEC_VERSION_MAX - 6]
+ * @access protected
+ */
+ protected $versionPattern = array(
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, //
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, //
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, //
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, //
+ 0x27541, 0x28c69
+ );
+
+ /**
+ * @var array Format information
+ * @access protected
+ */
+ protected $formatInfo = array(
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), //
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), //
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), //
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) //
+ );
+
+
+ // -------------------------------------------------
+ // -------------------------------------------------
+
+
+ /**
+ * This is the class constructor.
+ * Creates a QRcode object
+ * @param string $code code to represent using QRcode
+ * @param string $eclevel error level: <ul><li>L : About 7% or less errors can be corrected.</li><li>M : About 15% or less errors can be corrected.</li><li>Q : About 25% or less errors can be corrected.</li><li>H : About 30% or less errors can be corrected.</li></ul>
+ * @access public
+ * @since 1.0.000
+ */
+ public function __construct($code, $eclevel = 'L') {
+ $barcode_array = array();
+ if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
+ return false;
+ }
+ // set error correction level
+ $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H'));
+ if ($this->level === false) {
+ $this->level = QR_ECLEVEL_L;
+ }
+ if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) {
+ return false;
+ }
+ if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) {
+ return false;
+ }
+ $this->items = array();
+ $this->encodeString($code);
+ $qrTab = $this->binarize($this->data);
+ $size = count($qrTab);
+ $barcode_array['num_rows'] = $size;
+ $barcode_array['num_cols'] = $size;
+ $barcode_array['bcode'] = array();
+ foreach ($qrTab as $line) {
+ $arrAdd = array();
+ foreach (str_split($line) as $char) {
+ $arrAdd[] = ($char=='1')?1:0;
+ }
+ $barcode_array['bcode'][] = $arrAdd;
+ }
+ $this->barcode_array = $barcode_array;
+ }
+
+ /**
+ * Returns a barcode array which is readable by TCPDF
+ * @return array barcode array readable by TCPDF;
+ * @access public
+ */
+ public function getBarcodeArray() {
+ return $this->barcode_array;
+ }
+
+ /**
+ * Convert the frame in binary form
+ * @param array $frame array to binarize
+ * @return array frame in binary form
+ */
+ protected function binarize($frame) {
+ $len = count($frame);
+ // the frame is square (width = height)
+ foreach ($frame as &$frameLine) {
+ for ($i=0; $i<$len; $i++) {
+ $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
+ }
+ }
+ return $frame;
+ }
+
+ /**
+ * Encode the input string to QR code
+ * @param string $string input string to encode
+ */
+ protected function encodeString($string) {
+ $this->dataStr = $string;
+ if (!$this->casesensitive) {
+ $this->toUpper();
+ }
+ $ret = $this->splitString();
+ if ($ret < 0) {
+ return NULL;
+ }
+ $this->encodeMask(-1);
+ }
+
+ /**
+ * Encode mask
+ * @param int $mask masking mode
+ */
+ protected function encodeMask($mask) {
+ $spec = array(0, 0, 0, 0, 0);
+ $this->datacode = $this->getByteStream($this->items);
+ if (is_null($this->datacode)) {
+ return NULL;
+ }
+ $spec = $this->getEccSpec($this->version, $this->level, $spec);
+ $this->b1 = $this->rsBlockNum1($spec);
+ $this->dataLength = $this->rsDataLength($spec);
+ $this->eccLength = $this->rsEccLength($spec);
+ $this->ecccode = array_fill(0, $this->eccLength, 0);
+ $this->blocks = $this->rsBlockNum($spec);
+ $ret = $this->init($spec);
+ if ($ret < 0) {
+ return NULL;
+ }
+ $this->count = 0;
+ $this->width = $this->getWidth($this->version);
+ $this->frame = $this->newFrame($this->version);
+ $this->x = $this->width - 1;
+ $this->y = $this->width - 1;
+ $this->dir = -1;
+ $this->bit = -1;
+ // inteleaved data and ecc codes
+ for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) {
+ $code = $this->getCode();
+ $bit = 0x80;
+ for ($j=0; $j<8; $j++) {
+ $addr = $this->getNextPosition();
+ $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
+ $bit = $bit >> 1;
+ }
+ }
+ // remainder bits
+ $j = $this->getRemainder($this->version);
+ for ($i=0; $i<$j; $i++) {
+ $addr = $this->getNextPosition();
+ $this->setFrameAt($addr, 0x02);
+ }
+ // masking
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
+ if ($mask < 0) {
+ if (QR_FIND_BEST_MASK) {
+ $masked = $this->mask($this->width, $this->frame, $this->level);
+ } else {
+ $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level);
+ }
+ } else {
+ $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level);
+ }
+ if ($masked == NULL) {
+ return NULL;
+ }
+ $this->data = $masked;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // FrameFiller
+
+ /**
+ * Set frame value at specified position
+ * @param array $at x,y position
+ * @param int $val value of the character to set
+ */
+ protected function setFrameAt($at, $val) {
+ $this->frame[$at['y']][$at['x']] = chr($val);
+ }
+
+ /**
+ * Get frame value at specified position
+ * @param array $at x,y position
+ * @return value at specified position
+ */
+ protected function getFrameAt($at) {
+ return ord($this->frame[$at['y']][$at['x']]);
+ }
+
+ /**
+ * Return the next frame position
+ * @return array of x,y coordinates
+ */
+ protected function getNextPosition() {
+ do {
+ if ($this->bit == -1) {
+ $this->bit = 0;
+ return array('x'=>$this->x, 'y'=>$this->y);
+ }
+ $x = $this->x;
+ $y = $this->y;
+ $w = $this->width;
+ if ($this->bit == 0) {
+ $x--;
+ $this->bit++;
+ } else {
+ $x++;
+ $y += $this->dir;
+ $this->bit--;
+ }
+ if ($this->dir < 0) {
+ if ($y < 0) {
+ $y = 0;
+ $x -= 2;
+ $this->dir = 1;
+ if ($x == 6) {
+ $x--;
+ $y = 9;
+ }
+ }
+ } else {
+ if ($y == $w) {
+ $y = $w - 1;
+ $x -= 2;
+ $this->dir = -1;
+ if ($x == 6) {
+ $x--;
+ $y -= 8;
+ }
+ }
+ }
+ if (($x < 0) OR ($y < 0)) {
+ return NULL;
+ }
+ $this->x = $x;
+ $this->y = $y;
+ } while(ord($this->frame[$y][$x]) & 0x80);
+ return array('x'=>$x, 'y'=>$y);
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRrawcode
+
+ /**
+ * Initialize code.
+ * @param array $spec array of ECC specification
+ * @return 0 in case of success, -1 in case of error
+ */
+ protected function init($spec) {
+ $dl = $this->rsDataCodes1($spec);
+ $el = $this->rsEccCodes1($spec);
+ $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+ $blockNo = 0;
+ $dataPos = 0;
+ $eccPos = 0;
+ $endfor = $this->rsBlockNum1($spec);
+ for ($i=0; $i < $endfor; ++$i) {
+ $ecc = array_slice($this->ecccode, $eccPos);
+ $this->rsblocks[$blockNo] = array();
+ $this->rsblocks[$blockNo]['dataLength'] = $dl;
+ $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
+ $this->rsblocks[$blockNo]['eccLength'] = $el;
+ $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
+ $this->rsblocks[$blockNo]['ecc'] = $ecc;
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+ if ($this->rsBlockNum2($spec) == 0) {
+ return 0;
+ }
+ $dl = $this->rsDataCodes2($spec);
+ $el = $this->rsEccCodes2($spec);
+ $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+ if ($rs == NULL) {
+ return -1;
+ }
+ $endfor = $this->rsBlockNum2($spec);
+ for ($i=0; $i < $endfor; ++$i) {
+ $ecc = array_slice($this->ecccode, $eccPos);
+ $this->rsblocks[$blockNo] = array();
+ $this->rsblocks[$blockNo]['dataLength'] = $dl;
+ $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
+ $this->rsblocks[$blockNo]['eccLength'] = $el;
+ $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
+ $this->rsblocks[$blockNo]['ecc'] = $ecc;
+ $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+ return 0;
+ }
+
+ /**
+ * Return Reed-Solomon block code.
+ * @return array rsblocks
+ */
+ protected function getCode() {
+ if ($this->count < $this->dataLength) {
+ $row = $this->count % $this->blocks;
+ $col = $this->count / $this->blocks;
+ if ($col >= $this->rsblocks[0]['dataLength']) {
+ $row += $this->b1;
+ }
+ $ret = $this->rsblocks[$row]['data'][$col];
+ } elseif ($this->count < $this->dataLength + $this->eccLength) {
+ $row = ($this->count - $this->dataLength) % $this->blocks;
+ $col = ($this->count - $this->dataLength) / $this->blocks;
+ $ret = $this->rsblocks[$row]['ecc'][$col];
+ } else {
+ return 0;
+ }
+ $this->count++;
+ return $ret;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRmask
+
+ /**
+ * Write Format Information on frame and returns the number of black bits
+ * @param int $width frame width
+ * @param array $frame frame
+ * @param array $mask masking mode
+ * @param int $level error correction level
+ * @return int blacks
+ */
+ protected function writeFormatInformation($width, &$frame, $mask, $level) {
+ $blacks = 0;
+ $format = $this->getFormatInfo($mask, $level);
+ for ($i=0; $i<8; ++$i) {
+ if ($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+ $frame[8][$width - 1 - $i] = chr($v);
+ if ($i < 6) {
+ $frame[$i][8] = chr($v);
+ } else {
+ $frame[$i + 1][8] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+ for ($i=0; $i<7; ++$i) {
+ if ($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+ $frame[$width - 7 + $i][8] = chr($v);
+ if ($i == 0) {
+ $frame[8][7] = chr($v);
+ } else {
+ $frame[8][6 - $i] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+ return $blacks;
+ }
+
+ /**
+ * mask0
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask0($x, $y) {
+ return ($x + $y) & 1;
+ }
+
+ /**
+ * mask1
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask1($x, $y) {
+ return ($y & 1);
+ }
+
+ /**
+ * mask2
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask2($x, $y) {
+ return ($x % 3);
+ }
+
+ /**
+ * mask3
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask3($x, $y) {
+ return ($x + $y) % 3;
+ }
+
+ /**
+ * mask4
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask4($x, $y) {
+ return (((int)($y / 2)) + ((int)($x / 3))) & 1;
+ }
+
+ /**
+ * mask5
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask5($x, $y) {
+ return (($x * $y) & 1) + ($x * $y) % 3;
+ }
+
+ /**
+ * mask6
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask6($x, $y) {
+ return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
+ }
+
+ /**
+ * mask7
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask7($x, $y) {
+ return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
+ }
+
+ /**
+ * Return bitmask
+ * @param int $maskNo mask number
+ * @param int $width width
+ * @param array $frame frame
+ * @return array bitmask
+ */
+ protected function generateMaskNo($maskNo, $width, $frame) {
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+ for ($y=0; $y<$width; ++$y) {
+ for ($x=0; $x<$width; ++$x) {
+ if (ord($frame[$y][$x]) & 0x80) {
+ $bitMask[$y][$x] = 0;
+ } else {
+ $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
+ $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
+ }
+ }
+ }
+ return $bitMask;
+ }
+
+ /**
+ * makeMaskNo
+ * @param int $maskNo
+ * @param int $width
+ * @param int $s
+ * @param int $d
+ * @param boolean $maskGenOnly
+ * @return int b
+ */
+ protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) {
+ $b = 0;
+ $bitMask = array();
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ if ($maskGenOnly) {
+ return;
+ }
+ $d = $s;
+ for ($y=0; $y<$width; ++$y) {
+ for ($x=0; $x<$width; ++$x) {
+ if ($bitMask[$y][$x] == 1) {
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
+ }
+ $b += (int)(ord($d[$y][$x]) & 1);
+ }
+ }
+ return $b;
+ }
+
+ /**
+ * makeMask
+ * @param int $width
+ * @param array $frame
+ * @param int $maskNo
+ * @param int $level
+ * @return array mask
+ */
+ protected function makeMask($width, $frame, $maskNo, $level) {
+ $masked = array_fill(0, $width, str_repeat("\0", $width));
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);
+ return $masked;
+ }
+
+ /**
+ * calcN1N3
+ * @param int $length
+ * @return int demerit
+ */
+ protected function calcN1N3($length) {
+ $demerit = 0;
+ for ($i=0; $i<$length; ++$i) {
+ if ($this->runLength[$i] >= 5) {
+ $demerit += (N1 + ($this->runLength[$i] - 5));
+ }
+ if ($i & 1) {
+ if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) {
+ $fact = (int)($this->runLength[$i] / 3);
+ if (($this->runLength[$i-2] == $fact)
+ AND ($this->runLength[$i-1] == $fact)
+ AND ($this->runLength[$i+1] == $fact)
+ AND ($this->runLength[$i+2] == $fact)) {
+ if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) {
+ $demerit += N3;
+ } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) {
+ $demerit += N3;
+ }
+ }
+ }
+ }
+ }
+ return $demerit;
+ }
+
+ /**
+ * evaluateSymbol
+ * @param int $width
+ * @param array $frame
+ * @return int demerit
+ */
+ protected function evaluateSymbol($width, $frame) {
+ $head = 0;
+ $demerit = 0;
+ for ($y=0; $y<$width; ++$y) {
+ $head = 0;
+ $this->runLength[0] = 1;
+ $frameY = $frame[$y];
+ if ($y > 0) {
+ $frameYM = $frame[$y-1];
+ }
+ for ($x=0; $x<$width; ++$x) {
+ if (($x > 0) AND ($y > 0)) {
+ $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
+ $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
+ if (($b22 | ($w22 ^ 1)) & 1) {
+ $demerit += N2;
+ }
+ }
+ if (($x == 0) AND (ord($frameY[$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } elseif ($x > 0) {
+ if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+ $demerit += $this->calcN1N3($head+1);
+ }
+ for ($x=0; $x<$width; ++$x) {
+ $head = 0;
+ $this->runLength[0] = 1;
+ for ($y=0; $y<$width; ++$y) {
+ if (($y == 0) AND (ord($frame[$y][$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } elseif ($y > 0) {
+ if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+ $demerit += $this->calcN1N3($head+1);
+ }
+ return $demerit;
+ }
+
+ /**
+ * mask
+ * @param int $width
+ * @param array $frame
+ * @param int $level
+ * @return array best mask
+ */
+ protected function mask($width, $frame, $level) {
+ $minDemerit = PHP_INT_MAX;
+ $bestMaskNum = 0;
+ $bestMask = array();
+ $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
+ if (QR_FIND_FROM_RANDOM !== false) {
+ $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
+ for ($i = 0; $i < $howManuOut; ++$i) {
+ $remPos = rand (0, count($checked_masks)-1);
+ unset($checked_masks[$remPos]);
+ $checked_masks = array_values($checked_masks);
+ }
+ }
+ $bestMask = $frame;
+ foreach ($checked_masks as $i) {
+ $mask = array_fill(0, $width, str_repeat("\0", $width));
+ $demerit = 0;
+ $blacks = 0;
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
+ $blacks = (int)(100 * $blacks / ($width * $width));
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
+ $demerit += $this->evaluateSymbol($width, $mask);
+ if ($demerit < $minDemerit) {
+ $minDemerit = $demerit;
+ $bestMask = $mask;
+ $bestMaskNum = $i;
+ }
+ }
+ return $bestMask;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRsplit
+
+ /**
+ * Return true if the character at specified position is a number
+ * @param string $str string
+ * @param int $pos characted position
+ * @return boolean true of false
+ */
+ protected function isdigitat($str, $pos) {
+ if ($pos >= strlen($str)) {
+ return false;
+ }
+ return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
+ }
+
+ /**
+ * Return true if the character at specified position is an alphanumeric character
+ * @param string $str string
+ * @param int $pos characted position
+ * @return boolean true of false
+ */
+ protected function isalnumat($str, $pos) {
+ if ($pos >= strlen($str)) {
+ return false;
+ }
+ return ($this->lookAnTable(ord($str[$pos])) >= 0);
+ }
+
+ /**
+ * identifyMode
+ * @param int $pos
+ * @return int mode
+ */
+ protected function identifyMode($pos) {
+ if ($pos >= strlen($this->dataStr)) {
+ return QR_MODE_NL;
+ }
+ $c = $this->dataStr[$pos];
+ if ($this->isdigitat($this->dataStr, $pos)) {
+ return QR_MODE_NM;
+ } elseif ($this->isalnumat($this->dataStr, $pos)) {
+ return QR_MODE_AN;
+ } elseif ($this->hint == QR_MODE_KJ) {
+ if ($pos+1 < strlen($this->dataStr)) {
+ $d = $this->dataStr[$pos+1];
+ $word = (ord($c) << 8) | ord($d);
+ if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) {
+ return QR_MODE_KJ;
+ }
+ }
+ }
+ return QR_MODE_8B;
+ }
+
+ /**
+ * eatNum
+ * @return int run
+ */
+ protected function eatNum() {
+ $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+ $p = 0;
+ while($this->isdigitat($this->dataStr, $p)) {
+ $p++;
+ }
+ $run = $p;
+ $mode = $this->identifyMode($p);
+ if ($mode == QR_MODE_8B) {
+ $dif = $this->estimateBitsModeNum($run) + 4 + $ln
+ + $this->estimateBitsMode8(1) // + 4 + l8
+ - $this->estimateBitsMode8($run + 1); // - 4 - l8
+ if ($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ if ($mode == QR_MODE_AN) {
+ $dif = $this->estimateBitsModeNum($run) + 4 + $ln
+ + $this->estimateBitsModeAn(1) // + 4 + la
+ - $this->estimateBitsModeAn($run + 1);// - 4 - la
+ if ($dif > 0) {
+ return $this->eatAn();
+ }
+ }
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * eatAn
+ * @return int run
+ */
+ protected function eatAn() {
+ $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
+ $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+ $p = 0;
+ while($this->isalnumat($this->dataStr, $p)) {
+ if ($this->isdigitat($this->dataStr, $p)) {
+ $q = $p;
+ while($this->isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = $this->estimateBitsModeAn($p) // + 4 + la
+ + $this->estimateBitsModeNum($q - $p) + 4 + $ln
+ - $this->estimateBitsModeAn($q); // - 4 - la
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+ $run = $p;
+ if (!$this->isalnumat($this->dataStr, $p)) {
+ $dif = $this->estimateBitsModeAn($run) + 4 + $la
+ + $this->estimateBitsMode8(1) // + 4 + l8
+ - $this->estimateBitsMode8($run + 1); // - 4 - l8
+ if ($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * eatKanji
+ * @return int run
+ */
+ protected function eatKanji() {
+ $p = 0;
+ while($this->identifyMode($p) == QR_MODE_KJ) {
+ $p += 2;
+ }
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * eat8
+ * @return int run
+ */
+ protected function eat8() {
+ $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
+ $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+ $p = 1;
+ $dataStrLen = strlen($this->dataStr);
+ while($p < $dataStrLen) {
+ $mode = $this->identifyMode($p);
+ if ($mode == QR_MODE_KJ) {
+ break;
+ }
+ if ($mode == QR_MODE_NM) {
+ $q = $p;
+ while($this->isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = $this->estimateBitsMode8($p) // + 4 + l8
+ + $this->estimateBitsModeNum($q - $p) + 4 + $ln
+ - $this->estimateBitsMode8($q); // - 4 - l8
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } elseif ($mode == QR_MODE_AN) {
+ $q = $p;
+ while($this->isalnumat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = $this->estimateBitsMode8($p) // + 4 + l8
+ + $this->estimateBitsModeAn($q - $p) + 4 + $la
+ - $this->estimateBitsMode8($q); // - 4 - l8
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+ $run = $p;
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * splitString
+ */
+ protected function splitString() {
+ while (strlen($this->dataStr) > 0) {
+ if ($this->dataStr == '') {
+ return 0;
+ }
+ $mode = $this->identifyMode(0);
+ switch ($mode) {
+ case QR_MODE_NM: {
+ $length = $this->eatNum();
+ break;
+ }
+ case QR_MODE_AN: {
+ $length = $this->eatAn();
+ break;
+ }
+ case QR_MODE_KJ: {
+ if ($hint == QR_MODE_KJ) {
+ $length = $this->eatKanji();
+ } else {
+ $length = $this->eat8();
+ }
+ break;
+ }
+ default: {
+ $length = $this->eat8();
+ break;
+ }
+ }
+ if ($length == 0) {
+ return 0;
+ }
+ if ($length < 0) {
+ return -1;
+ }
+ $this->dataStr = substr($this->dataStr, $length);
+ }
+ }
+
+ /**
+ * toUpper
+ */
+ protected function toUpper() {
+ $stringLen = strlen($this->dataStr);
+ $p = 0;
+ while ($p < $stringLen) {
+ $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint);
+ if ($mode == QR_MODE_KJ) {
+ $p += 2;
+ } else {
+ if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) {
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
+ }
+ $p++;
+ }
+ }
+ return $this->dataStr;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRinputItem
+
+ /**
+ * newInputItem
+ * @param int $mode
+ * @param int $size
+ * @param array $data
+ * @param array $bstream
+ * @return array input item
+ */
+ protected function newInputItem($mode, $size, $data, $bstream=null) {
+ $setData = array_slice($data, 0, $size);
+ if (count($setData) < $size) {
+ $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0));
+ }
+ if (!$this->check($mode, $size, $setData)) {
+ return NULL;
+ }
+ $inputitem = array();
+ $inputitem['mode'] = $mode;
+ $inputitem['size'] = $size;
+ $inputitem['data'] = $setData;
+ $inputitem['bstream'] = $bstream;
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeNum
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeModeNum($inputitem, $version) {
+ $words = (int)($inputitem['size'] / 3);
+ $inputitem['bstream'] = array();
+ $val = 0x1;
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']);
+ for ($i=0; $i < $words; ++$i) {
+ $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100;
+ $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10;
+ $val += (ord($inputitem['data'][$i*3+2]) - ord('0'));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val);
+ }
+ if ($inputitem['size'] - $words * 3 == 1) {
+ $val = ord($inputitem['data'][$words*3]) - ord('0');
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
+ } elseif (($inputitem['size'] - ($words * 3)) == 2) {
+ $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10;
+ $val += (ord($inputitem['data'][$words*3+1]) - ord('0'));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val);
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeAn
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeModeAn($inputitem, $version) {
+ $words = (int)($inputitem['size'] / 2);
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02);
+ $inputitem['bstream'] = $this->appendNum(v, $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']);
+ for ($i=0; $i < $words; ++$i) {
+ $val = (int)$this->lookAnTable(ord($inputitem['data'][$i*2 ])) * 45;
+ $val += (int)$this->lookAnTable(ord($inputitem['data'][$i*2+1]));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val);
+ }
+ if ($inputitem['size'] & 1) {
+ $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)]));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val);
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeMode8
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeMode8($inputitem, $version) {
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']);
+ for ($i=0; $i < $inputitem['size']; ++$i) {
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i]));
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeKanji
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeModeKanji($inputitem, $version) {
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2));
+ for ($i=0; $i<$inputitem['size']; $i+=2) {
+ $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]);
+ if ($val <= 0x9ffc) {
+ $val -= 0x8140;
+ } else {
+ $val -= 0xc140;
+ }
+ $h = ($val >> 8) * 0xc0;
+ $val = ($val & 0xff) + $h;
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val);
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeStructure
+ * @param array $inputitem
+ * @return array input item
+ */
+ protected function encodeModeStructure($inputitem) {
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2]));
+ return $inputitem;
+ }
+
+ /**
+ * encodeBitStream
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeBitStream($inputitem, $version) {
+ $inputitem['bstream'] = array();
+ $words = $this->maximumWords($inputitem['mode'], $version);
+ if ($inputitem['size'] > $words) {
+ $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']);
+ $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words));
+ $st1 = $this->encodeBitStream($st1, $version);
+ $st2 = $this->encodeBitStream($st2, $version);
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']);
+ $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']);
+ } else {
+ switch($inputitem['mode']) {
+ case QR_MODE_NM: {
+ $inputitem = $this->encodeModeNum($inputitem, $version);
+ break;
+ }
+ case QR_MODE_AN: {
+ $inputitem = $this->encodeModeAn($inputitem, $version);
+ break;
+ }
+ case QR_MODE_8B: {
+ $inputitem = $this->encodeMode8($inputitem, $version);
+ break;
+ }
+ case QR_MODE_KJ: {
+ $inputitem = $this->encodeModeKanji($inputitem, $version);
+ break;
+ }
+ case QR_MODE_ST: {
+ $inputitem = $this->encodeModeStructure($inputitem);
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ }
+ return $inputitem;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRinput
+
+ /**
+ * Append data to an input object.
+ * The data is copied and appended to the input object.
+ * @param array items input items
+ * @param int $mode encoding mode.
+ * @param int $size size of data (byte).
+ * @param array $data array of input data.
+ * @return items
+ *
+ */
+ protected function appendNewInputItem($items, $mode, $size, $data) {
+ $items[] = $this->newInputItem($mode, $size, $data);
+ return $items;
+ }
+
+ /**
+ * insertStructuredAppendHeader
+ * @param array $items
+ * @param int $size
+ * @param int $index
+ * @param int $parity
+ * @return array items
+ */
+ protected function insertStructuredAppendHeader($items, $size, $index, $parity) {
+ if ($size > MAX_STRUCTURED_SYMBOLS) {
+ return -1;
+ }
+ if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) {
+ return -1;
+ }
+ $buf = array($size, $index, $parity);
+ $entry = $this->newInputItem(QR_MODE_ST, 3, buf);
+ array_unshift($items, $entry);
+ return $items;
+ }
+
+ /**
+ * calcParity
+ * @param array $items
+ * @return int parity
+ */
+ protected function calcParity($items) {
+ $parity = 0;
+ foreach ($items as $item) {
+ if ($item['mode'] != QR_MODE_ST) {
+ for ($i=$item['size']-1; $i>=0; --$i) {
+ $parity ^= $item['data'][$i];
+ }
+ }
+ }
+ return $parity;
+ }
+
+ /**
+ * checkModeNum
+ * @param int $size
+ * @param array $data
+ * @return boolean true or false
+ */
+ protected function checkModeNum($size, $data) {
+ for ($i=0; $i<$size; ++$i) {
+ if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * estimateBitsModeNum
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsModeNum($size) {
+ $w = (int)$size / 3;
+ $bits = $w * 10;
+ switch($size - $w * 3) {
+ case 1: {
+ $bits += 4;
+ break;
+ }
+ case 2: {
+ $bits += 7;
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ return $bits;
+ }
+
+ /**
+ * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19).
+ * @param int $c character value
+ * @return value
+ */
+ protected function lookAnTable($c) {
+ return (($c > 127)?-1:$this->anTable[$c]);
+ }
+
+ /**
+ * checkModeAn
+ * @param int $size
+ * @param array $data
+ * @return boolean true or false
+ */
+ protected function checkModeAn($size, $data) {
+ for ($i=0; $i<$size; ++$i) {
+ if ($this->lookAnTable(ord($data[$i])) == -1) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * estimateBitsModeAn
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsModeAn($size) {
+ $w = (int)($size / 2);
+ $bits = $w * 11;
+ if ($size & 1) {
+ $bits += 6;
+ }
+ return $bits;
+ }
+
+ /**
+ * estimateBitsMode8
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsMode8($size) {
+ return $size * 8;
+ }
+
+ /**
+ * estimateBitsModeKanji
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsModeKanji($size) {
+ return (int)(($size / 2) * 13);
+ }
+
+ /**
+ * checkModeKanji
+ * @param int $size
+ * @param array $data
+ * @return boolean true or false
+ */
+ protected function checkModeKanji($size, $data) {
+ if ($size & 1) {
+ return false;
+ }
+ for ($i=0; $i<$size; $i+=2) {
+ $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
+ if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Validate the input data.
+ * @param int $mode encoding mode.
+ * @param int $size size of data (byte).
+ * @param array data data to validate
+ * @return boolean true in case of valid data, false otherwise
+ */
+ protected function check($mode, $size, $data) {
+ if ($size <= 0) {
+ return false;
+ }
+ switch($mode) {
+ case QR_MODE_NM: {
+ return $this->checkModeNum($size, $data);
+ }
+ case QR_MODE_AN: {
+ return $this->checkModeAn($size, $data);
+ }
+ case QR_MODE_KJ: {
+ return $this->checkModeKanji($size, $data);
+ }
+ case QR_MODE_8B: {
+ return true;
+ }
+ case QR_MODE_ST: {
+ return true;
+ }
+ default: {
+ break;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * estimateBitStreamSize
+ * @param array $items
+ * @param int $version
+ * @return int bits
+ */
+ protected function estimateBitStreamSize($items, $version) {
+ $bits = 0;
+ if ($version == 0) {
+ $version = 1;
+ }
+ foreach ($items as $item) {
+ switch($item['mode']) {
+ case QR_MODE_NM: {
+ $bits = $this->estimateBitsModeNum($item['size']);
+ break;
+ }
+ case QR_MODE_AN: {
+ $bits = $this->estimateBitsModeAn($item['size']);
+ break;
+ }
+ case QR_MODE_8B: {
+ $bits = $this->estimateBitsMode8($item['size']);
+ break;
+ }
+ case QR_MODE_KJ: {
+ $bits = $this->estimateBitsModeKanji($item['size']);
+ break;
+ }
+ case QR_MODE_ST: {
+ return STRUCTURE_HEADER_BITS;
+ }
+ default: {
+ return 0;
+ }
+ }
+ $l = $this->lengthIndicator($item['mode'], $version);
+ $m = 1 << $l;
+ $num = (int)(($item['size'] + $m - 1) / $m);
+ $bits += $num * (4 + $l);
+ }
+ return $bits;
+ }
+
+ /**
+ * estimateVersion
+ * @param array $items
+ * @return int version
+ */
+ protected function estimateVersion($items) {
+ $version = 0;
+ $prev = 0;
+ do {
+ $prev = $version;
+ $bits = $this->estimateBitStreamSize($items, $prev);
+ $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($version < 0) {
+ return -1;
+ }
+ } while ($version > $prev);
+ return $version;
+ }
+
+ /**
+ * lengthOfCode
+ * @param int $mode
+ * @param int $version
+ * @param int $bits
+ * @return int size
+ */
+ protected function lengthOfCode($mode, $version, $bits) {
+ $payload = $bits - 4 - $this->lengthIndicator($mode, $version);
+ switch($mode) {
+ case QR_MODE_NM: {
+ $chunks = (int)($payload / 10);
+ $remain = $payload - $chunks * 10;
+ $size = $chunks * 3;
+ if ($remain >= 7) {
+ $size += 2;
+ } elseif ($remain >= 4) {
+ $size += 1;
+ }
+ break;
+ }
+ case QR_MODE_AN: {
+ $chunks = (int)($payload / 11);
+ $remain = $payload - $chunks * 11;
+ $size = $chunks * 2;
+ if ($remain >= 6) {
+ ++$size;
+ }
+ break;
+ }
+ case QR_MODE_8B: {
+ $size = (int)($payload / 8);
+ break;
+ }
+ case QR_MODE_KJ: {
+ $size = (int)(($payload / 13) * 2);
+ break;
+ }
+ case QR_MODE_ST: {
+ $size = (int)($payload / 8);
+ break;
+ }
+ default: {
+ $size = 0;
+ break;
+ }
+ }
+ $maxsize = $this->maximumWords($mode, $version);
+ if ($size < 0) {
+ $size = 0;
+ }
+ if ($size > $maxsize) {
+ $size = $maxsize;
+ }
+ return $size;
+ }
+
+ /**
+ * createBitStream
+ * @param array $items
+ * @return array of items and total bits
+ */
+ protected function createBitStream($items) {
+ $total = 0;
+ foreach ($items as $key => $item) {
+ $items[$key] = $this->encodeBitStream($item, $this->version);
+ $bits = count($items[$key]['bstream']);
+ $total += $bits;
+ }
+ return array($items, $total);
+ }
+
+ /**
+ * convertData
+ * @param array $items
+ * @return array items
+ */
+ protected function convertData($items) {
+ $ver = $this->estimateVersion($items);
+ if ($ver > $this->version) {
+ $this->version = $ver;
+ }
+ for (;;) {
+ $cbs = $this->createBitStream($items);
+ $items = $cbs[0];
+ $bits = $cbs[1];
+ if ($bits < 0) {
+ return -1;
+ }
+ $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($ver < 0) {
+ return -1;
+ } elseif ($ver > $this->version) {
+ $this->version = $ver;
+ } else {
+ break;
+ }
+ }
+ return $items;
+ }
+
+ /**
+ * Append Padding Bit to bitstream
+ * @param array $bstream
+ * @return array bitstream
+ */
+ protected function appendPaddingBit($bstream) {
+ $bits = count($bstream);
+ $maxwords = $this->getDataLength($this->version, $this->level);
+ $maxbits = $maxwords * 8;
+ if ($maxbits == $bits) {
+ return 0;
+ }
+ if ($maxbits - $bits < 5) {
+ return $this->appendNum($bstream, $maxbits - $bits, 0);
+ }
+ $bits += 4;
+ $words = (int)(($bits + 7) / 8);
+ $padding = array();
+ $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0);
+ $padlen = $maxwords - $words;
+ if ($padlen > 0) {
+ $padbuf = array();
+ for ($i=0; $i<$padlen; ++$i) {
+ $padbuf[$i] = ($i&1)?0x11:0xec;
+ }
+ $padding = $this->appendBytes($padding, $padlen, $padbuf);
+ }
+ return $this->appendBitstream($bstream, $padding);
+ }
+
+ /**
+ * mergeBitStream
+ * @param array $bstream
+ * @return array bitstream
+ */
+ protected function mergeBitStream($items) {
+ $items = $this->convertData($items);
+ $bstream = array();
+ foreach ($items as $item) {
+ $bstream = $this->appendBitstream($bstream, $item['bstream']);
+ }
+ return $bstream;
+ }
+
+ /**
+ * Returns a stream of bits.
+ * @param int $items
+ * @return array padded merged byte stream
+ */
+ protected function getBitStream($items) {
+ $bstream = $this->mergeBitStream($items);
+ return $this->appendPaddingBit($bstream);
+ }
+
+ /**
+ * Pack all bit streams padding bits into a byte array.
+ * @param int $items
+ * @return array padded merged byte stream
+ */
+ protected function getByteStream($items) {
+ $bstream = $this->getBitStream($items);
+ return $this->bitstreamToByte($bstream);
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRbitstream
+
+ /**
+ * Return an array with zeros
+ * @param int $setLength array size
+ * @return array
+ */
+ protected function allocate($setLength) {
+ return array_fill(0, $setLength, 0);
+ }
+
+ /**
+ * Return new bitstream from number
+ * @param int $bits number of bits
+ * @param int $num number
+ * @return array bitstream
+ */
+ protected function newFromNum($bits, $num) {
+ $bstream = $this->allocate($bits);
+ $mask = 1 << ($bits - 1);
+ for ($i=0; $i<$bits; ++$i) {
+ if ($num & $mask) {
+ $bstream[$i] = 1;
+ } else {
+ $bstream[$i] = 0;
+ }
+ $mask = $mask >> 1;
+ }
+ return $bstream;
+ }
+
+ /**
+ * Return new bitstream from bytes
+ * @param int $size size
+ * @param array $data bytes
+ * @return array bitstream
+ */
+ protected function newFromBytes($size, $data) {
+ $bstream = $this->allocate($size * 8);
+ $p=0;
+ for ($i=0; $i<$size; ++$i) {
+ $mask = 0x80;
+ for ($j=0; $j<8; ++$j) {
+ if ($data[$i] & $mask) {
+ $bstream[$p] = 1;
+ } else {
+ $bstream[$p] = 0;
+ }
+ $p++;
+ $mask = $mask >> 1;
+ }
+ }
+ return $bstream;
+ }
+
+ /**
+ * Append one bitstream to another
+ * @param array $bitstream original bitstream
+ * @param array $append bitstream to append
+ * @return array bitstream
+ */
+ protected function appendBitstream($bitstream, $append) {
+ if ((!is_array($append)) OR (count($append) == 0)) {
+ return $bitstream;
+ }
+ if (count($bitstream) == 0) {
+ return $append;
+ }
+ return array_values(array_merge($bitstream, $append));
+ }
+
+ /**
+ * Append one bitstream created from number to another
+ * @param array $bitstream original bitstream
+ * @param int $bits number of bits
+ * @param int $num number
+ * @return array bitstream
+ */
+ protected function appendNum($bitstream, $bits, $num) {
+ if ($bits == 0) {
+ return 0;
+ }
+ $b = $this->newFromNum($bits, $num);
+ return $this->appendBitstream($bitstream, $b);
+ }
+
+ /**
+ * Append one bitstream created from bytes to another
+ * @param array $bitstream original bitstream
+ * @param int $size size
+ * @param array $data bytes
+ * @return array bitstream
+ */
+ protected function appendBytes($bitstream, $size, $data) {
+ if ($size == 0) {
+ return 0;
+ }
+ $b = $this->newFromBytes($size, $data);
+ return $this->appendBitstream($bitstream, $b);
+ }
+
+ /**
+ * Convert bitstream to bytes
+ * @param array $bitstream original bitstream
+ * @return array of bytes
+ */
+ protected function bitstreamToByte($bstream) {
+ $size = count($bstream);
+ if ($size == 0) {
+ return array();
+ }
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);
+ $bytes = (int)($size / 8);
+ $p = 0;
+ for ($i=0; $i<$bytes; $i++) {
+ $v = 0;
+ for ($j=0; $j<8; $j++) {
+ $v = $v << 1;
+ $v |= $bstream[$p];
+ $p++;
+ }
+ $data[$i] = $v;
+ }
+ if ($size & 7) {
+ $v = 0;
+ for ($j=0; $j<($size & 7); $j++) {
+ $v = $v << 1;
+ $v |= $bstream[$p];
+ $p++;
+ }
+ $data[$bytes] = $v;
+ }
+ return $data;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRspec
+
+ /**
+ * Replace a value on the array at the specified position
+ * @param array $srctab
+ * @param int $x X position
+ * @param int $y Y position
+ * @param string $repl value to replace
+ * @param int $replLen length of the repl string
+ * @return array srctab
+ */
+ protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) {
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
+ return $srctab;
+ }
+
+ /**
+ * Return maximum data code length (bytes) for the version.
+ * @param int $version version
+ * @param int $level error correction level
+ * @return int maximum size (bytes)
+ */
+ protected function getDataLength($version, $level) {
+ return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level];
+ }
+
+ /**
+ * Return maximum error correction code length (bytes) for the version.
+ * @param int $version version
+ * @param int $level error correction level
+ * @return int ECC size (bytes)
+ */
+ protected function getECCLength($version, $level){
+ return $this->capacity[$version][QRCAP_EC][$level];
+ }
+
+ /**
+ * Return the width of the symbol for the version.
+ * @param int $version version
+ * @return int width
+ */
+ protected function getWidth($version) {
+ return $this->capacity[$version][QRCAP_WIDTH];
+ }
+
+ /**
+ * Return the numer of remainder bits.
+ * @param int $version version
+ * @return int number of remainder bits
+ */
+ protected function getRemainder($version) {
+ return $this->capacity[$version][QRCAP_REMINDER];
+ }
+
+ /**
+ * Return a version number that satisfies the input code length.
+ * @param int $size input code length (byte)
+ * @param int $level error correction level
+ * @return int version number
+ */
+ protected function getMinimumVersion($size, $level) {
+ for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) {
+ $words = $this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level];
+ if ($words >= $size) {
+ return $i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Return the size of length indicator for the mode and version.
+ * @param int $mode encoding mode
+ * @param int $version version
+ * @return int the size of the appropriate length indicator (bits).
+ */
+ protected function lengthIndicator($mode, $version) {
+ if ($mode == QR_MODE_ST) {
+ return 0;
+ }
+ if ($version <= 9) {
+ $l = 0;
+ } elseif ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+ return $this->lengthTableBits[$mode][$l];
+ }
+
+ /**
+ * Return the maximum length for the mode and version.
+ * @param int $mode encoding mode
+ * @param int $version version
+ * @return int the maximum length (bytes)
+ */
+ protected function maximumWords($mode, $version) {
+ if ($mode == QR_MODE_ST) {
+ return 3;
+ }
+ if ($version <= 9) {
+ $l = 0;
+ } else if ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+ $bits = $this->lengthTableBits[$mode][$l];
+ $words = (1 << $bits) - 1;
+ if ($mode == QR_MODE_KJ) {
+ $words *= 2; // the number of bytes is required
+ }
+ return $words;
+ }
+
+ /**
+ * Return an array of ECC specification.
+ * @param int $version version
+ * @param int $level error correction level
+ * @param array $spec an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code}
+ * @return array spec
+ */
+ protected function getEccSpec($version, $level, $spec) {
+ if (count($spec) < 5) {
+ $spec = array(0, 0, 0, 0, 0);
+ }
+ $b1 = $this->eccTable[$version][$level][0];
+ $b2 = $this->eccTable[$version][$level][1];
+ $data = $this->getDataLength($version, $level);
+ $ecc = $this->getECCLength($version, $level);
+ if ($b2 == 0) {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / $b1);
+ $spec[2] = (int)($ecc / $b1);
+ $spec[3] = 0;
+ $spec[4] = 0;
+ } else {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / ($b1 + $b2));
+ $spec[2] = (int)($ecc / ($b1 + $b2));
+ $spec[3] = $b2;
+ $spec[4] = $spec[1] + 1;
+ }
+ return $spec;
+ }
+
+ /**
+ * Put an alignment marker.
+ * @param array $frame frame
+ * @param int $width width
+ * @param int $ox X center coordinate of the pattern
+ * @param int $oy Y center coordinate of the pattern
+ * @return array frame
+ */
+ protected function putAlignmentMarker($frame, $ox, $oy) {
+ $finder = array(
+ "\xa1\xa1\xa1\xa1\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa0\xa1\xa0\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa1\xa1\xa1\xa1"
+ );
+ $yStart = $oy - 2;
+ $xStart = $ox - 2;
+ for ($y=0; $y < 5; $y++) {
+ $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]);
+ }
+ return $frame;
+ }
+
+ /**
+ * Put an alignment pattern.
+ * @param int $version version
+ * @param array $fram frame
+ * @param int $width width
+ * @return array frame
+ */
+ protected function putAlignmentPattern($version, $frame, $width) {
+ if ($version < 2) {
+ return $frame;
+ }
+ $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0];
+ if ($d < 0) {
+ $w = 2;
+ } else {
+ $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2);
+ }
+ if ($w * $w - 3 == 1) {
+ $x = $this->alignmentPattern[$version][0];
+ $y = $this->alignmentPattern[$version][0];
+ $frame = $this->putAlignmentMarker($frame, $x, $y);
+ return $frame;
+ }
+ $cx = $this->alignmentPattern[$version][0];
+ $wo = $w - 1;
+ for ($x=1; $x < $wo; ++$x) {
+ $frame = $this->putAlignmentMarker($frame, 6, $cx);
+ $frame = $this->putAlignmentMarker($frame, $cx, 6);
+ $cx += $d;
+ }
+ $cy = $this->alignmentPattern[$version][0];
+ for ($y=0; $y < $wo; ++$y) {
+ $cx = $this->alignmentPattern[$version][0];
+ for ($x=0; $x < $wo; ++$x) {
+ $frame = $this->putAlignmentMarker($frame, $cx, $cy);
+ $cx += $d;
+ }
+ $cy += $d;
+ }
+ return $frame;
+ }
+
+ /**
+ * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits.
+ * @param int $version version
+ * @return BCH encoded version information pattern
+ */
+ protected function getVersionPattern($version) {
+ if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) {
+ return 0;
+ }
+ return $this->versionPattern[($version - 7)];
+ }
+
+ /**
+ * Return BCH encoded format information pattern.
+ * @param array $mask
+ * @param int $level error correction level
+ * @return BCH encoded format information pattern
+ */
+ protected function getFormatInfo($mask, $level) {
+ if (($mask < 0) OR ($mask > 7)) {
+ return 0;
+ }
+ if (($level < 0) OR ($level > 3)) {
+ return 0;
+ }
+ return $this->formatInfo[$level][$mask];
+ }
+
+ /**
+ * Put a finder pattern.
+ * @param array $frame frame
+ * @param int $width width
+ * @param int $ox X center coordinate of the pattern
+ * @param int $oy Y center coordinate of the pattern
+ * @return array frame
+ */
+ protected function putFinderPattern($frame, $ox, $oy) {
+ $finder = array(
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
+ );
+ for ($y=0; $y < 7; $y++) {
+ $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]);
+ }
+ return $frame;
+ }
+
+ /**
+ * Return a copy of initialized frame.
+ * @param int $version version
+ * @return Array of unsigned char.
+ */
+ protected function createFrame($version) {
+ $width = $this->capacity[$version][QRCAP_WIDTH];
+ $frameLine = str_repeat ("\0", $width);
+ $frame = array_fill(0, $width, $frameLine);
+ // Finder pattern
+ $frame = $this->putFinderPattern($frame, 0, 0);
+ $frame = $this->putFinderPattern($frame, $width - 7, 0);
+ $frame = $this->putFinderPattern($frame, 0, $width - 7);
+ // Separator
+ $yOffset = $width - 7;
+ for ($y=0; $y < 7; ++$y) {
+ $frame[$y][7] = "\xc0";
+ $frame[$y][$width - 8] = "\xc0";
+ $frame[$yOffset][7] = "\xc0";
+ ++$yOffset;
+ }
+ $setPattern = str_repeat("\xc0", 8);
+ $frame = $this->qrstrset($frame, 0, 7, $setPattern);
+ $frame = $this->qrstrset($frame, $width-8, 7, $setPattern);
+ $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern);
+ // Format info
+ $setPattern = str_repeat("\x84", 9);
+ $frame = $this->qrstrset($frame, 0, 8, $setPattern);
+ $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8);
+ $yOffset = $width - 8;
+ for ($y=0; $y < 8; ++$y,++$yOffset) {
+ $frame[$y][8] = "\x84";
+ $frame[$yOffset][8] = "\x84";
+ }
+ // Timing pattern
+ $wo = $width - 15;
+ for ($i=1; $i < $wo; ++$i) {
+ $frame[6][7+$i] = chr(0x90 | ($i & 1));
+ $frame[7+$i][6] = chr(0x90 | ($i & 1));
+ }
+ // Alignment pattern
+ $frame = $this->putAlignmentPattern($version, $frame, $width);
+ // Version information
+ if ($version >= 7) {
+ $vinf = $this->getVersionPattern($version);
+ $v = $vinf;
+ for ($x=0; $x<6; ++$x) {
+ for ($y=0; $y<3; ++$y) {
+ $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ $v = $vinf;
+ for ($y=0; $y<6; ++$y) {
+ for ($x=0; $x<3; ++$x) {
+ $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ }
+ // and a little bit...
+ $frame[$width - 8][8] = "\x81";
+ return $frame;
+ }
+
+ /**
+ * Set new frame for the specified version.
+ * @param int $version version
+ * @return Array of unsigned char.
+ */
+ protected function newFrame($version) {
+ if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) {
+ return NULL;
+ }
+ if (!isset($this->frames[$version])) {
+ $this->frames[$version] = $this->createFrame($version);
+ }
+ if (is_null($this->frames[$version])) {
+ return NULL;
+ }
+ return $this->frames[$version];
+ }
+
+ /**
+ * Return block number 0
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsBlockNum($spec) {
+ return ($spec[0] + $spec[3]);
+ }
+
+ /**
+ * Return block number 1
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsBlockNum1($spec) {
+ return $spec[0];
+ }
+
+ /**
+ * Return data codes 1
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsDataCodes1($spec) {
+ return $spec[1];
+ }
+
+ /**
+ * Return ecc codes 1
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsEccCodes1($spec) {
+ return $spec[2];
+ }
+
+ /**
+ * Return block number 2
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsBlockNum2($spec) {
+ return $spec[3];
+ }
+
+ /**
+ * Return data codes 2
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsDataCodes2($spec) {
+ return $spec[4];
+ }
+
+ /**
+ * Return ecc codes 2
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsEccCodes2($spec) {
+ return $spec[2];
+ }
+
+ /**
+ * Return data length
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsDataLength($spec) {
+ return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);
+ }
+
+ /**
+ * Return ecc length
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsEccLength($spec) {
+ return ($spec[0] + $spec[3]) * $spec[2];
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRrs
+
+ /**
+ * Initialize a Reed-Solomon codec and add it to existing rsitems
+ * @param int $symsize symbol size, bits
+ * @param int $gfpoly Field generator polynomial coefficients
+ * @param int $fcr first root of RS code generator polynomial, index form
+ * @param int $prim primitive element to generate polynomial roots
+ * @param int $nroots RS code generator polynomial degree (number of roots)
+ * @param int $pad padding bytes at front of shortened block
+ * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
+ */
+ protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
+ foreach ($this->rsitems as $rs) {
+ if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize)
+ OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) {
+ continue;
+ }
+ return $rs;
+ }
+ $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
+ array_unshift($this->rsitems, $rs);
+ return $rs;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRrsItem
+
+ /**
+ * modnn
+ * @param array RS values
+ * @param int $x X position
+ * @return int X osition
+ */
+ protected function modnn($rs, $x) {
+ while ($x >= $rs['nn']) {
+ $x -= $rs['nn'];
+ $x = ($x >> $rs['mm']) + ($x & $rs['nn']);
+ }
+ return $x;
+ }
+
+ /**
+ * Initialize a Reed-Solomon codec and returns an array of values.
+ * @param int $symsize symbol size, bits
+ * @param int $gfpoly Field generator polynomial coefficients
+ * @param int $fcr first root of RS code generator polynomial, index form
+ * @param int $prim primitive element to generate polynomial roots
+ * @param int $nroots RS code generator polynomial degree (number of roots)
+ * @param int $pad padding bytes at front of shortened block
+ * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
+ */
+ protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
+ // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2)
+ $rs = null;
+ // Check parameter ranges
+ if (($symsize < 0) OR ($symsize > 8)) {
+ return $rs;
+ }
+ if (($fcr < 0) OR ($fcr >= (1<<$symsize))) {
+ return $rs;
+ }
+ if (($prim <= 0) OR ($prim >= (1<<$symsize))) {
+ return $rs;
+ }
+ if (($nroots < 0) OR ($nroots >= (1<<$symsize))) {
+ return $rs;
+ }
+ if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) {
+ return $rs;
+ }
+ $rs = array();
+ $rs['mm'] = $symsize;
+ $rs['nn'] = (1 << $symsize) - 1;
+ $rs['pad'] = $pad;
+ $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0);
+ $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0);
+ // PHP style macro replacement ;)
+ $NN =& $rs['nn'];
+ $A0 =& $NN;
+ // Generate Galois field lookup tables
+ $rs['index_of'][0] = $A0; // log(zero) = -inf
+ $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0
+ $sr = 1;
+ for ($i=0; $i<$rs['nn']; ++$i) {
+ $rs['index_of'][$sr] = $i;
+ $rs['alpha_to'][$i] = $sr;
+ $sr <<= 1;
+ if ($sr & (1 << $symsize)) {
+ $sr ^= $gfpoly;
+ }
+ $sr &= $rs['nn'];
+ }
+ if ($sr != 1) {
+ // field generator polynomial is not primitive!
+ return NULL;
+ }
+ // Form RS code generator polynomial from its roots
+ $rs['genpoly'] = array_fill(0, ($nroots + 1), 0);
+ $rs['fcr'] = $fcr;
+ $rs['prim'] = $prim;
+ $rs['nroots'] = $nroots;
+ $rs['gfpoly'] = $gfpoly;
+ // Find prim-th root of 1, used in decoding
+ for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) {
+ ; // intentional empty-body loop!
+ }
+ $rs['iprim'] = (int)($iprim / $prim);
+ $rs['genpoly'][0] = 1;
+
+
+ for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
+ $rs['genpoly'][$i+1] = 1;
+ // Multiply rs->genpoly[] by @**(root + x)
+ for ($j = $i; $j > 0; --$j) {
+ if ($rs['genpoly'][$j] != 0) {
+ $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)];
+ } else {
+ $rs['genpoly'][$j] = $rs['genpoly'][$j-1];
+ }
+ }
+ // rs->genpoly[0] can never be zero
+ $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)];
+ }
+ // convert rs->genpoly[] to index form for quicker encoding
+ for ($i = 0; $i <= $nroots; ++$i) {
+ $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]];
+ }
+ return $rs;
+ }
+
+ /**
+ * Encode a Reed-Solomon codec and returns the parity array
+ * @param array $rs RS values
+ * @param array $data data
+ * @param array $parity parity
+ * @return parity array
+ */
+ protected function encode_rs_char($rs, $data, $parity) {
+ $MM =& $rs['mm']; // bits per symbol
+ $NN =& $rs['nn']; // the total number of symbols in a RS block
+ $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form
+ $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form
+ $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form
+ $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block
+ $FCR =& $rs['fcr']; // first consecutive root, index form
+ $PRIM =& $rs['prim']; // primitive element, index form
+ $IPRIM =& $rs['iprim']; // prim-th root of 1, index form
+ $PAD =& $rs['pad']; // the number of pad symbols in a block
+ $A0 =& $NN;
+ $parity = array_fill(0, $NROOTS, 0);
+ for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) {
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
+ if ($feedback != $A0) {
+ // feedback term is non-zero
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
+ // always be for the polynomials constructed by init_rs()
+ $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback);
+ for ($j=1; $j < $NROOTS; ++$j) {
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])];
+ }
+ }
+ // Shift
+ array_shift($parity);
+ if ($feedback != $A0) {
+ array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]);
+ } else {
+ array_push($parity, 0);
+ }
+ }
+ return $parity;
+ }
+
+ } // end QRcode class
+
+} // END OF "class_exists QRcode"
+?>
--- /dev/null
+xÚ\9d\90Á\rÀ \bE9³u\13\ 6\90\8d`³"PÅ\84CÛç\89\97\1f\ 4T\1d!0$
+E\95ɲQ\99\9dÉm½úhÛ¾9\ 3\ f{k\ 6I"\9b 9Ln)Ap\ 6\1c¤åÖ¾Ë>ß^\87Õz³mënÅ\96;ü´mßn\86\eú\ 4¦Ë
\ No newline at end of file
--- /dev/null
+xÚí\99A\ e\84 \fE]sëIX´;¸\ 1Ü\ 4n6\80È`\82q\94êê\7fW6ñå¥\ 4\9a`\8c%A/3!¢°\82¢\8a!g\96ÈÌ¡\92\121\eN\13)\13\véE¢Ï\19|;®\97>6â¸\8fÞ97$\ eëÄôëc]kkö\8fwé1Öü[·mCÍ\9ccÊ\ 6RºÄê¹>¦è\1aµ¾\9aE,\95hÅ\89p\84#\1cáxF\1c\9dyWÏÇVWGçòÕ3¼Õ+Ñ\ f\88þàË\93úS\8eâ}Ä\9e\81#\1cá\bG8b^c^cÏÀ\11\8ep\84c&\123\13YQ"\11ñ\e\8e÷çÌvµù\11\9b\85ñàÎþþ¼\96¹kÞ9\8aÜ\87÷}\94¹³ï×ú ¢Ä¿\8f\1dQäÿL\97/ÝÔÀÏ
\ No newline at end of file
--- /dev/null
+xÚí\99A
+\830\10E]çÖ\85,2;s\83ä&ÉÍ\9ah\14¥\1dÛêO¡ô\7fÝÈàã1\ 4&09OIv@DDÒ\fÌ&§\1a\14Ù\89K\8dXÈÕ\18Fv\95<\11Ádqò\169Ö<%h\95¹\e\vYïs\f!(d¥²ës;\e~||b(ÏøYůg#µ`\9cK\16 ±S¼Åô¹Ä¶\98ùs\1càidß\8dLg:Ó\99Îtþ/gmª\9d\99\83kÅ\1cMâ3³{4rTÈQýÿe¥·s·>ó<Ó\99Ît¦3\9déÌ;\12ïH¼#Ñ\99Ît¦3\9d\7fÍY\9c+o\ fg©hù¶óµÙ½¬lnðûF>Øi^»#awm;gè~pÛgìNs{6z\92\91»ã\1d\19ºïÞä\ ep¾Ê'
\ No newline at end of file
--- /dev/null
+xÚí\9aA
+Ä \fE»öÖ\ 3.ÌNo 7Ñ\9b\8d¶ii\19RÚN2\8bá\7fW%ðx\ 4Á@ÚÚ\9cê'\ 4
+u\816×ê\88.\9d*S;}\98«Òà ÏT\vúèÌ\ 5z\19\11\18r\8d\ et¹ï%ç,ÒÅÚâÎ}ç;\93âç)¹\9f\98âÝZÚîLåè¹÷¬Pçç$¯×÷\1eÏqËg\9cLÂôdJ\87;Üá\ ew¸Ãý.]z#\9f¾«[Í\9d½ïOg\82Æô"ÐË áBí\17î¦}Ç}\87;Üá\ ew¸Ã\1dî\98#1Gb\8e\84;Üá\ ew¸Ãý_ÝC\ f\ 5+w¢@Dfî\1d\1f\ 4÷ïç\99u\9dø2\99ÅÚÉNþû9R\7f7|pWßkïû®¿\93ßß\19kºö¿\10\aºú\7f\1c»¼\ 1\ 2\1cÎÓ
\ No newline at end of file
--- /dev/null
+xÚÍ\92Í\rÀ \bF{vë&\f \eà&°Y+?Z1öÐS\9f'y!¢\9fÌ\ 2Áa\90\16815&£\95Û´\8eÙHå£Ù\9ec³\95l«ÏFÆè1\12\b\ 5º\ 1#é6\1f\vfÊÖü©§6Äø\95O7\88¨\86C¦\15«\9bðÖ\8f\9e\90Ï8gI®ÏöfB¦ÃÄÿæ\DÔ»(
\ No newline at end of file
--- /dev/null
+xÚí\9aA\ e\84 \fE]sëIX´;¹\ 1Ü\ 4n6Up\82\13\8d\93в\99ÿ]Ù\98þ<\vi\17-eWö\8b¶\98)×äÅ\95¼ÉÂ\85H\jvqÙHL\6\96\9aÝÐ\85\7frI\9b\ 6¢LܹÜÕ%Å\18Ó@´þ±V\97vÆÂúý¤(ÏP4|ÎXnÒg\11\1dÉ\9dß\15¼~]D¾ÉÕ×u1Us S\À\ 2\16°\80\ 5,ÿÅ2Þ\15\1f¢N§Ã?D\9bKºüF-:\93eJ]p_À\ 2\16°\80\ 5,\98a0Ã`\86ÁÝ\a\vXÀ\ 2\16°`\86Á\f\83\19\ 6w\1f,`\ 1\vX´]\98\88\99\82¹\8b\98°5\v\89®Y4{å±æñ2íûåvçJs\86±Ûí9±\98í)õu±Û¹êÏØ,\17«]¸\93\8bÙ^_§7$\83_Í
\ No newline at end of file
--- /dev/null
+xÚí\9aA
+\840\fE]{ë\81.\92]{\ 3{\13{³©Z¥BepÆ\14\ 6Þwe@\1f\8fV\9bERZ3»Á"*2o\804¦y\89)i#dÒbdFÒ\85´\12\8cI"ú\91\14\974\9e½W\17Iíu\8aÓ45ßx«.ZSÙ{Á\9f¯8åË\aÿk=\1c{o.±qÊÙ\ 1£[\13\9cÍ:å¸\92q»õ\83y
+)t#á\84\13N8ádCj\9d-O\9dOG}¼:/\9f:s\8fz!Å\ 6)^<ùe½·S·uâ{ '\9cp 'ú=ú=ú=¾'\9cp '\9cp¢ß£ß£ßã\1f\81\13N8á\84Óÿ9©ª\88ôp\12QQõ]H\19Ôpz¾\8fØG\9c^æ½Qº\98I|¾ß³\9du;9\99ÎïÕëd;\93Xï½\9e$ËÙÑ\13Ét\1e¶Ê\eÛédy
\ No newline at end of file
--- /dev/null
+xÚí\9aA
+Ã \10E³öÖ\ 5\17f\17o 7Ñ\9bU\8d) %M!Î\94ÂûYu(<\1e\9að\17\93sK²\93T\9c\9bÓ
+É&§\1aIÚ\i+¥Ðª\99(m®´FQ¡¹¯h±æöüèv~n1\84\10oÏ]sëçÖï¤_Þ\9f\18Ê3`î_w2õȹ\95l\10c[¼\95;·\12ÛcÖ\9fˤ\92Nóª4ÜpÃ\r7ÜpÃí\1emTÿ¸\9c\9b\91ÝêrÞiñä_\83ç¿pS=7Þ7ÜpÃ\r7ÜpÃ\8d>I\9f¤Oò-Á\r7ÜpÃ\r7ú$}\92>É·\ 47ÜpÃ\r·\7ftss\89Órs\r§åVÍÎÜÆ÷\92mýï¡Ò¹ò\87\9dÞñ}R~7ôà&¾÷º?7ù\9dÞý\9dÔ¦Iïb\1fhâ{æ»<\ 1ÀMi-
\ No newline at end of file
--- /dev/null
+xÚí\9bA\ e\83 \10E»öÖMX0;¸\81Ü\ 4nVP4ÚHSS\19»xßU3±/O´ý\vLiJ4\8f\9e±Vâ\fJC\8a%ý\896VR&\16ÃÞD\91B\9cHjDù\82\18J\ eÏ??\99¯êBlc\18DZñ½§'óUëXïUïÞ\8f0æÃywÍį÷j¬éë\98³\80\ 63Å\9b¾ë\98cj\86ù£{¨¥\12½:\11G\1cqÄ\11G\1cÿÝñø\9fûÚ\ e°N\86v;¹¶ç¬\93J\f\87ÄÐ<û\87É]\8eêëÈó\88#\8e8â\88#\8e8âH'§\93ÓÉùÍÁ\11G\1cqÄ\11G\1céätr:9Ï#\8e8â\88#\8e8âØ\93h\88\15¯NÔt\94\8c´Ö_ÝØ>t¹eëìS¯¦æ\9eù^\9d\g¯õÎQe?ùv\1duöÌoïÕ;\88\1aï>ì\88*ïwlò\ 2×\12mÑ
\ No newline at end of file
--- /dev/null
+xÚíÛA
+à \10\85á¬së\82\8b\99]r\83x\13½Y51m\ 2MÈBG
+ÿ¸*Sx|Ua\165Ƶ\82\eZ\97\8a\84-,\8e1ä²H\15ÑPÒRj\96\9aX5§®i\86©\92\7fáG©>W¥\8e\9eRïöÕ/Ëâ+uT廯å\fÏÓ¯å\97´ªuæÏ\19\ e¥Ú[Sía£[kví÷5\95+5n\1f§Á´JêÜ%\15+V¬X±bÅ\8aõ߬u'Á\a\9d±þÔû SRýå÷\9atzZ»ì+÷\15+V¬X±bÅ\8a\95Ù\9fÙ\9fÙ\9fû\8a\15+V¬X±bÅÊìÏìÏìÏ}Å\8a\15+V¬X±ö±ª¤¥ÖVI©¢ÖÖ\ 4\15\91+k«\19qÿ[úËt\1e\8e·oVZÍþvo\eNV³w\1cÇ}µ{³r<ýRÞ"\9dRÍÞ]\1dê\rW«r}
\ No newline at end of file
--- /dev/null
+xÚí\9bA
+à \10E³öÖ\85,t§7\887Ñ\9bU\8d E)i\1d7ï»*\ 3~\1ecÃüÅÄX\14ÖEBÆè°\eF\15C\96\98³6¡:&çL,å¬Mv.\8eÂÎæKg\9fÕ¸ãYMç>\9fÎí>ûmÛ\9a·?ª\95\17vô¹¾mg?\8fßÒ±Îþ³æη\1dªd\98\93\ eCµ\16¹U¦ÏIk\95Ú\7fÚE\ÕÙMs\86\19f\98a\86\19f\98a>\9c[sÓ\889쬩ެ8bö<kÕÙ7\9c}ç\86\1fk³\99§õ\99ÿ3Ì0Ã\f3Ì0Ã\f3Ìä*r\15¹\8a\Å7\ff\98a\86\19f\98a\86\19fr\15¹\8a\Å7\ff\98a\86\19f\98a\86YÆÙ\18\9dÎ\fæd\9b4\839\ekíÆÌÔÝyûX y\89g\8cØÙ)\e\9b«dw\8dnÌ¢ûU×>Ëî\94]ßöLgÉÝÁ\9b³è¾äEo\82 w1
\ No newline at end of file
--- /dev/null
+xÚíÜA\ e\83 \10\85a×Þº \8b\99\9dÜ@n\ 27+*¶\9aÖÚ4\91!Í?®J\9aðò\ 5 ³\90\94æ\8a®«]ª\1a\97ÉS\9fâTf)\96Ùs\8aIÂ"\85È\94b\9eÝ0\85\8a|\95"LuÙ¸î,\8e×E\18Ç1\6®*ÏuQÞ\11?¼>aÌÏ\85ãþñ\8eÄRõ-r\93÷n.ïê¯\8b\®T¿ü\1c:Ó*)|\13)°À\ 2\v,°À\ 2\v,þÑâêóåéx_ã¬}:^R\84\83\7fU\1aoÉ¢\89uÁ~ÁÞ\89\ 5\16X`\81\ 5\16XÐ\8fÐ\8fÐ\8fÐ\8f°_`\81\ 5\16X`\81\ 5\16XÐ\8fÐ\8fÐ\8f°_`\81\ 5\16X`\81\ 5\16XÐ\8fÐ\8fÐ\8fÐ\8f°wb\81\ 5\16X`\81\ 5\16¿¥P\15Uõö)DÔÞ"cÈ{\8bzçÎõ3ê\9bé\19<}¸ó¡^?b÷mÿÎÂì\9e\83íº°»óaû\8e´\92Âê.\90]
+³{Q6u\aáT,9
\ No newline at end of file
--- /dev/null
+xÚí\93Á\rÀ \bE{vë&\f \eà&°Y+¢b¤öÐk\9f'yù\91¤¿Ì\ 2Áa :äÀTXl\9dÞ¶$W+Ó\8fvû®î\9c¢9}gRæ¬\12@H0YPB½ÆÃEmÚÚ?û\9cÍ\ 5±ís\9cÖ"bµìt2cnÖé\86É:½\1aïºë;¿Y§\93ÃzÿQã\ 2«7¿Ô
\ No newline at end of file
--- /dev/null
+xÚíÜA\ e\83 \10\85a×Þº \vØÉ\rà&r³\82 Á´¸ªÎ4ù§«\86´yù\82Ä·!¥mV3I\8dµv!Ò\9cÖ2¢i\NSSä4EF2\8d+65Å\1f¥\89e¾þÃ/W\9cs]\9añ¾\89!\84Á?ÿpÅõû¦=S~ùüÄ\90?Ëý+þx¦Ö6r6yö\10³ÙÆ\e¹}\93Ç´\99ë×eR1-\8dW\95\ 6\el°Á\ 6\el°Á\ 6\9bûÒ\8cÞX\9fz/>Væ«·ù§:ñÒÒÄA\9a8üý-+\1amTí\eÎ\eÎbl°Á\ 6\el°Á\ 6\elè\9atMº&]\93³\18\el°Á\ 6\el°Á\ 6\eº&]\93®I×ä¼Á\ 6\el°Á\ 6\el°Á\ 6\eº&]\93®Éy\83\r6Ø`\83\r6Ø`\83ÍÝi¬uy´ØXWòè±Éi¬\7f²\19\t\86ýz\95\97\8a>\95.î\94z¾kÊß\rt²\11¿7©ß7òwJõÏ\94¶4Òw\91\9dÒ\88ßÓÖÍ\e\1885\89
\ No newline at end of file
--- /dev/null
+xÚíÜÁ
+\84 \14\85áÖ¾õ\80\8bë.ß ßDßl¬,\f¦\9aMz\89ÿ6\9b\10\86Ã\87 gcJËD;ô\1c'.®A\92Iq\9eÞ\89ÄI,Ir¢Y¨»\91ËFk\12%\89DþO\14æy|EDªD×û(LÓ\14\1e_Y\8dÊ>*ß\9a\1f\7f?aÊO\83\15¿\7fk±L_£<[\10c\97ñ¶ï>ÊcË\98õu\1cÔLIäÕ%Â\b#\8c0Â\b#\8c0Â\b#\8cÞotÑ¢\9aõµ}ÅÜ4Íf\9dv_)\89ÂE¢pú\1f\8f¬h5R·\8f8\8f8³1Â\b#\8c0Â\b#\8c0¢ÓÒié´tZÎ#\8c0Â\b#\8c0Â\b#\8c0¢ÓÒié´tZÎ#\8c0Â\b#\8c0Â\b#\8c0¢ÓÒié´tZÎl\8c0Â\b#\8c0Â\b£÷\e9q"¢ÉHÜ\9cH\99Qþ\9d\eµï"ÛÕL\1f5}-ÝÜY×¾Óê¸kì`¤â>¶z\1f鸳®þÖ4&Òp÷á!\91\8aû!«ù\ 2`¿:5
\ No newline at end of file
--- /dev/null
+xÚíÜA\ e\83 \10\85a×Þº\89\8b\99\9dÜ@n\ 27+*\1aL\ 3++Óæ\9f®\1a\12óò\ 5\89ÌbbÜ*LCï\12\91°\87\89c\fk\99H¥\1ar\9a\94j\95²\90J5Yíi~0\95_«ò\8cû×TÊTõ}å\97e©>ýö5\91b_åwÐÍ\9f?¿¤ßìæ§ÖÜù\ e\86\ýR\1daÆi+7õßW©¦\ãþw\1eLUNåL¦Â
++¬°Â
++¬°ÂêÿjßÒO\7f·\9fkcëÞñô\1dç\Ë©|%\95o<á\8bk\96Lî+Î+Îv¬°Â
++¬°Â
++¬°Â\8a>\ 3}\ 6ú\fô\198¯°Â
++¬°Â
++¬°Â
++ú\fô\19è3Ðgà¼Â
++¬°Â
++¬°Â
++¬è3Ðg Ï@\9f\81ó
++¬°Â
++¬°Â
++¬°:R\89¨ªX³ÚB\899«\94IÔ=\7fçkÞ\a\8f±o/SwçØ\98\99Ù¯Ï`g¶áÅÊÌ\1cÈr_Ù\99\99Y¾\83VSY\99ÅzIefnmQoz\r>á
\ No newline at end of file
--- /dev/null
+xÚíÝAª\830\14\ 5Ð\8eÝuÁA2«;Ð\9dèÎ\1akü(ü\16g¾Ày\1d\95tp9Ä\14ï$Ëò\99¹\7fD\9c\94ò¼\ 5\ºe^'tÒ-aIº\8aFM\9aS\9akÂðIóŤÓ:7®¤|Lúk\9fNã8N7®\9cöi}ö\87×\7f\9fi,\9f[W\86¿g\7f®\13Ó´Ì\1e°ë?3ô1÷i\99¾N·}}=ÂOM:4\93\94)S¦L\992eÊ\94)S¦L#$½ÿ\rôÂJ\17ãþÂJM:}ý]\98\95ÖL\9bÙ§ÎSÿQL\992eÊ\94)S¦L\992Õ¡èPt(:\14\1d\8aó\94)S¦L\992eÊ\94)S¦:\14\1d\8a\ eE\87¢Cq\9e2eÊ\94)S¦L\992eÊ\94©\ eE\87¢CÑ¡8O\992eÊ\94)S¦L\992eÊT\87¢CÑ¡èP\9c§L\992eÊ\94)S¦L\992Ý\93¦\94sJC\13IKÖÔ\82i\11Í9\7f3\8dônº_Ñò\fÿ¾¿ü¼\93+R\87\12û®£\93ièû£\8eû4ö\9d\Çg¿¥¤\91ï\8e;%\r}\1fßaÞn\8e\1c£
\ No newline at end of file
--- /dev/null
+xÚí\94Á\rÀ \bE=»u\13\ 6Ð\rp\13ج\15Q\e\95ØCOM\9f'ÃË\8f$ ³@à\ 6¨\14Ø3e\96F©\FNX\eRyÉؾC{\89a8\17Ræ\fÅ\83\10a2@ñå\1a\9c\89\1aqkü\19ßÉH\191ê(\1d£\81\88Å`cç\12¦j\18³~Ë0ö¥¿ÃܨÖË\13ÃعnXÿGå\ 4ÿ\8dÄ\80
\ No newline at end of file
--- /dev/null
+xÚíÝA\8a\83@\10\ 5Ь½õ\80\8bî\9dÞ@o¢7\e\93\98`\93Qfeºä\95«PA>\8f¦ÀÚô<?jjo5WNiz\ 6\9d\9byºWý\89ó´&]\12ß\85C\18?\93\ 6I\9crþWâñ^;ï8·\97
+ãýs<\ eðûöS{Å9^gEß}>ã°<]ßÕÐëß³bZ«nã¥^A\9böQ}[÷9^ª]«yþìnajMÜ\87KÌ\981cÆ\8c\193fÌ\981ã¸Æ{ßW5}ç½{ÍÑ7lMßÒïÞ\9axÜI<\1e¼áK½¨Æáαyl\1e3fÌ\981cÆ\8c\193fÌ\981ã«\eÛ»Ù»\15={·\93αyl\1e3fÌ\981cÆ\8c\193fÌ\981ã«\eÛ»Ù»\15={·\93αyl\1e3fÌ\981cÆ\8c\193fÌ\981ã«\eÛ»Ù»\15={·\93αyl\1e3fÌ\981cÆ\8c\193fÌ\981ã«\eÛ»Ù»\15={·\93αyl\1e3fÌ\981cÆ\8c\193fÌ\98ñ÷\12ç\9cSÊ\91\8cÓ\927¥HÆKÞ¼g\ç¾âuõßÏ_ÿªr'4\1fÜ\19[çÞ-Æ]\9b\85q\88ûL·ç8Æ\9d±ÛY\111q\84»\8f\8bÄ!î\97ÞÔ/\17(%û
\ No newline at end of file
--- /dev/null
+xÚí\941\ eÀ \bE\9d½u\13\ e 7Ð\9bÀÍZ\ 1µ\ 3\12\87\ e\1d|N\86\97\1f\19üD\fB0@\19R$l,-\99>VKZ[<ýØÚz\97î\98\93qÆ\8e¨ØYJ\ 4&\83i\81\12å\9a\82\8bZyË:Y'ë¯YµÁVÿ&\97e\95RÄ"§sj©Ýrþö+Ëé\89ù.·MÆ\8e»\96Ó9Óòzµs\ 3\8e\94É,
\ No newline at end of file
--- /dev/null
+xÚíÚ=
+\800\f\ 6н§iï\7f9'Åb\11\87$ ¾tË\12\1eýá\eÚû^#i\9dª¥\ f\eËi?³Åô\1fÛbúK[AUØFå¾\9dƵijx]m\9f]2\8e\8d\8d\8d\8d\8d\8d-Ä\96\9dK\8e~\vÏVw}¶X\9bûÆÆÆÆÆÆÆ&O²É\93Þ\12666666yR\9e\94'½%lllll/´å\7fh\9cl\85Ãîm ¹¤ê\8fádël\99¶´3Ù+ïÛ\17m\e\e\13Í«
\ No newline at end of file
--- /dev/null
+xÚíÚ;
+\850\10\ 5Ð>«Iö¿9+Eñ\83\82sá=ϤL1\1eÌ\84[¤÷¹FáZU\8b4\1c\87\1d?i<ÿ\90ç;7\8dçòç;\87ÆP¥\8c#ý\1fW-[ñ\19ݯ6÷\8fµddddddü\11c"\ 3,;í"\9d¼\9fs\18k\8dæ\91\91\91\91\91\91\91\91Q&\97Éerw\ e######£L.¯Êäæ\91\91\91\91\91\91\91±Ð\98y\14¼1\86\e^\19˲\ò\8dîÆØ\193Æâ³ÚÓóøÏÆ \91Ñv\1a
\ No newline at end of file
--- /dev/null
+xÚíÚA
+\840\f\ 5Ð}OÓÞÿr³R,#3\bö\añ¥Ë,âÃ\ 6þ¢½o5\16\9fCµØÐq:õõÖ;;\17¬wvNÁJZGÅ\7f=\8cm\81»û}Úö\rѱ¬¬¬¬¬¬¬¬\ fµ¦2âÞi\8bRïï\ ekÆj_YYYYYYYYe\7fÙ_ö·¯¬¬¬¬¬¬¬¬²¿ì/ûÛWVVVVVVÖ\12kîáýd-\18úϺ,#¦ßÀOÖÎZc]|\87{ž¾Áú\ 1\88$\99
\ No newline at end of file
--- /dev/null
+xÚíÛ1\ e\84 \10\ 5Ð\9eÓÀý/·\95\ 6w\rYMüSø Ä8>\ 42SÐûÖF OE\ 3\8fÓÈÌÓc«W\\1dûÛ¼\9a\8b{c§æpK\9bGÕ\7f\9eB·Ð\9aþímû\8exhfffffffæ/s2\ fÛÇÚ2W|*÷d®1ÛÏÌÌÌÌÌÌÌÌÌê*5\ 6³ºÊ\19ÆÌÌÌÌÌÌÌ̬®RW©«\9caÌÌÌÌÌÌÌÌ\11söòËÁ\\14xm~8ß®¸\83r0wæjsdm÷ªýü&ó\aâyÙ\19
\ No newline at end of file
--- /dev/null
+xÚíÛA
+\80 \10\ 5н§Ñû_®\95\91TH`3AO\97\13L\8f4ü\vkí£\ 5ÍÃ(áÍÛewö\9bGWÖ\1eÙ××.í #ÃÞ2¿û¡} \ëçYú»¤´gggggggggg_d\8f>Ïïµòj^\99ÕØsíö;;;;;;;;;;»\1c'ÇÉqö;;;;;;;;;»\1c'Ë°Ëqþuìììììììì\1fµÇ_P\eì\89Íçö\97ÏóYwÄ\ 6{eÿ\9a=dÍ×ÌýþGû\ 6/ý\93¸
\ No newline at end of file
--- /dev/null
+xÚíÛ1
+Å \10\ 5ÀÞÓèý/\97*\9f\84DøEØ'Éhgõ\18tÙ-ì}_£p\1fV\8b\ 4\18· \18\"Ìb=sþ\97ÁÌå\99ó[\83ÐJ\19\8cô=8DhÅoàºÛ\9e'\16\81\ 1\ 3\ 6\f\180XÐ Ñ\1füÎÛ´\8f©è\91\18¬e \1e0`À\80\ 1\ 3\ 6\f\18\98\17ôÊ\fÌ\vj"\ 3\ 6\f\180`ÀÀ¼ Wf`^P\13\190`À\80\ 1\ 3\ 6æ\ 5½2\ 3ó\82\9aÈ\80\ 1\ 3\ 6\f\18¼Ò óÉôd\10\ e07(ì\13\93\7f<O\ 6\9dÁ\8a\ 6åo¡§ëÁ\97\r6\rÎSÞ
\ No newline at end of file
--- /dev/null
+xÚíÛ1
+\800\f\ 5н§Iï\7f9§\8a¢\14\11ÚTyí\96)<4ä\ f\8dh§N¾\87SÒ\9a¨·]°èZ\8c?¶\18[¿µH<\99\16u\85ïâÐFIø7®·´\9eRÛ`Á\82\ 5\v\16,X°ø±EÖÞ¹×Ë´]»Wg±¦\85yÁ\82\ 5\v\16,X°`!\8fØÁYÈ#æ\ 5\v\16,X°`Á\82\85<"\8fÈ#æ\ 5\v\16,X°`Á\82\85<b\ag!\8f\98\9d,X°`Á\82\ 5\8bW\16y\ fÉO\16\v4Ñ·\98¸wf¿á>Y\ 4\8b/XLÿGb\85yÁ"ê\ 6pT\1a\9d
\ No newline at end of file
--- /dev/null
+xÚíÜ1\ e\84 \10\ 5Ð\9eÓÀý/·\95+FÉZ\18?®\ fJ\9aÉ\vLæ7Ôº¬\16ØÝ*ÑBÚa%L~\9a\8cË»òä\94ÉØéÊ\93C\93ðJ\9b´YîIWJ ½\99ý.K]ñR\980aÂ\84 \93\17\9b$ç\93ïI\19NTwÎlL\9ea¢\9fè±L\980aÂ\84 \13&Ld@\19P\ 6ÔO\980aÂ\84 \13&L\980\91\ 1e@\19P?aÂ\84 \13&L\980aÂD\ 6\94\ 1e@ý\84 \13&L\980aÂäÏM²\9fIlL&)dl\12\98ígøÃacR\99<É$övê,ý\84ɺ?U2ç]
\ No newline at end of file
--- /dev/null
+xÚíÜ=
+\800\f\ 6н§iï\7f9'EÑú\ 3ÖDxÍ\98%<lð[Zë|ZPN \1f¦\1dNÃæ\91M\7fÌ7;·múfov\ em\12\9c\f6-Ów³\1a§\ 4Þ¥}\95y¶\14ã°aÃ\86\r\e6lØ°\19n\13ý_¼tÊeÒi\1fvØüËƾ±\8bÙ°aÃ\86\r\e6lØÈ\9aò\14\eYÓ.fÃ\86\r\e6lØ°a#kÊSldMû\86\r\e6lØ°aÃ\86\r\eYSÖ\945í\e6lØ°aÃ\86\r\e6\83mâ\1f\9cÙØ$\1aæÜ& 3dyãecSÙüÙ&ìNÕLû\86;&ëîº<
\ No newline at end of file
--- /dev/null
+xÚíÜ;
+\850\14\ 4Ð>«Iö¿9+EñÇ{\88\19õ$åm\86\83^\98&µ\8e§u¼³S"\ 2µÍD\8cþ6Ú\9f]9ùÉè8ìU\93M£\90\93bÔÒ¾£Y¤Òù\1f[ß2æ\8b\89Ä\88\11#F\8c\181bÄ\88\11£Ï\18%ôµiRN\9aæ½\9d\96ѳ\8dì#;\9b\11#F\8c\181bÄ\88\91N«¯1Òií#F\8c\181bÄ\88\11#F\8ctZ}\8d\91Nk\1f1bÄ\88\11#F\8c\181b¤Óêk\8ctZ;\9b\11#F\8c\181bÄèõF\19\8fV-\8cÂ\ 2\9d\euè"IoD-\8c*£7\19uû×jÚ>b´\7f\aMV\93+
\ No newline at end of file
--- /dev/null
+xÚíÜA
+\80 \10\ 5н§Ñû_®MEQXPà§\9e.Ý|\1e94³°ÖeµÁ{³JL¨v\9a\8aÕ#«^Ü÷Ïn[õ\fß?;µ
+ZIV-ñ»ÚÄ*\ 1wï¸Ë\921*\16+V¬X±bÅ\8a\15«ßX¥ü·¯g¥Ûw\8cèqX}ÇJ½RÛY±bÅ\8a\15+V¬X±beÎ wfeÎ ^±bÅ\8a\15+V¬X±bÅÊ\9cAïÌÊ\9cA½bÅ\8a\15+V¬X±bÅ\8a\959\83ÞÙ\9cÁ\9cA½bÅ\8a\15+V¬X±bÅ\8aÕl\95ó0ÞÎ*0Tßj`?\98ö\ 6ÝΪ²ú¢Õð;X\13ë\15«ë=\ 1zZr*
\ No newline at end of file
--- /dev/null
+xÚíÜ1\ e\80 \f\ 5Ð\9dÓÀý/ç¤\91h¢&F¾ú`ìÒ¼@I;Pë¼ZÀ^\12\95XÛÍ\8cÙmfÏÆ.\99=\eÛ5\v[if-õ\9cR+!wr»Ë\9cg\jÌ\981cÆ\8c\193fÌ\981c\16f\96Ôo.±2¬\ f?\8a1û\9e\99zæ\r`Æ\8c\193fÌ\981cÆ\8c\99¹\86\1e\9d\99¹\86zÆ\8c\193fÌ\981cÆ\8c\193fæ\1aztfæ\1aê\193fÌ\981cÆ\8c\193fÌ\98\99k\98k03×ð\ 60cÆ\8c\193fÌ\981cö\1a³¬Ï9;³ÐÄ\8eÍ\ 6ö\9b\89\7f`vf\95Ù\1fÌ\86ßÍ\9aZÏ\98\9dß\13\ 1¶W9
\ No newline at end of file
--- /dev/null
+xÚíÜA
+\80 \10\ 5н§Ñû_®\95Q\14R\10ù©§»Y\r\ f\1dù\ekí«\85ìÍ*q͵ÓîØ=j7§~ÙnNýÔ.p%Úµäs·i¯\ 4ÝÕã.½×ÈöرcÇ\8e\1d;vìر{Ù.-W¬õ2={\8dêì¾mgÞy+رcÇ\8e\1d;vìØɳ2\19;yÖ¼cÇ\8e\1d;vìرcÇN\9e\95ÉØɳæ\1d;vìرcÇ\8e\1d;v2\99<ËN\9eõV°cÇ\8e\1d;vìر\93ge2vò¬yÇ\8e\1d;vìرcÇî¦]Þ\aÂ;»àæÆv\ 1¹"õ\8fÞ\9d]e÷'»\98;[\93ç\1d»û{\ 1¾|Aµ
\ No newline at end of file
--- /dev/null
+xÚíÝ;
+\800\10\ 5À>§Iî\7f9+Åà\17DyÁIÊ4Ë \e÷5Ö:¯\16¶W«Ä\16Ùv«dù¢åqñß\9cÜ´<\16þæd×2x%[¶\11\9eËU\99%ðÝÞî2×\1c]&K\96,Y²dÉ\92%Ë¡,S¿Õ\97\93r2ydÌ=,ÿk©_º{X²dÉ\92%K\96,Y²d)Û0\8f³\94mè\97,Y²dÉ\92%K\96,Y²d)Û0\8f³\94mè\97,Y²dÉ\92%K\96,Y²\94m\98Çe\e,e\eú%K\96,Y²dÉ\92%K\96,e\eæq\96²\rýÒÝÃ\92%K\96,Y²dÉ\92å\85eî\8f\1e:Ë\ 1\8a<³\8c\9a!Óÿ¡ÐYV\96,\ 3ßñ:B¿dù|O¨$*#
\ No newline at end of file
--- /dev/null
+xÚíÝ1
+\800\10\ 4À>¯Iþÿ9\e\15EQ\ 4Ñ=\98¤Ls\fæä¶IïË\1a\81{³Zt¡ã´R¦\1f\99þ}òÀôï\93SÓð\95n:ª|§\9bR[è\9d?î¶Ô\1d_*S¦L\992eÊ\94)S¦L\99\ 6\99&ϦëI\v\9aê¯O\982ÕOý£\982eÊ\94)S¦L\992e*C1ïËP\98ÊPôS¦L\992eÊ\94)S¦L\99ÊPÌû2\14¦2\14ý\94)S¦L\992eÊ\94)S¦Le(æ}¦2\14ý\94)S¦L\992eÊ\94)S¦Le(æ}¦2\14ý\94)S¦L\992eÊ\94)S¦³iöc7;Ó"\85Þ\99Fͦ\15Þ\90Ù\99v¦L\vÜý^¥\9f2}oOäß'r
\ No newline at end of file
--- /dev/null
+xÚíÝ1\ e\830\10\ 4ÀÞ¯±ÿÿ¹T \ 6¥\88¬[4véæ2\8a\16Øƽok\14Ý\87ÕÊ\ f;¦Ó²]fûô\13Ö\9eýdûä½ölj\e°\12lGÒÿö0n+\9c\ 5ß»m³G\8cË\96-[¶lÙ²eû"Ûêï·ûY»}o¯öíÀ\96íÕVÞÊ[¶lÙ²eË\96-[¶lÙ²e«\aÓÕ°Õ\83É[Ï2¶lÙ²eË\96-[¶lÙ²e«\aÓÕ°Õ\83É[Ï2¶lÙ²eË\96-[¶lÙ²e«\aÓÕ°Õ\83É[¶lÙ²eË\96-[¶lÙ²eËV\ f¦«a«\a\93·lÙ²eË\96-[¶lÙ²e\ef[ÿB°\93mа÷¶Eû\84\94;¶N¶\9d-Û\9cT\b¸/r\92·lÿ¿?ØÔ*Ñ
\ No newline at end of file
--- /dev/null
+xÚíÝ1
+\850\10\ 4Ð>§Iî\7f9+?\8a²Øèß\81\97\94iÖ\87\fd\9a̹¯Õx\1fÖ\88\18xÝNÌø/ÆÕ§|{öظ²ÿöìÖ8d¥\18¯´ÿø0òh\9e\11×=öùcFfÌ\981cÆ\8c\193fÌ\98q¼qÂ=ïw6Ê;l·»4cÆ\95±<\96Ç\8c\193fÌ\981cÆ\8c\193fÌXï¦\13Ò»1Ö»ÉcÆ\8c\193fÌ\981cÆ\8c\193fÌXï¦\13b¬w\93Ç\8c\193fÌ\981cÆ\8c\193fÌ\98±ÞM'ÄXï&\8få1cÆ\8c\193fÌ\981cÆ\8c\193Ö»é\84ôn\8cõnò\981cÆ\8c\193fÌ\981cÆ\8cÃ\8d3\1eU<\19\87\r\\e7í+\92Þ(<\19OÆ\8c\9f\19·Î\8a\99\96Ç\8cßÛ\eÕä4@
\ No newline at end of file
--- /dev/null
+xÚíÕK\ eÀ \bEÑ9«\81ýo®#\e?H/\ 3\9b6\ 1g$Ï\13-\8dª,X]
+\98\9bxÝ\98;Àð·\98\fXÔ°ì9º\88<ÜѺ¤åq¤\8c2 Af÷îHð7ø\9d/\e5We\84\ 6{Ô\ 6#\19Ø\19áìfÞ¨ÁÐ?\18à®4û=N\1a\17 >Çæ
\ No newline at end of file
--- /dev/null
+xÚíÖK
+@!\b\ 5й«Ñýo®QÑϺ:(\ 4m&Ü\ e¯\9e\10s-¹¬®\b\ eÉ6õÑZ{\90¥m4Y\86²Xâù®.FÀÙ\8bê\1e¦XZi\ 5·Ðùj=:ÎÖ\8bbå¿\91VH\v\7f8\f\96#¤[\97ù²¾\ 1\ 6\8bãYÐ\19²ç¾^X\ 5Ô÷\15e
\ No newline at end of file
--- /dev/null
+xÚíÖA
+À \f\ 4À{^\93üÿs=YLÕ\9a\r(
+\eo\81u¨\96 j)\v¬ª\ 4
+Z7y\84Ùë\ 6Íñv\1f\13,Ô´ìwVQ \9ei»¤ì\ 3GiÒ¤¹ÅDfÂÛ\95ÉÄ\19wo4ù\ fѤ¹ÐÄ\1eoÎL\ 6ÿÌéLȼÁ\9c©·\9bÁ³Õì}î4\1f\81\rhå
\ No newline at end of file
--- /dev/null
+xÚí×K\ eÀ \b\ 4Ð=§\81û_®+\em\90ÏBìà\92d|Q\13"s+1®®È\1d"¯)\ 5,ß=\93EÛàa TÄ"\19çÒÅ\90ãnæE-3\14\ 3\v,°À\ 2KY\8bw\1eÝ=Z\9a\7fZïT\vÞ.,°À\ 2K1\8bÿ#<X\12BtËâ<\8aþa\a\vÿÇbº#Îx/;X.\ 6®\87Ô
\ No newline at end of file
--- /dev/null
+xÚíØ1\ eÀ \b\85á\9dÓÀý/×ÉFSM(\90´Æ\1f7\86\97/J\18Tme\81Ó\95¤\82l\9a´\81É×s\99|½©)YY\93UÝS\17%Á7{\1ei¹é(L\980moÊ짻'¯÷ãªw\82\89\19Ç\84 \13{\9c=Î\8ccÂô\81)÷\192\98\8a\82Ö¦À~ªøÃ\18Lz\96)üvZ5O\7f2]=\8có?
\ No newline at end of file
--- /dev/null
+xÚíØA\ e\80 \fDÑ}OÓÞÿr®0 \81ÎBÃ/;b\86\17\10Hp/\15\8b*K\87E7íG¶þ\10ã/_l}ïx\88\8bMP
+[(ç\8a³ÄZÞ\9b\95lI\1c6lض´eÏ·³×\1eOû\98ìÝÍÆ^À\86\r\e6î,î,ö\ 26lØ&lù\a³Æ&\f\eÛ\16Ï^Õ\eWcó}m©5uåÿöEÛ\ 1;âe\1e
\ No newline at end of file
--- /dev/null
+xÚíØ1\ e\80 \f\85ὧiï\7f9'\14\95\1aBß ñ\87\8dáñE¤Mpo#
+³\e& \8caâ\a\8dÙ6ãõ)cæ~Úèb\14\r\951Ôß±\8b´â\19ߧµ|Y$F\8c\181N\1a\15õq_·´.¯Ôð¿\e¹3\181bÄ\88\91~M¿æÎ`Ä\88\11c\1co{B£807\16ú\8cò\8dôdt\8c\92³võÿøfã\ 6ßØÜþ
\ No newline at end of file
--- /dev/null
+xÚíØ1
+À \f\85á=§Iî\7f¹N\16E\91Z_\86À\1f·\f¯\1fm E÷Vqyº2Yh,S\8b[Ïú\9fgý¥UXJkd¼×.Ö\ 4ß~>Ö\9e!\8dÅ\8a\15+V¬å¬ª½õöí÷.Ýõ±2¯X±bÅ\8a\95ÿ\ 1¬Ì+V¬X±\96²ê.ö\akBèÞz±·Ôwð\83Õ±¦Ì\80gÌk\ 5ë\ 3¡YZý
\ No newline at end of file
--- /dev/null
+xÚíÙ1\ e\80 \f\85ὧiï\7f9'\8c\88\80Ñ×\ 1ýËHl?L\13\9aà^"\ 4ë\10&M\1c\97\99?bî\97\1c\7fqÃÜ?˸äÉ,\ eµ9²þó!µ\89z¢]VêÈScÆ\8c\193æ_\9a\95÷à¾cÓé!\1eî`nÍô3fÌ\981cÆÌ\8c\84\99\19 3fÌ\981/fÖ>.Uæ¤ÄcóË»;ã\r¨2;æ\99YÒ\e\9eÕÏ+\997\17\eÞý
\ No newline at end of file
--- /dev/null
+xÚíÙK
+À \fEÑyV\13÷¿¹\8e,ÚO¬mÞ rãPH\8e\120 {\8d\92´\9a°ôäå2ûbö¨ìýÞc{t¦Qá\83]\10
+{QÞ{\93Þ\12{弬Ö\92¤Ç\8e\1d;vìØ_Ú³ßÕ}ÏÂ÷ýËL\80}l§ß±cÇ\8e\1d;vìÌ\91Ì\91Ì\91رcÇ\8e\1dû¢öü\ fÐÎ.L\1eÛ\13æ\19Õ\1fegwì3ö´\9eqe¿ÿѾ\ 1@\8fi\1c
\ No newline at end of file
--- /dev/null
+xÚíÖ1
+À \f\ 5н§\89÷¿\\17Q÷ªEóþ¢d \ f 1¢¦ÌNô<±#½ËÕ\96¯Õ\1f-7u\99þ.ÃÓl²Ô¦eiXXXXXRZVíÊVeIo1û,,,,,v%\8b?\8cÙgaaaa±÷YÌ\v\v\v\vK&K=/·\9c·+Û\8då\10˱ó²Öò\ 2¼Þ\8eã
\ No newline at end of file
--- /dev/null
+xÚíÖ1\ e\80 \f\ 5ÐÝÓ\94û_Î¥\ 1\17\a\87b\80÷\17\rKóB¬?"Ó*\12#WÌÊ\98t\80éÍùíügÓ\8e\93JîéqU\13M9¸\95\87\89\89\89\89©ÔTù\7fêçLLv\ 4\13\13\13\13\13\93¾Ç¤ïÙ\11LLLLLLz\ 4\93¾gG01111\15\9aòy\84iå\1eÑß\98\964mð=Õ\9bn§¥+2
\ No newline at end of file
--- /dev/null
+xÚíÖ±\rÀ \f\ 4À>Ó\98ý\97K\83\80\ 1°\95À}\93\88Æ:!£\8fèiY\89\99'*3§]fÛsþ\ 1ÛÉÓÒîm¹ºb[\1fÞJÂÆÆÆÆÆƶÅ\96ÝKÆ9\e\9b}ccccccÓ'u.6ûÆÆÆÆÆÆƦs±é\93Þ\126666¶R[ÿ^gû{/\19\7flÇØ\ eÙ·\1aÛ\vÞ7Í\82
\ No newline at end of file
--- /dev/null
+xÚíÖ1\ e\80 \10\ 4ÀÞ×\1cÿÿ\9c\r\ 1\e\13-8\ 5f\eL(pB\8elDM\19\99è9";ýÄ-\8d÷ò÷;?1îpâÐ{¼\å\aÆú\ 3%-\8c\8c\8c\8c\8c\8c\93\183:@Ûad4\8f\8c\8c\8c\8c\8c\8c\8c\8cú*£NîÍaddddddÔÉ\19\19Í#######ã#c]75®ÓåÚ\17ã¢Æåæ1Ïx\ 2\7fYuñ
\ No newline at end of file
--- /dev/null
+xÚíÖ»\rÀ \f\ 5À>Ó\98ý\97K\83\80\ 1ø$ø^\ 3\92\v8Y\96\1cQSV'z\9e8\91þjzëÌÊ\87¬\99^]Þסµ\87¬õ\13ekXYYYYYYY\7fjݵ#¶
++«yeeeeeeeeµ#²²\9aWVVVVVVVV;"+«yeeeeeee\9dl'ëe;b»±&²^9¯{/ÊJ$p
\ No newline at end of file
--- /dev/null
+xÚí×1
+À \f\ 5н§\89÷¿\\97 ¥C¡PbÑ\97EÁÁ<DñGdµ\8a\8aQG̪±3óèð©û×k?3ï¸sÉ9_\8ez¢9\eiåÅÌÌÌÌÌÌÌ|3WþÃú\1a3³ûÌÌÌÌÌÌÌÌÌ,WÉ\18Ìr\957\8c\99\99\99\99\99\99\99\99YÆ`\96«¼aÌÌÌÌÌÌÌÌ\1f\9bsd^ü¿ÝgÌÛ\9a\17¿Ïõæ\134\1aØð
\ No newline at end of file
--- /dev/null
+xÚí×1
+À \f\ 5н§\89÷¿\\97 \1d:\8a\11òþÒ\82\83>$\92DdÆ©ÄÊ\13\95Y»³ÿ\9ftëÚ\85öλ\1f»÷ÏÕ\17Ûó0£$ìììììììììì\9bì§ûù¹ÆήÞÙÙÙÙÙÙÙÙÙÙõóììê\9d\9d\9d\9d\9d\9d\9d\9d\9dÝ\1cg\96a7ÇyëØÙÙÙÙÙÙÙ¯³ç\97½Y??ÿØÙ{Õ{\8dý\ 5¾D\93\8f
\ No newline at end of file
--- /dev/null
+xÚí×1\ e\80 \f\ 5ÐÝÓ\94û_Î\85\80\93ºh«¼¿h\98\9a\17Ò|"zÚÛ\89\99-*dNÁâÔâÙóÂ\16¦H¼\17\87«QÄ¢\ fÕRÃ\82\ 5\v\16,X°`ñc\8b¬Þ9ÎY°(na_°`Á\82\ 5\v\16,Xè\9d,XØ\17,X°`Á\82\ 5\v\16Þ#:8\vï\11»\93\ 5\v\16,X°`ÁBïdÁ¾`Á\82\ 5\v\16,X|Ï¢\7fY\X¬Ö;Ç\1f\v\167-\16Ý\17¹\16;\9d\v\1a`
\ No newline at end of file
--- /dev/null
+xÚí×1
+\800\f\ 5ÐÝÓ¤÷¿\9cKh]D\11¥\91¾,-t \8f\12ò#²Ú\8c\8aQ[T©Ñ \93K\93s§7_\8a\9bè¤È?9|\95B&ÙX\9b^L\980aÂ\84ÉÂ&3÷\93þÂ\84É\ fMÌ\13&L\980aÂ\84 \13&2 ¼ÃD\ 64c\990aÂ\84 \13&L\98È\80ò\ e\13\19Ð\8ceÂ\84 \13&L\980ab·\97w\98È\80f,\13&L\980aÂ\84É7&y2¹a²ònßoL\98<01O
+\98ì\ 4¾ç
\ No newline at end of file
--- /dev/null
+xÚí×1
+À \10\ 4À>¯9ÿÿ¹4¢6)\ 4\83\173×$`s\f²¸\11uÊ®\89>Wd\9a¾\r\9b)\9bg³\95'\1f°±MÂ{3\\9dd6u¹\92bØ°aÃ\86\r\e6lؼn³û]ÜNØ°9ÄFÞ°aÃ\86\r\e6lØ°a£3°a#oØ°aÃ\86\r\e6lØ°Ñ\19Ø°Ñ5e1\e6lØ°aÃ\86\r\e]S\9fb£kÊ\e6lØ°aÃ\86\r\9b\13mê\97ͤÍß;CûcÃf\91\8d¼Ids\ 3\90G¹ÿ
\ No newline at end of file
--- /dev/null
+xÚíÜ!\ e\800\10\ 4@Ïk®ÿÿ\1c¦¡\18\f4a)³\ 6qæ2i.YCUO{35²UZÆF\8cn\e]ÏfN>bd£ðwtzJ\81F}Á\16\13F\8c\181bÄ\88\11#F\8c\18ýÆ(¡¯\1d\13F\8c\166r\8f\181bÄ\88\11#F\8c\181ÒE\181ÒiÝlF\8c\181bÄ\88\11#F\8ct\11F\8cÜ#F\8c\181bÄ\88\11#F\8ctZ}\8d\11#÷\88\11#F\8c\181bÄ\88Ñl£þeôÀH\17ÉùG\14£µ\8dÜ£@£\1dÙ\9d\92î
\ No newline at end of file
--- /dev/null
+xÚíØ1\ e\80 \f\ 5ÐÝÓ\94û_Î\85\88\83qÁH\eÞ_\1cX\9a\17òc\89èi«\13#GdÌ\98\8aÕ\94Õ\9bá÷g\85¬LUè^Ý®VR«>dK\15V¬X±bÅ\8a\15+VÛXeùo¿ÎX±ÚÌJ_±bÅ\8a\15+V¬X±bÅÊ;\83Ý\99\15+}Å\8a\15+V¬X±bÅ\8a\15+VöAV¬ô\95ngÅ\8a\15+V¬X±bÅ\8a\95}\90\15+ï\fú\8a\15+V¬X±bÅ\8a\15«\15VýËjÒÊ>øhewfõ\9b\95¾*`u\ 2T\ 6qí
\ No newline at end of file
--- /dev/null
+xÚíØ1
+\800\10\ 4ÀÞ×\þÿ9\9bÃ\bb\17t\ 3³\8dE\9ac\b'\9bªÎHHÍ\1c\95\9a9\19³efß\9emff²MïÙíª\ 5\9bõ #.Ì\981cÆ\8c\193fÌ\981c\16f\96Ô7¯3fÌ\98ÙgÌ\981cÆ\8c\193fÌ\981c¦o2cæ]Ã?\80\193fÌ\981cÆ\8c\193fÞ5ôMfÌì3fÌ\981cÆ\8c\193fÌ\981Ó7utfÌì3fÌ\981cÆ\8c\193fÌ\98=ÌúËl¡\99¾ùj¦£3ûÕÌ>ÛÈì\ 4¤ÐVü
\ No newline at end of file
--- /dev/null
+xÚí×1
+À \10\ 4À>¯9ÿÿ¹4\12S¦\90d/Ì5\82Õ1ÈÊVÍ\19)Sk\8eJ\9eµ\1d»vßÜ7´³Ý\ fÞÝíé\85ÛÍeGä°cÇ\8e\1d;vìرc÷²]Z¯¸îÙ±c'ïرcÇ\8e\1d;vìرÓ+رÓgå\1d;vìرcÇ\8e\1d;}V¯`ÇNÞù+رcÇ\8e\1d;vìØé\15:\19;vò\8e\1d;vìرcÇ\8e\1d;½\82\1d;}VÞ±cÇ\8e\1d;vìص±\9b'»ÍvzÅ#;\9d\8c]\8c\9d¼klw\ 2¯oA`
\ No newline at end of file
--- /dev/null
+xÚíØ1\ e\800\b\ 5ÐÝÓÐû_Î\85X\17\17Ó\18¨\8fÅ¡\vyi~\85\88¬Q©bÖ\11ÕkvÈp±á³ê7'M\ru¸Ù=¼]Å\ 6\86Ùð([\f\192dÈ\90áÏ\f+þÛ\'\f\192\94\87\f\192dÈ\90!C\86\f\192´s0/3d(\ f½)\f\192dÈ\90!C\86\f\1924ë1dhç \ f\192dÈ\90!C\86\f\192dhÖcÈ\90¡<dÈ\90!C\86\f\192dÈ\90¡\9d\83y\99!CyèMaÈ\90!C\86\f\192dØÞ0¿\f\97\e\9aõ^\18\9a\97\19\164\94\87[\19\9e\8bE2\8f
\ No newline at end of file
--- /dev/null
+xÚíØ1\ e\80 \f\ 5ÐÝÓ\94û_Î¥\11\16\17\13LK^\17\a\96æ\85\14\7f#²Fµ\8aYWt¨Ù%Ë\8d\96ïÂÿ\9c4¶ÔåÁ÷r¹\9aM,³éQºX²dÉ\92%K\96,Y¶²¬ú¯þ\9c°dÉÒ¼dÉ\92%K\96,Y²dÉ\92%K\19\92%K»\ró\92%K\96,Y²dÉ\92%K\96v\e2$K\96v\eÞ\1e\96,Y²dÉ\92%K\96,YÊ\90ò8K\96楷\87%K\96,Y²dÉ\92%K\962$K\96,ÍK\96,Y²dÉ\92%K\96,ÛZæ\97åVK\19ò£¥<β\89¥yy¤å\r\99ó)Î
\ No newline at end of file
--- /dev/null
+xÚíØ1\ eÀ \b\ 5н§Áû_®\vÑîM,ØÇâàB^\fæ\13\915*V¬º¢KN\99n2ýú¦¹©N\7fòN\1fOµ\91i6>Ê\17S¦L\992eÊ\94)S¦L\99\162\9cMç\rS¦LÍS¦L\992eÊ\94)S¦L\992\95Må}¦LÍS\7f\14S¦L\992eÊ\94)S¦LeSy\9f)SóÔ\1fÅ\94)S¦L\992eÊ\94)S;\14Ù\94)S;\14ó\94)S¦L\992eÊ\94)S¦v(²)S¦v(æ)S¦L\992eÊ\94)S¦íLódºÍT6}a*ï3mlj\9e\1emz\ 3C\13'\1d
\ No newline at end of file
--- /dev/null
+xÚíØ1\ e\80 \f\ 5ÐÝÓ\94û_Î¥\11''Ó@y]\1cX\9a\17ò1?"g¬:1ç\8a\9dfn˶ÌöË»ö¬\81m\ f¼·¯«»\99m.?¶\18¶lÙ²eË\96-ÛF¶«ÿß>glÙ²\95·Þ2¶lÙ²eË\96-[¶lÙ²e«O`Ë\96¼eË\96-[¶lÙ²eË\96-[¶lõ lÙ²\95·lÙ²eË\96-[¶lÙ²eËV\ f¦O`Ë\96¼eË\96-[¶lÙ²eË\96-[¶z0}\ 2[¶z0yË\96-[¶lÙ²eË\96-[¶E¶ùe[h«OøÍVWö\85¼=Ìö\ 6tÿ*|
\ No newline at end of file
--- /dev/null
+xÚíØ1\ e\80 \10\ 4ÀÞ×\1cÿÿ\9cÍE¨¬\8cp0×XÐà\84,a#rÚÊ\13}®¨6}Ç\8c§\18¿Ùÿ»¶\89±\1d\1f~\8e\87£\Ð8\7f \95\19Æ\8c\193fÌ\981cÆ\8c\19\977®ðÎ{Ö\183f,\8fÝy\8c\193fÌ\981cÆ\8c\193fÌX_¡¯`ÌXï&\8f\193fÌ\981cÆ\8c\193fÌ\98±ÞM_Á\981cyÌ\981cÆ\8c\193fÌ\981cÆ\8c\19ë+\183f,\8fÝy\8c\193fÌ\981cÆ\8c\193fÌX_¡\13bÌXï&\8f\193fÌ\981cÆ\8c\193fÌx\11ãü2\9ed¬¯øÔX'Äx[cy|¨ñ\r¸\953ë
\ No newline at end of file
--- /dev/null
+xÚ30\80\ 2Cb\81\ 1\ 2p\19P\ 2\10º\a\99ÝØÅi`÷@ê&ÚßH^§Ðn¨a\86d\81Q»Gí\1eµ{Ôn<v\93Z®ÁÅGí\1eMk£v\8fÚ=j7¶¶â ³\9bÖå\1a9mäán7\9dâ\9b<»\ 1ª³Âh
\ No newline at end of file
--- /dev/null
+xÚíÙ1
+À \f\ 5н§\89÷¿\\17©]\8b\894ðþ\98A\1fA hÄÌØM¬\Q\91µjsë·úAk§U·ûújm\91un2RÃÊÊÊÊÚÎ\9a5·\9e:k;«»ÅÊÊÊÊjƲº[¬¬¬¬eoÅí\7f\9b[\99oð¬\15ÿ[ÇÎk®õ\ 6¨ðZä
\ No newline at end of file
--- /dev/null
+xÚíÙ1\ e\80 \f\ 5ÐÝÓ\94û_Î\85\b\8bN\85h}\7f%À\83@ iDOËH\8c\1c±*cä"æûµ<öØgþâÈ)û<mõBs\9f¨¥\87\99\99\99\99ù\97æÌwðja.av\a\99\99\99\99\99ý\91ü7\98ÝAffff極\892æ·¾ÝÙ5 æ\1duØç9ß|\ 2²\eÞä
\ No newline at end of file
--- /dev/null
+xÚíÙ;
+À \10\ 5À>§Ñû_.\8dÄ4I\91ìâ\87yí\82\8e¢¸`)-5*¥ç(\99é£of\7f[Ósm\80}åÑÃöý¶õÉö6YM ;;;;;ûG{ô»zÕØ·µ»«ìììììììz1vw\95\9d\9d\9d\9d\9d}\9c=úwu\16ûìýLÆ\1f%û?û"ç=Ç~\ 2e\97i\ 3
\ No newline at end of file
--- /dev/null
+xÚíÙ1
+À0\b\ 5н§1÷¿\\97ÐtncKÌû«\83<D\10\8cèi3\13#Gdgt(lxVûÉP¡ÃÔ9ÜFñ\81¡7lia``````ØÞ\90q/]5\86\fv\9a\81\81\81\81\81\81Á½Äàne``````xùÛ-mXá^Êú±3Ì5,´\ fy\86\13-\86ù#
\ No newline at end of file
--- /dev/null
+xÚíÚ1
+À \f\ 5н§\89÷¿\9c\8bC\87â \89Ux!\93\ 4\1e\ e\92?\181ªe÷«\9e ä)\9fç\93ás\94Ê*¼KÛ®Lfò\9aB¡P(\94ÝJÖ®¤Ü¨x/\14
+\85B\91a(2\f\85B¡P(2\fE\86¡P(\14ʲR÷Så(%qWR®S¼\97ÿ\94\ eiY\89\ 2
\ No newline at end of file
--- /dev/null
+xÚíÚ!\ eÀ \10\ 4@ß×\1cÿÿ\M\83«iØp4sÁ\80\99 6¬ ê\99\91Ys®"\ 5¤7þÛù&)=ñ;\8d\rÒÜ\8cð"\91H$Ò\8f¥µ¯;é|I\9eH$\12\89DÒ÷t#}O\9eH$\12\89DÒ÷Hú\9eä\92H$\12©·\94þÕIZß#HgKòÔJº\ 1t\94$\95
\ No newline at end of file
--- /dev/null
+xÚíÚ1
+À0\b\ 5н§1÷¿\\97@¶NÖ\88<q\92À#\83ð\a#vßúÔ\13´\12-e~_«¨\8a¿[Ú÷«ä¦Ñh4\1a\8d6JK\9eÓFjö\8dF£Ñh4\9aÌE\93'i4\1a\8dF£É\934y\92F£Ñh´¾ZÁEcS-;\97Ð&jö©ö\ 2\8c³Æñ
\ No newline at end of file
--- /dev/null
+xÚíÚ1\ e\800\b\ 5ÐÝÓÐû_ÎÅ¡\13\89\89Ъ\8f0óÚ\81ä\ fD\5*{ª#\88½bò\92H'o+vUÓ\1fÇR1\9fPÐD"\91H$\12ï\89\15\19\80ø\aÑ>\12\89D"\91H$ÊäD\99\9cH$\12\89D"Q&\97WerûH$\12\89D"ñ\11±ç*x[±(Ë\11?/ÚÇ÷\88'\9f\8and
\ No newline at end of file
--- /dev/null
+xÚíÚ1
+À \10\ 4À>¯9ÿÿ¹4!m dO\83s\§0X,laÕ5#¿÷\1cE\9dª¾>Z[í\9cÖ·\8eÉêã½ÄR©T*\95J¥R?Q\13-\9cº«*¯T*\95J¥R©º?U÷\97W*\95J¥R©TÝ\9fªûË+\95J¥R©Ô¤Úùó~m5Õ\11©;ªòúSõ\ 4\a&\1c+
\ No newline at end of file
--- /dev/null
+xÚíÛ!\ eÀ \f\ 5P¿Ó\94û_\ e\83@\rU(Ûkp@^\10Mú\ 5\11£Ú®5Õ\13ôªúËîòâ-ú\89:ðöVF_\9eÌ\t:\9dN§Óétú÷õ¼y\9eN×qt:\9dN§Óétº\1cG\97ãô;\9dN§Óét:\9d.ËÐå8:\9dN§ÓétzA}ÿ\ fµ\8bôÔy\9eN×q¿Ñ;+n\8a&
\ No newline at end of file
--- /dev/null
+xÚíÛ1
+À0\b\ 5н§Ñû_®KÈVÚ¡¨\81'.Éô\b\bþ!\11«²¶w]A0XðÄú÷~\98 «ÚÞ \a ö!\9b\9a\80\80\80\80\80\80࣠fK# x\13\98F\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2y\81\80À4\12\10\10\10\10\10\10\10È\vve\ 2y\81\80\80\80\80\80\80\80@^°+\13È\v\ 4\ 4\ 4\ 4\ 4\ 4\ 4ç\vº~\99\9e ¨Û\13 \bL#Áê\eveI\8f
\ No newline at end of file
--- /dev/null
+xÚíÛ1
+À \f\ 5н§\89÷¿\9c\8bà&´`¢ô\85Lâð\10\94üÁ\88Q-½g=Aq\95bëú¹\8aʪ<\8bv\9ab½+©)((((((((Ê\14Ië\14\14\1f\14n*\ 5\ 5\ 5\ 5\ 5\ 5\ 5\85<b\ 6§\90G(((((((((ä\11
+yÄ{AAAAAAAA!\8f\98Á)ä\11
+
+
+
+
+
+
+\8a\95¢ð'ùe\8a¬¹\93\82â½ÂMý©¢\ 3fv\10{
\ No newline at end of file
--- /dev/null
+xÚíÜ1
+À \f\ 5н§\89÷¿\\97\ eN\82\bI,/d+Ê£`ð/F|5*zª'H.\94,xëO[K\9aKª«ø\9f\8c\96\92õ\ e\89MBBBBBBÒT\92|?!!9\948Å$$$$$$$$$$2 \89\fh\9e\90\90\90\90\90\90\90\90\90\90È\80$2 yBBBBBBBBBB"e\90È\80æ É\9f$µ¯IÜ%É¿Û\93\90\9cH\9cb\92©_xêÛë
\ No newline at end of file
--- /dev/null
+xÚíÜ=
+À \f\ 6н§\89÷¿\9c\8bt*-\88?±¼\90M\85\87\10á[\8chUöõ]WÐüB\13¯ç;\96ÎÔd¨\14wS\92j>÷l\1a\1a\1a\1a\1a\1a\1a\1a\1a\9a\r \86\86f\8eÆ\84ÓÐÐÐÐÐÐÐÐÐÈ\9a44²&\r\r\r\r\r\r\r\r\r\8d¬)OÑÈ\9aÞ\e\1a\1a\1a\1a\1a\1a\1a\1a\1a\1aY\93FÖ4á444444444c4\19~\9c9S³:3ÐÐ\8c×\98p\9aÇ®>\ 3®\a
\ No newline at end of file
--- /dev/null
+xÚíÜ1
+À \f\ 5н§ùÞÿr]
+Ý,t\88Q^È&ÊC\88ð\17\93§ÆÒ~ë
+Ñ\89¢Éj~mɾ¢.Õå\8eFgÑüì\ 5MDDDDDDDDDDDÔST\99×\88\88êD¦\9f\88\88\88\88\88\88\88\88\88H¦\95\8e\88dZï\11\11\11\11\11\11\11\11\11\11\91L+¯\11É´DDDDDDDDDDD2-\11\91é'"""""""":BÔäת½EåY\84\88¨Ddú\89¾û\ 6\86\v\86\8a
\ No newline at end of file
--- /dev/null
+xÚíÜ;\ e\80@\b\ 5ÀÞÓÀý/gcaGÖBX\1dBç'\93-\88¼Â\88«²»ou\ 4Õ§UQ½dõRVOm¡\9aT\83Î*Ç«Ê;;\9a\8a\8a\8a\8a\8a\8a\8a\8a\8aj¨ªå»\9d\8aªEe2PQQQQQQQQQQQÉ\19¨¨ä\fTTTTTTTTTTTTr\ 6»3\95\9cÁ¼¢¢¢¢¢¢¢¢¢¢¢\923ØR©ä\f&\ 3\15\15\15\15\15\15\15\15\15ÕßTsþ\8c·»ªk\1f¤¢z_e2P=ê\13 ïd\99
\ No newline at end of file
--- /dev/null
+xÚíÜ1
+\800\f\ 5ÐÝÓ¤÷¿\9c\8b8ZP!¿úB¶Òòè\10è\1fZuÔÈ賶"û\93ìbuºñö\99\8bÈÒ*îÎÆ\ 2²é)]MFFFFFFFFFFFFö\86¬%= #\8b\91\99\1addddddddddddr\rot2¹\86yFFFFFFFFFFFF&× #\93k\90\91\91\91\91\91\91\91\91\91\91\91\91É5ÈÈL\r2222222222²(YÚï\9c\9f\90µ½7ÉÈ"d¦\ 6ÙóÞ\ 1@\13H\97
\ No newline at end of file
--- /dev/null
+xÚíÜ1
+\800\10\ 4À>¯¹üÿs6\82M\10\e¹\8dÎqUH1¤XØ&UçÌ\98½f\14Ý/u-çûé\12'ñíæ.ºû[ÍKGGGGGGGGGG÷H×|NG\17¨\93(ttttttttttú¬NF§ÏÊ;::::::::::}\96\8eN\9f¥££££££££££Ózèè$
+\1d\1d\1d\1d\1d\1d\1d\1d\1d\9d>«\93Ñé³\12\85\8e\8e\8e\8e\8e\8e\8e\8en\vüAø#ºî^AG\97§\93(t¯ì\ 1 =3{
\ No newline at end of file
--- /dev/null
+xÚíÝ1
+\800\f\ 5ÐÝÓ¤÷¿\9c\8b\14\1c\8aè ?òBÆV\1e\ e\81ü¥UG\8d¼\9eµ\15%åùÐêþ¸\7fåÙ×\1a*\93+ú_\8efÊËs MIIIIIIIIIù\962d;£¤l¨4\89()))))))))))e\eöqJÙ\86IDIIIIIIIIIII)Û ¤\94mPRRRRRRRRRRRÊ6lº\94\94²\rJJJJJJJJJJJJÙ\86}\9cR¶a\12QRRRRRRRRRRNeòK\ f?R\ 6í\90\94\94Í\94&\11åW½\ 33\ 4\19U
\ No newline at end of file
--- /dev/null
+xÚíÝ+\ e\80@\f\ 4PÏiº÷¿\1c\ 6\81ÚfÝtó\9a:>y &d\fU߬ÔýÍS´´[íþ\11ª»ùé¡Õ]5Z;a\ 6¼Û5VÛ\9e\99´´´´´´´´´´AÚÀï[ZÚË´\12\8c\96\96\96\96\96\96\96\96\96\96\96\96\96V\ f¦«¡Õ\83I0ZZZZZZZZZZZZZZ=\18-\1eL\82ÑÒÒÒÒÒÒÒÒÒÒÒÒÒêÁhiõ`\12\8c\96\96\96\96\96\96\96\96\96\96\96\96\96V\ fFK«\a\93·´´´´´´´´´´´´ÉÚü?\82ݧÍì\13hioÒJ0Úà}\ 1³¢\18o
\ No newline at end of file
--- /dev/null
+xÚíÝ1
+À \10EÁ>§Yï\7f¹4\92V$Í~\1d±\v,C\8a\85¼&Uó\8cÞ÷;O\11\13o\8ak5b÷ÑÏ\99áâ\94\13ó\8eG°x9¥Û%&&&&&&&&&&&n$îöõOL|\87Øv#&&&&&&&&&&&&&ÖÝ\14\16bbÝ\8d\98\98\98\98\98\98\98\98\98\98\98\98\98\98Xw#&ÖÝl7bbbbbbbbbbbbbbÝM\13"ÖÝl7bbbbbbbbbbbbbbÝMa!&ÖÝ\88\89\89\89\89\89\89\89\89\89\89\89\893Ä)\7fU<WܱW\10\13\9f/¶Ý\88#î\vn\17 Â
\ No newline at end of file
--- /dev/null
+xÚ30\80\ 2C\1c\b\ 6¸\f\86¯JB\80&¶Ã¹\86\ 4ШÊQ\95£*\87ªJXi@lÉ0øUÂý> *\ 1F\99>\96
\ No newline at end of file
--- /dev/null
+xÚíØ1\ eÀ \b\ 5н§Áû_®\8bC\17M\8aØ\ e>òGót \90\18Ñ«eó¨+\8e×FWÄ\1fZE\15¼mÓ&gÞ\87F£Ñ¶h\89ùF+×t/\8dF£ÙYv\16\8dF£\8d´õ\1f³ïµÜì¥Õjçô[*7òÕa¶
\ No newline at end of file
--- /dev/null
+xÚíØ1
+À0\b\ 5н§Ñû_®KÉÒ©Vi!O\"á\91Aø\90\88«ò]¯:\82x»\91\ fçÃbWµ½1\aÅuȦ&\12\89Ä_\89µT Î\8b6\9cH$\12\89ÒU^\13\89Dâ~bׯë\17b=g\88³â\9eûXî\13ÛÙ\a
\ No newline at end of file
--- /dev/null
+xÚíØ1
+À0\b\ 5Ð=§1÷¿\\97B7¡ÖÖ\ eOþ$á\91A0$â¬ý8W ¦êþwjguÞu¿æ§\8a¡R©T*u\95÷SÖ§\8e¨æ\95J¥R©Þ\ 3TóJ¥R©ÿR\e\7fö\87ÕêÞ¢N¨æµ\98\ 3ç\15Vû
\ No newline at end of file
--- /dev/null
+xÚíÙ± À0\f\ 4À>ÓÈû/\97&E*câÇQqâëÃÅ\83\fªzf$ò\9a«ÈËrM\85ßåô\84ß<\8eÈsa#d2\99L&\1f\92?ïAr\13Y\9fÉd2\99LöG"ë3\99L&\93{ÊÙëR\aygw\93;Èú\1cÊ\r\83ñÚI
\ No newline at end of file
--- /dev/null
+xÚíÙ1
+À0\b\ 5н§Ñû_®Ki·vH4\r<q \ e\8f\fÂ\a#®Ê©ýÔ\11\84\19ÂËôsÔ-TUÕ\1f²S¸_YÔ\ 4\ 2\81@ \10\bk\85\91¼DØI°\ f\ 4\ 2\81@ \10äV\82ÜJ \10\b\ 4\ 2a©PtÅÿ\970\9c\97\b\9b\bö¡C8\ 1\13%ó¬
\ No newline at end of file
--- /dev/null
+xÚíÚK\ e\80 \fEÑyWSö¿9'D1ñ\9f¾ªp \ 3ã /9±Ð\81îu\95èÝ,k\9eu9\96\11Ò¤¼$¶\17îû%\1f\89ÝwAL¹¤b%ClA³\83zqÛ´åë¶\8c\90\82\18b\88!\86ØÇĤwå\99XÜ4`Áõ¶_ö'FWr\8e!\86\18b\88õ&Æt1Ä<FWr\8e!\86\18b\88ýX\8cé\82y\8c®ä\1cC\f1Ä\86\10Óý©²\16Ó\87Ì)E{WúÙ¯\19AÓ\85gL\17\9e1]¼-&øƼ§®\94æLqn\89\ e
\ No newline at end of file
--- /dev/null
+xÚíÚ1\ e\80 \10DÑ~O3Üÿr6\84Ð@(\9c1ê'\14\86\84¬ûâÂ\16J}4Ï\1c£¦gk 9\927Ð\14éA=÷\9e¯\9fèi»÷p}\91\93w¸õZJo\ 2¬ýûÜ8Ë\1f¢ÏJ\ 5B\ f=ôÐCÏs=\r=÷\9d;ô\94Hê³zT.ç\1ezè¡\87\1ezô{ô{ô{T.ç\1ezè¡\87\1ezô{ô{ô{T.zè¡\87\1ezoÔS$P«T õ\1fh\8e\8eE©\8e%\95Ô¿ôbß\9e¯r\95ª\\7fR\17åL$Ý
\ No newline at end of file
--- /dev/null
+xÚíÚ1\ e\80 \10DÑ~O3Üÿr6\ 4Ñ\ 6\8bÝ ÁO(\14\8b;\b\99\ 2©\8fV6ï\11Ósy±¹\9a¡¹Ð>\92)ë_%s×_½Õ\ f\83d3K\8eO1^\9aa\86§L\9fá,\86$\92H"\89$\92\aKzRP\97t\15[I&¯ÿX\92ÝÍ9\89$\92H"\89$\92äIò$y\92s\12I$\91D\12I$É\93äIò$»\eI$\91D\12É\8d%eëÌs\7fò!¹¼=\97\99\82äLAZ5\97\9c'åÌ\93\eIVý\93rîn\1d¸»/2oÆ\85
\ No newline at end of file
--- /dev/null
+xÚíÚA
+\800\fDÑ}N\93ÞÿrnDëÂFj2\14úK\17\82ÂÈCÂ\14t?W«ÜݲîZ\93iêÀ.q\ 1ÕÁ\8b\8coýP\9d\vô¯ªª%SmjÕ\eÖÂ7ËÞ¦\8b:·©\ 3\eª¨¢\8a*ª¨N©Ê:@¤:Ý\11\87·ìýÁ\8a¾º\95*\13\80¹\8a*ª¨¢\8a*ª¨f©ÒW9\ 5dª2\ 1\98«¨¢\8a*ª¨¢\8aj\96*}\95S@ Ê\ 4`®¢\8a*ª¨¢\8aj½ªæ¯à§ª6ðJlº¾êÑ¿Ã\ 5}ÕÕ}ÕÕ§\80\95T\8b¿Ußa\ 2È2\ f4hnt
\ No newline at end of file
--- /dev/null
+xÚíÛ1
+Ã0\f\ 5Ð]§Qî\7f¹.¡xIÚB$\19ú\8c\87\80Á?~\ 4!\ fÉ<ÇQ?ß#\96ç¶Ð5µ/tIÝJ8owøié{á\aßçâ¬}£Sø\98\10^\90ã~\87¢\19½qç\8c\89PÂ\84 \13&L\980áJá¢î1ÊúϻݢðD×K\7f'¬J¨Ã\84 \13&L\980á\9d\85õÃn\1c\ f
+«\12ê0aÂ\84 \13&Lxgaý°\eG\83°*¡\ e\13&L\980aÂ{
+g{è\11\13¡\9fþ2¨ë\87s¢\1fÎ\89~\98ðì7\]%r¢Jô\1eö\ 59n\1cZ
\ No newline at end of file
--- /dev/null
+xÚíÛ1
+Ä \10\ 5Ð~N3ÞÿrÛ\84]·\89BÐ\91Ý'\16\81\14?<Âà/̼VÛµ»\15Ýóþü¨\fïÒ\8f\94¿ÿ´\1c\85<\96\7f\920-_±Jä[¥ü\a?\86 +wÔÄ^;*Ã\eyòäÉ\93'O\9e<ù\1f\92/9ÏÏɯì9±<áî\15yÓÆ\9c'O\9e<yòäÉ\93'¿J^\93Òa\97È\9b6¦\ryòäÉ\93'O\9e<ùGò\9a\94\ e{\96¼icÎ\93'O\9e<yòäÉ\ få÷ßPû\96¯\v\7f§·\9aó|Î]¨ZÖ¤²²Iee\93:[~Ë?\9fÿ<mJò_¶N\8a:
\ No newline at end of file
--- /dev/null
+xÚíÛA
+\80 \10\ 5н§\19ï\7f¹6!n\94 ðG<q\11\824øhð/ªºG?;ÇhÓs¤\80¹\82L\ 1S\ 5\1fT¨õÞ÷ëO\14j»÷åúâ\f2#¥ÐÓ
+\13DÛ×y`¶Ü«ïÙÒ\ 5P @\81\ 2\ 5
+Ï\14Î\\ f\86Bê\8e4\14*y\b\14t$\1d\89\ 2\ 5
+\14(P /È\vò\82¼ #Q @\81\ 2\ 5
+\14ä\ 5yA^\90\17t$
+\14(P @\81\82¼ /È\vò\82\8eD\81\ 2\ 5
+\14(ü\¡¢\ 5ô\96.`ý§íÉ\9bj¥oªéC °S\88\7f\vç;R¥;Rî\10.\80\8fIõ
\ No newline at end of file
--- /dev/null
+xÚíÜA
+Â0\10\ 5Ð}N\93ÞÿrnªFÔHS\9a\99à\vY\bQ\19|øé\87ÒZ÷µEìf\95æuì,%Ë Í$\89uj÷Ó\ 3G£:Ãßzèèóo\12»Âu¶,:O òsâY»Ä\8f°ï\92e\90\8d\ e\1d:tèÐI¡sÅÕj÷¨|\7fãÌ+ê»Nø5\e\9d\8e\8ed\93ltèСC\87\ e\1d:tÎèè;Úèb:\92M²Ñ¡C\87\ e\1d:tèÐ9££ïh£ËëH6ÉF\87\ e\1d:tèСCǽ Ú¨{A%\9bd£C\87\ e\1d:tèü³NìÓ$^ur\fò\98dV\97èô\9d±\a'\Ówj\96¾S³´Ñ\15t\82þ;U²½'[ø,7Ã\15Ü\b
\ No newline at end of file
--- /dev/null
+xÚíÜA
+Â0\14\ 4Ð}Nó{ÿ˹)%]ØjÀf\f/d!\88uÈÃO\a\8aUûÚæícµîõô0}\9aùaº4ùR\179ëòÊ_½õ¡T\8d~é`\98ÓÙÌ_ R[\92T\87Õ®¯ððn\191öÝ\92Â\90"E\8a\14)R¤H-*\95p\97~H\85Ü¥ßJýä\ 4Þ\7f\84Ô°\94égú\91"E\8a\14)R¤H\91J\93Ò§4ß\7f\912ýL?R¤H\91"E\8a\14)RiRú\94æ»\80\94égú\91"E\8a\14)R¤H\91ò\f>¥ùz\86Öô#E\8a\14)R¤H\91Z@ªbÂl-)ÌÝ¿ñ<ߧ*©OUR\9f"5&\95ö\9b\9a5ý*iúe\1cÎ\vJ]®+
\ No newline at end of file
--- /dev/null
+xÚíÜÁ
+\82@\14\ 5Ðý|Íóÿ\7f®\8d\94\ 5\95:\8c^ñ\f³\bJyÌ¡\e\17¤ªyM§î×j\8b×\11\ 3-'
+9¤V\97SÛýÖ¦K¶©\1d9ëÇ\19e¬\10µ)PíyUûû¹£wË\19eÞ-m jÔ¨Q£F\8d\1a5jÔ¨\8dRËiÙ«ÔF4×_wk}·\180+µµj\12RBR£F\8d\1a5jÔ¨Q»\83\9a¾¦eßOMBJHjÔ¨Q£F\8d\1a5jwPÓ×´ì˪IH I\8d\1a5jÔ¨Q£FͳÇú\9a\96íÙc éw\8d\1a5jÔ¨Q£Fí\14µ\8a:¡\9cÿÑzS«\8e*2¤¯UZ_«¾C\1aÒ×*e_Oí´ïZ¥%dIȯû\ 1\ 6â\86b
\ No newline at end of file
--- /dev/null
+xÚíÜA\ e\820\14\ 4Ð}Oó¹ÿåÜ â¦\90Hé ¯éÂ\8dô\93\17'\19\12¬Z×2{oVÛ|Î\99«%\ eµ\99ê>\82\9dyû·R{\87\7f!8îäÃ\82I+JpI\14|#¶Ý\13fì\965κ[âP\vA\82\ 4 \12$H\90 Á\11\82Q}ð)\18Õ&\ e\b\ e<¹÷E\82§ JQ)J\90 A\82\ 4 \12$H\90 Ás\ 45z\8dþ\8f\ 4¥¨\14%H\90 A\82\ 4 \12$H\90à4A\8d^£ÿ5A)*E \12$H\90 A\82\ 4 \12$è½ \8dÞ3\19ïMHQ\82\ 4 \12$H\90 A\82\ 4ç æü3Þ§`ÞP¯©®o¢Ý>X{×\98Ôè+±ÑWb£¿¡àìß`IÑã)\1a5×\ 3\88%d\9a
\ No newline at end of file
--- /dev/null
+xÚíÜA
+Â0\14\ 4Ð}Nósÿ˹)\127m\bJ¦õ\85,\ 4Å\ e}8\90\ fµêX=c¿W\e^G\ 5\e\93e\ 5\e\92ÝNó<v]]bíIͯ_½Ï\ 4û¸gY+M³§j\ e íò\93»vË\8btì\96\1a\8c&M\9a4iÒ¤I\93&M\9aÿª\19xÞ\9cÑÜu~o[¯~ö\9d4W55¦¥I\93&M\9a4iÒ¤I\93æS5M\ fL\ f\1e¯©i5-M\9a4iÒ¤I\93&M\9a4oiz`z@SÓjZ\9a4iÒ¤I\93&M\9a4iz\ eÅôÀôÀs(\9aVÓÒ¤I\93&M\9a4iÒ¤¹¬Y\91ÁzK\r6ñ\8f¦\eÏ\9b\95:=¨Ôé\ 1Í_hÆþ6·7m¥6mÞM{\ 1\9düHã
\ No newline at end of file
--- /dev/null
+xÚíÜA
+Â0\10\ 5Ð}N\93ÜÿrnªF±ÑTk\7fá\85,\84\80NûðÛ ÄZ\97Ñ\92f7J÷:³Æ\92^`WáÙ\94\aU×á»nXÚ¤¼Ç§M-½¾\87\99#V¹¥+ß¡ËÛ+9z\96ÜÒ\96YÒ\vl\94)S¦L\99òo\95c\9f±¯Ê±O_Cå?ß©õ%Ê;*Kl\89M\992eÊ\94)S¦L\992åYeý²]\11ÊÏÊ\12[bS¦L\992eÊ\94)S¦LyVY¿lW\84òGÊ\12[bS¦L\992eÊ\94)S¦LÙÙ
+ý²]\11g+$¶ßeÊ\94)S¦L\992eÊ\94\9dÐ/Û\15q¶BbKlÊ\94)S¦L\992eÊqÊ\99ÿ\82þ¨\9c]à£{ÎA¿¼¦\9cÔ/×ô~¹¦ï\8a\9cV9ï»\%ö÷\89\1d[ã\ 5P¯#'
\ No newline at end of file
--- /dev/null
+xÚíÝA
+Â0\10\ 5Ð}N3¹ÿåÜT\89\v#ØZþÀ\vY\b¥uÈÃ\8f\13\b:ÆÌ\9b¯1\96ϱE®Uæ\16¹TÙT|SüþÒ\ f·Ô ñ\v¿q\9e)òm-sG²øì ¾ \8fý\13BæÈ.ï\98£C\91Ä\89\13'N\9c8qâÄ\9fâáÿÕ÷âwv7û[Æç'\84tgÄÿ!.Õ¥:qâÄ\89\13'N\9c8qâÄ\13Äõãv`\88_+.Õ¥:qâÄ\89\13'N\9c8qâÄ\13Äõãv`\88\7f\15\97êR\9d8qâÄ\89\13'N\9c8qâΤèÇíÀ8\93"Õ¥:qâÄ\89\13'N\9c8qâÄ\9dIÑ\8fÛ\81q&EªKuâÄ\89\13'N\9c8qâ½Ä+¾È9:\14¹}kFT?^\1dúñêÐ\8f\13¿G¼Åo<0Õ«Cªg/æ\ 3\1d_\19\8d
\ No newline at end of file
--- /dev/null
+xÚíÝA\ e\820\10\ 5Ð}O3Üÿrn\88¢\89\10\ 4ñ·¾¦\v\13¨)}á'3\eªæ1EÎÇh\8bßÑ\e]î4üP[\r£_«\7fñÁ¥]Kvè\87<ÃË\99f\8fpý©#ýûª¶y_Êlù[\9cgëe£ôéÓ§O\9f>}úôéÓÿoý ªµ%uJV/µ°\93{¿\84þ\97ô%¿ä§O\9f>}úôéÓ§O\9fþ¨úê}Ý\1eú§êK~ÉO\9f>}úôéÓ§O\9f>ýQõÕûº=ô/Ñ\97ü\92\9f>}úôéÓ§O\9f>}ú£ê«÷u{èï×\97ü\92\9f>}úôéÓ§O\9f>}ú£ê«÷u{è\9fª/ù%?}úôéÓ§O\9f>}ú¿×¯.N4ÿ»<Oúµõ±\91\94z¿z©÷\8flôêz¿zéö\f¢\9føîW/É_\92ÿ´y\ 3p\ 5\16\ 4
\ No newline at end of file
--- /dev/null
+xÚíÝA\ e\820\10\ 5Ð}O3ÜÿrnPk\8cTTè\8cyM\17$&e\16/|ù\e"ÖµdÝÝjÝuþy[¥a»i\8bK\88Ñ\ 1{\7fúòÌM S&z[B\85UBÂRIÂ\1dC\eÞ!Ón5Æ\w«4ìB\ 2 $\90@\ 2 $\90°[Â\94ÿ°£3Ûëc²½E^%\94xw á\ 4 ÒA:\90@\ 2 $\90@\ 2 $\90@\ 2 $\90\90B\82fI³DÂ\ 4 ÒA:\90@\ 2 $\90@\ 2 $\90@\ 2 $\90p¶\ 4Í\92f\89\84Ã%H\aé@\ 2 $\90@\ 2 $\90@\ 2 $\90@BR \9a%Í\12 ¿\94 \1d¤\ 3 $\90@\ 2 $\90@\ 2 $\90@\ 2 )$h\964K$L\90 \1d¤\ 3 $\90@\ 2 $\90@\ 2 $\90@³\84ü_\ 4{\94PgØÛ´y\1a\8eÍ>á\83\8fVMm\96¢R³\14\95\9a¥\7f\91\90ø\99\10Òá¸t(1ï\ 5\85¢\18|
\ No newline at end of file
--- /dev/null
+xÚí\94K
+À \fD÷s\9añþ\97ëFJ(&\99)ô³0d¡øÐ\87\ e\92³FÞg!\8c[8Ò=\1cèÛ&ËiaÂÎD)Åd8&A\ 6ËÕ¬¡a³áÀÛä\v\131'\99I\96I\94«×³\9e7Ù9ù exÀ\81\93ß¾È \9dÄÒIìû&Ö\9d´¯Cçu´Í\ fJy\7f\82
\ No newline at end of file
--- /dev/null
+xÚí\96K
+À0\bD÷s\1a½ÿåº ¥\89Ñ!\r-(.Bp&\8f|\88"-t\96&`Æq\1d\18\91Q-"\14\86ð9Ù_+\1e)Be\b/H8¾ãD®¼%\18\91\16a\11~\9aÐ}spKFN\98úö\9c¶\13Ö=,Â\7f\12Æ;\87;a^tª4÷\96\89Ï\\99ÞF\99Îá\15ÂÀ\1eÊÎSNé\ e§é\13â
\ No newline at end of file
--- /dev/null
+xÚí\96A
+À0\b\ 4ï¾fýÿçz\914-%\9a\95\90Ò*\1e\12Ãâ\10d\11°Ðp\9e!ÝyZÜ«\89æ\82uä\8fõ(ù¸~ë=\1f\ 4¹&ÉÛ\93´\8b\12)\9cÌR2â"/ò"ÿ<9ç\8aFÎ\8a=r§þbò\9aó"/ò\1f\93\83îÌíç\17rw\e\1d¹"2®\b¯¹ãçÈøùBòè\9f#3-Ø0-\aK\8fÀW
\ No newline at end of file
--- /dev/null
+xÚí\97Q
+\80 \10Dÿç4»÷¿\?R\ 6\95Û\f\85Å,û!¨O\1f\8a²\11-òNv\81®Í1 \ 2:Âc\16¡Z\9cu\1dï\81\vÚ"U\8bM\ 4Ã\95F ~jK¨\80´\85-la\8b\ f[\14^q\14\ 6^³Q\é\9c=\8d\85o\94-la\8bÿZpUÒÞB\ 3¬\84äÿ\v±@IµÖKµJzÉ¢|\161Ã\8d¢\19\v÷\90\1f¹
\ No newline at end of file
--- /dev/null
+xÚí×Á
+\800\f\ 3Ð{¿&ûÿ\9fó2¤'\97®\11\1ddô l\86=,\14\81¹F½î\15éy;$§ì\87¤\94WEË-R\84\8a¨³:¢¡\10%T,O2\15½×g\85"Ä"\8b,²È¢/DÍyÄ\88\98¹\19ôɧ{þO䮳È"\8b,:N\84vÈ\bE\bñWNÎ#(&,\14\13ö,\91ä\e\95º\ e\8a®ë]æ\ 2xØ\85\10
\ No newline at end of file
--- /dev/null
+xÚí\98Q
+\800\fCÿ{\9aìþ\97ógè\14;è\1a¥JJ?dÔ¬\ fK\84\ 2=ÚR\1eaÃsJhTJ6ex\81\ eÎkaº\90ú¥§\$é\1a\91n¯´IE,-/ÑÓXB¢\13\9dè*Ñ\85=Ëâ\9eí\1cÚÒýweeé4\99¢\13\9dè¸tÿöÌ\92t\9aLÑ\89î«t t\94ß«\9cèà¯\ 1b\9e \96gF\85f\9e Ö\1fáqºõo\aÖd¢Ðdn-\13ð?
\ No newline at end of file
--- /dev/null
+xÚíØA
+\800\f\ 4Àû¾&ùÿç¼\14B\8aiÖRaK\ e"té`I@³¶|¶º\85î¹\9e\afX\97ö±ÔâyiöåólõE\91:Sza18G¾À\89i\ 5f\98K*©¤?\96\ e:YÜC1ì\8c\9eì¡\98\19(á\89·\97êöJ*©¤\92¾\92jÊl*Õí\95TRI×Kë\7fÌîR^Ø\99æ\9cÞksûÂ)cÌ)cÌ)³JZø¦¶óí¥ä\1d\ 4ãa·
\ No newline at end of file
--- /dev/null
+xÚíØ1
+À \fFá=§\89÷¿\\17\91,JÑGAúÄ¡\8b\7fýhjÀÌ>ÚÙ\1c#Ê3\12X\13\99À\92ø\81:çk÷Ô¹\ûFM\rJÝhu\81Çú½\e3¸¨>\83\ eTZõ\9fÔ{ÇãPSgøP'¹ÉkÔV¸jÕªU«¶_Û¯ý¯U«Vº\95»=P\r\aÎo\86O:WÒ\9d\8bÞäÝjü[\9fWxÒ\15Îmò\ 1\9d\rÙ5
\ No newline at end of file
--- /dev/null
+xÚíÙ1\ e\80 \f\85ὧ)÷¿\9c\v*.@àUÁü\r\83ÓÓ|±¶\89î¹\92â\14eŵ6Û¢\82\8bäw5*÷ô)\ro\ 5ôi¨K®\91¢4n\10k>Áè1}d>\16\15\9cÐ@\ 3\r4ÐXYC¾o\9c\1aò Û¡1<º\7f©A§ \81\ 6\1ah \81F\84\ 6ûÆ\1e\1at
+ß\r4Ð@\ 3\8dµ5´\7f\97\9e\1a1ÁWrÒï\e>7û«û\86Gí\e\1eµ}}¤¡x7|ÇN\91g\1fÆîÚN
\ No newline at end of file
--- /dev/null
+xÚíÙA
+\800\fDÑ}N\93ÞÿrnJɪQ\9a\11\1a~éB¨\8cú06 û\1c£n®aá¸<<¦×\87\87ôÿe6×M\97R\99ýCù\17\19ÅPÈ\f¥LÀ±ôÌ\93i\9aØ9M\19\8e\f2È \83Lk\19Å®½dD»v*ó"a·ÔX\86jB\ 6\19d\90A\ 6\19dªdèôZöÀT\13ß\19d\90A\ 6\19d®\90qYø0exö÷ö¼\9fqe§çÊN¯«\8cú\9d©ª&WV\93ææ\1fQvcô
\ No newline at end of file
--- /dev/null
+xÚí\9aA\ e\80 \f\ 4Füÿs^\101 b¤\8bÆáÐ\98ª]ÃØÖ4\9am+Æ8Ð\16+\98Ve¬Ä^HR]\96\Í\ec\87\7f®\8aÛ
+·\1eoõW\14N#¸îXá\ féØá\ 5+lð\f\9eHE³cp\81\v\à\ 2\97^.Î\1d9qñW9\ eø¼ïç\b"\15\1d\17ò\85:\ 6\17¸À\ 5.\9fæBßÿó÷\18ùB\1d\83\v\à\ 2\17æ0Ìa\98ÃPǨcp\81\v\ÞÍÅïO\95\92\8bN¥qjpGÖô}\93ô}¥Ê$.äË\85\8a§Ð\ 2\8a\b\8f\10
\ No newline at end of file
--- /dev/null
+xÚí\9aK
+\800\fD÷=Mrÿ˹\91øA\v\85ÎTáe\91E\15FóL2\v#\8eÈÌé¹¢\85_I!\93\8b\95\1eßú\1a£çë\94¤Ñº\8f\93\93Î-Õ«km¿Oñá]sS\vT6*ùª\a'8Á N\9fâ$Þî'N\ 6¥Z\8bÊí^\9c<JvNô\13s\ fNp\82\13\9cà\84ßÃïá÷è'æ\1e\9cà\ 4'8Á ¿\87ßÃï1÷\98{p\82\13\9càô?N¿µn\9c¼JóüBÏ\85ùü^Øü\9e[i\19'úiHI-¶\ 1¢m+W
\ No newline at end of file
--- /dev/null
+xÚíÚA
+à \10\ 5н§Ñû_®\8bJb)\15\1at&\84çBBÒøK_\95\89¤Ö³µÖ6õC+5/q_Üghfâ×Çú©Éíÿ\9e¿CbH+\17¾p\9bº¿¯§;\ eWK?ÞüG\1dú\12\15tô \89ñ¿*G\8e\1c9r|\82c`ÕÑ\1dc\13\7f\ f¾¶Î9FKHÌq4\1f«\1c9räÈ\91#Ç\85\8eêUÏ\1d×\1cÍGë*G\8e\1c9räÈÑ>¹}rûäÖUë*G\8e\1c9r|ºcÌ[Á£cNâ¬Þ[_=Æ׫5¼^ÍJ¼\81£ù¸ 1*ô\ 5q\9bv\1e
\ No newline at end of file
--- /dev/null
+xÚíÚË
+à \10\ 5н_£ÿÿs]4Ø\a¥©Dg¤\1c\17nò¸à\892Jj}´ÖÚÒ¾·RsSWG¶\8dR¿\8cɧ\17\1d\17\86\9eÚ)5¬\9d»ÞE\ 6\86áämá#ܯ\95ã¾Õ\1fðk_"Ãz\9f\94\9a3Â\¹råÊ\95+×\7fr\rL»k|ê/{\84¹;\8e'×àÔ<WóÕ:Ì\95+W®\¹rÝÜU=l\9f3ÏÕ|µ\ esåÊ\95+W®\\9dû;÷wîo¾Z\87¹råÊ\95+×ý\\83þ¼\7fsÍK\1dýÃûze\9aS\ f×\94z83u#Wóubjdð\ràÝ$\9f
\ No newline at end of file
--- /dev/null
+xÚíÛA
+à \14\ 4н§Ñû_®\9bÒ\9a\8d\85Bþ\1fÂËB¨\142à\8bf\16\99ó{µ
+ÇíÆcf¥¨\8d°gÈKqøã=óÙ)Ú®£\8b»çWÀ\8alK2Þ¿Ê\1f\90Ë8:oþ\19CRd¬\b\17\pÁ\ 5\17\pñ@\17ï\9d+$EÅ\eÿÏù\90\14Q.ì\17Î\11ç\b\17\pÁ\ 5\17\è#ú\88>¢\8fØ/\9c#\pÁ\ 5\17\pÁ\85>¢\8fè#ö\vç\b\17\pÁ\ 5\17\p¡\8fè#ú\88>â\1cq\8epÁ\ 5\17\pÁÅ\7f.º¾$¿ºÈIqü𽤠dô\91\19ÑG\92R\ 4»°_4¦è\fò\ 2\15\80\1a\98
\ No newline at end of file
--- /dev/null
+xÚíÜÁ
+\ 2!\14\ 5н_£ÿÿsm\9cÉ \8c\84Á+\1c\17\12XÓ\8b9=ó.ªõ=Zk\eça\94\9a]ÕÞ\92>\vK¯jò´o\17é\v\7f¾ªý|¯Sª\8a\19SWK\1fùZmË×\8cº\83Ãjé\8f\ 3¾\80Ã\\92\8a¹çЪ2ï W\qÅ\15W\qÅÕñ®"~·ß×\fjv\1aÚtòê®òª\8av¥_Ù\aí\83\qÅ\15W\qÅ\15W\q%g\903È\19ä\fú\95}\90+®¸â\8a+®¸â\8a+®ä\fr\ 69\83\9cA¿²\ frÅ\15W\qÅ\15W\qÅ\95\9cAÎ g\903èWöAû W\qÅ\15W\qÅ\15W\97«\9c\7fÆ\e]åVµ~v{êD\9f\993ÔÈ\9c!¹ª\83\éWÇô«¬Â^<ír/
\ No newline at end of file
--- /dev/null
+xÚíØ1\ e\830\10\ 4ÀÞ¯ñýÿsi,')p\14!äµ4.Ü\10Ð\ 1\93;±½¿WUmßçj=¿²\84²ê°Ê.N\18\a\16O¾þ>úû\9açT\16µÚ\8d[\1f÷¾\10S7\1evÜÛ\9cg¶q\95\84?æ÷ÞÒ
+\9a{pe¹o\933Î8ã\8c3Î8ã\8c3Î8{ØYXzðá,°²Û_úO¤\aÓYfeñÎô3sÓÜä\8c3Î8ã\8c3Î8ã\8c3¹\86\C®!×ÐÏÌMs\933Î8ã\8c3Î8ã\8c3Îä\1ar\r¹\86\C?379ã\8c3Î8ã\8c3Î8ã\8c3¹\86\C®!×07ÍMÎ8ã\8c3Î8ã\8c3ÎÎq¶þ\ 4Úé,»²Ë\1fmM\ frs\8d\1e\9bk¤Wv\9c3ýìÀ~\96WÜ\v\1d\80WB
\ No newline at end of file
--- /dev/null
+xÚíÜ1\ eÂ0\10\ 4ÀÞ¯ñýÿs4\11\98"FPà=iRX¢XÉ\13\1fÛ0ç멪\80u 4f\8ft\19ÑÖl}Òm¾øßý\9eéâ\9e»Sû\15|²ËÑ\8eëSÌ\vû¶\8eÄPÏ5<]öÉrÇ\1dwÜqÇ\1dwÜq÷£»È^QáéN6Ã\8fûáéZ¸sß\99³æ,wÜqÇ\1dwÜqÇ\9d>«Ïê³ú¬ûÎ\9c5g¹ã\8e;î¸ã\8e;îôY}V\9fÕgÝwæ,wÜqÇ\1dwÜqÇ\1dwú¬>«Ïê³æ¬9Ë\1dwÜqÇ\1dwÜq§Ïê³ú¬>ë¾3gÍYî¸ã\8e;î¸ãî[ww?P3Üå§Ûþ\11òÑÆ\98Ýggt\9fí\90®¡;÷]ûû.3à\ 3w4A¯
\ No newline at end of file
--- /dev/null
+xÚíÚA\ e\82@\f\ 5Ðý\9cfæþ\97s!AL\80\ 4\9dÄ_|,\88\ 1\994òl)iï¯m\8c\11²ßl×\890'¼÷ +E¸û\85£\v÷\96]N\ºêüxÅ\b#·\ 3\87§2\9fç/ü¼_¬\16{\977gÛò9ì\8f¼Ù·ÔÀÖ}\81\bóï2\87\1crÈ!\87\95\1c\ 6?}-\ e³#<Zü×Ï\87ëj\ 5"¬áP>T\97Õe\ e9ä\90C\ e9ä\90C\ e9üÀ¡~ùöý²÷6S\1cÊ\87겺Ì!\87\1crÈ!\87\1crÈ!\87æ\1côËÞÛ\98s\90\ fÕe\ e9ä\90C\ e9ä\90C\ e94ç _öÞÆ\9c\83|¨.«Ë\1crÈ!\87\1crÈ!\87\1c\9asÐ/\9bs0ç \1fªËê2\87\1crÈ!\87\1crÈá\7f8ì§}D\82Ã\1a\11Îì\1fçw£ùýr\8fï\97«DXΡ|xÃ|\98\eä\ 3!à2ð
\ No newline at end of file
--- /dev/null
+xÚíÚA
+\ 21\f\ 5Ð}OÓÞÿr.\1cª"\16Ñ*?úfÑÅÌP\82óLHIï\97k\8c\11µÎ«õZQ¦\858
+Gy÷êqkñ-\9e¿ÿÎn5£\8c½Ú+?ÌÒñùù¾Ýâ¿ø|Ö\8e÷Òþà·kK\ en®E¢¬ñŹä\92K.¹ä\92K.?ï2º£\98.ó£|¼EJ§{å2<Ê:.åKu\\1dç\92K.¹ä\92K.¹ä\92Ë\10\97úñ¿êÇ\9d\13mu)_ªãê8\97\rÉ%\97\rÉ%\97\\9aÛÐ\8f;'2·!_ªãê8\97\rÉ%\97\rÉ%\97\\9aÛÐ\8f;'2·!_ªã\rÉ%\97\rÉ%\97\rinC?nnÃ9\91¹\rùR\1dç\92K.¹ä\92K.¹äò;.û²óHqY'ÊݽéþN·F?ÞKôã\95¢,êR¾üé|\99\1dè My*3
\ No newline at end of file
--- /dev/null
+xÚíØK
+\ 21\10\ 5À}N\93ÜÿrnÂ\18a\føÃ~ZY\ 4!ÎÐJÑt^ï×5Æ(¸/«õÌjk\96z[pjµ§_Ø?~v:\ f\1e|jwú\eÕ\96_mû£îXzòo\7fõ\9d\11\12\96Ó6?\17n\bËÞ\12\8a<ö°j³$pË-·ÜrË-·_p[z¾=Þ\19Víæ\96Qí¦3ÝæT\eéV¿ÕoÍ ÜrË-·ÜrË-·ÜrË-·r09\98\1cL\ e¦ß\9a\13Ì ÜrË-·ÜrË-·ÜrË-·r09\98\1cL\ e¦ß\9a\13Ì ÜrË-·ÜrË-·ÜrË-·r09\98\1cL\ e¦ß\9a\13Ì ÜrË-·ÜrË-·ÜrË-·r09\98\1cL\ e¦ß\9a\13Ì ÜrË-·ÜrË-·Ür\9bæv\7f\15æ6¯Ú÷ßý?\95,eå`=*\aK¬6Ú~û§ý6£à\v\8f´*×
\ No newline at end of file
--- /dev/null
+xÚíØA
+\ 3!\10\ 4À»¯Ñÿ\7f.\171\e\bB\12\84éMyð\12\94![\fc÷þ\c\8c²ûZçV\¹Üq\93\8a7ßâÝEó\87\ fOýzg~Å\11këøË¿j\9e;pg\94\8au²Í[*7\8a×½¥\14ºöÀ\8aóTpÌ1Ç\1csÌ1Ç\1csÌñqÇ!¯ÿ\8bã \8aw/òr¯ÿå8«âXÇú±~l®à\98c\8e9æ\98c\8e9æ\98c\8e9\96»ÉÝänr7¹\9b~l®0WpÌ1Ç\1csÌ1Ç\1csÌ1Ç\1cËÝänr7¹\9b~l®0WpÌ1Ç\1csÌ1Ç\1csÌ1Ç\1cËÝänr7¹\9b~¬\1f\9b+8æ\98c\8e9æ\98c\8e9æ\98c\8eånr7¹\9bÜMî¦\1f\9b+8æ\98c\8e9æ\98c\8e9æ\98ãtÇû§oEÇ\99\15\9fÉ\16N¥Xy¹[\8fËÝR+¾\89cýø¯ûqNÑ\ f\,4J
\ No newline at end of file
--- /dev/null
+xÚí\97K\ e\80 \fD÷\9c¦½ÿåt\81X\13£Ð\99.4ÓE1\ 1^ÂãÓhv\86»Oæ\10Íx\84ùéW\b\93ð0\fñ°JHÅ»\87½ð\10z[ÿ^Ü\88\90[vâÈ\ 4\ 2¾
+y\90\ay\90\87Z\ fÀkß=`\84\99êv\a·cí\ 4\ 2Ç\83î\85<È\83<üÚCî/)zà\10Ü\91×\1e¯\17\ 6×\v\16¡ÈÃÇÎC\1e²\ 1\8c\9a""
\ No newline at end of file
--- /dev/null
+xÚí\97;\ eÀ0\bCwN\ 3÷¿\\97\88~¤¨\ 1;C$3°$<)/mºß\15\11¥\9eeÎ¥T\11±\912\19\18\v \97:¥]ÿ^VV¡\13%Æ\ 6²zAïnÈpv\12\85s"y\91\17y\91\17y)z\ 1\12öá\ 5¤dÄu\136½à\14ª\17½Gú¾È\8b¼ÈËi^\9a\7fÂ\1f/<ÊtÓrÂrrÚ)9ͤlõrìó\82\81.\11¶\87Ö
\ No newline at end of file
--- /dev/null
+xÚí\98A
+\800\f\ 4ïyMòÿÏé¡´)\141Ý-\82l\ f\11E\a3\9a=Ô}¬\88(Öô°9\9fTÇdÎ\19Òò\96E/eO\18 ZO\9eîãÛ\17Å»KíY;ÛúpS5\14Ð+\91ÄëN\9eäI\9e\8a\9eà|
+"©eìvúö+D\12Ý\93æNs'Oò¤\1cW\8ekîäI\9e¾ð\84ì\86Ì\9e¸¤\bFúòrÜi9Î&\1dóô«ÿ \87]?ÃóA
\ No newline at end of file
--- /dev/null
+xÚí\98Ñ
+\800\bEßý\1a÷ÿ?×ËjFe8¯0êú \11uØN©0Õ\11µ\89lB´\866\87:\ 3«h·\ f<½\18õ\96§¥CÜe\,¹\v\86ìÔÜ\97~\9dø &\v\ 2rd0\r»Sz£7z+ô\96êoº»\ 2ÓÜþ\1cëäÝ\e\8eVâ\8duÊ:¥7z£·Wo¿\9a\vËÎSÖ)ë\94Þèm\19où\133ë\rO\8b\9d\17y\9d\1c;\17\14:\17*h¥Þ>û¿a\80\eïCe\1d
\ No newline at end of file
--- /dev/null
+xÚí\98A
+\800\f\ 4ïyMòÿÏy\91XE\vm7"89ä 2\92Ѹ ûQ\111ݳÌë\88+¸x\89x;ÅÓt3\1e5DIY÷¶1x\:u\9e³ýº\95\a}î¦\ 2e/ ê§Æ#\1eñø\11\8f¢Th<
+\89ùùU¤BzÔ\12Ë<²×ì5\1eñ\88G<\92×ä5{\8dG<â\11\8f¢¿®\17\8f5Äñ<饫>¯]\9e×UÄr\8f¿x\1fuÐ\r\94\rÜû
\ No newline at end of file
--- /dev/null
+xÚíÙ1
+\800\f\85ὧIî\7f9\a«Æ% Í\v\8a\7f\87 VÞð\11Ú\80f×r÷Å\1aÖ0}òzì=¼#9ùìéûÎäÒ\95:§þû~\9bsØ\1dó¹¨1B\1dÕ\81g\15&ë4pÆ\19g\9cq.p.»\aí°\15&g·ÿÂT0\9d5Érgú\99s\ 3g\9cqÆ\19çrgæ\8d¯Ïuô3ç\ 6Î8ã\8cóë\9dkÿ.Egm²»b*ÐÍ\e&\9b7ÔÉÍÎ?íçúð\r¯:Þü
\ No newline at end of file
--- /dev/null
+xÚíÙK
+À \f\84ὧIî\7f¹n$}P\82Å\8cBù]¸\91Né§È@ÍÎáî%s\8cfkÒ«¢}Czò\8doA}aʽ2½|¤îé~ØÀªD&\9el=¥êÀÜç¦\b\8dY\9c®\95Á\1dwÜqÇ}³» q\ÜEéY³\98j\1cá®K_âÎyç\9eÁ\1dwÜqÇ\1dwz$=\92\1eÉ=\83;î¸ã\8eû_Ý\8bÿ\80>Üõé\9f+ÑpÓÓöH\93öÈ\15é\eÜ9ï¢\17\1cDÞi\1e
\ No newline at end of file
--- /dev/null
+xÚí\9aÑ
+\80 \fEßý\9aíÿ\7f®\17+£%=ÜM¢3Cb\bvó¸\rѬ\9b«ÍNkû¹´\ fgqõ\13kqq{©%ôO\ 6¿Òòüoç\9eùÈû,i\96¨ÅKÖe\9ceçÁ3[\9b|\89îi\9e¶÷\87¾õ\98ã©V¥¥h]`\fÆ`\fÆ\160¦Ê\95\9d±¸\1e\13zË´TÔ0Gu\1e×ì\1a/q\8c8F®\841\18\83±\8f3¶:WÊò>õ\98´\1e#\8e\11ÇÈ\950\ 6c0öQÆ8»øE=F\1c#\8e\91+a\fÆþÄXÖÍ\9e+cV©%9W>ßíQ\9e]Tk©¹\ f\93Y\8f-gL¸÷óî\8f\8dq¬DË\ 6è\89\8bÏ
\ No newline at end of file
--- /dev/null
+xÚí\9bÁ
+\830\10Dïù\9aÝÿÿ¹^Ò6¥I\9063[è[ED\ fqÌc\98Å\18Ñ+\95\15ÏjÃy¤ì8\1d1\95û\c
+·\8b\1a7Úc«åªÆõû?uý}DK\994¦}\1eÇ\11ï,¥kkûg\16ì--\9e3\1c[÷½´U\85Æ\82y\84UX\85UXýSV\15\19 ³:Ï«ë\14ûÕ\9d\12\8dî,÷è|æýкSúô\ e¾\8a¯â«°
+«°
+«°
+«\ eVÉ«¢¼*ÑXÒ[á«ø*¾
+«°
+«°
+«°z\8aUò*ß\ 2N÷Vø*¾J\ 6\80UX\85UX\85ÕSóèXiýÊjTi4f¹õZkU^Ôè_\87ìê~\8aU\91çxþ\v\18}Õ®ñ\ 6Z/r\ 1
\ No newline at end of file
--- /dev/null
+xÚí\9bÁ\ e\84 \fDï|Mçÿ\7fn/*{\10ÁM¦ÕÍ+\84\98pÐI_&m\90\88-ä\8eèѾ\9eCæõäòÏ32\8fu?o-k\1dgB7wc=¯\99\91ªU%yíoÝùRæhÓ¯șDo:Ö¶y¤R£JkQ^a\18\86a\18\86a\18\86ÿ\9dáqOgÚiJ¯ýç\f;ú\9c\9dáqOgÚ)Ó\8a\ fãÃø0\fÃ0\fÃ0\fÃð[\19¦\1ev×ö>ç\81=\1d>\8c\ fãÃ0\fÃ0\fÃ0\fÃOf\98z\983\8e»=\1d>\8c\ fãÃ0\fÃ0\fÃ0ü.\863ÿ÷ïZ£$¯×·8\õp\94ÔÃùw\e4½Çá:ã¨ÖZÀp¤:q¹ÖÄù\ 1§X 7
\ No newline at end of file
--- /dev/null
+xÚí\9bA
+Ä \fE÷\9e&¹ÿåfc;\ eS´¶$?\8b\17\8b\94\8aØ\8f\8f\8fQ4ëáYaßhûyJ}9ºg=×Ú=©li\9f´.;nh_ÍÔýïwzý\8f\9e\1e\ 2í.\9d÷qô\83CW\94¶üÏȧyº×\ruëÞë\92Pk\17Ï;ÌÃ<ÌÃ<ÌÃ<ÌÃ|*óqëùÎü,\87\rm\93kWæqçNÊl\97%ª\r\9fÇçñy\98\87y\98\87y\98\87y\98\87ù×Ì×^Ï\aæ2ä°\85sX|\1e\9fÇça\1eæa\1eæa\1eæa\1eæ\1f3Ï\99\149lH\ e\8bÏãóø<ÌÃ<ÌÃ<ÌÃ<Ì¿\9b÷ì\9b\81¿Ì[\ 5í¢õüên`ì\99T\15íÚûq\8a\1c¶8ó¡^\97\7f\1fvôy©ö\ f\ 4\b\8e«
\ No newline at end of file
--- /dev/null
+xÚíÜA
+Ã0\fDѽOcÝÿr]4%1mC\bT\12åÉÆ\ 4¯\84Ð÷x\16Î\9c[DvÌ=Æá{Fúú\96E¤Ï\8fµ\88äq½\16?Ý¿Ü\179ûk\16eÑ\16ù}±'2^ý\1a\95c\9cç\9a4G\94\9e\9dÛ:¶3=J£K-\9aô\ 5F0\82\11\8c`\ 4#ÿÍHÒþ\88\ 6wð'#ß<{Ú~\97Z4é\v:BGè\88»\16F0\82\11\8c`\84\1fáGø\11~\84\8eÐ\11:\82\11\8c`\ 4#\18Á\b?Â\8fð#t\84\8eÐ\11w-\8c`\ 4#\18Á\b?Â\8fð#ü\b\1d¡#t\ 4#\18Á\bF0r·\16\85ïÙ\ f}Qõ\9a}e¤üÝòR\8bÚ;ø<ùçC\9e\1féV\8b\1e}Ñ\97\91ìó¢ËÙY\18\ f-H\15\9e
\ No newline at end of file
--- /dev/null
+x򒆄
+\830\f\85áû>Móþ/·\eÇ\1ckÅ1mÂøªÈX\11º³ü=\89\96ö¾µÈhýÕÚîs\8få×áH"ã\1ck\12 Ç\19M\ e\84:îúê\963qÒOü¿W}ÿ9\92Ô\96¬I\94\89\93ýH\9e1\1cÙG;þ-\vÏ\16©sìîÚ¶ù?Ò[%M
+Å v°\83\1dìü#;£zg^\ 3ÝÔ3Õd}Î6\8b\93Å9ÛÆΨÞ\99×@7õ\94Ò\84ïð\1d¾#gÃ\ ev°\83\1dì`\a;׳£Þ©\ï$ÔÅå\9f\15ð\1d¾ÃwälØÁ\ ev°\83\1dì`ç\17vÔ;Þ\8dÖ}7Êwø\ eß\91³a\a;ØÁ\ ev°\83\1dkA\ 5µ\16\94ïð\1d¾#gÃ\ ev°\83\1dì`ç=N2wúxg§WÓ¤@n?Ûëc}½SQ\93:ûZd?+¨ÏÎú9vÆÎzß)£É\ 3æÝáP
\ No newline at end of file
--- /dev/null
+xÚíÜ[
+Â0\10\ 5Ðÿ®&³ÿÍùcµ }\b-s+'\15\11\8a\10\87\9c^;AÇx\8eê\1eã=¦ÅëQÏ_gUÝ\8fﵪæãxÆÞGûõTí½ëȺ\1a\aV¹ïú\9cUÌ\bªUE®«å¬æõ_IÇ´;ÿ\8eÇT1×öÅóôÌ \8a\1a©µ
+]W\f2È \83\f2Èà\9d\f¶|oß5Øu\8fóê\86¬uI¶:(W\9dKUèº\92\83rP\ eÊA\ 6\19d\90A\ 6\19d\90A\ 6;\rvÞ\ f®íÑoíÝ_zNOæÏ{2rP\ eÊA9È \83\f2È \83\f2Èà9\ 6íÑß}\8f^Oæ\8c\9e\8c\1c\94\83rÐwQ\ 6\19d\90A\ 6\19d\90A\ 6ýnÂ\1e½\9e\8cßMÈA9(\a\19d\90A\ 6\19d\90A\ 6¯^Wó\84²\f\8eäZ\85Ý\ f.+\95³G\9f^«ÌÿëKêÉÜÑ`×µ}Ë`_\ eFÖê\ 1÷\9dk\11
\ No newline at end of file
--- /dev/null
+x򒆄
+\82@\10\ 5Ðw¿fæÿ\7f®\97¬¨Ð¬`ïÖÙD"I¶ÁÃe\aê<:aÔu,7ï«\ 3öOfÖ\19Û³\9auÀëPÍ6\8eî~ñís¾z\9dÕÁÏûãsÞÏ,jÄÕ¬c¯³ëÌV\13\9döZv\7fߨmé°\f¸ì\97s^uÜH®YðuÆ&\9bl²É&\9bl²É&\9b_±9¤¯±ÚÜê\ 5\r;\16]³Ä^Ðjs«O;ì\98Ü\94\9brSn²É&\9bl²É&\9bl²9½Íy×\9b\83ÖèzA\7fÖ\v\92\9brSnÊM6Ùd\93M6Ùd\93M6§µéÞ\83\1f»÷@/è±\17$7å¦Ü\94\9bl²É&\9bl²É&\9blz\ eŽ\azA\9eC\91\9brSnÊM6Ùd\93M6Ùd\93ÍOlîþ7á°\9aUìu¶NªãÖ\9b\15»F¯\17Ú\13cú\1a·óÌê\ 5ÍP³P\9b\15\97\9cSÔ,l;\ 1HûO§
\ No newline at end of file
--- /dev/null
+xÚíØ1\ e\830\10DÑÞ§ñÞÿri\9c\98( r*\8f¥· \84\\99Õ~>Cï£*¥ú¬v¹ï\15sýØ]Å\9c_{W!Çzﶬ/ÏÝÞõ÷ÝÅÕ)½Ë\99»¹Áöä¤\12\8fvÿ\f\9bÏV\91®\18×6ÜV\91\95Þ»ð¹Ã,f1\8bYÌb\16³\98\8dÊ\15\vÌn^o¯¿>¿þ\ 6í\Oï]øÜñ,Ïò,Ïb\16³\98Å,f1\8bYyV\9e\95gåY\9eåY\9eåYÌb\16³\98Å,f1+Ïʳò¬<˳<˳¾\8d1\8bYÌb\16³\98Ŭ<+Ïʳò,Ïò,Ïb\16³\98Å,f1\8bYyV\9e\95gåY\9eåY\9eåYÌb\16³\98Å,fÿïÝukys77\97Èì}ïvç\8a\1e\9dÉæmb\9e=¥wÙsw\1e³)ï»tW\ 4Ö\ 3\86Ó:®
\ No newline at end of file
--- /dev/null
+xÚíÜI
+\83@\10\ 5н§éºÿå²ÑDp@\rèo|m\90\10 \98¢\1fßrHk㨤Ñ~c\98½o\15³^ÝÃJz×°\82\96#5l»¿î¦S_92\ fÛî\f©\93[¯}¾ÜÃÈ\11ZÃ\8a\9f\87ó=\9cìTê2ìÿÆ\80×P\91\992[\ fc\ eVìè¡\86\1dÌC\96Yf\99å'-\87\1cÛìXÎ9>üv§Ë~u»\93½sK\ f5ì`\1eÊe¹,\97å2Ë,³Ì2Ë,³Ì2Ëç-ë\97ßÐ//¯/o_q¾}KÇç¾ä²\\96Ër\99e\96Yf\99e\96Yf\99å³\96õËoè\97Ý+òÿ¹/¹,\97å²\f\99e\96Yf\99e\96YfÙ³\15úe÷\8ax¶B.Ëe¹Ì2Ë,³Ì2Ë,³Ì²g+ôËî\15ñl\85\\96ËrÙ16Ë,³Ì2Ë,³üì<\9cv.×rë¥\86Á½Þ¼\82\99ýrO5Ìÿ\9föÔs_ýZÎÉ\94uËI¹\1c_Ã\ fìÞ*\9f
\ No newline at end of file
--- /dev/null
+xÚíÛÑj\840\10\ 5Ð÷|Íäÿ\7f®/¶niµ¢K¹£'\8aÈÊ.\12rö:ÁT-m&¶ZÛx9¯\19yüq§3rÿµOgàv¼OO_zׯ\1d\1e§u`\ 4]ÿüÈ·¾ßitëا\99ãt½Ùñil¦oc¿\17\82ö1ã3j9\8e%_g|ëÔ§\8dÆ)ûì³Ï>ûì³Ï>ûÏ°¿=×\17teÌ&õþ_ã4¤Þÿ²¿=×\17t¥U\9fÊ}¹/÷å>ûì³Ï>ûì³Ï>ûO´¯Þ\7fr½\1f5/u\93¹>¹/÷å¾Üg\9f}öÙg\9f}öÙgÿ®öÕûO®÷½Ûsv®OîË}¹/÷Ùg\9f}öÙg\9f}öÙ·\96G½o-\8fw{¬å\91ûr_î{æg\9f}öÙg\9f}öÙg_½¯Þ÷n\8fµ<r_îË}Ïüì³Ï>ûì³Ïþ=ì×n]\984Nk§Öβ_\17Êðÿ÷«M½¿\9e¦×û\1dû´Ï8ím?ñÿ´SF\85·\ f<\12\1e·
\ No newline at end of file
--- /dev/null
+xÚíÛ[
+\830\10\ 5Ðÿ¬&³ÿÍõG1Ðø¢\14gäD)\ 5[°Cz¼\ e±÷eDÖÑ·Ñ\86÷=R¾NÏ6²îóÚFÒíJm\8f\vÞÏJq÷P\9c}ëxÞö\vséîÑ_¾õ}¶éG\81ÚF©y;\9eíú¿\8b
+[;ý]\99ö\16é¯eÃk[®ÅQbT«m±yË\ 4&0\81 L`ÂÌ\84Y?á¨ÇðرÝÚæ¼wØ\9b· ï\1d\16\13fý\84£\1eÃcÇÊÕVN\90\13ä\ 49Á½\ 3\13\98À\ 4&0\81 L`\ 2\13\98\90×\84Zý\84¤}0=F=F9AN\90\13ä\ 4÷\ eL`\ 2\13\98À\ 4&0\81 L`Bz\13¬Y²fI\8fñß=F9AN\90\13ä\ 4&0\81 L`\ 2\13\98À\ 4&0\81 \9e\8b´fI\8fÑs\91r\82\9c 'È L`\ 2\13\98À\ 4&0\81 L`\ 2\13<\17iÍ\92\1e£ç"å\ 49AN\90\13\98À\ 4&0\81 L`\ 2\13\98ðV\13Ö\13aB¯XÛ"ý\84±²ù×,Um\85>Øö±
+=Æw\98\90óZ¶gBÎ\9cPª¶\1f\94\v!8
\ No newline at end of file
--- /dev/null
+xÚíÝÑ\8aÂ0\10\ 5Ð÷~ÍÌÿÿܾØ\88\9a\8a\vÎuO,"\14%\rñô:$Xui=¹ÕѶ«×Õ\83\9fïô¸g\1f÷Ƹ\a?Î\8fq.úÕSo~æz\1e×\89¹õWï:ó\99·=\8eh1cÜqóøèñþ]ì\94Ƕ¼îiÇÖ!÷¼ßçírßî\98\968Æ\81ó\98\15¬`\ 5+XÁ
+V°\82\15 õ\8aµ\15Óê\15»\15\8fj\9bÏj\9e\1f;\978Æ\81óX®\90+ä
+¹Âo\10V°\82\15¬`\ 5+XÁ
+V°â?[1µ^ñh-Ö³5Z\1f;§¶©¶ùrmS®\90+ä
+¹Âo\10V°\82\15¬`\ 5+XÁ
+V°â;¬°\16ËZ,µÍYµM¹B®\90+ä
+V°\82\15¬`\ 5+XÁ
+V°\82\15ö\99Z\8be\9f©Ú¦}¦r\85\!WÈ\15¬`\ 5+XÁ
+V°\82\15¬`\ 5+ì3µ\16KmÓ>S¹B®\90+ä
+V°\82\15¬`\ 5+XÁ
+V°¢cþ\aò\18ã\8a\9bÇ{g;¦^Qq5¡ZU»ÆÕÝ®û\9fQÛL\1eã0+*&YD\8fqÈñ\ 3éô*6
\ No newline at end of file
--- /dev/null
+xÚ\9d\91a
+@!\b\83ÿï4îþ\97\vÞ³\18Ê¢\9a\11\99\r?,"ÅÔÌ\11"j\ 2½¦\16¡\8e?n<¶OÕ\13Ûäa\r¬w,\vl}rG\ e\8bM;ϦÏ9[\9eí\f¤¢_ú±\9dx|\9fÊÖ=´l4lK\ 3¨ýv½
\ No newline at end of file
--- /dev/null
+xÚÕ\92]
+À \f\83ß=M¿û_n0W .«\8e=-\15Á\9f4¡mÄ\ 5\ 4y×B\80ìÓ+²\f\17\89·ÜR×á\93çô\88\8b\86$¼Æ\83.=s/,\16+îB÷7\9eó³\9d\8dq®zÄ~\7f§q>=GéÙê\8eZùyÎ:\97Ü\ 3DR\9f«
\ No newline at end of file
--- /dev/null
+xÚíTA
+À \f»÷5Íÿ?7\98«ÈXMtxÒ´x©¤ \85¸?@\82\98\9b7@ò¾~"é\ fN$õ\87SÖÉ°Ä{ø\ 3+C³¨Û\ 6A'Êör\P\8cp\ eè<Þ\8f÷-¼\a ͺ:S3\ 4s¹Ô\89ùÛ»ËÞ©Îz#\9eóqw\99ó\ 2\9b >þ
\ No newline at end of file
--- /dev/null
+xÚíUA\ e\80 \f»ï5íÿ?ç\ 5\84\90U:N&Z\16"\86\94:;\ 64P\ 1\ 31=\83bNvSGÆM1¶ÜË\9b½n<ëv`q³¤{ìîßMg\ 4§ã¶\114þå=Gó\ 2-T¹\8bº?\9b\93Ôß='kíÈu\99Û\9d\9e\93õ>\91ëß'¯®\1dçþ\1eÜ(éκ\8eö J\1eô{\ 3EßѵsÊ]È ,§\1cs\eq\ 1\ 3\18\7fð
\ No newline at end of file
--- /dev/null
+xÚíVA\ eÀ \b»ó\1aúÿÏíâ"Ë\10\vzYf5Æ\90\98JC ª\r\98A;ÄÜ\15áé¾Âlû\\98,\86ë\1ddòR.¯\f\12\(åe_Ýú ³\ 4æ\ 3ô\16еaNi5\86\14ª\ż\8e\86ÿÐÐë\87aLPòò(¯ÐàÒ;\9d×ý\ 6±2שÃãå¯jÈN6O\ru\85+é¯Ñl\13{y\95«6odúá^\rãÚàçC[\87%®\v\17\ f\14\84
\ No newline at end of file
--- /dev/null
+xÚíVA
+À \f»÷5Éÿ?·\8bN\ fÝlª\83\1dZ\8bHAbB\89\ 5Z0\12\18aÓ\19\fìÎMÆÒÃd`\ 51Ýz\94'"<Õ\901\99æ9nvͨ.ãô\f)\8db\ fÝ»µ~¤\1c;\98\e<KÛÒö\87Ú¾x_×Ö÷ÛEu\v3ã·][ÿ/[T«oË\13JÛϵUç¾\81\894Ïçévå HûPnÖäë|»òÛ\13\98Im!wî\11L1/8,gã
\ No newline at end of file
--- /dev/null
+xÚí\97Q\ e\80 \fCÿw\9aíþ\97óC\f\10ÁÕ\96Ï\15B\f\89¾´.\13Ý\9b\ 2\95wÙpí\ 1¯¯»\ 3\9eKv\80\ 3g;ÌÞû\ 3|3:ÅÆ}÷\aØ\93c0þ\19É´ jÖj7(©lÑwe^\99WæJæɾ\85ÐSïÌwßÐt_e\8b¾«Î«·Tæ\95ù\8aM\9cÏ\aß\7fOçsæô9ubs=Õ?þ\89ò~~\8aù>\9f9ú¾ÕZ#t\ 1õBÁ~
\ No newline at end of file
--- /dev/null
+xÚí\98Q\ e\80 \fCÿw\9aõþ\97ó\a#&C`T£±Ã\10Ã\a6¼\94ƹ\97B¶ü(«Þ\1d©9Ü\rÙ'Ö\86ä\18ÑÖ\12ì\83Ú¢ÓÀÀzk·å"h\ 3õÜêÝv.`\f»øâücXöB5[ñ\1a(ÅÖF>71\15Ó/3\8dò4ÎØΪ\81z÷^'ÑÔÝ[\98Fy\1aglg\95®M>\95OÅTLÅ4Ï\94{÷&3ëWy*\9fʧb*¦ï`ºÚ\19<3õ;´\91îÞVo0÷/s\976nÿ\8d\91§Ï0Íya½ß[û\94ªm\ 3á\18cE
\ No newline at end of file
--- /dev/null
+xÚí\98Á
+À \fCï~Móÿ?·Ãtz°U4½\8cÔ"£\a }t\81\9aÕÀMX\8f2|\e.îÉ\8b¸Ë\99F\\9c\1d\8d\9eð¸\1eõÑÂ~mõ\91\154\8d ÷±¿ØX\81u
+\ 6Ù\94, ÍÌw\97:\97 E\86Æ\84>\8aµXÿ\9dõ̯=\ f_Ö]\8dg>\13±>óÂÆzæ×\9e\87/ë)\1a5×\9ak±\16k±\16kùµüZs\7f¸X\8bµX¿¬Y{Ü®Ñè}ô¶áç~mt¿æî\9a\11ìÃÏý:S#\99µÑ&;U#)\1f\bñÚä
\ No newline at end of file
--- /dev/null
+xÚí\99á
+à \f\84ÿû4Éû¿Üþ¸5eÆÙå®npQ¤´ Gú\99\ 4cÖÍ\11f\87µðl^^\87;;b\8e5;`¬k¶©¶U͹߮¾\7fß\19j`ÍNósÜùùO\1d=Ú\[a6\87\9eÁ°¶~Þ\1dnLÍD?\8b\r±!6ÄÆ\7f°ñu\1eüÈF%w¿*Ȭ²ÌkÎù\17¦f¢\9f\157\147\94SÄ\86Ø\10\eb\83Ã\86ê\8dXodw_ù\9dØÂ\97mµ¨â\86â\86Ø\10\ebClü\ 2\eÈNÛ\99\rck&äîY¯VoÜ¡\99×·B×¢»Ø¨\9cAl\1f6Æ\r\9aæ\aJjÜx
\ No newline at end of file
--- /dev/null
+xÚí\99K
+Ã0\fD÷>\8dæþ\97ë&©»ð¯µ&\ráÉÆ\ 4\ffP^\94Á\8a8BY\115ÊÇs(im\9c®¼ÙÒ®¤±®=f\ 2\97µ÷3¨/wÛ§§\87E»¬y¯§\9fïY\8eQ¦\1awf\91á[}¯å¨\r²\84[»9ï0\ 330\ 33ÏefÇÏÌ\99Ùñ3'3=\ f<òÆK{níæ¼Sg¨3ü\9b`\ 6f`\ 6f`æ¿Ìdø\99Þ\9dÞè®oi\ f\ fü£\a¦ÎPgø7Á\fÌÀ\fÌÜ\87\19G\7fµj\ fkÞG]í}?\13V/æë\rkÒ×Þ÷ÀWi72\13\96Js\99vÃ|\ 1*"f^
\ No newline at end of file
--- /dev/null
+xÚí\9aA\ e\84 \fE÷\9c¦½ÿåf!3bf\ 65í¯Æ¼B\88\91\ 5ùé£|#f=<3l\8d6<\9b§\8e_+xjÿ©Á\13Û)\r\93ÙÝ©Ãy°\93ïÿ¯ \89J\r¹yX\17iïÜ»ª5\1f¤IzsÙ\9eîcëuÄeQ¡¡ \ f°\ 4K°\ 4K°\ 4K·d)â\97>,ͼwx®D\83Ö·.,;ãÂsÔ%ê\12g\1c,Á\12,Á\12,=\80¥ëýRÐóá½\93¼7u\89ºÄ\19\aK°\ 4K°ôT\96D÷\ 4\86<(n lY\92þ\9fÞhÐùVÛ¹s\12÷Þ\95\1aôy¸\8c¥´ýP±§Eñ\ 2<¸öq
\ No newline at end of file
--- /dev/null
+xÚí\9ak
+\840\f\84ÿç4Éý/·Ën_.\89Ê2#\88S\8bH\946±_\93PâÞZ \9bÏf˳\7f_¡îé,ï7Ø\9eÛ\12à+·%×åWÇÂîd\84Â\96âÏnå}\96\93_&«Ok;\8c\9d×úP¾Ç\18fµ>³t\1e\82yY×\ 5¾]Öns\r°;\7fs·æs\82Ú,º!Lk¬Á\10Ô\85\11cbL\8c\8912cÔX9\18Ëó1 ÔÀZç#XÐò±En#;Ïsv\8cT~L~L±R\8c\8911vsÆ.\8b\95\94³\8b1\82ò±¿ò1ù1ù1ÅJ1&ÆÄØ\8d\19ÓÙÅ\83ó1ù1ù1ÅJ1&Æ\9eÄ\18«²gËØ\fKLƪj\18l¬¬k{\90g\17¼Ú\9e5\1fóKò1/ëÇ\90ù\18¯~,a\8c»ù\89õc«\1f«\19\ 3ö\17$\13\93Þ
\ No newline at end of file
--- /dev/null
+xÚí\9aQ
+\83@\fDÿs\9aäþ\97k¡®ÙBÒZ»#\bo\15)Sd\8d}\9dÌGÜ·\15\8aå¹lú쯯Ö^\8b\9d\9eúú³®)\ 4G]Sñ4ÝS\1e×ë\9aÞÞñ¸ó?½#BºZö:\1a\7fÕã+{þñÅ\1f×s§ÁH¨\ f\e\eKþNóiI\8eÂ!¦«mþ\14òe1
+RWe\e9!ÿ¡`\ fö`ï¶ìUy¯Ë\80§uë:æª\9e»ëÖå\9aU=w×-ûo\95Ôº\ 4wB·}cMÞK\1dßÃ÷è¹°\a{°\a{ä=ò\1ey\ fßÃ÷è¹°\a{°\a{ä=ò\1ey\ fßÃ÷è¹°\a{°wSö¤caoìi'Ýföºé½õyO=C\95yO=C\95y¯\9bß[\9f÷Äó{SÞ»\9c=\97;\9f|v4}ϯ2\89\a¨¸0§
\ No newline at end of file
--- /dev/null
+xÚí\9aA\ eÂ0\f\ 4ï~\8dýÿÏ\81DB\13HÓC½\16HãV\152\87Æ0Ùn¥uo\15ªò£lø쯯²¯Ë»=Û¢s9[\88\8eõl'«ºÝ?\99íë7Ïí\7fR"¯\v&\93§Û2\99Õ\7fßÏ:7QqX_\95n»\r§\1dû]£$ÓÕ\9a\96EIYôÁ*¦³ÆL\94üq0 \930 \930ù{LJýäз(s\\9dɳw\9cô¾\89¦X÷-Ó7^öÑIt\12\9d\84I\98\84I\98\84Iü$~\12?\89N¢\930 \930 \930\89\9fÄOâ'ÑIt\92g7LÂ$Lþ-\93\9b\84¡\80Iuzrfr\e\rM÷\93^ê'}\93éÍ÷\93\95ùÉ(ÉO\1e~R\9fé]1Y²ãL\9dÄ\9euÒå9ó¡\1eQÍÓ\95
\ No newline at end of file
--- /dev/null
+xÚí\9bÑ\ e \fEßû5ôÿ\7fN£\e°¤Õ\89ëõÁÃÈbF6¨\1con\1d´¶\15¯,m\14\9b>·gSÅ9ìñÞRWã\18½ð\88c\8cÇ\95\ e9\8c&»%\891ùöÏ_÷Þcx= GR^°\9a\8dw-z?Ãêdzõvî\1f=î,¹ê°}Ô¥?ǹÚ\98³:Å9\9cmÓ=\97\15ó=@U\94¶\81ä²\89\84UX\85UXý\ 3Ve\1e ³\1aûÕÜÅ~Õby4WúÕéiæ\12¿:Ýe=ó\89ó¡<SZmAWÑUt\15Va\15Va\15VaõZVñ«5~µüÿÕþ´\1fåVè*º\8a®Â*¬Â*¬Â*¬^Å*~\95w\ 1k¹\15º\8a®¢«°
+«°
+«°ZϪb¥õ\91ÕayT¬f«\90ëüj¾ÖºÊ¯jÖZÏ~µÉß\ 5´t_@Un¥Ù\17\10°ª\13\1dѾ\80YWsV\8bê\r¶[|H
\ No newline at end of file
--- /dev/null
+xÚí\9ba\ e \fFÿ÷4íý/§\89#E\ 5\9c\8cv3¾nYÌ\88\8c\8e·/m ª\9bY´©\9bT¿õÑ\14wm<õ~?ölûjÁGÛ×îø\9aC×qSÿ/¯¾6f£tÝ\9f¥oï¿Ó\94f\1f\18^û\16l'Ã\13³7`Á\9fZø²ÌCÊ Â?×ú\14\9f¥heª®²i¤¥\9aXq4Ó[Ù\80´Ô\89\85a\18\86a\18\86a\18þ\ 3\86û9]P\8bÌÅñ\a³\ 2Y\9eÍìéM<6îçaË[äð¸gÞ\ 2:\8c\ e£Ã0\fÃ0\fÃ0\fÃ\97g\98x8:\1eÎYã¨z;7§C\87Ñat\18\86a\18\86a\18\86aøº\f\13\ f³Æ±,§C\87Ñat\18\86a\18\86a\18\86\7f\8bá´íþO\fçU6Ô\f\8f«8¢âáÌ=ð\1e\ fgî\81÷xx\Ç\11µÆ\91XÇQåt§2¬©J\9cZ\8bä:¬g\88Ó\r\bC+\
\ No newline at end of file
--- /dev/null
+xÚí\9bA\ e\840\bE÷\9c¦Üÿr3\99±¶&H\8d\r°yØ\18\13b+öùSlhí0Ͳ6L¦ëöwE\9fÍÑ¿\9e\9cfÇ®I\87\1d»÷¤v\1cî;»íó&vw\9e,o\1fýÅ]\ 6ué¶dþ]|\ f½kæ£\98ø\8dÞ9Ô\8aCú\93¦}îs\931»9Jw9Ë¡½Zb¢=ð\8aèå\80PK&\1eæa\1eæa\1eæa\1eæa>\80ù\92õüɼ\97Ã\86ú$<>¯OÑô\1cvòÊù'ÅûË\12åCçÑyt\1eæa\1eæa\1eæa\1eæa~\9bùòõ|ê\9eÔÙ'9li\ e\8bΣóè<ÌÃ<ÌÃ<ÌÃ<ÌÃü\16óìI\91æç°è<:\8fÎÃ<ÌÃ<ÌÃ<ÌÃü\1eóÙ\95\81WæDz¸\82y¿:.z=¿ª\r\8cÝ\93ʯ\r\9csØV\9aöE=ll\ e\9b_\ fk0_#v\ 5õ°³Î¯\98\ fm\1fÝ÷\9bj
\ No newline at end of file
--- /dev/null
+xÚí\9cÑ\ e\83 \fEßû5ðÿ?·e\13\85¥ÕÍÍ^²\1c4f\19\81Håp[1-e)UQÊV¬û]\9eU\99W÷Nî5ù§o\93*8|\9b\8c÷\eÛ©ìW¹£\8f\9a\ 46\19\9ebk\e?Ý÷ÿ\8f{\8bf¬´\84ì|>¾sÖª\87ìür6\1cöö¸\936\87«ú°6\1aÉrÒ\9f¶=ûü\15v¸Ú²þWy±Ú\f¢¶\8a-\13¸Ê'
+ìÀ\ eìÀÎ\9f²ãÅ;q\ftQ\8dE>U\96϶öf\91¯\95ê³ìxñN\1c\ 3]TcÑ(sâ\9d®7t\aÝAwðÙ`\av`\av`\av`çkv\88wf\8ewtû;]«ùÞ\15 ;è\ eº\83Ï\ 6;°\ 3;°\ 3;°\ 3;çÙ!Þ\99;Þaoôå]\ 1º\83î ;øl°\ 3;°\ 3;°\ 3;°Ã· |\vÊ· è\ eº\83îà³Á\ eìÀ\ eìÀ\ eì\8cì(3}\8cìl.\9a\1d?«\85"Þ\89r}äÇ;Ú\\1f}¼S¦Ù\e-A\9e\9cüw\ 5Ú<9\ e;úEV\9c'§×\9d\88\9dôó\ 6¡\ 1ð\90
\ No newline at end of file
--- /dev/null
+xÚí\9ca\ e \fFÿ÷4íý/§\89c Òêâ¤]òز\18È\90\14\1e\1f\85¥ª[²¬¤=Éð[\1fEë\9f\93ÖÜósî¹m,é\9aÛfÒn/ß|kj\ä¿òj\e§?g½ÝþòÈ[qþû(NO\1f\98Zc5û\8a©SGGP[oM\e×Vá\92Ö¸´éf¼¥÷vÖL<<eÓ
++\91Ä\9aa*XG6\10¬ÄÀ\81)\98\82)\98\82)\98\82©cLåúS½6±t\7fj¨Mö]\ 2o÷ÀßW8¿D~ñ\ fO·\9aD£`\95?µ×\86N¡Sè\14k?\98\82)\98\82)\98\82)\98*É\14þÔUü)ïÌ×?\vþSIÁ=
+t
+\9dB§XûÁ\14LÁ\14LÁ\14LÁT5¦ð§®âOqæ\eîQ Sè\14:ÅÚ\ f¦`
+¦`
+¦`
+¦ø\86\16\7f\8a3_¾¡E§Ð)t
+¦`
+¦`
+¦`êâL¥\87¿yb*?2ÐÈT\145i½?U!ÆK÷§*ÄxéþT\147iý\99o\81¸IÃ\1eEI¦´\84R\95\88EÖuJ+MÆ7\vºÄ'
\ No newline at end of file
--- /dev/null
+xÚí\9cÑ
+\830\fEßó5ÍÿÿÜÆfµ\834\137ÍÝ8UD\b\936Ëñ\92\14ÓÚ2¼z´mØpß\9e¦ªk8«»¥ö\8c}åÅGì«ÉôÓ\95ÅëN}?}æÄW\93\7f:\8f\83ÈÚguàWA´Ë\8c7\f~Û\1f;)\83ÇâãÃ\98{̪ǿ+\1dÖWPþº\1aOÛ¢¤öÍþrµE\83\j\98wG)yË\96àw©À\82A\18\84A\18\84A\18\84AM\ 6%òÁá\99æ2ùà`µµ\1a2«\92d\15\94³l\96¯àÚ|p}¦eqP\92\ f¢\83è :\88\ e \f \f \f \fÂàe\fjæ\83³=úlïþT\e5\99\7f©É \83è :\88\ e \f \f \f \fÂà©\f²Gÿë{ôÔdö×dÐAt\10\1dD\aa\10\ 6a\10\ 6a\10\ 6a\10\ 6a\90ï&Ø£§&Ãw\13è :\88\ e \f \f \f \fÖ1¨ÒÙð\95Á-MRb0éÖW\98\ ff½\rëöèuz\e\8e5\99&Y\93iI\7fѺ\9a\8cN\7fÑ\80A\97»P\7fÑQ\aS\ 6«Î\eþL}4
\ No newline at end of file
--- /dev/null
+xÚíÝA\ e\82@\10DÑ}\9ffæþ\97ÓD\10Ð\ 1\13\17N%¾\81\10Ón çü,ÚÖ\96ÕSVÛVí>·ÇW³\8fó»\97CöaïzÈ6îÝÉUü¼~Ò»·{`ný\95\8a¸õ\81ÙÉÝ»dvVýy~µrÒ\13·Z¯"çq·Ûk{>g$ÅáXK¶õÈU}m\b÷ja¤GÞx\98Å,f1\8bYÌbö¿\99\8dòÙ]½z¬\91Ì\9e½\83\9a^¯\90.\8dë5Ó[?Öå¬\9c\95³r\16³\98Å,f1\8bYÌòY>Ëgù¬\9c\95³rVÎb\16³\98Å,f1\8bY>Ëgù,\9f\95³rVÎúm\8cYÌb\16³\98Å,fù,\9få³|VÎÊY9\8bYÌb\16³\98Å,fù,\9få³|VÎÊY9+g1\8bYÌb\16³\98ý\8aÙ\8b ½\ 1̦M7>2{9\1azºÏ¶h\9fm\173Éçûlò|ã\1e9ßxóÙ¼\99ä#f#\9fx\956 ÿ\98³-î\7f\ 4vë\ 6%\85N'
\ No newline at end of file
--- /dev/null
+xÚíÝáJÃ0\14\ 6Ðÿ÷i\92÷\7f9\ 5[ÛJÓÉ\98ók{²1Äb\98!gßnhHkSë\89-V?·¯KI¯»ïôó×\81ÏÝ1í\81\8fý1Ýû§Æ£Ý\8e/½¨·Á\98\8eæÉ`\16\8dþê/zû)*º=°\9f3Ú\8fì¿g6\1eõöý^k6ÖÓ\1f5\8fCæÇéêYË<ÉK¨ÍkMùÚã[õy@ÓGµ&_=~¢²Ï>ûì³Ï>ûì³\7f\eûãµ¾ +õþõ\90'{«\84Õ§_õVË\8aÚx-âJýËø<Ó\9bÜ\97ûr_î³Ï>ûì³Ï>ûì³\7fiûêý;×ûù÷ö\9crOîË}¹/÷Ùg\9f}öÙg\9f}öÙ¿¦}õþ½ë}÷ö¼xOîË}¹/÷Ùg\9f}öÙg\9f}öÙ·\97G½o/\8f{{ìå\91ûr_îûÎÏ>ûì³Ï>ûì³o/\8fzß^\1e÷öØË#÷å¾Ü÷\9d\9f}öÙg\9f}öÙ¿\86ý£\13d²ì'\9fʳµ\7f|ÔQR½ßNSï·Ã3¹\92êý³\9cËÓãÏåYÖú²ÏäÚ³\1fÿ\89ZÉ'Çms¿E\9fÇ·j\1f\a\9b5ø
\ No newline at end of file
--- /dev/null
+xÚíÝa\8aÂ0\10\ 6Ðÿ9MrÿËí¢M SÜ*:a_-²\905hh_¿\ e)©uÛZÖ\1e[éþ®÷¦lïÓoûÛ\92s\9f\8fmKú\9a\8fíø\9bNÇ{òÿãHÌ?xÏ`l\87#fï9>\92Ú\9f[¯õ\19\9deé·Ð\84Ï\8eß\93¡ ï?þ^ìóöm÷ó®ð*û/KËm¿\97ãhËy%\eÞËv-nKl¥í\ 3»Âè\96í¤kK\1c¸L`\ 2\13\98À\ 4&\ 4&Ìê g5\86¯µ\95(·gºwxôY¢Ü\9eîÞáa¬\9epVcøZ[\89Æ#O=¡ëSN\90\13ä\ 49Á½\ 3\13\98À\ 4&0\81 L`\ 2\13\98\90Ç\84¥ê ¹ç'tj\8cj\8c]\8dQN\90\13ä\ 49Á½\ 3\13\98À\ 4&0\81 L`\ 2\13\98\90Á\ 4s\96ÌYRcü@\8dQN\90\13ä\ 49\81 L`\ 2\13\98À\ 4&0\81 L`\82ç"ÍYRcô\¤\9c 'È r\ 2\13\98À\ 4&0\81 L`\ 2\13\98À\ 4ÏE\9a³¤Æè¹H9AN\90\13ä\ 4&0\81 L`\ 2\13\98À\ 4&ü\e\13²¯\f7\9apÜ6¯`Â|õ²¬õ\84hm¸\9cs\96ò¯\r××\18ëR5Æ\1a¬\17\99³Æ\98\7f½È\89 k\Ì\16X/²Ï \91 )÷\1fg\ 59È
\ No newline at end of file
--- /dev/null
+xÚíÝÑn\84 \10\85á{\9e\ 6ÞÿåÚ¤*4\ 1vÛ´u¦û¡1\e\89£²ø{<\81LGi\91Kí¥\f¿ëGUÌíä\8aß÷Ç]çmÜ\ 2/ó6\9eÜÛjÿõ?mZ¤m\ eüzÌy\e/úξgÍjÏ\13ÿ\ÌÕ\93\97¢<`Å_¶ã>f{\8a\15¿Ð\1f¿\1d³_ñù,¶,K9o 4\8eǵô\1e\14ù\8d7lËñÞniJig\ 3giår<¤-MGÆ
+¬À
+¬À
+¬À
+¬xuVÄ÷+zÌÒRø\15CÌr9\87+Gqç6ÞQW\9eñb"ø\15×Qe×ï"ù\15WLº\82® +è
+ß X\81\15X\81\15X\81\15X\81\15X\81\15/Á\8a|~Åj,Ön\8cÖmu¼MÞæÚÛ¤+è
+º\82®ð\r\82\15X\81\15X\81\15X\81\15X\81\15Xñ¯Ya,\96±X¼Í;¼Mº\82® +è
+ß X\81\15X\81\15X\81\15X\81\15X\81\15æ\99\1a\8be\9e)oÓ<Sº\82® +è
+¬À
+¬À
+¬À
+¬À
+¬À
+¬0ÏÔX,Þ¦y¦t\ 5]AWÐ\15X\81\15X\81\15X\81\15X\81\15X\81\15;V¤H\ 3ù\89\1592m\8e¬Øe3\8déWdÉQØÇbeÉQؽÍ]>Ó\98Þf\92|¦\83·\99\96\155\8d²H\93û¸ë\8a\9aí¥÷\ 67/D\1c
\ No newline at end of file
--- /dev/null
+xÚ\9d\90Q\ eÀ \bCÿ9M{ÿËi\1c]èÒýX\891¤À\13 Å-½\vC!»\9dÉ\e³Dìû7\rW\fìÙ\9c§Ø&rDñ)~\19Î]<\ 2MÎ ·3(>{\10\83ïA\f¡«ÿí\8ea\ 1²¼Sý
\ No newline at end of file
--- /dev/null
+xÚ\9dQA\ eÀ \b»÷5öÿ\9fÛ2)\ 3êe+Ä(XmÊZ\ 1\ 6tÆ*(õÚ¹«;\9dÃ\bçtJã<å³\82\86_Ú¤\873°o\16\8a\12Ü\ f½Ú´"Ì¢\ 1\14a²\10zh\1f}Ñ&\ fqv\80µSGÊÖ\99,ó-÷\87\99J\9bÍ4}³\99¦oS[â\ 2ü}w\ 6
\ No newline at end of file
--- /dev/null
+xÚÕRA
+À0\fºû\9aäÿ\9fÛXc\90Ôõ²ÓL(4E\94Ô\88B
+8C\bÖܾ޳nÃM©\9d+lÇ\9dªÃÕ\86O\9eé1]\81&\95Ú\8d¥4UëD-6-\90$:6ÊdZá?yæ\7fÛlôÝf£?í\98\rå\8e8?\9eß²±<Ûlô\9e}\9e¹g\9bgö\ 5\bí *
\ No newline at end of file
--- /dev/null
+xÚí\94A\ eÀ \b\ 4ï¼\86ýÿçÚT \18`½ôèj<PÜ0¡¢jB#ÿ&\9a´âù,Yo´îê\85fU¯Ùjó*UõÕ\8fú\95ÑYÀ\96¬[\83\95oY5\f\8c~\8a5\fT\ 27bnb, \85]ÆË\98\7fû\8fñü\82\90³¦\91\83-\8b¹Ñ÷\18ñÃÌqF:s¢\8ftæD\1f\19cè\ 1Øh\ 4Ù
\ No newline at end of file
--- /dev/null
+xÚíVQ\ eÅ \bûïiàþ\97{K&\11·ÂêÇû\13\8dYX¤³Ø\81Ù0ï̦!=Ûý\8atÇån&Åðfp\8cWL
+±`¤/¯<Ï\93KVrU¢\14\1öbGpáê@ÄìÓ\91&fNë\8c/+ƽqÙà\ 1 ¢`ðàòA\ eWÿçêS\83É\ 3ßRGpõþ_5\1e|Æ|zÀ\15×xν:\1a\14¸¢\15ªåJ©\82+WE©m4hÛ\1a4Ú3t\1aÜ\83.×Á©Ag`\É\19\81Òù¬÷ʤþ*Ù\ fÅFÈô
\ No newline at end of file
--- /dev/null
+xÚíWÑ\ eà \b|çkàÿ\7f®K¦ÂÜQ¹-Ë^@c\1aª"Wr^U\87YÅÔM³>_Ý\8f`åÃ\7fî8¦\15\1a\8e¹\a\80GÁ1\93\9c`\96\eB\94Ý`;\ f»ù+ØÂì}åÄÌØ&s£Òç\8c]<§J\ 5\85QF=\1amb3 \eU\ 6\8cF'ÚØ6¶\7fÆ\96á\84E âü\80¹5õJa÷w\1aZØÖù60¢¬\e
+ß[¹·ë¶9¡±ý9¶\94ì{Á\96S\9a\11Û\Ý\9e8\81Õ`k&Á\9cos}{â[Rß\ 6¾ý\1a[¥+\97þwðºÕO\8bè\ 2d^jW
\ No newline at end of file
--- /dev/null
+xÚí\97K\ eÀ \bD÷s\1a¸ÿåÚ¤\12µE~Ý\82\8dihÌÄ'\99
+Ñ\b\8e\ 6ÍÀòNÏ'oVWßéà£jspèÚ\a\15CzÓþìÑο©¥Ãaî¨\9bÌÏg!«\85#W\ 6D%~ÜË\83Y?±JÛf\8cÚåR\80E¸¢\8eÁ\90K\eoæͼ\99Ç\98§ü|É\83Ë\8e*ÌOÿP7\8f \8a\9e\87åÛn¾ë¼½¥\997ó\ 3sã\86\1c`\9e½\9dïÌÍÖÀõsúåçdôD¾\9fÿ¹\9fsé~>ý<ß\13iÌK'\8el'¸×9¥ûÐ%.ÆîÄ7
\ No newline at end of file
--- /dev/null
+xÚíWQ\ eÅ \bûïiäþ\97{K\9eNL\10k?\17\90\98e$\8cQ´ikÝìÆÚ4¸çö\ f1{\98á\89ð\1e×`\17+®!úÚ®ºM\rÁ?\8f\fáû \93\92\1d°È1b°8\86\9e\f£·¦.\8cÞ^\8d\83wÌÞò\13¹ìèsn²ÁF\ 1j\15è\8d5¹\11\85EaQX|\1a\8b=w\13\11ä¼@°\192v<òÅ\8bÅ\9e»\89\b\96|4w»êê\Ô\1dUX\14\16\1fÇBQz+\16óÊT±ÈT\16Ç\17¹ÖcøBÓz\9e/4ç8Õë,\91»5Ý\1d`¡\ f¥¨»ý¹È± ü\aOV$\r
\ No newline at end of file
--- /dev/null
+xÚí\98K\ eÄ \b@÷\9c\ 6î\7f¹\99dThÃðí¦ hLSSE\9e\14\14q e\ 5Y@<ã¯+Þ*£|ß窮\v%\8b®\8b>¥¡¨®\8b¹zÃ*7ë\96Åe´\17¤öÆ\19\196ãQ¶½©S`\ f\9aÞ.²\ 2¯>»sE\vË'¨%@[\91\8e6°@PË0Ãh\18\r£aô\ 2FÕxt\ 2\19pl²2\ 3§\ fÂóý\v\8d\87Q-g\101\1cN\86feo^ßøÑüë\86Ñ0\1aF¯dT>N_\18ÕOö\92\91wË\10\8bG\9d3ìùªu\86å\9cÁ»g\88å\f\8d{\ 6\913<Ê\b[\9eÔº\vb?Â'6ï\a^º\8a\12
\ No newline at end of file
--- /dev/null
+xÚí\98Ñ\ eà \bEßù\1aøÿ\9fÛ²i\8bÙÅVäaË.\9a¦±F©§pST\9bYÖô4q÷ú~´z\85«=\9fä:öÍ\92\rû6î\19ø\eÍüôm8\91¾\1a:#0\13Pض\90iDy:\1e2Å '§ùZs±\8a&}Ïôçæ»\9c\r\910\¥Å\9a\95\98Xw¬Â;iP¬äàÈ\94L\7f\9c)ÒS¬±\17£\12eÔ\95Ü{h\88D\19u9÷\1eL\91\9eb\8d½\18\95©JÞÒS÷\1e\8cSÆ)\99\92)\99ÞgZ\9a{÷þeÜø\9fé)ã\94qJ¦dú\1dLw+\83#Ó3-V0ÅÕ·lî\8dj\83¹\7f\99ýÚ ×S-ÕS\rê½9=ݯ÷\ 2¦5ÁPPïõq\1a1Mõ\a?ågÓ
\ No newline at end of file
--- /dev/null
+xÚí\99Q\ e\840\bDÿ9\rÜÿr»ÉÚR³LÕvök\87\9aÆ`´¤¯0 º\1f\16;æi6ÜûçÑÚ\|ñí_¿ê\18ccÔ1\16«¢h¾ýu\8c§½ioÞó#2\14\83¬\11}x*.YûtÃ&¸±
+Ö°¶ÀÖq\1c/K\82;\193ÌväeÐÌ¢\ 5È\8aÒ\ e\82AÛH±\16ë?`]é5ÒðK¿¡Êü´\86w¿!}{Zû߲\9eW
+\8c\94yâ·¾À\9e^§_y¼\16k±\16k±\96^K¯\95תáb-ÖbÝYSÚ¸'Ö\9cNóÈ\1auÃ×õ\9aÕ#M½fõHS¯Q?|]¯IýðA¯\7fÆÚi\99Mû÷\91yíì¤y\ 1uWà\11
\ No newline at end of file
--- /dev/null
+xÚí\9aa\ e\830\b\85ÿs\1a¸ÿå¶dÅêÒÒFx[²=4ÆH\96\16ù\8ao\8aj3«4í&§s}¹*\8eÃ\11\9e\97\v÷a\fV¸\8dc\88&3\9eêÜ5\89arWç^\1faþ«÷LClÉÒz\9eqì\e,ÝÌÑ1\86xî\rµ\89SQ»\1cN»ô»]·¢/GiuÄ`&æ\ 1 ¢\90\96w\83%\82,\91%²D\96È\12Yú"K\b½t¸¤+åHE'|R2Ï(v1¨öv\96¢ÿqi\1fë\12ë\12\9fqd\89,\91%²D\96~\80¥\8fè%Ø»Jjï}íͺĺÄg\1cY"Kd\89,ý+Kñ\17ö
+\96\10]\ 2W\96të+sF/)ü]¥.zNòÚ\eÝ'`°>\81®½1='#\96`+b\83¥l]Z±\94¶\a¬ýð
\ No newline at end of file
--- /dev/null
+xÚí\9aQ\ eà \fCÿ}\1arÿËm\93Ê`\1déÚÊfªj\90ò\81T\ 2é#±\10¥Ô\16äÞ54'\11tûí\85îf¼\17aÈÐ\87o°\96$\b±c<ÙËêãÝÓÕñHÝ Ìh8\14\84lÕÛûþÁ\18ëo=½Ä\84\8eŧàHv\16º©;\8bz\80¤!\83|\1f/\8bF\8eÐ\8d\193cfÌ\8c\89\19S×Ê\85±±\1eã\8d\82¼êñ\f8©K\8e)\e4©9\16 \94Qç1ç1×J3fÆÌØÅ\19\9bS+Åw\17Öcçõ\98ó\98ó\98k¥\193cfìº\8cùîâ¾zÌyÌy̵Ò\8c\99±\e1¦{¨²bL÷¶çÍX\99S+ó\90\11ï.to{>ô\98îmO§ÇJ\1a2²\1eû3cÄ<6ãXn0F´\ f\r)\8f\10
\ No newline at end of file
--- /dev/null
+xÚí\9aA
+Ä0\bE÷\9eFï\7f¹a MÒ\99\18\98N¾Px)¸pQ£¼è_è~\9e\10|ñ\1e(b¿\9dF\92\84\9aç$.\9f\8da¿o\93ÝòWÿGNÚPæUÇ\96·\89Mþ%{\87ëo\7fôHQôÙ\11Uñl¯Ö´¿\1f¬\9d\ fL^>+Éçm\93#\ e\ 5{°\a{\8feo&Y2\19sÛoM\95)gncO9s\9bßZ\8a³´3\ 5wÇo\99\84Ú+Âè{ô=f.ìÁ\1eìÁ\1ez\ f½\87Þ£ïÑ÷\98¹°\a{°\a{è=ô\1ez\8f¾GßcæÂ\1eìÁÞsÙkCQÏ\9epÓíÊ^¶\80&Ñ{^£÷¼NïÊ·UïÕìï\rìe5\16°ç\15}¯æE\89wG\aû\ 2ßn+o
\ No newline at end of file
--- /dev/null
+xÚí\9aA
+\850\fD÷9MrÿË}\ 4µ\15Ú*\98\f_x-d\11\90\98ú:Î"îÇ\8a¢Ý-kÅ"\8aâ¨\9a¢\9c\95\1fd\8c{\9b¿Õ»ü¤·ñã¯ó³ÞÊ×\92ɬ|<b2+ßU\vá¶ýÊîÚ%Z}\89.Úq\ 1%Gi²¾¶h\rQA9\98\84I\98\84I\98üG&\8b\9dÉ\9e·<ßø oÍ:Ï,ubÞ2}ãmÞ\84_\r\9dD'ÑI\98\84I\98\84I\98ÄOâ'ñ\93è$: \930 \930 \93øIü$~\12\9dD'ùwÃ$LÂä\87\99TÌOvLVOO^\98<\eÓøÉòùÉÞOúb\14µÄOºÎOºÖOº\90Ê\9b\99Þt\9d\3\99¬\93®<Ê\1fG¼Í«
\ No newline at end of file
--- /dev/null
+xÚí\9aQ\ e\83 \10Dÿ÷4pÿ˵M´PeQ\91\9d6éÃd?Ô¸°>'\83\90ÒÚràQ5+ s\ e\8dû\8c¡)Ûc\14\95Õê\127úÕ-ÑÕó»1nní\96ºqÿÉ\94\96ÔÍ\ 6Jtgô\a¬^îÊ\89wÿÌ\98Å\87-ù\83?ÿ*\9a&M\15mý@ee5éø^Ñ
+c¢\94°
+«°
+«\7fÀªÒ\ 3,¬¶ýªïbï\1¿×3ýjõ4ó\1dØT¿Z\9efÅ¢·\8d»oé\a¯ «è*º
+«°
+«°
+«°:\9bUüêt¿*ü¿ú½¹\15º\8a®¢«°
+«°
+«°
+«\93Xů²\160<·BWÑUt\15Va\15Va\15V\83YÕl
+Þ°ªÙkýf5éýª_Ö ¿ªÙkýáW5{«µ\80ä\965pnõC¬\ 6éªZ\ 2:¬\ 6Å\a bv\1e
\ No newline at end of file
--- /dev/null
+xÚí\9bY\ eà \fDÿç4pÿËU\95²\90\16ÈêIª>"ù\a%6æed\v\91Ò8rðS\fÍNs\8eµU¯ánëk5¦Xe\bøjÑ\ f\13»Þª®u\97Ûî¦ô¿ö±VÛXgøê,l`øøîuÝÊÀî÷£!\82h\89XZù\\15Vã\ flM±ìë|[ͬ\1aÝÂ0\fÃ0\fÃ0\fÿ\ 1Ãí\96#hF'ëøc]\81²±\1e\9e¾¦iéí>ìú\19\9d\8eûH\16Ðat\18\1d\86a\18\86a\18\86a\18~<ÃÔÃ\86zØyÆqkO\87\ e£Ãè0\fÃ0\fÃ0\fÃðÃ\19¦\1eæ\8cãª\9e\ e\1dF\87Ña\18\86a\18\86a\18þ)\86§2ÇË°éfÃ\92áþ%\83Àz8ùëátO=¼\9eâ\803\ eÿ=\8e\82áÖî\ 53\9cÜ:ìÿc\8dw\91
+û\ 2\90V$¢
\ No newline at end of file
--- /dev/null
+xÚí\9b[
+Ä \fEÿ³\9adÿ\9b\e\ 6ú°\8cÆi;^az,ø#6Æ\9e^r\11Ý×\16\82§h¶\a\8e\10ôµÈêÐ&Ýì¨çÜ^amýËÀ\95Y\9f9×_Òغô\ 35C·r\966ë®ðt^ù^ÅWlûÅÐ\19\ 3Eä\98ôز~É¿|èM\e®èmýÁåÛmSò}÷¶Ó(\ e\rÛ°\rÛ°\rÛ°}\8emQ½]\8cZ§Vüq½]¼ÓvËѲ"\99M¹1fÙúGÔÛÛ,\vq½½ÍB·Ñmt\e¶a\e¶a\e¶a\e¶\1fÂöÄz»eF²3\9d»cxI¹\97D·Ñmt\e¶a\e¶a\e¶a\e¶ÿ\9fmÎnð\92ý$º\8dn£Û°\rÛ°\rÛ°\rÛ\8fa[}ï¦`[yëæÀö\96°¾Þ\96Þ»)Ïn<¹æ4ÜKú\1c/éó¼¤O¢»s§l¨nçl\ fÔm\9fµÝ/GëÙ\e
\ No newline at end of file
--- /dev/null
+xÚí\9cÝ
+à \fFïó4úþ/·\rúc§\11\8b«_\18Ç\82\17+¸\18{ü\12\15SÚK\16<E±Ó\90\9c%um\89Ä\94¶OÄÃcåPÕNsûÑuõÝß+\9f\f\9aÒ\1dʺ\9dQS,E)Öµ÷^ÿf¼Õaç\97_ÃHkoKr\90Ç6»DÓZQ\9böï\8bÚö F><\16Â\1f\9fÚÎo[l
+ìÀ\ eìÀÎ\9f²Ó
+©ý0û¡7Ö\89µVÆl\e;\11b¶\8d\9d\96ëü\1cè\997æõfM¾S´\86î ;è\ e1\eìÀ\ eìÀ\ eìÀ\ eìL³C¾\13<ßQíï\9c\ 5[+@wÐ\1dt\87\98\rv`\av`\av`\av&Ù!ß \9bï°7ÚX+@wÐ\1dt\87\98\rv`\av`\av`\av8\vÊYPÎ\82¢;è\ eºCÌ\ 6;°\ 3;°\ 3;°saG{\99Ä\17;Ú»>\ evR\9c|Ç\e\9eåù\8eö®\8fK¾£½ë£Ø\eMÎðHÖ
+\82³#Ð\9d(S\9bËÎòú\ 5qÌçd
\ No newline at end of file
--- /dev/null
+xÚí\9cA\ e\84 \fE÷=\rÜÿr\93I\14ë\8cTY@¿ÉÃ\84Å0!µøø|1\94²\97\9at¹bG0µæÔ\97Ѥ\85s\9d\e\81¡2\1fZ/îç¿o\8da\16\82ìøÜ\ÿq¬ã\1a\ ezÜÛOnÒ\8bMºÏñÞn\99\9añt\84áX"Kÿ\97m\91eM}çÚòCpµí\13\90ÄP\99L^¾µ\1d\8c\b\84\ 3S0\ 5S0\ 5S0\ 5S£L ø)Ç\94\82\9fÚ\98êYß¾%\9eÔbÑý,õS\8d©l?ÕzC§Ð)t\8aµ\1fLÁ\14LÁ\14LÁ\14LI2\85\9fz\8d\9f\8aRX\17¶h¾£@§Ð)t\8aµ\1fLÁ\14LÁ\14LÁ\14LI1\85\9fz\91\9fbÏ·ó\8e\ 2\9dB§Ð)Ö~0\ 5S0\ 5S0\ 5S0Å7´ø)ö|ù\86\16\9dB§Ð)\98\82)\98\82)\98\82©÷3Õ\96«\1aL%\9f\ftfª¬wM±\9f*:~ªhù©»¡Zºç«sn\92cª÷\14$1UTtJgÆ\118\8bÌÕ\1fOYºE
\ No newline at end of file
--- /dev/null
+xÚí\9cÑ
+à \fEßó5úÿ?W6Zµ ¦-\9b^é±à\832\89q§×Äb\bG\89\13\9f¢X6(Æ\89uÍ"\15\93LbÑbÝGuû÷\8eμ®··Gkø¨:HwA[¿j\9aÔm¯øH¢ø¬Ý\9eï3ïÅ\e¬ýîßâOðkQ\14{l·|ê»èT\9b\86\19EmÇ\vJfÙLÊ?\9fÚ2\1d"&Á\1a¬Á\1a¬Á\1a¬Á\1a¬ÁÚ\12¬)Äk©ÝRf¢\97µ\18Ùc\7f\9dï\93ÑÌ\89Ó\aåF\8aÑ,§\93z©¦\81=è\1aº\86®±\87\845X\835X\835X\83µ7±F¼¶\¼¦p\96\9dÚUs#è\1aº\86®±\87\845X\835X\835X\83µ\17°F¼¶d¼ÆYö\95Ü\bº\86®¡kì!a\rÖ`\rÖ`\rÖ`\8do\8f\89×8ËæÛct\r]C×ØCÂ\1a¬Á\1a¬Á\1a¬\rgMå\1e\825\85[´N¬%\aéÄk\12÷h\95ñZp®?\9b\12¯IÜ£\95ϲ\83^n$\88ÑæÞY7A×\1cÖÆëZP[¶\rfÈ\930
\ No newline at end of file
--- /dev/null
+xÚíÜÑnà \f\85á{?\r¼ÿËu\93Ú\86\85´\9d2»ÕG$n\88\88cççÈF¡µKëÉ×Ðb3ª÷ôþÖªt³îûªP\bc\fçÌ¥Ó7[\ 6¢?9:ñÕý['\ e\7féÁë9'¾*Ó\96\f\1eà\8fGæÜa°½hÖ_¿¹/«zÁ+Î6\16XB\87>ê\982ôqYÀJ\850Êùé»\8f\8d\9aBfa\10\83\18Ä \ 61\88Áª\f\16È\a\879c7Gë ùOl©ô,Å^¥ß\a\8dÅê½\93òÁ3\83ÕòA:H\aé \1dÄ \ 61\88A\fb\10\83\18Äàÿ0X4\1f\9c%Ù«½û#ÇÔd>¢&C\aé \1d¤\83\18Ä \ 61\88A\fb\10\83\18<\9aA{ôo¿G¯&óLM\86\ eÒA:H\a1\88A\fb\10\83\18Ä \ 61è¿ {ôj2þ\9b \83t\90\ eb\10\83\18Ä \ 61\88A\f&1Xç`¼_\fÖ9ÛðÊ`«\99\ f®B\98¶G_çlÃ\1f5\99:g\e\ e5\99¶\bajMæÍ\18LÔÁ\8aËè\ e\83Iý <|r.
\ No newline at end of file
--- /dev/null
+xÚíÜQ\ e\820\10\84á÷=\r½ÿå\8c\89B5\88
+Ñ\8eæ\83¤/\8dͲåïØIÙiº^-àî®Z\ 2km|»\1aYDhë9\v\9bÎêÃ\{\92KÇÆ\13¶·{\9f\8fy\97³Ç3ßv\86¶\7fÌ»\9cE]u`RÚÇrý"\9bß}\aÛ\12Y\v½ë\12eÂ2{ÛVV8][×\ 5.n:+2_ç¶\16ÊÂBÃ&6±\89Mlb\13\9bØÄ&6ß`3i¿9\8fY³\ 3³åÎ\8cè«¡yÙúU}Ô\9f82f-vÚ\96Õ6 \8fnÒMºI7±\89Mlb\13\9bØÄ&6±ùólæî7ãÎ\1eð\82þÕ\v¢\9bt\93nÒMlb\13\9bØÄ&6±\89Mlþ2\9bÎ\1eüÍÙ\ 3^Ð\ e/\88nÒMºI7±\89Mlb\13\9bØÄ&6±é;\14g\ fxA¾C¡\9bt\93núO\8bMlb\13\9bØÄ&6±y\80Íy\17\95ÇfP¥Õ[6\9f\154\1dºßÌ«\81Ù\12k`v^Ð+Ó9Ä\vʬOÛ±ùð}\19Ïæ\94¨\9b\99+ZXíè®=\ 1:iWE
\ No newline at end of file
--- /dev/null
+xÚíÜM
+\830\14Eáù[M²ÿÍ\95\82\11ü£\ 3s¡_\84\f\1e\14\9e\89ÇÛã }F\ f¹\86Qks½\87Ì{Ý%¶Wq\eÛ÷×îø.\9e\1f¬ÝþÏ\1f¯\1f]Ü8evV½ßbvV}è®\a_µÜEÌ»n3W^KÃ\\9f\17`äÖV캽çZ\11\ el\ f³\98Å,f1\8bYÌþ;³af±Ôk\9e·Þ¨×úiàè\93ÁÄzÍôÖËz\ 5?urVÎÊY9\8bYÌb\16³\98Å,fù,\9få³|VÎÊY9+g1\8bYÌb\16³\98Å,\9få³|\96ÏÊY9+gý7Æ,f1\8bYÌb\16³|\96ÏòY>+gå¬\9cÅ,f1\8bYÌb\16³|\96ÏòY>+gå¬\9c\95³\98Å,f1\8bYÌþÈlâùÆ\ 3³i§\eo\98ý.\¦ÏÆ\9do<úl;9º:Âg[®Ï¶l\9fmÁÔ^\9cI>=gÏ\99\9d\9c³-yk_\1cTAµ
\ No newline at end of file
--- /dev/null
+xÚíÜÑ\8e \10\85áûy\9aòþ/ç\9a¨E)Æ®\9bî1~4áÂ\1a\9c\ eý93\b,˵´ «+µ\1aØZT=Z\18eâ¶\ fC»¹ú.\1f\9d<sþô¹\9fvÙÞÏ\a\1f>~iß\8fµ§¯ÊÞÖ&>\8c,\13\96ÿÔ\1fï´6eù\98·í\95Ö~,láW]ì\r\e®»º2Íêêº\ e\90±Ý\Ñþ;×µ2\15j"\96±\8ce,\1fËrX\8cݵVÓ(í\7fcìµµZÓ\961\91\99§8\aÞ©í§\8f\89±/,'ÇØt\99.Óeº\8ce,c\19ËXÆ2\96±\8cåß±,_þ\8a|ytõü\1fç£ï|ÎÜ\17]¦Ët\99.c\19ËXÆ2\96±\8ce,cy\17Ëòå/É\97\15ysî\8b.ÓeºL\97±\8ce,c\19ËXÆ2\96±lo\85|ÙZ\11{+è2]¦Ëbl,c\19ËXÆ2\96±\8ce{+äËÖ\8aØ[A\97é2]¦ËXÆ2\96±\8ce,c9\8fåÌCÐ\1fXÎ<ëþÆò\92\9f/owsP¾\9cyÖý]¾\9cyÖ}·VdÙìæ°¹¯\8fd9J\97Ó\87ì)Ë1õ jI2ë
\ No newline at end of file
--- /dev/null
+xÚíÝQ\8e\820\14\ 5Ðÿ·\9a²ÿÍM&A,NĘ̈!\97x0é\87&XZ\ e×\87\10Z»-KØ«[êÞÉeÉj\87½\8cëæx,\83§¼ú.ï·g}ë`;ÿþþ+k{\18ËÑ~1\9f\8eÿ}á+k{\18ËØ¥\9e\99¾SGùWãgî}\87ݬ@Û?_µö8í\90¾o+·k][·\ 3hô\94Wü8~·u·\19ÜMÆ\19g\9cqÆ\19g|j<õ·ú¶¶Ú*ßq=<¯\94Ïü¤æÛ\93R\8fwÆ\93ëñÕøø\14ÌüÄÌé\9fÈq9.Çå8ã\8c3Î8ã\8c3Î8ãIÆÕã\1fU\8fGÿ?~µsnr\\8eËq9Î8ã\8c3Î8ã\8c3Îx\80qõøÇÕã®\81yç979.Çå¸\1cg\9cqÆ\19g\9cqÆ\19gÜ=)êq×À¸'E\8eËq9.Ç\19g\9cqÆ\19g\9cqÆ\19wO\8azÜ50îI\91ãr\\8eûÎ8ã\8c3Î8ã\8c_ÆøVvd\e\ f}²ÇÞøü¡\19aõx˯ÇÛ5êñã)\ f¹\ 6&ÿ9)\9dñÙÞ\14f¼¥çxþ\113øYH]û\ 5S^*/
\ No newline at end of file
--- /dev/null
+xÚíÝÝjÃ0\f\ 6Ð{=Mòþ/·\rRbÖH¬û«´\9d\14r\13j\Ç=ý,\1cºm·coúZ\8e8;»ïmÏ÷½mÛÝë±\1d0\15b\9d\16÷\83_ß\9at$\1e~Wu5\19ÛÇ\9aNnÜ'?dÕf2¶í\8f(oÁï\8dßGÚ,Løþù÷õ6_{»\ fzÅÑ÷Æ?\rË9úwq9Ç\rà\11S!Æ\8cëÛ9Îoë\80î2\81 L`\ 2\13\98\90\98pµ\8c¬\96\96O»\16Enï¶v8L\98²v8L¸º U\8dáY×"ûd}ê K\9br\82\9c 'È Ö\ eL`\ 2\13\98À\ 4&0\81 L`B'\13fÕ\13:ïO8ÛTcTc\k\8cr\82\9c 'È Ö\ eL`\ 2\13\98À\ 4&0\81 L`B\ 3\13ìY²gI\8dñ§k\8cr\82\9c 'È Ö\ eL`\ 2\13\98À\ 4&0\81 L`\82ç"íYRcô\¤\9c 'È r\ 2\13\98À\ 4&0\81 L`\ 2\13\98À\ 4ÏEÚ³¤Æè¹H9AN\90\13ä\ 4&0\81 L`\ 2\13\98À\ 4&ü'\13úÿ!Ø;\13êÅq+\13¶Yõ\84l*´Ü³´þ=Ø\80\1aã9¶\ 3j\8c[2\15ÚÖ\18ÿ\80 Ms¤\9f\87Ô\84\96ç\17ë*Ø
\ No newline at end of file
--- /dev/null
+xÚ\9d\90Q
+À0\fBÿ=\8dÞÿr\e]\9a\98-?]\ 2Rl\90\87ä\1eÝ\e\832\95¦¹nc
+ð[\8e¹öÝnù\8fAÃ".\96j+êi
+\ 5~\8bx3<úaXÚ{H\86ÖC1x\ fÉÀ)â\84á\ 2¤üSå
\ No newline at end of file
--- /dev/null
+xÚ\9dQA\ eÀ \b»÷5ôÿ\9f[F@©àa\83\84ÄÔÖZ̲\18\1d\85\r\90>;\92ÐÀQ±ÊIÖÀQH8Rÿ¼ñÒ\88GÉ"è\13z,\13ù½&\87ñþ;±\1eÐ'oñ»97\1e\19\94%P8%\1c÷6oǽ\9d;]ÞúNWnÝ[äf7¹\aÌÕvÔ
\ No newline at end of file
--- /dev/null
+xÚÕR9\ eÀ \fÛý\9aøÿ\9f«\8aÈQpX\98\1a$\ f\18\a\alæŲf!I2pg\15\8dSãª\15êªMZj·ºóÌÃÂ<K.ê\81Ø·
+ÂÇ\97Ñê^D\8e/è_y\9e/ßgcxVÙ0\9fBf#\8eÖÿ]BÇϽʳ\9dhí9Þ¹ËóÀ\a\9b^\9fä
\ No newline at end of file
--- /dev/null
+xÚíSA\ eÀ@\ 4¼Ïkøÿç\9a6¨¨á²Ç\928Èì0\v\117-n\86\17 ZbE0\b¶"\99£°t\1c]\17\85£µ3Ztq\18úó>"út\8aðï¡e0¾¿#Ô\9b`\90_Ë1-±Þó\8eé´câÝÍ÷òha÷\12\19~/¡Eh\994\17¦Åæ"\eä\ 2\98~Ï
\ No newline at end of file
--- /dev/null
+xÚíTA\ eÀ \b»÷5ôÿ\9f[fDYæ(\17O\13\92^¬ÅbR3/~t/L"¹Ä7SQQ\1d\1e5\85jÔ\S\97\9aiíñÎb£ß#\13Õ\86È\8f\ 3Â×+Ç£¤w#æz\ 5õx?Þ\7f㽧A-ë\9aw\95uæ\9b\91Y7$b.%AËÇ;\95w«Rµ÷ñï\95\9cox\ 1G}?\83
\ No newline at end of file
--- /dev/null
+xÚíVË\ e\800\b»÷kàÿ\7fÎh\9cC-X.\9eÆ\12\ e\8d<ì¨h6Ì\8b\13\f3À½ð,B\r\81Ô\94ó\1a,ç@\92\1aÏ\90\80d5$K¸"T|p\95%9"¼ypæ,ïâæ¡=\16<Æ\ 5Ém¡\95\7f÷\98Ô\89!\8b«?¸\12¦÷DÀ\14W"\98²\7f\7f\b(\ 2®¸\ 2Aó-Ö\-\rJ\©{0p¥lÁ\eWW\ 1]\83Ò\1e\8c\1a4º\9e?4h=\rZ_\83Öd+ýg(æ*ã*\9d+붵\ 1(ÏÇæ
\ No newline at end of file
--- /dev/null
+xÚí\96K\ eÀ \bD÷s\1a¼ÿå\9a&´Råkºiª&,H)øt\bD×jÁ\16\v=¨µÐÎQa\98\9e«P"d¹s1ZyC®|\18hey\fü\ eCvéaH°\9b7ø\1f\89+\16\16ùO\85Åu\81¥\12QÎsZtb\85°Íð7\fµvãúÀ\8ah\99\19VµÌ\fµ~èùà·1#ÿ~\87[Ë\1ff\98\1f\1c\ 6\86ùÙæfHkZ¶Jtµ\9c\9fm\1eZÎÏ6½\97ÉsÕúá\8b\f\83w¸rÍ&C×\1e߶\15f
\ No newline at end of file
--- /dev/null
+xÚí\97A\ e\800\b\ 4ïû\9aöÿ\9f3&\95ÒH)Kb¼Ð&\1c\88\14\1cqÅÖ\9eÕ\ 3[-ÌÀÞÏÖ\8c\f\85Ú9Ér¡\8fYs\f×.«ÎiÝÓ¾`´ìòØú~\97ëG\90é{c\9c\12i\83Õ\82»\Y<\ f\98.\17©|·Åì\172´Ø\16Û\9fÙ2\9a \8a\bQQ[[÷^\ 4N·ë\8088½\1dlíÏÃÁ[}[\9aPl?g+o*Ï\96\984W¶û\811 ü Õ33\98Ò[¿\Gosóbkèm\94mËômî\89\92ÿ\ eÊ^¬¢hë
\ No newline at end of file
--- /dev/null
+xÚí\97K
+À \fD÷s\9aäþ\97+-µ*5ÿm\14²\b¤c\9faT¢1Ø9\97\81YÌì\8c§êL9Â\v糶¬²ç\ 5ísù//i\87\87Ê\\84éb®\7fö©æÂÄ«âÞë-"^²D\8c\ 6H-\1diÝ;bnA¢¼\997ófîe\1et¶7\ fÙ·\1dyÌ£E:r\94<4ß6ó(üu÷y{K3oæ"óÌý|a\1e½\9doÌ?á\9c\9f\87ïç«\9f\93ò´pù9åý\9cj~N\ 5êÆ\9bÈìs\9d¹ÑçTYú\ 5¡\vÂu
\ No newline at end of file
--- /dev/null
+xÚí\97A\ e\80 \f\ 4ïû\1aøÿç\8cI\91*\ 2í6^L!é\85°¶\f¸i)mTÇT\ 3] VW\1c\15\\12ï9\90e@\974Ku^Â#\aN\ 2%:ö,ÖÙmYÈÂJ\ 2N\ 6ã\84è9¯\93\8aඩ\88vAè2\10úþ\19ÑÏ\9c\94H\16É"Yü\9aÅÜö\f+\10?`ýBXDüBX̽{¿\ 2\8bÁ.³Ëw\91ÿ¨d\91,~Î\82k\92\1e,¸^ïbQâ~±.Ãà\17\¯wó\v®×ë^«Ï\81÷îOY\98ÞEôJmX\18â\ 1ÑÏ"%
\ No newline at end of file
--- /dev/null
+xÚí\99Á\ eÄ \bDïó5ðÿ?×lÒ"Í\8aÝ\95¹u4áÀa\84>u\12kv\roÌ40\ 4Ý÷ãT±%9¯\91Ô6²ü÷ªU5\8b*s\8d\1cI\18{`¹ªÿ\99_²>S?ç}(:yâTïlï{\ 4G&E\\e\94Ö6¨õ}"\ 6A\92¤X\8bõ\vXϬ«²³Ç<Âm\19wx°fÜá\91G\94<k£ræU\1e\95eî\99«ÎµÎµX\8bµX\8bµüZ~s;\¬ÅZ¬3ë¸|y¬ /ÍwÖÕÃp˯\8dë×Æ÷ëUÛ[~Í}\ fO¬«oÓ`mÌsÍÝ\91¤\7f\1f)\1e~,Ý\v
\ No newline at end of file
--- /dev/null
+xÚí\9aá\ e\830\b\84ÿßÓÀû¿Ü²D[ÌÚâV.K¶«Iÿ`\85â'\9e\ 6³sxá\11\ 6º\ 3÷Âyä\81å\ 2\94$ùx\ fãx\ eÃ"Îéª×=\fO^&pêb¶\aÊÈYʬ\9e$ê\ 6K\9fÝ£àÁÉ\a\8e8K\9f\85Ë\fÎeÃ\8có\ 1¡¥ Ôø\9f3:\15$\17bI,\89%±$\96ÄÒ\17Yb襶
+M)¯Tô\8e\r%q®¬Èô綦Eÿ\9cX}jlØT\97T\97ô\8e\13KbI,\89%±ô\ 3,ñõ\12ã_e[%íý\8eöV]R]Ò;N,\89%±$\96þ\92%V\9f@`\89Ñ%pa©m\80§\97(}\ 2ñ_¥%í\14%ÚÛ¸ÚÛøÚÛÈ4¥='\ 5u)ai¿.\19;M\ f¾\15ù>
\ No newline at end of file
--- /dev/null
+<?php
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Exemplatory usage\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ echo "<h1>PHP QR Code</h1><hr/>";
+ \r
+ //set it to writable location, a place for temp generated PNG files\r
+ $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR;\r
+ \r
+ //html PNG location prefix\r
+ $PNG_WEB_DIR = 'temp/';\r
+\r
+ include "qrlib.php"; \r
+ \r
+ //ofcourse we need rights to create temp dir\r
+ if (!file_exists($PNG_TEMP_DIR))\r
+ mkdir($PNG_TEMP_DIR);
+ \r
+ \r
+ $filename = $PNG_TEMP_DIR.'test.png';\r
+ \r
+ //processing form input\r
+ //remember to sanitize user input in real-life solution !!!\r
+ $errorCorrectionLevel = 'L';\r
+ if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H')))\r
+ $errorCorrectionLevel = $_REQUEST['level']; \r
+\r
+ $matrixPointSize = 4;\r
+ if (isset($_REQUEST['size']))\r
+ $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10);\r
+\r
+
+ if (isset($_REQUEST['data'])) { \r
+ \r
+ //it's very important!\r
+ if (trim($_REQUEST['data']) == '')\r
+ die('data cannot be empty! <a href="?">back</a>');\r
+
+ // user data\r
+ $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png';
+ QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2); \r
+
+ } else { \r
+ \r
+ //default data
+ echo 'You can provide data in GET parameter: <a href="?data=like_that">like that</a><hr/>';
+ QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2); \r
+
+ }
+ \r
+ //display generated file
+ echo '<img src="'.$PNG_WEB_DIR.basename($filename).'" /><hr/>'; \r
+ \r
+ //config form\r
+ echo '<form action="index.php" method="post">\r
+ Data: <input name="data" value="'.(isset($_REQUEST['data'])?htmlspecialchars($_REQUEST['data']):'PHP QR Code :)').'" /> \r
+ ECC: <select name="level">\r
+ <option value="L"'.(($errorCorrectionLevel=='L')?' selected':'').'>L - smallest</option>\r
+ <option value="M"'.(($errorCorrectionLevel=='M')?' selected':'').'>M</option>\r
+ <option value="Q"'.(($errorCorrectionLevel=='Q')?' selected':'').'>Q</option>\r
+ <option value="H"'.(($errorCorrectionLevel=='H')?' selected':'').'>H - best</option>\r
+ </select> \r
+ Size: <select name="size">';\r
+ \r
+ for($i=1;$i<=10;$i++)\r
+ echo '<option value="'.$i.'"'.(($matrixPointSize==$i)?' selected':'').'>'.$i.'</option>';\r
+ \r
+ echo '</select> \r
+ <input type="submit" value="GENERATE"></form><hr/>';\r
+ \r
+ // benchmark
+ QRtools::timeBenchmark();
+
+
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * This file contains MERGED version of PHP QR Code library.\r
+ * It was auto-generated from full version for your convenience.\r
+ *\r
+ * This merged version was configured to not requre any external files,\r
+ * with disabled cache, error loging and weker but faster mask matching.\r
+ * If you need tune it up please use non-merged version.\r
+ *\r
+ * For full version, documentation, examples of use please visit:\r
+ *\r
+ * http://phpqrcode.sourceforge.net/\r
+ * https://sourceforge.net/projects/phpqrcode/\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+
+
+/*
+ * Version: 1.1.4
+ * Build: 2010100721
+ */
+
+
+
+//---- qrconst.php -----------------------------
+
+
+
+\r
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Common constants\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ // Encoding modes\r
+ \r
+ define('QR_MODE_NUL', -1);\r
+ define('QR_MODE_NUM', 0);\r
+ define('QR_MODE_AN', 1);\r
+ define('QR_MODE_8', 2);\r
+ define('QR_MODE_KANJI', 3);\r
+ define('QR_MODE_STRUCTURE', 4);\r
+\r
+ // Levels of error correction.\r
+\r
+ define('QR_ECLEVEL_L', 0);\r
+ define('QR_ECLEVEL_M', 1);\r
+ define('QR_ECLEVEL_Q', 2);\r
+ define('QR_ECLEVEL_H', 3);\r
+ \r
+ // Supported output formats\r
+ \r
+ define('QR_FORMAT_TEXT', 0);\r
+ define('QR_FORMAT_PNG', 1);\r
+ \r
+ class qrstr {\r
+ public static function set(&$srctab, $x, $y, $repl, $replLen = false) {\r
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));\r
+ }\r
+ }
+
+
+
+//---- merged_config.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Config file, tuned-up for merged verion\r
+ */\r
+ \r
+ define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there\r
+ define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true\r
+ define('QR_LOG_DIR', false); // default error logs dir \r
+ \r
+ define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code\r
+ define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly\r
+ define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false\r
+ \r
+ define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images\r
+
+
+
+
+//---- qrtools.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Toolset, handy and debug utilites.\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+\r
+ class QRtools {\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function binarize($frame)\r
+ {\r
+ $len = count($frame);\r
+ foreach ($frame as &$frameLine) {\r
+ \r
+ for($i=0; $i<$len; $i++) {\r
+ $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';\r
+ }\r
+ }\r
+ \r
+ return $frame;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')\r
+ {\r
+ $barcode_array = array();\r
+ \r
+ if (!is_array($mode))\r
+ $mode = explode(',', $mode);\r
+ \r
+ $eccLevel = 'L';\r
+ \r
+ if (count($mode) > 1) {\r
+ $eccLevel = $mode[1];\r
+ }\r
+ \r
+ $qrTab = QRcode::text($code, false, $eccLevel);\r
+ $size = count($qrTab);\r
+ \r
+ $barcode_array['num_rows'] = $size;\r
+ $barcode_array['num_cols'] = $size;\r
+ $barcode_array['bcode'] = array();\r
+ \r
+ foreach ($qrTab as $line) {\r
+ $arrAdd = array();\r
+ foreach(str_split($line) as $char)\r
+ $arrAdd[] = ($char=='1')?1:0;\r
+ $barcode_array['bcode'][] = $arrAdd;\r
+ }\r
+ \r
+ return $barcode_array;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function clearCache()\r
+ {\r
+ self::$frames = array();\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function buildCache()\r
+ {\r
+ QRtools::markTime('before_build_cache');\r
+ \r
+ $mask = new QRmask();\r
+ for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {\r
+ $frame = QRspec::newFrame($a);\r
+ if (QR_IMAGE) {\r
+ $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';\r
+ QRimage::png(self::binarize($frame), $fileName, 1, 0);\r
+ }\r
+ \r
+ $width = count($frame);\r
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));\r
+ for ($maskNo=0; $maskNo<8; $maskNo++)\r
+ $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);\r
+ }\r
+ \r
+ QRtools::markTime('after_build_cache');\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function log($outfile, $err)\r
+ {\r
+ if (QR_LOG_DIR !== false) {\r
+ if ($err != '') {\r
+ if ($outfile !== false) {\r
+ file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);\r
+ } else {\r
+ file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);\r
+ }\r
+ } \r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function dumpMask($frame) \r
+ {\r
+ $width = count($frame);\r
+ for($y=0;$y<$width;$y++) {\r
+ for($x=0;$x<$width;$x++) {\r
+ echo ord($frame[$y][$x]).',';\r
+ }\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function markTime($markerId)\r
+ {\r
+ list($usec, $sec) = explode(" ", microtime());\r
+ $time = ((float)$usec + (float)$sec);\r
+ \r
+ if (!isset($GLOBALS['qr_time_bench']))\r
+ $GLOBALS['qr_time_bench'] = array();\r
+ \r
+ $GLOBALS['qr_time_bench'][$markerId] = $time;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function timeBenchmark()\r
+ {\r
+ self::markTime('finish');\r
+ \r
+ $lastTime = 0;\r
+ $startTime = 0;\r
+ $p = 0;\r
+\r
+ echo '<table cellpadding="3" cellspacing="1">\r
+ <thead><tr style="border-bottom:1px solid silver"><td colspan="2" style="text-align:center">BENCHMARK</td></tr></thead>\r
+ <tbody>';\r
+\r
+ foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {\r
+ if ($p > 0) {\r
+ echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6).'s</td></tr>';\r
+ } else {\r
+ $startTime = $thisTime;\r
+ }\r
+ \r
+ $p++;\r
+ $lastTime = $thisTime;\r
+ }\r
+ \r
+ echo '</tbody><tfoot>\r
+ <tr style="border-top:2px solid black"><th style="text-align:right">TOTAL: </th><td>'.number_format($lastTime-$startTime, 6).'s</td></tr>\r
+ </tfoot>\r
+ </table>';\r
+ }\r
+ \r
+ }\r
+ \r
+ //##########################################################################\r
+ \r
+ QRtools::markTime('start');\r
+
+
+
+
+//---- qrspec.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * QR Code specifications\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * The following data / specifications are taken from\r
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)\r
+ * or\r
+ * "Automatic identification and data capture techniques -- \r
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ define('QRSPEC_VERSION_MAX', 40);\r
+ define('QRSPEC_WIDTH_MAX', 177);\r
+\r
+ define('QRCAP_WIDTH', 0);\r
+ define('QRCAP_WORDS', 1);\r
+ define('QRCAP_REMINDER', 2);\r
+ define('QRCAP_EC', 3);\r
+\r
+ class QRspec {\r
+ \r
+ public static $capacity = array(\r
+ array( 0, 0, 0, array( 0, 0, 0, 0)),\r
+ array( 21, 26, 0, array( 7, 10, 13, 17)), // 1\r
+ array( 25, 44, 7, array( 10, 16, 22, 28)),\r
+ array( 29, 70, 7, array( 15, 26, 36, 44)),\r
+ array( 33, 100, 7, array( 20, 36, 52, 64)),\r
+ array( 37, 134, 7, array( 26, 48, 72, 88)), // 5\r
+ array( 41, 172, 7, array( 36, 64, 96, 112)),\r
+ array( 45, 196, 0, array( 40, 72, 108, 130)),\r
+ array( 49, 242, 0, array( 48, 88, 132, 156)),\r
+ array( 53, 292, 0, array( 60, 110, 160, 192)),\r
+ array( 57, 346, 0, array( 72, 130, 192, 224)), //10\r
+ array( 61, 404, 0, array( 80, 150, 224, 264)),\r
+ array( 65, 466, 0, array( 96, 176, 260, 308)),\r
+ array( 69, 532, 0, array( 104, 198, 288, 352)),\r
+ array( 73, 581, 3, array( 120, 216, 320, 384)),\r
+ array( 77, 655, 3, array( 132, 240, 360, 432)), //15\r
+ array( 81, 733, 3, array( 144, 280, 408, 480)),\r
+ array( 85, 815, 3, array( 168, 308, 448, 532)),\r
+ array( 89, 901, 3, array( 180, 338, 504, 588)),\r
+ array( 93, 991, 3, array( 196, 364, 546, 650)),\r
+ array( 97, 1085, 3, array( 224, 416, 600, 700)), //20\r
+ array(101, 1156, 4, array( 224, 442, 644, 750)),\r
+ array(105, 1258, 4, array( 252, 476, 690, 816)),\r
+ array(109, 1364, 4, array( 270, 504, 750, 900)),\r
+ array(113, 1474, 4, array( 300, 560, 810, 960)),\r
+ array(117, 1588, 4, array( 312, 588, 870, 1050)), //25\r
+ array(121, 1706, 4, array( 336, 644, 952, 1110)),\r
+ array(125, 1828, 4, array( 360, 700, 1020, 1200)),\r
+ array(129, 1921, 3, array( 390, 728, 1050, 1260)),\r
+ array(133, 2051, 3, array( 420, 784, 1140, 1350)),\r
+ array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30\r
+ array(141, 2323, 3, array( 480, 868, 1290, 1530)),\r
+ array(145, 2465, 3, array( 510, 924, 1350, 1620)),\r
+ array(149, 2611, 3, array( 540, 980, 1440, 1710)),\r
+ array(153, 2761, 3, array( 570, 1036, 1530, 1800)),\r
+ array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35\r
+ array(161, 3034, 0, array( 600, 1120, 1680, 1980)),\r
+ array(165, 3196, 0, array( 630, 1204, 1770, 2100)),\r
+ array(169, 3362, 0, array( 660, 1260, 1860, 2220)),\r
+ array(173, 3532, 0, array( 720, 1316, 1950, 2310)),\r
+ array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40\r
+ );\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getDataLength($version, $level)\r
+ {\r
+ return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getECCLength($version, $level)\r
+ {\r
+ return self::$capacity[$version][QRCAP_EC][$level];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getWidth($version)\r
+ {\r
+ return self::$capacity[$version][QRCAP_WIDTH];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getRemainder($version)\r
+ {\r
+ return self::$capacity[$version][QRCAP_REMINDER];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getMinimumVersion($size, $level)\r
+ {\r
+\r
+ for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {\r
+ $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];\r
+ if($words >= $size) \r
+ return $i;\r
+ }\r
+\r
+ return -1;\r
+ }\r
+ \r
+ //######################################################################\r
+ \r
+ public static $lengthTableBits = array(\r
+ array(10, 12, 14),\r
+ array( 9, 11, 13),\r
+ array( 8, 16, 16),\r
+ array( 8, 10, 12)\r
+ );\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function lengthIndicator($mode, $version)\r
+ {\r
+ if ($mode == QR_MODE_STRUCTURE)\r
+ return 0;\r
+ \r
+ if ($version <= 9) {\r
+ $l = 0;\r
+ } else if ($version <= 26) {\r
+ $l = 1;\r
+ } else {\r
+ $l = 2;\r
+ }\r
+\r
+ return self::$lengthTableBits[$mode][$l];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function maximumWords($mode, $version)\r
+ {\r
+ if($mode == QR_MODE_STRUCTURE) \r
+ return 3;\r
+ \r
+ if($version <= 9) {\r
+ $l = 0;\r
+ } else if($version <= 26) {\r
+ $l = 1;\r
+ } else {\r
+ $l = 2;\r
+ }\r
+\r
+ $bits = self::$lengthTableBits[$mode][$l];\r
+ $words = (1 << $bits) - 1;\r
+ \r
+ if($mode == QR_MODE_KANJI) {\r
+ $words *= 2; // the number of bytes is required\r
+ }\r
+\r
+ return $words;\r
+ }\r
+\r
+ // Error correction code -----------------------------------------------\r
+ // Table of the error correction code (Reed-Solomon block)\r
+ // See Table 12-16 (pp.30-36), JIS X0510:2004.\r
+\r
+ public static $eccTable = array(\r
+ array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)),\r
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1\r
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)),\r
+ array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)),\r
+ array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)),\r
+ array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5\r
+ array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)),\r
+ array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)),\r
+ array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)),\r
+ array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)),\r
+ array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10\r
+ array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)),\r
+ array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)),\r
+ array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)),\r
+ array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)),\r
+ array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15\r
+ array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)),\r
+ array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)),\r
+ array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)),\r
+ array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)),\r
+ array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20\r
+ array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)),\r
+ array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)),\r
+ array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)),\r
+ array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)),\r
+ array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25\r
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)),\r
+ array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)),\r
+ array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),\r
+ array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)),\r
+ array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30\r
+ array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)),\r
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)),\r
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)),\r
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)),\r
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35\r
+ array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),\r
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)),\r
+ array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),\r
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)),\r
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40\r
+ ); \r
+\r
+ //----------------------------------------------------------------------\r
+ // CACHEABLE!!!\r
+ \r
+ public static function getEccSpec($version, $level, array &$spec)\r
+ {\r
+ if (count($spec) < 5) {\r
+ $spec = array(0,0,0,0,0);\r
+ }\r
+\r
+ $b1 = self::$eccTable[$version][$level][0];\r
+ $b2 = self::$eccTable[$version][$level][1];\r
+ $data = self::getDataLength($version, $level);\r
+ $ecc = self::getECCLength($version, $level);\r
+\r
+ if($b2 == 0) {\r
+ $spec[0] = $b1;\r
+ $spec[1] = (int)($data / $b1);\r
+ $spec[2] = (int)($ecc / $b1);\r
+ $spec[3] = 0; \r
+ $spec[4] = 0;\r
+ } else {\r
+ $spec[0] = $b1;\r
+ $spec[1] = (int)($data / ($b1 + $b2));\r
+ $spec[2] = (int)($ecc / ($b1 + $b2));\r
+ $spec[3] = $b2;\r
+ $spec[4] = $spec[1] + 1;\r
+ }\r
+ }\r
+\r
+ // Alignment pattern ---------------------------------------------------\r
+\r
+ // Positions of alignment patterns.\r
+ // This array includes only the second and the third position of the \r
+ // alignment patterns. Rest of them can be calculated from the distance \r
+ // between them.\r
+ \r
+ // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.\r
+ \r
+ public static $alignmentPattern = array( \r
+ array( 0, 0),\r
+ array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5\r
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10\r
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15\r
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20\r
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25\r
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30\r
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35\r
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40\r
+ ); \r
+\r
+ \r
+ /** --------------------------------------------------------------------\r
+ * Put an alignment marker.\r
+ * @param frame\r
+ * @param width\r
+ * @param ox,oy center coordinate of the pattern\r
+ */\r
+ public static function putAlignmentMarker(array &$frame, $ox, $oy)\r
+ {\r
+ $finder = array(\r
+ "\xa1\xa1\xa1\xa1\xa1",\r
+ "\xa1\xa0\xa0\xa0\xa1",\r
+ "\xa1\xa0\xa1\xa0\xa1",\r
+ "\xa1\xa0\xa0\xa0\xa1",\r
+ "\xa1\xa1\xa1\xa1\xa1"\r
+ ); \r
+ \r
+ $yStart = $oy-2; \r
+ $xStart = $ox-2;\r
+ \r
+ for($y=0; $y<5; $y++) {\r
+ QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function putAlignmentPattern($version, &$frame, $width)\r
+ {\r
+ if($version < 2)\r
+ return;\r
+\r
+ $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];\r
+ if($d < 0) {\r
+ $w = 2;\r
+ } else {\r
+ $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);\r
+ }\r
+\r
+ if($w * $w - 3 == 1) {\r
+ $x = self::$alignmentPattern[$version][0];\r
+ $y = self::$alignmentPattern[$version][0];\r
+ self::putAlignmentMarker($frame, $x, $y);\r
+ return;\r
+ }\r
+\r
+ $cx = self::$alignmentPattern[$version][0];\r
+ for($x=1; $x<$w - 1; $x++) {\r
+ self::putAlignmentMarker($frame, 6, $cx);\r
+ self::putAlignmentMarker($frame, $cx, 6);\r
+ $cx += $d;\r
+ }\r
+\r
+ $cy = self::$alignmentPattern[$version][0];\r
+ for($y=0; $y<$w-1; $y++) {\r
+ $cx = self::$alignmentPattern[$version][0];\r
+ for($x=0; $x<$w-1; $x++) {\r
+ self::putAlignmentMarker($frame, $cx, $cy);\r
+ $cx += $d;\r
+ }\r
+ $cy += $d;\r
+ }\r
+ }\r
+\r
+ // Version information pattern -----------------------------------------\r
+\r
+ // Version information pattern (BCH coded).\r
+ // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.\r
+ \r
+ // size: [QRSPEC_VERSION_MAX - 6]\r
+ \r
+ public static $versionPattern = array(\r
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,\r
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,\r
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,\r
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,\r
+ 0x27541, 0x28c69\r
+ );\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function getVersionPattern($version)\r
+ {\r
+ if($version < 7 || $version > QRSPEC_VERSION_MAX)\r
+ return 0;\r
+\r
+ return self::$versionPattern[$version -7];\r
+ }\r
+\r
+ // Format information --------------------------------------------------\r
+ // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)\r
+ \r
+ public static $formatInfo = array(\r
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),\r
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),\r
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),\r
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)\r
+ );\r
+\r
+ public static function getFormatInfo($mask, $level)\r
+ {\r
+ if($mask < 0 || $mask > 7)\r
+ return 0;\r
+ \r
+ if($level < 0 || $level > 3)\r
+ return 0; \r
+\r
+ return self::$formatInfo[$level][$mask];\r
+ }\r
+\r
+ // Frame ---------------------------------------------------------------\r
+ // Cache of initial frames.\r
+ \r
+ public static $frames = array();\r
+\r
+ /** --------------------------------------------------------------------\r
+ * Put a finder pattern.\r
+ * @param frame\r
+ * @param width\r
+ * @param ox,oy upper-left coordinate of the pattern\r
+ */\r
+ public static function putFinderPattern(&$frame, $ox, $oy)\r
+ {\r
+ $finder = array(\r
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",\r
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",\r
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",\r
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",\r
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",\r
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",\r
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"\r
+ ); \r
+ \r
+ for($y=0; $y<7; $y++) {\r
+ QRstr::set($frame, $ox, $oy+$y, $finder[$y]);\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function createFrame($version)\r
+ {\r
+ $width = self::$capacity[$version][QRCAP_WIDTH];\r
+ $frameLine = str_repeat ("\0", $width);\r
+ $frame = array_fill(0, $width, $frameLine);\r
+\r
+ // Finder pattern\r
+ self::putFinderPattern($frame, 0, 0);\r
+ self::putFinderPattern($frame, $width - 7, 0);\r
+ self::putFinderPattern($frame, 0, $width - 7);\r
+ \r
+ // Separator\r
+ $yOffset = $width - 7;\r
+ \r
+ for($y=0; $y<7; $y++) {\r
+ $frame[$y][7] = "\xc0";\r
+ $frame[$y][$width - 8] = "\xc0";\r
+ $frame[$yOffset][7] = "\xc0";\r
+ $yOffset++;\r
+ }\r
+ \r
+ $setPattern = str_repeat("\xc0", 8);\r
+ \r
+ QRstr::set($frame, 0, 7, $setPattern);\r
+ QRstr::set($frame, $width-8, 7, $setPattern);\r
+ QRstr::set($frame, 0, $width - 8, $setPattern);\r
+ \r
+ // Format info\r
+ $setPattern = str_repeat("\x84", 9);\r
+ QRstr::set($frame, 0, 8, $setPattern);\r
+ QRstr::set($frame, $width - 8, 8, $setPattern, 8);\r
+ \r
+ $yOffset = $width - 8;\r
+\r
+ for($y=0; $y<8; $y++,$yOffset++) {\r
+ $frame[$y][8] = "\x84";\r
+ $frame[$yOffset][8] = "\x84";\r
+ }\r
+\r
+ // Timing pattern \r
+ \r
+ for($i=1; $i<$width-15; $i++) {\r
+ $frame[6][7+$i] = chr(0x90 | ($i & 1));\r
+ $frame[7+$i][6] = chr(0x90 | ($i & 1));\r
+ }\r
+ \r
+ // Alignment pattern \r
+ self::putAlignmentPattern($version, $frame, $width);\r
+ \r
+ // Version information \r
+ if($version >= 7) {\r
+ $vinf = self::getVersionPattern($version);\r
+\r
+ $v = $vinf;\r
+ \r
+ for($x=0; $x<6; $x++) {\r
+ for($y=0; $y<3; $y++) {\r
+ $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));\r
+ $v = $v >> 1;\r
+ }\r
+ }\r
+\r
+ $v = $vinf;\r
+ for($y=0; $y<6; $y++) {\r
+ for($x=0; $x<3; $x++) {\r
+ $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));\r
+ $v = $v >> 1;\r
+ }\r
+ }\r
+ }\r
+ \r
+ // and a little bit... \r
+ $frame[$width - 8][8] = "\x81";\r
+ \r
+ return $frame;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function debug($frame, $binary_mode = false)\r
+ {\r
+ if ($binary_mode) {\r
+ \r
+ foreach ($frame as &$frameLine) {\r
+ $frameLine = join('<span class="m"> </span>', explode('0', $frameLine));\r
+ $frameLine = join('██', explode('1', $frameLine));\r
+ }\r
+ \r
+ ?>\r
+ <style>\r
+ .m { background-color: white; }\r
+ </style>\r
+ <?php\r
+ echo '<pre><tt><br/ ><br/ ><br/ > ';\r
+ echo join("<br/ > ", $frame);\r
+ echo '</tt></pre><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >';\r
+ \r
+ } else {\r
+ \r
+ foreach ($frame as &$frameLine) {\r
+ $frameLine = join('<span class="m"> </span>', explode("\xc0", $frameLine));\r
+ $frameLine = join('<span class="m">▒</span>', explode("\xc1", $frameLine));\r
+ $frameLine = join('<span class="p"> </span>', explode("\xa0", $frameLine));\r
+ $frameLine = join('<span class="p">▒</span>', explode("\xa1", $frameLine));\r
+ $frameLine = join('<span class="s">◇</span>', explode("\x84", $frameLine)); //format 0\r
+ $frameLine = join('<span class="s">◆</span>', explode("\x85", $frameLine)); //format 1\r
+ $frameLine = join('<span class="x">☢</span>', explode("\x81", $frameLine)); //special bit\r
+ $frameLine = join('<span class="c"> </span>', explode("\x90", $frameLine)); //clock 0\r
+ $frameLine = join('<span class="c">◷</span>', explode("\x91", $frameLine)); //clock 1\r
+ $frameLine = join('<span class="f"> </span>', explode("\x88", $frameLine)); //version\r
+ $frameLine = join('<span class="f">▒</span>', explode("\x89", $frameLine)); //version\r
+ $frameLine = join('♦', explode("\x01", $frameLine));\r
+ $frameLine = join('⋅', explode("\0", $frameLine));\r
+ }\r
+ \r
+ ?>\r
+ <style>\r
+ .p { background-color: yellow; }\r
+ .m { background-color: #00FF00; }\r
+ .s { background-color: #FF0000; }\r
+ .c { background-color: aqua; }\r
+ .x { background-color: pink; }\r
+ .f { background-color: gold; }\r
+ </style>\r
+ <?php\r
+ echo "<pre><tt>";\r
+ echo join("<br/ >", $frame);\r
+ echo "</tt></pre>";\r
+ \r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function serial($frame)\r
+ {\r
+ return gzcompress(join("\n", $frame), 9);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function unserial($code)\r
+ {\r
+ return explode("\n", gzuncompress($code));\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function newFrame($version)\r
+ {\r
+ if($version < 1 || $version > QRSPEC_VERSION_MAX) \r
+ return null;\r
+\r
+ if(!isset(self::$frames[$version])) {\r
+ \r
+ $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';\r
+ \r
+ if (QR_CACHEABLE) {\r
+ if (file_exists($fileName)) {\r
+ self::$frames[$version] = self::unserial(file_get_contents($fileName));\r
+ } else {\r
+ self::$frames[$version] = self::createFrame($version);\r
+ file_put_contents($fileName, self::serial(self::$frames[$version]));\r
+ }\r
+ } else {\r
+ self::$frames[$version] = self::createFrame($version);\r
+ }\r
+ }\r
+ \r
+ if(is_null(self::$frames[$version]))\r
+ return null;\r
+\r
+ return self::$frames[$version];\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; }\r
+ public static function rsBlockNum1($spec) { return $spec[0]; }\r
+ public static function rsDataCodes1($spec) { return $spec[1]; }\r
+ public static function rsEccCodes1($spec) { return $spec[2]; }\r
+ public static function rsBlockNum2($spec) { return $spec[3]; }\r
+ public static function rsDataCodes2($spec) { return $spec[4]; }\r
+ public static function rsEccCodes2($spec) { return $spec[2]; }\r
+ public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); }\r
+ public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; }\r
+ \r
+ }
+
+
+
+//---- qrimage.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Image output of code using GD2\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ define('QR_IMAGE', true);\r
+\r
+ class QRimage {\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) \r
+ {\r
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);\r
+ \r
+ if ($filename === false) {\r
+ Header("Content-type: image/png");\r
+ ImagePng($image);\r
+ } else {\r
+ if($saveandprint===TRUE){\r
+ ImagePng($image, $filename);\r
+ header("Content-type: image/png");\r
+ ImagePng($image);\r
+ }else{\r
+ ImagePng($image, $filename);\r
+ }\r
+ }\r
+ \r
+ ImageDestroy($image);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) \r
+ {\r
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);\r
+ \r
+ if ($filename === false) {\r
+ Header("Content-type: image/jpeg");\r
+ ImageJpeg($image, null, $q);\r
+ } else {\r
+ ImageJpeg($image, $filename, $q); \r
+ }\r
+ \r
+ ImageDestroy($image);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) \r
+ {\r
+ $h = count($frame);\r
+ $w = strlen($frame[0]);\r
+ \r
+ $imgW = $w + 2*$outerFrame;\r
+ $imgH = $h + 2*$outerFrame;\r
+ \r
+ $base_image =ImageCreate($imgW, $imgH);\r
+ \r
+ $col[0] = ImageColorAllocate($base_image,255,255,255);\r
+ $col[1] = ImageColorAllocate($base_image,0,0,0);\r
+\r
+ imagefill($base_image, 0, 0, $col[0]);\r
+\r
+ for($y=0; $y<$h; $y++) {\r
+ for($x=0; $x<$w; $x++) {\r
+ if ($frame[$y][$x] == '1') {\r
+ ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); \r
+ }\r
+ }\r
+ }\r
+ \r
+ $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);\r
+ ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);\r
+ ImageDestroy($base_image);\r
+ \r
+ return $target_image;\r
+ }\r
+ }
+
+
+
+//---- qrinput.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Input encoding class\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ define('STRUCTURE_HEADER_BITS', 20);\r
+ define('MAX_STRUCTURED_SYMBOLS', 16);\r
+\r
+ class QRinputItem {\r
+ \r
+ public $mode;\r
+ public $size;\r
+ public $data;\r
+ public $bstream;\r
+\r
+ public function __construct($mode, $size, $data, $bstream = null) \r
+ {\r
+ $setData = array_slice($data, 0, $size);\r
+ \r
+ if (count($setData) < $size) {\r
+ $setData = array_merge($setData, array_fill(0,$size-count($setData),0));\r
+ }\r
+ \r
+ if(!QRinput::check($mode, $size, $setData)) {\r
+ throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData));\r
+ return null;\r
+ }\r
+ \r
+ $this->mode = $mode;\r
+ $this->size = $size;\r
+ $this->data = $setData;\r
+ $this->bstream = $bstream;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeModeNum($version)\r
+ {\r
+ try {\r
+ \r
+ $words = (int)($this->size / 3);\r
+ $bs = new QRbitstream();\r
+ \r
+ $val = 0x1;\r
+ $bs->appendNum(4, $val);\r
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);\r
+\r
+ for($i=0; $i<$words; $i++) {\r
+ $val = (ord($this->data[$i*3 ]) - ord('0')) * 100;\r
+ $val += (ord($this->data[$i*3+1]) - ord('0')) * 10;\r
+ $val += (ord($this->data[$i*3+2]) - ord('0'));\r
+ $bs->appendNum(10, $val);\r
+ }\r
+\r
+ if($this->size - $words * 3 == 1) {\r
+ $val = ord($this->data[$words*3]) - ord('0');\r
+ $bs->appendNum(4, $val);\r
+ } else if($this->size - $words * 3 == 2) {\r
+ $val = (ord($this->data[$words*3 ]) - ord('0')) * 10;\r
+ $val += (ord($this->data[$words*3+1]) - ord('0'));\r
+ $bs->appendNum(7, $val);\r
+ }\r
+\r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeModeAn($version)\r
+ {\r
+ try {\r
+ $words = (int)($this->size / 2);\r
+ $bs = new QRbitstream();\r
+ \r
+ $bs->appendNum(4, 0x02);\r
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);\r
+\r
+ for($i=0; $i<$words; $i++) {\r
+ $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45;\r
+ $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));\r
+\r
+ $bs->appendNum(11, $val);\r
+ }\r
+\r
+ if($this->size & 1) {\r
+ $val = QRinput::lookAnTable(ord($this->data[$words * 2]));\r
+ $bs->appendNum(6, $val);\r
+ }\r
+ \r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeMode8($version)\r
+ {\r
+ try {\r
+ $bs = new QRbitstream();\r
+\r
+ $bs->appendNum(4, 0x4);\r
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);\r
+\r
+ for($i=0; $i<$this->size; $i++) {\r
+ $bs->appendNum(8, ord($this->data[$i]));\r
+ }\r
+\r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeModeKanji($version)\r
+ {\r
+ try {\r
+\r
+ $bs = new QRbitrtream();\r
+ \r
+ $bs->appendNum(4, 0x8);\r
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));\r
+\r
+ for($i=0; $i<$this->size; $i+=2) {\r
+ $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]);\r
+ if($val <= 0x9ffc) {\r
+ $val -= 0x8140;\r
+ } else {\r
+ $val -= 0xc140;\r
+ }\r
+ \r
+ $h = ($val >> 8) * 0xc0;\r
+ $val = ($val & 0xff) + $h;\r
+\r
+ $bs->appendNum(13, $val);\r
+ }\r
+\r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function encodeModeStructure()\r
+ {\r
+ try {\r
+ $bs = new QRbitstream();\r
+ \r
+ $bs->appendNum(4, 0x03);\r
+ $bs->appendNum(4, ord($this->data[1]) - 1);\r
+ $bs->appendNum(4, ord($this->data[0]) - 1);\r
+ $bs->appendNum(8, ord($this->data[2]));\r
+\r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function estimateBitStreamSizeOfEntry($version)\r
+ {\r
+ $bits = 0;\r
+\r
+ if($version == 0) \r
+ $version = 1;\r
+\r
+ switch($this->mode) {\r
+ case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break;\r
+ case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break;\r
+ case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break;\r
+ case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break;\r
+ case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; \r
+ default:\r
+ return 0;\r
+ }\r
+\r
+ $l = QRspec::lengthIndicator($this->mode, $version);\r
+ $m = 1 << $l;\r
+ $num = (int)(($this->size + $m - 1) / $m);\r
+\r
+ $bits += $num * (4 + $l);\r
+\r
+ return $bits;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeBitStream($version)\r
+ {\r
+ try {\r
+ \r
+ unset($this->bstream);\r
+ $words = QRspec::maximumWords($this->mode, $version);\r
+ \r
+ if($this->size > $words) {\r
+ \r
+ $st1 = new QRinputItem($this->mode, $words, $this->data);\r
+ $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));\r
+\r
+ $st1->encodeBitStream($version);\r
+ $st2->encodeBitStream($version);\r
+ \r
+ $this->bstream = new QRbitstream();\r
+ $this->bstream->append($st1->bstream);\r
+ $this->bstream->append($st2->bstream);\r
+ \r
+ unset($st1);\r
+ unset($st2);\r
+ \r
+ } else {\r
+ \r
+ $ret = 0;\r
+ \r
+ switch($this->mode) {\r
+ case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break;\r
+ case QR_MODE_AN: $ret = $this->encodeModeAn($version); break;\r
+ case QR_MODE_8: $ret = $this->encodeMode8($version); break;\r
+ case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break;\r
+ case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break;\r
+ \r
+ default:\r
+ break;\r
+ }\r
+ \r
+ if($ret < 0)\r
+ return -1;\r
+ }\r
+\r
+ return $this->bstream->size();\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ };\r
+ \r
+ //##########################################################################\r
+\r
+ class QRinput {\r
+\r
+ public $items;\r
+ \r
+ private $version;\r
+ private $level;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function __construct($version = 0, $level = QR_ECLEVEL_L)\r
+ {\r
+ if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {\r
+ throw new Exception('Invalid version no');\r
+ return NULL;\r
+ }\r
+ \r
+ $this->version = $version;\r
+ $this->level = $level;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getVersion()\r
+ {\r
+ return $this->version;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function setVersion($version)\r
+ {\r
+ if($version < 0 || $version > QRSPEC_VERSION_MAX) {\r
+ throw new Exception('Invalid version no');\r
+ return -1;\r
+ }\r
+\r
+ $this->version = $version;\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getErrorCorrectionLevel()\r
+ {\r
+ return $this->level;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function setErrorCorrectionLevel($level)\r
+ {\r
+ if($level > QR_ECLEVEL_H) {\r
+ throw new Exception('Invalid ECLEVEL');\r
+ return -1;\r
+ }\r
+\r
+ $this->level = $level;\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function appendEntry(QRinputItem $entry)\r
+ {\r
+ $this->items[] = $entry;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function append($mode, $size, $data)\r
+ {\r
+ try {\r
+ $entry = new QRinputItem($mode, $size, $data);\r
+ $this->items[] = $entry;\r
+ return 0;\r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ \r
+ public function insertStructuredAppendHeader($size, $index, $parity)\r
+ {\r
+ if( $size > MAX_STRUCTURED_SYMBOLS ) {\r
+ throw new Exception('insertStructuredAppendHeader wrong size');\r
+ }\r
+ \r
+ if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {\r
+ throw new Exception('insertStructuredAppendHeader wrong index');\r
+ }\r
+\r
+ $buf = array($size, $index, $parity);\r
+ \r
+ try {\r
+ $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);\r
+ array_unshift($this->items, $entry);\r
+ return 0;\r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function calcParity()\r
+ {\r
+ $parity = 0;\r
+ \r
+ foreach($this->items as $item) {\r
+ if($item->mode != QR_MODE_STRUCTURE) {\r
+ for($i=$item->size-1; $i>=0; $i--) {\r
+ $parity ^= $item->data[$i];\r
+ }\r
+ }\r
+ }\r
+\r
+ return $parity;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function checkModeNum($size, $data)\r
+ {\r
+ for($i=0; $i<$size; $i++) {\r
+ if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){\r
+ return false;\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function estimateBitsModeNum($size)\r
+ {\r
+ $w = (int)$size / 3;\r
+ $bits = $w * 10;\r
+ \r
+ switch($size - $w * 3) {\r
+ case 1:\r
+ $bits += 4;\r
+ break;\r
+ case 2:\r
+ $bits += 7;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return $bits;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static $anTable = array(\r
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,\r
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,\r
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\r
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,\r
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1\r
+ );\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function lookAnTable($c)\r
+ {\r
+ return (($c > 127)?-1:self::$anTable[$c]);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function checkModeAn($size, $data)\r
+ {\r
+ for($i=0; $i<$size; $i++) {\r
+ if (self::lookAnTable(ord($data[$i])) == -1) {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function estimateBitsModeAn($size)\r
+ {\r
+ $w = (int)($size / 2);\r
+ $bits = $w * 11;\r
+ \r
+ if($size & 1) {\r
+ $bits += 6;\r
+ }\r
+\r
+ return $bits;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function estimateBitsMode8($size)\r
+ {\r
+ return $size * 8;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function estimateBitsModeKanji($size)\r
+ {\r
+ return (int)(($size / 2) * 13);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function checkModeKanji($size, $data)\r
+ {\r
+ if($size & 1)\r
+ return false;\r
+\r
+ for($i=0; $i<$size; $i+=2) {\r
+ $val = (ord($data[$i]) << 8) | ord($data[$i+1]);\r
+ if( $val < 0x8140 \r
+ || ($val > 0x9ffc && $val < 0xe040) \r
+ || $val > 0xebbf) {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ /***********************************************************************\r
+ * Validation\r
+ **********************************************************************/\r
+\r
+ public static function check($mode, $size, $data)\r
+ {\r
+ if($size <= 0) \r
+ return false;\r
+\r
+ switch($mode) {\r
+ case QR_MODE_NUM: return self::checkModeNum($size, $data); break;\r
+ case QR_MODE_AN: return self::checkModeAn($size, $data); break;\r
+ case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break;\r
+ case QR_MODE_8: return true; break;\r
+ case QR_MODE_STRUCTURE: return true; break;\r
+ \r
+ default:\r
+ break;\r
+ }\r
+\r
+ return false;\r
+ }\r
+ \r
+ \r
+ //----------------------------------------------------------------------\r
+ public function estimateBitStreamSize($version)\r
+ {\r
+ $bits = 0;\r
+\r
+ foreach($this->items as $item) {\r
+ $bits += $item->estimateBitStreamSizeOfEntry($version);\r
+ }\r
+\r
+ return $bits;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function estimateVersion()\r
+ {\r
+ $version = 0;\r
+ $prev = 0;\r
+ do {\r
+ $prev = $version;\r
+ $bits = $this->estimateBitStreamSize($prev);\r
+ $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);\r
+ if ($version < 0) {\r
+ return -1;\r
+ }\r
+ } while ($version > $prev);\r
+\r
+ return $version;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function lengthOfCode($mode, $version, $bits)\r
+ {\r
+ $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);\r
+ switch($mode) {\r
+ case QR_MODE_NUM:\r
+ $chunks = (int)($payload / 10);\r
+ $remain = $payload - $chunks * 10;\r
+ $size = $chunks * 3;\r
+ if($remain >= 7) {\r
+ $size += 2;\r
+ } else if($remain >= 4) {\r
+ $size += 1;\r
+ }\r
+ break;\r
+ case QR_MODE_AN:\r
+ $chunks = (int)($payload / 11);\r
+ $remain = $payload - $chunks * 11;\r
+ $size = $chunks * 2;\r
+ if($remain >= 6) \r
+ $size++;\r
+ break;\r
+ case QR_MODE_8:\r
+ $size = (int)($payload / 8);\r
+ break;\r
+ case QR_MODE_KANJI:\r
+ $size = (int)(($payload / 13) * 2);\r
+ break;\r
+ case QR_MODE_STRUCTURE:\r
+ $size = (int)($payload / 8);\r
+ break;\r
+ default:\r
+ $size = 0;\r
+ break;\r
+ }\r
+ \r
+ $maxsize = QRspec::maximumWords($mode, $version);\r
+ if($size < 0) $size = 0;\r
+ if($size > $maxsize) $size = $maxsize;\r
+\r
+ return $size;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function createBitStream()\r
+ {\r
+ $total = 0;\r
+\r
+ foreach($this->items as $item) {\r
+ $bits = $item->encodeBitStream($this->version);\r
+ \r
+ if($bits < 0) \r
+ return -1;\r
+ \r
+ $total += $bits;\r
+ }\r
+\r
+ return $total;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function convertData()\r
+ {\r
+ $ver = $this->estimateVersion();\r
+ if($ver > $this->getVersion()) {\r
+ $this->setVersion($ver);\r
+ }\r
+\r
+ for(;;) {\r
+ $bits = $this->createBitStream();\r
+ \r
+ if($bits < 0) \r
+ return -1;\r
+ \r
+ $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);\r
+ if($ver < 0) {\r
+ throw new Exception('WRONG VERSION');\r
+ return -1;\r
+ } else if($ver > $this->getVersion()) {\r
+ $this->setVersion($ver);\r
+ } else {\r
+ break;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function appendPaddingBit(&$bstream)\r
+ {\r
+ $bits = $bstream->size();\r
+ $maxwords = QRspec::getDataLength($this->version, $this->level);\r
+ $maxbits = $maxwords * 8;\r
+\r
+ if ($maxbits == $bits) {\r
+ return 0;\r
+ }\r
+\r
+ if ($maxbits - $bits < 5) {\r
+ return $bstream->appendNum($maxbits - $bits, 0);\r
+ }\r
+\r
+ $bits += 4;\r
+ $words = (int)(($bits + 7) / 8);\r
+\r
+ $padding = new QRbitstream();\r
+ $ret = $padding->appendNum($words * 8 - $bits + 4, 0);\r
+ \r
+ if($ret < 0) \r
+ return $ret;\r
+\r
+ $padlen = $maxwords - $words;\r
+ \r
+ if($padlen > 0) {\r
+ \r
+ $padbuf = array();\r
+ for($i=0; $i<$padlen; $i++) {\r
+ $padbuf[$i] = ($i&1)?0x11:0xec;\r
+ }\r
+ \r
+ $ret = $padding->appendBytes($padlen, $padbuf);\r
+ \r
+ if($ret < 0)\r
+ return $ret;\r
+ \r
+ }\r
+\r
+ $ret = $bstream->append($padding);\r
+ \r
+ return $ret;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function mergeBitStream()\r
+ {\r
+ if($this->convertData() < 0) {\r
+ return null;\r
+ }\r
+\r
+ $bstream = new QRbitstream();\r
+ \r
+ foreach($this->items as $item) {\r
+ $ret = $bstream->append($item->bstream);\r
+ if($ret < 0) {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ return $bstream;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function getBitStream()\r
+ {\r
+\r
+ $bstream = $this->mergeBitStream();\r
+ \r
+ if($bstream == null) {\r
+ return null;\r
+ }\r
+ \r
+ $ret = $this->appendPaddingBit($bstream);\r
+ if($ret < 0) {\r
+ return null;\r
+ }\r
+\r
+ return $bstream;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getByteStream()\r
+ {\r
+ $bstream = $this->getBitStream();\r
+ if($bstream == null) {\r
+ return null;\r
+ }\r
+ \r
+ return $bstream->toByte();\r
+ }\r
+ }\r
+ \r
+ \r
+
+
+
+
+//---- qrbitstream.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Bitstream class\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ class QRbitstream {\r
+ \r
+ public $data = array();\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function size()\r
+ {\r
+ return count($this->data);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function allocate($setLength)\r
+ {\r
+ $this->data = array_fill(0, $setLength, 0);\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function newFromNum($bits, $num)\r
+ {\r
+ $bstream = new QRbitstream();\r
+ $bstream->allocate($bits);\r
+ \r
+ $mask = 1 << ($bits - 1);\r
+ for($i=0; $i<$bits; $i++) {\r
+ if($num & $mask) {\r
+ $bstream->data[$i] = 1;\r
+ } else {\r
+ $bstream->data[$i] = 0;\r
+ }\r
+ $mask = $mask >> 1;\r
+ }\r
+\r
+ return $bstream;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function newFromBytes($size, $data)\r
+ {\r
+ $bstream = new QRbitstream();\r
+ $bstream->allocate($size * 8);\r
+ $p=0;\r
+\r
+ for($i=0; $i<$size; $i++) {\r
+ $mask = 0x80;\r
+ for($j=0; $j<8; $j++) {\r
+ if($data[$i] & $mask) {\r
+ $bstream->data[$p] = 1;\r
+ } else {\r
+ $bstream->data[$p] = 0;\r
+ }\r
+ $p++;\r
+ $mask = $mask >> 1;\r
+ }\r
+ }\r
+\r
+ return $bstream;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function append(QRbitstream $arg)\r
+ {\r
+ if (is_null($arg)) {\r
+ return -1;\r
+ }\r
+ \r
+ if($arg->size() == 0) {\r
+ return 0;\r
+ }\r
+ \r
+ if($this->size() == 0) {\r
+ $this->data = $arg->data;\r
+ return 0;\r
+ }\r
+ \r
+ $this->data = array_values(array_merge($this->data, $arg->data));\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function appendNum($bits, $num)\r
+ {\r
+ if ($bits == 0) \r
+ return 0;\r
+\r
+ $b = QRbitstream::newFromNum($bits, $num);\r
+ \r
+ if(is_null($b))\r
+ return -1;\r
+\r
+ $ret = $this->append($b);\r
+ unset($b);\r
+\r
+ return $ret;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function appendBytes($size, $data)\r
+ {\r
+ if ($size == 0) \r
+ return 0;\r
+\r
+ $b = QRbitstream::newFromBytes($size, $data);\r
+ \r
+ if(is_null($b))\r
+ return -1;\r
+\r
+ $ret = $this->append($b);\r
+ unset($b);\r
+\r
+ return $ret;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function toByte()\r
+ {\r
+ \r
+ $size = $this->size();\r
+\r
+ if($size == 0) {\r
+ return array();\r
+ }\r
+ \r
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);\r
+ $bytes = (int)($size / 8);\r
+\r
+ $p = 0;\r
+ \r
+ for($i=0; $i<$bytes; $i++) {\r
+ $v = 0;\r
+ for($j=0; $j<8; $j++) {\r
+ $v = $v << 1;\r
+ $v |= $this->data[$p];\r
+ $p++;\r
+ }\r
+ $data[$i] = $v;\r
+ }\r
+ \r
+ if($size & 7) {\r
+ $v = 0;\r
+ for($j=0; $j<($size & 7); $j++) {\r
+ $v = $v << 1;\r
+ $v |= $this->data[$p];\r
+ $p++;\r
+ }\r
+ $data[$bytes] = $v;\r
+ }\r
+\r
+ return $data;\r
+ }\r
+\r
+ }\r
+
+
+
+
+//---- qrsplit.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Input splitting classes\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * The following data / specifications are taken from\r
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)\r
+ * or\r
+ * "Automatic identification and data capture techniques -- \r
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ class QRsplit {\r
+\r
+ public $dataStr = '';\r
+ public $input;\r
+ public $modeHint;\r
+\r
+ //----------------------------------------------------------------------\r
+ public function __construct($dataStr, $input, $modeHint) \r
+ {\r
+ $this->dataStr = $dataStr;\r
+ $this->input = $input;\r
+ $this->modeHint = $modeHint;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function isdigitat($str, $pos)\r
+ { \r
+ if ($pos >= strlen($str))\r
+ return false;\r
+ \r
+ return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function isalnumat($str, $pos)\r
+ {\r
+ if ($pos >= strlen($str))\r
+ return false;\r
+ \r
+ return (QRinput::lookAnTable(ord($str[$pos])) >= 0);\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function identifyMode($pos)\r
+ {\r
+ if ($pos >= strlen($this->dataStr)) \r
+ return QR_MODE_NUL;\r
+ \r
+ $c = $this->dataStr[$pos];\r
+ \r
+ if(self::isdigitat($this->dataStr, $pos)) {\r
+ return QR_MODE_NUM;\r
+ } else if(self::isalnumat($this->dataStr, $pos)) {\r
+ return QR_MODE_AN;\r
+ } else if($this->modeHint == QR_MODE_KANJI) {\r
+ \r
+ if ($pos+1 < strlen($this->dataStr)) \r
+ {\r
+ $d = $this->dataStr[$pos+1];\r
+ $word = (ord($c) << 8) | ord($d);\r
+ if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {\r
+ return QR_MODE_KANJI;\r
+ }\r
+ }\r
+ }\r
+\r
+ return QR_MODE_8;\r
+ } \r
+ \r
+ //----------------------------------------------------------------------\r
+ public function eatNum()\r
+ {\r
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());\r
+\r
+ $p = 0;\r
+ while(self::isdigitat($this->dataStr, $p)) {\r
+ $p++;\r
+ }\r
+ \r
+ $run = $p;\r
+ $mode = $this->identifyMode($p);\r
+ \r
+ if($mode == QR_MODE_8) {\r
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln\r
+ + QRinput::estimateBitsMode8(1) // + 4 + l8\r
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8\r
+ if($dif > 0) {\r
+ return $this->eat8();\r
+ }\r
+ }\r
+ if($mode == QR_MODE_AN) {\r
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln\r
+ + QRinput::estimateBitsModeAn(1) // + 4 + la\r
+ - QRinput::estimateBitsModeAn($run + 1);// - 4 - la\r
+ if($dif > 0) {\r
+ return $this->eatAn();\r
+ }\r
+ }\r
+ \r
+ $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));\r
+ if($ret < 0)\r
+ return -1;\r
+\r
+ return $run;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function eatAn()\r
+ {\r
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());\r
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());\r
+\r
+ $p = 0;\r
+ \r
+ while(self::isalnumat($this->dataStr, $p)) {\r
+ if(self::isdigitat($this->dataStr, $p)) {\r
+ $q = $p;\r
+ while(self::isdigitat($this->dataStr, $q)) {\r
+ $q++;\r
+ }\r
+ \r
+ $dif = QRinput::estimateBitsModeAn($p) // + 4 + la\r
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln\r
+ - QRinput::estimateBitsModeAn($q); // - 4 - la\r
+ \r
+ if($dif < 0) {\r
+ break;\r
+ } else {\r
+ $p = $q;\r
+ }\r
+ } else {\r
+ $p++;\r
+ }\r
+ }\r
+\r
+ $run = $p;\r
+\r
+ if(!self::isalnumat($this->dataStr, $p)) {\r
+ $dif = QRinput::estimateBitsModeAn($run) + 4 + $la\r
+ + QRinput::estimateBitsMode8(1) // + 4 + l8\r
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8\r
+ if($dif > 0) {\r
+ return $this->eat8();\r
+ }\r
+ }\r
+\r
+ $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));\r
+ if($ret < 0)\r
+ return -1;\r
+\r
+ return $run;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function eatKanji()\r
+ {\r
+ $p = 0;\r
+ \r
+ while($this->identifyMode($p) == QR_MODE_KANJI) {\r
+ $p += 2;\r
+ }\r
+ \r
+ $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));\r
+ if($ret < 0)\r
+ return -1;\r
+\r
+ return $run;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function eat8()\r
+ {\r
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());\r
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());\r
+\r
+ $p = 1;\r
+ $dataStrLen = strlen($this->dataStr);\r
+ \r
+ while($p < $dataStrLen) {\r
+ \r
+ $mode = $this->identifyMode($p);\r
+ if($mode == QR_MODE_KANJI) {\r
+ break;\r
+ }\r
+ if($mode == QR_MODE_NUM) {\r
+ $q = $p;\r
+ while(self::isdigitat($this->dataStr, $q)) {\r
+ $q++;\r
+ }\r
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8\r
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln\r
+ - QRinput::estimateBitsMode8($q); // - 4 - l8\r
+ if($dif < 0) {\r
+ break;\r
+ } else {\r
+ $p = $q;\r
+ }\r
+ } else if($mode == QR_MODE_AN) {\r
+ $q = $p;\r
+ while(self::isalnumat($this->dataStr, $q)) {\r
+ $q++;\r
+ }\r
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8\r
+ + QRinput::estimateBitsModeAn($q - $p) + 4 + $la\r
+ - QRinput::estimateBitsMode8($q); // - 4 - l8\r
+ if($dif < 0) {\r
+ break;\r
+ } else {\r
+ $p = $q;\r
+ }\r
+ } else {\r
+ $p++;\r
+ }\r
+ }\r
+\r
+ $run = $p;\r
+ $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));\r
+ \r
+ if($ret < 0)\r
+ return -1;\r
+\r
+ return $run;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function splitString()\r
+ {\r
+ while (strlen($this->dataStr) > 0)\r
+ {\r
+ if($this->dataStr == '')\r
+ return 0;\r
+\r
+ $mode = $this->identifyMode(0);\r
+ \r
+ switch ($mode) {\r
+ case QR_MODE_NUM: $length = $this->eatNum(); break;\r
+ case QR_MODE_AN: $length = $this->eatAn(); break;\r
+ case QR_MODE_KANJI:\r
+ if ($hint == QR_MODE_KANJI)\r
+ $length = $this->eatKanji();\r
+ else $length = $this->eat8();\r
+ break;\r
+ default: $length = $this->eat8(); break;\r
+ \r
+ }\r
+\r
+ if($length == 0) return 0;\r
+ if($length < 0) return -1;\r
+ \r
+ $this->dataStr = substr($this->dataStr, $length);\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function toUpper()\r
+ {\r
+ $stringLen = strlen($this->dataStr);\r
+ $p = 0;\r
+ \r
+ while ($p<$stringLen) {\r
+ $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint);\r
+ if($mode == QR_MODE_KANJI) {\r
+ $p += 2;\r
+ } else {\r
+ if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {\r
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);\r
+ }\r
+ $p++;\r
+ }\r
+ }\r
+\r
+ return $this->dataStr;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)\r
+ {\r
+ if(is_null($string) || $string == '\0' || $string == '') {\r
+ throw new Exception('empty string!!!');\r
+ }\r
+\r
+ $split = new QRsplit($string, $input, $modeHint);\r
+ \r
+ if(!$casesensitive)\r
+ $split->toUpper();\r
+ \r
+ return $split->splitString();\r
+ }\r
+ }
+
+
+
+//---- qrrscode.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Reed-Solomon error correction support\r
+ * \r
+ * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q\r
+ * (libfec is released under the GNU Lesser General Public License.)\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ class QRrsItem {\r
+ \r
+ public $mm; // Bits per symbol \r
+ public $nn; // Symbols per block (= (1<<mm)-1) \r
+ public $alpha_to = array(); // log lookup table \r
+ public $index_of = array(); // Antilog lookup table \r
+ public $genpoly = array(); // Generator polynomial \r
+ public $nroots; // Number of generator roots = number of parity symbols \r
+ public $fcr; // First consecutive root, index form \r
+ public $prim; // Primitive element, index form \r
+ public $iprim; // prim-th root of 1, index form \r
+ public $pad; // Padding bytes in shortened block \r
+ public $gfpoly;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function modnn($x)\r
+ {\r
+ while ($x >= $this->nn) {\r
+ $x -= $this->nn;\r
+ $x = ($x >> $this->mm) + ($x & $this->nn);\r
+ }\r
+ \r
+ return $x;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)\r
+ {\r
+ // Common code for intializing a Reed-Solomon control block (char or int symbols)\r
+ // Copyright 2004 Phil Karn, KA9Q\r
+ // May be used under the terms of the GNU Lesser General Public License (LGPL)\r
+\r
+ $rs = null;\r
+ \r
+ // Check parameter ranges\r
+ if($symsize < 0 || $symsize > 8) return $rs;\r
+ if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs;\r
+ if($prim <= 0 || $prim >= (1<<$symsize)) return $rs;\r
+ if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values!\r
+ if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding\r
+\r
+ $rs = new QRrsItem();\r
+ $rs->mm = $symsize;\r
+ $rs->nn = (1<<$symsize)-1;\r
+ $rs->pad = $pad;\r
+\r
+ $rs->alpha_to = array_fill(0, $rs->nn+1, 0);\r
+ $rs->index_of = array_fill(0, $rs->nn+1, 0);\r
+ \r
+ // PHP style macro replacement ;)\r
+ $NN =& $rs->nn;\r
+ $A0 =& $NN;\r
+ \r
+ // Generate Galois field lookup tables\r
+ $rs->index_of[0] = $A0; // log(zero) = -inf\r
+ $rs->alpha_to[$A0] = 0; // alpha**-inf = 0\r
+ $sr = 1;\r
+ \r
+ for($i=0; $i<$rs->nn; $i++) {\r
+ $rs->index_of[$sr] = $i;\r
+ $rs->alpha_to[$i] = $sr;\r
+ $sr <<= 1;\r
+ if($sr & (1<<$symsize)) {\r
+ $sr ^= $gfpoly;\r
+ }\r
+ $sr &= $rs->nn;\r
+ }\r
+ \r
+ if($sr != 1){\r
+ // field generator polynomial is not primitive!\r
+ $rs = NULL;\r
+ return $rs;\r
+ }\r
+\r
+ /* Form RS code generator polynomial from its roots */\r
+ $rs->genpoly = array_fill(0, $nroots+1, 0);\r
+ \r
+ $rs->fcr = $fcr;\r
+ $rs->prim = $prim;\r
+ $rs->nroots = $nroots;\r
+ $rs->gfpoly = $gfpoly;\r
+\r
+ /* Find prim-th root of 1, used in decoding */\r
+ for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)\r
+ ; // intentional empty-body loop!\r
+ \r
+ $rs->iprim = (int)($iprim / $prim);\r
+ $rs->genpoly[0] = 1;\r
+ \r
+ for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {\r
+ $rs->genpoly[$i+1] = 1;\r
+\r
+ // Multiply rs->genpoly[] by @**(root + x)\r
+ for ($j = $i; $j > 0; $j--) {\r
+ if ($rs->genpoly[$j] != 0) {\r
+ $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];\r
+ } else {\r
+ $rs->genpoly[$j] = $rs->genpoly[$j-1];\r
+ }\r
+ }\r
+ // rs->genpoly[0] can never be zero\r
+ $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];\r
+ }\r
+ \r
+ // convert rs->genpoly[] to index form for quicker encoding\r
+ for ($i = 0; $i <= $nroots; $i++)\r
+ $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];\r
+\r
+ return $rs;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encode_rs_char($data, &$parity)\r
+ {\r
+ $MM =& $this->mm;\r
+ $NN =& $this->nn;\r
+ $ALPHA_TO =& $this->alpha_to;\r
+ $INDEX_OF =& $this->index_of;\r
+ $GENPOLY =& $this->genpoly;\r
+ $NROOTS =& $this->nroots;\r
+ $FCR =& $this->fcr;\r
+ $PRIM =& $this->prim;\r
+ $IPRIM =& $this->iprim;\r
+ $PAD =& $this->pad;\r
+ $A0 =& $NN;\r
+\r
+ $parity = array_fill(0, $NROOTS, 0);\r
+\r
+ for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {\r
+ \r
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];\r
+ if($feedback != $A0) { \r
+ // feedback term is non-zero\r
+ \r
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must\r
+ // always be for the polynomials constructed by init_rs()\r
+ $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);\r
+ \r
+ for($j=1;$j<$NROOTS;$j++) {\r
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])];\r
+ }\r
+ }\r
+ \r
+ // Shift \r
+ array_shift($parity);\r
+ if($feedback != $A0) {\r
+ array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);\r
+ } else {\r
+ array_push($parity, 0);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ //##########################################################################\r
+ \r
+ class QRrs {\r
+ \r
+ public static $items = array();\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)\r
+ {\r
+ foreach(self::$items as $rs) {\r
+ if($rs->pad != $pad) continue;\r
+ if($rs->nroots != $nroots) continue;\r
+ if($rs->mm != $symsize) continue;\r
+ if($rs->gfpoly != $gfpoly) continue;\r
+ if($rs->fcr != $fcr) continue;\r
+ if($rs->prim != $prim) continue;\r
+\r
+ return $rs;\r
+ }\r
+\r
+ $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);\r
+ array_unshift(self::$items, $rs);\r
+\r
+ return $rs;\r
+ }\r
+ }
+
+
+
+//---- qrmask.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Masking\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ define('N1', 3);\r
+ define('N2', 3);\r
+ define('N3', 40);\r
+ define('N4', 10);\r
+\r
+ class QRmask {\r
+ \r
+ public $runLength = array();\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function __construct() \r
+ {\r
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function writeFormatInformation($width, &$frame, $mask, $level)\r
+ {\r
+ $blacks = 0;\r
+ $format = QRspec::getFormatInfo($mask, $level);\r
+\r
+ for($i=0; $i<8; $i++) {\r
+ if($format & 1) {\r
+ $blacks += 2;\r
+ $v = 0x85;\r
+ } else {\r
+ $v = 0x84;\r
+ }\r
+ \r
+ $frame[8][$width - 1 - $i] = chr($v);\r
+ if($i < 6) {\r
+ $frame[$i][8] = chr($v);\r
+ } else {\r
+ $frame[$i + 1][8] = chr($v);\r
+ }\r
+ $format = $format >> 1;\r
+ }\r
+ \r
+ for($i=0; $i<7; $i++) {\r
+ if($format & 1) {\r
+ $blacks += 2;\r
+ $v = 0x85;\r
+ } else {\r
+ $v = 0x84;\r
+ }\r
+ \r
+ $frame[$width - 7 + $i][8] = chr($v);\r
+ if($i == 0) {\r
+ $frame[8][7] = chr($v);\r
+ } else {\r
+ $frame[8][6 - $i] = chr($v);\r
+ }\r
+ \r
+ $format = $format >> 1;\r
+ }\r
+\r
+ return $blacks;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function mask0($x, $y) { return ($x+$y)&1; }\r
+ public function mask1($x, $y) { return ($y&1); }\r
+ public function mask2($x, $y) { return ($x%3); }\r
+ public function mask3($x, $y) { return ($x+$y)%3; }\r
+ public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; }\r
+ public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; }\r
+ public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; }\r
+ public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; }\r
+ \r
+ //----------------------------------------------------------------------\r
+ private function generateMaskNo($maskNo, $width, $frame)\r
+ {\r
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));\r
+ \r
+ for($y=0; $y<$width; $y++) {\r
+ for($x=0; $x<$width; $x++) {\r
+ if(ord($frame[$y][$x]) & 0x80) {\r
+ $bitMask[$y][$x] = 0;\r
+ } else {\r
+ $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);\r
+ $bitMask[$y][$x] = ($maskFunc == 0)?1:0;\r
+ }\r
+ \r
+ }\r
+ }\r
+ \r
+ return $bitMask;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function serial($bitFrame)\r
+ {\r
+ $codeArr = array();\r
+ \r
+ foreach ($bitFrame as $line)\r
+ $codeArr[] = join('', $line);\r
+ \r
+ return gzcompress(join("\n", $codeArr), 9);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function unserial($code)\r
+ {\r
+ $codeArr = array();\r
+ \r
+ $codeLines = explode("\n", gzuncompress($code));\r
+ foreach ($codeLines as $line)\r
+ $codeArr[] = str_split($line);\r
+ \r
+ return $codeArr;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) \r
+ {\r
+ $b = 0;\r
+ $bitMask = array();\r
+ \r
+ $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';\r
+\r
+ if (QR_CACHEABLE) {\r
+ if (file_exists($fileName)) {\r
+ $bitMask = self::unserial(file_get_contents($fileName));\r
+ } else {\r
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);\r
+ if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))\r
+ mkdir(QR_CACHE_DIR.'mask_'.$maskNo);\r
+ file_put_contents($fileName, self::serial($bitMask));\r
+ }\r
+ } else {\r
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);\r
+ }\r
+\r
+ if ($maskGenOnly)\r
+ return;\r
+ \r
+ $d = $s;\r
+\r
+ for($y=0; $y<$width; $y++) {\r
+ for($x=0; $x<$width; $x++) {\r
+ if($bitMask[$y][$x] == 1) {\r
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);\r
+ }\r
+ $b += (int)(ord($d[$y][$x]) & 1);\r
+ }\r
+ }\r
+\r
+ return $b;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function makeMask($width, $frame, $maskNo, $level)\r
+ {\r
+ $masked = array_fill(0, $width, str_repeat("\0", $width));\r
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);\r
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);\r
+ \r
+ return $masked;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function calcN1N3($length)\r
+ {\r
+ $demerit = 0;\r
+\r
+ for($i=0; $i<$length; $i++) {\r
+ \r
+ if($this->runLength[$i] >= 5) {\r
+ $demerit += (N1 + ($this->runLength[$i] - 5));\r
+ }\r
+ if($i & 1) {\r
+ if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) {\r
+ $fact = (int)($this->runLength[$i] / 3);\r
+ if(($this->runLength[$i-2] == $fact) &&\r
+ ($this->runLength[$i-1] == $fact) &&\r
+ ($this->runLength[$i+1] == $fact) &&\r
+ ($this->runLength[$i+2] == $fact)) {\r
+ if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) {\r
+ $demerit += N3;\r
+ } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) {\r
+ $demerit += N3;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return $demerit;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function evaluateSymbol($width, $frame)\r
+ {\r
+ $head = 0;\r
+ $demerit = 0;\r
+\r
+ for($y=0; $y<$width; $y++) {\r
+ $head = 0;\r
+ $this->runLength[0] = 1;\r
+ \r
+ $frameY = $frame[$y];\r
+ \r
+ if ($y>0)\r
+ $frameYM = $frame[$y-1];\r
+ \r
+ for($x=0; $x<$width; $x++) {\r
+ if(($x > 0) && ($y > 0)) {\r
+ $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);\r
+ $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);\r
+ \r
+ if(($b22 | ($w22 ^ 1))&1) { \r
+ $demerit += N2;\r
+ }\r
+ }\r
+ if(($x == 0) && (ord($frameY[$x]) & 1)) {\r
+ $this->runLength[0] = -1;\r
+ $head = 1;\r
+ $this->runLength[$head] = 1;\r
+ } else if($x > 0) {\r
+ if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {\r
+ $head++;\r
+ $this->runLength[$head] = 1;\r
+ } else {\r
+ $this->runLength[$head]++;\r
+ }\r
+ }\r
+ }\r
+ \r
+ $demerit += $this->calcN1N3($head+1);\r
+ }\r
+\r
+ for($x=0; $x<$width; $x++) {\r
+ $head = 0;\r
+ $this->runLength[0] = 1;\r
+ \r
+ for($y=0; $y<$width; $y++) {\r
+ if($y == 0 && (ord($frame[$y][$x]) & 1)) {\r
+ $this->runLength[0] = -1;\r
+ $head = 1;\r
+ $this->runLength[$head] = 1;\r
+ } else if($y > 0) {\r
+ if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {\r
+ $head++;\r
+ $this->runLength[$head] = 1;\r
+ } else {\r
+ $this->runLength[$head]++;\r
+ }\r
+ }\r
+ }\r
+ \r
+ $demerit += $this->calcN1N3($head+1);\r
+ }\r
+\r
+ return $demerit;\r
+ }\r
+ \r
+ \r
+ //----------------------------------------------------------------------\r
+ public function mask($width, $frame, $level)\r
+ {\r
+ $minDemerit = PHP_INT_MAX;\r
+ $bestMaskNum = 0;\r
+ $bestMask = array();\r
+ \r
+ $checked_masks = array(0,1,2,3,4,5,6,7);\r
+ \r
+ if (QR_FIND_FROM_RANDOM !== false) {\r
+ \r
+ $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);\r
+ for ($i = 0; $i < $howManuOut; $i++) {\r
+ $remPos = rand (0, count($checked_masks)-1);\r
+ unset($checked_masks[$remPos]);\r
+ $checked_masks = array_values($checked_masks);\r
+ }\r
+ \r
+ }\r
+ \r
+ $bestMask = $frame;\r
+ \r
+ foreach($checked_masks as $i) {\r
+ $mask = array_fill(0, $width, str_repeat("\0", $width));\r
+\r
+ $demerit = 0;\r
+ $blacks = 0;\r
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);\r
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);\r
+ $blacks = (int)(100 * $blacks / ($width * $width));\r
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);\r
+ $demerit += $this->evaluateSymbol($width, $mask);\r
+ \r
+ if($demerit < $minDemerit) {\r
+ $minDemerit = $demerit;\r
+ $bestMask = $mask;\r
+ $bestMaskNum = $i;\r
+ }\r
+ }\r
+ \r
+ return $bestMask;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ }\r
+
+
+
+
+//---- qrencode.php -----------------------------
+
+
+
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Main encoder classes.\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ class QRrsblock {\r
+ public $dataLength;\r
+ public $data = array();\r
+ public $eccLength;\r
+ public $ecc = array();\r
+ \r
+ public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)\r
+ {\r
+ $rs->encode_rs_char($data, $ecc);\r
+ \r
+ $this->dataLength = $dl;\r
+ $this->data = $data;\r
+ $this->eccLength = $el;\r
+ $this->ecc = $ecc;\r
+ }\r
+ };\r
+ \r
+ //##########################################################################\r
+\r
+ class QRrawcode {\r
+ public $version;\r
+ public $datacode = array();\r
+ public $ecccode = array();\r
+ public $blocks;\r
+ public $rsblocks = array(); //of RSblock\r
+ public $count;\r
+ public $dataLength;\r
+ public $eccLength;\r
+ public $b1;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function __construct(QRinput $input)\r
+ {\r
+ $spec = array(0,0,0,0,0);\r
+ \r
+ $this->datacode = $input->getByteStream();\r
+ if(is_null($this->datacode)) {\r
+ throw new Exception('null imput string');\r
+ }\r
+\r
+ QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);\r
+\r
+ $this->version = $input->getVersion();\r
+ $this->b1 = QRspec::rsBlockNum1($spec);\r
+ $this->dataLength = QRspec::rsDataLength($spec);\r
+ $this->eccLength = QRspec::rsEccLength($spec);\r
+ $this->ecccode = array_fill(0, $this->eccLength, 0);\r
+ $this->blocks = QRspec::rsBlockNum($spec);\r
+ \r
+ $ret = $this->init($spec);\r
+ if($ret < 0) {\r
+ throw new Exception('block alloc error');\r
+ return null;\r
+ }\r
+\r
+ $this->count = 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function init(array $spec)\r
+ {\r
+ $dl = QRspec::rsDataCodes1($spec);\r
+ $el = QRspec::rsEccCodes1($spec);\r
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);\r
+ \r
+\r
+ $blockNo = 0;\r
+ $dataPos = 0;\r
+ $eccPos = 0;\r
+ for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {\r
+ $ecc = array_slice($this->ecccode,$eccPos);\r
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);\r
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);\r
+ \r
+ $dataPos += $dl;\r
+ $eccPos += $el;\r
+ $blockNo++;\r
+ }\r
+\r
+ if(QRspec::rsBlockNum2($spec) == 0)\r
+ return 0;\r
+\r
+ $dl = QRspec::rsDataCodes2($spec);\r
+ $el = QRspec::rsEccCodes2($spec);\r
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);\r
+ \r
+ if($rs == NULL) return -1;\r
+ \r
+ for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {\r
+ $ecc = array_slice($this->ecccode,$eccPos);\r
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);\r
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);\r
+ \r
+ $dataPos += $dl;\r
+ $eccPos += $el;\r
+ $blockNo++;\r
+ }\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getCode()\r
+ {\r
+ $ret;\r
+\r
+ if($this->count < $this->dataLength) {\r
+ $row = $this->count % $this->blocks;\r
+ $col = $this->count / $this->blocks;\r
+ if($col >= $this->rsblocks[0]->dataLength) {\r
+ $row += $this->b1;\r
+ }\r
+ $ret = $this->rsblocks[$row]->data[$col];\r
+ } else if($this->count < $this->dataLength + $this->eccLength) {\r
+ $row = ($this->count - $this->dataLength) % $this->blocks;\r
+ $col = ($this->count - $this->dataLength) / $this->blocks;\r
+ $ret = $this->rsblocks[$row]->ecc[$col];\r
+ } else {\r
+ return 0;\r
+ }\r
+ $this->count++;\r
+ \r
+ return $ret;\r
+ }\r
+ }\r
+\r
+ //##########################################################################\r
+ \r
+ class QRcode {\r
+ \r
+ public $version;\r
+ public $width;\r
+ public $data; \r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeMask(QRinput $input, $mask)\r
+ {\r
+ if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {\r
+ throw new Exception('wrong version');\r
+ }\r
+ if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {\r
+ throw new Exception('wrong level');\r
+ }\r
+\r
+ $raw = new QRrawcode($input);\r
+ \r
+ QRtools::markTime('after_raw');\r
+ \r
+ $version = $raw->version;\r
+ $width = QRspec::getWidth($version);\r
+ $frame = QRspec::newFrame($version);\r
+ \r
+ $filler = new FrameFiller($width, $frame);\r
+ if(is_null($filler)) {\r
+ return NULL;\r
+ }\r
+\r
+ // inteleaved data and ecc codes\r
+ for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {\r
+ $code = $raw->getCode();\r
+ $bit = 0x80;\r
+ for($j=0; $j<8; $j++) {\r
+ $addr = $filler->next();\r
+ $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));\r
+ $bit = $bit >> 1;\r
+ }\r
+ }\r
+ \r
+ QRtools::markTime('after_filler');\r
+ \r
+ unset($raw);\r
+ \r
+ // remainder bits\r
+ $j = QRspec::getRemainder($version);\r
+ for($i=0; $i<$j; $i++) {\r
+ $addr = $filler->next();\r
+ $filler->setFrameAt($addr, 0x02);\r
+ }\r
+ \r
+ $frame = $filler->frame;\r
+ unset($filler);\r
+ \r
+ \r
+ // masking\r
+ $maskObj = new QRmask();\r
+ if($mask < 0) {\r
+ \r
+ if (QR_FIND_BEST_MASK) {\r
+ $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());\r
+ } else {\r
+ $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());\r
+ }\r
+ } else {\r
+ $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());\r
+ }\r
+ \r
+ if($masked == NULL) {\r
+ return NULL;\r
+ }\r
+ \r
+ QRtools::markTime('after_mask');\r
+ \r
+ $this->version = $version;\r
+ $this->width = $width;\r
+ $this->data = $masked;\r
+ \r
+ return $this;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeInput(QRinput $input)\r
+ {\r
+ return $this->encodeMask($input, -1);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeString8bit($string, $version, $level)\r
+ {\r
+ if(string == NULL) {\r
+ throw new Exception('empty string!');\r
+ return NULL;\r
+ }\r
+\r
+ $input = new QRinput($version, $level);\r
+ if($input == NULL) return NULL;\r
+\r
+ $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));\r
+ if($ret < 0) {\r
+ unset($input);\r
+ return NULL;\r
+ }\r
+ return $this->encodeInput($input);\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function encodeString($string, $version, $level, $hint, $casesensitive)\r
+ {\r
+\r
+ if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {\r
+ throw new Exception('bad hint');\r
+ return NULL;\r
+ }\r
+\r
+ $input = new QRinput($version, $level);\r
+ if($input == NULL) return NULL;\r
+\r
+ $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);\r
+ if($ret < 0) {\r
+ return NULL;\r
+ }\r
+\r
+ return $this->encodeInput($input);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) \r
+ {\r
+ $enc = QRencode::factory($level, $size, $margin);\r
+ return $enc->encodePNG($text, $outfile, $saveandprint=false);\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) \r
+ {\r
+ $enc = QRencode::factory($level, $size, $margin);\r
+ return $enc->encode($text, $outfile);\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) \r
+ {\r
+ $enc = QRencode::factory($level, $size, $margin);\r
+ return $enc->encodeRAW($text, $outfile);\r
+ }\r
+ }\r
+ \r
+ //##########################################################################\r
+ \r
+ class FrameFiller {\r
+ \r
+ public $width;\r
+ public $frame;\r
+ public $x;\r
+ public $y;\r
+ public $dir;\r
+ public $bit;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function __construct($width, &$frame)\r
+ {\r
+ $this->width = $width;\r
+ $this->frame = $frame;\r
+ $this->x = $width - 1;\r
+ $this->y = $width - 1;\r
+ $this->dir = -1;\r
+ $this->bit = -1;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function setFrameAt($at, $val)\r
+ {\r
+ $this->frame[$at['y']][$at['x']] = chr($val);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getFrameAt($at)\r
+ {\r
+ return ord($this->frame[$at['y']][$at['x']]);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function next()\r
+ {\r
+ do {\r
+ \r
+ if($this->bit == -1) {\r
+ $this->bit = 0;\r
+ return array('x'=>$this->x, 'y'=>$this->y);\r
+ }\r
+\r
+ $x = $this->x;\r
+ $y = $this->y;\r
+ $w = $this->width;\r
+\r
+ if($this->bit == 0) {\r
+ $x--;\r
+ $this->bit++;\r
+ } else {\r
+ $x++;\r
+ $y += $this->dir;\r
+ $this->bit--;\r
+ }\r
+\r
+ if($this->dir < 0) {\r
+ if($y < 0) {\r
+ $y = 0;\r
+ $x -= 2;\r
+ $this->dir = 1;\r
+ if($x == 6) {\r
+ $x--;\r
+ $y = 9;\r
+ }\r
+ }\r
+ } else {\r
+ if($y == $w) {\r
+ $y = $w - 1;\r
+ $x -= 2;\r
+ $this->dir = -1;\r
+ if($x == 6) {\r
+ $x--;\r
+ $y -= 8;\r
+ }\r
+ }\r
+ }\r
+ if($x < 0 || $y < 0) return null;\r
+\r
+ $this->x = $x;\r
+ $this->y = $y;\r
+\r
+ } while(ord($this->frame[$y][$x]) & 0x80);\r
+ \r
+ return array('x'=>$x, 'y'=>$y);\r
+ }\r
+ \r
+ } ;\r
+ \r
+ //########################################################################## \r
+ \r
+ class QRencode {\r
+ \r
+ public $casesensitive = true;\r
+ public $eightbit = false;\r
+ \r
+ public $version = 0;\r
+ public $size = 3;\r
+ public $margin = 4;\r
+ \r
+ public $structured = 0; // not supported yet\r
+ \r
+ public $level = QR_ECLEVEL_L;\r
+ public $hint = QR_MODE_8;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4)\r
+ {\r
+ $enc = new QRencode();\r
+ $enc->size = $size;\r
+ $enc->margin = $margin;\r
+ \r
+ switch ($level.'') {\r
+ case '0':\r
+ case '1':\r
+ case '2':\r
+ case '3':\r
+ $enc->level = $level;\r
+ break;\r
+ case 'l':\r
+ case 'L':\r
+ $enc->level = QR_ECLEVEL_L;\r
+ break;\r
+ case 'm':\r
+ case 'M':\r
+ $enc->level = QR_ECLEVEL_M;\r
+ break;\r
+ case 'q':\r
+ case 'Q':\r
+ $enc->level = QR_ECLEVEL_Q;\r
+ break;\r
+ case 'h':\r
+ case 'H':\r
+ $enc->level = QR_ECLEVEL_H;\r
+ break;\r
+ }\r
+ \r
+ return $enc;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeRAW($intext, $outfile = false) \r
+ {\r
+ $code = new QRcode();\r
+\r
+ if($this->eightbit) {\r
+ $code->encodeString8bit($intext, $this->version, $this->level);\r
+ } else {\r
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);\r
+ }\r
+ \r
+ return $code->data;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function encode($intext, $outfile = false) \r
+ {\r
+ $code = new QRcode();\r
+\r
+ if($this->eightbit) {\r
+ $code->encodeString8bit($intext, $this->version, $this->level);\r
+ } else {\r
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);\r
+ }\r
+ \r
+ QRtools::markTime('after_encode');\r
+ \r
+ if ($outfile!== false) {\r
+ file_put_contents($outfile, join("\n", QRtools::binarize($code->data)));\r
+ } else {\r
+ return QRtools::binarize($code->data);\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodePNG($intext, $outfile = false,$saveandprint=false) \r
+ {\r
+ try {\r
+ \r
+ ob_start();\r
+ $tab = $this->encode($intext);\r
+ $err = ob_get_contents();\r
+ ob_end_clean();\r
+ \r
+ if ($err != '')\r
+ QRtools::log($outfile, $err);\r
+ \r
+ $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin));\r
+ \r
+ QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint);\r
+ \r
+ } catch (Exception $e) {\r
+ \r
+ QRtools::log($outfile, $e->getMessage());\r
+ \r
+ }\r
+ }\r
+ }\r
+
+
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Bitstream class\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ class QRbitstream {\r
+ \r
+ public $data = array();\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function size()\r
+ {\r
+ return count($this->data);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function allocate($setLength)\r
+ {\r
+ $this->data = array_fill(0, $setLength, 0);\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function newFromNum($bits, $num)\r
+ {\r
+ $bstream = new QRbitstream();\r
+ $bstream->allocate($bits);\r
+ \r
+ $mask = 1 << ($bits - 1);\r
+ for($i=0; $i<$bits; $i++) {\r
+ if($num & $mask) {\r
+ $bstream->data[$i] = 1;\r
+ } else {\r
+ $bstream->data[$i] = 0;\r
+ }\r
+ $mask = $mask >> 1;\r
+ }\r
+\r
+ return $bstream;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function newFromBytes($size, $data)\r
+ {\r
+ $bstream = new QRbitstream();\r
+ $bstream->allocate($size * 8);\r
+ $p=0;\r
+\r
+ for($i=0; $i<$size; $i++) {\r
+ $mask = 0x80;\r
+ for($j=0; $j<8; $j++) {\r
+ if($data[$i] & $mask) {\r
+ $bstream->data[$p] = 1;\r
+ } else {\r
+ $bstream->data[$p] = 0;\r
+ }\r
+ $p++;\r
+ $mask = $mask >> 1;\r
+ }\r
+ }\r
+\r
+ return $bstream;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function append(QRbitstream $arg)\r
+ {\r
+ if (is_null($arg)) {\r
+ return -1;\r
+ }\r
+ \r
+ if($arg->size() == 0) {\r
+ return 0;\r
+ }\r
+ \r
+ if($this->size() == 0) {\r
+ $this->data = $arg->data;\r
+ return 0;\r
+ }\r
+ \r
+ $this->data = array_values(array_merge($this->data, $arg->data));\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function appendNum($bits, $num)\r
+ {\r
+ if ($bits == 0) \r
+ return 0;\r
+\r
+ $b = QRbitstream::newFromNum($bits, $num);\r
+ \r
+ if(is_null($b))\r
+ return -1;\r
+\r
+ $ret = $this->append($b);\r
+ unset($b);\r
+\r
+ return $ret;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function appendBytes($size, $data)\r
+ {\r
+ if ($size == 0) \r
+ return 0;\r
+\r
+ $b = QRbitstream::newFromBytes($size, $data);\r
+ \r
+ if(is_null($b))\r
+ return -1;\r
+\r
+ $ret = $this->append($b);\r
+ unset($b);\r
+\r
+ return $ret;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function toByte()\r
+ {\r
+ \r
+ $size = $this->size();\r
+\r
+ if($size == 0) {\r
+ return array();\r
+ }\r
+ \r
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);\r
+ $bytes = (int)($size / 8);\r
+\r
+ $p = 0;\r
+ \r
+ for($i=0; $i<$bytes; $i++) {\r
+ $v = 0;\r
+ for($j=0; $j<8; $j++) {\r
+ $v = $v << 1;\r
+ $v |= $this->data[$p];\r
+ $p++;\r
+ }\r
+ $data[$i] = $v;\r
+ }\r
+ \r
+ if($size & 7) {\r
+ $v = 0;\r
+ for($j=0; $j<($size & 7); $j++) {\r
+ $v = $v << 1;\r
+ $v |= $this->data[$p];\r
+ $p++;\r
+ }\r
+ $data[$bytes] = $v;\r
+ }\r
+\r
+ return $data;\r
+ }\r
+\r
+ }\r
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Config file, feel free to modify\r
+ */\r
+ \r
+ define('QR_CACHEABLE', true); // use cache - more disk reads but less CPU power, masks and format templates are stored there\r
+ define('QR_CACHE_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR); // used when QR_CACHEABLE === true\r
+ define('QR_LOG_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR); // default error logs dir \r
+ \r
+ define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code\r
+ define('QR_FIND_FROM_RANDOM', false); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly\r
+ define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false\r
+ \r
+ define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images\r
+
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Common constants\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ // Encoding modes\r
+ \r
+ define('QR_MODE_NUL', -1);\r
+ define('QR_MODE_NUM', 0);\r
+ define('QR_MODE_AN', 1);\r
+ define('QR_MODE_8', 2);\r
+ define('QR_MODE_KANJI', 3);\r
+ define('QR_MODE_STRUCTURE', 4);\r
+\r
+ // Levels of error correction.\r
+\r
+ define('QR_ECLEVEL_L', 0);\r
+ define('QR_ECLEVEL_M', 1);\r
+ define('QR_ECLEVEL_Q', 2);\r
+ define('QR_ECLEVEL_H', 3);\r
+ \r
+ // Supported output formats\r
+ \r
+ define('QR_FORMAT_TEXT', 0);\r
+ define('QR_FORMAT_PNG', 1);\r
+ \r
+ class qrstr {\r
+ public static function set(&$srctab, $x, $y, $repl, $replLen = false) {\r
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));\r
+ }\r
+ }
\ No newline at end of file
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Main encoder classes.\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ class QRrsblock {\r
+ public $dataLength;\r
+ public $data = array();\r
+ public $eccLength;\r
+ public $ecc = array();\r
+ \r
+ public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)\r
+ {\r
+ $rs->encode_rs_char($data, $ecc);\r
+ \r
+ $this->dataLength = $dl;\r
+ $this->data = $data;\r
+ $this->eccLength = $el;\r
+ $this->ecc = $ecc;\r
+ }\r
+ };\r
+ \r
+ //##########################################################################\r
+\r
+ class QRrawcode {\r
+ public $version;\r
+ public $datacode = array();\r
+ public $ecccode = array();\r
+ public $blocks;\r
+ public $rsblocks = array(); //of RSblock\r
+ public $count;\r
+ public $dataLength;\r
+ public $eccLength;\r
+ public $b1;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function __construct(QRinput $input)\r
+ {\r
+ $spec = array(0,0,0,0,0);\r
+ \r
+ $this->datacode = $input->getByteStream();\r
+ if(is_null($this->datacode)) {\r
+ throw new Exception('null imput string');\r
+ }\r
+\r
+ QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);\r
+\r
+ $this->version = $input->getVersion();\r
+ $this->b1 = QRspec::rsBlockNum1($spec);\r
+ $this->dataLength = QRspec::rsDataLength($spec);\r
+ $this->eccLength = QRspec::rsEccLength($spec);\r
+ $this->ecccode = array_fill(0, $this->eccLength, 0);\r
+ $this->blocks = QRspec::rsBlockNum($spec);\r
+ \r
+ $ret = $this->init($spec);\r
+ if($ret < 0) {\r
+ throw new Exception('block alloc error');\r
+ return null;\r
+ }\r
+\r
+ $this->count = 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function init(array $spec)\r
+ {\r
+ $dl = QRspec::rsDataCodes1($spec);\r
+ $el = QRspec::rsEccCodes1($spec);\r
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);\r
+ \r
+\r
+ $blockNo = 0;\r
+ $dataPos = 0;\r
+ $eccPos = 0;\r
+ for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {\r
+ $ecc = array_slice($this->ecccode,$eccPos);\r
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);\r
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);\r
+ \r
+ $dataPos += $dl;\r
+ $eccPos += $el;\r
+ $blockNo++;\r
+ }\r
+\r
+ if(QRspec::rsBlockNum2($spec) == 0)\r
+ return 0;\r
+\r
+ $dl = QRspec::rsDataCodes2($spec);\r
+ $el = QRspec::rsEccCodes2($spec);\r
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);\r
+ \r
+ if($rs == NULL) return -1;\r
+ \r
+ for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {\r
+ $ecc = array_slice($this->ecccode,$eccPos);\r
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);\r
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);\r
+ \r
+ $dataPos += $dl;\r
+ $eccPos += $el;\r
+ $blockNo++;\r
+ }\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getCode()\r
+ {\r
+ $ret;\r
+\r
+ if($this->count < $this->dataLength) {\r
+ $row = $this->count % $this->blocks;\r
+ $col = $this->count / $this->blocks;\r
+ if($col >= $this->rsblocks[0]->dataLength) {\r
+ $row += $this->b1;\r
+ }\r
+ $ret = $this->rsblocks[$row]->data[$col];\r
+ } else if($this->count < $this->dataLength + $this->eccLength) {\r
+ $row = ($this->count - $this->dataLength) % $this->blocks;\r
+ $col = ($this->count - $this->dataLength) / $this->blocks;\r
+ $ret = $this->rsblocks[$row]->ecc[$col];\r
+ } else {\r
+ return 0;\r
+ }\r
+ $this->count++;\r
+ \r
+ return $ret;\r
+ }\r
+ }\r
+\r
+ //##########################################################################\r
+ \r
+ class QRcode {\r
+ \r
+ public $version;\r
+ public $width;\r
+ public $data; \r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeMask(QRinput $input, $mask)\r
+ {\r
+ if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {\r
+ throw new Exception('wrong version');\r
+ }\r
+ if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {\r
+ throw new Exception('wrong level');\r
+ }\r
+\r
+ $raw = new QRrawcode($input);\r
+ \r
+ QRtools::markTime('after_raw');\r
+ \r
+ $version = $raw->version;\r
+ $width = QRspec::getWidth($version);\r
+ $frame = QRspec::newFrame($version);\r
+ \r
+ $filler = new FrameFiller($width, $frame);\r
+ if(is_null($filler)) {\r
+ return NULL;\r
+ }\r
+\r
+ // inteleaved data and ecc codes\r
+ for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {\r
+ $code = $raw->getCode();\r
+ $bit = 0x80;\r
+ for($j=0; $j<8; $j++) {\r
+ $addr = $filler->next();\r
+ $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));\r
+ $bit = $bit >> 1;\r
+ }\r
+ }\r
+ \r
+ QRtools::markTime('after_filler');\r
+ \r
+ unset($raw);\r
+ \r
+ // remainder bits\r
+ $j = QRspec::getRemainder($version);\r
+ for($i=0; $i<$j; $i++) {\r
+ $addr = $filler->next();\r
+ $filler->setFrameAt($addr, 0x02);\r
+ }\r
+ \r
+ $frame = $filler->frame;\r
+ unset($filler);\r
+ \r
+ \r
+ // masking\r
+ $maskObj = new QRmask();\r
+ if($mask < 0) {\r
+ \r
+ if (QR_FIND_BEST_MASK) {\r
+ $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());\r
+ } else {\r
+ $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());\r
+ }\r
+ } else {\r
+ $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());\r
+ }\r
+ \r
+ if($masked == NULL) {\r
+ return NULL;\r
+ }\r
+ \r
+ QRtools::markTime('after_mask');\r
+ \r
+ $this->version = $version;\r
+ $this->width = $width;\r
+ $this->data = $masked;\r
+ \r
+ return $this;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeInput(QRinput $input)\r
+ {\r
+ return $this->encodeMask($input, -1);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeString8bit($string, $version, $level)\r
+ {\r
+ if(string == NULL) {\r
+ throw new Exception('empty string!');\r
+ return NULL;\r
+ }\r
+\r
+ $input = new QRinput($version, $level);\r
+ if($input == NULL) return NULL;\r
+\r
+ $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));\r
+ if($ret < 0) {\r
+ unset($input);\r
+ return NULL;\r
+ }\r
+ return $this->encodeInput($input);\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function encodeString($string, $version, $level, $hint, $casesensitive)\r
+ {\r
+\r
+ if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {\r
+ throw new Exception('bad hint');\r
+ return NULL;\r
+ }\r
+\r
+ $input = new QRinput($version, $level);\r
+ if($input == NULL) return NULL;\r
+\r
+ $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);\r
+ if($ret < 0) {\r
+ return NULL;\r
+ }\r
+\r
+ return $this->encodeInput($input);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) \r
+ {\r
+ $enc = QRencode::factory($level, $size, $margin);\r
+ return $enc->encodePNG($text, $outfile, $saveandprint=false);\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) \r
+ {\r
+ $enc = QRencode::factory($level, $size, $margin);\r
+ return $enc->encode($text, $outfile);\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) \r
+ {\r
+ $enc = QRencode::factory($level, $size, $margin);\r
+ return $enc->encodeRAW($text, $outfile);\r
+ }\r
+ }\r
+ \r
+ //##########################################################################\r
+ \r
+ class FrameFiller {\r
+ \r
+ public $width;\r
+ public $frame;\r
+ public $x;\r
+ public $y;\r
+ public $dir;\r
+ public $bit;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function __construct($width, &$frame)\r
+ {\r
+ $this->width = $width;\r
+ $this->frame = $frame;\r
+ $this->x = $width - 1;\r
+ $this->y = $width - 1;\r
+ $this->dir = -1;\r
+ $this->bit = -1;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function setFrameAt($at, $val)\r
+ {\r
+ $this->frame[$at['y']][$at['x']] = chr($val);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getFrameAt($at)\r
+ {\r
+ return ord($this->frame[$at['y']][$at['x']]);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function next()\r
+ {\r
+ do {\r
+ \r
+ if($this->bit == -1) {\r
+ $this->bit = 0;\r
+ return array('x'=>$this->x, 'y'=>$this->y);\r
+ }\r
+\r
+ $x = $this->x;\r
+ $y = $this->y;\r
+ $w = $this->width;\r
+\r
+ if($this->bit == 0) {\r
+ $x--;\r
+ $this->bit++;\r
+ } else {\r
+ $x++;\r
+ $y += $this->dir;\r
+ $this->bit--;\r
+ }\r
+\r
+ if($this->dir < 0) {\r
+ if($y < 0) {\r
+ $y = 0;\r
+ $x -= 2;\r
+ $this->dir = 1;\r
+ if($x == 6) {\r
+ $x--;\r
+ $y = 9;\r
+ }\r
+ }\r
+ } else {\r
+ if($y == $w) {\r
+ $y = $w - 1;\r
+ $x -= 2;\r
+ $this->dir = -1;\r
+ if($x == 6) {\r
+ $x--;\r
+ $y -= 8;\r
+ }\r
+ }\r
+ }\r
+ if($x < 0 || $y < 0) return null;\r
+\r
+ $this->x = $x;\r
+ $this->y = $y;\r
+\r
+ } while(ord($this->frame[$y][$x]) & 0x80);\r
+ \r
+ return array('x'=>$x, 'y'=>$y);\r
+ }\r
+ \r
+ } ;\r
+ \r
+ //########################################################################## \r
+ \r
+ class QRencode {\r
+ \r
+ public $casesensitive = true;\r
+ public $eightbit = false;\r
+ \r
+ public $version = 0;\r
+ public $size = 3;\r
+ public $margin = 4;\r
+ \r
+ public $structured = 0; // not supported yet\r
+ \r
+ public $level = QR_ECLEVEL_L;\r
+ public $hint = QR_MODE_8;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4)\r
+ {\r
+ $enc = new QRencode();\r
+ $enc->size = $size;\r
+ $enc->margin = $margin;\r
+ \r
+ switch ($level.'') {\r
+ case '0':\r
+ case '1':\r
+ case '2':\r
+ case '3':\r
+ $enc->level = $level;\r
+ break;\r
+ case 'l':\r
+ case 'L':\r
+ $enc->level = QR_ECLEVEL_L;\r
+ break;\r
+ case 'm':\r
+ case 'M':\r
+ $enc->level = QR_ECLEVEL_M;\r
+ break;\r
+ case 'q':\r
+ case 'Q':\r
+ $enc->level = QR_ECLEVEL_Q;\r
+ break;\r
+ case 'h':\r
+ case 'H':\r
+ $enc->level = QR_ECLEVEL_H;\r
+ break;\r
+ }\r
+ \r
+ return $enc;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeRAW($intext, $outfile = false) \r
+ {\r
+ $code = new QRcode();\r
+\r
+ if($this->eightbit) {\r
+ $code->encodeString8bit($intext, $this->version, $this->level);\r
+ } else {\r
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);\r
+ }\r
+ \r
+ return $code->data;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function encode($intext, $outfile = false) \r
+ {\r
+ $code = new QRcode();\r
+\r
+ if($this->eightbit) {\r
+ $code->encodeString8bit($intext, $this->version, $this->level);\r
+ } else {\r
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);\r
+ }\r
+ \r
+ QRtools::markTime('after_encode');\r
+ \r
+ if ($outfile!== false) {\r
+ file_put_contents($outfile, join("\n", QRtools::binarize($code->data)));\r
+ } else {\r
+ return QRtools::binarize($code->data);\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodePNG($intext, $outfile = false,$saveandprint=false) \r
+ {\r
+ try {\r
+ \r
+ ob_start();\r
+ $tab = $this->encode($intext);\r
+ $err = ob_get_contents();\r
+ ob_end_clean();\r
+ \r
+ if ($err != '')\r
+ QRtools::log($outfile, $err);\r
+ \r
+ $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin));\r
+ \r
+ QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint);\r
+ \r
+ } catch (Exception $e) {\r
+ \r
+ QRtools::log($outfile, $e->getMessage());\r
+ \r
+ }\r
+ }\r
+ }\r
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Image output of code using GD2\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ define('QR_IMAGE', true);\r
+\r
+ class QRimage {\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) \r
+ {\r
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);\r
+ \r
+ if ($filename === false) {\r
+ Header("Content-type: image/png");\r
+ ImagePng($image);\r
+ } else {\r
+ if($saveandprint===TRUE){\r
+ ImagePng($image, $filename);\r
+ header("Content-type: image/png");\r
+ ImagePng($image);\r
+ }else{\r
+ ImagePng($image, $filename);\r
+ }\r
+ }\r
+ \r
+ ImageDestroy($image);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) \r
+ {\r
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);\r
+ \r
+ if ($filename === false) {\r
+ Header("Content-type: image/jpeg");\r
+ ImageJpeg($image, null, $q);\r
+ } else {\r
+ ImageJpeg($image, $filename, $q); \r
+ }\r
+ \r
+ ImageDestroy($image);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) \r
+ {\r
+ $h = count($frame);\r
+ $w = strlen($frame[0]);\r
+ \r
+ $imgW = $w + 2*$outerFrame;\r
+ $imgH = $h + 2*$outerFrame;\r
+ \r
+ $base_image =ImageCreate($imgW, $imgH);\r
+ \r
+ $col[0] = ImageColorAllocate($base_image,255,255,255);\r
+ $col[1] = ImageColorAllocate($base_image,0,0,0);\r
+\r
+ imagefill($base_image, 0, 0, $col[0]);\r
+\r
+ for($y=0; $y<$h; $y++) {\r
+ for($x=0; $x<$w; $x++) {\r
+ if ($frame[$y][$x] == '1') {\r
+ ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); \r
+ }\r
+ }\r
+ }\r
+ \r
+ $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);\r
+ ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);\r
+ ImageDestroy($base_image);\r
+ \r
+ return $target_image;\r
+ }\r
+ }
\ No newline at end of file
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Input encoding class\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ define('STRUCTURE_HEADER_BITS', 20);\r
+ define('MAX_STRUCTURED_SYMBOLS', 16);\r
+\r
+ class QRinputItem {\r
+ \r
+ public $mode;\r
+ public $size;\r
+ public $data;\r
+ public $bstream;\r
+\r
+ public function __construct($mode, $size, $data, $bstream = null) \r
+ {\r
+ $setData = array_slice($data, 0, $size);\r
+ \r
+ if (count($setData) < $size) {\r
+ $setData = array_merge($setData, array_fill(0,$size-count($setData),0));\r
+ }\r
+ \r
+ if(!QRinput::check($mode, $size, $setData)) {\r
+ throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData));\r
+ return null;\r
+ }\r
+ \r
+ $this->mode = $mode;\r
+ $this->size = $size;\r
+ $this->data = $setData;\r
+ $this->bstream = $bstream;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeModeNum($version)\r
+ {\r
+ try {\r
+ \r
+ $words = (int)($this->size / 3);\r
+ $bs = new QRbitstream();\r
+ \r
+ $val = 0x1;\r
+ $bs->appendNum(4, $val);\r
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);\r
+\r
+ for($i=0; $i<$words; $i++) {\r
+ $val = (ord($this->data[$i*3 ]) - ord('0')) * 100;\r
+ $val += (ord($this->data[$i*3+1]) - ord('0')) * 10;\r
+ $val += (ord($this->data[$i*3+2]) - ord('0'));\r
+ $bs->appendNum(10, $val);\r
+ }\r
+\r
+ if($this->size - $words * 3 == 1) {\r
+ $val = ord($this->data[$words*3]) - ord('0');\r
+ $bs->appendNum(4, $val);\r
+ } else if($this->size - $words * 3 == 2) {\r
+ $val = (ord($this->data[$words*3 ]) - ord('0')) * 10;\r
+ $val += (ord($this->data[$words*3+1]) - ord('0'));\r
+ $bs->appendNum(7, $val);\r
+ }\r
+\r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeModeAn($version)\r
+ {\r
+ try {\r
+ $words = (int)($this->size / 2);\r
+ $bs = new QRbitstream();\r
+ \r
+ $bs->appendNum(4, 0x02);\r
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);\r
+\r
+ for($i=0; $i<$words; $i++) {\r
+ $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45;\r
+ $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));\r
+\r
+ $bs->appendNum(11, $val);\r
+ }\r
+\r
+ if($this->size & 1) {\r
+ $val = QRinput::lookAnTable(ord($this->data[$words * 2]));\r
+ $bs->appendNum(6, $val);\r
+ }\r
+ \r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeMode8($version)\r
+ {\r
+ try {\r
+ $bs = new QRbitstream();\r
+\r
+ $bs->appendNum(4, 0x4);\r
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);\r
+\r
+ for($i=0; $i<$this->size; $i++) {\r
+ $bs->appendNum(8, ord($this->data[$i]));\r
+ }\r
+\r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeModeKanji($version)\r
+ {\r
+ try {\r
+\r
+ $bs = new QRbitrtream();\r
+ \r
+ $bs->appendNum(4, 0x8);\r
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));\r
+\r
+ for($i=0; $i<$this->size; $i+=2) {\r
+ $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]);\r
+ if($val <= 0x9ffc) {\r
+ $val -= 0x8140;\r
+ } else {\r
+ $val -= 0xc140;\r
+ }\r
+ \r
+ $h = ($val >> 8) * 0xc0;\r
+ $val = ($val & 0xff) + $h;\r
+\r
+ $bs->appendNum(13, $val);\r
+ }\r
+\r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function encodeModeStructure()\r
+ {\r
+ try {\r
+ $bs = new QRbitstream();\r
+ \r
+ $bs->appendNum(4, 0x03);\r
+ $bs->appendNum(4, ord($this->data[1]) - 1);\r
+ $bs->appendNum(4, ord($this->data[0]) - 1);\r
+ $bs->appendNum(8, ord($this->data[2]));\r
+\r
+ $this->bstream = $bs;\r
+ return 0;\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function estimateBitStreamSizeOfEntry($version)\r
+ {\r
+ $bits = 0;\r
+\r
+ if($version == 0) \r
+ $version = 1;\r
+\r
+ switch($this->mode) {\r
+ case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break;\r
+ case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break;\r
+ case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break;\r
+ case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break;\r
+ case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; \r
+ default:\r
+ return 0;\r
+ }\r
+\r
+ $l = QRspec::lengthIndicator($this->mode, $version);\r
+ $m = 1 << $l;\r
+ $num = (int)(($this->size + $m - 1) / $m);\r
+\r
+ $bits += $num * (4 + $l);\r
+\r
+ return $bits;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encodeBitStream($version)\r
+ {\r
+ try {\r
+ \r
+ unset($this->bstream);\r
+ $words = QRspec::maximumWords($this->mode, $version);\r
+ \r
+ if($this->size > $words) {\r
+ \r
+ $st1 = new QRinputItem($this->mode, $words, $this->data);\r
+ $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));\r
+\r
+ $st1->encodeBitStream($version);\r
+ $st2->encodeBitStream($version);\r
+ \r
+ $this->bstream = new QRbitstream();\r
+ $this->bstream->append($st1->bstream);\r
+ $this->bstream->append($st2->bstream);\r
+ \r
+ unset($st1);\r
+ unset($st2);\r
+ \r
+ } else {\r
+ \r
+ $ret = 0;\r
+ \r
+ switch($this->mode) {\r
+ case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break;\r
+ case QR_MODE_AN: $ret = $this->encodeModeAn($version); break;\r
+ case QR_MODE_8: $ret = $this->encodeMode8($version); break;\r
+ case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break;\r
+ case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break;\r
+ \r
+ default:\r
+ break;\r
+ }\r
+ \r
+ if($ret < 0)\r
+ return -1;\r
+ }\r
+\r
+ return $this->bstream->size();\r
+ \r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ };\r
+ \r
+ //##########################################################################\r
+\r
+ class QRinput {\r
+\r
+ public $items;\r
+ \r
+ private $version;\r
+ private $level;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function __construct($version = 0, $level = QR_ECLEVEL_L)\r
+ {\r
+ if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {\r
+ throw new Exception('Invalid version no');\r
+ return NULL;\r
+ }\r
+ \r
+ $this->version = $version;\r
+ $this->level = $level;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getVersion()\r
+ {\r
+ return $this->version;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function setVersion($version)\r
+ {\r
+ if($version < 0 || $version > QRSPEC_VERSION_MAX) {\r
+ throw new Exception('Invalid version no');\r
+ return -1;\r
+ }\r
+\r
+ $this->version = $version;\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getErrorCorrectionLevel()\r
+ {\r
+ return $this->level;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function setErrorCorrectionLevel($level)\r
+ {\r
+ if($level > QR_ECLEVEL_H) {\r
+ throw new Exception('Invalid ECLEVEL');\r
+ return -1;\r
+ }\r
+\r
+ $this->level = $level;\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function appendEntry(QRinputItem $entry)\r
+ {\r
+ $this->items[] = $entry;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function append($mode, $size, $data)\r
+ {\r
+ try {\r
+ $entry = new QRinputItem($mode, $size, $data);\r
+ $this->items[] = $entry;\r
+ return 0;\r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ \r
+ public function insertStructuredAppendHeader($size, $index, $parity)\r
+ {\r
+ if( $size > MAX_STRUCTURED_SYMBOLS ) {\r
+ throw new Exception('insertStructuredAppendHeader wrong size');\r
+ }\r
+ \r
+ if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {\r
+ throw new Exception('insertStructuredAppendHeader wrong index');\r
+ }\r
+\r
+ $buf = array($size, $index, $parity);\r
+ \r
+ try {\r
+ $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);\r
+ array_unshift($this->items, $entry);\r
+ return 0;\r
+ } catch (Exception $e) {\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function calcParity()\r
+ {\r
+ $parity = 0;\r
+ \r
+ foreach($this->items as $item) {\r
+ if($item->mode != QR_MODE_STRUCTURE) {\r
+ for($i=$item->size-1; $i>=0; $i--) {\r
+ $parity ^= $item->data[$i];\r
+ }\r
+ }\r
+ }\r
+\r
+ return $parity;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function checkModeNum($size, $data)\r
+ {\r
+ for($i=0; $i<$size; $i++) {\r
+ if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){\r
+ return false;\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function estimateBitsModeNum($size)\r
+ {\r
+ $w = (int)$size / 3;\r
+ $bits = $w * 10;\r
+ \r
+ switch($size - $w * 3) {\r
+ case 1:\r
+ $bits += 4;\r
+ break;\r
+ case 2:\r
+ $bits += 7;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return $bits;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static $anTable = array(\r
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,\r
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,\r
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\r
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,\r
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\r
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1\r
+ );\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function lookAnTable($c)\r
+ {\r
+ return (($c > 127)?-1:self::$anTable[$c]);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function checkModeAn($size, $data)\r
+ {\r
+ for($i=0; $i<$size; $i++) {\r
+ if (self::lookAnTable(ord($data[$i])) == -1) {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function estimateBitsModeAn($size)\r
+ {\r
+ $w = (int)($size / 2);\r
+ $bits = $w * 11;\r
+ \r
+ if($size & 1) {\r
+ $bits += 6;\r
+ }\r
+\r
+ return $bits;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function estimateBitsMode8($size)\r
+ {\r
+ return $size * 8;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function estimateBitsModeKanji($size)\r
+ {\r
+ return (int)(($size / 2) * 13);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function checkModeKanji($size, $data)\r
+ {\r
+ if($size & 1)\r
+ return false;\r
+\r
+ for($i=0; $i<$size; $i+=2) {\r
+ $val = (ord($data[$i]) << 8) | ord($data[$i+1]);\r
+ if( $val < 0x8140 \r
+ || ($val > 0x9ffc && $val < 0xe040) \r
+ || $val > 0xebbf) {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ /***********************************************************************\r
+ * Validation\r
+ **********************************************************************/\r
+\r
+ public static function check($mode, $size, $data)\r
+ {\r
+ if($size <= 0) \r
+ return false;\r
+\r
+ switch($mode) {\r
+ case QR_MODE_NUM: return self::checkModeNum($size, $data); break;\r
+ case QR_MODE_AN: return self::checkModeAn($size, $data); break;\r
+ case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break;\r
+ case QR_MODE_8: return true; break;\r
+ case QR_MODE_STRUCTURE: return true; break;\r
+ \r
+ default:\r
+ break;\r
+ }\r
+\r
+ return false;\r
+ }\r
+ \r
+ \r
+ //----------------------------------------------------------------------\r
+ public function estimateBitStreamSize($version)\r
+ {\r
+ $bits = 0;\r
+\r
+ foreach($this->items as $item) {\r
+ $bits += $item->estimateBitStreamSizeOfEntry($version);\r
+ }\r
+\r
+ return $bits;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function estimateVersion()\r
+ {\r
+ $version = 0;\r
+ $prev = 0;\r
+ do {\r
+ $prev = $version;\r
+ $bits = $this->estimateBitStreamSize($prev);\r
+ $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);\r
+ if ($version < 0) {\r
+ return -1;\r
+ }\r
+ } while ($version > $prev);\r
+\r
+ return $version;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function lengthOfCode($mode, $version, $bits)\r
+ {\r
+ $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);\r
+ switch($mode) {\r
+ case QR_MODE_NUM:\r
+ $chunks = (int)($payload / 10);\r
+ $remain = $payload - $chunks * 10;\r
+ $size = $chunks * 3;\r
+ if($remain >= 7) {\r
+ $size += 2;\r
+ } else if($remain >= 4) {\r
+ $size += 1;\r
+ }\r
+ break;\r
+ case QR_MODE_AN:\r
+ $chunks = (int)($payload / 11);\r
+ $remain = $payload - $chunks * 11;\r
+ $size = $chunks * 2;\r
+ if($remain >= 6) \r
+ $size++;\r
+ break;\r
+ case QR_MODE_8:\r
+ $size = (int)($payload / 8);\r
+ break;\r
+ case QR_MODE_KANJI:\r
+ $size = (int)(($payload / 13) * 2);\r
+ break;\r
+ case QR_MODE_STRUCTURE:\r
+ $size = (int)($payload / 8);\r
+ break;\r
+ default:\r
+ $size = 0;\r
+ break;\r
+ }\r
+ \r
+ $maxsize = QRspec::maximumWords($mode, $version);\r
+ if($size < 0) $size = 0;\r
+ if($size > $maxsize) $size = $maxsize;\r
+\r
+ return $size;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function createBitStream()\r
+ {\r
+ $total = 0;\r
+\r
+ foreach($this->items as $item) {\r
+ $bits = $item->encodeBitStream($this->version);\r
+ \r
+ if($bits < 0) \r
+ return -1;\r
+ \r
+ $total += $bits;\r
+ }\r
+\r
+ return $total;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function convertData()\r
+ {\r
+ $ver = $this->estimateVersion();\r
+ if($ver > $this->getVersion()) {\r
+ $this->setVersion($ver);\r
+ }\r
+\r
+ for(;;) {\r
+ $bits = $this->createBitStream();\r
+ \r
+ if($bits < 0) \r
+ return -1;\r
+ \r
+ $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);\r
+ if($ver < 0) {\r
+ throw new Exception('WRONG VERSION');\r
+ return -1;\r
+ } else if($ver > $this->getVersion()) {\r
+ $this->setVersion($ver);\r
+ } else {\r
+ break;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function appendPaddingBit(&$bstream)\r
+ {\r
+ $bits = $bstream->size();\r
+ $maxwords = QRspec::getDataLength($this->version, $this->level);\r
+ $maxbits = $maxwords * 8;\r
+\r
+ if ($maxbits == $bits) {\r
+ return 0;\r
+ }\r
+\r
+ if ($maxbits - $bits < 5) {\r
+ return $bstream->appendNum($maxbits - $bits, 0);\r
+ }\r
+\r
+ $bits += 4;\r
+ $words = (int)(($bits + 7) / 8);\r
+\r
+ $padding = new QRbitstream();\r
+ $ret = $padding->appendNum($words * 8 - $bits + 4, 0);\r
+ \r
+ if($ret < 0) \r
+ return $ret;\r
+\r
+ $padlen = $maxwords - $words;\r
+ \r
+ if($padlen > 0) {\r
+ \r
+ $padbuf = array();\r
+ for($i=0; $i<$padlen; $i++) {\r
+ $padbuf[$i] = ($i&1)?0x11:0xec;\r
+ }\r
+ \r
+ $ret = $padding->appendBytes($padlen, $padbuf);\r
+ \r
+ if($ret < 0)\r
+ return $ret;\r
+ \r
+ }\r
+\r
+ $ret = $bstream->append($padding);\r
+ \r
+ return $ret;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function mergeBitStream()\r
+ {\r
+ if($this->convertData() < 0) {\r
+ return null;\r
+ }\r
+\r
+ $bstream = new QRbitstream();\r
+ \r
+ foreach($this->items as $item) {\r
+ $ret = $bstream->append($item->bstream);\r
+ if($ret < 0) {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ return $bstream;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function getBitStream()\r
+ {\r
+\r
+ $bstream = $this->mergeBitStream();\r
+ \r
+ if($bstream == null) {\r
+ return null;\r
+ }\r
+ \r
+ $ret = $this->appendPaddingBit($bstream);\r
+ if($ret < 0) {\r
+ return null;\r
+ }\r
+\r
+ return $bstream;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function getByteStream()\r
+ {\r
+ $bstream = $this->getBitStream();\r
+ if($bstream == null) {\r
+ return null;\r
+ }\r
+ \r
+ return $bstream->toByte();\r
+ }\r
+ }\r
+ \r
+ \r
+
\ No newline at end of file
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Root library file, prepares environment and includes dependencies\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR;\r
+ \r
+ // Required libs\r
+ \r
+ include $QR_BASEDIR."qrconst.php";\r
+ include $QR_BASEDIR."qrconfig.php";\r
+ include $QR_BASEDIR."qrtools.php";\r
+ include $QR_BASEDIR."qrspec.php";\r
+ include $QR_BASEDIR."qrimage.php";\r
+ include $QR_BASEDIR."qrinput.php";\r
+ include $QR_BASEDIR."qrbitstream.php";\r
+ include $QR_BASEDIR."qrsplit.php";\r
+ include $QR_BASEDIR."qrrscode.php";\r
+ include $QR_BASEDIR."qrmask.php";\r
+ include $QR_BASEDIR."qrencode.php";\r
+\r
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Masking\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ define('N1', 3);\r
+ define('N2', 3);\r
+ define('N3', 40);\r
+ define('N4', 10);\r
+\r
+ class QRmask {\r
+ \r
+ public $runLength = array();\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function __construct() \r
+ {\r
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function writeFormatInformation($width, &$frame, $mask, $level)\r
+ {\r
+ $blacks = 0;\r
+ $format = QRspec::getFormatInfo($mask, $level);\r
+\r
+ for($i=0; $i<8; $i++) {\r
+ if($format & 1) {\r
+ $blacks += 2;\r
+ $v = 0x85;\r
+ } else {\r
+ $v = 0x84;\r
+ }\r
+ \r
+ $frame[8][$width - 1 - $i] = chr($v);\r
+ if($i < 6) {\r
+ $frame[$i][8] = chr($v);\r
+ } else {\r
+ $frame[$i + 1][8] = chr($v);\r
+ }\r
+ $format = $format >> 1;\r
+ }\r
+ \r
+ for($i=0; $i<7; $i++) {\r
+ if($format & 1) {\r
+ $blacks += 2;\r
+ $v = 0x85;\r
+ } else {\r
+ $v = 0x84;\r
+ }\r
+ \r
+ $frame[$width - 7 + $i][8] = chr($v);\r
+ if($i == 0) {\r
+ $frame[8][7] = chr($v);\r
+ } else {\r
+ $frame[8][6 - $i] = chr($v);\r
+ }\r
+ \r
+ $format = $format >> 1;\r
+ }\r
+\r
+ return $blacks;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function mask0($x, $y) { return ($x+$y)&1; }\r
+ public function mask1($x, $y) { return ($y&1); }\r
+ public function mask2($x, $y) { return ($x%3); }\r
+ public function mask3($x, $y) { return ($x+$y)%3; }\r
+ public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; }\r
+ public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; }\r
+ public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; }\r
+ public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; }\r
+ \r
+ //----------------------------------------------------------------------\r
+ private function generateMaskNo($maskNo, $width, $frame)\r
+ {\r
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));\r
+ \r
+ for($y=0; $y<$width; $y++) {\r
+ for($x=0; $x<$width; $x++) {\r
+ if(ord($frame[$y][$x]) & 0x80) {\r
+ $bitMask[$y][$x] = 0;\r
+ } else {\r
+ $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);\r
+ $bitMask[$y][$x] = ($maskFunc == 0)?1:0;\r
+ }\r
+ \r
+ }\r
+ }\r
+ \r
+ return $bitMask;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function serial($bitFrame)\r
+ {\r
+ $codeArr = array();\r
+ \r
+ foreach ($bitFrame as $line)\r
+ $codeArr[] = join('', $line);\r
+ \r
+ return gzcompress(join("\n", $codeArr), 9);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function unserial($code)\r
+ {\r
+ $codeArr = array();\r
+ \r
+ $codeLines = explode("\n", gzuncompress($code));\r
+ foreach ($codeLines as $line)\r
+ $codeArr[] = str_split($line);\r
+ \r
+ return $codeArr;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) \r
+ {\r
+ $b = 0;\r
+ $bitMask = array();\r
+ \r
+ $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';\r
+\r
+ if (QR_CACHEABLE) {\r
+ if (file_exists($fileName)) {\r
+ $bitMask = self::unserial(file_get_contents($fileName));\r
+ } else {\r
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);\r
+ if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))\r
+ mkdir(QR_CACHE_DIR.'mask_'.$maskNo);\r
+ file_put_contents($fileName, self::serial($bitMask));\r
+ }\r
+ } else {\r
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);\r
+ }\r
+\r
+ if ($maskGenOnly)\r
+ return;\r
+ \r
+ $d = $s;\r
+\r
+ for($y=0; $y<$width; $y++) {\r
+ for($x=0; $x<$width; $x++) {\r
+ if($bitMask[$y][$x] == 1) {\r
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);\r
+ }\r
+ $b += (int)(ord($d[$y][$x]) & 1);\r
+ }\r
+ }\r
+\r
+ return $b;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function makeMask($width, $frame, $maskNo, $level)\r
+ {\r
+ $masked = array_fill(0, $width, str_repeat("\0", $width));\r
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);\r
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);\r
+ \r
+ return $masked;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function calcN1N3($length)\r
+ {\r
+ $demerit = 0;\r
+\r
+ for($i=0; $i<$length; $i++) {\r
+ \r
+ if($this->runLength[$i] >= 5) {\r
+ $demerit += (N1 + ($this->runLength[$i] - 5));\r
+ }\r
+ if($i & 1) {\r
+ if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) {\r
+ $fact = (int)($this->runLength[$i] / 3);\r
+ if(($this->runLength[$i-2] == $fact) &&\r
+ ($this->runLength[$i-1] == $fact) &&\r
+ ($this->runLength[$i+1] == $fact) &&\r
+ ($this->runLength[$i+2] == $fact)) {\r
+ if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) {\r
+ $demerit += N3;\r
+ } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) {\r
+ $demerit += N3;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return $demerit;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function evaluateSymbol($width, $frame)\r
+ {\r
+ $head = 0;\r
+ $demerit = 0;\r
+\r
+ for($y=0; $y<$width; $y++) {\r
+ $head = 0;\r
+ $this->runLength[0] = 1;\r
+ \r
+ $frameY = $frame[$y];\r
+ \r
+ if ($y>0)\r
+ $frameYM = $frame[$y-1];\r
+ \r
+ for($x=0; $x<$width; $x++) {\r
+ if(($x > 0) && ($y > 0)) {\r
+ $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);\r
+ $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);\r
+ \r
+ if(($b22 | ($w22 ^ 1))&1) { \r
+ $demerit += N2;\r
+ }\r
+ }\r
+ if(($x == 0) && (ord($frameY[$x]) & 1)) {\r
+ $this->runLength[0] = -1;\r
+ $head = 1;\r
+ $this->runLength[$head] = 1;\r
+ } else if($x > 0) {\r
+ if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {\r
+ $head++;\r
+ $this->runLength[$head] = 1;\r
+ } else {\r
+ $this->runLength[$head]++;\r
+ }\r
+ }\r
+ }\r
+ \r
+ $demerit += $this->calcN1N3($head+1);\r
+ }\r
+\r
+ for($x=0; $x<$width; $x++) {\r
+ $head = 0;\r
+ $this->runLength[0] = 1;\r
+ \r
+ for($y=0; $y<$width; $y++) {\r
+ if($y == 0 && (ord($frame[$y][$x]) & 1)) {\r
+ $this->runLength[0] = -1;\r
+ $head = 1;\r
+ $this->runLength[$head] = 1;\r
+ } else if($y > 0) {\r
+ if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {\r
+ $head++;\r
+ $this->runLength[$head] = 1;\r
+ } else {\r
+ $this->runLength[$head]++;\r
+ }\r
+ }\r
+ }\r
+ \r
+ $demerit += $this->calcN1N3($head+1);\r
+ }\r
+\r
+ return $demerit;\r
+ }\r
+ \r
+ \r
+ //----------------------------------------------------------------------\r
+ public function mask($width, $frame, $level)\r
+ {\r
+ $minDemerit = PHP_INT_MAX;\r
+ $bestMaskNum = 0;\r
+ $bestMask = array();\r
+ \r
+ $checked_masks = array(0,1,2,3,4,5,6,7);\r
+ \r
+ if (QR_FIND_FROM_RANDOM !== false) {\r
+ \r
+ $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);\r
+ for ($i = 0; $i < $howManuOut; $i++) {\r
+ $remPos = rand (0, count($checked_masks)-1);\r
+ unset($checked_masks[$remPos]);\r
+ $checked_masks = array_values($checked_masks);\r
+ }\r
+ \r
+ }\r
+ \r
+ $bestMask = $frame;\r
+ \r
+ foreach($checked_masks as $i) {\r
+ $mask = array_fill(0, $width, str_repeat("\0", $width));\r
+\r
+ $demerit = 0;\r
+ $blacks = 0;\r
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);\r
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);\r
+ $blacks = (int)(100 * $blacks / ($width * $width));\r
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);\r
+ $demerit += $this->evaluateSymbol($width, $mask);\r
+ \r
+ if($demerit < $minDemerit) {\r
+ $minDemerit = $demerit;\r
+ $bestMask = $mask;\r
+ $bestMaskNum = $i;\r
+ }\r
+ }\r
+ \r
+ return $bestMask;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ }\r
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Reed-Solomon error correction support\r
+ * \r
+ * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q\r
+ * (libfec is released under the GNU Lesser General Public License.)\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ class QRrsItem {\r
+ \r
+ public $mm; // Bits per symbol \r
+ public $nn; // Symbols per block (= (1<<mm)-1) \r
+ public $alpha_to = array(); // log lookup table \r
+ public $index_of = array(); // Antilog lookup table \r
+ public $genpoly = array(); // Generator polynomial \r
+ public $nroots; // Number of generator roots = number of parity symbols \r
+ public $fcr; // First consecutive root, index form \r
+ public $prim; // Primitive element, index form \r
+ public $iprim; // prim-th root of 1, index form \r
+ public $pad; // Padding bytes in shortened block \r
+ public $gfpoly;\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function modnn($x)\r
+ {\r
+ while ($x >= $this->nn) {\r
+ $x -= $this->nn;\r
+ $x = ($x >> $this->mm) + ($x & $this->nn);\r
+ }\r
+ \r
+ return $x;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)\r
+ {\r
+ // Common code for intializing a Reed-Solomon control block (char or int symbols)\r
+ // Copyright 2004 Phil Karn, KA9Q\r
+ // May be used under the terms of the GNU Lesser General Public License (LGPL)\r
+\r
+ $rs = null;\r
+ \r
+ // Check parameter ranges\r
+ if($symsize < 0 || $symsize > 8) return $rs;\r
+ if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs;\r
+ if($prim <= 0 || $prim >= (1<<$symsize)) return $rs;\r
+ if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values!\r
+ if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding\r
+\r
+ $rs = new QRrsItem();\r
+ $rs->mm = $symsize;\r
+ $rs->nn = (1<<$symsize)-1;\r
+ $rs->pad = $pad;\r
+\r
+ $rs->alpha_to = array_fill(0, $rs->nn+1, 0);\r
+ $rs->index_of = array_fill(0, $rs->nn+1, 0);\r
+ \r
+ // PHP style macro replacement ;)\r
+ $NN =& $rs->nn;\r
+ $A0 =& $NN;\r
+ \r
+ // Generate Galois field lookup tables\r
+ $rs->index_of[0] = $A0; // log(zero) = -inf\r
+ $rs->alpha_to[$A0] = 0; // alpha**-inf = 0\r
+ $sr = 1;\r
+ \r
+ for($i=0; $i<$rs->nn; $i++) {\r
+ $rs->index_of[$sr] = $i;\r
+ $rs->alpha_to[$i] = $sr;\r
+ $sr <<= 1;\r
+ if($sr & (1<<$symsize)) {\r
+ $sr ^= $gfpoly;\r
+ }\r
+ $sr &= $rs->nn;\r
+ }\r
+ \r
+ if($sr != 1){\r
+ // field generator polynomial is not primitive!\r
+ $rs = NULL;\r
+ return $rs;\r
+ }\r
+\r
+ /* Form RS code generator polynomial from its roots */\r
+ $rs->genpoly = array_fill(0, $nroots+1, 0);\r
+ \r
+ $rs->fcr = $fcr;\r
+ $rs->prim = $prim;\r
+ $rs->nroots = $nroots;\r
+ $rs->gfpoly = $gfpoly;\r
+\r
+ /* Find prim-th root of 1, used in decoding */\r
+ for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)\r
+ ; // intentional empty-body loop!\r
+ \r
+ $rs->iprim = (int)($iprim / $prim);\r
+ $rs->genpoly[0] = 1;\r
+ \r
+ for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {\r
+ $rs->genpoly[$i+1] = 1;\r
+\r
+ // Multiply rs->genpoly[] by @**(root + x)\r
+ for ($j = $i; $j > 0; $j--) {\r
+ if ($rs->genpoly[$j] != 0) {\r
+ $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];\r
+ } else {\r
+ $rs->genpoly[$j] = $rs->genpoly[$j-1];\r
+ }\r
+ }\r
+ // rs->genpoly[0] can never be zero\r
+ $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];\r
+ }\r
+ \r
+ // convert rs->genpoly[] to index form for quicker encoding\r
+ for ($i = 0; $i <= $nroots; $i++)\r
+ $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];\r
+\r
+ return $rs;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function encode_rs_char($data, &$parity)\r
+ {\r
+ $MM =& $this->mm;\r
+ $NN =& $this->nn;\r
+ $ALPHA_TO =& $this->alpha_to;\r
+ $INDEX_OF =& $this->index_of;\r
+ $GENPOLY =& $this->genpoly;\r
+ $NROOTS =& $this->nroots;\r
+ $FCR =& $this->fcr;\r
+ $PRIM =& $this->prim;\r
+ $IPRIM =& $this->iprim;\r
+ $PAD =& $this->pad;\r
+ $A0 =& $NN;\r
+\r
+ $parity = array_fill(0, $NROOTS, 0);\r
+\r
+ for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {\r
+ \r
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];\r
+ if($feedback != $A0) { \r
+ // feedback term is non-zero\r
+ \r
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must\r
+ // always be for the polynomials constructed by init_rs()\r
+ $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);\r
+ \r
+ for($j=1;$j<$NROOTS;$j++) {\r
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])];\r
+ }\r
+ }\r
+ \r
+ // Shift \r
+ array_shift($parity);\r
+ if($feedback != $A0) {\r
+ array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);\r
+ } else {\r
+ array_push($parity, 0);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ //##########################################################################\r
+ \r
+ class QRrs {\r
+ \r
+ public static $items = array();\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)\r
+ {\r
+ foreach(self::$items as $rs) {\r
+ if($rs->pad != $pad) continue;\r
+ if($rs->nroots != $nroots) continue;\r
+ if($rs->mm != $symsize) continue;\r
+ if($rs->gfpoly != $gfpoly) continue;\r
+ if($rs->fcr != $fcr) continue;\r
+ if($rs->prim != $prim) continue;\r
+\r
+ return $rs;\r
+ }\r
+\r
+ $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);\r
+ array_unshift(self::$items, $rs);\r
+\r
+ return $rs;\r
+ }\r
+ }
\ No newline at end of file
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * QR Code specifications\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * The following data / specifications are taken from\r
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)\r
+ * or\r
+ * "Automatic identification and data capture techniques -- \r
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ define('QRSPEC_VERSION_MAX', 40);\r
+ define('QRSPEC_WIDTH_MAX', 177);\r
+\r
+ define('QRCAP_WIDTH', 0);\r
+ define('QRCAP_WORDS', 1);\r
+ define('QRCAP_REMINDER', 2);\r
+ define('QRCAP_EC', 3);\r
+\r
+ class QRspec {\r
+ \r
+ public static $capacity = array(\r
+ array( 0, 0, 0, array( 0, 0, 0, 0)),\r
+ array( 21, 26, 0, array( 7, 10, 13, 17)), // 1\r
+ array( 25, 44, 7, array( 10, 16, 22, 28)),\r
+ array( 29, 70, 7, array( 15, 26, 36, 44)),\r
+ array( 33, 100, 7, array( 20, 36, 52, 64)),\r
+ array( 37, 134, 7, array( 26, 48, 72, 88)), // 5\r
+ array( 41, 172, 7, array( 36, 64, 96, 112)),\r
+ array( 45, 196, 0, array( 40, 72, 108, 130)),\r
+ array( 49, 242, 0, array( 48, 88, 132, 156)),\r
+ array( 53, 292, 0, array( 60, 110, 160, 192)),\r
+ array( 57, 346, 0, array( 72, 130, 192, 224)), //10\r
+ array( 61, 404, 0, array( 80, 150, 224, 264)),\r
+ array( 65, 466, 0, array( 96, 176, 260, 308)),\r
+ array( 69, 532, 0, array( 104, 198, 288, 352)),\r
+ array( 73, 581, 3, array( 120, 216, 320, 384)),\r
+ array( 77, 655, 3, array( 132, 240, 360, 432)), //15\r
+ array( 81, 733, 3, array( 144, 280, 408, 480)),\r
+ array( 85, 815, 3, array( 168, 308, 448, 532)),\r
+ array( 89, 901, 3, array( 180, 338, 504, 588)),\r
+ array( 93, 991, 3, array( 196, 364, 546, 650)),\r
+ array( 97, 1085, 3, array( 224, 416, 600, 700)), //20\r
+ array(101, 1156, 4, array( 224, 442, 644, 750)),\r
+ array(105, 1258, 4, array( 252, 476, 690, 816)),\r
+ array(109, 1364, 4, array( 270, 504, 750, 900)),\r
+ array(113, 1474, 4, array( 300, 560, 810, 960)),\r
+ array(117, 1588, 4, array( 312, 588, 870, 1050)), //25\r
+ array(121, 1706, 4, array( 336, 644, 952, 1110)),\r
+ array(125, 1828, 4, array( 360, 700, 1020, 1200)),\r
+ array(129, 1921, 3, array( 390, 728, 1050, 1260)),\r
+ array(133, 2051, 3, array( 420, 784, 1140, 1350)),\r
+ array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30\r
+ array(141, 2323, 3, array( 480, 868, 1290, 1530)),\r
+ array(145, 2465, 3, array( 510, 924, 1350, 1620)),\r
+ array(149, 2611, 3, array( 540, 980, 1440, 1710)),\r
+ array(153, 2761, 3, array( 570, 1036, 1530, 1800)),\r
+ array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35\r
+ array(161, 3034, 0, array( 600, 1120, 1680, 1980)),\r
+ array(165, 3196, 0, array( 630, 1204, 1770, 2100)),\r
+ array(169, 3362, 0, array( 660, 1260, 1860, 2220)),\r
+ array(173, 3532, 0, array( 720, 1316, 1950, 2310)),\r
+ array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40\r
+ );\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getDataLength($version, $level)\r
+ {\r
+ return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getECCLength($version, $level)\r
+ {\r
+ return self::$capacity[$version][QRCAP_EC][$level];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getWidth($version)\r
+ {\r
+ return self::$capacity[$version][QRCAP_WIDTH];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getRemainder($version)\r
+ {\r
+ return self::$capacity[$version][QRCAP_REMINDER];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function getMinimumVersion($size, $level)\r
+ {\r
+\r
+ for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {\r
+ $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];\r
+ if($words >= $size) \r
+ return $i;\r
+ }\r
+\r
+ return -1;\r
+ }\r
+ \r
+ //######################################################################\r
+ \r
+ public static $lengthTableBits = array(\r
+ array(10, 12, 14),\r
+ array( 9, 11, 13),\r
+ array( 8, 16, 16),\r
+ array( 8, 10, 12)\r
+ );\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function lengthIndicator($mode, $version)\r
+ {\r
+ if ($mode == QR_MODE_STRUCTURE)\r
+ return 0;\r
+ \r
+ if ($version <= 9) {\r
+ $l = 0;\r
+ } else if ($version <= 26) {\r
+ $l = 1;\r
+ } else {\r
+ $l = 2;\r
+ }\r
+\r
+ return self::$lengthTableBits[$mode][$l];\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function maximumWords($mode, $version)\r
+ {\r
+ if($mode == QR_MODE_STRUCTURE) \r
+ return 3;\r
+ \r
+ if($version <= 9) {\r
+ $l = 0;\r
+ } else if($version <= 26) {\r
+ $l = 1;\r
+ } else {\r
+ $l = 2;\r
+ }\r
+\r
+ $bits = self::$lengthTableBits[$mode][$l];\r
+ $words = (1 << $bits) - 1;\r
+ \r
+ if($mode == QR_MODE_KANJI) {\r
+ $words *= 2; // the number of bytes is required\r
+ }\r
+\r
+ return $words;\r
+ }\r
+\r
+ // Error correction code -----------------------------------------------\r
+ // Table of the error correction code (Reed-Solomon block)\r
+ // See Table 12-16 (pp.30-36), JIS X0510:2004.\r
+\r
+ public static $eccTable = array(\r
+ array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)),\r
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1\r
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)),\r
+ array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)),\r
+ array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)),\r
+ array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5\r
+ array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)),\r
+ array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)),\r
+ array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)),\r
+ array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)),\r
+ array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10\r
+ array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)),\r
+ array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)),\r
+ array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)),\r
+ array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)),\r
+ array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15\r
+ array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)),\r
+ array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)),\r
+ array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)),\r
+ array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)),\r
+ array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20\r
+ array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)),\r
+ array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)),\r
+ array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)),\r
+ array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)),\r
+ array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25\r
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)),\r
+ array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)),\r
+ array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),\r
+ array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)),\r
+ array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30\r
+ array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)),\r
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)),\r
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)),\r
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)),\r
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35\r
+ array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),\r
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)),\r
+ array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),\r
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)),\r
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40\r
+ ); \r
+\r
+ //----------------------------------------------------------------------\r
+ // CACHEABLE!!!\r
+ \r
+ public static function getEccSpec($version, $level, array &$spec)\r
+ {\r
+ if (count($spec) < 5) {\r
+ $spec = array(0,0,0,0,0);\r
+ }\r
+\r
+ $b1 = self::$eccTable[$version][$level][0];\r
+ $b2 = self::$eccTable[$version][$level][1];\r
+ $data = self::getDataLength($version, $level);\r
+ $ecc = self::getECCLength($version, $level);\r
+\r
+ if($b2 == 0) {\r
+ $spec[0] = $b1;\r
+ $spec[1] = (int)($data / $b1);\r
+ $spec[2] = (int)($ecc / $b1);\r
+ $spec[3] = 0; \r
+ $spec[4] = 0;\r
+ } else {\r
+ $spec[0] = $b1;\r
+ $spec[1] = (int)($data / ($b1 + $b2));\r
+ $spec[2] = (int)($ecc / ($b1 + $b2));\r
+ $spec[3] = $b2;\r
+ $spec[4] = $spec[1] + 1;\r
+ }\r
+ }\r
+\r
+ // Alignment pattern ---------------------------------------------------\r
+\r
+ // Positions of alignment patterns.\r
+ // This array includes only the second and the third position of the \r
+ // alignment patterns. Rest of them can be calculated from the distance \r
+ // between them.\r
+ \r
+ // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.\r
+ \r
+ public static $alignmentPattern = array( \r
+ array( 0, 0),\r
+ array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5\r
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10\r
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15\r
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20\r
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25\r
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30\r
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35\r
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40\r
+ ); \r
+\r
+ \r
+ /** --------------------------------------------------------------------\r
+ * Put an alignment marker.\r
+ * @param frame\r
+ * @param width\r
+ * @param ox,oy center coordinate of the pattern\r
+ */\r
+ public static function putAlignmentMarker(array &$frame, $ox, $oy)\r
+ {\r
+ $finder = array(\r
+ "\xa1\xa1\xa1\xa1\xa1",\r
+ "\xa1\xa0\xa0\xa0\xa1",\r
+ "\xa1\xa0\xa1\xa0\xa1",\r
+ "\xa1\xa0\xa0\xa0\xa1",\r
+ "\xa1\xa1\xa1\xa1\xa1"\r
+ ); \r
+ \r
+ $yStart = $oy-2; \r
+ $xStart = $ox-2;\r
+ \r
+ for($y=0; $y<5; $y++) {\r
+ QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function putAlignmentPattern($version, &$frame, $width)\r
+ {\r
+ if($version < 2)\r
+ return;\r
+\r
+ $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];\r
+ if($d < 0) {\r
+ $w = 2;\r
+ } else {\r
+ $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);\r
+ }\r
+\r
+ if($w * $w - 3 == 1) {\r
+ $x = self::$alignmentPattern[$version][0];\r
+ $y = self::$alignmentPattern[$version][0];\r
+ self::putAlignmentMarker($frame, $x, $y);\r
+ return;\r
+ }\r
+\r
+ $cx = self::$alignmentPattern[$version][0];\r
+ for($x=1; $x<$w - 1; $x++) {\r
+ self::putAlignmentMarker($frame, 6, $cx);\r
+ self::putAlignmentMarker($frame, $cx, 6);\r
+ $cx += $d;\r
+ }\r
+\r
+ $cy = self::$alignmentPattern[$version][0];\r
+ for($y=0; $y<$w-1; $y++) {\r
+ $cx = self::$alignmentPattern[$version][0];\r
+ for($x=0; $x<$w-1; $x++) {\r
+ self::putAlignmentMarker($frame, $cx, $cy);\r
+ $cx += $d;\r
+ }\r
+ $cy += $d;\r
+ }\r
+ }\r
+\r
+ // Version information pattern -----------------------------------------\r
+\r
+ // Version information pattern (BCH coded).\r
+ // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.\r
+ \r
+ // size: [QRSPEC_VERSION_MAX - 6]\r
+ \r
+ public static $versionPattern = array(\r
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,\r
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,\r
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,\r
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,\r
+ 0x27541, 0x28c69\r
+ );\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function getVersionPattern($version)\r
+ {\r
+ if($version < 7 || $version > QRSPEC_VERSION_MAX)\r
+ return 0;\r
+\r
+ return self::$versionPattern[$version -7];\r
+ }\r
+\r
+ // Format information --------------------------------------------------\r
+ // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)\r
+ \r
+ public static $formatInfo = array(\r
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),\r
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),\r
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),\r
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)\r
+ );\r
+\r
+ public static function getFormatInfo($mask, $level)\r
+ {\r
+ if($mask < 0 || $mask > 7)\r
+ return 0;\r
+ \r
+ if($level < 0 || $level > 3)\r
+ return 0; \r
+\r
+ return self::$formatInfo[$level][$mask];\r
+ }\r
+\r
+ // Frame ---------------------------------------------------------------\r
+ // Cache of initial frames.\r
+ \r
+ public static $frames = array();\r
+\r
+ /** --------------------------------------------------------------------\r
+ * Put a finder pattern.\r
+ * @param frame\r
+ * @param width\r
+ * @param ox,oy upper-left coordinate of the pattern\r
+ */\r
+ public static function putFinderPattern(&$frame, $ox, $oy)\r
+ {\r
+ $finder = array(\r
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",\r
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",\r
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",\r
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",\r
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",\r
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",\r
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"\r
+ ); \r
+ \r
+ for($y=0; $y<7; $y++) {\r
+ QRstr::set($frame, $ox, $oy+$y, $finder[$y]);\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function createFrame($version)\r
+ {\r
+ $width = self::$capacity[$version][QRCAP_WIDTH];\r
+ $frameLine = str_repeat ("\0", $width);\r
+ $frame = array_fill(0, $width, $frameLine);\r
+\r
+ // Finder pattern\r
+ self::putFinderPattern($frame, 0, 0);\r
+ self::putFinderPattern($frame, $width - 7, 0);\r
+ self::putFinderPattern($frame, 0, $width - 7);\r
+ \r
+ // Separator\r
+ $yOffset = $width - 7;\r
+ \r
+ for($y=0; $y<7; $y++) {\r
+ $frame[$y][7] = "\xc0";\r
+ $frame[$y][$width - 8] = "\xc0";\r
+ $frame[$yOffset][7] = "\xc0";\r
+ $yOffset++;\r
+ }\r
+ \r
+ $setPattern = str_repeat("\xc0", 8);\r
+ \r
+ QRstr::set($frame, 0, 7, $setPattern);\r
+ QRstr::set($frame, $width-8, 7, $setPattern);\r
+ QRstr::set($frame, 0, $width - 8, $setPattern);\r
+ \r
+ // Format info\r
+ $setPattern = str_repeat("\x84", 9);\r
+ QRstr::set($frame, 0, 8, $setPattern);\r
+ QRstr::set($frame, $width - 8, 8, $setPattern, 8);\r
+ \r
+ $yOffset = $width - 8;\r
+\r
+ for($y=0; $y<8; $y++,$yOffset++) {\r
+ $frame[$y][8] = "\x84";\r
+ $frame[$yOffset][8] = "\x84";\r
+ }\r
+\r
+ // Timing pattern \r
+ \r
+ for($i=1; $i<$width-15; $i++) {\r
+ $frame[6][7+$i] = chr(0x90 | ($i & 1));\r
+ $frame[7+$i][6] = chr(0x90 | ($i & 1));\r
+ }\r
+ \r
+ // Alignment pattern \r
+ self::putAlignmentPattern($version, $frame, $width);\r
+ \r
+ // Version information \r
+ if($version >= 7) {\r
+ $vinf = self::getVersionPattern($version);\r
+\r
+ $v = $vinf;\r
+ \r
+ for($x=0; $x<6; $x++) {\r
+ for($y=0; $y<3; $y++) {\r
+ $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));\r
+ $v = $v >> 1;\r
+ }\r
+ }\r
+\r
+ $v = $vinf;\r
+ for($y=0; $y<6; $y++) {\r
+ for($x=0; $x<3; $x++) {\r
+ $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));\r
+ $v = $v >> 1;\r
+ }\r
+ }\r
+ }\r
+ \r
+ // and a little bit... \r
+ $frame[$width - 8][8] = "\x81";\r
+ \r
+ return $frame;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function debug($frame, $binary_mode = false)\r
+ {\r
+ if ($binary_mode) {\r
+ \r
+ foreach ($frame as &$frameLine) {\r
+ $frameLine = join('<span class="m"> </span>', explode('0', $frameLine));\r
+ $frameLine = join('██', explode('1', $frameLine));\r
+ }\r
+ \r
+ ?>\r
+ <style>\r
+ .m { background-color: white; }\r
+ </style>\r
+ <?php\r
+ echo '<pre><tt><br/ ><br/ ><br/ > ';\r
+ echo join("<br/ > ", $frame);\r
+ echo '</tt></pre><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >';\r
+ \r
+ } else {\r
+ \r
+ foreach ($frame as &$frameLine) {\r
+ $frameLine = join('<span class="m"> </span>', explode("\xc0", $frameLine));\r
+ $frameLine = join('<span class="m">▒</span>', explode("\xc1", $frameLine));\r
+ $frameLine = join('<span class="p"> </span>', explode("\xa0", $frameLine));\r
+ $frameLine = join('<span class="p">▒</span>', explode("\xa1", $frameLine));\r
+ $frameLine = join('<span class="s">◇</span>', explode("\x84", $frameLine)); //format 0\r
+ $frameLine = join('<span class="s">◆</span>', explode("\x85", $frameLine)); //format 1\r
+ $frameLine = join('<span class="x">☢</span>', explode("\x81", $frameLine)); //special bit\r
+ $frameLine = join('<span class="c"> </span>', explode("\x90", $frameLine)); //clock 0\r
+ $frameLine = join('<span class="c">◷</span>', explode("\x91", $frameLine)); //clock 1\r
+ $frameLine = join('<span class="f"> </span>', explode("\x88", $frameLine)); //version\r
+ $frameLine = join('<span class="f">▒</span>', explode("\x89", $frameLine)); //version\r
+ $frameLine = join('♦', explode("\x01", $frameLine));\r
+ $frameLine = join('⋅', explode("\0", $frameLine));\r
+ }\r
+ \r
+ ?>\r
+ <style>\r
+ .p { background-color: yellow; }\r
+ .m { background-color: #00FF00; }\r
+ .s { background-color: #FF0000; }\r
+ .c { background-color: aqua; }\r
+ .x { background-color: pink; }\r
+ .f { background-color: gold; }\r
+ </style>\r
+ <?php\r
+ echo "<pre><tt>";\r
+ echo join("<br/ >", $frame);\r
+ echo "</tt></pre>";\r
+ \r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function serial($frame)\r
+ {\r
+ return gzcompress(join("\n", $frame), 9);\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function unserial($code)\r
+ {\r
+ return explode("\n", gzuncompress($code));\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function newFrame($version)\r
+ {\r
+ if($version < 1 || $version > QRSPEC_VERSION_MAX) \r
+ return null;\r
+\r
+ if(!isset(self::$frames[$version])) {\r
+ \r
+ $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';\r
+ \r
+ if (QR_CACHEABLE) {\r
+ if (file_exists($fileName)) {\r
+ self::$frames[$version] = self::unserial(file_get_contents($fileName));\r
+ } else {\r
+ self::$frames[$version] = self::createFrame($version);\r
+ file_put_contents($fileName, self::serial(self::$frames[$version]));\r
+ }\r
+ } else {\r
+ self::$frames[$version] = self::createFrame($version);\r
+ }\r
+ }\r
+ \r
+ if(is_null(self::$frames[$version]))\r
+ return null;\r
+\r
+ return self::$frames[$version];\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; }\r
+ public static function rsBlockNum1($spec) { return $spec[0]; }\r
+ public static function rsDataCodes1($spec) { return $spec[1]; }\r
+ public static function rsEccCodes1($spec) { return $spec[2]; }\r
+ public static function rsBlockNum2($spec) { return $spec[3]; }\r
+ public static function rsDataCodes2($spec) { return $spec[4]; }\r
+ public static function rsEccCodes2($spec) { return $spec[2]; }\r
+ public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); }\r
+ public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; }\r
+ \r
+ }
\ No newline at end of file
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Input splitting classes\r
+ *\r
+ * Based on libqrencode C library distributed under LGPL 2.1\r
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * The following data / specifications are taken from\r
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)\r
+ * or\r
+ * "Automatic identification and data capture techniques -- \r
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ class QRsplit {\r
+\r
+ public $dataStr = '';\r
+ public $input;\r
+ public $modeHint;\r
+\r
+ //----------------------------------------------------------------------\r
+ public function __construct($dataStr, $input, $modeHint) \r
+ {\r
+ $this->dataStr = $dataStr;\r
+ $this->input = $input;\r
+ $this->modeHint = $modeHint;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function isdigitat($str, $pos)\r
+ { \r
+ if ($pos >= strlen($str))\r
+ return false;\r
+ \r
+ return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function isalnumat($str, $pos)\r
+ {\r
+ if ($pos >= strlen($str))\r
+ return false;\r
+ \r
+ return (QRinput::lookAnTable(ord($str[$pos])) >= 0);\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function identifyMode($pos)\r
+ {\r
+ if ($pos >= strlen($this->dataStr)) \r
+ return QR_MODE_NUL;\r
+ \r
+ $c = $this->dataStr[$pos];\r
+ \r
+ if(self::isdigitat($this->dataStr, $pos)) {\r
+ return QR_MODE_NUM;\r
+ } else if(self::isalnumat($this->dataStr, $pos)) {\r
+ return QR_MODE_AN;\r
+ } else if($this->modeHint == QR_MODE_KANJI) {\r
+ \r
+ if ($pos+1 < strlen($this->dataStr)) \r
+ {\r
+ $d = $this->dataStr[$pos+1];\r
+ $word = (ord($c) << 8) | ord($d);\r
+ if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {\r
+ return QR_MODE_KANJI;\r
+ }\r
+ }\r
+ }\r
+\r
+ return QR_MODE_8;\r
+ } \r
+ \r
+ //----------------------------------------------------------------------\r
+ public function eatNum()\r
+ {\r
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());\r
+\r
+ $p = 0;\r
+ while(self::isdigitat($this->dataStr, $p)) {\r
+ $p++;\r
+ }\r
+ \r
+ $run = $p;\r
+ $mode = $this->identifyMode($p);\r
+ \r
+ if($mode == QR_MODE_8) {\r
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln\r
+ + QRinput::estimateBitsMode8(1) // + 4 + l8\r
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8\r
+ if($dif > 0) {\r
+ return $this->eat8();\r
+ }\r
+ }\r
+ if($mode == QR_MODE_AN) {\r
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln\r
+ + QRinput::estimateBitsModeAn(1) // + 4 + la\r
+ - QRinput::estimateBitsModeAn($run + 1);// - 4 - la\r
+ if($dif > 0) {\r
+ return $this->eatAn();\r
+ }\r
+ }\r
+ \r
+ $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));\r
+ if($ret < 0)\r
+ return -1;\r
+\r
+ return $run;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function eatAn()\r
+ {\r
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());\r
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());\r
+\r
+ $p = 0;\r
+ \r
+ while(self::isalnumat($this->dataStr, $p)) {\r
+ if(self::isdigitat($this->dataStr, $p)) {\r
+ $q = $p;\r
+ while(self::isdigitat($this->dataStr, $q)) {\r
+ $q++;\r
+ }\r
+ \r
+ $dif = QRinput::estimateBitsModeAn($p) // + 4 + la\r
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln\r
+ - QRinput::estimateBitsModeAn($q); // - 4 - la\r
+ \r
+ if($dif < 0) {\r
+ break;\r
+ } else {\r
+ $p = $q;\r
+ }\r
+ } else {\r
+ $p++;\r
+ }\r
+ }\r
+\r
+ $run = $p;\r
+\r
+ if(!self::isalnumat($this->dataStr, $p)) {\r
+ $dif = QRinput::estimateBitsModeAn($run) + 4 + $la\r
+ + QRinput::estimateBitsMode8(1) // + 4 + l8\r
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8\r
+ if($dif > 0) {\r
+ return $this->eat8();\r
+ }\r
+ }\r
+\r
+ $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));\r
+ if($ret < 0)\r
+ return -1;\r
+\r
+ return $run;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public function eatKanji()\r
+ {\r
+ $p = 0;\r
+ \r
+ while($this->identifyMode($p) == QR_MODE_KANJI) {\r
+ $p += 2;\r
+ }\r
+ \r
+ $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));\r
+ if($ret < 0)\r
+ return -1;\r
+\r
+ return $run;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function eat8()\r
+ {\r
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());\r
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());\r
+\r
+ $p = 1;\r
+ $dataStrLen = strlen($this->dataStr);\r
+ \r
+ while($p < $dataStrLen) {\r
+ \r
+ $mode = $this->identifyMode($p);\r
+ if($mode == QR_MODE_KANJI) {\r
+ break;\r
+ }\r
+ if($mode == QR_MODE_NUM) {\r
+ $q = $p;\r
+ while(self::isdigitat($this->dataStr, $q)) {\r
+ $q++;\r
+ }\r
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8\r
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln\r
+ - QRinput::estimateBitsMode8($q); // - 4 - l8\r
+ if($dif < 0) {\r
+ break;\r
+ } else {\r
+ $p = $q;\r
+ }\r
+ } else if($mode == QR_MODE_AN) {\r
+ $q = $p;\r
+ while(self::isalnumat($this->dataStr, $q)) {\r
+ $q++;\r
+ }\r
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8\r
+ + QRinput::estimateBitsModeAn($q - $p) + 4 + $la\r
+ - QRinput::estimateBitsMode8($q); // - 4 - l8\r
+ if($dif < 0) {\r
+ break;\r
+ } else {\r
+ $p = $q;\r
+ }\r
+ } else {\r
+ $p++;\r
+ }\r
+ }\r
+\r
+ $run = $p;\r
+ $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));\r
+ \r
+ if($ret < 0)\r
+ return -1;\r
+\r
+ return $run;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function splitString()\r
+ {\r
+ while (strlen($this->dataStr) > 0)\r
+ {\r
+ if($this->dataStr == '')\r
+ return 0;\r
+\r
+ $mode = $this->identifyMode(0);\r
+ \r
+ switch ($mode) {\r
+ case QR_MODE_NUM: $length = $this->eatNum(); break;\r
+ case QR_MODE_AN: $length = $this->eatAn(); break;\r
+ case QR_MODE_KANJI:\r
+ if ($hint == QR_MODE_KANJI)\r
+ $length = $this->eatKanji();\r
+ else $length = $this->eat8();\r
+ break;\r
+ default: $length = $this->eat8(); break;\r
+ \r
+ }\r
+\r
+ if($length == 0) return 0;\r
+ if($length < 0) return -1;\r
+ \r
+ $this->dataStr = substr($this->dataStr, $length);\r
+ }\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public function toUpper()\r
+ {\r
+ $stringLen = strlen($this->dataStr);\r
+ $p = 0;\r
+ \r
+ while ($p<$stringLen) {\r
+ $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint);\r
+ if($mode == QR_MODE_KANJI) {\r
+ $p += 2;\r
+ } else {\r
+ if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {\r
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);\r
+ }\r
+ $p++;\r
+ }\r
+ }\r
+\r
+ return $this->dataStr;\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)\r
+ {\r
+ if(is_null($string) || $string == '\0' || $string == '') {\r
+ throw new Exception('empty string!!!');\r
+ }\r
+\r
+ $split = new QRsplit($string, $input, $modeHint);\r
+ \r
+ if(!$casesensitive)\r
+ $split->toUpper();\r
+ \r
+ return $split->splitString();\r
+ }\r
+ }
\ No newline at end of file
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Toolset, handy and debug utilites.\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+\r
+ class QRtools {\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function binarize($frame)\r
+ {\r
+ $len = count($frame);\r
+ foreach ($frame as &$frameLine) {\r
+ \r
+ for($i=0; $i<$len; $i++) {\r
+ $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';\r
+ }\r
+ }\r
+ \r
+ return $frame;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')\r
+ {\r
+ $barcode_array = array();\r
+ \r
+ if (!is_array($mode))\r
+ $mode = explode(',', $mode);\r
+ \r
+ $eccLevel = 'L';\r
+ \r
+ if (count($mode) > 1) {\r
+ $eccLevel = $mode[1];\r
+ }\r
+ \r
+ $qrTab = QRcode::text($code, false, $eccLevel);\r
+ $size = count($qrTab);\r
+ \r
+ $barcode_array['num_rows'] = $size;\r
+ $barcode_array['num_cols'] = $size;\r
+ $barcode_array['bcode'] = array();\r
+ \r
+ foreach ($qrTab as $line) {\r
+ $arrAdd = array();\r
+ foreach(str_split($line) as $char)\r
+ $arrAdd[] = ($char=='1')?1:0;\r
+ $barcode_array['bcode'][] = $arrAdd;\r
+ }\r
+ \r
+ return $barcode_array;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function clearCache()\r
+ {\r
+ self::$frames = array();\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function buildCache()\r
+ {\r
+ QRtools::markTime('before_build_cache');\r
+ \r
+ $mask = new QRmask();\r
+ for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {\r
+ $frame = QRspec::newFrame($a);\r
+ if (QR_IMAGE) {\r
+ $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';\r
+ QRimage::png(self::binarize($frame), $fileName, 1, 0);\r
+ }\r
+ \r
+ $width = count($frame);\r
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));\r
+ for ($maskNo=0; $maskNo<8; $maskNo++)\r
+ $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);\r
+ }\r
+ \r
+ QRtools::markTime('after_build_cache');\r
+ }\r
+\r
+ //----------------------------------------------------------------------\r
+ public static function log($outfile, $err)\r
+ {\r
+ if (QR_LOG_DIR !== false) {\r
+ if ($err != '') {\r
+ if ($outfile !== false) {\r
+ file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);\r
+ } else {\r
+ file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);\r
+ }\r
+ } \r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function dumpMask($frame) \r
+ {\r
+ $width = count($frame);\r
+ for($y=0;$y<$width;$y++) {\r
+ for($x=0;$x<$width;$x++) {\r
+ echo ord($frame[$y][$x]).',';\r
+ }\r
+ }\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function markTime($markerId)\r
+ {\r
+ list($usec, $sec) = explode(" ", microtime());\r
+ $time = ((float)$usec + (float)$sec);\r
+ \r
+ if (!isset($GLOBALS['qr_time_bench']))\r
+ $GLOBALS['qr_time_bench'] = array();\r
+ \r
+ $GLOBALS['qr_time_bench'][$markerId] = $time;\r
+ }\r
+ \r
+ //----------------------------------------------------------------------\r
+ public static function timeBenchmark()\r
+ {\r
+ self::markTime('finish');\r
+ \r
+ $lastTime = 0;\r
+ $startTime = 0;\r
+ $p = 0;\r
+\r
+ echo '<table cellpadding="3" cellspacing="1">\r
+ <thead><tr style="border-bottom:1px solid silver"><td colspan="2" style="text-align:center">BENCHMARK</td></tr></thead>\r
+ <tbody>';\r
+\r
+ foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {\r
+ if ($p > 0) {\r
+ echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6).'s</td></tr>';\r
+ } else {\r
+ $startTime = $thisTime;\r
+ }\r
+ \r
+ $p++;\r
+ $lastTime = $thisTime;\r
+ }\r
+ \r
+ echo '</tbody><tfoot>\r
+ <tr style="border-top:2px solid black"><th style="text-align:right">TOTAL: </th><td>'.number_format($lastTime-$startTime, 6).'s</td></tr>\r
+ </tfoot>\r
+ </table>';\r
+ }\r
+ \r
+ }\r
+ \r
+ //##########################################################################\r
+ \r
+ QRtools::markTime('start');\r
+
\ No newline at end of file
--- /dev/null
+php ./merge.php\r
+pause
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Tool for merging all library files into one, simpler to incorporate.\r
+ * \r
+ * MAKE SURE THAT RESULTING PHPQRCode.php (and its dir) ARE WRITABLE!\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+ $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR;\r
+ $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR;\r
+ \r
+ $outputFile = $QR_BASEDIR.'phpqrcode.php';\r
+ \r
+ // Required libs\r
+ \r
+ $fileList = array(\r
+ $QR_BASEDIR.'qrconst.php',\r
+ $QR_TOOLSDIR.'merged_config.php',\r
+ $QR_BASEDIR.'qrtools.php',\r
+ $QR_BASEDIR.'qrspec.php',\r
+ $QR_BASEDIR.'qrimage.php',\r
+ $QR_BASEDIR.'qrinput.php',\r
+ $QR_BASEDIR.'qrbitstream.php',\r
+ $QR_BASEDIR.'qrsplit.php',\r
+ $QR_BASEDIR.'qrrscode.php',\r
+ $QR_BASEDIR.'qrmask.php',\r
+ $QR_BASEDIR.'qrencode.php'\r
+ );\r
+ \r
+ $headerFile = $QR_TOOLSDIR.'merged_header.php';\r
+ $versionFile = $QR_BASEDIR.'VERSION';\r
+ \r
+ $outputCode = '';\r
+ \r
+ foreach($fileList as $fileName) {\r
+ $outputCode .= "\n\n".'//---- '.basename($fileName).' -----------------------------'."\n\n";\r
+ $anotherCode = file_get_contents($fileName);\r
+ $anotherCode = preg_replace ('/^<\?php/', '', $anotherCode);\r
+ $anotherCode = preg_replace ('/\?>\*$/', '', $anotherCode);\r
+ $outputCode .= "\n\n".$anotherCode."\n\n";\r
+ }\r
+ \r
+ $versionDataEx = explode("\n", file_get_contents($versionFile));\r
+ \r
+ $outputContents = file_get_contents($headerFile);\r
+ $outputContents .= "\n\n/*\n * Version: ".trim($versionDataEx[0])."\n * Build: ".trim($versionDataEx[1])."\n */\n\n";\r
+ $outputContents .= $outputCode;\r
+ \r
+ file_put_contents($outputFile, $outputContents);\r
+ \r
+
\ No newline at end of file
--- /dev/null
+#!/bin/sh\r
+php ./merge.php
\ No newline at end of file
--- /dev/null
+<?php\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * Config file, tuned-up for merged verion\r
+ */\r
+ \r
+ define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there\r
+ define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true\r
+ define('QR_LOG_DIR', false); // default error logs dir \r
+ \r
+ define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code\r
+ define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly\r
+ define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false\r
+ \r
+ define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images\r
+
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+/*\r
+ * PHP QR Code encoder\r
+ *\r
+ * This file contains MERGED version of PHP QR Code library.\r
+ * It was auto-generated from full version for your convenience.\r
+ *\r
+ * This merged version was configured to not requre any external files,\r
+ * with disabled cache, error loging and weker but faster mask matching.\r
+ * If you need tune it up please use non-merged version.\r
+ *\r
+ * For full version, documentation, examples of use please visit:\r
+ *\r
+ * http://phpqrcode.sourceforge.net/\r
+ * https://sourceforge.net/projects/phpqrcode/\r
+ *\r
+ * PHP QR Code is distributed under LGPL 3\r
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 3 of the License, or any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
+ */\r
+ \r
+
\ No newline at end of file
salt varchar(250) not null default '',
created datetime default null,
twitter_oauth longtext default null,
+ otp_enabled boolean not null default false,
index (theme_id)) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
insert into ttrss_users (login,pwd_hash,access_level) values ('admin',
enabled boolean not null default true,
index(owner_uid),
foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
-
+
create table ttrss_filters2_rules(id integer primary key auto_increment,
filter_id integer not null references ttrss_filters2(id) on delete cascade,
reg_exp varchar(250) not null,
create table ttrss_version (schema_version int not null) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
-insert into ttrss_version values (96);
+insert into ttrss_version values (97);
create table ttrss_enclosures (id integer primary key auto_increment,
content_url text not null,
last_digest_sent timestamp default null,
salt varchar(250) not null default '',
twitter_oauth text default null,
+ otp_enabled boolean not null default false,
created timestamp default null);
insert into ttrss_users (login,pwd_hash,access_level) values ('admin',
owner_uid integer not null references ttrss_users(id) on delete cascade,
match_any_rule boolean not null default false,
enabled boolean not null default true);
-
+
create table ttrss_filters2_rules(id serial not null primary key,
filter_id integer not null references ttrss_filters2(id) on delete cascade,
reg_exp varchar(250) not null,
create table ttrss_version (schema_version int not null);
-insert into ttrss_version values (96);
+insert into ttrss_version values (97);
create table ttrss_enclosures (id serial not null primary key,
content_url text not null,
--- /dev/null
+begin;
+
+alter table ttrss_users add column otp_enabled boolean;
+update ttrss_users set otp_enabled = false;
+alter table ttrss_users change otp_enabled otp_enabled boolean not null;
+alter table ttrss_users alter column otp_enabled set default false;
+
+update ttrss_version set schema_version = 97;
+
+commit;
--- /dev/null
+begin;
+
+alter table ttrss_users add column otp_enabled boolean;
+update ttrss_users set otp_enabled = false;
+alter table ttrss_users alter column otp_enabled set not null;
+alter table ttrss_users alter column otp_enabled set default false;
+
+update ttrss_version set schema_version = 97;
+
+commit;