qrcode-matrix 0.1.1 → 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -42
- package/dist/qrcodeMatrix.umd.js +2061 -0
- package/dist/qrcodeMatrix.umd.min.js +6 -0
- package/lib/encode/sjis.d.ts +2 -0
- package/lib/encode/sjisData.d.ts +2 -0
- package/lib/encode/utf-8.d.ts +2 -0
- package/lib/index.d.ts +5 -0
- package/lib/lib/BitBuffer.d.ts +9 -0
- package/lib/lib/QRMatrix.d.ts +10 -0
- package/lib/lib/bch-encode.d.ts +31 -0
- package/lib/lib/draw.d.ts +4 -0
- package/lib/modes/Alphanumeric.d.ts +3 -0
- package/lib/modes/Byte.d.ts +3 -0
- package/lib/modes/Kanji.d.ts +3 -0
- package/lib/modes/Numeric.d.ts +3 -0
- package/lib/modes/mode.d.ts +6 -0
- package/lib/qrcode.d.ts +19 -0
- package/lib/qrcodeMatrix.es.js +1356 -0
- package/lib/qrcodeMatrix.js +1363 -0
- package/lib/utils.d.ts +26 -0
- package/package.json +21 -21
- package/LICENSE +0 -21
- package/dist/qrcodeMatrix.js +0 -1890
- package/dist/qrcodeMatrix.min.js +0 -6
- package/dist/qrcodeMatrix.utf8.js +0 -1417
- package/dist/qrcodeMatrix.utf8.min.js +0 -6
- package/index.js +0 -18
- package/onlyUTF8.js +0 -11
- package/src/.DS_Store +0 -0
- package/src/encode/.DS_Store +0 -0
- package/src/encode/sjis.js +0 -125
- package/src/encode/utf-8.js +0 -32
- package/src/index.js +0 -218
- package/src/modes/Alphanumeric.js +0 -55
- package/src/modes/Byte.js +0 -27
- package/src/modes/Kanji.js +0 -51
- package/src/modes/Numeric.js +0 -43
- package/src/qr.js +0 -154
- package/src/utils.js +0 -1113
|
@@ -0,0 +1,1363 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* qrcode-matrix v1.0.0-beta.2
|
|
3
|
+
* Homepage https://github.com/cnwhy/QRCode-matrix
|
|
4
|
+
* License MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
10
|
+
|
|
11
|
+
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|
12
|
+
|
|
13
|
+
var BitMatrix = _interopDefault(require('bitmatrix'));
|
|
14
|
+
|
|
15
|
+
var QR_MODE = 1;
|
|
16
|
+
var qrNumber = (function () {
|
|
17
|
+
var strToNum = function (s) {
|
|
18
|
+
for (var i = 0; i < s.length; i++) {
|
|
19
|
+
var c = s.charAt(i);
|
|
20
|
+
if (c < '0' || c > '9') {
|
|
21
|
+
throw 'illegal char :' + c;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return +s;
|
|
25
|
+
};
|
|
26
|
+
return function (data) {
|
|
27
|
+
var _data = data;
|
|
28
|
+
var _this = {
|
|
29
|
+
getMode: function () {
|
|
30
|
+
return QR_MODE;
|
|
31
|
+
},
|
|
32
|
+
getLength: function () {
|
|
33
|
+
return _data.length;
|
|
34
|
+
},
|
|
35
|
+
write: function (buffer) {
|
|
36
|
+
var data = _data;
|
|
37
|
+
var i = 0;
|
|
38
|
+
while (i + 2 < data.length) {
|
|
39
|
+
buffer.put(strToNum(data.substring(i, i + 3)), 10);
|
|
40
|
+
i += 3;
|
|
41
|
+
}
|
|
42
|
+
if (i < data.length) {
|
|
43
|
+
if (data.length - i == 1) {
|
|
44
|
+
buffer.put(strToNum(data.substring(i, i + 1)), 4);
|
|
45
|
+
}
|
|
46
|
+
else if (data.length - i == 2) {
|
|
47
|
+
buffer.put(strToNum(data.substring(i, i + 2)), 7);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
return _this;
|
|
53
|
+
};
|
|
54
|
+
})();
|
|
55
|
+
|
|
56
|
+
const QR_MODE$1 = 1 << 1;
|
|
57
|
+
const [Code0, Code9, CodeA, CodeZ] = ['0', '9', 'A', 'Z'].map(v => v.charCodeAt(0));
|
|
58
|
+
const qrAlphaNum = (function () {
|
|
59
|
+
var getCode = function (s) {
|
|
60
|
+
var c = s.charCodeAt(0);
|
|
61
|
+
if (Code0 <= c && c <= Code9) {
|
|
62
|
+
return c - Code0;
|
|
63
|
+
}
|
|
64
|
+
else if (CodeA <= c && c <= CodeZ) {
|
|
65
|
+
return c - CodeA + 10;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
var other = [' ', '$', '%', '*', '+', '-', '.', '/', ':'];
|
|
69
|
+
var i = other.indexOf(s);
|
|
70
|
+
if (~i) {
|
|
71
|
+
return i + 36;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
throw 'illegal char :' + s;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
return function (data) {
|
|
79
|
+
var _data = data;
|
|
80
|
+
var _this = {
|
|
81
|
+
getMode: function () {
|
|
82
|
+
return QR_MODE$1;
|
|
83
|
+
},
|
|
84
|
+
getLength: function () {
|
|
85
|
+
return _data.length;
|
|
86
|
+
},
|
|
87
|
+
write: function (buffer) {
|
|
88
|
+
var s = _data;
|
|
89
|
+
var i = 0;
|
|
90
|
+
while (i + 1 < s.length) {
|
|
91
|
+
buffer.put(getCode(s.charAt(i)) * 45 + getCode(s.charAt(i + 1)), 11);
|
|
92
|
+
i += 2;
|
|
93
|
+
}
|
|
94
|
+
if (i < s.length) {
|
|
95
|
+
buffer.put(getCode(s.charAt(i)), 6);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
return _this;
|
|
100
|
+
};
|
|
101
|
+
})();
|
|
102
|
+
|
|
103
|
+
const QR_MODE$2 = 1 << 2;
|
|
104
|
+
const qr8BitByte = function (stringToBytes) {
|
|
105
|
+
return function (data) {
|
|
106
|
+
var _data = data + '';
|
|
107
|
+
var _bytes = _data == data ? stringToBytes(_data) : data;
|
|
108
|
+
_bytes = _bytes instanceof Array ? _bytes : [];
|
|
109
|
+
var _this = {
|
|
110
|
+
getMode: function () {
|
|
111
|
+
return QR_MODE$2;
|
|
112
|
+
},
|
|
113
|
+
getLength: function () {
|
|
114
|
+
return _bytes.length;
|
|
115
|
+
},
|
|
116
|
+
write: function (buffer) {
|
|
117
|
+
for (var i = 0; i < _bytes.length; i++) {
|
|
118
|
+
buffer.put(_bytes[i], 8);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
return _this;
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const SJIS_COUNT = 7070;
|
|
127
|
+
const SJIS_BASE64 = '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MIWC4zCGguQwh4LlMIiC5jCJgucwioLoMIuC6TCMguowjYLrMI6C7DCPgu0wkILuMJGC7zCSgvAwk4LxMJuBSjCcgUswnYFUMJ6BVTChg0AwooNBMKODQjCkg0MwpYNEMKaDRTCng0YwqINHMKmDSDCqg0kwq4NKMKyDSzCtg0wwroNNMK+DTjCwg08wsYNQMLKDUTCzg1IwtINTMLWDVDC2g1Uwt4NWMLiDVzC5g1gwuoNZMLuDWjC8g1swvYNcML6DXTC/g14wwINfMMGDYDDCg2Eww4NiMMSDYzDFg2QwxoNlMMeDZjDIg2cwyYNoMMqDaTDLg2owzINrMM2DbDDOg20wz4NuMNCDbzDRg3Aw0oNxMNODcjDUg3Mw1YN0MNaDdTDXg3Yw2IN3MNmDeDDag3kw24N6MNyDezDdg3ww3oN9MN+DfjDgg4Aw4YOBMOKDgjDjg4Mw5IOEMOWDhTDmg4Yw54OHMOiDiDDpg4kw6oOKMOuDizDsg4ww7YONMO6DjjDvg48w8IOQMPGDkTDyg5Iw84OTMPSDlDD1g5Uw9oOWMPuBRTD8gVsw/YFSMP6BU04AiOpOAZKaTgOOtU4HlpxOCI/kTgmOT04Kj+NOC4m6Tg2Vc04Ol15OEJigThGJTk4Uio5OFZihThaQok4XmcBOGIt1ThmVuE4ej+VOIZe8TiaVwE4qmKJOLZKGTjGYo04yi/hONpikTjiK2045kk9OO47lTjyYpU4/mKZOQpinTkOUVE5Fi3ZOS5RWTk2T4U5OjMFOT5ZSTlXlaE5WmKhOV4/mTliYqU5ZibNOXYvjTl6M7k5fludOYpukTnGXkE5zk/tOfoqjToCLVE6CmKpOhZirToaXuU6Il1xOiZGIToqYrU6LjpZOjJPxTo6YsE6RiV1OkozdTpSM3E6ViOROmJhqTpmYaU6bjbFOnIifTp6YsU6fmLJOoJizTqGWU06imLROpIzwTqWI5U6mlpJOqIucTquLnU6si55OrZLgTq6Xuk6wmLVOs5i2TraYt066kGxOwI9ZTsGQbU7CmLxOxJi6TsaYu07Hi3dOyo2hTsuJ7k7NmLlOzpi4Ts+Vp07UjmVO1Y5kTtaRvE7XmL1O2JV0TtmQ5U7dgVdO3pi+Tt+YwE7jkeNO5JffTuWIyE7tmL9O7om8TvCLwk7ykodO9oyPTveYwU77lENPAYrpTwmYwk8KiMlPDYzeTw6K6k8PlZpPEJSwTxGLeE8aie9PHJjlTx2TYE8vlIxPMJjETzSUuk82l+BPOJBMTzqOZk88jpdPPYm+T0OSz09GkkFPR5jIT02Iyk9OkuFPT49aT1CNsk9Rl0NPU5HMT1WJvU9XmMdPWZddT1qYw09bmMVPXI3sT12Yxk9em0NPaZjOT2+Y0U9wmM9Pc4nAT3WVuU92mMlPe5jNT3yM8U9/jmdPg4qkT4aY0k+ImMpPi5fhT42OmE+PmMtPkZjQT5aY00+YmMxPm4ufT52Iy0+gi6BPoYm/T6ubRE+tlplPrpWOT6+M8k+1kE5Ptpe1T7+V1k/CjFdPw5GjT8SJ4k/Kj3JPzpjXT9CY3E/RmNpP1JjVT9eRrU/YmNhP2pjbT9uY2U/dldtP35jWT+GQTU/jlpNP5JjdT+WY3k/uj0NP75jrT/OUb0/1lVVP9pjmT/iV7k/6ibRP/pjqUAWY5FAGmO1QCZFxUAuMwlANlHtQD+DFUBGY7FASk3xQFJjhUBaM9FAZjPNQGpjfUB+O2FAhmOdQI5XtUCSSbFAlmONQJoyRUCiY4FApmOhQKpjiUCuXz1AsmOlQLZhgUDaL5FA5jJBQQ5juUEeY71BImPNQSYjMUE+VzlBQmPJQVZjxUFaY9VBamPRQXJLiUGWMklBsmPZQco7DUHSRpFB1kuNQdov0UHiY91B9i1VQgJj4UIWY+lCNllRQkYyGUJiOUFCZlPVQmpj5UKyNw1Ctl2JQspj8ULOZQlC0mPtQtY3CULePnVC+jFhQwplDUMWLzVDJmUBQyplBUM2TrVDPkZxQ0YuhUNWWbFDWmURQ2pe7UN6ZRVDjmUhQ5ZlGUOeRbVDtmUdQ7plJUPWZS1D5mUpQ+5XGUQCLVlEBmU1RAplOUQSJrVEJmUxREo7yURSZUVEVmVBRFplPURiY1FEamVJRH4+eUSGZU1Eql0RRMpbXUTeZVVE6mVRRO5lXUTyZVlE/mVhRQJlZUUGI8lFDjLNRRIxaUUWPW1FGkptRR4uiUUiQ5lFJjPVRS42OUUyZW1FNlsZRTpNlUVCOmVFSmVpRVJlcUVqTfVFcipVRYpldUWWT/FFokVNRaZlfUWqZYFFrlKpRbIz2UW2YWlFumWFRcYukUXWVulF2kbRRd4vvUXiTVFF8jJNRgJliUYKZY1GFk+BRhol+UYmZZlGKjftRjJllUY2NxFGPmWdRkOPsUZGZaFGSlmBRk5lpUZWZalGWmWtRl4/nUZmOylGgiqVRopluUaSZbFGllrtRppltUaiVeVGpmW9RqplwUauZcVGsk35RsJl1UbGZc1GymXRRs5lyUbSN4VG1mXZRtpboUbeX4lG9mXdRxJCmUcWZeFHGj3lRyZl5UcuSnFHMl71RzZOAUdaZw1HbmXpR3OqjUd2Lw1HgmXtR4ZZ9UeaPiFHnkfpR6Zl9UeqT4lHtmX5R8JmAUfGKTVH1mYFR9oulUfiTylH5iZpR+o9vUf2Un1H+mYJSAJOBUgOQblIEmYNSBpWqUgeQ2FIIiqBSCoqnUguZhFIOmYZSEYxZUhSZhVIXl/FSHY+JUiSUu1IllcpSJ5mHUimXmFIqmYhSLpmJUjCTnlIzmYpSNpCnUjeN/FI4jJRSOZmLUjqOaFI7jY9SQ5LkUkSZjVJHkaVSSo3tUkuZjlJMmY9STZFPUk+ZjFJUmZFSVpZVUluNhFJemZBSY4yVUmSN3FJllI1SaZmUUmqZklJvlZtScI/oUnGZm1JyioRSc5mVUnSZk1J1kW5SfZmXUn+ZllKDimNSh4yAUoiZnFKJl6tSjZmYUpGZnVKSmZpSlJmZUpuXzVKfjPdSoInBUqOX8lKpj5VSqpN3UquNhVKsmaBSrZmhUrGX41K0mEpStZmjUrmM+FK8maJSvopOUsGZpFLDlnVSxZK6UseXRVLJlddSzZmlUtLo01LVk65S15mmUtiKqFLZlrFS3Y+fUt6Zp1LfleVS4JmrUuKQqFLjmahS5IvOUuaZqVLniqlS8oxNUvOZrFL1ma1S+JmuUvmZr1L6jtlS/oz5Uv+W3FMBluZTApP1UwWV71MGmbBTCJmxUw2Zs1MPmbVTEJm0UxWZtlMWibtTF5ZrUxmN+lMambdTHZF4UyCPoFMhi6dTI5m4UyqU2VMvmblTMZm6UzOZu1M4mbxTOZVDUzqL5lM7iONTP5O9U0CZvVNBj1xTQ5DnU0WZv1NGmb5TR4+hU0iM31NJmcFTSpS8U02ZwlNRlNpTUpGyU1OR7FNUi6ZTV5PsU1iSUFNalI5TXJZtU16ZxFNgkOhTZoxUU2mZxVNumcZTb4lLU3CI81NxiutTc5GmU3SLcFN1l5FTd5nJU3iJtVN7mchTf4uoU4KZylOElu9TlpnLU5iX0FOajPpTn4y0U6CZzFOlmc5TppnNU6iQflOpiVhTrYl9U66Zz1OwmdBTs4y1U7aZ0VO7i45Two5RU8OZ0lPIlpRTyY2zU8qLeVPLl0ZTzJFvU82UvVPOjvtT1I9mU9aO5lPXjvNT2Y+WU9uUvlPfmdVT4YliU+KRcFPjjPtT5IzDU+WL5VPomdlT6ZJAU+qR/FPri6lT7I+iU+2Z2lPumdhT74nCU/CR5FPxjrZT8o5qU/OJRVP2ipBT942GU/iOaVP6mdtUAZncVAOLaFQEimVUCI2HVAmLZ1QKkt1UC4lEVAyTr1QNlrxUDo1AVA+XmVQQk2ZUEYz8VBuMTlQdmeVUH4vhVCCWaVQmlNtUKZnkVCuK3FQsmd9ULZngVC6Z4lQ2meNUOIt6VDmQgVQ7latUPJnhVD2Z3VQ+jOFUQJneVEKYQ1RGlfBUSJLmVEmM4FRKjZBUTpnmVFGT21RfmepUaI78VGqO9FRwme1UcZnrVHOWoVR1mehUdpnxVHeZ7FR7me9UfIzEVH2WvVSAmfBUhJnyVIaZ9FSLje5UjJhhVI6Z6VSPmedUkJnzVJKZ7lSimfZUpJpCVKWZ+FSomfxUq5pAVKyZ+VSvml1Uso3nVLOKUFS4mfdUvJpEVL2I9FS+mkNUwIijVMGVaVTCmkFUxJn6VMeZ9VTImftUyY3GVNiaRVThiPVU4ppOVOWaRlTmmkdU6I+jVOmWiVTtmkxU7ppLVPKTTlT6mk1U/ZpKVQSJU1UGjbRVB5BPVQ+aSFUQk4JVFJpJVRaIoFUumlNVL5dCVTGPpVUzmllVOJpYVTmaT1U+kcFVQJpQVUSR7VVFmlVVRo+kVUyaUlVPluJVU4xbVVaaVlVXmldVXJpUVV2aWlVjmlFVe5pgVXyaZVV+mmFVgJpcVYOaZlWEkVBVh5poVYmNQVWKml5Vi5KdVZiaYlWZmltVmoqrVZyK7FWdioVVnppjVZ+aX1WnjJZVqJppVamaZ1WqkXJVq4tpVayLqlWummRVsIvyVbaJY1XEmm1VxZprVceapVXUmnBV2ppqVdyablXfmmxV445rVeSab1X3mnJV+Zp3Vf2adVX+mnRWBpJRVgmJw1YUmnFWFppzVhePplYYiVJWG5p2VimJ3FYvmoJWMY/6VjKafVY0mntWNpp8VjiaflZCiVxWTJFYVk6aeFZQmnlWW4qaVmSagVZoiu1WapqEVmuagFZsmoNWdJWsVniT01Z6lLZWgJqGVoaahVaHimRWipqHVo+ailaUmolWoJqIVqKUWFalmotWrpqMVrSajla2mo1WvJqQVsCak1bBmpFWwpqPVsOaklbImpRWzpqVVtGallbTmpdW15qYVtiZZFbajvpW245sVt6J8VbgiPZW45JjVu6amVbwjaJW8ojNVvOQfVb5mppW+ozFVv2NkVb/mpxXAJqbVwOV3lcEmp1XCJqfVwmanlcLmqBXDZqhVw+Ml1cSiYBXE5qiVxaapFcYmqNXHJqmVx+TeVcmmqdXJ4izVyiN3VctjFxXMJJuVzeaqFc4mqlXO5qrV0CarFdCjeJXR4vPV0qWVldOmqpXT5qtV1CNv1dRjUJXYZqxV2SNo1dmklJXaZquV2qS2Fd/mrJXgpCCV4iasFeJmrNXi4xeV5OatFegmrVXoo1DV6OKX1ekmrdXqpq4V7CauVezmrZXwJqvV8OaulfGmrtXy5aEV86P6VfSmr1X05q+V9SavFfWmsBX3JRXV9+I5lfglXVX45rBV/SP+1f3jrdX+ZR8V/qK7lf8jelYAJZ4WAKTsFgFjJhYBpHNWAqav1gLmsJYFZHCWBmaw1gdmsRYIZrGWCSS51gqiqxYL+qfWDCJgVgxlfFYNI/qWDWTZ1g6jeRYPZrMWECVu1hBl9tYSonyWEuayFhRkVlYUprLWFSTg1hXk2hYWJOEWFmUt1hakstYXo3HWGKax1hpiZZYa5NVWHCayVhymsVYdZBvWHmazVh+j21Yg4urWIWazliTleZYl5GdWJySxFifmtBYqJZuWKua0ViumtZYs5WtWLia1Vi5ms9YuprSWLua1Fi+jaRYwZXHWMWa11jHkmRYyonzWMyP61jRmtlY05rYWNWNiFjXmtpY2JrcWNma21jcmt5Y3prTWN+a4Fjkmt9Y5ZrdWOuObVjskHBY7pFzWO+a4VjwkLpY8YjrWPKUhFj3ktlY+ZrjWPqa4lj7muRY/JrlWP2a5lkCmudZCZXPWQqa6FkPicRZEJrpWRWXW1kWik9ZGJnHWRmPZ1kakb1ZG5rqWRyW6VkilrJZJZrsWSeR5Vkpk1ZZKpG+WSuVdlksmu1ZLZruWS6Jm1kxjrhZMprvWTeIzlk4mvBZPprxWUSJgllHiu9ZSJPeWUmV8llOmvVZT5F0WVCa9FlRjF9ZVJZ6WVWa81lXk4VZWJr3WVqa9llgmvlZYpr4WWWJnFlnmvpZaI+nWWma/FlqkkRZbJr7WW6VsVlzj5dZdJN6WXibQFl9jURZgZtBWYKUQFmDlNxZhJbPWYqURFmNm0pZk4tXWZaXZFmZlq1Zm5uqWZ2bQlmjm0VZpZHDWaiWV1msk2lZsptGWbmWhVm7jchZvo+oWcabR1nJjm9Zy45uWdCIt1nRjMZZ05CpWdSIz1nZm0tZ2ptMWdybSVnliVdZ5oqtWeibSFnqlsNZ65VQWfaIpln7iPdZ/45wWgGI0FoDiKFaCZtRWhGbT1oYlrpaGptSWhybUFofm05aIJBQWiWbTVopldhaL4ziWjWbVlo2m1daPI+pWkCbU1pBmEtaRpRrWkmbVVpajaVaYptYWmaVd1pqm1labJtUWn+WuVqSlH1amptaWpuVUVq8m1tavZtfWr6bXFrBicVawpteWsmOuVrLm11azIyZWtCba1rWm2Ra15thWuGShFrjm2Ba5ptiWumbY1r6m2Va+5tmWwmK8FsLm2hbDJtnWxabaVsij+xbKptsWyyS2lswiWRbMptqWzabbVs+m25bQJtxW0Obb1tFm3BbUI5xW1GbcltUjUVbVZtzW1eOmltYkbZbWpt0W1ubdVtcjnlbXY1GW1+W0Ftji0dbZIzHW2WbdltmindbaZt3W2uRt1twm3hbcZuhW3ObeVt1m3pbeJt7W3qbfVuAm35bg5uAW4WR7luHiUZbiI7nW4mIwFuLkXZbjIquW42Os1uPjUdblZOGW5ePQFuYiq9bmZKIW5qS6FubiLZbnItYW52V81ufjsBbootxW6OQ6VukjrpbpZdHW6abgVuui3tbsI3JW7OKUVu0iYNbtY+qW7aJxlu4m4JbuZdlW7+PaFvCjuJbw5uDW8SK8VvFk9BbxpanW8ebhFvJm4VbzJV4W9Cbh1vSiqZb04v1W9SbhlvbirBb3ZBRW96bi1vfjkBb4YnHW+Kbilvkm4hb5ZuMW+abiVvnlEpb6J7LW+mQUlvrm41b7pe+W/Cbjlvzm5Bb9ZKeW/abj1v4kKFb+o6bW/6Rzlv/jvVcAZWVXAKQ6lwEjstcBZuRXAaPq1wHm5JcCJuTXAmI0VwKkbhcC5BxXA2blFwOk7FcD4+sXBGPrVwTm5VcFpDrXBqPrlwgm5ZcIpuXXCSW3lwom5hcLYvEXDGPQVw4m5lcOZuaXDqO2lw7kEtcPJPyXD2Qc1w+lPZcP5RBXECLx1xBm5tcRYuPXEabnFxIi/xcSpPNXEuJrlxNjnJcTpudXE+boFxQm59cUYv7XFObnlxVk1dcXpGuXGCTalxhjsZcZJF3XGWXmlxsm6JcbpujXG+T1FxxjlJcdpulXHmbplyMm6dckIryXJGbqFyUm6lcoYmqXKiRWlypiuJcq5urXKyWplyxkdBcs4p4XLabrVy3m69cuIrdXLubrFy8m65cvpuxXMWbsFzHm7Jc2ZuzXOCTu1zhi6xc6InjXOmbtFzqm7lc7Zu3XO+V9VzwlfRc9pOHXPqbtlz7j3Nc/Zu1XQeQkl0Lm7pdDo3oXRGbwF0Um8FdFZu7XRaKUl0Xm7xdGJvFXRmbxF0am8NdG5u/XR+bvl0im8JdKZX2XUubyV1Mm8ZdTpvIXVCXkl1Sm8ddXJu9XWmQk11sm8pdb421XXOby112m8xdgpvPXYSbzl2Hm81di5OIXYybuF2Qm9VdnZvRXaKb0F2sm9JdrpvTXbeb1l26l+RdvJvXXb2b1F3Jm9hdzIreXc2b2V3Sm9td05vaXdab3F3bm91d3ZDsXd6PQl3hj4Rd45GDXeWNSF3mjbZd541JXeiLkF3rm95d7o23XfGMyF3ym99d85akXfSUYl31m+Bd941KXfuKql39kkZd/ovQXgKOc14DlXpeBpS/Xgub4V4MivNeEZvkXhaSn14Zm+NeGpviXhub5V4dkuleJZCDXiuOdF4tkMheL5HRXjCLQV4zkqBeNpvmXjeb5144j+1ePZZYXkCb6l5Dm+leRJvoXkWVnV5Hm/FeTJZ5Xk6b615Um+1eVZaLXleb7F5fm+5eYZSmXmKb715jlbxeZJvwXnKKsV5zlb1edJROXnWb8l52m/NeeI1LXnmKsl56m/Ree4y2XnyXY159l0hefor0Xn+b9l6BkqFeg41MXoSPr16HlN1eio+wXo+PmF6VkupelpX3XpeTWF6ajU1enJV7XqCb916mk3hep43AXquMyV6tkutetYjBXraPjl63jU5euJdmXsGb+F7Cm/lew5RwXsib+l7Jl/VeyphMXs+b/F7Qm/te04pmXtacQF7anENe25xEXt2cQl7flV9e4I+xXuGcRl7inEVe45xBXuicR17pnEhe7JxJXvCcTF7xnEpe85xLXvScTV72iYRe95LsXvicTl76jJpe+4n0XvyUVV7+nE9e/5P5XwGV2V8DnFBfBJhNXwmcUV8Klb5fC5xUXwyYn18NmK9fD46uXxCT818RnFVfE4t8XxSSol8ViPhfFpxWXxeVpF8YjU9fG5JvXx+S7V8llu1fJoy3XyeMyl8pnFdfLZxYXy+cXl8xjuNfNZKjXzeLrV84nFlfPJVKXz6SZV9BnFpfSJxbX0qLrl9MnFxfTpxdX1GcX19Tk5ZfVpxgX1ecYV9ZnGJfXJxTX12cUl9hnGNfYoxgX2aVRl9pjcpfapVWX2uSpF9slWpfbZxkX3CPsl9xiWVfc5xlX3ecZl95lvBffJTeX3+caV+AiZ1fgZCqX4KcaF+DnGdfhIxhX4WR0l+HnG1fiJxrX4qcal+Ll6VfjIzjX5CPmV+RnGxfkpNrX5OPXV+Xk75fmJxwX5mcb1+enG5foJxxX6GM5F+onHJfqZWcX6qPel+tnHNfrpT3X7OTv1+0kqVfuZNPX7ycdF+9i0pfw5BTX8WVS1/MivVfzZRFX9acdV/XjnVf2JZZX9mWWl/ciZ5f3Zx6X+CSiV/knHdf64n1X/Ccq1/xnHlf9ZRPX/iceF/7nHZf/Y2aX/+cfGAOnINgD5yJYBCcgWASk3tgFZyGYBaVfGAZnIBgG5yFYByX5WAdjnZgIJHTYCGcfWAli31gJpyIYCeQq2AoiYVgKZyCYCqJ9mArnIdgL4uvYDGchGA6nIpgQZyMYEKclmBDnJRgRpyRYEqckGBLl/ZgTZySYFCLsGBSjVBgVY+aYFmcmWBanItgX5yPYGCcfmBiifhgY5yTYGSclWBlknBgaI2mYGmJtmBqnI1ga5yYYGycl2Bti7Fgb5GnYHCKhmB1jGJgd5yOYIGcmmCDnJ1ghJyfYImOu2CLnKVgjJLuYI2cm2CSnKNglIn3YJacoWCXnKJgmpyeYJucoGCfjOVgoJdJYKOKs2CmiXhgp5ykYKmUWWCqiKtgspTfYLOce2C0nKpgtZyuYLaW42C4nKdgvJOJYL2crGDFj+5gxpytYMeT1WDRmGZg05ypYNicr2DajZtg3JDJYN+I0mDgnKhg4ZymYOOReWDnnJxg6I5TYPCRxGDxnLtg85F6YPSctmD2nLNg95y0YPmO5GD6nLdg+5y6YQCctWEBj0RhA5y4YQacsmEIlvphCZb5YQ2cvGEOnL1hD4jTYRWcsWEai/BhG4ikYR+KtGEhnLlhJ5zBYSicwGEsnMVhNJzGYTycxGE9nMdhPpy/YT+cw2FCnMhhRJzJYUecvmFIjpxhSpzCYUuR1GFMjVFhTZywYU6QVGFTnNZhVZXnYViczGFZnM1hWpzOYV2c1WFfnNRhYpadYWOKtWFlnNJhZ4xkYWiKU2FrnM9hbpe2YW+c0WFwiNRhcZzTYXOcymF0nNBhdZzXYXaMY2F3nMthfpd8YYKXSmGHnNphipzeYY6RnmGQl/dhkZzfYZSc3GGWnNlhmZzYYZqc3WGkla5hp5OyYamMZWGrnOBhrJzbYa6c4WGyjJthtomvYbqc6WG+irZhw5znYcac6GHHjadhyJzmYcmc5GHKnONhy5zqYcyc4mHNnOxh0In5YeOc7mHmnO1h8pKmYfSc8WH2nO9h95zlYfiMnGH6nPBh/Jz0Yf2c82H+nPVh/5zyYgCc9mIInPdiCZz4YgqV6GIMnPpiDZz5Yg6PXmIQkKxiEYnkYhKJ+mIUnPtiFoi9YhqQymIbnPxiHebBYh6dQGIfjIFiIZ1BYiaQ7WIqnUJiLp1DYi+LWWIwnURiMp1FYjOdRmI0kdViOIzLYjuW32I/lltiQI+KYkGdR2JHkO5iSOe7YkmU4GJLjuhiTY3LYk6dSGJTkcViVZWlYliR72JbnUtiXp1JYmCdTGJjnUpiaJ1NYm6Vr2JxiLVidpV9YnmU4WJ8nU5ifp1RYn+Ps2KAi1pigp1PYoOdVmKEj7RiiZ1QYoqUY2KRl31ikp1SYpOdU2KUnVdilZOKYpadVGKXjVJimJDcYpudZWKclLJinpHwYquU4mKsnatisZX4YrWS72K5lpViu51aYryJn2K9kopiwp1jYsWSU2LGnV1ix51kYsidX2LJnWZiyp1iYsydYWLNlI9iz51bYtCJ+2LRnVli0ouRYtOR8WLUnVVi151YYtiNU2LZkNli24+1YtydYGLdlHFi4IuSYuGKZ2Lsiodi7ZBAYu6daGLvnW1i8Z1pYvOMnWL1nW5i9o5BYveNiWL+j0Vi/51cYwGOnWMCnWtjB453YwidbGMJiMJjDJ1nYxGSp2MZi5NjH4uyYyedamMoiKVjK43BYy+QVWM6kvBjPZTSYz6dcGM/kX1jSZGoY0yOSmNNnXFjT51zY1Cdb2NVld9jV5K7Y1yRe2NnlfljaI7MY2mdgGNrnX5jbpCYY3KMnmN2nXhjd4+3Y3qT5mN7lFBjgJ12Y4ORfGOIjvZjiZ17Y4yPtmOOnXVjj516Y5KUcmOWnXRjmIxAY5uKfGOfnXxjoJepY6GNzGOiklRjo515Y6WQ2mOnjVRjqJCEY6mJhmOqkVtjq513Y6yLZGOyjGZjtJLNY7WdfWO7kX5jvp2BY8Cdg2PDkbVjxJ2JY8adhGPJnYZjz5VgY9CS8WPSnYdj1pdLY9qXZ2Pbirdj4YisY+OdhWPpnYJj7or2Y/SJh2P2nYhj+pdoZAadjGQNkblkD52TZBOdjWQWnYpkF52RZBydcmQmnY5kKJ2SZCyUwGQtk4tkNJ2LZDadj2Q6jGdkPo3vZEKQ22ROnZdkWJNFZGedlGRploBkb52VZHadlmR4lsxkepCgZIOMgmSInZ1kko5UZJOdmmSVnZlkmpRRZJ6Ts2Skk1BkpZ2bZKmdnGSrlY9krZRkZK6OQmSwkO9kspZvZLmKaGS7naNkvJ2eZMGXaWTCnaVkxZ2hZMedomTNkYBk0p2gZNSdXmTYnaRk2p2fZOCdqWThnapk4pNGZOOdrGTmjkNk552nZOyLW2Tvna1k8Z2mZPKdsWT0nbBk9p2vZPqdsmT9nbRk/o/vZQCds2UFnbdlGJ21ZRydtmUdnZBlI525ZSSduGUqnZhlK526ZSydrmUvjnhlNJ27ZTWdvGU2nb5lN529ZTidv2U5ifxlO41VZT6V+mU/kK1lRYzMZUidwWVNncRlT5VxZVGLfmVVncNlVp3CZVeUc2VYncVlWYuzZV2dx2VencZlYoq4ZWOOVWVmk9ZlbIxoZXCQlGVynchldJCuZXWTR2V3lX5leJ3JZYKdymWDnctlh5W2ZYibfGWJkMRljJVrZY6N1mWQlONlkZTBZZeTbGWZl79lm53NZZyOzmWfnc5loYi0ZaSL0mWlkMtlp5WAZaudz2WsjmFlrZJmZa+OemWwkFZlt53QZbmV+2W8iZdlvY57ZcGd02XDndFlxJ3UZcWXt2XGndJly5D5Zcyd1WXPkbBl0p3WZdeK+GXZndhl253XZeCd2WXhndpl4or5ZeWT+mXmklVl54uMZeiOfGXpkYFl7I97Ze2IrmXxndtl+omgZfud32YCjVZmA53eZgaNqWYHj7hmCp3dZgyPuWYOlr5mD42oZhOI1WYUkMxmHJ3kZh+Qr2YgiWZmJY90ZieWhmYojfBmLY+6Zi+QpWY0neNmNZ3hZjad4mY8kotmP55FZkGd6GZCjp5mQ41XZkSd5mZJnedmS5BXZk+d5WZSjk5mXZ3qZl6d6WZfne5mYp3vZmSd62ZmikFmZ53sZmid7WZplNNmbpWBZm+MaWZwnfBmdJCwZnaPu2Z6knFmgYvFZoOd8WaEnfVmh4nJZoid8maJnfRmjp3zZpGPi2aWkmdml4jDZpid9madnfdmopKoZqaX72arjmJmrpXpZrSWXGa4nkFmuZ35Zryd/Ga+nftmwZ34ZsSeQGbHk9xmyZ36ZtaeQmbZj4xm2p5DZtyXambdlJhm4J5EZuaeRmbpnkdm8J5IZvKLyGbziWdm9I1YZvWeSWb3nkpm+I+RZvmRgmb8mdZm/ZFdZv6RXGb/kdZnAI3FZwOY8GcIjI5nCZdMZwuV/GcNlZ5nD55LZxSN8WcVkr1nFp5MZxeYTmcbll1nHZKpZx6eTWcfivpnJp5OZyeeT2colthnKpaiZyuWlmcslntnLY5EZy6eUWcxjulnNJZwZzaeU2c3nlZnOJ5VZzqK92c9i4BnP55SZ0GeVGdGnldnSZCZZ06Xm2dPiMdnUI3eZ1GRumdTjttnVo/xZ1meWmdck21nXp5YZ1+RqWdgnllnYY/wZ2KW22djnltnZJ5cZ2WXiGdqnmFnbY1ZZ2+UdGdwnl5ncZOMZ3Kd3GdzneBndYtuZ3eUZmd8nmBnfo+8Z3+UwmeFnmZnh5T4Z4meXWeLnmNnjJ5iZ5CQzWeVlo1nl5fRZ5qWh2ecicpnnY59Z6CYZ2ehnmVnopCVZ6aeZGepnl9nr4zNZ7Oea2e0nmlntonLZ7eeZ2e4nm1nuZ5zZ8GRxmfElb9nxp51Z8qVQWfOnnRnz5SQZ9CWXmfRirln05D1Z9SPX2fYktFn2pdNZ92ecGfenm9n4p5xZ+SebmfnnnZn6Z5sZ+yeamfunnJn755oZ/GSjGfzlvZn9I7EZ/WN8mf7jbhn/paPZ/+KYGgCksxoA5PIaASJaGgTkPBoFpCyaBeMSWgennhoIY1aaCKKnGgpnnpoKoqUaCuegWgynn1oNJDxaDiKamg5japoPIppaD2NzWhAnntoQYyFaEKMamhDk41oRp55aEiIxGhNnnxoTp5+aFCLy2hRjEtoU4q6aFSLamhZnoJoXI33aF2WkWhfjlZoY56DaGeVT2h0no9odomxaHeehGh+npVof56FaIGXwGiDnoxohZR+aI2elGiPnodok4iyaJSeiWiXjVtom56LaJ2eimifnoZooJ6RaKKPvWimmutop4zmaKiXnGitnohor5LyaLCKQmixjatos56AaLWekGi2ioFouZ6OaLqekmi8k45oxIr8aMaesGjJlsdoyp6XaMuK+2jNnp5o0pZfaNSen2jVnqFo156laNiemWjakklo35OPaOCeqWjhnpxo456maOeeoGjukFho756qaPKQsWj5nqho+oq7aQCYb2kBnpZpBJ6kaQWI1mkInphpC5a4aQyenWkNkEFpDpLFaQ+ek2kSnqNpGZCaaRqerWkbipFpHIyfaSGer2kinpppI56uaSWep2kmnptpKJ6raSqerGkwnr1pNJPMaTaeomk5nrlpPZ67aT+S1mlKl2tpU5WWaVSetmlVkchpWZ68aVqRXmlcnrNpXZ7AaV6ev2lgk+1pYZ6+aWKT6GlqnsJpa561aW2Lxmlunrhpb498aXOUgGl0nrppdYvJaXeesml4nrRpeZ6xaXyYT2l9inlpfp63aYGewWmCilRpio3laY6JfGmRntJplJhQaZWe1WmbkFlpnJ7UaaCe02mnntBprp7EabGe4WmynsNptJ7Wabuezmm+nslpv57GacGex2nDns9px+qgacqezGnLjVxpzJLGac2RhGnOnspp0J7FadOeyGnYl2xp2ZaKad2ezWnentdp557faeie2GnrnuVp7Z7jafKe3mn5nt1p+5LOaf2RhWn/nttqAp7ZagWe4GoKnuZqC5Tzagye7GoSnudqE57qahSe5GoXkpRqGZVXahue2moenuJqH4++aiGWzWoinvZqI57paimMoGoqiaFqK4p+ai6e0Wo1j79qNp7uajie9Wo5jvdqOoqSaj2STWpEnutqR57wakie9GpLi7RqWItralme8mpfi0BqYZPJamKe8WpmnvNqcp7tanie72p/ioBqgJJoaoSe+mqNnvhqjoznapCe92qXn0BqnJ53aqCe+Wqinvtqo578aqqfS2qsn0dqrp6NarOfRmq4n0Vqu59CasGe6GrCn0Rqw59DatGfSWrTmEVq2p9MatuL+Wren0hq359KauiUpWrqn01q+p9RavufTmsEl5NrBZ9Pawqe3GsSn1JrFp9Tax2JVGsfn1VrIIyHayGOn2sji9NrJ4miazKXfms3n1drOJ9WazmfWWs6i1xrPYvUaz6KvGtDn1xrR59ba0mfXWtMicxrTpJWa1CfXmtTir1rVJ9ga1mfX2tbn2FrX59ia2GfY2tijn5rY5Cza2SNn2tmlZBraZXga2qYY2tvjpVrc43Oa3SX8Gt4n2RreZ9la3uOgGt/n2ZrgJ9na4OfaWuEn2hrhpZ3a4mPfWuKjupri45ja42famuVn2xrlpBCa5ifa2uen21rpJ9ua6qfb2urn3Brr59xa7Gfc2uyn3Jrs590a7SJo2u1kmlrt591a7qORWu7imtrvJ92a7+TYWvAmsprxYtCa8afd2vLn3hrzZXqa86WiGvSk8Vr0595a9SU5GvYlPlr25bRa9+femvrn3xr7J97a++ffmvzn31sCJ+BbA+OgWwRlq9sE5+CbBSfg2wXi0NsG5+EbCOfhmwkn4VsNJCFbDeVWGw4iWlsPpTDbECS82xBj2BsQouBbE6UxGxQjqxsVZ+IbFeKvmxaiZhsXZPwbF6fh2xfjV1sYJJybGKfiWxon5Fsap+KbHCRv2xyi4Jsc5+SbHqMiGx9i0Rsfp+QbIGfjmyCn4tsg5eAbIiSvmyMk9dsjZ+MbJCflGySn5Nsk4xCbJaJq2yZjblsmp+NbJufj2yhlnZsopHybKuWl2yun5xssZ+dbLOJzWy4laZsuZb7bLqfn2y7jqFsvI/AbL2fmGy+n55sv4mIbMGLtWzEn5VsxZ+abMmQ8mzKlJFszJTlbNOfl2zVlkBs15+ZbNmfomzbn6Bs3Z+bbOGWQWzilGds44uDbOWTRGzoko1s6p+jbO+foWzwkdds8Z+WbPOJam0Ll21tDJ+ubRKfrW0XkPRtGZ+qbRuXjG0ek7RtH5+kbSWSw20piWttKo1ebSufp20yj0ZtM5+sbTWfq202n6ZtOJ+pbTuKiG09n6htPpRobUGXrG1Ej/JtRZDzbVmftG1an7JtXJVsbWOfr21kn7FtZolZbWmNX21qmFFtbIpcbW6Vgm10l4Ftd4pDbXiQWm15n7NthZ+4bYiPwW2Ml09tjp+1bZOfsG2Vn7ZtmZfcbZuTk22ck8Btr4pVbbKJdG21n7xtuJ+/bbyXwW3Al4RtxZ/GbcafwG3Hn71ty5fS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hWmToIVqlZOFbeVKhXflUIV+5VGFgOVEhYSUloWH5U6FiOVGhYrlSIWQ5VKFkeVHhZTlS4WXiZKFmZPjhZvlTIWc5U+FpOVFhaaRRYWo5UmFqY5GhaqQZIWrjE+FrJbyha6W94Wvj5KFueVWhbrlVIXBmG2FyeVThc2XlYXP5VWF0OVXhdXlWIXc5VuF3eVZheSToYXl5VqF6ZTLherlTYX3j5OF+eVchfrlYYX7kZSF/uVghgLlQYYG5WKGB5FohgrlXYYL5V+GE+VehhafUIYXn0GGGuVkhiLlY4Ytl5aGL+G6hjDlZYY/5WaGTeVnhk6M1YZQi3OGVOVphlWZfIZai5WGXJe4hl6L8YZf5WqGZ+VrhmuSjoZx5WyGeZP4hnuIuIaKieGGi+VxhozlcoaT5W2GlY5chqPlboaklGGGqeVvhqrlcIar5XqGr+V0hrDld4a25XOGxOV1hsbldobHjtaGyeV4hsuSYIbNjHWGzophhtTle4bZil6G2+WBht7lfIbf5YCG5JS4hunlfYbs5X6G7ZVnhu6U2Ibv5YKG+JH7hvnljIb75YiG/onphwDlhocClkmHA+WHhwblhIcI5YWHCeWKhwrljYcN5YuHEeWJhxLlg4cYkneHGuWUhxyWqIcl5ZKHKeWThzTljoc35ZCHO+WRhz/lj4dJkOSHS5hYh0zlmIdO5ZmHU+Wfh1WQSYdX5ZuHWeWeh1/llodg5ZWHY+Wgh2aJ2odo5ZyHauWhh27lnYd05ZqHdpKxh3jll4d/lIiHguWlh42XWoef5aSHouWjh6vlrIev5aaHs+Wuh7qXhoe75bGHveWoh8DlqYfE5a2HxuWwh8flr4fL5aeH0OWqh9Llu4fg5bSH7+Wyh/Lls4f25biH9+W5h/mKSYf7i2GH/uW3iAXloogN5baIDuW6iA/ltYgR5byIFeW+iBblvYgh5cCIIuW/iCPleYgn5cSIMeXBiDblwog55cOIO+XFiECMjIhC5ceIROXGiEaPT4hMjXOITZ+liFLlyIhTj3CIV4pYiFnlyYhbiXGIXY/ViF7lyohhjXSIYuXLiGOI34holVyIa+XMiHCQiohy5dOIdeXQiHeSj4h95dGIfuXOiH+L3IiB5c2IguXUiIiMVYiLkdyIjeXaiJLl1oiWkbOIl+XViJnl2Iie5c+IouXZiKTl24irlO2IruXX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ljKWaJY7kWqWP4iilkCRyZZC6JiWRJWNlkvom5ZM6JmWTY1+lk/ompZQjMCWW5XDllzonZZd6J+WXuiell/ooJZiiUCWY5B3lmSPnJZliteWZuihlmqUhpZs6KOWcIlBlnLoopZzksKWdZfLlnaTqZZ36JyWeJeklnqMr5Z9l3qWhYv3loaXspaIjEeWipHglovkQJaN6KSWjopLlo+Qj5aUinWWleimlpfop5aY6KWWmYyElpuN25acj+GWoIlClqOX15an6KmWqOeslqroqJaw6KyWseiqlrLoq5a06K2WtuiulreX6pa46K+WueiwlruQx5a8lLmWwJCdlsGK5ZbEl1mWxYnrlsaPV5bHjNmWyeizlsvospbMjpOWzei0ls7osZbRjkeW1ei4ltblq5bZmdSW25CXltzotpbil6OW45PvluiJSpbqkOGW6460lvCVtZbyiV+W9pfrlveXi5b56LmW+5NklwCO+ZcE6LqXBui7lweQa5cI6LyXCpfslw3ot5cO6L6XD+jAlxHov5cT6L2XFujBlxnowpcckZqXHonglyTow5cnlraXKujElzDoxZcymEmXOJ5Qlznoxpc96MeXPujIl0LozJdE6MmXRujKl0joy5dJ6M2XUpDCl1aW9ZdZkMOXXOjOl16U8Zdg6M+XYepyl2KWypdk6NCXZujRl2jo0pdpinaXa+jUl22QeJdx6NWXdIxDl3no1pd66NqXfOjYl4Ho2ZeEipOXhejXl4bo25eL6NyXjYjGl4/o3ZeQ6N6XmI/il5zo35egi2aXo+jil6bo4Zeo6OCXq+aRl62V2pez6OOXtOjkl8Po5ZfG6OaXyOjnl8vo6JfTitiX3Ojpl+3o6pfulEKX8ujsl/OJuZf16O+X9ujul/uJQ5f/i7+YAZXFmAKSuJgDjaCYBY2AmAaPh5gIkHuYDOjxmA/o8JgQl2GYEYrmmBKU0JgTk9qYF5CcmBiXzJgajHqYIej0mCTo85gslmqYLZOqmDSJb5g36PWYOOjymDuVcJg8l4qYPej2mEbo95hL6PmYTJHomE2KephOinuYT+j4mFSK55hVjLCYWIromFuTXphel96YZ4zamGvo+phv6PuYcOj8mHHpQJhz6UKYdOlBmKiVl5iq6UOYr+lEmLHpRZi26UaYw+lImMTpR5jG6UmY25TymNzjypjfkEiY4otRmOnpSpjr6UuY7ZmqmO6fWpjvlNGY8oj5mPSIuZj8jpSY/ZZPmP6P/JkD6UyZBZbdmQnpTZkKl3uZDIlhmRCOYJkS6U6ZE4nsmRTpT5kY6VCZHelSmR7pU5kg6VWZIelRmSTpVJkoitmZLOlWmS7pV5k96ViZPulZmULpWplF6VyZSelbmUvpXplM6WGZUOldmVHpX5lS6WCZVelimVeLwJmWjvGZl+ljmZjpZJmZjYGZpellmaiKXZmslG6Zrelmma7pZ5mzknmZtJPpmbzpaJnBlJ2ZxJHKmcWJd5nGi+yZyIvtmdCSk5nR6W2Z0ovumdWJ7ZnY6WyZ2+lqmd3pa5nf6WmZ4ul3me3pbpnu6W+Z8elwmfLpcZn46XOZ++lymf+PeJoB6XSaBel2mg6LUpoP6XWaEpGbmhOMsZoZ6XiaKJHLmivpeZowk6uaN+l6mj7pgJpA6X2aQul8mkPpfppF6XuaTemCmlXpgZpX6YSaWovBmlvpg5pf6YWaYumGmmTpiJpl6YeaaemJmmrpi5pr6YqaqI2cmq3pjJqw6Y2auIpbmrzpjprA6Y+axJCRms/pkJrR6ZGa0+mSmtTpk5rYjYKa3umUmt/plZri6Zaa4+mXmubpmJrqlK+a6+mamu2VRZru6Zua7+mZmvHpnZr06Zya9+memvvpn5sG6aCbGOmhmxrpopsf6aObIumkmyPppZsl6aabJ+mnmyjpqJsp6ambKumqmy7pq5sv6aybMZ9UmzLprZs74vabPItTm0GKQJtCjbCbQ+mvm0TprptFlqObTemxm07psptP6bCbUemzm1SWgptY6bSbWoubm2+YRJt06bWbg+m3m46IvJuR6bibkpWpm5PptpuW6bmbl+m6m5/pu5ug6bybqOm9m6qWjpurjkybrY34m66RTpu06b6buenBm8Dpv5vG6cKbyYzvm8rpwJvP6cOb0enEm9LpxZvU6cmb1o5Jm9uR4pvh6cqb4unHm+Ppxpvk6cib6Ix+m/Dpzpvx6c2b8unMm/WIsZwE6dicBunUnAjp1ZwJ6dGcCunXnAzp05wNioKcEJhrnBLp1pwT6dKcFOnQnBXpz5wb6dqcIendnCTp3Jwl6ducLZVonC7p2ZwviPGcMOnenDLp4Jw5io+cOunLnDuJVpw+6eKcRunhnEfp35xIkkycUpaQnFeX2Jxa6eOcYOnknGfp5Zx26eaceOnnnOWSuZzn6eic6ZS1nOvp7Zzs6emc8OnqnPOWUJz0lsKc9pPOnQPp7p0G6e+dB5O8nQjp7J0J6eudDomonRLp950V6fadG4mVnR/p9J0j6fOdJunxnSiKm50q6fCdK46wnSyJp507jYOdPun6nT/p+Z1B6fidROn1nUbp+51I6fydUOpEnVHqQ51Z6kWdXIlMnV3qQJ1e6kGdYI2UnWGWt51k6kKdbJZRnW/qSp1y6kadeupLnYfqSJ2J6kedj4x7nZrqTJ2k6k2dqepOnavqSZ2v6fKdsupPnbSS35246lOduupUnbvqUp3B6lGdwupXncTqUJ3G6lWdz+pWndPqWZ3Z6lid5upbne3qXJ3v6l2d8phonfjqWp35kemd+o3rnf3qXp4a6l+eG+pgnh7qYZ516mKeeIyynnnqY5596mSef46tnoHqZZ6I6maei+pnnozqaJ6R6muekuppnpOYW56V6mqel5ftnp3qbJ6fl9mepeptnqaUnp6p6m6equpwnq3qcZ646m+euY2NnrqWy567loOevJv1nr6fgJ6/lpuexImpnszqc57Ni2+ezup0ns/qdZ7Q6nae0o2VntTqd57Y4NKe2ZbZntuR4Z7c6nie3ep6nt7qeZ7g6nue5ep8nujqfZ7v6n6e9OqAnvbqgZ736oKe+eqDnvvqhJ786oWe/eqGnwfqh58I6oifDpNDnxOM258V6oqfIJFsnyHqi58s6oyfO5VAnz7qjZ9K6o6fS+JWn07m2J9P6OufUuqPn1TqkJ9f6pKfYOqTn2HqlJ9il+6fY+qRn2bqlZ9n6pafauqYn2zql59y6pqfduqbn3fqmZ+Nl7Sfleqcn5zqnZ+d4nOfoOqe/wGBSf8DgZT/BIGQ/wWBk/8GgZX/CIFp/wmBav8KgZb/C4F7/wyBQ/8OgUT/D4Fe/xCCT/8RglD/EoJR/xOCUv8UglP/FYJU/xaCVf8Xglb/GIJX/xmCWP8agUb/G4FH/xyBg/8dgYH/HoGE/x+BSP8ggZf/IYJg/yKCYf8jgmL/JIJj/yWCZP8mgmX/J4Jm/yiCZ/8pgmj/KoJp/yuCav8sgmv/LYJs/y6Cbf8vgm7/MIJv/zGCcP8ygnH/M4Jy/zSCc/81gnT/NoJ1/zeCdv84gnf/OYJ4/zqCef87gW3/PIFf/z2Bbv8+gU//P4FR/0CBTf9BgoH/QoKC/0OCg/9EgoT/RYKF/0aChv9Hgof/SIKI/0mCif9Kgor/S4KL/0yCjP9Ngo3/ToKO/0+Cj/9QgpD/UYKR/1KCkv9TgpP/VIKU/1WClf9Wgpb/V4KX/1iCmP9Zgpn/WoKa/1uBb/9cgWL/XYFw/2EAof9iAKL/YwCj/2QApP9lAKX/ZgCm/2cAp/9oAKj/aQCp/2oAqv9rAKv/bACs/20Arf9uAK7/bwCv/3AAsP9xALH/cgCy/3MAs/90ALT/dQC1/3YAtv93ALf/eAC4/3kAuf96ALr/ewC7/3wAvP99AL3/fgC+/38Av/+AAMD/gQDB/4IAwv+DAMP/hADE/4UAxf+GAMb/hwDH/4gAyP+JAMn/igDK/4sAy/+MAMz/jQDN/44Azv+PAM//kADQ/5EA0f+SANL/kwDT/5QA1P+VANX/lgDW/5cA1/+YANj/mQDZ/5oA2v+bANv/nADc/50A3f+eAN7/nwDf/+OBUP/lgY8=';
|
|
128
|
+
|
|
129
|
+
var base64DecodeInputStream = function (str) {
|
|
130
|
+
var _str = str;
|
|
131
|
+
var _pos = 0;
|
|
132
|
+
var _buffer = 0;
|
|
133
|
+
var _buflen = 0;
|
|
134
|
+
var _this = {
|
|
135
|
+
read: function () {
|
|
136
|
+
while (_buflen < 8) {
|
|
137
|
+
if (_pos >= _str.length) {
|
|
138
|
+
if (_buflen == 0) {
|
|
139
|
+
return -1;
|
|
140
|
+
}
|
|
141
|
+
throw 'unexpected end of file./' + _buflen;
|
|
142
|
+
}
|
|
143
|
+
var c = _str.charAt(_pos);
|
|
144
|
+
_pos += 1;
|
|
145
|
+
if (c == '=') {
|
|
146
|
+
_buflen = 0;
|
|
147
|
+
return -1;
|
|
148
|
+
}
|
|
149
|
+
else if (c.match(/^\s$/)) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
_buffer = (_buffer << 6) | decode(c.charCodeAt(0));
|
|
153
|
+
_buflen += 6;
|
|
154
|
+
}
|
|
155
|
+
var n = (_buffer >>> (_buflen - 8)) & 0xff;
|
|
156
|
+
_buflen -= 8;
|
|
157
|
+
return n;
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
var decode = function (c) {
|
|
161
|
+
if (0x41 <= c && c <= 0x5a) {
|
|
162
|
+
return c - 0x41;
|
|
163
|
+
}
|
|
164
|
+
else if (0x61 <= c && c <= 0x7a) {
|
|
165
|
+
return c - 0x61 + 26;
|
|
166
|
+
}
|
|
167
|
+
else if (0x30 <= c && c <= 0x39) {
|
|
168
|
+
return c - 0x30 + 52;
|
|
169
|
+
}
|
|
170
|
+
else if (c == 0x2b) {
|
|
171
|
+
return 62;
|
|
172
|
+
}
|
|
173
|
+
else if (c == 0x2f) {
|
|
174
|
+
return 63;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
throw 'c:' + c;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
return _this;
|
|
181
|
+
};
|
|
182
|
+
var createStringToBytes = function (unicodeData, numChars) {
|
|
183
|
+
var unicodeMap = (function () {
|
|
184
|
+
var bin = base64DecodeInputStream(unicodeData);
|
|
185
|
+
var read = function () {
|
|
186
|
+
var b = bin.read();
|
|
187
|
+
if (b == -1)
|
|
188
|
+
throw 'eof';
|
|
189
|
+
return b;
|
|
190
|
+
};
|
|
191
|
+
var count = 0;
|
|
192
|
+
var unicodeMap = {};
|
|
193
|
+
while (true) {
|
|
194
|
+
var b0 = bin.read();
|
|
195
|
+
if (b0 == -1)
|
|
196
|
+
break;
|
|
197
|
+
var b1 = read();
|
|
198
|
+
var b2 = read();
|
|
199
|
+
var b3 = read();
|
|
200
|
+
var k = String.fromCharCode((b0 << 8) | b1);
|
|
201
|
+
var v = (b2 << 8) | b3;
|
|
202
|
+
unicodeMap[k] = v;
|
|
203
|
+
count += 1;
|
|
204
|
+
}
|
|
205
|
+
if (count != numChars) {
|
|
206
|
+
throw count + ' != ' + numChars;
|
|
207
|
+
}
|
|
208
|
+
return unicodeMap;
|
|
209
|
+
})();
|
|
210
|
+
var unknownChar = '?'.charCodeAt(0);
|
|
211
|
+
return function (s) {
|
|
212
|
+
var bytes = [];
|
|
213
|
+
for (var i = 0; i < s.length; i += 1) {
|
|
214
|
+
var c = s.charCodeAt(i);
|
|
215
|
+
if (c < 128) {
|
|
216
|
+
bytes.push(c);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
var b = unicodeMap[s.charAt(i)];
|
|
220
|
+
if (typeof b == 'number') {
|
|
221
|
+
if ((b & 0xff) == b) {
|
|
222
|
+
bytes.push(b);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
bytes.push(b >>> 8);
|
|
226
|
+
bytes.push(b & 0xff);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
bytes.push(unknownChar);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return bytes;
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
var SJIS = createStringToBytes(SJIS_BASE64, SJIS_COUNT);
|
|
238
|
+
|
|
239
|
+
const QR_MODE$3 = 1 << 3;
|
|
240
|
+
const qrKanji = function (stringToBytes) {
|
|
241
|
+
stringToBytes = typeof stringToBytes == 'function' ? stringToBytes : SJIS;
|
|
242
|
+
return function (data) {
|
|
243
|
+
var _bytes = stringToBytes(data);
|
|
244
|
+
var _this = {
|
|
245
|
+
getMode: function () {
|
|
246
|
+
return QR_MODE$3;
|
|
247
|
+
},
|
|
248
|
+
getLength: function () {
|
|
249
|
+
return ~~(_bytes.length / 2);
|
|
250
|
+
},
|
|
251
|
+
write: function (buffer) {
|
|
252
|
+
var data = _bytes;
|
|
253
|
+
var i = 0;
|
|
254
|
+
while (i + 1 < data.length) {
|
|
255
|
+
var c = ((0xff & data[i]) << 8) | (0xff & data[i + 1]);
|
|
256
|
+
if (0x8140 <= c && c <= 0x9FFC) {
|
|
257
|
+
c -= 0x8140;
|
|
258
|
+
}
|
|
259
|
+
else if (0xE040 <= c && c <= 0xEBBF) {
|
|
260
|
+
c -= 0xC140;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
throw 'illegal char at ' + (i + 1) + '/' + c;
|
|
264
|
+
}
|
|
265
|
+
c = ((c >>> 8) & 0xff) * 0xC0 + (c & 0xff);
|
|
266
|
+
buffer.put(c, 13);
|
|
267
|
+
i += 2;
|
|
268
|
+
}
|
|
269
|
+
if (i < data.length) {
|
|
270
|
+
throw 'illegal char at ' + (i + 1);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
return _this;
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
function toUTF8Array(str) {
|
|
279
|
+
var utf8 = [];
|
|
280
|
+
for (var i = 0; i < str.length; i++) {
|
|
281
|
+
var charcode = str.charCodeAt(i);
|
|
282
|
+
if (charcode < 0x80)
|
|
283
|
+
utf8.push(charcode);
|
|
284
|
+
else if (charcode < 0x800) {
|
|
285
|
+
utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));
|
|
286
|
+
}
|
|
287
|
+
else if (charcode < 0xd800 || charcode >= 0xe000) {
|
|
288
|
+
utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
i++;
|
|
292
|
+
charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));
|
|
293
|
+
utf8.push(0xf0 | (charcode >> 18), 0x80 | ((charcode >> 12) & 0x3f), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return utf8;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const BitBuffer = function () {
|
|
300
|
+
var _buffer = [];
|
|
301
|
+
var _length = 0;
|
|
302
|
+
var _this = {};
|
|
303
|
+
_this.getBuffer = function () {
|
|
304
|
+
return _buffer;
|
|
305
|
+
};
|
|
306
|
+
_this.getAt = function (index) {
|
|
307
|
+
var bufIndex = ~~(index / 8);
|
|
308
|
+
var bitIndex = 7 - (index % 8);
|
|
309
|
+
return ((_buffer[bufIndex] >>> bitIndex) & 1) === 1;
|
|
310
|
+
};
|
|
311
|
+
_this.put = function (num, length) {
|
|
312
|
+
length = ~~length;
|
|
313
|
+
if (length < 0)
|
|
314
|
+
throw new Error('length:' + length);
|
|
315
|
+
while (length--) {
|
|
316
|
+
_this.putBit(((num >>> length) & 1) === 1);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
_this.getLengthInBits = function () {
|
|
320
|
+
return _length;
|
|
321
|
+
};
|
|
322
|
+
_this.putBit = function (bit) {
|
|
323
|
+
var bufIndex = ~~(_length / 8);
|
|
324
|
+
if (_buffer.length <= bufIndex) {
|
|
325
|
+
_buffer.push(0);
|
|
326
|
+
}
|
|
327
|
+
if (bit) {
|
|
328
|
+
_buffer[bufIndex] |= 0x80 >>> _length % 8;
|
|
329
|
+
}
|
|
330
|
+
_length += 1;
|
|
331
|
+
};
|
|
332
|
+
return _this;
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
class QRMatrix extends BitMatrix {
|
|
336
|
+
constructor(size) {
|
|
337
|
+
super(size, size, 0);
|
|
338
|
+
this.markMatrix = new BitMatrix(size, size, 0);
|
|
339
|
+
Object.defineProperty(this, 'size', { value: size });
|
|
340
|
+
}
|
|
341
|
+
set(x, y, value) {
|
|
342
|
+
super.set(x, y, value);
|
|
343
|
+
this.markMatrix.set(x, y, 1);
|
|
344
|
+
}
|
|
345
|
+
has(x, y) {
|
|
346
|
+
return !!this.markMatrix.get(x, y);
|
|
347
|
+
}
|
|
348
|
+
clone() {
|
|
349
|
+
return Object.create(this, {
|
|
350
|
+
_data: Object.assign(Object.assign({}, Object.getOwnPropertyDescriptor(this, '_data')), {
|
|
351
|
+
value: new Uint8Array(this._data.buffer.slice(0))
|
|
352
|
+
}),
|
|
353
|
+
markMatrix: Object.assign(Object.assign({}, Object.getOwnPropertyDescriptor(this, 'markMatrix')), {
|
|
354
|
+
value: this.markMatrix.clone()
|
|
355
|
+
})
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
const drawLoop = function (matrix, value, x, y, offsetX, offsetY, length) {
|
|
361
|
+
let { width, height } = matrix;
|
|
362
|
+
let v = value ? 1 : 0;
|
|
363
|
+
let _x = x;
|
|
364
|
+
let _y = y;
|
|
365
|
+
if (length <= 0)
|
|
366
|
+
return;
|
|
367
|
+
while (length--) {
|
|
368
|
+
if (_x >= 0 && _x < width && _y >= 0 && _y < height) {
|
|
369
|
+
matrix.set(_x, _y, v);
|
|
370
|
+
}
|
|
371
|
+
_x += offsetX;
|
|
372
|
+
_y += offsetY;
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
const rectBorder = function (matrix, val, row, col, width, height) {
|
|
376
|
+
if (width < 0 || height < 0)
|
|
377
|
+
return;
|
|
378
|
+
let set = drawLoop.bind(null, matrix, val ? 1 : 0);
|
|
379
|
+
if (width === 1) {
|
|
380
|
+
return set(row, col, 0, 1, height);
|
|
381
|
+
}
|
|
382
|
+
if (height === 1) {
|
|
383
|
+
return set(row, col, 1, 0, width);
|
|
384
|
+
}
|
|
385
|
+
let _w = width - 1;
|
|
386
|
+
let _h = height - 1;
|
|
387
|
+
set(row, col, 1, 0, _w);
|
|
388
|
+
set((row += width - 1), col, 0, 1, _h);
|
|
389
|
+
set(row, (col += height - 1), -1, 0, _w);
|
|
390
|
+
set((row -= width - 1), col, 0, -1, _h);
|
|
391
|
+
};
|
|
392
|
+
const fillRect = function (matrix, val, row, col, width, height) {
|
|
393
|
+
let { width: _width, height: _height } = matrix;
|
|
394
|
+
let v = val ? 1 : 0;
|
|
395
|
+
let _x = row > 0 ? row : 0;
|
|
396
|
+
let _y = col > 0 ? col : 0;
|
|
397
|
+
let maxX = Math.min(row + width, _width);
|
|
398
|
+
let maxY = Math.min(col + height, _height);
|
|
399
|
+
for (let y = _y; y < maxY; y++) {
|
|
400
|
+
for (let x = _x; x < maxX; x++) {
|
|
401
|
+
matrix.set(x, y, v);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
const QRErrorCorrectionLevel = {
|
|
407
|
+
L: 1,
|
|
408
|
+
M: 0,
|
|
409
|
+
Q: 3,
|
|
410
|
+
H: 2
|
|
411
|
+
};
|
|
412
|
+
const QRMode = {
|
|
413
|
+
MODE_NUMBER: 1 << 0,
|
|
414
|
+
MODE_ALPHA_NUM: 1 << 1,
|
|
415
|
+
MODE_8BIT_BYTE: 1 << 2,
|
|
416
|
+
MODE_KANJI: 1 << 3
|
|
417
|
+
};
|
|
418
|
+
const G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
|
|
419
|
+
const G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);
|
|
420
|
+
const G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);
|
|
421
|
+
const G15_BCH_DIGIT = getBCHDigit(G15);
|
|
422
|
+
const G18_BCH_DIGIT = getBCHDigit(G18);
|
|
423
|
+
const RS_BLOCK_TABLE = [
|
|
424
|
+
[1, 26, 19],
|
|
425
|
+
[1, 26, 16],
|
|
426
|
+
[1, 26, 13],
|
|
427
|
+
[1, 26, 9],
|
|
428
|
+
[1, 44, 34],
|
|
429
|
+
[1, 44, 28],
|
|
430
|
+
[1, 44, 22],
|
|
431
|
+
[1, 44, 16],
|
|
432
|
+
[1, 70, 55],
|
|
433
|
+
[1, 70, 44],
|
|
434
|
+
[2, 35, 17],
|
|
435
|
+
[2, 35, 13],
|
|
436
|
+
[1, 100, 80],
|
|
437
|
+
[2, 50, 32],
|
|
438
|
+
[2, 50, 24],
|
|
439
|
+
[4, 25, 9],
|
|
440
|
+
[1, 134, 108],
|
|
441
|
+
[2, 67, 43],
|
|
442
|
+
[2, 33, 15, 2, 34, 16],
|
|
443
|
+
[2, 33, 11, 2, 34, 12],
|
|
444
|
+
[2, 86, 68],
|
|
445
|
+
[4, 43, 27],
|
|
446
|
+
[4, 43, 19],
|
|
447
|
+
[4, 43, 15],
|
|
448
|
+
[2, 98, 78],
|
|
449
|
+
[4, 49, 31],
|
|
450
|
+
[2, 32, 14, 4, 33, 15],
|
|
451
|
+
[4, 39, 13, 1, 40, 14],
|
|
452
|
+
[2, 121, 97],
|
|
453
|
+
[2, 60, 38, 2, 61, 39],
|
|
454
|
+
[4, 40, 18, 2, 41, 19],
|
|
455
|
+
[4, 40, 14, 2, 41, 15],
|
|
456
|
+
[2, 146, 116],
|
|
457
|
+
[3, 58, 36, 2, 59, 37],
|
|
458
|
+
[4, 36, 16, 4, 37, 17],
|
|
459
|
+
[4, 36, 12, 4, 37, 13],
|
|
460
|
+
[2, 86, 68, 2, 87, 69],
|
|
461
|
+
[4, 69, 43, 1, 70, 44],
|
|
462
|
+
[6, 43, 19, 2, 44, 20],
|
|
463
|
+
[6, 43, 15, 2, 44, 16],
|
|
464
|
+
[4, 101, 81],
|
|
465
|
+
[1, 80, 50, 4, 81, 51],
|
|
466
|
+
[4, 50, 22, 4, 51, 23],
|
|
467
|
+
[3, 36, 12, 8, 37, 13],
|
|
468
|
+
[2, 116, 92, 2, 117, 93],
|
|
469
|
+
[6, 58, 36, 2, 59, 37],
|
|
470
|
+
[4, 46, 20, 6, 47, 21],
|
|
471
|
+
[7, 42, 14, 4, 43, 15],
|
|
472
|
+
[4, 133, 107],
|
|
473
|
+
[8, 59, 37, 1, 60, 38],
|
|
474
|
+
[8, 44, 20, 4, 45, 21],
|
|
475
|
+
[12, 33, 11, 4, 34, 12],
|
|
476
|
+
[3, 145, 115, 1, 146, 116],
|
|
477
|
+
[4, 64, 40, 5, 65, 41],
|
|
478
|
+
[11, 36, 16, 5, 37, 17],
|
|
479
|
+
[11, 36, 12, 5, 37, 13],
|
|
480
|
+
[5, 109, 87, 1, 110, 88],
|
|
481
|
+
[5, 65, 41, 5, 66, 42],
|
|
482
|
+
[5, 54, 24, 7, 55, 25],
|
|
483
|
+
[11, 36, 12, 7, 37, 13],
|
|
484
|
+
[5, 122, 98, 1, 123, 99],
|
|
485
|
+
[7, 73, 45, 3, 74, 46],
|
|
486
|
+
[15, 43, 19, 2, 44, 20],
|
|
487
|
+
[3, 45, 15, 13, 46, 16],
|
|
488
|
+
[1, 135, 107, 5, 136, 108],
|
|
489
|
+
[10, 74, 46, 1, 75, 47],
|
|
490
|
+
[1, 50, 22, 15, 51, 23],
|
|
491
|
+
[2, 42, 14, 17, 43, 15],
|
|
492
|
+
[5, 150, 120, 1, 151, 121],
|
|
493
|
+
[9, 69, 43, 4, 70, 44],
|
|
494
|
+
[17, 50, 22, 1, 51, 23],
|
|
495
|
+
[2, 42, 14, 19, 43, 15],
|
|
496
|
+
[3, 141, 113, 4, 142, 114],
|
|
497
|
+
[3, 70, 44, 11, 71, 45],
|
|
498
|
+
[17, 47, 21, 4, 48, 22],
|
|
499
|
+
[9, 39, 13, 16, 40, 14],
|
|
500
|
+
[3, 135, 107, 5, 136, 108],
|
|
501
|
+
[3, 67, 41, 13, 68, 42],
|
|
502
|
+
[15, 54, 24, 5, 55, 25],
|
|
503
|
+
[15, 43, 15, 10, 44, 16],
|
|
504
|
+
[4, 144, 116, 4, 145, 117],
|
|
505
|
+
[17, 68, 42],
|
|
506
|
+
[17, 50, 22, 6, 51, 23],
|
|
507
|
+
[19, 46, 16, 6, 47, 17],
|
|
508
|
+
[2, 139, 111, 7, 140, 112],
|
|
509
|
+
[17, 74, 46],
|
|
510
|
+
[7, 54, 24, 16, 55, 25],
|
|
511
|
+
[34, 37, 13],
|
|
512
|
+
[4, 151, 121, 5, 152, 122],
|
|
513
|
+
[4, 75, 47, 14, 76, 48],
|
|
514
|
+
[11, 54, 24, 14, 55, 25],
|
|
515
|
+
[16, 45, 15, 14, 46, 16],
|
|
516
|
+
[6, 147, 117, 4, 148, 118],
|
|
517
|
+
[6, 73, 45, 14, 74, 46],
|
|
518
|
+
[11, 54, 24, 16, 55, 25],
|
|
519
|
+
[30, 46, 16, 2, 47, 17],
|
|
520
|
+
[8, 132, 106, 4, 133, 107],
|
|
521
|
+
[8, 75, 47, 13, 76, 48],
|
|
522
|
+
[7, 54, 24, 22, 55, 25],
|
|
523
|
+
[22, 45, 15, 13, 46, 16],
|
|
524
|
+
[10, 142, 114, 2, 143, 115],
|
|
525
|
+
[19, 74, 46, 4, 75, 47],
|
|
526
|
+
[28, 50, 22, 6, 51, 23],
|
|
527
|
+
[33, 46, 16, 4, 47, 17],
|
|
528
|
+
[8, 152, 122, 4, 153, 123],
|
|
529
|
+
[22, 73, 45, 3, 74, 46],
|
|
530
|
+
[8, 53, 23, 26, 54, 24],
|
|
531
|
+
[12, 45, 15, 28, 46, 16],
|
|
532
|
+
[3, 147, 117, 10, 148, 118],
|
|
533
|
+
[3, 73, 45, 23, 74, 46],
|
|
534
|
+
[4, 54, 24, 31, 55, 25],
|
|
535
|
+
[11, 45, 15, 31, 46, 16],
|
|
536
|
+
[7, 146, 116, 7, 147, 117],
|
|
537
|
+
[21, 73, 45, 7, 74, 46],
|
|
538
|
+
[1, 53, 23, 37, 54, 24],
|
|
539
|
+
[19, 45, 15, 26, 46, 16],
|
|
540
|
+
[5, 145, 115, 10, 146, 116],
|
|
541
|
+
[19, 75, 47, 10, 76, 48],
|
|
542
|
+
[15, 54, 24, 25, 55, 25],
|
|
543
|
+
[23, 45, 15, 25, 46, 16],
|
|
544
|
+
[13, 145, 115, 3, 146, 116],
|
|
545
|
+
[2, 74, 46, 29, 75, 47],
|
|
546
|
+
[42, 54, 24, 1, 55, 25],
|
|
547
|
+
[23, 45, 15, 28, 46, 16],
|
|
548
|
+
[17, 145, 115],
|
|
549
|
+
[10, 74, 46, 23, 75, 47],
|
|
550
|
+
[10, 54, 24, 35, 55, 25],
|
|
551
|
+
[19, 45, 15, 35, 46, 16],
|
|
552
|
+
[17, 145, 115, 1, 146, 116],
|
|
553
|
+
[14, 74, 46, 21, 75, 47],
|
|
554
|
+
[29, 54, 24, 19, 55, 25],
|
|
555
|
+
[11, 45, 15, 46, 46, 16],
|
|
556
|
+
[13, 145, 115, 6, 146, 116],
|
|
557
|
+
[14, 74, 46, 23, 75, 47],
|
|
558
|
+
[44, 54, 24, 7, 55, 25],
|
|
559
|
+
[59, 46, 16, 1, 47, 17],
|
|
560
|
+
[12, 151, 121, 7, 152, 122],
|
|
561
|
+
[12, 75, 47, 26, 76, 48],
|
|
562
|
+
[39, 54, 24, 14, 55, 25],
|
|
563
|
+
[22, 45, 15, 41, 46, 16],
|
|
564
|
+
[6, 151, 121, 14, 152, 122],
|
|
565
|
+
[6, 75, 47, 34, 76, 48],
|
|
566
|
+
[46, 54, 24, 10, 55, 25],
|
|
567
|
+
[2, 45, 15, 64, 46, 16],
|
|
568
|
+
[17, 152, 122, 4, 153, 123],
|
|
569
|
+
[29, 74, 46, 14, 75, 47],
|
|
570
|
+
[49, 54, 24, 10, 55, 25],
|
|
571
|
+
[24, 45, 15, 46, 46, 16],
|
|
572
|
+
[4, 152, 122, 18, 153, 123],
|
|
573
|
+
[13, 74, 46, 32, 75, 47],
|
|
574
|
+
[48, 54, 24, 14, 55, 25],
|
|
575
|
+
[42, 45, 15, 32, 46, 16],
|
|
576
|
+
[20, 147, 117, 4, 148, 118],
|
|
577
|
+
[40, 75, 47, 7, 76, 48],
|
|
578
|
+
[43, 54, 24, 22, 55, 25],
|
|
579
|
+
[10, 45, 15, 67, 46, 16],
|
|
580
|
+
[19, 148, 118, 6, 149, 119],
|
|
581
|
+
[18, 75, 47, 31, 76, 48],
|
|
582
|
+
[34, 54, 24, 34, 55, 25],
|
|
583
|
+
[20, 45, 15, 61, 46, 16]
|
|
584
|
+
].map(arr => new Uint8Array(arr));
|
|
585
|
+
const getLengthInBits = (function () {
|
|
586
|
+
const BITS_LENGTH_LIST = {
|
|
587
|
+
[QRMode.MODE_NUMBER]: [10, 12, 14],
|
|
588
|
+
[QRMode.MODE_ALPHA_NUM]: [9, 11, 13],
|
|
589
|
+
[QRMode.MODE_8BIT_BYTE]: [8, 16, 16],
|
|
590
|
+
[QRMode.MODE_KANJI]: [8, 10, 12]
|
|
591
|
+
};
|
|
592
|
+
return function (mode, type) {
|
|
593
|
+
if (1 <= type && type <= 40) {
|
|
594
|
+
var lengths = BITS_LENGTH_LIST[mode];
|
|
595
|
+
if (!lengths)
|
|
596
|
+
throw 'mode:' + mode;
|
|
597
|
+
var index = type <= 9 ? 0 : type <= 26 ? 1 : 2;
|
|
598
|
+
return lengths[index];
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
throw new Error('type:' + type);
|
|
602
|
+
}
|
|
603
|
+
};
|
|
604
|
+
})();
|
|
605
|
+
function getBCHDigit(data) {
|
|
606
|
+
let digit = 0;
|
|
607
|
+
while (data != 0) {
|
|
608
|
+
digit++;
|
|
609
|
+
data >>>= 1;
|
|
610
|
+
}
|
|
611
|
+
return digit;
|
|
612
|
+
}
|
|
613
|
+
function getBCHTypeInfo(data) {
|
|
614
|
+
let d = data << 10;
|
|
615
|
+
while (getBCHDigit(d) >= G15_BCH_DIGIT) {
|
|
616
|
+
d ^= G15 << (getBCHDigit(d) - G15_BCH_DIGIT);
|
|
617
|
+
}
|
|
618
|
+
return ((data << 10) | d) ^ G15_MASK;
|
|
619
|
+
}
|
|
620
|
+
function getBCHTypeNumber(data) {
|
|
621
|
+
var d = data << 12;
|
|
622
|
+
while (getBCHDigit(d) - G18_BCH_DIGIT >= 0) {
|
|
623
|
+
d ^= G18 << (getBCHDigit(d) - G18_BCH_DIGIT);
|
|
624
|
+
}
|
|
625
|
+
return (data << 12) | d;
|
|
626
|
+
}
|
|
627
|
+
function getRsBlockTable(typeNumber, errorCorrectionLevel) {
|
|
628
|
+
switch (errorCorrectionLevel) {
|
|
629
|
+
case QRErrorCorrectionLevel.L:
|
|
630
|
+
return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
|
|
631
|
+
case QRErrorCorrectionLevel.M:
|
|
632
|
+
return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
|
|
633
|
+
case QRErrorCorrectionLevel.Q:
|
|
634
|
+
return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
|
|
635
|
+
case QRErrorCorrectionLevel.H:
|
|
636
|
+
return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
|
|
637
|
+
default:
|
|
638
|
+
throw 'bad rs block @ typeNumber:' + typeNumber + '/errorCorrectionLevel:' + errorCorrectionLevel;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
function getRSBlocks(typeNumber, errorCorrectionLevel) {
|
|
642
|
+
let rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);
|
|
643
|
+
let length = rsBlock.length / 3;
|
|
644
|
+
let list = [];
|
|
645
|
+
for (let i = 0; i < length; i += 1) {
|
|
646
|
+
let count = rsBlock[i * 3 + 0];
|
|
647
|
+
let totalCount = rsBlock[i * 3 + 1];
|
|
648
|
+
let dataCount = rsBlock[i * 3 + 2];
|
|
649
|
+
for (let j = 0; j < count; j += 1) {
|
|
650
|
+
list.push({ totalCount, dataCount });
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
return list;
|
|
654
|
+
}
|
|
655
|
+
const QRMath = (function () {
|
|
656
|
+
const EXP_TABLE = new Uint8Array(256);
|
|
657
|
+
const LOG_TABLE = new Uint8Array(256);
|
|
658
|
+
for (let i = 0; i < 8; i += 1) {
|
|
659
|
+
EXP_TABLE[i] = 1 << i;
|
|
660
|
+
}
|
|
661
|
+
for (let i = 8; i < 256; i += 1) {
|
|
662
|
+
EXP_TABLE[i] = EXP_TABLE[i - 4] ^ EXP_TABLE[i - 5] ^ EXP_TABLE[i - 6] ^ EXP_TABLE[i - 8];
|
|
663
|
+
}
|
|
664
|
+
for (let i = 0; i < 255; i += 1) {
|
|
665
|
+
LOG_TABLE[EXP_TABLE[i]] = i;
|
|
666
|
+
}
|
|
667
|
+
let _this = {
|
|
668
|
+
glog: function (n) {
|
|
669
|
+
if (n < 1) {
|
|
670
|
+
throw 'glog(' + n + ')';
|
|
671
|
+
}
|
|
672
|
+
return LOG_TABLE[n];
|
|
673
|
+
},
|
|
674
|
+
gexp: function (n) {
|
|
675
|
+
while (n < 0) {
|
|
676
|
+
n += 255;
|
|
677
|
+
}
|
|
678
|
+
while (n >= 256) {
|
|
679
|
+
n -= 255;
|
|
680
|
+
}
|
|
681
|
+
return EXP_TABLE[n];
|
|
682
|
+
}
|
|
683
|
+
};
|
|
684
|
+
return _this;
|
|
685
|
+
})();
|
|
686
|
+
const qrPolynomial = function (num, shift) {
|
|
687
|
+
if (typeof num.length == 'undefined') {
|
|
688
|
+
throw num.length + '/' + shift;
|
|
689
|
+
}
|
|
690
|
+
let _num = (function () {
|
|
691
|
+
let offset = 0;
|
|
692
|
+
while (offset < num.length && num[offset] == 0) {
|
|
693
|
+
offset += 1;
|
|
694
|
+
}
|
|
695
|
+
let _num = new Array(num.length - offset + shift);
|
|
696
|
+
for (let i = 0; i < num.length - offset; i += 1) {
|
|
697
|
+
_num[i] = num[i + offset];
|
|
698
|
+
}
|
|
699
|
+
return _num;
|
|
700
|
+
})();
|
|
701
|
+
let _this = {
|
|
702
|
+
getAt: function (index) {
|
|
703
|
+
return _num[index];
|
|
704
|
+
},
|
|
705
|
+
getLength: function () {
|
|
706
|
+
return _num.length;
|
|
707
|
+
},
|
|
708
|
+
multiply: function (e) {
|
|
709
|
+
let num = new Array(_this.getLength() + e.getLength() - 1);
|
|
710
|
+
for (let i = 0; i < _this.getLength(); i += 1) {
|
|
711
|
+
for (let j = 0; j < e.getLength(); j += 1) {
|
|
712
|
+
num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i)) + QRMath.glog(e.getAt(j)));
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
return qrPolynomial(num, 0);
|
|
716
|
+
},
|
|
717
|
+
mod: function (e) {
|
|
718
|
+
if (_this.getLength() - e.getLength() < 0) {
|
|
719
|
+
return _this;
|
|
720
|
+
}
|
|
721
|
+
let ratio = QRMath.glog(_this.getAt(0)) - QRMath.glog(e.getAt(0));
|
|
722
|
+
let num = new Array(_this.getLength());
|
|
723
|
+
for (let i = 0; i < _this.getLength(); i += 1) {
|
|
724
|
+
num[i] = _this.getAt(i);
|
|
725
|
+
}
|
|
726
|
+
for (let i = 0; i < e.getLength(); i += 1) {
|
|
727
|
+
num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i)) + ratio);
|
|
728
|
+
}
|
|
729
|
+
return qrPolynomial(num, 0).mod(e);
|
|
730
|
+
}
|
|
731
|
+
};
|
|
732
|
+
return _this;
|
|
733
|
+
};
|
|
734
|
+
const getErrorCorrectPolynomial = function (errorCorrectLength) {
|
|
735
|
+
let a = qrPolynomial([1], 0);
|
|
736
|
+
for (let i = 0; i < errorCorrectLength; i += 1) {
|
|
737
|
+
a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0));
|
|
738
|
+
}
|
|
739
|
+
return a;
|
|
740
|
+
};
|
|
741
|
+
const createBytes = function (buffer, rsBlocks) {
|
|
742
|
+
let offset = 0;
|
|
743
|
+
let maxDcCount = 0;
|
|
744
|
+
let maxEcCount = 0;
|
|
745
|
+
let dcdata = new Array(rsBlocks.length);
|
|
746
|
+
let ecdata = new Array(rsBlocks.length);
|
|
747
|
+
for (let r = 0; r < rsBlocks.length; r += 1) {
|
|
748
|
+
let dcCount = rsBlocks[r].dataCount;
|
|
749
|
+
let ecCount = rsBlocks[r].totalCount - dcCount;
|
|
750
|
+
maxDcCount = Math.max(maxDcCount, dcCount);
|
|
751
|
+
maxEcCount = Math.max(maxEcCount, ecCount);
|
|
752
|
+
dcdata[r] = new Array(dcCount);
|
|
753
|
+
for (let i = 0; i < dcdata[r].length; i += 1) {
|
|
754
|
+
dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];
|
|
755
|
+
}
|
|
756
|
+
offset += dcCount;
|
|
757
|
+
let rsPoly = getErrorCorrectPolynomial(ecCount);
|
|
758
|
+
let rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);
|
|
759
|
+
let modPoly = rawPoly.mod(rsPoly);
|
|
760
|
+
ecdata[r] = new Array(rsPoly.getLength() - 1);
|
|
761
|
+
for (let i = 0; i < ecdata[r].length; i += 1) {
|
|
762
|
+
let modIndex = i + modPoly.getLength() - ecdata[r].length;
|
|
763
|
+
ecdata[r][i] = modIndex >= 0 ? modPoly.getAt(modIndex) : 0;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
let totalCodeCount = 0;
|
|
767
|
+
for (let i = 0; i < rsBlocks.length; i += 1) {
|
|
768
|
+
totalCodeCount += rsBlocks[i].totalCount;
|
|
769
|
+
}
|
|
770
|
+
let data = new Array(totalCodeCount);
|
|
771
|
+
let index = 0;
|
|
772
|
+
for (let i = 0; i < maxDcCount; i += 1) {
|
|
773
|
+
for (let r = 0; r < rsBlocks.length; r += 1) {
|
|
774
|
+
if (i < dcdata[r].length) {
|
|
775
|
+
data[index] = dcdata[r][i];
|
|
776
|
+
index += 1;
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
for (let i = 0; i < maxEcCount; i += 1) {
|
|
781
|
+
for (let r = 0; r < rsBlocks.length; r += 1) {
|
|
782
|
+
if (i < ecdata[r].length) {
|
|
783
|
+
data[index] = ecdata[r][i];
|
|
784
|
+
index += 1;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
return data;
|
|
789
|
+
};
|
|
790
|
+
function getTotal(rsBlocks) {
|
|
791
|
+
let totalDataCount = 0;
|
|
792
|
+
for (var i = 0; i < rsBlocks.length; i += 1) {
|
|
793
|
+
totalDataCount += rsBlocks[i].dataCount;
|
|
794
|
+
}
|
|
795
|
+
return totalDataCount;
|
|
796
|
+
}
|
|
797
|
+
const getMaxDataCount = function (typeNumber, errorCorrectionLevel) {
|
|
798
|
+
let rsBlocks = getRSBlocks(typeNumber, errorCorrectionLevel);
|
|
799
|
+
return getTotal(rsBlocks);
|
|
800
|
+
};
|
|
801
|
+
const paddingBuffer = function (buffer, rsBlocks) {
|
|
802
|
+
const PAD0 = 0xec;
|
|
803
|
+
const PAD1 = 0x11;
|
|
804
|
+
let totalDataCount = getTotal(rsBlocks);
|
|
805
|
+
if (buffer.getLengthInBits() > totalDataCount * 8) {
|
|
806
|
+
throw 'code length overflow. (' + buffer.getLengthInBits() + '>' + totalDataCount * 8 + ')';
|
|
807
|
+
}
|
|
808
|
+
if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
|
|
809
|
+
buffer.put(0, 4);
|
|
810
|
+
}
|
|
811
|
+
while (buffer.getLengthInBits() % 8 != 0) {
|
|
812
|
+
buffer.putBit(false);
|
|
813
|
+
}
|
|
814
|
+
while (true) {
|
|
815
|
+
if (buffer.getLengthInBits() >= totalDataCount * 8) {
|
|
816
|
+
break;
|
|
817
|
+
}
|
|
818
|
+
buffer.put(PAD0, 8);
|
|
819
|
+
if (buffer.getLengthInBits() >= totalDataCount * 8) {
|
|
820
|
+
break;
|
|
821
|
+
}
|
|
822
|
+
buffer.put(PAD1, 8);
|
|
823
|
+
}
|
|
824
|
+
};
|
|
825
|
+
const getBufferForBytes = function (typeNumber, byteArray, mode) {
|
|
826
|
+
let buffer = BitBuffer();
|
|
827
|
+
let data = byteArray;
|
|
828
|
+
buffer.put(mode, 4);
|
|
829
|
+
buffer.put(data.length, getLengthInBits(mode, typeNumber));
|
|
830
|
+
for (let i = 0; i < data.length; i++) {
|
|
831
|
+
buffer.put(data[i], 8);
|
|
832
|
+
}
|
|
833
|
+
return buffer;
|
|
834
|
+
};
|
|
835
|
+
const getBufferForModes = function (typeNumber, dataList) {
|
|
836
|
+
let buffer = BitBuffer();
|
|
837
|
+
for (let i = 0; i < dataList.length; i += 1) {
|
|
838
|
+
let data = dataList[i];
|
|
839
|
+
buffer.put(data.getMode(), 4);
|
|
840
|
+
buffer.put(data.getLength(), getLengthInBits(data.getMode(), typeNumber));
|
|
841
|
+
data.write(buffer);
|
|
842
|
+
}
|
|
843
|
+
return buffer;
|
|
844
|
+
};
|
|
845
|
+
function createData(typeNumber, errorCorrectionLevel, byteArray, mode) {
|
|
846
|
+
let rsBlocks = getRSBlocks(typeNumber, errorCorrectionLevel);
|
|
847
|
+
let buffer;
|
|
848
|
+
if (mode) {
|
|
849
|
+
buffer = getBufferForBytes(typeNumber, byteArray, mode);
|
|
850
|
+
}
|
|
851
|
+
else {
|
|
852
|
+
buffer = getBufferForModes(typeNumber, byteArray);
|
|
853
|
+
}
|
|
854
|
+
paddingBuffer(buffer, rsBlocks);
|
|
855
|
+
return createBytes(buffer, rsBlocks);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
const QRMaskPattern = {
|
|
859
|
+
PATTERN000: 0,
|
|
860
|
+
PATTERN001: 1,
|
|
861
|
+
PATTERN010: 2,
|
|
862
|
+
PATTERN011: 3,
|
|
863
|
+
PATTERN100: 4,
|
|
864
|
+
PATTERN101: 5,
|
|
865
|
+
PATTERN110: 6,
|
|
866
|
+
PATTERN111: 7
|
|
867
|
+
};
|
|
868
|
+
const PATTERN_POSITION_TABLE = [
|
|
869
|
+
[],
|
|
870
|
+
[6, 18],
|
|
871
|
+
[6, 22],
|
|
872
|
+
[6, 26],
|
|
873
|
+
[6, 30],
|
|
874
|
+
[6, 34],
|
|
875
|
+
[6, 22, 38],
|
|
876
|
+
[6, 24, 42],
|
|
877
|
+
[6, 26, 46],
|
|
878
|
+
[6, 28, 50],
|
|
879
|
+
[6, 30, 54],
|
|
880
|
+
[6, 32, 58],
|
|
881
|
+
[6, 34, 62],
|
|
882
|
+
[6, 26, 46, 66],
|
|
883
|
+
[6, 26, 48, 70],
|
|
884
|
+
[6, 26, 50, 74],
|
|
885
|
+
[6, 30, 54, 78],
|
|
886
|
+
[6, 30, 56, 82],
|
|
887
|
+
[6, 30, 58, 86],
|
|
888
|
+
[6, 34, 62, 90],
|
|
889
|
+
[6, 28, 50, 72, 94],
|
|
890
|
+
[6, 26, 50, 74, 98],
|
|
891
|
+
[6, 30, 54, 78, 102],
|
|
892
|
+
[6, 28, 54, 80, 106],
|
|
893
|
+
[6, 32, 58, 84, 110],
|
|
894
|
+
[6, 30, 58, 86, 114],
|
|
895
|
+
[6, 34, 62, 90, 118],
|
|
896
|
+
[6, 26, 50, 74, 98, 122],
|
|
897
|
+
[6, 30, 54, 78, 102, 126],
|
|
898
|
+
[6, 26, 52, 78, 104, 130],
|
|
899
|
+
[6, 30, 56, 82, 108, 134],
|
|
900
|
+
[6, 34, 60, 86, 112, 138],
|
|
901
|
+
[6, 30, 58, 86, 114, 142],
|
|
902
|
+
[6, 34, 62, 90, 118, 146],
|
|
903
|
+
[6, 30, 54, 78, 102, 126, 150],
|
|
904
|
+
[6, 24, 50, 76, 102, 128, 154],
|
|
905
|
+
[6, 28, 54, 80, 106, 132, 158],
|
|
906
|
+
[6, 32, 58, 84, 110, 136, 162],
|
|
907
|
+
[6, 26, 54, 82, 110, 138, 166],
|
|
908
|
+
[6, 30, 58, 86, 114, 142, 170]
|
|
909
|
+
].map(v => new Uint8Array(v));
|
|
910
|
+
const getQRMaskFunction = (function () {
|
|
911
|
+
const QRMaskFunctions = [
|
|
912
|
+
function (i, j) {
|
|
913
|
+
return (i + j) % 2 == 0;
|
|
914
|
+
},
|
|
915
|
+
function (i, j) {
|
|
916
|
+
return i % 2 == 0;
|
|
917
|
+
},
|
|
918
|
+
function (i, j) {
|
|
919
|
+
return j % 3 == 0;
|
|
920
|
+
},
|
|
921
|
+
function (i, j) {
|
|
922
|
+
return (i + j) % 3 == 0;
|
|
923
|
+
},
|
|
924
|
+
function (i, j) {
|
|
925
|
+
return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
|
|
926
|
+
},
|
|
927
|
+
function (i, j) {
|
|
928
|
+
return ((i * j) % 2) + ((i * j) % 3) == 0;
|
|
929
|
+
},
|
|
930
|
+
function (i, j) {
|
|
931
|
+
return (((i * j) % 2) + ((i * j) % 3)) % 2 == 0;
|
|
932
|
+
},
|
|
933
|
+
function (i, j) {
|
|
934
|
+
return (((i * j) % 3) + ((i + j) % 2)) % 2 == 0;
|
|
935
|
+
}
|
|
936
|
+
];
|
|
937
|
+
return function (maskPattern) {
|
|
938
|
+
var fn = QRMaskFunctions[maskPattern];
|
|
939
|
+
if (!fn)
|
|
940
|
+
throw new Error('maskPattern:' + maskPattern);
|
|
941
|
+
return fn;
|
|
942
|
+
};
|
|
943
|
+
})();
|
|
944
|
+
function size2TypeNumber(size) {
|
|
945
|
+
return (size - 17) / 4;
|
|
946
|
+
}
|
|
947
|
+
function typeNumber2Size(typeNumber) {
|
|
948
|
+
return typeNumber * 4 + 17;
|
|
949
|
+
}
|
|
950
|
+
const setupPositionProbePattern = function (matrix, row, col) {
|
|
951
|
+
rectBorder(matrix, 0, row - 1, col - 1, 9, 9);
|
|
952
|
+
rectBorder(matrix, 1, row, col, 7, 7);
|
|
953
|
+
rectBorder(matrix, 0, row + 1, col + 1, 5, 5);
|
|
954
|
+
fillRect(matrix, 1, row + 2, col + 2, 3, 3);
|
|
955
|
+
};
|
|
956
|
+
const setupAllPositionProbePattern = function (matrix) {
|
|
957
|
+
let size = matrix.size;
|
|
958
|
+
setupPositionProbePattern(matrix, 0, 0);
|
|
959
|
+
setupPositionProbePattern(matrix, size - 7, 0);
|
|
960
|
+
setupPositionProbePattern(matrix, 0, size - 7);
|
|
961
|
+
};
|
|
962
|
+
const setupPositionAdjustPattern = function (matrix, typeNumber) {
|
|
963
|
+
let { size } = matrix;
|
|
964
|
+
typeNumber = typeNumber || size2TypeNumber(size);
|
|
965
|
+
let pos = PATTERN_POSITION_TABLE[typeNumber - 1];
|
|
966
|
+
for (let i = 0; i < pos.length; i++) {
|
|
967
|
+
for (let j = 0; j < pos.length; j++) {
|
|
968
|
+
let row = pos[i];
|
|
969
|
+
let col = pos[j];
|
|
970
|
+
if (row < 9 || col < 9) {
|
|
971
|
+
let m = size - 9;
|
|
972
|
+
if ((row < 9 || row > m) && (col < 9 || col > m))
|
|
973
|
+
continue;
|
|
974
|
+
}
|
|
975
|
+
for (let r = -2; r <= 2; r++) {
|
|
976
|
+
for (let c = -2; c <= 2; c++) {
|
|
977
|
+
if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
|
|
978
|
+
matrix.set(col + c, row + r, 1);
|
|
979
|
+
}
|
|
980
|
+
else {
|
|
981
|
+
matrix.set(col + c, row + r, 0);
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
};
|
|
988
|
+
const setupTimingPattern = function (matrix) {
|
|
989
|
+
let mapLength = matrix.width;
|
|
990
|
+
for (let r = 8; r < mapLength - 8; r += 1) {
|
|
991
|
+
matrix.set(r, 6, r % 2 == 0);
|
|
992
|
+
matrix.set(6, r, r % 2 == 0);
|
|
993
|
+
}
|
|
994
|
+
};
|
|
995
|
+
const setupTypeInfo = function (matrix, test, errorCorrectionLevel, maskPattern) {
|
|
996
|
+
let mapLength = matrix.width;
|
|
997
|
+
let data = (errorCorrectionLevel << 3) | maskPattern;
|
|
998
|
+
let bits = getBCHTypeInfo(data);
|
|
999
|
+
for (let i = 0; i < 15; i += 1) {
|
|
1000
|
+
let mod = !test && ((bits >> i) & 1) == 1;
|
|
1001
|
+
if (i < 6) {
|
|
1002
|
+
matrix.set(8, i, mod);
|
|
1003
|
+
}
|
|
1004
|
+
else if (i < 8) {
|
|
1005
|
+
matrix.set(8, i + 1, mod);
|
|
1006
|
+
}
|
|
1007
|
+
else {
|
|
1008
|
+
matrix.set(8, mapLength - 15 + i, mod);
|
|
1009
|
+
}
|
|
1010
|
+
if (i < 8) {
|
|
1011
|
+
matrix.set(mapLength - i - 1, 8, mod);
|
|
1012
|
+
}
|
|
1013
|
+
else if (i < 9) {
|
|
1014
|
+
matrix.set(15 - i, 8, mod);
|
|
1015
|
+
}
|
|
1016
|
+
else {
|
|
1017
|
+
matrix.set(15 - i - 1, 8, mod);
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
matrix.set(8, mapLength - 8, !test);
|
|
1021
|
+
};
|
|
1022
|
+
var setupTypeNumber = function (matrix, test, typeNumber) {
|
|
1023
|
+
let mapLength = matrix.width;
|
|
1024
|
+
typeNumber = typeNumber || size2TypeNumber(mapLength);
|
|
1025
|
+
let bits = getBCHTypeNumber(typeNumber);
|
|
1026
|
+
for (let i = 0; i < 18; i += 1) {
|
|
1027
|
+
let mod = !test && ((bits >> i) & 1) == 1;
|
|
1028
|
+
matrix.set((i % 3) + mapLength - 8 - 3, Math.floor(i / 3), mod);
|
|
1029
|
+
matrix.set(Math.floor(i / 3), (i % 3) + mapLength - 8 - 3, mod);
|
|
1030
|
+
}
|
|
1031
|
+
};
|
|
1032
|
+
function mapInit(size) {
|
|
1033
|
+
return new QRMatrix(size);
|
|
1034
|
+
}
|
|
1035
|
+
const MatrixCache = [];
|
|
1036
|
+
function createQRmatrix(typeNumber) {
|
|
1037
|
+
let size = typeNumber2Size(typeNumber);
|
|
1038
|
+
let matrix = mapInit(size);
|
|
1039
|
+
setupAllPositionProbePattern(matrix);
|
|
1040
|
+
setupPositionAdjustPattern(matrix);
|
|
1041
|
+
setupTimingPattern(matrix);
|
|
1042
|
+
return matrix;
|
|
1043
|
+
}
|
|
1044
|
+
function getBaseQRMatrix(typeNumber) {
|
|
1045
|
+
let matrix = MatrixCache[typeNumber] || (MatrixCache[typeNumber] = createQRmatrix(typeNumber));
|
|
1046
|
+
return matrix.clone();
|
|
1047
|
+
}
|
|
1048
|
+
function copyMap(matrix) {
|
|
1049
|
+
return matrix.clone();
|
|
1050
|
+
}
|
|
1051
|
+
function compareMap(m1, m2, type) {
|
|
1052
|
+
type = type || 'and';
|
|
1053
|
+
if (m1.total !== m2.total)
|
|
1054
|
+
throw 'Different size';
|
|
1055
|
+
let matrix = new QRMatrix(m1.size);
|
|
1056
|
+
let _d1 = m1.getPrototypeData();
|
|
1057
|
+
let _m1 = m1.markMatrix.getPrototypeData();
|
|
1058
|
+
let _d2 = m2.getPrototypeData();
|
|
1059
|
+
let _m2 = m2.markMatrix.getPrototypeData();
|
|
1060
|
+
let md = matrix.getPrototypeData();
|
|
1061
|
+
let _md = matrix.markMatrix.getPrototypeData();
|
|
1062
|
+
for (let i = 0; i < _d1.length; i++) {
|
|
1063
|
+
switch (type) {
|
|
1064
|
+
case 'or':
|
|
1065
|
+
case '|':
|
|
1066
|
+
var mk = (_md[i] = _m1[i] | _m2[i]);
|
|
1067
|
+
_md[i] = (_m1[i] | _m2[i]) & mk;
|
|
1068
|
+
break;
|
|
1069
|
+
case 'xor':
|
|
1070
|
+
case '^':
|
|
1071
|
+
var mk = (_md[i] = _m1[i] ^ _m2[i]);
|
|
1072
|
+
md[i] = (_d1[i] ^ _d2[i]) & mk;
|
|
1073
|
+
break;
|
|
1074
|
+
case 'and':
|
|
1075
|
+
case '&':
|
|
1076
|
+
var mk = (_md[i] = _m1[i] & _m2[i]);
|
|
1077
|
+
md[i] = _d1[i] & _d2[i] & mk;
|
|
1078
|
+
break;
|
|
1079
|
+
default:
|
|
1080
|
+
throw 'type err!';
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
return matrix;
|
|
1084
|
+
}
|
|
1085
|
+
const getLostPoint = function (matrix) {
|
|
1086
|
+
let size = matrix.width;
|
|
1087
|
+
let lostPoint = 0;
|
|
1088
|
+
let isDark = function (row, col) {
|
|
1089
|
+
return matrix.get(col, row);
|
|
1090
|
+
};
|
|
1091
|
+
for (let row = 0; row < size; row += 1) {
|
|
1092
|
+
for (let col = 0; col < size; col += 1) {
|
|
1093
|
+
let sameCount = 0;
|
|
1094
|
+
let dark = isDark(row, col);
|
|
1095
|
+
for (let r = -1; r <= 1; r += 1) {
|
|
1096
|
+
if (row + r < 0 || size <= row + r) {
|
|
1097
|
+
continue;
|
|
1098
|
+
}
|
|
1099
|
+
for (let c = -1; c <= 1; c += 1) {
|
|
1100
|
+
if (col + c < 0 || size <= col + c) {
|
|
1101
|
+
continue;
|
|
1102
|
+
}
|
|
1103
|
+
if (r == 0 && c == 0) {
|
|
1104
|
+
continue;
|
|
1105
|
+
}
|
|
1106
|
+
if (dark == isDark(row + r, col + c)) {
|
|
1107
|
+
sameCount += 1;
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
if (sameCount > 5) {
|
|
1112
|
+
lostPoint += 3 + sameCount - 5;
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
for (var row = 0; row < size - 1; row += 1) {
|
|
1117
|
+
for (var col = 0; col < size - 1; col += 1) {
|
|
1118
|
+
var count = 0;
|
|
1119
|
+
if (isDark(row, col))
|
|
1120
|
+
count += 1;
|
|
1121
|
+
if (isDark(row + 1, col))
|
|
1122
|
+
count += 1;
|
|
1123
|
+
if (isDark(row, col + 1))
|
|
1124
|
+
count += 1;
|
|
1125
|
+
if (isDark(row + 1, col + 1))
|
|
1126
|
+
count += 1;
|
|
1127
|
+
if (count == 0 || count == 4) {
|
|
1128
|
+
lostPoint += 3;
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
for (var row = 0; row < size; row += 1) {
|
|
1133
|
+
for (var col = 0; col < size - 6; col += 1) {
|
|
1134
|
+
if (isDark(row, col) &&
|
|
1135
|
+
!isDark(row, col + 1) &&
|
|
1136
|
+
isDark(row, col + 2) &&
|
|
1137
|
+
isDark(row, col + 3) &&
|
|
1138
|
+
isDark(row, col + 4) &&
|
|
1139
|
+
!isDark(row, col + 5) &&
|
|
1140
|
+
isDark(row, col + 6)) {
|
|
1141
|
+
lostPoint += 40;
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
for (var col = 0; col < size; col += 1) {
|
|
1146
|
+
for (var row = 0; row < size - 6; row += 1) {
|
|
1147
|
+
if (isDark(row, col) &&
|
|
1148
|
+
!isDark(row + 1, col) &&
|
|
1149
|
+
isDark(row + 2, col) &&
|
|
1150
|
+
isDark(row + 3, col) &&
|
|
1151
|
+
isDark(row + 4, col) &&
|
|
1152
|
+
!isDark(row + 5, col) &&
|
|
1153
|
+
isDark(row + 6, col)) {
|
|
1154
|
+
lostPoint += 40;
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
var darkCount = 0;
|
|
1159
|
+
for (var col = 0; col < size; col += 1) {
|
|
1160
|
+
for (var row = 0; row < size; row += 1) {
|
|
1161
|
+
if (isDark(row, col)) {
|
|
1162
|
+
darkCount += 1;
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
var ratio = Math.abs((100 * darkCount) / size / size - 50) / 5;
|
|
1167
|
+
lostPoint += ratio * 10;
|
|
1168
|
+
return lostPoint;
|
|
1169
|
+
};
|
|
1170
|
+
const setupData = function (matrix, data, maskPattern) {
|
|
1171
|
+
let _moduleCount = matrix.width;
|
|
1172
|
+
let inc = -1;
|
|
1173
|
+
let row = _moduleCount - 1;
|
|
1174
|
+
let bitIndex = 7;
|
|
1175
|
+
let byteIndex = 0;
|
|
1176
|
+
let maskFunc = getQRMaskFunction(maskPattern);
|
|
1177
|
+
for (var col = _moduleCount - 1; col > 0; col -= 2) {
|
|
1178
|
+
if (col == 6)
|
|
1179
|
+
col -= 1;
|
|
1180
|
+
while (true) {
|
|
1181
|
+
for (var c = 0; c < 2; c += 1) {
|
|
1182
|
+
if (!matrix.has(col - c, row)) {
|
|
1183
|
+
var dark = false;
|
|
1184
|
+
if (byteIndex < data.length) {
|
|
1185
|
+
dark = ((data[byteIndex] >>> bitIndex) & 1) == 1;
|
|
1186
|
+
}
|
|
1187
|
+
var mask = maskFunc(row, col - c);
|
|
1188
|
+
if (mask) {
|
|
1189
|
+
dark = !dark;
|
|
1190
|
+
}
|
|
1191
|
+
matrix.set(col - c, row, dark);
|
|
1192
|
+
bitIndex -= 1;
|
|
1193
|
+
if (bitIndex == -1) {
|
|
1194
|
+
byteIndex += 1;
|
|
1195
|
+
bitIndex = 7;
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
row += inc;
|
|
1200
|
+
if (row < 0 || _moduleCount <= row) {
|
|
1201
|
+
row -= inc;
|
|
1202
|
+
inc = -inc;
|
|
1203
|
+
break;
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
};
|
|
1208
|
+
|
|
1209
|
+
var utils = /*#__PURE__*/Object.freeze({
|
|
1210
|
+
__proto__: null,
|
|
1211
|
+
QRMode: QRMode,
|
|
1212
|
+
QRErrorCorrectionLevel: QRErrorCorrectionLevel,
|
|
1213
|
+
QRMaskPattern: QRMaskPattern,
|
|
1214
|
+
BitBuffer: BitBuffer,
|
|
1215
|
+
getBaseQRMatrix: getBaseQRMatrix,
|
|
1216
|
+
setupAllPositionProbePattern: setupAllPositionProbePattern,
|
|
1217
|
+
setupPositionAdjustPattern: setupPositionAdjustPattern,
|
|
1218
|
+
setupTimingPattern: setupTimingPattern,
|
|
1219
|
+
setupTypeInfo: setupTypeInfo,
|
|
1220
|
+
setupTypeNumber: setupTypeNumber,
|
|
1221
|
+
mapInit: mapInit,
|
|
1222
|
+
copyMap: copyMap,
|
|
1223
|
+
compareMap: compareMap,
|
|
1224
|
+
createData: createData,
|
|
1225
|
+
setupData: setupData,
|
|
1226
|
+
getLengthInBits: getLengthInBits,
|
|
1227
|
+
getLostPoint: getLostPoint,
|
|
1228
|
+
getRSBlocks: getRSBlocks,
|
|
1229
|
+
getBufferForModes: getBufferForModes,
|
|
1230
|
+
getMaxDataCount: getMaxDataCount
|
|
1231
|
+
});
|
|
1232
|
+
|
|
1233
|
+
function Class(QRModes, defOptions) {
|
|
1234
|
+
QRcode.QRModes = QRModes;
|
|
1235
|
+
let QRErrorCorrectionLevels = (QRcode.QRErrorCorrectionLevels = Object.keys(QRErrorCorrectionLevel));
|
|
1236
|
+
function QRcode(options) {
|
|
1237
|
+
options = options || {};
|
|
1238
|
+
let _options = Object.assign(Object.assign({}, defOptions), options);
|
|
1239
|
+
return (function () {
|
|
1240
|
+
let _typeNumber = _options.typeNumber, _minTypeNumber = _options.minTypeNumber, _maskPattern = _options.maskPattern, _dataMode = _options.dataMode, _errorCorrectionLevel = (function () {
|
|
1241
|
+
let l = _options.errorCorrectionLevel + '';
|
|
1242
|
+
l = l.toUpperCase();
|
|
1243
|
+
return ~QRErrorCorrectionLevels.indexOf(l)
|
|
1244
|
+
? QRErrorCorrectionLevel[l]
|
|
1245
|
+
: QRErrorCorrectionLevel.M;
|
|
1246
|
+
})();
|
|
1247
|
+
let _moduleCount = 0, _dataList = [], _dataCache = null;
|
|
1248
|
+
let makeImpl = function (test, maskPattern) {
|
|
1249
|
+
let matrix = getBaseQRMatrix(_typeNumber);
|
|
1250
|
+
setupTypeInfo(matrix, test, _errorCorrectionLevel, maskPattern);
|
|
1251
|
+
_typeNumber >= 7 && setupTypeNumber(matrix, test);
|
|
1252
|
+
if (_dataCache == null) {
|
|
1253
|
+
_dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);
|
|
1254
|
+
}
|
|
1255
|
+
setupData(matrix, _dataCache, maskPattern);
|
|
1256
|
+
return matrix;
|
|
1257
|
+
};
|
|
1258
|
+
var addData = function (data, mode) {
|
|
1259
|
+
mode = mode || _dataMode;
|
|
1260
|
+
var newData = null;
|
|
1261
|
+
if (typeof mode == 'function') {
|
|
1262
|
+
newData = mode(data);
|
|
1263
|
+
if (!(newData.getMode && newData.getLength && newData.write)) {
|
|
1264
|
+
throw 'mode invalid!';
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
else {
|
|
1268
|
+
if (QRModes[mode]) {
|
|
1269
|
+
newData = QRModes[mode](data);
|
|
1270
|
+
}
|
|
1271
|
+
else {
|
|
1272
|
+
throw 'mode type invalid! mode is ' + mode;
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
_dataList.push(newData);
|
|
1276
|
+
_dataCache = null;
|
|
1277
|
+
};
|
|
1278
|
+
var make = function () {
|
|
1279
|
+
if (_typeNumber < 1) {
|
|
1280
|
+
var typeNumber = _minTypeNumber ? _minTypeNumber : 1;
|
|
1281
|
+
for (; typeNumber < 40; typeNumber++) {
|
|
1282
|
+
var buffer = getBufferForModes(typeNumber, _dataList);
|
|
1283
|
+
var totalDataCount = getMaxDataCount(typeNumber, _errorCorrectionLevel);
|
|
1284
|
+
if (buffer.getLengthInBits() <= totalDataCount * 8) {
|
|
1285
|
+
break;
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
_typeNumber = typeNumber;
|
|
1289
|
+
}
|
|
1290
|
+
_moduleCount = _typeNumber * 4 + 17;
|
|
1291
|
+
if (_maskPattern === 'random') {
|
|
1292
|
+
_maskPattern = ~~(Math.random() * (7 + 1));
|
|
1293
|
+
}
|
|
1294
|
+
else if (0 <= _maskPattern && _maskPattern <= 7) {
|
|
1295
|
+
_maskPattern = Number(_maskPattern) >> 0;
|
|
1296
|
+
}
|
|
1297
|
+
else {
|
|
1298
|
+
_maskPattern = (function () {
|
|
1299
|
+
var minLostPoint = 0;
|
|
1300
|
+
var pattern = 0;
|
|
1301
|
+
for (var i = 0; i < 8; i += 1) {
|
|
1302
|
+
var map = makeImpl(true, i);
|
|
1303
|
+
var lostPoint = getLostPoint(map);
|
|
1304
|
+
if (i == 0 || minLostPoint > lostPoint) {
|
|
1305
|
+
minLostPoint = lostPoint;
|
|
1306
|
+
pattern = i;
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
return pattern;
|
|
1310
|
+
})();
|
|
1311
|
+
}
|
|
1312
|
+
var map = makeImpl(false, _maskPattern);
|
|
1313
|
+
return map;
|
|
1314
|
+
};
|
|
1315
|
+
var splitMake = function () {
|
|
1316
|
+
var obj = {};
|
|
1317
|
+
obj.all = make();
|
|
1318
|
+
obj.allDiscover = getBaseQRMatrix(_typeNumber);
|
|
1319
|
+
obj.positionProbe = mapInit(_moduleCount);
|
|
1320
|
+
setupAllPositionProbePattern(obj.positionProbe);
|
|
1321
|
+
obj.positionAdjust = mapInit(_moduleCount);
|
|
1322
|
+
setupPositionAdjustPattern(obj.positionAdjust);
|
|
1323
|
+
obj.timing = mapInit(_moduleCount);
|
|
1324
|
+
setupTimingPattern(obj.timing);
|
|
1325
|
+
obj.data = compareMap(obj.all, obj.allDiscover, 'xor');
|
|
1326
|
+
return obj;
|
|
1327
|
+
};
|
|
1328
|
+
var setData = function (data, mode) {
|
|
1329
|
+
_dataList = [];
|
|
1330
|
+
addData(data, mode);
|
|
1331
|
+
};
|
|
1332
|
+
var _this = function (str, mode) {
|
|
1333
|
+
setData(str, mode);
|
|
1334
|
+
return make();
|
|
1335
|
+
};
|
|
1336
|
+
_this.setData = setData;
|
|
1337
|
+
_this.addData = addData;
|
|
1338
|
+
_this.make = make;
|
|
1339
|
+
_this.splitMake = splitMake;
|
|
1340
|
+
return _this;
|
|
1341
|
+
})();
|
|
1342
|
+
}
|
|
1343
|
+
return QRcode;
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
let QRModes = {
|
|
1347
|
+
Numeric: qrNumber,
|
|
1348
|
+
Alphanumeric: qrAlphaNum,
|
|
1349
|
+
Byte: qr8BitByte(toUTF8Array),
|
|
1350
|
+
'Byte-SJIS': qr8BitByte(SJIS),
|
|
1351
|
+
Kanji: qrKanji()
|
|
1352
|
+
};
|
|
1353
|
+
let defOptions = {
|
|
1354
|
+
errorCorrectionLevel: 'M',
|
|
1355
|
+
typeNumber: 0,
|
|
1356
|
+
maskPattern: 'auto',
|
|
1357
|
+
dataMode: 'Byte'
|
|
1358
|
+
};
|
|
1359
|
+
const QRcode = Class(QRModes, defOptions);
|
|
1360
|
+
|
|
1361
|
+
exports.QRcode = QRcode;
|
|
1362
|
+
exports.default = QRcode;
|
|
1363
|
+
exports.utils = utils;
|