@@ -0,0 +1,189 @@ | |||
(function (global, factory) { | |||
if (typeof define === "function" && define.amd) { | |||
define([], factory); | |||
} else if (typeof exports !== "undefined") { | |||
factory(); | |||
} else { | |||
var mod = { | |||
exports: {} | |||
}; | |||
factory(); | |||
global.FileSaver = mod.exports; | |||
} | |||
})(this, function () { | |||
"use strict"; | |||
/* | |||
* FileSaver.js | |||
* A saveAs() FileSaver implementation. | |||
* | |||
* By Eli Grey, http://eligrey.com | |||
* | |||
* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT) | |||
* source : http://purl.eligrey.com/github/FileSaver.js | |||
*/ | |||
// The one and only way of getting global scope in all environments | |||
// https://stackoverflow.com/q/3277182/1008999 | |||
var _global = function () { | |||
// some use content security policy to disable eval | |||
try { | |||
return Function('return this')() || (42, eval)('this'); | |||
} catch (e) { | |||
// every global should have circular reference | |||
// used for checking if someone writes var window = {}; var self = {} | |||
return typeof window === 'object' && window.window === window ? window : typeof self === 'object' && self.self === self ? self : typeof global === 'object' && global.global === global ? global : this; | |||
} | |||
}(); | |||
function bom(blob, opts) { | |||
if (typeof opts === 'undefined') opts = { | |||
autoBom: false | |||
};else if (typeof opts !== 'object') { | |||
console.warn('Depricated: Expected third argument to be a object'); | |||
opts = { | |||
autoBom: !opts | |||
}; | |||
} // prepend BOM for UTF-8 XML and text/* types (including HTML) | |||
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF | |||
if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { | |||
return new Blob([String.fromCharCode(0xFEFF), blob], { | |||
type: blob.type | |||
}); | |||
} | |||
return blob; | |||
} | |||
function download(url, name, opts) { | |||
var xhr = new XMLHttpRequest(); | |||
xhr.open('GET', url); | |||
xhr.responseType = 'blob'; | |||
xhr.onload = function () { | |||
saveAs(xhr.response, name, opts); | |||
}; | |||
xhr.onerror = function () { | |||
console.error('could not download file'); | |||
}; | |||
xhr.send(); | |||
} | |||
function corsEnabled(url) { | |||
var xhr = new XMLHttpRequest(); // use sync to avoid popup blocker | |||
xhr.open('HEAD', url, false); | |||
xhr.send(); | |||
return xhr.status >= 200 && xhr.status <= 299; | |||
} // `a.click()` doesn't work for all browsers (#465) | |||
function click(node) { | |||
try { | |||
node.dispatchEvent(new MouseEvent('click')); | |||
} catch (e) { | |||
var evt = document.createEvent('MouseEvents'); | |||
evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); | |||
node.dispatchEvent(evt); | |||
} | |||
} | |||
var saveAs = _global.saveAs || // probably in some web worker | |||
typeof window !== 'object' || window !== _global ? function saveAs() {} | |||
/* noop */ | |||
// Use download attribute first if possible (#193 Lumia mobile) | |||
: 'download' in HTMLAnchorElement.prototype ? function saveAs(blob, name, opts) { | |||
var URL = _global.URL || _global.webkitURL; | |||
var a = document.createElement('a'); | |||
name = name || blob.name || 'download'; | |||
a.download = name; | |||
a.rel = 'noopener'; // tabnabbing | |||
// TODO: detect chrome extensions & packaged apps | |||
// a.target = '_blank' | |||
if (typeof blob === 'string') { | |||
// Support regular links | |||
a.href = blob; | |||
if (a.origin !== location.origin) { | |||
corsEnabled(a.href) ? download(blob, name, opts) : click(a, a.target = '_blank'); | |||
} else { | |||
click(a); | |||
} | |||
} else { | |||
// Support blobs | |||
a.href = URL.createObjectURL(blob); | |||
setTimeout(function () { | |||
URL.revokeObjectURL(a.href); | |||
}, 4E4); // 40s | |||
setTimeout(function () { | |||
click(a); | |||
}, 0); | |||
} | |||
} // Use msSaveOrOpenBlob as a second approach | |||
: 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, opts) { | |||
name = name || blob.name || 'download'; | |||
if (typeof blob === 'string') { | |||
if (corsEnabled(blob)) { | |||
download(blob, name, opts); | |||
} else { | |||
var a = document.createElement('a'); | |||
a.href = blob; | |||
a.target = '_blank'; | |||
setTimeout(function () { | |||
click(a); | |||
}); | |||
} | |||
} else { | |||
navigator.msSaveOrOpenBlob(bom(blob, opts), name); | |||
} | |||
} // Fallback to using FileReader and a popup | |||
: function saveAs(blob, name, opts, popup) { | |||
// Open a popup immediately do go around popup blocker | |||
// Mostly only avalible on user interaction and the fileReader is async so... | |||
popup = popup || open('', '_blank'); | |||
if (popup) { | |||
popup.document.title = popup.document.body.innerText = 'downloading...'; | |||
} | |||
if (typeof blob === 'string') return download(blob, name, opts); | |||
var force = blob.type === 'application/octet-stream'; | |||
var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari; | |||
var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent); | |||
if ((isChromeIOS || force && isSafari) && typeof FileReader === 'object') { | |||
// Safari doesn't allow downloading of blob urls | |||
var reader = new FileReader(); | |||
reader.onloadend = function () { | |||
var url = reader.result; | |||
url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;'); | |||
if (popup) popup.location.href = url;else location = url; | |||
popup = null; // reverse-tabnabbing #460 | |||
}; | |||
reader.readAsDataURL(blob); | |||
} else { | |||
var URL = _global.URL || _global.webkitURL; | |||
var url = URL.createObjectURL(blob); | |||
if (popup) popup.location = url;else location.href = url; | |||
popup = null; // reverse-tabnabbing #460 | |||
setTimeout(function () { | |||
URL.revokeObjectURL(url); | |||
}, 4E4); // 40s | |||
} | |||
}; | |||
_global.saveAs = saveAs.saveAs = saveAs; | |||
if (typeof module !== 'undefined') { | |||
module.exports = saveAs; | |||
} | |||
}); |
@@ -0,0 +1,941 @@ | |||
/* | |||
* big.js v5.2.1 | |||
* A small, fast, easy-to-use library for arbitrary-precision decimal arithmetic. | |||
* Copyright (c) 2018 Michael Mclaughlin <M8ch88l@gmail.com> | |||
* https://github.com/MikeMcl/big.js/LICENCE | |||
*/ | |||
;(function (GLOBAL) { | |||
'use strict'; | |||
var Big, | |||
/************************************** EDITABLE DEFAULTS *****************************************/ | |||
// The default values below must be integers within the stated ranges. | |||
/* | |||
* The maximum number of decimal places (DP) of the results of operations involving division: | |||
* div and sqrt, and pow with negative exponents. | |||
*/ | |||
DP = 20, // 0 to MAX_DP | |||
/* | |||
* The rounding mode (RM) used when rounding to the above decimal places. | |||
* | |||
* 0 Towards zero (i.e. truncate, no rounding). (ROUND_DOWN) | |||
* 1 To nearest neighbour. If equidistant, round up. (ROUND_HALF_UP) | |||
* 2 To nearest neighbour. If equidistant, to even. (ROUND_HALF_EVEN) | |||
* 3 Away from zero. (ROUND_UP) | |||
*/ | |||
RM = 1, // 0, 1, 2 or 3 | |||
// The maximum value of DP and Big.DP. | |||
MAX_DP = 1E6, // 0 to 1000000 | |||
// The maximum magnitude of the exponent argument to the pow method. | |||
MAX_POWER = 1E6, // 1 to 1000000 | |||
/* | |||
* The negative exponent (NE) at and beneath which toString returns exponential notation. | |||
* (JavaScript numbers: -7) | |||
* -1000000 is the minimum recommended exponent value of a Big. | |||
*/ | |||
NE = -7, // 0 to -1000000 | |||
/* | |||
* The positive exponent (PE) at and above which toString returns exponential notation. | |||
* (JavaScript numbers: 21) | |||
* 1000000 is the maximum recommended exponent value of a Big. | |||
* (This limit is not enforced or checked.) | |||
*/ | |||
PE = 21, // 0 to 1000000 | |||
/**************************************************************************************************/ | |||
// Error messages. | |||
NAME = '[big.js] ', | |||
INVALID = NAME + 'Invalid ', | |||
INVALID_DP = INVALID + 'decimal places', | |||
INVALID_RM = INVALID + 'rounding mode', | |||
DIV_BY_ZERO = NAME + 'Division by zero', | |||
// The shared prototype object. | |||
P = {}, | |||
UNDEFINED = void 0, | |||
NUMERIC = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i; | |||
/* | |||
* Create and return a Big constructor. | |||
* | |||
*/ | |||
function _Big_() { | |||
/* | |||
* The Big constructor and exported function. | |||
* Create and return a new instance of a Big number object. | |||
* | |||
* n {number|string|Big} A numeric value. | |||
*/ | |||
function Big(n) { | |||
var x = this; | |||
// Enable constructor usage without new. | |||
if (!(x instanceof Big)) return n === UNDEFINED ? _Big_() : new Big(n); | |||
// Duplicate. | |||
if (n instanceof Big) { | |||
x.s = n.s; | |||
x.e = n.e; | |||
x.c = n.c.slice(); | |||
} else { | |||
parse(x, n); | |||
} | |||
/* | |||
* Retain a reference to this Big constructor, and shadow Big.prototype.constructor which | |||
* points to Object. | |||
*/ | |||
x.constructor = Big; | |||
} | |||
Big.prototype = P; | |||
Big.DP = DP; | |||
Big.RM = RM; | |||
Big.NE = NE; | |||
Big.PE = PE; | |||
Big.version = '5.2.1'; | |||
return Big; | |||
} | |||
/* | |||
* Parse the number or string value passed to a Big constructor. | |||
* | |||
* x {Big} A Big number instance. | |||
* n {number|string} A numeric value. | |||
*/ | |||
function parse(x, n) { | |||
var e, i, nl; | |||
// Minus zero? | |||
if (n === 0 && 1 / n < 0) n = '-0'; | |||
else if (!NUMERIC.test(n += '')) throw Error(INVALID + 'number'); | |||
// Determine sign. | |||
x.s = n.charAt(0) == '-' ? (n = n.slice(1), -1) : 1; | |||
// Decimal point? | |||
if ((e = n.indexOf('.')) > -1) n = n.replace('.', ''); | |||
// Exponential form? | |||
if ((i = n.search(/e/i)) > 0) { | |||
// Determine exponent. | |||
if (e < 0) e = i; | |||
e += +n.slice(i + 1); | |||
n = n.substring(0, i); | |||
} else if (e < 0) { | |||
// Integer. | |||
e = n.length; | |||
} | |||
nl = n.length; | |||
// Determine leading zeros. | |||
for (i = 0; i < nl && n.charAt(i) == '0';) ++i; | |||
if (i == nl) { | |||
// Zero. | |||
x.c = [x.e = 0]; | |||
} else { | |||
// Determine trailing zeros. | |||
for (; nl > 0 && n.charAt(--nl) == '0';); | |||
x.e = e - i - 1; | |||
x.c = []; | |||
// Convert string to array of digits without leading/trailing zeros. | |||
for (e = 0; i <= nl;) x.c[e++] = +n.charAt(i++); | |||
} | |||
return x; | |||
} | |||
/* | |||
* Round Big x to a maximum of dp decimal places using rounding mode rm. | |||
* Called by stringify, P.div, P.round and P.sqrt. | |||
* | |||
* x {Big} The Big to round. | |||
* dp {number} Integer, 0 to MAX_DP inclusive. | |||
* rm {number} 0, 1, 2 or 3 (DOWN, HALF_UP, HALF_EVEN, UP) | |||
* [more] {boolean} Whether the result of division was truncated. | |||
*/ | |||
function round(x, dp, rm, more) { | |||
var xc = x.c, | |||
i = x.e + dp + 1; | |||
if (i < xc.length) { | |||
if (rm === 1) { | |||
// xc[i] is the digit after the digit that may be rounded up. | |||
more = xc[i] >= 5; | |||
} else if (rm === 2) { | |||
more = xc[i] > 5 || xc[i] == 5 && | |||
(more || i < 0 || xc[i + 1] !== UNDEFINED || xc[i - 1] & 1); | |||
} else if (rm === 3) { | |||
more = more || !!xc[0]; | |||
} else { | |||
more = false; | |||
if (rm !== 0) throw Error(INVALID_RM); | |||
} | |||
if (i < 1) { | |||
xc.length = 1; | |||
if (more) { | |||
// 1, 0.1, 0.01, 0.001, 0.0001 etc. | |||
x.e = -dp; | |||
xc[0] = 1; | |||
} else { | |||
// Zero. | |||
xc[0] = x.e = 0; | |||
} | |||
} else { | |||
// Remove any digits after the required decimal places. | |||
xc.length = i--; | |||
// Round up? | |||
if (more) { | |||
// Rounding up may mean the previous digit has to be rounded up. | |||
for (; ++xc[i] > 9;) { | |||
xc[i] = 0; | |||
if (!i--) { | |||
++x.e; | |||
xc.unshift(1); | |||
} | |||
} | |||
} | |||
// Remove trailing zeros. | |||
for (i = xc.length; !xc[--i];) xc.pop(); | |||
} | |||
} else if (rm < 0 || rm > 3 || rm !== ~~rm) { | |||
throw Error(INVALID_RM); | |||
} | |||
return x; | |||
} | |||
/* | |||
* Return a string representing the value of Big x in normal or exponential notation. | |||
* Handles P.toExponential, P.toFixed, P.toJSON, P.toPrecision, P.toString and P.valueOf. | |||
* | |||
* x {Big} | |||
* id? {number} Caller id. | |||
* 1 toExponential | |||
* 2 toFixed | |||
* 3 toPrecision | |||
* 4 valueOf | |||
* n? {number|undefined} Caller's argument. | |||
* k? {number|undefined} | |||
*/ | |||
function stringify(x, id, n, k) { | |||
var e, s, | |||
Big = x.constructor, | |||
z = !x.c[0]; | |||
if (n !== UNDEFINED) { | |||
if (n !== ~~n || n < (id == 3) || n > MAX_DP) { | |||
throw Error(id == 3 ? INVALID + 'precision' : INVALID_DP); | |||
} | |||
x = new Big(x); | |||
// The index of the digit that may be rounded up. | |||
n = k - x.e; | |||
// Round? | |||
if (x.c.length > ++k) round(x, n, Big.RM); | |||
// toFixed: recalculate k as x.e may have changed if value rounded up. | |||
if (id == 2) k = x.e + n + 1; | |||
// Append zeros? | |||
for (; x.c.length < k;) x.c.push(0); | |||
} | |||
e = x.e; | |||
s = x.c.join(''); | |||
n = s.length; | |||
// Exponential notation? | |||
if (id != 2 && (id == 1 || id == 3 && k <= e || e <= Big.NE || e >= Big.PE)) { | |||
s = s.charAt(0) + (n > 1 ? '.' + s.slice(1) : '') + (e < 0 ? 'e' : 'e+') + e; | |||
// Normal notation. | |||
} else if (e < 0) { | |||
for (; ++e;) s = '0' + s; | |||
s = '0.' + s; | |||
} else if (e > 0) { | |||
if (++e > n) for (e -= n; e--;) s += '0'; | |||
else if (e < n) s = s.slice(0, e) + '.' + s.slice(e); | |||
} else if (n > 1) { | |||
s = s.charAt(0) + '.' + s.slice(1); | |||
} | |||
return x.s < 0 && (!z || id == 4) ? '-' + s : s; | |||
} | |||
// Prototype/instance methods | |||
/* | |||
* Return a new Big whose value is the absolute value of this Big. | |||
*/ | |||
P.abs = function () { | |||
var x = new this.constructor(this); | |||
x.s = 1; | |||
return x; | |||
}; | |||
/* | |||
* Return 1 if the value of this Big is greater than the value of Big y, | |||
* -1 if the value of this Big is less than the value of Big y, or | |||
* 0 if they have the same value. | |||
*/ | |||
P.cmp = function (y) { | |||
var isneg, | |||
x = this, | |||
xc = x.c, | |||
yc = (y = new x.constructor(y)).c, | |||
i = x.s, | |||
j = y.s, | |||
k = x.e, | |||
l = y.e; | |||
// Either zero? | |||
if (!xc[0] || !yc[0]) return !xc[0] ? !yc[0] ? 0 : -j : i; | |||
// Signs differ? | |||
if (i != j) return i; | |||
isneg = i < 0; | |||
// Compare exponents. | |||
if (k != l) return k > l ^ isneg ? 1 : -1; | |||
j = (k = xc.length) < (l = yc.length) ? k : l; | |||
// Compare digit by digit. | |||
for (i = -1; ++i < j;) { | |||
if (xc[i] != yc[i]) return xc[i] > yc[i] ^ isneg ? 1 : -1; | |||
} | |||
// Compare lengths. | |||
return k == l ? 0 : k > l ^ isneg ? 1 : -1; | |||
}; | |||
/* | |||
* Return a new Big whose value is the value of this Big divided by the value of Big y, rounded, | |||
* if necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM. | |||
*/ | |||
P.div = function (y) { | |||
var x = this, | |||
Big = x.constructor, | |||
a = x.c, // dividend | |||
b = (y = new Big(y)).c, // divisor | |||
k = x.s == y.s ? 1 : -1, | |||
dp = Big.DP; | |||
if (dp !== ~~dp || dp < 0 || dp > MAX_DP) throw Error(INVALID_DP); | |||
// Divisor is zero? | |||
if (!b[0]) throw Error(DIV_BY_ZERO); | |||
// Dividend is 0? Return +-0. | |||
if (!a[0]) return new Big(k * 0); | |||
var bl, bt, n, cmp, ri, | |||
bz = b.slice(), | |||
ai = bl = b.length, | |||
al = a.length, | |||
r = a.slice(0, bl), // remainder | |||
rl = r.length, | |||
q = y, // quotient | |||
qc = q.c = [], | |||
qi = 0, | |||
d = dp + (q.e = x.e - y.e) + 1; // number of digits of the result | |||
q.s = k; | |||
k = d < 0 ? 0 : d; | |||
// Create version of divisor with leading zero. | |||
bz.unshift(0); | |||
// Add zeros to make remainder as long as divisor. | |||
for (; rl++ < bl;) r.push(0); | |||
do { | |||
// n is how many times the divisor goes into current remainder. | |||
for (n = 0; n < 10; n++) { | |||
// Compare divisor and remainder. | |||
if (bl != (rl = r.length)) { | |||
cmp = bl > rl ? 1 : -1; | |||
} else { | |||
for (ri = -1, cmp = 0; ++ri < bl;) { | |||
if (b[ri] != r[ri]) { | |||
cmp = b[ri] > r[ri] ? 1 : -1; | |||
break; | |||
} | |||
} | |||
} | |||
// If divisor < remainder, subtract divisor from remainder. | |||
if (cmp < 0) { | |||
// Remainder can't be more than 1 digit longer than divisor. | |||
// Equalise lengths using divisor with extra leading zero? | |||
for (bt = rl == bl ? b : bz; rl;) { | |||
if (r[--rl] < bt[rl]) { | |||
ri = rl; | |||
for (; ri && !r[--ri];) r[ri] = 9; | |||
--r[ri]; | |||
r[rl] += 10; | |||
} | |||
r[rl] -= bt[rl]; | |||
} | |||
for (; !r[0];) r.shift(); | |||
} else { | |||
break; | |||
} | |||
} | |||
// Add the digit n to the result array. | |||
qc[qi++] = cmp ? n : ++n; | |||
// Update the remainder. | |||
if (r[0] && cmp) r[rl] = a[ai] || 0; | |||
else r = [a[ai]]; | |||
} while ((ai++ < al || r[0] !== UNDEFINED) && k--); | |||
// Leading zero? Do not remove if result is simply zero (qi == 1). | |||
if (!qc[0] && qi != 1) { | |||
// There can't be more than one zero. | |||
qc.shift(); | |||
q.e--; | |||
} | |||
// Round? | |||
if (qi > d) round(q, dp, Big.RM, r[0] !== UNDEFINED); | |||
return q; | |||
}; | |||
/* | |||
* Return true if the value of this Big is equal to the value of Big y, otherwise return false. | |||
*/ | |||
P.eq = function (y) { | |||
return !this.cmp(y); | |||
}; | |||
/* | |||
* Return true if the value of this Big is greater than the value of Big y, otherwise return | |||
* false. | |||
*/ | |||
P.gt = function (y) { | |||
return this.cmp(y) > 0; | |||
}; | |||
/* | |||
* Return true if the value of this Big is greater than or equal to the value of Big y, otherwise | |||
* return false. | |||
*/ | |||
P.gte = function (y) { | |||
return this.cmp(y) > -1; | |||
}; | |||
/* | |||
* Return true if the value of this Big is less than the value of Big y, otherwise return false. | |||
*/ | |||
P.lt = function (y) { | |||
return this.cmp(y) < 0; | |||
}; | |||
/* | |||
* Return true if the value of this Big is less than or equal to the value of Big y, otherwise | |||
* return false. | |||
*/ | |||
P.lte = function (y) { | |||
return this.cmp(y) < 1; | |||
}; | |||
/* | |||
* Return a new Big whose value is the value of this Big minus the value of Big y. | |||
*/ | |||
P.minus = P.sub = function (y) { | |||
var i, j, t, xlty, | |||
x = this, | |||
Big = x.constructor, | |||
a = x.s, | |||
b = (y = new Big(y)).s; | |||
// Signs differ? | |||
if (a != b) { | |||
y.s = -b; | |||
return x.plus(y); | |||
} | |||
var xc = x.c.slice(), | |||
xe = x.e, | |||
yc = y.c, | |||
ye = y.e; | |||
// Either zero? | |||
if (!xc[0] || !yc[0]) { | |||
// y is non-zero? x is non-zero? Or both are zero. | |||
return yc[0] ? (y.s = -b, y) : new Big(xc[0] ? x : 0); | |||
} | |||
// Determine which is the bigger number. Prepend zeros to equalise exponents. | |||
if (a = xe - ye) { | |||
if (xlty = a < 0) { | |||
a = -a; | |||
t = xc; | |||
} else { | |||
ye = xe; | |||
t = yc; | |||
} | |||
t.reverse(); | |||
for (b = a; b--;) t.push(0); | |||
t.reverse(); | |||
} else { | |||
// Exponents equal. Check digit by digit. | |||
j = ((xlty = xc.length < yc.length) ? xc : yc).length; | |||
for (a = b = 0; b < j; b++) { | |||
if (xc[b] != yc[b]) { | |||
xlty = xc[b] < yc[b]; | |||
break; | |||
} | |||
} | |||
} | |||
// x < y? Point xc to the array of the bigger number. | |||
if (xlty) { | |||
t = xc; | |||
xc = yc; | |||
yc = t; | |||
y.s = -y.s; | |||
} | |||
/* | |||
* Append zeros to xc if shorter. No need to add zeros to yc if shorter as subtraction only | |||
* needs to start at yc.length. | |||
*/ | |||
if ((b = (j = yc.length) - (i = xc.length)) > 0) for (; b--;) xc[i++] = 0; | |||
// Subtract yc from xc. | |||
for (b = i; j > a;) { | |||
if (xc[--j] < yc[j]) { | |||
for (i = j; i && !xc[--i];) xc[i] = 9; | |||
--xc[i]; | |||
xc[j] += 10; | |||
} | |||
xc[j] -= yc[j]; | |||
} | |||
// Remove trailing zeros. | |||
for (; xc[--b] === 0;) xc.pop(); | |||
// Remove leading zeros and adjust exponent accordingly. | |||
for (; xc[0] === 0;) { | |||
xc.shift(); | |||
--ye; | |||
} | |||
if (!xc[0]) { | |||
// n - n = +0 | |||
y.s = 1; | |||
// Result must be zero. | |||
xc = [ye = 0]; | |||
} | |||
y.c = xc; | |||
y.e = ye; | |||
return y; | |||
}; | |||
/* | |||
* Return a new Big whose value is the value of this Big modulo the value of Big y. | |||
*/ | |||
P.mod = function (y) { | |||
var ygtx, | |||
x = this, | |||
Big = x.constructor, | |||
a = x.s, | |||
b = (y = new Big(y)).s; | |||
if (!y.c[0]) throw Error(DIV_BY_ZERO); | |||
x.s = y.s = 1; | |||
ygtx = y.cmp(x) == 1; | |||
x.s = a; | |||
y.s = b; | |||
if (ygtx) return new Big(x); | |||
a = Big.DP; | |||
b = Big.RM; | |||
Big.DP = Big.RM = 0; | |||
x = x.div(y); | |||
Big.DP = a; | |||
Big.RM = b; | |||
return this.minus(x.times(y)); | |||
}; | |||
/* | |||
* Return a new Big whose value is the value of this Big plus the value of Big y. | |||
*/ | |||
P.plus = P.add = function (y) { | |||
var t, | |||
x = this, | |||
Big = x.constructor, | |||
a = x.s, | |||
b = (y = new Big(y)).s; | |||
// Signs differ? | |||
if (a != b) { | |||
y.s = -b; | |||
return x.minus(y); | |||
} | |||
var xe = x.e, | |||
xc = x.c, | |||
ye = y.e, | |||
yc = y.c; | |||
// Either zero? y is non-zero? x is non-zero? Or both are zero. | |||
if (!xc[0] || !yc[0]) return yc[0] ? y : new Big(xc[0] ? x : a * 0); | |||
xc = xc.slice(); | |||
// Prepend zeros to equalise exponents. | |||
// Note: reverse faster than unshifts. | |||
if (a = xe - ye) { | |||
if (a > 0) { | |||
ye = xe; | |||
t = yc; | |||
} else { | |||
a = -a; | |||
t = xc; | |||
} | |||
t.reverse(); | |||
for (; a--;) t.push(0); | |||
t.reverse(); | |||
} | |||
// Point xc to the longer array. | |||
if (xc.length - yc.length < 0) { | |||
t = yc; | |||
yc = xc; | |||
xc = t; | |||
} | |||
a = yc.length; | |||
// Only start adding at yc.length - 1 as the further digits of xc can be left as they are. | |||
for (b = 0; a; xc[a] %= 10) b = (xc[--a] = xc[a] + yc[a] + b) / 10 | 0; | |||
// No need to check for zero, as +x + +y != 0 && -x + -y != 0 | |||
if (b) { | |||
xc.unshift(b); | |||
++ye; | |||
} | |||
// Remove trailing zeros. | |||
for (a = xc.length; xc[--a] === 0;) xc.pop(); | |||
y.c = xc; | |||
y.e = ye; | |||
return y; | |||
}; | |||
/* | |||
* Return a Big whose value is the value of this Big raised to the power n. | |||
* If n is negative, round to a maximum of Big.DP decimal places using rounding | |||
* mode Big.RM. | |||
* | |||
* n {number} Integer, -MAX_POWER to MAX_POWER inclusive. | |||
*/ | |||
P.pow = function (n) { | |||
var x = this, | |||
one = new x.constructor(1), | |||
y = one, | |||
isneg = n < 0; | |||
if (n !== ~~n || n < -MAX_POWER || n > MAX_POWER) throw Error(INVALID + 'exponent'); | |||
if (isneg) n = -n; | |||
for (;;) { | |||
if (n & 1) y = y.times(x); | |||
n >>= 1; | |||
if (!n) break; | |||
x = x.times(x); | |||
} | |||
return isneg ? one.div(y) : y; | |||
}; | |||
/* | |||
* Return a new Big whose value is the value of this Big rounded using rounding mode rm | |||
* to a maximum of dp decimal places, or, if dp is negative, to an integer which is a | |||
* multiple of 10**-dp. | |||
* If dp is not specified, round to 0 decimal places. | |||
* If rm is not specified, use Big.RM. | |||
* | |||
* dp? {number} Integer, -MAX_DP to MAX_DP inclusive. | |||
* rm? 0, 1, 2 or 3 (ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_EVEN, ROUND_UP) | |||
*/ | |||
P.round = function (dp, rm) { | |||
var Big = this.constructor; | |||
if (dp === UNDEFINED) dp = 0; | |||
else if (dp !== ~~dp || dp < -MAX_DP || dp > MAX_DP) throw Error(INVALID_DP); | |||
return round(new Big(this), dp, rm === UNDEFINED ? Big.RM : rm); | |||
}; | |||
/* | |||
* Return a new Big whose value is the square root of the value of this Big, rounded, if | |||
* necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM. | |||
*/ | |||
P.sqrt = function () { | |||
var r, c, t, | |||
x = this, | |||
Big = x.constructor, | |||
s = x.s, | |||
e = x.e, | |||
half = new Big(0.5); | |||
// Zero? | |||
if (!x.c[0]) return new Big(x); | |||
// Negative? | |||
if (s < 0) throw Error(NAME + 'No square root'); | |||
// Estimate. | |||
s = Math.sqrt(x + ''); | |||
// Math.sqrt underflow/overflow? | |||
// Re-estimate: pass x coefficient to Math.sqrt as integer, then adjust the result exponent. | |||
if (s === 0 || s === 1 / 0) { | |||
c = x.c.join(''); | |||
if (!(c.length + e & 1)) c += '0'; | |||
s = Math.sqrt(c); | |||
e = ((e + 1) / 2 | 0) - (e < 0 || e & 1); | |||
r = new Big((s == 1 / 0 ? '1e' : (s = s.toExponential()).slice(0, s.indexOf('e') + 1)) + e); | |||
} else { | |||
r = new Big(s); | |||
} | |||
e = r.e + (Big.DP += 4); | |||
// Newton-Raphson iteration. | |||
do { | |||
t = r; | |||
r = half.times(t.plus(x.div(t))); | |||
} while (t.c.slice(0, e).join('') !== r.c.slice(0, e).join('')); | |||
return round(r, Big.DP -= 4, Big.RM); | |||
}; | |||
/* | |||
* Return a new Big whose value is the value of this Big times the value of Big y. | |||
*/ | |||
P.times = P.mul = function (y) { | |||
var c, | |||
x = this, | |||
Big = x.constructor, | |||
xc = x.c, | |||
yc = (y = new Big(y)).c, | |||
a = xc.length, | |||
b = yc.length, | |||
i = x.e, | |||
j = y.e; | |||
// Determine sign of result. | |||
y.s = x.s == y.s ? 1 : -1; | |||
// Return signed 0 if either 0. | |||
if (!xc[0] || !yc[0]) return new Big(y.s * 0); | |||
// Initialise exponent of result as x.e + y.e. | |||
y.e = i + j; | |||
// If array xc has fewer digits than yc, swap xc and yc, and lengths. | |||
if (a < b) { | |||
c = xc; | |||
xc = yc; | |||
yc = c; | |||
j = a; | |||
a = b; | |||
b = j; | |||
} | |||
// Initialise coefficient array of result with zeros. | |||
for (c = new Array(j = a + b); j--;) c[j] = 0; | |||
// Multiply. | |||
// i is initially xc.length. | |||
for (i = b; i--;) { | |||
b = 0; | |||
// a is yc.length. | |||
for (j = a + i; j > i;) { | |||
// Current sum of products at this digit position, plus carry. | |||
b = c[j] + yc[i] * xc[j - i - 1] + b; | |||
c[j--] = b % 10; | |||
// carry | |||
b = b / 10 | 0; | |||
} | |||
c[j] = (c[j] + b) % 10; | |||
} | |||
// Increment result exponent if there is a final carry, otherwise remove leading zero. | |||
if (b) ++y.e; | |||
else c.shift(); | |||
// Remove trailing zeros. | |||
for (i = c.length; !c[--i];) c.pop(); | |||
y.c = c; | |||
return y; | |||
}; | |||
/* | |||
* Return a string representing the value of this Big in exponential notation to dp fixed decimal | |||
* places and rounded using Big.RM. | |||
* | |||
* dp? {number} Integer, 0 to MAX_DP inclusive. | |||
*/ | |||
P.toExponential = function (dp) { | |||
return stringify(this, 1, dp, dp); | |||
}; | |||
/* | |||
* Return a string representing the value of this Big in normal notation to dp fixed decimal | |||
* places and rounded using Big.RM. | |||
* | |||
* dp? {number} Integer, 0 to MAX_DP inclusive. | |||
* | |||
* (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'. | |||
* (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'. | |||
*/ | |||
P.toFixed = function (dp) { | |||
return stringify(this, 2, dp, this.e + dp); | |||
}; | |||
/* | |||
* Return a string representing the value of this Big rounded to sd significant digits using | |||
* Big.RM. Use exponential notation if sd is less than the number of digits necessary to represent | |||
* the integer part of the value in normal notation. | |||
* | |||
* sd {number} Integer, 1 to MAX_DP inclusive. | |||
*/ | |||
P.toPrecision = function (sd) { | |||
return stringify(this, 3, sd, sd - 1); | |||
}; | |||
/* | |||
* Return a string representing the value of this Big. | |||
* Return exponential notation if this Big has a positive exponent equal to or greater than | |||
* Big.PE, or a negative exponent equal to or less than Big.NE. | |||
* Omit the sign for negative zero. | |||
*/ | |||
P.toString = function () { | |||
return stringify(this); | |||
}; | |||
/* | |||
* Return a string representing the value of this Big. | |||
* Return exponential notation if this Big has a positive exponent equal to or greater than | |||
* Big.PE, or a negative exponent equal to or less than Big.NE. | |||
* Include the sign for negative zero. | |||
*/ | |||
P.valueOf = P.toJSON = function () { | |||
return stringify(this, 4); | |||
}; | |||
// Export | |||
Big = _Big_(); | |||
Big['default'] = Big.Big = Big; | |||
//AMD. | |||
if (typeof define === 'function' && define.amd) { | |||
define(function () { return Big; }); | |||
// Node and other CommonJS-like environments that support module.exports. | |||
} else if (typeof module !== 'undefined' && module.exports) { | |||
module.exports = Big; | |||
//Browser. | |||
} else { | |||
GLOBAL.Big = Big; | |||
} | |||
})(this); |
@@ -0,0 +1 @@ | |||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.jqueryI18next=e()}(this,function(){"use strict";function t(t,a){function i(n,a,i){function r(t,n){return f.parseDefaultValueFromContent?e({},t,{defaultValue:n}):t}if(0!==a.length){var o="text";if(0===a.indexOf("[")){var l=a.split("]");a=l[1],o=l[0].substr(1,l[0].length-1)}if(a.indexOf(";")===a.length-1&&(a=a.substr(0,a.length-2)),"html"===o)n.html(t.t(a,r(i,n.html())));else if("text"===o)n.text(t.t(a,r(i,n.text())));else if("prepend"===o)n.prepend(t.t(a,r(i,n.html())));else if("append"===o)n.append(t.t(a,r(i,n.html())));else if(0===o.indexOf("data-")){var s=o.substr("data-".length),d=t.t(a,r(i,n.data(s)));n.data(s,d),n.attr(o,d)}else n.attr(o,t.t(a,r(i,n.attr(o))))}}function r(t,n){var r=t.attr(f.selectorAttr);if(r||void 0===r||!1===r||(r=t.text()||t.val()),r){var o=t,l=t.data(f.targetAttr);if(l&&(o=t.find(l)||t),n||!0!==f.useOptionsAttr||(n=t.data(f.optionsAttr)),n=n||{},r.indexOf(";")>=0){var s=r.split(";");a.each(s,function(t,e){""!==e&&i(o,e.trim(),n)})}else i(o,r,n);if(!0===f.useOptionsAttr){var d={};d=e({clone:d},n),delete d.lng,t.data(f.optionsAttr,d)}}}function o(t){return this.each(function(){r(a(this),t),a(this).find("["+f.selectorAttr+"]").each(function(){r(a(this),t)})})}var f=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};f=e({},n,f),a[f.tName]=t.t.bind(t),a[f.i18nName]=t,a.fn[f.handleName]=o}var e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(t[a]=n[a])}return t},n={tName:"t",i18nName:"i18n",handleName:"localize",selectorAttr:"data-i18n",targetAttr:"i18n-target",optionsAttr:"i18n-options",useOptionsAttr:!1,parseDefaultValueFromContent:!0};return{init:t}}); |
@@ -0,0 +1,3 @@ | |||
/*! js-cookie v2.2.0 | MIT */ | |||
!function(e){var n=!1;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var o=window.Cookies,t=window.Cookies=e();t.noConflict=function(){return window.Cookies=o,t}}}(function(){function e(){for(var e=0,n={};e<arguments.length;e++){var o=arguments[e];for(var t in o)n[t]=o[t]}return n}function n(o){function t(n,r,i){var c;if("undefined"!=typeof document){if(arguments.length>1){if("number"==typeof(i=e({path:"/"},t.defaults,i)).expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*i.expires),i.expires=a}i.expires=i.expires?i.expires.toUTCString():"";try{c=JSON.stringify(r),/^[\{\[]/.test(c)&&(r=c)}catch(e){}r=o.write?o.write(r,n):encodeURIComponent(r+"").replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),n=(n=(n=encodeURIComponent(n+"")).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape);var s="";for(var f in i)i[f]&&(s+="; "+f,!0!==i[f]&&(s+="="+i[f]));return document.cookie=n+"="+r+s}n||(c={});for(var p=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,u=0;u<p.length;u++){var l=p[u].split("="),C=l.slice(1).join("=");this.json||'"'!==C.charAt(0)||(C=C.slice(1,-1));try{var m=l[0].replace(d,decodeURIComponent);if(C=o.read?o.read(C,m):o(C,m)||C.replace(d,decodeURIComponent),this.json)try{C=JSON.parse(C)}catch(e){}if(n===m){c=C;break}n||(c[m]=C)}catch(e){}}return c}}return t.set=t,t.get=function(e){return t.call(t,e)},t.getJSON=function(){return t.apply({json:!0},[].slice.call(arguments))},t.defaults={},t.remove=function(n,o){t(n,"",e(o,{expires:-1}))},t.withConverter=n,t}return n(function(){})}); |
@@ -0,0 +1,71 @@ | |||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.PromiseWorker = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ | |||
'use strict' | |||
var messageIds = 0 | |||
function onMessage (self, e) { | |||
var message = e.data | |||
if (!Array.isArray(message) || message.length < 2) { | |||
// Ignore - this message is not for us. | |||
return | |||
} | |||
var messageId = message[0] | |||
var error = message[1] | |||
var result = message[2] | |||
var callback = self._callbacks[messageId] | |||
if (!callback) { | |||
// Ignore - user might have created multiple PromiseWorkers. | |||
// This message is not for us. | |||
return | |||
} | |||
delete self._callbacks[messageId] | |||
callback(error, result) | |||
} | |||
function PromiseWorker (worker) { | |||
var self = this | |||
self._worker = worker | |||
self._callbacks = {} | |||
worker.addEventListener('message', function (e) { | |||
onMessage(self, e) | |||
}) | |||
} | |||
PromiseWorker.prototype.postMessage = function (userMessage) { | |||
var self = this | |||
var messageId = messageIds++ | |||
var messageToSend = [messageId, userMessage] | |||
return new Promise(function (resolve, reject) { | |||
self._callbacks[messageId] = function (error, result) { | |||
if (error) { | |||
return reject(new Error(error.message)) | |||
} | |||
resolve(result) | |||
} | |||
/* istanbul ignore if */ | |||
if (typeof self._worker.controller !== 'undefined') { | |||
// service worker, use MessageChannels because e.source is broken in Chrome < 51: | |||
// https://bugs.chromium.org/p/chromium/issues/detail?id=543198 | |||
var channel = new MessageChannel() | |||
channel.port1.onmessage = function (e) { | |||
onMessage(self, e) | |||
} | |||
self._worker.controller.postMessage(messageToSend, [channel.port2]) | |||
} else { | |||
// web worker | |||
self._worker.postMessage(messageToSend) | |||
} | |||
}) | |||
} | |||
module.exports = PromiseWorker | |||
},{}]},{},[1])(1) | |||
}); |
@@ -0,0 +1,82 @@ | |||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.registerPromiseWorker = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ | |||
'use strict' | |||
function isPromise (obj) { | |||
// via https://unpkg.com/is-promise@2.1.0/index.js | |||
return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function' | |||
} | |||
function registerPromiseWorker (callback) { | |||
function postOutgoingMessage (e, messageId, error, result) { | |||
function postMessage (msg) { | |||
/* istanbul ignore if */ | |||
if (typeof self.postMessage !== 'function') { // service worker | |||
e.ports[0].postMessage(msg) | |||
} else { // web worker | |||
self.postMessage(msg) | |||
} | |||
} | |||
if (error) { | |||
/* istanbul ignore else */ | |||
if (typeof console !== 'undefined' && 'error' in console) { | |||
// This is to make errors easier to debug. I think it's important | |||
// enough to just leave here without giving the user an option | |||
// to silence it. | |||
console.error('Worker caught an error:', error) | |||
} | |||
postMessage([messageId, { | |||
message: error.message | |||
}]) | |||
} else { | |||
postMessage([messageId, null, result]) | |||
} | |||
} | |||
function tryCatchFunc (callback, message) { | |||
try { | |||
return { res: callback(message) } | |||
} catch (e) { | |||
return { err: e } | |||
} | |||
} | |||
function handleIncomingMessage (e, callback, messageId, message) { | |||
var result = tryCatchFunc(callback, message) | |||
if (result.err) { | |||
postOutgoingMessage(e, messageId, result.err) | |||
} else if (!isPromise(result.res)) { | |||
postOutgoingMessage(e, messageId, null, result.res) | |||
} else { | |||
result.res.then(function (finalResult) { | |||
postOutgoingMessage(e, messageId, null, finalResult) | |||
}, function (finalError) { | |||
postOutgoingMessage(e, messageId, finalError) | |||
}) | |||
} | |||
} | |||
function onIncomingMessage (e) { | |||
var payload = e.data | |||
if (!Array.isArray(payload) || payload.length !== 2) { | |||
// message doens't match communication format; ignore | |||
return | |||
} | |||
var messageId = payload[0] | |||
var message = payload[1] | |||
if (typeof callback !== 'function') { | |||
postOutgoingMessage(e, messageId, new Error( | |||
'Please pass a function into register().')) | |||
} else { | |||
handleIncomingMessage(e, callback, messageId, message) | |||
} | |||
} | |||
self.addEventListener('message', onIncomingMessage) | |||
} | |||
module.exports = registerPromiseWorker | |||
},{}]},{},[1])(1) | |||
}); |
@@ -0,0 +1,614 @@ | |||
/** | |||
* @fileoverview | |||
* - Using the 'QRCode for Javascript library' | |||
* - Fixed dataset of 'QRCode for Javascript library' for support full-spec. | |||
* - this library has no dependencies. | |||
* | |||
* @author davidshimjs | |||
* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a> | |||
* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a> | |||
*/ | |||
var QRCode; | |||
(function () { | |||
//--------------------------------------------------------------------- | |||
// QRCode for JavaScript | |||
// | |||
// Copyright (c) 2009 Kazuhiko Arase | |||
// | |||
// URL: http://www.d-project.com/ | |||
// | |||
// Licensed under the MIT license: | |||
// http://www.opensource.org/licenses/mit-license.php | |||
// | |||
// The word "QR Code" is registered trademark of | |||
// DENSO WAVE INCORPORATED | |||
// http://www.denso-wave.com/qrcode/faqpatent-e.html | |||
// | |||
//--------------------------------------------------------------------- | |||
function QR8bitByte(data) { | |||
this.mode = QRMode.MODE_8BIT_BYTE; | |||
this.data = data; | |||
this.parsedData = []; | |||
// Added to support UTF-8 Characters | |||
for (var i = 0, l = this.data.length; i < l; i++) { | |||
var byteArray = []; | |||
var code = this.data.charCodeAt(i); | |||
if (code > 0x10000) { | |||
byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18); | |||
byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12); | |||
byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6); | |||
byteArray[3] = 0x80 | (code & 0x3F); | |||
} else if (code > 0x800) { | |||
byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12); | |||
byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6); | |||
byteArray[2] = 0x80 | (code & 0x3F); | |||
} else if (code > 0x80) { | |||
byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6); | |||
byteArray[1] = 0x80 | (code & 0x3F); | |||
} else { | |||
byteArray[0] = code; | |||
} | |||
this.parsedData.push(byteArray); | |||
} | |||
this.parsedData = Array.prototype.concat.apply([], this.parsedData); | |||
if (this.parsedData.length != this.data.length) { | |||
this.parsedData.unshift(191); | |||
this.parsedData.unshift(187); | |||
this.parsedData.unshift(239); | |||
} | |||
} | |||
QR8bitByte.prototype = { | |||
getLength: function (buffer) { | |||
return this.parsedData.length; | |||
}, | |||
write: function (buffer) { | |||
for (var i = 0, l = this.parsedData.length; i < l; i++) { | |||
buffer.put(this.parsedData[i], 8); | |||
} | |||
} | |||
}; | |||
function QRCodeModel(typeNumber, errorCorrectLevel) { | |||
this.typeNumber = typeNumber; | |||
this.errorCorrectLevel = errorCorrectLevel; | |||
this.modules = null; | |||
this.moduleCount = 0; | |||
this.dataCache = null; | |||
this.dataList = []; | |||
} | |||
QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);} | |||
return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}} | |||
this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);} | |||
if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);} | |||
this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}} | |||
return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}} | |||
return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;} | |||
this.modules[r][6]=(r%2==0);} | |||
for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;} | |||
this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;} | |||
for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;} | |||
for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}} | |||
for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}} | |||
this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);} | |||
var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;} | |||
this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}} | |||
row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);} | |||
var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;} | |||
if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. (" | |||
+buffer.getLengthInBits() | |||
+">" | |||
+totalDataCount*8 | |||
+")");} | |||
if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);} | |||
while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);} | |||
while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;} | |||
buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;} | |||
buffer.put(QRCodeModel.PAD1,8);} | |||
return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];} | |||
offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}} | |||
var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;} | |||
var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}} | |||
for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}} | |||
return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));} | |||
return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));} | |||
return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;} | |||
return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));} | |||
return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;} | |||
for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;} | |||
if(r==0&&c==0){continue;} | |||
if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}} | |||
if(sameCount>5){lostPoint+=(3+sameCount-5);}}} | |||
for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}} | |||
for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}} | |||
for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}} | |||
var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}} | |||
var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");} | |||
return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;} | |||
while(n>=256){n-=255;} | |||
return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;} | |||
for(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];} | |||
for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;} | |||
function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);} | |||
var offset=0;while(offset<num.length&&num[offset]==0){offset++;} | |||
this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}} | |||
QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}} | |||
return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;} | |||
var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);} | |||
for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);} | |||
return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;} | |||
QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);} | |||
var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}} | |||
return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;} | |||
QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);} | |||
if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));} | |||
this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]]; | |||
function _isSupportCanvas() { | |||
return typeof CanvasRenderingContext2D != "undefined"; | |||
} | |||
// android 2.x doesn't support Data-URI spec | |||
function _getAndroid() { | |||
var android = false; | |||
var sAgent = navigator.userAgent; | |||
if (/android/i.test(sAgent)) { // android | |||
android = true; | |||
var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i); | |||
if (aMat && aMat[1]) { | |||
android = parseFloat(aMat[1]); | |||
} | |||
} | |||
return android; | |||
} | |||
var svgDrawer = (function() { | |||
var Drawing = function (el, htOption) { | |||
this._el = el; | |||
this._htOption = htOption; | |||
}; | |||
Drawing.prototype.draw = function (oQRCode) { | |||
var _htOption = this._htOption; | |||
var _el = this._el; | |||
var nCount = oQRCode.getModuleCount(); | |||
var nWidth = Math.floor(_htOption.width / nCount); | |||
var nHeight = Math.floor(_htOption.height / nCount); | |||
this.clear(); | |||
function makeSVG(tag, attrs) { | |||
var el = document.createElementNS('http://www.w3.org/2000/svg', tag); | |||
for (var k in attrs) | |||
if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]); | |||
return el; | |||
} | |||
var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight}); | |||
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); | |||
_el.appendChild(svg); | |||
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"})); | |||
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"})); | |||
for (var row = 0; row < nCount; row++) { | |||
for (var col = 0; col < nCount; col++) { | |||
if (oQRCode.isDark(row, col)) { | |||
var child = makeSVG("use", {"x": String(col), "y": String(row)}); | |||
child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template") | |||
svg.appendChild(child); | |||
} | |||
} | |||
} | |||
}; | |||
Drawing.prototype.clear = function () { | |||
while (this._el.hasChildNodes()) | |||
this._el.removeChild(this._el.lastChild); | |||
}; | |||
return Drawing; | |||
})(); | |||
var useSVG = document.documentElement.tagName.toLowerCase() === "svg"; | |||
// Drawing in DOM by using Table tag | |||
var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () { | |||
var Drawing = function (el, htOption) { | |||
this._el = el; | |||
this._htOption = htOption; | |||
}; | |||
/** | |||
* Draw the QRCode | |||
* | |||
* @param {QRCode} oQRCode | |||
*/ | |||
Drawing.prototype.draw = function (oQRCode) { | |||
var _htOption = this._htOption; | |||
var _el = this._el; | |||
var nCount = oQRCode.getModuleCount(); | |||
var nWidth = Math.floor(_htOption.width / nCount); | |||
var nHeight = Math.floor(_htOption.height / nCount); | |||
var aHTML = ['<table style="border:0;border-collapse:collapse;">']; | |||
for (var row = 0; row < nCount; row++) { | |||
aHTML.push('<tr>'); | |||
for (var col = 0; col < nCount; col++) { | |||
aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>'); | |||
} | |||
aHTML.push('</tr>'); | |||
} | |||
aHTML.push('</table>'); | |||
_el.innerHTML = aHTML.join(''); | |||
// Fix the margin values as real size. | |||
var elTable = _el.childNodes[0]; | |||
var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2; | |||
var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2; | |||
if (nLeftMarginTable > 0 && nTopMarginTable > 0) { | |||
elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px"; | |||
} | |||
}; | |||
/** | |||
* Clear the QRCode | |||
*/ | |||
Drawing.prototype.clear = function () { | |||
this._el.innerHTML = ''; | |||
}; | |||
return Drawing; | |||
})() : (function () { // Drawing in Canvas | |||
function _onMakeImage() { | |||
this._elImage.src = this._elCanvas.toDataURL("image/png"); | |||
this._elImage.style.display = "block"; | |||
this._elCanvas.style.display = "none"; | |||
} | |||
// Android 2.1 bug workaround | |||
// http://code.google.com/p/android/issues/detail?id=5141 | |||
if (this._android && this._android <= 2.1) { | |||
var factor = 1 / window.devicePixelRatio; | |||
var drawImage = CanvasRenderingContext2D.prototype.drawImage; | |||
CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) { | |||
if (("nodeName" in image) && /img/i.test(image.nodeName)) { | |||
for (var i = arguments.length - 1; i >= 1; i--) { | |||
arguments[i] = arguments[i] * factor; | |||
} | |||
} else if (typeof dw == "undefined") { | |||
arguments[1] *= factor; | |||
arguments[2] *= factor; | |||
arguments[3] *= factor; | |||
arguments[4] *= factor; | |||
} | |||
drawImage.apply(this, arguments); | |||
}; | |||
} | |||
/** | |||
* Check whether the user's browser supports Data URI or not | |||
* | |||
* @private | |||
* @param {Function} fSuccess Occurs if it supports Data URI | |||
* @param {Function} fFail Occurs if it doesn't support Data URI | |||
*/ | |||
function _safeSetDataURI(fSuccess, fFail) { | |||
var self = this; | |||
self._fFail = fFail; | |||
self._fSuccess = fSuccess; | |||
// Check it just once | |||
if (self._bSupportDataURI === null) { | |||
var el = document.createElement("img"); | |||
var fOnError = function() { | |||
self._bSupportDataURI = false; | |||
if (self._fFail) { | |||
self._fFail.call(self); | |||
} | |||
}; | |||
var fOnSuccess = function() { | |||
self._bSupportDataURI = true; | |||
if (self._fSuccess) { | |||
self._fSuccess.call(self); | |||
} | |||
}; | |||
el.onabort = fOnError; | |||
el.onerror = fOnError; | |||
el.onload = fOnSuccess; | |||
el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data. | |||
return; | |||
} else if (self._bSupportDataURI === true && self._fSuccess) { | |||
self._fSuccess.call(self); | |||
} else if (self._bSupportDataURI === false && self._fFail) { | |||
self._fFail.call(self); | |||
} | |||
}; | |||
/** | |||
* Drawing QRCode by using canvas | |||
* | |||
* @constructor | |||
* @param {HTMLElement} el | |||
* @param {Object} htOption QRCode Options | |||
*/ | |||
var Drawing = function (el, htOption) { | |||
this._bIsPainted = false; | |||
this._android = _getAndroid(); | |||
this._htOption = htOption; | |||
this._elCanvas = document.createElement("canvas"); | |||
this._elCanvas.width = htOption.width; | |||
this._elCanvas.height = htOption.height; | |||
el.appendChild(this._elCanvas); | |||
this._el = el; | |||
this._oContext = this._elCanvas.getContext("2d"); | |||
this._bIsPainted = false; | |||
this._elImage = document.createElement("img"); | |||
this._elImage.alt = "Scan me!"; | |||
this._elImage.style.display = "none"; | |||
this._el.appendChild(this._elImage); | |||
this._bSupportDataURI = null; | |||
}; | |||
/** | |||
* Draw the QRCode | |||
* | |||
* @param {QRCode} oQRCode | |||
*/ | |||
Drawing.prototype.draw = function (oQRCode) { | |||
var _elImage = this._elImage; | |||
var _oContext = this._oContext; | |||
var _htOption = this._htOption; | |||
var nCount = oQRCode.getModuleCount(); | |||
var nWidth = _htOption.width / nCount; | |||
var nHeight = _htOption.height / nCount; | |||
var nRoundedWidth = Math.round(nWidth); | |||
var nRoundedHeight = Math.round(nHeight); | |||
_elImage.style.display = "none"; | |||
this.clear(); | |||
for (var row = 0; row < nCount; row++) { | |||
for (var col = 0; col < nCount; col++) { | |||
var bIsDark = oQRCode.isDark(row, col); | |||
var nLeft = col * nWidth; | |||
var nTop = row * nHeight; | |||
_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; | |||
_oContext.lineWidth = 1; | |||
_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; | |||
_oContext.fillRect(nLeft, nTop, nWidth, nHeight); | |||
// ์ํฐ ์จ๋ฆฌ์ด์ฑ ๋ฐฉ์ง ์ฒ๋ฆฌ | |||
_oContext.strokeRect( | |||
Math.floor(nLeft) + 0.5, | |||
Math.floor(nTop) + 0.5, | |||
nRoundedWidth, | |||
nRoundedHeight | |||
); | |||
_oContext.strokeRect( | |||
Math.ceil(nLeft) - 0.5, | |||
Math.ceil(nTop) - 0.5, | |||
nRoundedWidth, | |||
nRoundedHeight | |||
); | |||
} | |||
} | |||
this._bIsPainted = true; | |||
}; | |||
/** | |||
* Make the image from Canvas if the browser supports Data URI. | |||
*/ | |||
Drawing.prototype.makeImage = function () { | |||
if (this._bIsPainted) { | |||
_safeSetDataURI.call(this, _onMakeImage); | |||
} | |||
}; | |||
/** | |||
* Return whether the QRCode is painted or not | |||
* | |||
* @return {Boolean} | |||
*/ | |||
Drawing.prototype.isPainted = function () { | |||
return this._bIsPainted; | |||
}; | |||
/** | |||
* Clear the QRCode | |||
*/ | |||
Drawing.prototype.clear = function () { | |||
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); | |||
this._bIsPainted = false; | |||
}; | |||
/** | |||
* @private | |||
* @param {Number} nNumber | |||
*/ | |||
Drawing.prototype.round = function (nNumber) { | |||
if (!nNumber) { | |||
return nNumber; | |||
} | |||
return Math.floor(nNumber * 1000) / 1000; | |||
}; | |||
return Drawing; | |||
})(); | |||
/** | |||
* Get the type by string length | |||
* | |||
* @private | |||
* @param {String} sText | |||
* @param {Number} nCorrectLevel | |||
* @return {Number} type | |||
*/ | |||
function _getTypeNumber(sText, nCorrectLevel) { | |||
var nType = 1; | |||
var length = _getUTF8Length(sText); | |||
for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) { | |||
var nLimit = 0; | |||
switch (nCorrectLevel) { | |||
case QRErrorCorrectLevel.L : | |||
nLimit = QRCodeLimitLength[i][0]; | |||
break; | |||
case QRErrorCorrectLevel.M : | |||
nLimit = QRCodeLimitLength[i][1]; | |||
break; | |||
case QRErrorCorrectLevel.Q : | |||
nLimit = QRCodeLimitLength[i][2]; | |||
break; | |||
case QRErrorCorrectLevel.H : | |||
nLimit = QRCodeLimitLength[i][3]; | |||
break; | |||
} | |||
if (length <= nLimit) { | |||
break; | |||
} else { | |||
nType++; | |||
} | |||
} | |||
if (nType > QRCodeLimitLength.length) { | |||
throw new Error("Too long data"); | |||
} | |||
return nType; | |||
} | |||
function _getUTF8Length(sText) { | |||
var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a'); | |||
return replacedText.length + (replacedText.length != sText ? 3 : 0); | |||
} | |||
/** | |||
* @class QRCode | |||
* @constructor | |||
* @example | |||
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie"); | |||
* | |||
* @example | |||
* var oQRCode = new QRCode("test", { | |||
* text : "http://naver.com", | |||
* width : 128, | |||
* height : 128 | |||
* }); | |||
* | |||
* oQRCode.clear(); // Clear the QRCode. | |||
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode. | |||
* | |||
* @param {HTMLElement|String} el target element or 'id' attribute of element. | |||
* @param {Object|String} vOption | |||
* @param {String} vOption.text QRCode link data | |||
* @param {Number} [vOption.width=256] | |||
* @param {Number} [vOption.height=256] | |||
* @param {String} [vOption.colorDark="#000000"] | |||
* @param {String} [vOption.colorLight="#ffffff"] | |||
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] | |||
*/ | |||
QRCode = function (el, vOption) { | |||
this._htOption = { | |||
width : 256, | |||
height : 256, | |||
typeNumber : 4, | |||
colorDark : "#000000", | |||
colorLight : "#ffffff", | |||
correctLevel : QRErrorCorrectLevel.H | |||
}; | |||
if (typeof vOption === 'string') { | |||
vOption = { | |||
text : vOption | |||
}; | |||
} | |||
// Overwrites options | |||
if (vOption) { | |||
for (var i in vOption) { | |||
this._htOption[i] = vOption[i]; | |||
} | |||
} | |||
if (typeof el == "string") { | |||
el = document.getElementById(el); | |||
} | |||
if (this._htOption.useSVG) { | |||
Drawing = svgDrawer; | |||
} | |||
this._android = _getAndroid(); | |||
this._el = el; | |||
this._oQRCode = null; | |||
this._oDrawing = new Drawing(this._el, this._htOption); | |||
if (this._htOption.text) { | |||
this.makeCode(this._htOption.text); | |||
} | |||
}; | |||
/** | |||
* Make the QRCode | |||
* | |||
* @param {String} sText link data | |||
*/ | |||
QRCode.prototype.makeCode = function (sText) { | |||
this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel); | |||
this._oQRCode.addData(sText); | |||
this._oQRCode.make(); | |||
this._el.title = sText; | |||
this._oDrawing.draw(this._oQRCode); | |||
this.makeImage(); | |||
}; | |||
/** | |||
* Make the Image from Canvas element | |||
* - It occurs automatically | |||
* - Android below 3 doesn't support Data-URI spec. | |||
* | |||
* @private | |||
*/ | |||
QRCode.prototype.makeImage = function () { | |||
if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) { | |||
this._oDrawing.makeImage(); | |||
} | |||
}; | |||
/** | |||
* Clear the QRCode | |||
*/ | |||
QRCode.prototype.clear = function () { | |||
this._oDrawing.clear(); | |||
}; | |||
/** | |||
* @name QRCode.CorrectLevel | |||
*/ | |||
QRCode.CorrectLevel = QRErrorCorrectLevel; | |||
})(); |
@@ -0,0 +1,272 @@ | |||
var ZXing = null; | |||
var decodePtr = null; | |||
var stop_camera = false; | |||
var videoElement = document.getElementById('video'); | |||
var canvas = document.getElementById('pcCanvas'); | |||
var mobileCanvas = document.getElementById('mobileCanvas'); | |||
var ctx = canvas.getContext('2d'); | |||
var mobileCtx = mobileCanvas.getContext('2d'); | |||
var videoSelect = document.querySelector('select#videoSource'); | |||
var videoOption = document.getElementById('videoOption'); | |||
var buttonGo = document.getElementById('go'); | |||
var isPaused = false; | |||
var videoWidth = 640, | |||
videoHeight = 480; | |||
var mobileVideoWidth = 240, | |||
mobileVideoHeight = 320; | |||
var isPC = true; | |||
var tick = function () { | |||
if (window.ZXing) { | |||
ZXing = ZXing(); | |||
decodePtr = ZXing.Runtime.addFunction(decodeCallback); | |||
} else { | |||
setTimeout(tick, 10); | |||
} | |||
}; | |||
tick(); | |||
function stop_camera_now() { | |||
stop_camera = true; | |||
if ( stop_camera == true ) { // stop accessing camera | |||
if (window.stream) { | |||
window.stream.getTracks().forEach(function(track) { | |||
track.stop(); | |||
}); | |||
} | |||
//window.stream = ""; | |||
console.log("stopping camera"); | |||
canvas.style.display = 'none'; | |||
mobileCanvas.style.display = 'none'; | |||
buttonGo.disabled = false; | |||
qr_code_reader_div.style.display ='none'; | |||
} | |||
} | |||
var decodeCallback = function (ptr, len, resultIndex, resultCount) { | |||
var result = new Uint8Array(ZXing.HEAPU8.buffer, ptr, len); | |||
console.log("text found "+ String.fromCharCode.apply(null, result)); | |||
send_to_address.value = String.fromCharCode.apply(null, result); | |||
validate_dero_address(); // validate the address | |||
stop_camera_now(); // we have decoded something, so lets turn off the camera | |||
}; | |||
// check devices | |||
function browserRedirect() { | |||
var deviceType; | |||
var sUserAgent = navigator.userAgent.toLowerCase(); | |||
var bIsIpad = sUserAgent.match(/ipad/i) == "ipad"; | |||
var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os"; | |||
var bIsMidp = sUserAgent.match(/midp/i) == "midp"; | |||
var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4"; | |||
var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb"; | |||
var bIsAndroid = sUserAgent.match(/android/i) == "android"; | |||
var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce"; | |||
var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile"; | |||
if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) { | |||
deviceType = 'phone'; | |||
} else { | |||
deviceType = 'pc'; | |||
} | |||
return deviceType; | |||
} | |||
if (browserRedirect() == 'pc') { | |||
isPC = true; | |||
} else { | |||
isPC = false; | |||
} | |||
// stackoverflow: http://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata/5100158 | |||
function dataURItoBlob(dataURI) { | |||
// convert base64/URLEncoded data component to raw binary data held in a string | |||
var byteString; | |||
if (dataURI.split(',')[0].indexOf('base64') >= 0) | |||
byteString = atob(dataURI.split(',')[1]); | |||
else | |||
byteString = unescape(dataURI.split(',')[1]); | |||
// separate out the mime component | |||
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; | |||
// write the bytes of the string to a typed array | |||
var ia = new Uint8Array(byteString.length); | |||
for (var i = 0; i < byteString.length; i++) { | |||
ia[i] = byteString.charCodeAt(i); | |||
} | |||
return new Blob([ia], { | |||
type: mimeString | |||
}); | |||
} | |||
var qrcode_readerCanvas = document.createElement("canvas"); | |||
// scan barcode | |||
function scanBarcode() { | |||
if (ZXing == null) { | |||
buttonGo.disabled = false; | |||
alert("QRcode Reader is not ready!"); | |||
return; | |||
} | |||
var data = null, | |||
context = null, | |||
width = 0, | |||
height = 0, | |||
dbrCanvas = null; | |||
if (isPC) { | |||
context = ctx; | |||
width = videoWidth; | |||
height = videoHeight; | |||
dbrCanvas = canvas; | |||
} else { | |||
context = mobileCtx; | |||
width = mobileVideoWidth; | |||
height = mobileVideoHeight; | |||
dbrCanvas = mobileCanvas; | |||
} | |||
var err; | |||
//context.drawImage(videoElement, 0, 0, width, height); // draw image | |||
var vid = document.getElementById("video"); | |||
// console.log("video width: " + vid.videoWidth + ", height: " + vid.videoHeight); | |||
// we are using the original camera frame | |||
if (vid.videoWidth >= 1 && vid.videoHeight >= 1) { | |||
var imageWidth = videoElement.videoWidth | |||
var imageHeight = videoElement.videoHeight; | |||
qrcode_readerCanvas.width = vid.videoWidth; | |||