<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML LANG="ja">
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=Shift_JIS">
<TITLE>QR コード作成</TITLE>
</HEAD>
<BODY BGCOLOR="#CCFFFF">
<CENTER>
<BR>
<B>QR コード作成<BR>(Netscape 4)</B>
<BR><BR>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=20 BGCOLOR="#FFFFFF"><TR><TD>
<ILAYER NAME="vis">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>
<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
<!--
MAX_VER = 10;
MAX_MOD = 17 + MAX_VER * 4;
for(i = 0; i < MAX_MOD; i++) {
document.write("<TR>");
for(j = 0; j < MAX_MOD; j += 4)
document.write("<TD><IMG NAME='M", i.toString(16), "_", j.toString(16), "' SRC='images/qr_m0.gif' WIDTH=12 HEIGHT=3></TD>");
document.writeln("</TR>");
}
//-->
</SCRIPT>
</TABLE>
</ILAYER>
</TD></TR></TABLE>
<BR>
<FORM>
誤り訂正レベル
<SELECT NAME="level">
<OPTION SELECTED>L
<OPTION>M
<OPTION>Q
<OPTION>H
</SELECT>
<BR><BR>
データ<BR>
<TEXTAREA NAME="data" ROWS=6 COLS=40></TEXTAREA>
<BR><BR>
<INPUT TYPE=BUTTON VALUE="作成" onClick="QR_encoding()">
</FORM>
<LAYER NAME="msg" VISIBILITY="hide"><CENTER>処理中...</CENTER></LAYER>
</CENTER>
<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
<!--
// エンコード
function QR_encoding() {
data = document.forms[0].data.value; // データ
if(!data.length)
return;
level = document.forms[0].level.selectedIndex; // 誤り訂正レベル
document.vis.visibility = "hide";
document.msg.visibility = "show";
setTimeout("QR_encoding_body(); QR_encoding_end()", 0);
}
function QR_encoding_end() {
if(data) // エラー以外
document.vis.visibility = "show";
document.msg.visibility = "hide";
}
function QR_encoding_body() {
var code1;
var n1, n2;
var b1, b2;
var x, y;
var i, j, k;
// モード判定
var mode; // モード
var data_len = 0; // 入力データ長
var f_num, f_alpha, f_kanji;
f_num = f_alpha = f_kanji = 1;
for(i = 0; i < data.length; i++) {
var c = data.charAt(i);
code1 = c.charCodeAt(0);
if(code1 < 0x80 || code1 == 0xa5 || code1 == 0x203e) { // ASCII
data_len++;
f_kanji = 0;
if(c < "0" || c > "9") {
f_num = 0;
if(c < "A" || c > "Z") {
switch(c) {
case " ":
case "$":
case "%":
case "*":
case "+":
case "-":
case ".":
case "/":
case ":":
break;
default:
f_alpha = 0;
}
}
}
}
else {
if(code1 >= 0xff61 && code1 <= 0xff9f) { // 半角カナ
data_len++;
f_num = f_alpha = f_kanji = 0;
}
else {
if(shift_jis(c)) { // 漢字
data_len += 2;
f_num = f_alpha = 0;
}
else {
alert("エンコードできない文字があります!");
data = null;
return;
}
}
}
}
if (f_num)
mode = 0; // 数字モード
else if(f_alpha)
mode = 1; // 英数字モード
else if(f_kanji)
mode = 3; // 漢字モード
else
mode = 2; // 8 ビット バイト モード
var version; // 型番
var len_bits; // 文字数指示子ビット数
var data_cws; // データ コード語数
var max_chars; // 最大格納文字数
i_code = 0;
reg = 0;
reg_bits = 0;
switch(mode) {
case 0: // 数字モード
// 型番決定
for(version = 1; version <= MAX_VER; version++) {
if (version <= 9)
len_bits = 10;
else if(version <= 26)
len_bits = 12;
else
len_bits = 14;
n1 = (data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits;
max_chars = Math.floor(n1 / 10) * 3;
n1 %= 10;
if(n1 >= 4) {
if(n1 >= 7)
max_chars += 2;
else
max_chars++;
}
if(data_len <= max_chars)
break;
}
if(version > MAX_VER) {
alert("データが長すぎます!");
data = null;
return;
}
// データ コード語作成
// モード指示子,文字数指示子
put_code(0x1, 4);
put_code(data_len, len_bits);
// データ
for(i = 0; ; ) {
if(i + 2 < data_len) {
put_code(Number(data.substr(i, 3)), 10);
if((i += 3) == data_len)
break;
}
else {
if (i + 1 < data_len)
put_code(Number(data.substr(i, 2)), 7);
else if(i < data_len)
put_code(Number(data.charAt(i)), 4);
break;
}
}
break;
case 1: // 英数字モード
// 型番決定
for(version = 1; version <= MAX_VER; version++) {
if (version <= 9)
len_bits = 9;
else if(version <= 26)
len_bits = 11;
else
len_bits = 13;
n1 = (data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits;
max_chars = Math.floor(n1 / 11) * 2;
if(n1 % 11 >= 6)
max_chars++;
if(data_len <= max_chars)
break;
}
if(version > MAX_VER) {
alert("データが長すぎます!");
data = null;
return;
}
// データ コード語作成
// モード指示子,文字数指示子
put_code(0x2, 4);
put_code(data_len, len_bits);
// データ
for(i = 0; ; ) {
if(i + 1 < data_len) {
put_code(alpha_val(data.charAt(i)) * 45 + alpha_val(data.charAt(i + 1)), 11);
if((i += 2) == data_len)
break;
}
else {
put_code(alpha_val(data.charAt(i)), 6);
break;
}
}
break;
case 2: // 8 ビット バイト モード
// 型番決定
for(version = 1; version <= MAX_VER; version++) {
if (version <= 9)
len_bits = 8;
else
len_bits = 16;
max_chars = Math.floor(((data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits) / 8);
if(data_len <= max_chars)
break;
}
if(version > MAX_VER) {
alert("データが長すぎます!");
data = null;
return;
}
// データ コード語作成
// モード指示子,文字数指示子
put_code(0x4, 4);
put_code(data_len, len_bits);
// データ
for(i = 0; i < data.length; i++) {
code1 = data.charCodeAt(i);
if (code1 < 0x80) // ASCII
put_code(code1, 8);
else if(code1 == 0xa5) // 円記号
put_code(0x5c, 8);
else if(code1 == 0x203e) // オーバライン
put_code(0x7e, 8);
else if(code1 >= 0xff61 && code1 <= 0xff9f) // 半角カナ
put_code(code1 - 0xfec0, 8);
else // 漢字
put_code(shift_jis(data.charAt(i)), 16);
}
break;
case 3: // 漢字モード
data_len = data.length;
// 型番決定
for(version = 1; version <= MAX_VER; version++) {
if (version <= 9)
len_bits = 8;
else if(version <= 26)
len_bits = 10;
else
len_bits = 12;
max_chars = Math.floor(((data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits) / 13);
if(data_len <= max_chars)
break;
}
if(version > MAX_VER) {
alert("データが長すぎます!");
data = null;
return;
}
// データ コード語作成
// モード指示子,文字数指示子
put_code(0x8, 4);
put_code(data_len, len_bits);
// データ
for(i = 0; i < data_len; i++) {
code1 = shift_jis(data.charAt(i));
if(code1 < 0xe000)
code1 -= 0x8140;
else
code1 -= 0xc140;
put_code((code1 >> 8) * 0xc0 + (code1 & 0xff), 13);
}
break;
}
// 終端パターン“0000”付加
if(i_code < data_cws - 1 || i_code < data_cws && !reg_bits)
put_code(0x0, 4);
// フラッシュ
if(reg_bits)
code[i_code++] = (reg << (8 - reg_bits)) & 0xff;
// パディング
for(; ; ) {
if(i_code == data_cws)
break;
code[i_code++] = 0xec;
if(i_code == data_cws)
break;
code[i_code++] = 0x11;
}
var n_blocks = rs_blocks[version - 1][level]; // RS ブロック数
var n_ec = ec_codewords[version - 1][level]; // 誤り訂正コード語数
var g_exp = g_exp_t[n_ec - 1]; // 誤り訂正コード α指数
// 誤り訂正コード作成
var i_data = 0;
var i_ec = data_cws;
n1 = Math.floor(data_cws / n_blocks);
n2 = n_blocks - data_cws % n_blocks;
for(i_block = 0; i_block < n_blocks; i_block++) {
if(i_block == n2)
n1++;
var data_ec = code.slice(i_data, i_data + n1);
data_ec.length = n1 + n_ec;
for(i = 0; i < n_ec; i++)
data_ec[n1 + i] = 0;
for(i = 0; i < n1; i++) {
if(data_ec[i]) {
var exp1 = n_exp[data_ec[i]];
for(j = 0; j < n_ec; j++)
data_ec[i + 1 + j] ^= exp_n[(g_exp[j] + exp1) % 255];
}
}
for(i = 0; i < n_ec; i++)
code[i_ec + i] = data_ec[n1 + i];
i_data += n1;
i_ec += n_ec;
}
var n_modules1 = 21 + (version - 1) * 4; // 1 辺のモジュール数
for(i = 0; i < n_modules1; i++) {
for(j = 0; j < n_modules1; j++)
module1[i][j] = 0;
}
// 位置検出パターン & 分離パターン & 形式情報位置予約(一部)& 固定暗モジュール
for(i = 0; i < 8; i++) {
for(j = 0; j < 9; j++) // 左上
module1[i][j] = finder_pat[i + 1][1 + j];
for(j = 0; j < 8; j++) // 右上
module1[i][n_modules1 - 8 + j] = finder_pat[i + 1][j];
for(j = 0; j < 9; j++) // 左下
module1[n_modules1 - 8 + i][j] = finder_pat[i][1 + j];
}
// 形式情報位置予約
module1[8].splice(0, 9, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40);
module1[8].splice(n_modules1 - 8, 8, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40);
// 型番情報位置予約
if(version >= 7) {
for(i = 11; i >= 9; i--) // 左下
module1[n_modules1 - i].splice(0, 6, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40);
for(i = 0; i <= 5; i++) // 右上
module1[i].splice(n_modules1 - 11, 3, 0x40, 0x40, 0x40);
}
// タイミング パターン
for(i = 8; i < n_modules1 - 9; i += 2) {
module1[6][i ] = module1[i ][6] = 0x81;
module1[6][i + 1] = module1[i + 1][6] = 0x80;
}
module1[6][i] = module1[i][6] = 0x81;
// 位置合せパターン
n1 = align_pos[version - 1].length;
for(i = 0; i < n1; i++) {
y = align_pos[version - 1][i];
for(j = 0; j < n1; j++) {
if(i == 0 && j == 0 || i == 0 && j == n1 - 1 || i == n1 - 1 && j == 0)
continue;
x = align_pos[version - 1][j];
module1[y - 2].splice(x - 2, 5, 0x81, 0x81, 0x81, 0x81, 0x81);
module1[y - 1].splice(x - 2, 5, 0x81, 0x80, 0x80, 0x80, 0x81);
module1[y ].splice(x - 2, 5, 0x81, 0x80, 0x81, 0x80, 0x81);
module1[y + 1].splice(x - 2, 5, 0x81, 0x80, 0x80, 0x80, 0x81);
module1[y + 2].splice(x - 2, 5, 0x81, 0x81, 0x81, 0x81, 0x81);
}
}
// シンボル キャラクタ配置
n1 = Math.floor(data_cws / n_blocks);
n2 = n_blocks - data_cws % n_blocks;
i_block = 0;
i_code = 0;
code1 = code[0];
b1 = 0x80;
i = j = n_modules1 - 1;
var dir = 0; // 走査方向
var l_r = 0; // 右/左
for(; ; ) {
if(!module1[i][j]) { // 空き
module1[i][j] = (code1 & b1) ? 1 : 0;
if(!(b1 >>= 1)) {
// 次のコード語
if(++i_block == n_blocks) {
i_block = 0;
i_code++;
if(n1) { // データ コード
if (i_code == n1) { // 短い方のデータ コードの長さ分終了
if(n2 == n_blocks) { // データ コードの長さがすべて等しい → 誤り訂正コードへ
n1 = 0;
i_code = 0;
}
else { // 余り分
i_block = n2;
}
}
else if(i_code > n1) { // データ コード終了 → 誤り訂正コードへ
n1 = 0;
i_code = 0;
}
}
else { // 誤り訂正コード
if(i_code == n_ec) // 終了
break;
}
}
if(n1) { // データ コード
k = i_block * n1;
if(i_block > n2)
k += i_block - n2;
}
else { // 誤り訂正コード
k = data_cws + i_block * n_ec;
}
code1 = code[k + i_code];
b1 = 0x80;
}
}
if(l_r) { // 左
if(dir) { // 下方向
if(i < n_modules1 - 1) {
i++;
j++;
}
else {
dir = 0; // 反転
if(--j == 6)
j = 5;
}
}
else { // 上方向
if(i) {
i--;
j++;
}
else {
dir = 1; // 反転
if(--j == 6)
j = 5;
}
}
l_r = 0;
}
else { // 右
j--;
l_r = 1;
}
}
// マスク パターン決定
var mask; // マスク パターン
var min_penalty = 0x7fffffff; // 最小失点
var m;
for(m = 0x0; m <= 0x7; m++) {
masking(n_modules1, m); // マスク
// 失点計算
var penalty = 0; // 失点
// 同色の隣接モジュール
for(i = 0; i < n_modules1; i++) {
// 行
b1 = module2[i][0];
n1 = 1;
// 列
b2 = module2[0][i];
n2 = 1;
for(j = 1; j < n_modules1; j++) {
// 行
if(module2[i][j] == b1) {
n1++;
}
else {
if(n1 >= 5)
penalty += 3 + (n1 - 5);
b1 = module2[i][j];
n1 = 1;
}
// 列
if(module2[j][i] == b2) {
n2++;
}
else {
if(n2 >= 5)
penalty += 3 + (n2 - 5);
b2 = module2[j][i];
n2 = 1;
}
}
// 行
if(n1 >= 5)
penalty += 3 + (n1 - 5);
// 列
if(n2 >= 5)
penalty += 3 + (n2 - 5);
}
// 2×2 のモジュール ブロック
for(i = 0; i < n_modules1 - 1; i++) {
for(j = 0; j < n_modules1 - 1; j++) {
b1 = module2[i][j];
if(module2[i][j + 1] == b1 && module2[i + 1][j] == b1 && module2[i + 1][j + 1] == b1)
penalty += 3;
}
}
// 1:1:3:1:1 比率のパターン
var cnt = new Array();
cnt.length = 7;
// 行
for(i = 0; i < n_modules1; i++) {
k = 0;
for(j = 0; ; ) {
// 同色モジュール数カウント
for(; k < 7; k++) {
x = j;
for(; j < n_modules1; j++) {
if(module2[i][j] ^ (k & 0x01)) // k = 0,2,4,6 -- 暗?,k = 1,3,5 -- 明?
break;
}
cnt[k] = j - x; // モジュール数
if(j == n_modules1)
break;
}
if(k >= 5) {
if(k == 5)
cnt[6] = 0;
if(cnt[2] == cnt[1] && cnt[3] == cnt[1] * 3 && cnt[4] == cnt[1] && cnt[5] == cnt[1]
&& (cnt[0] >= cnt[1] * 4 || cnt[6] >= cnt[1] * 4)) { // 1:1:3:1:1 & 4 以上の明
penalty += 40;
if(j < n_modules1) { // 終端でない
// 続きをチェック
cnt[0] = cnt[4];
cnt[1] = cnt[5];
cnt[2] = cnt[6];
k = 3;
continue;
}
}
}
if(j == n_modules1)
break;
// 続きをチェック
cnt[0] = cnt[2];
cnt[1] = cnt[3];
cnt[2] = cnt[4];
cnt[3] = cnt[5];
cnt[4] = cnt[6];
k = 5;
}
}
// 列
for(j = 0; j < n_modules1; j++) {
k = 0;
for(i = 0; ; ) {
// 同色モジュール数カウント
for(; k < 7; k++) {
y = i;
for(; i < n_modules1; i++) {
if(module2[i][j] ^ (k & 0x01)) // k = 0,2,4,6 -- 暗?,k = 1,3,5 -- 明?
break;
}
cnt[k] = i - y; // モジュール数
if(i == n_modules1)
break;
}
if(k >= 5) {
if(k == 5)
cnt[6] = 0;
if(cnt[2] == cnt[1] && cnt[3] == cnt[1] * 3 && cnt[4] == cnt[1] && cnt[5] == cnt[1]
&& (cnt[0] >= cnt[1] * 4 || cnt[6] >= cnt[1] * 4)) { // 1:1:3:1:1 & 4 以上の明
penalty += 40;
if(i < n_modules1) { // 終端でない
// 続きをチェック
cnt[0] = cnt[4];
cnt[1] = cnt[5];
cnt[2] = cnt[6];
k = 3;
continue;
}
}
}
if(i == n_modules1)
break;
// 続きをチェック
cnt[0] = cnt[2];
cnt[1] = cnt[3];
cnt[2] = cnt[4];
cnt[3] = cnt[5];
cnt[4] = cnt[6];
k = 5;
}
}
// 暗モジュール比率
// 2004年改正 JIS X 0510 では「参考」にある例が「評価条件」と矛盾している.
n1 = 0;
for(i = 0; i < n_modules1; i++) {
for(j = 0; j < n_modules1; j++) {
if(module2[i][j]) // 暗
n1++;
}
}
n2 = n_modules1 * n_modules1;
if((n1 = Math.floor((Math.abs(n1 * 2 - n2) * 20 + (n2 * 2) - 1) / (n2 * 2))) > 1)
penalty += 10 * (n1 - 1);
if(penalty < min_penalty) {
mask = m;
min_penalty = penalty;
}
}
masking(n_modules1, mask); // 採用したマスク パターンでマスク
// 固定暗モジュール
// 固定暗モジュール配置はマスク判定の前か後か?
module2[n_modules1 - 8][8] = 1;
// 形式情報
code1 = format_info[level][mask];
b1 = 0x4000;
for(i = 0; i < 7; i++) {
module2[8][(i < 6) ? i : i + 1] = module2[n_modules1 - 1 - i][8] = (code1 & b1) ? 1 : 0;
b1 >>= 1;
}
for(i = 7; i >= 0; i--) {
module2[(i < 6) ? i : i + 1][8] = module2[8][n_modules1 - 1 - i] = (code1 & b1) ? 1 : 0;
b1 >>= 1;
}
// 型番情報
if(version >= 7) {
code1 = version_info[version - 7];
b1 = 0x20000;
for(i = 0; i < 18; i++) {
y = n_modules1 - 9 - i % 3;
x = 5 - Math.floor(i / 3);
module2[y][x] = module2[x][y] = (code1 & b1) ? 1 : 0;
b1 >>= 1;
}
}
// 表示
for(i = 0; i < n_modules1; i++) {
for(j = 0; j < n_modules1; j += 4) {
k = (module2[i][j]) ? 0x8 : 0;
if(j + 1 < n_modules1)
k |= (module2[i][j + 1]) ? 0x4 : 0;
if(j + 2 < n_modules1)
k |= (module2[i][j + 2]) ? 0x2 : 0;
if(j + 3 < n_modules1)
k |= (module2[i][j + 3]) ? 0x1 : 0;
document.vis.document.images["M" + i.toString(16) + "_" + j.toString(16)].src = img_m[k].src;
}
for(; j < MAX_MOD; j += 4)
document.vis.document.images["M" + i.toString(16) + "_" + j.toString(16)].src = img_m[0].src;
}
for(; i < MAX_MOD; i++) {
for(j = 0; j < MAX_MOD; j += 4)
document.vis.document.images["M" + i.toString(16) + "_" + j.toString(16)].src = img_m[0].src;
}
}
// データ コード語数
function get_data_cws(version, level) {
var n_modules;
var n;
n_modules = 21 + (version - 1) * 4; // 1 辺のモジュール数
n_modules = n_modules * n_modules // 総モジュール数
- 3 * (8 * 8) // 位置検出パターン & 分離パターン
- 2 * (n_modules - 2 * 8) // タイミング パターン
- 1 // 固定暗モジュール
- 2 * 15; // 形式情報
// 位置合せパターン
n = align_pos[version - 1].length;
if(n) { // n > 0
n_modules -= (n * n - 3) * (5 * 5);
if(n > 2)
n_modules += 2 * (n - 2) * 5; // タイミング パターンと重なる分
}
// 型番情報
if(version >= 7)
n_modules -= 2 * 18;
return (n_modules >> 3) - rs_blocks[version - 1][level] * ec_codewords[version - 1][level];
}
// コード登録
function put_code(code1, code1_bits) {
reg = (reg << code1_bits) | code1;
reg_bits += code1_bits;
while(reg_bits >= 8) {
code[i_code++] = (reg >> (reg_bits - 8)) & 0xff;
reg_bits -= 8;
}
}
// 英数字モード 文字値
function alpha_val(c) {
switch(c) {
case " ":
return 36;
case "$":
return 37;
case "%":
return 38;
case "*":
return 39;
case "+":
return 40;
case "-":
return 41;
case ".":
return 42;
case "/":
return 43;
case ":":
return 44;
}
if(c <= "9")
return c.charCodeAt(0) - "0".charCodeAt(0);
return c.charCodeAt(0) - "A".charCodeAt(0) + 10;
}
// マスク処理
function masking(n_modules1, mask) {
var i, j;
for(i = 0; i < n_modules1; i++) {
for(j = 0; j < n_modules1; j++) {
module2[i][j] = module1[i][j] & 0x1;
if(!(module1[i][j] & 0xc0)) { // 機能パターン,形式情報,型番情報を除く
switch(mask) {
case 0: // (i+j)mod 2=0
if((i + j) % 2)
continue;
break;
case 1: // i mod 2=0
if(i % 2)
continue;
break;
case 2: // j mod 3=0
if(j % 3)
continue;
break;
case 3: // (i+j)mod 3=0
if((i + j) % 3)
continue;
break;
case 4: // ((i div 2)+(j div 3))mod 2=0
if((Math.floor(i / 2) + Math.floor(j / 3)) % 2)
continue;
break;
case 5: // (i j)mod 2+(i j)mod 3=0
if(i * j % 2 + i * j % 3)
continue;
break;
case 6: // ((i j)mod 2+(i j)mod 3)mod 2=0
if((i * j % 2 + i * j % 3) % 2)
continue;
break;
case 7: // ((i j)mod 3+(i+j)mod 2)mod 2=0
if((i * j % 3 + (i + j) % 2) % 2)
continue;
break;
}
module2[i][j] ^= 1; // 反転
}
}
}
}
// シフト JIS 変換初期化
function shift_jis_init() {
// 変換範囲
range_linear = [[0x824f, 10, 0xff10], // 数字
[0x8260, 26, 0xff21], // 英大文字
[0x8281, 26, 0xff41], // 英小文字
[0x829f, 83, 0x3041], // ひらがな
[0x8340, 86, 0x30a1], // カタカナ
[0x839f, 17, 0x0391], // ギリシャ文字 大文字 1
[0x83b0, 7, 0x03a3], // 2
[0x83bf, 17, 0x03b1], // ギリシャ文字 小文字 1
[0x83d0, 7, 0x03c3], // 2
[0x8440, 6, 0x0410], // ロシア文字 大文字 1
[0x8446, 1, 0x0401], // 2
[0x8447, 26, 0x0416], // 3
[0x8470, 6, 0x0430], // ロシア文字 小文字 1
[0x8476, 1, 0x0451], // 2
[0x8477, 26, 0x0436]]; // 3
range_table = [[0x8140, 108, 0],
[0x81b8, 8, 108],
[0x81c8, 7, 116],
[0x81da, 15, 124],
[0x81f0, 8, 140],
[0x81fc, 1, 148],
[0x849f, 32, 150],
[0x889f, 2966, 182],
[0x989f, 1410, 3148],
[0xe040, 1980, 4558]];
// ASCII 化変換テーブル
unicode_enc =
// 8140 〜 81AC
"7LCl47L^>gz{oicz}8v^z}g>H7]rjl(;Bjs(:*we{<`3K7hCf07^.vp7La027Lr4>7M.C72BO)8z{w1>7OB9U{.4bv2D64P2BtAH"
+ "2CJPnz{AGv7N`]S{*xIl{.>Bi7M@LF7MRXJ7MeeN7MwqR7N;Cu2yiud(>y<Mz}LAsz}K,c3,h+:2{,xj4A7,L(:lZ+2Ea6J{<r>h"
+ "(9@PozzzL0z{-R8z}gCE4:jm*44P]d44lo_43y>04/tXr41mq842sFf7N<Vt2kus72l;Zv"
// 81B8 〜 81BF
+ "2xeH*305A{3/g)s2|Dkk"
// 81C8 〜 81CE
+ "2|)Xg(:GFt2s5d@2x5nM"
// 81DA 〜 81E8
+ "2{?023?08,2x[C*3*[^)3-?HG3(G2r2}SWx2|Uew"
// 81F0 〜 81F7
+ "2a2bp4E|<Q4EMaN2Cfhv"
// 81FC 〜 81FC
+ "48Ao="
// 849F 〜 84BE
+ "3tn;u3v0/93wGxI3wm:f3x`kv3{:PZ3u3N/3vpYK3w>rW3z=p|3{1KN3x;Rm3y/-}3{Ucz3yx^s3zl9B"
// 889F 〜 9872
+ "A>WC)Dx/.[C<BweGrsSYVC[G*R3n9=G-lgyKJ-teRW*p<Z2]OaD(yYXG_E^HDr^vTY5Wn@PK999GT`FhSxx[MFMD?SH{c8,X3n<U"
+ "I9BAiAJ@ttAY|CYCy@IWDs+]]EYDnyG8XlkHmZsfL;]7nMhB`.PIGylQHc+TSo}ELVI,IoBhliEA?T,SQFs@XNrmI4DYoA.VEyWH"
+ "R50E7Z8lh1BnNfSC?ou@Dw9WGY5E2cQL9K@XDF6(XJ{[HC(}`zEKP8KQ,fwcXR^>kZXxRWA/gh>Qk.J;Cb)oEJL?1PZ:.u?BtV^N"
+ "MWU5ICfRXKVG|w8R9>uKBzShjEB7L/Hn|f_IL_49K)KRuMIhy7OB@piR/;a+TPB^>K=mBjN7=<tG-HpgUQi)3Iwb3wB964jDE:tN"
+ "EP>h8FuwUiH2`[WKdY6ULE:JyLYn2xPRE,KR+nADVJ;<]ZQ|cMHdBpgM`@wdDaCqoFc}TDGgFARJ2D(OJ]H6GQ-4|IZSoCH[*Du4"
+ "JuRf*B+A3{GJJi3IXmL0A7JIpBoBdiKJRu4Xp1zcBdq4zARA8YAZJY1BW=|_C`KvEE6DMVEU.s[Hy|*pIDBZSJxZ/zM9L:fO2vZm"
+ "Odc:`R,svdR=T|ARGE[nTY+?:U9^o)VHB3hS<QlMEr3_6LhuUOQh^R{SHu5PXNw>1YMW.]AL*0TCw4yUDU`|PFoK0SG+N-5GM6Oz"
+ "GiQcOYuJ`}I_}E|L3eyvN/|LnQ}2>}X-JzoU8Lq@BZO@SC:wn?Ew+rfIvJ:1NhGJ)SnePZWNisbK6E_DSDwa.IL1g:Vy/IICmr__"
+ "FPUIIHGbH@IR7mEM0tUAOEHH2TA5I(Uz|S9X/{a7XaIb@ElQ4uXyhzJH)5nnJ2M,RI``LFKlXJgCSuUAGlPyvKFs/3RUr@LV+tg_"
+ "Z9rVHIkJmQXd@+,B4dMjR`4hyWKqVOZSH5yR1FwgP-7fOR*TqwA;E}sB;y5HBG=DZB_pFgCSY*EDtzyPEM?`SFF7G|G-,4WGAUhc"
+ "H/|Y/IG8IsIgtS5JR*,UKf.2lKimkWM^wBfN>6h{OgNo8POk<EQ25}bQvIa3T=q0hU9z,vWauf7X.,F2XDbL:Y;1a/A3t:.Em)/h"
+ "M6iD^NCI47Q1_/,XNQy*XzRN[AID=+BnWo4CjWZ9Dc}c-EQ{l5F;A5pFl1+QI7.^]HhGELIbs04J7|A+J_812JroN]N|B5SO9zFv"
+ "FjTB_TH^BbUOfL3U}i^PYSanSA;X6pB*rigEMe5]G`z)]JOFS6MkozEQ*Z<*TZ2rlH*|D1Xg>AiC(45+IU6gRTR(mnI=InrBnt=C"
+ "QQ{?EV@ZN{A5>x}AK+VQC-m1jFWFnvHWu0.JlTzaJ}eQbM@Fq;OLT[*P9cT;PAl.YLi0QZE`gzfGidhKGq@63S7IOpUZ[kuKbW4d"
+ "Yx-YkA@54sAYj5XA{q48OT8:]BE1xnBf*/pB{YNjDN.tBF[9DiFvaviF}@IyHXhjGJz/66Lxd0EQNDc(QlG.1VZD{|XqLP[Y[hQ]"
+ "BBNQ6HyDb<E`9wtIu)RYITi04AzXEvD,FXyW@{sAJLu]`MEZ?wO2mW|PLP6WRF[5+T4t7+V:{1BC+5@YA7ocZBzxyDLvEH}NUrgH"
+ "Ur)srYL8nLB7XMmS7ltiOFzK9ESZc/XH-.pJE;u=Eb)h{H(pZ>Ju8:4V/(G>LQo.CP)O*QP_6{|WHM5nC*fVtTH/R?Uu:cLBmJqH"
+ "N{W=JAynoEB22KgD)ZSaD3]:aF`lHyG(3v+GA{*QH+[_2HZj{{IS=ZTMg<ygP6HDkPG<V_Py{bOR8fuJTFw0STm?)QXtBU^R)4tm"
+ "Z1:j1GU[4<Kvyc3IS3P_JLYNEKkK,0P?NgjTIkiEAH5SLAi[)TB80?+BPhg0C|HJAE7SDSGI{EAGm;0TIkSsALlg}7M)^dVNe6)]"
+ "N>@*+T9Y@7U?ntNVJVQ{XFvw}YT9@BB2)@ZBu[m_FYIa7KUQxuM?oZ[QqHWmTah_?A6;]vBzow1Cz3|OEGg,7FL>LdGX>xnICX9Y"
+ "Lu[:^Sx^e2QKt5TS61^eU[kUiXO3H1[2i|iA=QIfBj7sbC.MQDFe?FkG,^38J=(JENg/iKTWX6ZVk_DLZ-vM+AVN{HAh:/MB2`_+"
+ "BW4r|Bb@]hBzfopC)BwjD-L,vDiiSYEF|OwF73H[F9,bTFG}YXFMV?aFzJL3GcJX^H*Lu)HkkY:I/[gXIOg-]J(8D)K/@JAKK3u}"
+ "Mad3yNdpcrP3RK^P9PIDPImBBQ48E1QFib0Q_NJ;R9YT(Sok9dU8}A6VUUe5W-ag9W<S[GXB1gTYG7TzZUIgYBXLirC(b]^Gm`o("
+ "U3)Kd[)5esBLPqTCzPE7Vi(G/[+pcQKcJ}=M^6(bG2y.QLvkanJSqm>ACO_3D/NMPE+ECPGL9{rHl9x6I`0MRMs/v+Qw>-LA>N+]"
+ "Bwz*KF*V+9F80H-JunIlNXUj(WLy+fD-C<+Gs8IhAwuUYI0swXDJ35IEOpPRGZSG2IRf4WKF|:7VqTRuNZWOTO*>3XP<+C6Sz*3a"
+ "XJJkgD),e`Pyry@B>.JsX>E}|Iw>NQC:nlED?cC5Zjk3mBN.wOH:V[YI3*)VOH+_NP:Vs5IV,,6O[E)IB9Z>8ETqwhHFRQ1I5cw8"
+ "RzSIkN1-:LGvh.rZ*fgPHtBH8Auj8}EeM7?HCST=IVEkHM:?^TOfI9<S=ccSU?.QEY8Uz9H}nf1AD_2pAOKA+BLGjVB|CzRCvoiI"
+ "Dr.{qDw^e-EaZU2F>[J>FthgfHT>>uHbwcaHi(k|JS^/2Jg/Z]N|LA|P6-24P;RqIQOJKwT:i+1TQ>zcTU(NdU<xv;XOahwJT}|2"
+ "AO^M;B3JP}EWgk(Gnf85JLc[DJyMfVMT9pONmvalQ54ziQi5wXV5S6iZx|0`TkkU*OT_b{EL2{>A.;NjD?3qWE78(LG*?kUKc/F}"
+ "U@`_ERhOQ`Aqf;GQ|=5[RpFm?Ql|aNEXmWTUMtitLNo,kP9GKBTePq*VKenvVR03(Bar_bI9hj{Le-|XVq_gAR-x;YFZW{iA49K1"
+ "EKXheI628bLx>b.O>rjiUTK^=YFodgByM}hEX?9pJ3xfKXU8/FBxQF]EM6ZSF6HIMG7.rAK04JWO4A^-PZNDFQiQ,9R[T(bT6vU@"
+ "UkfD?VE9srVgoF.Vlw8fAQ`p^BiMkZGSl-*JlKyOM/@aNVr7-HBy2ynEQN,-O(WsVP,2<mLT+30Sn@I/A_kzEHoTb-OR7Z{YR+5/"
+ "FhPe/ItGlKKDga9Km2,rP9*}NVLOdGXr4MTBI@;:H{+eaKHtqqPMC]kI0,/hS,oR)BX:]QDhcw8FedayW9yxEAy.AKB^j>wBj.lX"
+ "C@YDVCHGTrDgS{WE(4*{EY)MKEZ8:bFH0`IFQw87G`prFGjaJVG{BTqHlq@.Hx5o@I^R<hJ3RpFK9C.@KOSuGLG3cCMqZd3Nc<Yy"
+ "O)K@rOQr3fP-KIXQCsqDRZ|V]SoEq5TIGfCTO*PZU2,d,Vmm5WWJHh<XJVB6A.{h,A116:B:|8)D:iw0DUr|vF?}F:HO+;TI:-sB"
+ "Lro2:ODT_CTnVzqW@CudD>pubGlYsDJY6}4P[8qHQwbg8Y3Cc(V7TyVAO966A]V84D{5-1EUwT;G?ABkHc*kEIf[[/K7[xnMam7U"
+ "N@B1AO77U9QhKFkRz](7TL=k}V59;lVstF6AAi:ABFS+KDY@@*M_2SQQWT/7V9cKxXap.yT]5`yVfgHgBtNkwC-v+:F={1cJk+1o"
+ "NGEt_Q0O4,VG*/6W>_wxXI43wYh-QAF)uspIB8IiXQ<vmI8bm[REr9wXNHD]KpTaPEWSz6L,O4BHpY+)BKyN;Drxh6FunJxHU{iQ"
+ "Hns_3Ig*oWJSg<kLkXALN9,KaQ=*mHT*L7cTW3qrT[g0,Vkt-6X_cu^O;NR8XMoO[G33:7Haq}XI@>F6OB6kePXqBqU:-)SU[*v0"
+ "NkDYNGjN>nH:{iuTJr53OjjUFXRquHQllL2AE-R?Bi`QsENNM0EZf_+GVEWZHFegdIQiWPK26A`IGJl/LKJT,HewJSOhggTPZ31o"
+ "Q]9vmQqZVfTQmI}U^6I`VLbsqW10*fZ+*`hCQ<@TLHoc4O,oePQc@iSCgX]uEkB6;I0bLGIr3X8Mk]c1Nv32*O6M)@P:Cz2S.UZu"
+ "X@88A[44|vBRaxfBz]]cCU@7pDdr.+EKth{Be[@2G5Yt<G|Z?]H,X@zHi1p-F6waKJ-TzjL[RzWMu;0LOI_i=PM(E:Q>;/,R::mJ"
+ "Ra:+@SzNFuV@/NcWM,]]YT-OJDP:O^QfeC8UCs]oA_+)UBMib3F}RVOI;*V4UV2eoAa6q`U=<g`PGD0;SuJveH-KTXEHPPUH5C7R"
+ "VIjX:D_8LuJqN?6CIiT)Dn*UyG[4x]Qq5>IX@fs^YVJ{8D@h)6Q5W|rF?*bEFu-tUGWpe{K)0F(QIqfyR,3]>U;DzSVDtq^[,nip"
+ "AF3AID`ZWPVkEh,Zjc7bL+vYgCJJ-MG[c19Gin5nK{yktTHTSAKw,E8R6khsSH;f;B{G/PVHyAMDghSIF9e1>V9*HfU-WmWZ;PI`"
+ "TXnq@Bku.0D/axdH)uW{JQQi1KOp/fNV@gMOhKT2Q:HN-SCNPEWF^0QDUDk;HbeY8J;S14Mb<9}AiJ?OD)u}*F|LyzJogK`O<g@U"
+ "Qj;f>VGEZKOkfK?OTTvjRb-zhO7R`CR6XwtNCmv[AGg^_Fn<K3Hq{gzK(=]pSr2gCVd^09YM*cjL+n_]R.5moU:E|_B2DM2CQ|0Z"
+ "F<Fr.FGkN|FZ}92FiV?;GpLDPI3|w5Lh5+GNC8>zQU?A2SUdXqT^V9MU]zD,X+?Z{ZL:anGwurNI33=DM:[beWOS:uK.hBZIj)s+"
+ "V?a@9Msg}zDIeHEH+n|PAPI,VIGz@_RlT<[WEt=dKnHkuDZO*UP;[JoC(vkQZcB5wAQVgsAr*b.U8V(EDCy2EF=1GBFLPX5FX_c>"
+ "Gf[e3H.mvuJlC=*O-l8aPNnePTF?c|UfZ{IVS]L0VsF@@J}w97HL,7JKa621OX6-dWS;@bCA`K3HEN?dV=z0}B7b9aD`l[]FJ3V2"
+ "PbQ]sU;j98X{;VFALD<kKuDMDXT`UZC)U5pDIHa3Ec]x,H`G,>KI`8TRH^`[VB1n[WE4@QN_Qi-FKflNDhm+iAgO_6B=:`EBF7e5"
+ "DI-J0DedouEs^OeG/e{=H8gN=ISFPNIe)(jKAqhLK;ERgLXKRkMsJ|hO^-XhO_*>IPBz5DRVefTS*m2+Tbm}5U`y:YVAYXvXFQ_P"
+ "YWA*bA{KvoC)0s8EYs9FHDl_bNP0^_QMvR|VHpCzEqB5`Bi;_]FiM]ELlBsDO3)fmJ`Y>qTXSVwJ88(>OGekmEaAVcR.X`cVd.S<"
+ "Cl>snG0tprJtMC^VFw=PC0P?QVx|WjVQEc3A62]URxlq6L14]zWDw^(YJ,KNMi+jkIrk|aXR0lmA<qMFFW-AgBbgx1QBR*2FU;[}"
+ "A:7@KDj@uJXoY_NDk4Z9TU0X<O1KY.EUfbbM)B>?FFIXPG{gi[LWu7sA5-GkA5vcKCpi(+Kw=};QNs+[QdY?VT:q{uF8g[hHFJeK"
+ "I=Z8VK1L-)N^qZvP{+GMYI7:]FNo>5H(8K0I<g|9LgT*4QGflrVdQ`eD?F+gIZJ6HLMi2oU;9xcU?])AVB_p.O6{9;RPRdTBPzl8"
+ "Gi6X:J{+xSOf-wJQq?D@V=fL=Ker.0PU1xFYKNQtBEsrONeQ6GQB?QIJFZ};QBm^QMfZ.fW,-CnN.eABYl1bcPzQsmO^ex.ZL`/*"
+ "DI]JEXMx(TBJ*8<BxH>yF:`xsH_f^[Jl0b8Lg/<ZM>)1SPY6XAS+DWyOk9-lLNAlXY5)UQHvkJ-N:(vxRo]]gBf|fJC+sj*FHKu?"
+ "G.`=<G`9MhH_]e_J{>,4N4=/WO5cWoP{=MESwbLKU;a8+X`=.=J/*KRAusXWFhv+{Ja:glN=zjb[7+e5O<ISFMk9f]Fa;scRJVQb"
+ "F[ge>MfndmVFG9pDuR>dP8]YUTg,b{Fa`CvJkF?=MX5YbSpTbNU4ZimH.eBAO5,BzWA9]jR]lmiZ8Yf^FarB;K4^*xU9T_hXwms["
+ "MZ?ODADza2Da(bnERn{JF:DU/Ft(:xH[yfhHwBP.Le6>sQWfwlQ{pV,U8k4tUOJP2XA2UVHF7R`QneZYRskg<EXQWBY-NciRqg,d"
+ "BR*xHFAHR@O-uU,T+QttKDy=WG[G=ZAD(zxZ(+aYC.24-DS9N:G_+7/Dh6^KP3@?rXSQPGQ=s|oAUeU_DFx9-FF@OdIElVtRn|e`"
+ "XCZh`Xq],dDTe6eNk2MkNN](1OdWFuD]I2DOkSX}V8SK,VH6UkB[_0sFUOSyAao]DW:X1UGwcBaM`zA.U|kv3B^|[FG@+jKI(3xw"
+ "OxC?QAi?l9Bc+3qDECzTEMn+oErszPFJ*.1Gy[GAHc}MeJ|:GdLBDh=PVn{1R(]2DRfDOyT,acyU/[96W8*hzZMhAnA6D_aAtZGY"
+ "D,b^wF@TbQFmQuXI(k8qIG/EFB:OEUQF)8(TbHexU</V0X?9KfXv96WA|?RSDR*k@I6M`HNGt5rVtnXbJva`(D@0b+DeI*jQ3C2,"
+ "N6m.3Nr/^z[)H/PDp63tIAC^eC@d3TFC0XOI@m{lIL)L(IV2I8AbNIxGg+3,Jwh_?A[e/g[)m*1GAM30Kg+T[C40d,Yuo_ZOf5rB"
+ "ER9MCKN*[7O</w@Dlia{JgAs=B^E8{LF[G7NTHO:ZYO;FE/@euB<P<+C56FoN9QH[W1pl:DuJ+<K[3PPIbadBPP1B7[)?O_J1H:9"
+ "DjS(lJaUvSN;S.mQ6Cu3B09k;[,ZB[I;DlDY7FpGGXZ{lU:OB`G//PsX,9l=A8+t3D_KOJQ9_W?FY@x]BpZT.P7E?1TKS@WX_Gjr"
+ "R{+aDG7xFQJy;fmT`FOiCH54MB/EQiBx6JHFGF;ZGDq)FI1q<0KQ1oMM*Q/}MaZ6CS|5ITVGs]{VZ2x`SX3MVA<KdRA/L6CV+I(J"
+ "Ax)-VDlLA-FM`T(H3@hWI-,0uJ)Y?8KYVWSM`^YEP}?i^RSxrDT8SY5U`JsbXG<65GDKcQJNRfaK78@VQ3M7(P|hbpT)s]wRCfm2"
+ "XT<<?PA>ltVgY`9Bn}HIJIZZHS(EF/T<V=*C)L<MI9:4DM@bqEMtQ<.S}MRFXR):[Fe6}dOO]|AH)c{]BTn=^KVjm[Meq{0P+7mT"
+ "OQN4WA]`dSHe@J6A<9UOA|manB@_?;H`Y;gK>rx:N(fK[O<yDyQwFVxVM:9AXFHX:BVh1fAj3Q:IA(QaLY?mhQhz5LXK@{VZ|J2;"
+ "DG+mtP;x{wAF<96AX-0bBY.UDFt`=vN{+e4V}6R=XT4`WZ{X.aH}@FkBH_=2L=1rWFOOZQGFEJWLJsVHPPz-5RfVxOWA[c)YzC-r"
+ "L6IVrU]U9pBYI]vFOX]`I3E@7IxCPSKd+s|LzAAVQ3|8SSQ1hZB6TvoO,ff2WB?+OAjEa1TR1LOU<]?WG1z^cZiwVKA>5VgTQPxf"
+ "RsW7*KSXp{QX9cT"
// 989F 〜 EAA4
+ "FV[cGA04TYA33S,A4B@@A4ye^A7A?JA<2`IA<`_@FVejrA>j;XA>|G^A@cS)AACxJACkWWAC+-NADq>|AG8o=AH>UrARoVQARx^*"
+ "ARSDfAUnUqAXQBDAVEtVAU71tAU.+hAY;qxA`q8|A`9joAaZcuAaQ]sAbWD<AhC5aAgbg]AiQxHAL:8/Ai-`iAj<LHAcg1tAf7hh"
+ "Am35*An]DoAm;KlAnfK6ArEnmAu|;>Axi.0Az}W^Ax`(?A|HQ)A}|VGA}jJFB*1zdB+o0*B+.[8B-0yIB-_A[B1,X<B1>eBB1YwJ"
+ "B3]>jB3oK,OTJFVB66{NB8TTyCvS@5B9Q69B:DgEB:j)LB<G.lB<4xmB=(RwB={40B=r..B>7@>B?tKZBB;|2S6p2?BD5=TBE(nk"
+ "BF[t1BHC)DBJEFtBK/r.BL>_UBMMK]BN@|xBO4W6BRWnUBRNhkBSTO-BU|/IBR<[rBUc+DV6Nu_BX_r7BYRLDB]-2sB^sD:B_iH="
+ "B_/PLBaCzgBai<yBcGT1BctaABd0mHBe?YbBgT./BgyF:BiD?UBirM|Bj@vfBAdbWBme7QD^|/iBo96tBrSG[Bt:RqBu...Buw_I"
+ "OsTi}BzB:jL]OkvB{>7PB}7NwC.D9NC,T(*C.;3;C-Ye0C*vy<C7/)+C6{xjC3steC3jo)C4yZxC4K<wC78/=C=,|;C;Nw/C:7.B"
+ "C=6,BC:.(?C9CS4C;t9gC@>1HCDh/KCBnmiCA1beC?xvCCI{WwCK=JMCLzUuCLC2+CI1}>CM-]uCPm-WCQrmRCP>gxCSFl`CUeES"
+ "CQ2BUCQVZXCZJOtCZxnxCZ]]?CYj,hC^RU7C_=){CbE.>CgkctLZrmYCe:}=CeM3yCj3<iCj|nVCmia1Cn7yUCo=`NCq-r)Crt-@"
+ "Ct5vTCt,pZCsyj_CuMivCu|2+Cxr*iCzkB+C{9Z9C{^s?C|6;LC}E(ZCXH6dD(p(4D*i?^D+.QRD-9v:D9>uvD/37cD3J)ID5q`+"
+ "D6?w|D7WkKD9vDsD;88(DA64dD=(IrDBj:eDL>SmDJWI1DL--sDHq=iDM)*-DSpW2DREX?DWl6tDSgQ@DU2JsDVJ>-DW=o6DXUbF"
+ "DXL[HDY[HoDZb/zDZ}B)D[^g<D^2f[I^vwaDa1e4Dai3EDc,6cDeQ]+Ddh2.Demo@DfaIMDgy<[Di;0*Dm6ExA[P_vDoK9TDu7*K"
+ "DkOZBDsc,1D{+wcDzfeWDzSY7E->H=D}IQHE,8bTE26`4E6)8hE6MP^E9znCE:@*XE8XuYE<TT;E>;`UEBIJ6EAUq?ECb>aEDKie"
+ "EEd]0EFa=?EGp*XEI(mnEIV5xH^iXAEJey8ENj_>EQrckERS2(ES=]?EU[6SETh[NEV3TgEWBAuEXvGBEY;YKEZJFjE](L+E_E|R"
+ "E`B]iEadV-Eavc+EI1viEe1BNEe{G|EhBxTEi6IdEk^3HEllvTElu|_Em`PhEpUIOEtGy/Erao]ErE[-Evx_eF(Sa_EwY-eEvoXo"
+ "EwO}lEw=rGE}M{.E|dPEF*{AxF-0fDF,XG^F/N@-F1>QOF.-G+F2iPjF4Xc/F51+7F6-bUF8TAwF;8.`F<c-eF<u:6F?t8aFA6+i"
+ "FBDo5FB|=CFDP<VFAZDLFF[a+[)QIbFK/_GFNf+qFP:+0FPqOJFQZzHFQHnNFR*<ZFRsmgFSgGvFS^AvFTPs2FU``HF`>*KFVS:X"
+ "FWb}|FZ3^LF]?+qF^Mo,FZEjhF_SU?F_ohLFa{5sFc*s7Fd9`>Fe-:OFemeUFg8^uFfW9vFh>E=FjIi{Fq2:sFpm(}Fmw2zFqVS_"
+ "F{uGcFsFexFs4Y(FtUQoFv<^:Fs=`2F{=z/F|{/vF{lB=Fy2U}F|:Z:F|Ca:F}7;lF{4toG*dY_G)^r]G)gx_G+a9mG+;wyG*QMV"
+ "G/@^-G26TrFoyPAG0k[fG2dufG9:9[G5v)-G6{f4G6DA=G:R,]G5Ga>G8Of@G=Z1QG;3Q]G=d7gG;apKG=Q+kG>;VMGCb4fG@P*I"
+ "GBIAvGBnYkGC*fgG@uBFGCO)OGF|E_GICv,GGJ^fGFN((GIV,gGLU+*GQD:VGKkUvGJnurP{NQPGOT)aGQ;52GQ))5GQ{`;GR.f@"
+ "GS4LSGSbk[GTL?rGUQ},GVjpEGWK>OGWgPbGZ]IDG]qsVG]UaaG`T`AGavXJGbs9iGcARXGa?4ZGj<0AGg=1yGnRw_HJW07GjjNA"
+ "Ghq6{GhTzPGhh1oGlcfyGrjinGoOX;GmM<4Gu;I{H6w0[H(]^jG|?.qG{9G_G}s3^H)Y?DGz*YoH,tPBH-0[wH0p/GH/)tdH-Tuv"
+ "H9Po+H5zR*H9d(EH6Hk0H5U:hH?k),H<=dkHCodpHEUp@HBMl6HK8ZIHHz1)HGtJ0HH^uPHLZVUHKp)_Ge`3*HMM/dHN7Y2HMiA4"
+ "HO=@EHQm|}HOk_rHR|jAHTl{]HU27aHU;o1HVxI<HXCB@HX_TTHY6snH],lCH^<v}H`l?.HbRJVHe-1(HdpzzHf)h=Hg]mSHh55a"
+ "Hi{KYHl_3WHk+2eHq;7aHq21EHt(*3HsF[*Hu[/[Hv<SlHvalhHv*GsHyVeVHzfQcHy`khH|CWTI)BUyI)ptqI*QBsI,JZQI-P?k"
+ "I.1fqI/7M1I/wxRI3<3+I4y>DX[6^8I7]*mI7o6qI6iOuI:w;aI:Hs_I;Wa:I<pSgI>2F3I?oQeIB[D?I?/(4IJIRFIJ.@BIIi.D"
+ "II:ffIHP;cIJ@LJIFs67IIV+)IOJp^IPY]cITL5yITU=PIPlj(IVjg)IYienI[Oq6I](9+I]hcnJ@K=dIXYxyI^@,TIj2uAIY``z"
+ "Ibj*xId>*JIlYUWIimd)IcogaIcxn[IjN2gId4y`IlPOoIe1YuIllcMIkAd8Il,77IuMLAIrEG{IsyLfIu{k=In[uSIo+7<Im`>7"
+ "IrWSbIv@}<I{TO]J(fZ6I}2U;I|mC3EUnmKJ*1S?I}DagJ2i;gIy[88IxLKEJ*:YnJ.-3pJ-gz]J-0R=J+7;>I{KJwJ+n`SJ+[SG"
+ "J/j@|J1YP3J50mMJ:)-PJ:`QhJ8AxdJ8g:VJ3nzWJ=:8qJ>wCxJ?3PCJ={asJAm<}JBVgyJ@yb^JEUfXJE_l2JE1MnJH^kTS02W*"
+ "JK/J}Ysdd*JO40oN94rvY4vhcJPBt6JQdmSJR3/YJSArkJU{_FJVf3TJW=Q]JX:2{JY-d3JZaiNJ[K=ZJ]5hdJ]>nkJ^;O-J_oTI"
+ "JazxwJc<l4Jccs6JfDprJg]d0JiCoHJoSx`Joy:yJsFQgJuw7sJv*=qJpY`2Ju-]zJzJ6cJ|(;=J|LSIJ}-x8JxGnrJyDOBK(}9v"
+ "K(NrbSm^gLK/IOlK0kHTK0O6lK,fcwK5GMOK5PRmK7e}+K9zP}KzjjpKEH-iKG8=oK@+T]K>MO-KC}3zK@XsdKA:AFKEQ3-KC3Xi"
+ "KCk(2KJwiKKK*nLKR@_,KLgygKQV3FKRevtKILihKLBb8KI{4)KI:]ZKS}k2KVEDhKY`U;KZ@ysK[+M}K]hYZKUHd:KZoAhKiHAY"
+ "L/s7@KaZ3RKi658Kgb5}Kgk;ZKi-/XKaQ//KoOEOKp9p_Kn@W}K|GuiKpBv[KkoyCKqv|[KmCxwKsp=LKsyCfKwXfyKz<RhK{^Kt"
+ "KyR(}K{pW}L(fPsK}2KjK}rvoK}VdxL*UaAL*qu>L+.+XL.H;zL0JYiL8/c5L:M=UL:2*oL:rTlL?W_`L?ERlLD+]gLF-{@LMr3q"
+ "LQZ]OLMUweLL>.yLRE3ALQ6D{LU(taLZ*:GLWFNGLXU;TLY-YfL]>e5L^;ESL^`^ZL`l,*Lb@+PLd9BgLdTTpLedB/Lf2Z7Lfs/I"
+ "LhlG/Llq,dLm6>lLn|P6Lpc[WLs4;zLt9yBLtC)KLun(nLwA}{Ly{jTAg5]hL{k|5L}-oBM*>ysM)06^M+DaFM-6JcM.(L|M/n_="
+ "M1TjRM1p|ZM:-M6M:drDM99saM>232MQCrdMKt>PM?7q;MF;TKMFisZMIUeVMIqx,MK}E:MKEwGMMQDqMPu[WMUZfVMVaJ,MWy@+"
+ "MXck8MYM?HMY`KIMZR|WM[kopM[tuzM]qV.M^[+;M_WbWMa,a|Mc]GOMd=lQMf-}`Mezx,Mg*_4Mgk3AMi6,WMja+wMhgjhMj|=u"
+ "Ml5+BMm1bVMmi0zMoO<5MobH1Mo}Z3Mo=0=Mqvr[MsSw|Mt,@FMwX]fMwki[Mw+>VMv@jiMy-]+Mz|t[M{/zVM{B0[M};GzM}{sB"
+ "N)FlNN+R9uN,*X.N,k-<N,}9<N-9EGN-pjSN.Q8`N/DioN08D)N0oi:N1G1BN21[aN4tN-N5Km4N6HMPN8SqjN9GL+N:1w8N:`n?"
+ "N<OPpN=hCxNAGgeN@8zZNA,TXNBrg1NDXrdNH09@NFe@-NJVokNIvJuNKoc4NN.6VNOkB)NPgy;NQ-5<NPz/ENRsFhNT>?zNU:w?"
+ "NWtcwNZ<@RN[g?eN`bsBNed8jNfVj0Nh=uINl^lzNk}HENnN(VNox}WNmHAFNns@|Nq{E1NtBubNuH]4NvNCENyD;sN{O`gN}w?}"
+ "O(<QvN}R(>O,81{O/I<a[8iP7O19N(O2H;:O4/FfO7@QEO6`-6O:mo2O<SzNO=GT]O,A9yO@=MAO?o5BOC<KiODB36OE7)IOEv8]"
+ "OGA1yOJ-zJOJ7*LOK}<:OLgg/ON|:RONEWwOO8FZOOokfOPcErOQ1^}OQUw2OR.?<OS=,QOUQV0OVE1/OZf(kOWy6VOZx4}O[+;P"
+ "OcA*HO^QpxO^Hk[ObicOOb`]POb;DVOam,OOg*TUOg<aLOfwNVOe1==OeUTbOf[=/Ojs.XOlG-NOkJLoOo3vqOsfyqOne_gOqZV("
+ "Os]s}Op^v/Or|NzOuD)lOv.SkOwOM.Ox0rUOxh@dOz*3[Oz39uO{g?:Ozj_2O}28XP)Xo5P-05tP,t)pP,jylP.d;2P.Q/,P/D`C"
+ "P0/4RP0A@hP2(K|P3f^_P50PYP5^ocP6?=yP72oAP956BP>?X_P;ny.P=_4BP>H`2P@/jsPC.iSPB`P6PAPdpPEUH^PF6n0PGNaz"
+ "PIQ(vPJ;SKPK/.7PXh2YPIZ/ZPJVe|PId5WPNRE;PN[KSPPgoMPRj74PU{AjPT50iPUV)MPSJ[RPYdk}PXU(@PXBrLPX0f9PXKxr"
+ "P]5K.P]>Q2P[p9NP^VDNP`O[sPa:/(P`Y@cP`ko-PaqU;Pbn6HPbw<MPc<NJPcjm^PtTxDPuvqdPvjKnPw/^tPw]||Pwy94PxljE"
+ "PyiJMP{FOxP|qO1P}-[7P}QtHQ)K5dQ(|sfQ+;G4Q,A.:Q+{rATnM=kQ-b}dQ/@,}Q0WvEQ1KPZQ33QmQ4SU3Q5+tFQ6LmZQ6r/g"
+ "Q83y;Q:6@YQ;E-mQ=>E1Q>(p@Q>{PZQ@+7bQ@OOoQA9z|QAzO4QB-UJQCWTWQFBd8QF;A]QLBD>QKNiwQK3W0QP4syQMZ87QSX4x"
+ "QT9YPXHfBhQUm_hQWo{yQ[==aQY{JLQ[XOyQ^dt>Q]qC.Qa>YbQacrtQYC|tQb;;0QcS.JQco@LQdbqYQd+LZQf-jvQgE^3QeUKz"
+ "Qg},AQhp]dQj|*|Qk]O0Ql+h9QlY0DQm:TSQotA,QqQFCQrDwrQtu^8Qu1j<Qv7PIQv[iUQvwzrQwXIlQxBtzQzWHMQ}iRyR)O_@"
+ "R-TDHR-B85R/VblR082hR14h-R0/*[R1OygR1l5gR6Q@CR37/xR6-(KR6vXdR88KNR5KXrR3I<xRA>MuRAllrR@p4>R?|ZER?WB6"
+ "RD4EXR=BoER?N<bRJro8RIv7?RKoO1RGspjREL:>RLu5nRJ`c0ROk.tRD}x|Ri193RWkHtRRVztRZ<*-RWX>JRWtOxRWF16RPplx"
+ "RY-<5Rbd{_R`tkUR^1yURc*8fRdK22RahEeRc|oTRk}4SRg7{>Rk*SxRkk(hRj[;CRoAF,Rqr,)RoJMxRpP3)Rv2tXRv|NMRw8Zg"
+ "Rt0V5Ry(meRvsHWRu6=)Rwp*8R|B}iR|9wiS)8v<S*v+KS-+O8S/nASS-Xn-S.LH^S0Wm*S4SKmA7(+QS7wcQS9p{:S?7S-S?w}l"
+ "S<fsyS@OFTSBv|WSC<<zS@+.aSEPcSSF{bWSE5PVSK*GOSIza?SILB5SJwAQSJR)=SJ6mvSOoWXSOJ?BSMP}{SSEuLSUvZQSQL^O"
+ "SRI>LSTptTSQz|CSTK^RSZIXzSV|BjS_jPlS^ZdtXPfptS_)|ZS_E8qS^-F8Scx<aSg*AUSe:0-SdO[>S`S|rSgjleSi,_}Sj`eK"
+ "SkS?DSkfKdSlOvySnwVFSot7]Ss8H9Sv@LMSrj0mSqZC.SuUxdSw}X,SveejSvwr9SymjUSz<,mS|,><S|Y]FT)}t6T*C0+T(7bk"
+ "T+6aKT+n/XT1u2GT.d(5T/DLRT2(8fT0S9TT2qiOT4}7OT5^[[T6H0iT6Z<uT7Mn1T8faGT9P5YT:{4vT<kF6T=0XBT=g}ST>vjd"
+ "T?;},TB:{KTCIhnTE9z8THK.dTGEGeTI5Y*TKoE`TOj{@TMUPwTSAA}TQZ6bTT=yETT4skTW<wqTWb:4TVRL|TZ|J{TZj?0T`46s"
+ "T_et`T`k[DT^{IVTaL)jT^M+|Tc35aT_.P6Td/lgTelx=XhO*sTf{eSTf`RSTjR,0Tje8,TkWiFTk}+ZTlTIaTn;TyTofT=TqCYZ"
+ "Tq{(fTrI@pTrnZkU._JmU/Hv+U0*D5U0joNU3;N|U4fN>U6CSPU6LYYU6qreU4xZVGUJL7U9pqTU:dKRU:?3QU=+{wU@*z`U>{=p"
+ "UBHT8UCN;LUD/`TUD^(`UDgf_UE,?yUE5FnUN)<nUO.z(UPl/_UWfcpUVs2yUZ@IJUXlJAUXcDOU]0ZeU[=*zU`8`VU_<)bUbV9t"
+ "Ub`@QUd}pUUdtjoUfw2+UgNP7Ug*8<Uj)6`Uco.(UhK1gUkS64Um1;NUmUSOUn6x[Uo*RkUo3XtUqQ3<Uqd?MUtP1iUs]VuUtc>/"
+ "Uve[ZUz;y>UxKh0U{fxVU|ueoU}C}tU}`:-U}V3oV(ewKV*zJgV,*1zV+?]}V,NJ,V,|iBV.Ph[V/;<eV5B@.V6,kCV7D^YV;wb^"
+ "V<k<kV>67kV>dTBV?;s<VAlXpVCRdxVC7R(VA54|VEh8`VF-I{VHJ{>VH^1BVAPGKVFZj3VIG[UVK.gwVLXyoVL4N>VMC;HVM_MT"
+ "VN[.cVQv?LVRrv[VX0HgGY}]?V[S``V^{@AVaKvqVeP[OVfrTjVgRz(VhOZIVjw:WVmY}DVn{vPVo]DaVp4crVpu8,Vqzu=Vs3bW"
+ "VtBN_Vw8G>VvVybVwSYaV|Bj9VyLrhW*un?W)JoPW)Aj+W(E2-W*5D:W1^?xW25^CW7eC,W54^DW>UqXWD8[mW?[X5W?e_7WC2uj"
+ "WC;|<WG7[,WHbYjWOf>WWOJ,<WPbv5WSt*fWUH)dWQh]FWS3U>WU>zOWZIEyWXY4[WY{.BW]p|]W[k?WW`8V:W`SiFWcRgjWc@Zp"
+ "V{}_>Weh;>WfZl)WfQfLWg*.RX,N@^X-AqsX.Ye-X.uw8X0R|NX1+DiX2UCtX2qV2K|eP=X4N[CX5B6SX5K<]X6Z)qX6d0XX>6,V"
+ "X>vVrXB([FXAuUnXCegfXCnmhXDkN.XEKsOXJ1}.XJ(wBXKf,YXLtodXM0{lXMU=sXOsnEXOEOBT2{BsXV[?9XTOrTXUqkfXW<dy"
+ "XW*WxXWWw1XY,vPXZDilX[fc(X]P77X]uO7X^(URX`O5rXa0Y|B]]vPXb?GBXdJkYXc|RSXdSqjXePQxXfrKGXgx2LXiC+kXk*77"
+ "XkWUAXmcyx[98oLOQj/gXpFf^XrnFHXuH,IXwJIyXy(ODXyUnfX}HG9X}ZS?X}m`xY.9ufY.zJ*Y0EC9Y4J)/Y76qhY8jw,Y9KE?"
+ "Y9ydAY:d8JY;ViaY=F{,Y=uC<Y>:UFY>qzMY?[NOY?wbHYG.KDYIBucYJv{MYN;5kYMuy[YP4M8YPXf@YQ_LPYR?qnYRe3DYTpWL"
+ "YX+c/YY:O5YYCU4Y[<mUY[t;fY]BSuY]yx}Y^H;2Y^QAvYez=vYgaICYiPZXYilmgYj{YvYkIs(Ylbf9YlX`AYltrGYmzXaYq,^<"
+ "Yqm2KYr;JRYr`cYYrro^YsJ7hYsoP+Yu_bGYveHPYw3a_Yzs4hY|P9uZ(RW8Z)O8JZ*KohZ,|U@Z,<+5Z.YZVZ.umlZ0[x}Z/1yl"
+ "Z:(68Z2:(BZ6,W5Z4je(Z5/vtZ4a^|Z4sjpZ8fCUZ7icUZ7DJ^Z;I00Z;@*;Z=KMrZ>mG?Z@]YmZL}l?ZP/puZLtfQZOj_>ZS7w9"
+ "ZRrcPZVI)hZQ,QbZUqb6ZV[6GZY,luZYm@oZWascZ[A@`Z^UkAZZ|.MZ`X2MZb67kZe,0?Zd/O-Zc|I:Zf:sKZg@YgZjZkCZiL(A"
+ "Zk33}ZnD>IZwx_TZxl9eZyz|zZzI?/Z{Ev7Z|9PSZ}QCsZ}ZIiX`XR7[+LyY[+`/a[,wxw[-+(z[-tY4[.z@J[/dkT[0)}[[0E9a"
+ "[1S|wN5;/a[4@o`[7HtE[9TAd[;DS*[;)A)[;`f5[<A4>[=OwQ[=Fqt[AKVODE2J6VIOc@BBF6b";
unicode = "";
var ik = 0;
var i;
for(i = 0; i < 6538; i++) {
var n = 0;
var cnt;
for(cnt = 5; cnt; cnt--) {
var c = unicode_enc.charCodeAt(ik++) - 0x28;
if(c > 52)
c--;
n = n * 85 + c;
}
unicode += String.fromCharCode((n & 0xffff0000) >> 16);
unicode += String.fromCharCode(n & 0xffff);
}
}
// シフト JIS 変換
function shift_jis(c) {
var i_range;
var i_code = unicode.indexOf(c);
var s_code;
if(i_code == -1) { // テーブルにない
var code = c.charCodeAt(0);
for(i_range = 0; i_range < range_linear.length; i_range++) {
if(code >= range_linear[i_range][2]
&& code < range_linear[i_range][2] + range_linear[i_range][1]) {
s_code = range_linear[i_range][0] + (code - range_linear[i_range][2]);
// 第 2 バイト 7F スキップ
if((s_code & 0xff) >= 0x7f) {
if((range_linear[i_range][0] & 0xff) < 0x7f)
s_code++;
}
return s_code;
}
}
// 他のマッピングの対応
switch(code) {
case 0xff3c:
return 0x815f;
case 0xff5e:
return 0x8160;
case 0x2225:
return 0x8161;
case 0xff0d:
return 0x817c;
case 0xffe0:
return 0x8191;
case 0xffe1:
return 0x8192;
case 0xffe2:
return 0x81ca;
}
return 0; // 変換不能
}
for(i_range = 0; i_range < range_table.length; i_range++) {
if(i_code >= range_table[i_range][2]
&& i_code < range_table[i_range][2] + range_table[i_range][1]) {
i_code -= range_table[i_range][2];
var st = range_table[i_range][0];
if((st & 0xff) > 0x7f)
st--;
s_code = st + i_code + Math.floor((i_code + ((st & 0xff) - 0x40)) / 188) * 68;
// 第 2 バイト 7F スキップ
if((s_code & 0xff) >= 0x7f)
s_code++;
return s_code;
}
}
}
//----------------------------------------------------------
// モジュール表示用画像
img_m = new Array();
img_m.length = 16;
for(i = 0; i < 16; i++) {
img_m[i] = new Image(12, 3);
img_m[i].src = "images/qr_m" + i.toString(16) + ".gif";
}
code = new Array(); // コード語作成ワーク
code.length = 3706;
var i_code; // コード語インデックス
var reg;
var reg_bits;
// 誤り訂正コード語数
ec_codewords = [
// 誤り訂正レベル
// L M Q H 型番
[ 7, 10, 13, 17], // 1
[10, 16, 22, 28], // 2
[15, 26, 18, 22], // 3
[20, 18, 26, 16], // 4
[26, 24, 18, 22], // 5
[18, 16, 24, 28], // 6
[20, 18, 18, 26], // 7
[24, 22, 22, 26], // 8
[30, 22, 20, 24], // 9
[18, 26, 24, 28], // 10
[20, 30, 28, 24], // 11
[24, 22, 26, 28], // 12
[26, 22, 24, 22], // 13
[30, 24, 20, 24], // 14
[22, 24, 30, 24], // 15
[24, 28, 24, 30], // 16
[28, 28, 28, 28], // 17
[30, 26, 28, 28], // 18
[28, 26, 26, 26], // 19
[28, 26, 30, 28], // 20
[28, 26, 28, 30], // 21
[28, 28, 30, 24], // 22
[30, 28, 30, 30], // 23
[30, 28, 30, 30], // 24
[26, 28, 30, 30], // 25
[28, 28, 28, 30], // 26
[30, 28, 30, 30], // 27
[30, 28, 30, 30], // 28
[30, 28, 30, 30], // 29
[30, 28, 30, 30], // 30
[30, 28, 30, 30], // 31
[30, 28, 30, 30], // 32
[30, 28, 30, 30], // 33
[30, 28, 30, 30], // 34
[30, 28, 30, 30], // 35
[30, 28, 30, 30], // 36
[30, 28, 30, 30], // 37
[30, 28, 30, 30], // 38
[30, 28, 30, 30], // 39
[30, 28, 30, 30] // 40
];
// RS ブロック数
rs_blocks = [
// 誤り訂正レベル
// L M Q H 型番
[ 1, 1, 1, 1], // 1
[ 1, 1, 1, 1], // 2
[ 1, 1, 2, 2], // 3
[ 1, 2, 2, 4], // 4
[ 1, 2, 4, 4], // 5
[ 2, 4, 4, 4], // 6
[ 2, 4, 6, 5], // 7
[ 2, 4, 6, 6], // 8
[ 2, 5, 8, 8], // 9
[ 4, 5, 8, 8], // 10
[ 4, 5, 8, 11], // 11
[ 4, 8, 10, 11], // 12
[ 4, 9, 12, 16], // 13
[ 4, 9, 16, 16], // 14
[ 6, 10, 12, 18], // 15
[ 6, 10, 17, 16], // 16
[ 6, 11, 16, 19], // 17
[ 6, 13, 18, 21], // 18
[ 7, 14, 21, 25], // 19
[ 8, 16, 20, 25], // 20
[ 8, 17, 23, 25], // 21
[ 9, 17, 23, 34], // 22
[ 9, 18, 25, 30], // 23
[10, 20, 27, 32], // 24
[12, 21, 29, 35], // 25
[12, 23, 34, 37], // 26
[12, 25, 34, 40], // 27
[13, 26, 35, 42], // 28
[14, 28, 38, 45], // 29
[15, 29, 40, 48], // 30
[16, 31, 43, 51], // 31
[17, 33, 45, 54], // 32
[18, 35, 48, 57], // 33
[19, 37, 51, 60], // 34
[19, 38, 53, 63], // 35
[20, 40, 56, 66], // 36
[21, 43, 59, 70], // 37
[22, 45, 62, 74], // 38
[24, 47, 65, 77], // 39
[25, 49, 68, 81] // 40
];
// 誤り訂正コード 生成多項式係数 α指数
g_exp_t = new Array();
g_exp_t.length = 30;
g_exp_t[ 6] = [87, 229, 146, 149, 238, 102, 21];
g_exp_t[ 9] = [251, 67, 46, 61, 118, 70, 64, 94, 32, 45];
g_exp_t[12] = [74, 152, 176, 100, 86, 100, 106, 104, 130, 218, 206, 140, 78];
g_exp_t[14] = [8, 183, 61, 91, 202, 37, 51, 58, 58, 237, 140, 124, 5, 99, 105];
g_exp_t[15] = [120, 104, 107, 109, 102, 161, 76, 3, 91, 191, 147, 169, 182, 194, 225, 120];
g_exp_t[16] = [43, 139, 206, 78, 43, 239, 123, 206, 214, 147, 24, 99, 150, 39, 243, 163, 136];
g_exp_t[17] = [215, 234, 158, 94, 184, 97, 118, 170, 79, 187, 152, 148, 252, 179, 5, 98, 96, 153];
g_exp_t[19] = [17, 60, 79, 50, 61, 163, 26, 187, 202, 180, 221, 225, 83, 239, 156, 164, 212, 212, 188, 190];
g_exp_t[21] = [210, 171, 247, 242, 93, 230, 14, 109, 221, 53, 200, 74, 8, 172, 98, 80, 219, 134, 160, 105, 165, 231];
g_exp_t[23] = [229, 121, 135, 48, 211, 117, 251, 126, 159, 180, 169, 152, 192, 226, 228, 218, 111, 0, 117, 232, 87, 96, 227, 21];
g_exp_t[25] = [173, 125, 158, 2, 103, 182, 118, 17, 145, 201, 111, 28, 165, 53,161, 21, 245, 142, 13, 102, 48, 227, 153, 145, 218, 70];
g_exp_t[27] = [168, 223, 200, 104, 224, 234, 108, 180, 110, 190, 195, 147, 205, 27, 232, 201, 21, 43, 245, 87, 42, 195, 212, 119, 242, 37, 9, 123];
g_exp_t[29] = [41, 173, 145, 152, 216, 31, 179, 182, 50, 48, 110, 86, 239, 96, 222, 125, 42, 173, 226, 193, 224, 130, 156, 37, 251, 216, 238, 40, 192, 180];
// 位置検出パターン & 分離パターン & 形式情報位置予約(一部)& 固定暗モジュール用データ
finder_pat = [
// [0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41],
[0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40],
[0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x40],
[0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x40],
[0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x40],
[0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x40],
[0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x40],
[0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x40],
[0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x40],
[0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40]
];
// 位置合せパターン座標
align_pos = [
// 型番
[], // 1
[ 6, 18], // 2
[ 6, 22], // 3
[ 6, 26], // 4
[ 6, 30], // 5
[ 6, 34], // 6
[ 6, 22, 38], // 7
[ 6, 24, 42], // 8
[ 6, 26, 46], // 9
[ 6, 28, 50], // 10
[ 6, 30, 54], // 11
[ 6, 32, 58], // 12
[ 6, 34, 62], // 13
[ 6, 26, 46, 66], // 14
[ 6, 26, 48, 70], // 15
[ 6, 26, 50, 74], // 16
[ 6, 30, 54, 78], // 17
[ 6, 30, 56, 82], // 18
[ 6, 30, 58, 86], // 19
[ 6, 34, 62, 90], // 20
[ 6, 28, 50, 72, 94], // 21
[ 6, 26, 50, 74, 98], // 22
[ 6, 30, 54, 78, 102], // 23
[ 6, 28, 54, 80, 106], // 24
[ 6, 32, 58, 84, 110], // 25
[ 6, 30, 58, 86, 114], // 26
[ 6, 34, 62, 90, 118], // 27
[ 6, 26, 50, 74, 98, 122], // 28
[ 6, 30, 54, 78, 102, 126], // 29
[ 6, 26, 52, 78, 104, 130], // 30
[ 6, 30, 56, 82, 108, 134], // 31
[ 6, 34, 60, 86, 112, 138], // 32
[ 6, 30, 58, 86, 114, 142], // 33
[ 6, 34, 62, 90, 118, 146], // 34
[ 6, 30, 54, 78, 102, 126, 150], // 35
[ 6, 24, 50, 76, 102, 128, 154], // 36
[ 6, 28, 54, 80, 106, 132, 158], // 37
[ 6, 32, 58, 84, 110, 136, 162], // 38
[ 6, 26, 54, 82, 110, 138, 166], // 39
[ 6, 30, 58, 86, 114, 142, 170] // 40
];
// 形式情報
format_info = [
// Level + Mask BCH 符号(マスク前)
[0x77c4, // L + 000 0x23d6
0x72f3, // L + 001 0x26e1
0x7daa, // L + 010 0x29b8
0x789d, // L + 011 0x2c8f
0x662f, // L + 100 0x323d
0x6318, // L + 101 0x370a
0x6c41, // L + 110 0x3853
0x6976], // L + 111 0x3d64
[0x5412, // M + 000 0x0000
0x5125, // M + 001 0x0537
0x5e7c, // M + 010 0x0a6e
0x5b4b, // M + 011 0x0f59
0x45f9, // M + 100 0x11eb
0x40ce, // M + 101 0x14dc
0x4f97, // M + 110 0x1b85
0x4aa0], // M + 111 0x1eb2
[0x355f, // Q + 000 0x614d
0x3068, // Q + 001 0x647a
0x3f31, // Q + 010 0x6b23
0x3a06, // Q + 011 0x6e14
0x24b4, // Q + 100 0x70a6
0x2183, // Q + 101 0x7591
0x2eda, // Q + 110 0x7ac8
0x2bed], // Q + 111 0x7fff
[0x1689, // H + 000 0x429b
0x13be, // H + 001 0x47ac
0x1ce7, // H + 010 0x48f5
0x19d0, // H + 011 0x4dc2
0x0762, // H + 100 0x5370
0x0255, // H + 101 0x5647
0x0d0c, // H + 110 0x591e
0x083b] // H + 111 0x5c29
];
// 型番情報
// 型番
version_info = [0x07c94, // 7
0x085bc, // 8
0x09a99, // 9
0x0a4d3, // 10
0x0bbf6, // 11
0x0c762, // 12
0x0d847, // 13
0x0e60d, // 14
0x0f928, // 15
0x10b78, // 16
0x1145d, // 17
0x12a17, // 18
0x13532, // 19
0x149a6, // 20
0x15683, // 21
0x168c9, // 22
0x177ec, // 23
0x18ec4, // 24
0x191e1, // 25
0x1afab, // 26
0x1b08e, // 27
0x1cc1a, // 28
0x1d33f, // 29
0x1ed75, // 30
0x1f250, // 31
0x209d5, // 32
0x216f0, // 33
0x228ba, // 34
0x2379f, // 35
0x24b0b, // 36
0x2542e, // 37
0x26a64, // 38
0x27541, // 39
0x28c69]; // 40
exp_n = new Array(); // α指数 → 数値 変換テーブル
exp_n.length = 255;
n_exp = new Array(); // 数値 → α指数 変換テーブル([0] は使用しない)
n_exp.length = 256;
// α指数 ― 数値 変換テーブル作成
n = 0x01;
for(i = 0; i < 255; i++) {
exp_n[i] = n;
n_exp[n] = i;
n <<= 1;
if(n & 0x100)
n = n & 0xff ^ 0x1d;
}
module1 = new Array(); // シンボル領域
module1.length = MAX_MOD;
module2 = new Array(); // マスク後シンボル領域
module2.length = MAX_MOD;
for(i = 0; i < MAX_MOD; i++) {
module1[i] = new Array();
module1[i].length = MAX_MOD;
module2[i] = new Array();
module2[i].length = MAX_MOD;
}
shift_jis_init(); // シフト JIS 変換初期化
//-->
</SCRIPT>
</BODY>
</HTML>
|