關於搶火車票的那些事兒(一)
阿新 • • 發佈:2018-11-08
關於搶火車票的那些事兒(一)
又到了年底了,沒到這個時候外出工作的人兒又開始犯愁了火車票的事兒~ 票不好買,於是黃牛呀,各種搶票軟體走進了大家的事業。 搶票軟體到底是怎麼做的呢? 正好最近工作不忙,我也比較感興趣,那就來探究一下。
據說用python 比較好,但是我沒學過python怎麼辦?
本著學習的目的我在Github上搜索12306,找了一個專案作為base code.
這個專案的程式碼總體說來還是比較規整,介紹上說是作者學習網路爬蟲的產物,我們就秉著學習的態度瞭解一下。
我的思路應該是: 登陸12306 查詢餘票 如果沒有我想要的車次就繼續查詢 有我想要的車次,就買買買啊
嗯,思路是這樣, 那還需要什麼工具呢? 瀏覽器總要有一個吧、 同時推薦抓包工具Fiddler~
先看了一眼程式碼裡面登陸12306的login程式碼 看到了一個讓人懵逼的URL,好長好長。。
還是自己動手看看這是什麼鬼吧~ 開Fiddler,開啟瀏覽器訪問12306購票的登陸頁,如果不是第一次訪問,請記得先清理Cookie
看下Fiddler的結果,看到了登陸頁的url
以及。。。 這個URL 並不是我們輸入的,但是事實上瀏覽器同時Get了這個url的頁面,並且返回了一個json資料包。 一般這種情況是瀏覽器執行了網站提供的JS。
返回的資料:
callbackFunction('{"exp":"1516684953759","dfp":"Obx0B8YpTc4w_TvvjFdnemQfr8qDcnOBWe-icB28BDZzz0tUvoetQnMerrd1wFpDX0fc_ctRLiFhogrQyrqa0crPAgKGxrpoFn_IFUaSOcgm-Ik9Fb7a46VnA2FEAuS79h0l0HhmyHhixL5oSWDfe4RleORr_5dT"}')
這個是幹什麼用的呢?
我們在網頁上登陸一下在抓包就會發現
對比上圖,我們會發現Cookie多了兩項,而且值就是那個URL返回的資料。
這下我們可以猜測: 訪問登入頁的時候,網站提供了JS給瀏覽器執行,執行的結果是動態取了兩個Value放進了Cookie裡面。。這樣瀏覽器可以正常訪問,一些簡單模擬https登陸的小軟體Cookie沒有這兩個值,可以不給登陸。。 66666
等等,我們跟程式碼裡面確認一下我們的猜測
但是我們怎麼獲取這個動態的URL呢?
我們先看看能不能看懂JS程式碼怎麼生成的吧
開啟瀏覽器除錯模式(F12)
壓縮過的。。太亂了,複製出來格式化一下吧。 2K多行的JS。。感興趣的可以看一下文末那些JS程式碼。
我反正是放棄讀懂它了。。
那還有沒有其他的路獲取這個Cookie資料呢? 可以執行JS呀,可以給python 掛個JS引擎。。雖然笨重。 但是我沒有這樣做,我是用C# Webbrowser 寫個個exe,exe的作用就是訪問登入頁,獲取Cookie並且寫入文字 然後Python再去讀文字獲取Cookie就好了。。
Cookie.txt的內容
JSESSIONID=69A073C9272D98E95296EC126BCEFD27; RAIL_DEVICEID=ji3AS1K5ZPE6dsmsd4GMrolxXkX9xPX1cXV0VXF4-3tuAc7MrLWQDmGtRB7GMGHs-LPdcQ8aEkynSmgTLUyQClBZedTxYLLTPyR40nDE8SBQhp2ZUT1D8nxubdw3sKq29dfSClTH_JRlxQvkKRqIbmEeDC_gwRnC; RAIL_EXPIRATION=1516506547281; route=495c805987d0f5c8c84b14f60212447d; BIGipServerotn=1708720394.64545.0000; BIGipServerpassport=786956554.50215.0000
誒,12306的機制果然不一般吶,這僅僅是登陸之前要準備的工作之一。。。
第一篇先寫到這裡吧~
參考JS
又到了年底了,沒到這個時候外出工作的人兒又開始犯愁了火車票的事兒~ 票不好買,於是黃牛呀,各種搶票軟體走進了大家的事業。 搶票軟體到底是怎麼做的呢? 正好最近工作不忙,我也比較感興趣,那就來探究一下。
據說用python 比較好,但是我沒學過python怎麼辦?
本著學習的目的我在Github上搜索12306,找了一個專案作為base code.
這個專案的程式碼總體說來還是比較規整,介紹上說是作者學習網路爬蟲的產物,我們就秉著學習的態度瞭解一下。
我的思路應該是: 登陸12306 查詢餘票 如果沒有我想要的車次就繼續查詢 有我想要的車次,就買買買啊
嗯,思路是這樣, 那還需要什麼工具呢? 瀏覽器總要有一個吧、 同時推薦抓包工具Fiddler~
先看了一眼程式碼裡面登陸12306的login程式碼 看到了一個讓人懵逼的URL,好長好長。。
url = 'https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=QRqR6wPyKZ&hashCode=lkUTDoJPpSm3zCb7GSoeajQQHkpHcXusReeMHhKXtMk&FMQw=0&q4f3=en-US&VySQ=FGH9RLTQe0Il8zvsUhAS0D1MpIRW0RrY&VPIf=1&custID=133&VEek=unknown&dzuS=0&yD16=1&EOQP=a6588b471456c0b2345c44dc367af87d&jp76=223017b546a29cfe7aa7f1efcefc0b88&hAqN=Win32&platform=WEB&ks0Q=ebda3f4fca91cb13d8a03858320fadbb&TeRS=777x1449&tOHY=24xx815x1449&Fvje=i1l1s1&q5aJ=-8&wNLf=99115dfb07133750ba677d055874de87&0aew={}&E3gR=009220e11f272d503c007d3cdb571082×tamp={}'.format( self.session.headers['User-Agent'], str(round(time.time() * 1000)))
還是自己動手看看這是什麼鬼吧~ 開Fiddler,開啟瀏覽器訪問12306購票的登陸頁,如果不是第一次訪問,請記得先清理Cookie
看下Fiddler的結果,看到了登陸頁的url
以及。。。 這個URL 並不是我們輸入的,但是事實上瀏覽器同時Get了這個url的頁面,並且返回了一個json資料包。 一般這種情況是瀏覽器執行了網站提供的JS。
返回的資料:
callbackFunction('{"exp":"1516684953759","dfp":"Obx0B8YpTc4w_TvvjFdnemQfr8qDcnOBWe-icB28BDZzz0tUvoetQnMerrd1wFpDX0fc_ctRLiFhogrQyrqa0crPAgKGxrpoFn_IFUaSOcgm-Ik9Fb7a46VnA2FEAuS79h0l0HhmyHhixL5oSWDfe4RleORr_5dT"}')
我們在網頁上登陸一下在抓包就會發現
對比上圖,我們會發現Cookie多了兩項,而且值就是那個URL返回的資料。
這下我們可以猜測: 訪問登入頁的時候,網站提供了JS給瀏覽器執行,執行的結果是動態取了兩個Value放進了Cookie裡面。。這樣瀏覽器可以正常訪問,一些簡單模擬https登陸的小軟體Cookie沒有這兩個值,可以不給登陸。。 66666
等等,我們跟程式碼裡面確認一下我們的猜測
果然是這樣,哈哈哈哈 but...問題來了,程式碼裡面寫死這個url,感覺非常不可取,我們可以發現瀏覽器執行JS的結果每次url都是不同的,這樣寫個死的,而且後面還帶個時間戳,如果網站有過期判定,那不是不能夠用了麼。。response = self.session.get(requests.utils.requote_uri(url)) pattern = re.compile('\(\'(.*?)\'\)') userVerify3 = eval(pattern.findall(response.text)[0]) print('設定cookie') print(userVerify3) railExpiration = userVerify3['exp'] railDeviceId = userVerify3['dfp'] self.session.cookies['RAIL_EXPIRATION'] = railExpiration self.session.cookies['RAIL_DEVICEID'] = railDeviceId
url = 'https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=QRqR6wPyKZ&hashCode=lkUTDoJPpSm3zCb7GSoeajQQHkpHcXusReeMHhKXtMk&FMQw=0&q4f3=en-US&VySQ=FGH9RLTQe0Il8zvsUhAS0D1MpIRW0RrY&VPIf=1&custID=133&VEek=unknown&dzuS=0&yD16=1&EOQP=a6588b471456c0b2345c44dc367af87d&jp76=223017b546a29cfe7aa7f1efcefc0b88&hAqN=Win32&platform=WEB&ks0Q=ebda3f4fca91cb13d8a03858320fadbb&TeRS=777x1449&tOHY=24xx815x1449&Fvje=i1l1s1&q5aJ=-8&wNLf=99115dfb07133750ba677d055874de87&0aew={}&E3gR=009220e11f272d503c007d3cdb571082×tamp={}'.format(
self.session.headers['User-Agent'], str(round(time.time() * 1000)))
忽然理解了為什麼搶票軟體更新那麼頻繁。。。。。。。
但是我們怎麼獲取這個動態的URL呢?
我們先看看能不能看懂JS程式碼怎麼生成的吧
開啟瀏覽器除錯模式(F12)
壓縮過的。。太亂了,複製出來格式化一下吧。 2K多行的JS。。感興趣的可以看一下文末那些JS程式碼。
我反正是放棄讀懂它了。。
那還有沒有其他的路獲取這個Cookie資料呢? 可以執行JS呀,可以給python 掛個JS引擎。。雖然笨重。 但是我沒有這樣做,我是用C# Webbrowser 寫個個exe,exe的作用就是訪問登入頁,獲取Cookie並且寫入文字 然後Python再去讀文字獲取Cookie就好了。。
try:
#Run C#程式獲取完成Cookie
os.system('Wpf12306.exe')
#win32api.ShellExecute(0, 'open', 'Wpf12306.exe', '', '', 0)
f = open("Cookie.txt", "r")
lines = f.readline()
f.close()
tuCookies = tuple(lines.split(";"))
for i in tuCookies:
tut = i.split("=")
self.session.cookies[tut[0]] = tut[1]
Cookie.txt的內容
JSESSIONID=69A073C9272D98E95296EC126BCEFD27; RAIL_DEVICEID=ji3AS1K5ZPE6dsmsd4GMrolxXkX9xPX1cXV0VXF4-3tuAc7MrLWQDmGtRB7GMGHs-LPdcQ8aEkynSmgTLUyQClBZedTxYLLTPyR40nDE8SBQhp2ZUT1D8nxubdw3sKq29dfSClTH_JRlxQvkKRqIbmEeDC_gwRnC; RAIL_EXPIRATION=1516506547281; route=495c805987d0f5c8c84b14f60212447d; BIGipServerotn=1708720394.64545.0000; BIGipServerpassport=786956554.50215.0000
誒,12306的機制果然不一般吶,這僅僅是登陸之前要準備的工作之一。。。
第一篇先寫到這裡吧~
參考JS
(function() {
function Qa() {
if ( - 1 == F("RAIL_EXPIRATION")) for (var a = 0; 10 > a; a++) G(function() { (new ja).getFingerPrint()
},
20 + 2E3 * Math.pow(a, 2));
else(new ja).getFingerPrint();
G(function() {
r.setInterval(function() { (new ja).getFingerPrint()
},
3E5)
},
3E5)
}
function nb(a) {
this.isTimeout = 0;
var b = this,
c = r.RTCPeerConnection || r.webkitRTCPeerConnection || r.mozRTCPeerConnection;
if ("function" == typeof c) {
try {
var d = new c({
iceServers: []
});
d.createDataChannel("", {
reliable: !1
})
} catch(f) {
if (2 != b.isTimeout) {
b.isTimeout = 1;
a();
return
}
}
var e = !1;
d.onicecandidate = function(c) {
var d = /([0-9]{1,3}(\.[0-9]{1,3}){3})/,
f = [];
"complete" != c.target.iceGatheringState || e || (e = !0, c.target.localDescription.sdp.split("\n").forEach(function(a) { (a = d.exec(a)) && "127.0.0.1" != a[1] && "0.0.0.0" != a[1] && -1 === f.indexOf(a[1]) && f.push(a[1])
}), 2 != b.isTimeout && (b.isTimeout = 1, a({
localAddr: 0 < f.length ? f.sort()[0] : ""
})))
};
d.onaddstream = function(a) {
remoteVideo.src = r.URL.createObjectURL(a.stream)
};
d.createOffer(function(a) {
d.setLocalDescription(a,
function() {},
function() {})
},
function() {},
{})
} else a();
G(function() {
0 == b.isTimeout && (b.isTimeout = 2, a())
},
500)
}
function ka(a) {
return Y.SHA256(a).toString(Y.enc.Base64)
}
function ob(a) {
var b = a.split(".");
if (4 !== b.length) throw Error("Invalid format -- expecting a.b.c.d");
for (var c = a = 0; c < b.length; ++c) {
var d = parseInt(b[c], 10);
if (Number.isNaN(d) || 0 > d || 255 < d) throw Error("Each octet must be between 0 and 255");
a |= d << 8 * (b.length - c - 1);
a >>>= 0
}
return a
}
function za(a) {
if (!a) return "";
if (pb(a)) return a.replace(/\s/g, ""); - 1 != a.indexOf("://") && (a = a.substr(a.indexOf("://") + 3));
var b = "com net org gov edu mil biz name info mobi pro travel museum int areo post rec".split(" "),
c = a.split(".");
if (1 >= c.length || !isNaN(c[c.length - 1])) return a;
for (a = 0; a < b.length && b[a] != c[c.length - 1];) a++;
if (a != b.length) return "." + c[c.length - 2] + "." + c[c.length - 1];
for (a = 0; a < b.length && b[a] != c[c.length - 2];) a++;
return a == b.length ? c[c.length - 2] + "." + c[c.length - 1] : "." + c[c.length - 3] + "." + c[c.length - 2] + "." + c[c.length - 1]
}
function Ra(a) {
return null != /[\\\"<>\.;]/.exec(a) && "undefined" != typeof encodeURIComponent ? encodeURIComponent(a) : a
}
function P(a, b) {
if (Sa) {
var c = b ? "visible": "hidden";
Q && J(a) ? J(a).style.visibility = c: Ta("#" + a, "visibility:" + c)
}
}
function Ta(a, b, c, d) {
if (!m.ie || !m.mac) {
var e = q.getElementsByTagName("head")[0];
e && (c = c && "string" == typeof c ? c: "screen", d && (Aa = L = null), L && Aa == c || (d = q.createElement("style"), d.setAttribute("type", "text/css"), d.setAttribute("media", c), L = e.appendChild(d), m.ie && m.win && "undefined" != typeof q.styleSheets && 0 < q.styleSheets.length && (L = q.styleSheets[q.styleSheets.length - 1]), Aa = c), m.ie && m.win ? L && "object" == typeof L.addRule && L.addRule(a, b) : L && "undefined" != typeof q.createTextNode && L.appendChild(q.createTextNode(a + " {" + b + "}")))
}
}
function la(a) {
var b = m.pv;
a = a.split(".");
a[0] = parseInt(a[0], 10);
a[1] = parseInt(a[1], 10) || 0;
a[2] = parseInt(a[2], 10) || 0;
return b[0] > a[0] || b[0] == a[0] && b[1] > a[1] || b[0] == a[0] && b[1] == a[1] && b[2] >= a[2] ? !0 : !1
}
function J(a) {
var b = null;
try {
b = q.getElementById(a)
} catch(c) {}
return b
}
function Ua(a) {
var b = J(a);
b && "OBJECT" == b.nodeName && (m.ie && m.win ? (b.style.display = "none",
function d() {
if (4 == b.readyState) {
var e = J(a);
if (e) {
for (var f in e)"function" == typeof e[f] && (e[f] = null);
e.parentNode.removeChild(e)
}
} else G(d, 10)
} ()) : b.parentNode.removeChild(b))
}
function Ba(a, b, c) {
var d, e = J(c);
if (m.wk && 312 > m.wk) return d;
if (e) if ("undefined" == typeof a.id && (a.id = c), m.ie && m.win) {
var f = "",
h;
for (h in a) a[h] != Object.prototype[h] && ("data" == h.toLowerCase() ? b.movie = a[h] : "styleclass" == h.toLowerCase() ? f += ' class\x3d"' + a[h] + '"': "classid" != h.toLowerCase() && (f += " " + h + '\x3d"' + a[h] + '"'));
h = "";
for (var p in b) b[p] != Object.prototype[p] && (h += '\x3cparam name\x3d"' + p + '" value\x3d"' + b[p] + '" /\x3e');
e.outerHTML = '\x3cobject classid\x3d"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + f + "\x3e" + h + "\x3c/object\x3e";
ma[ma.length] = a.id;
d = J(a.id)
} else {
p = q.createElement("object");
p.setAttribute("type", "application/x-shockwave-flash");
for (var g in a) a[g] != Object.prototype[g] && ("styleclass" == g.toLowerCase() ? p.setAttribute("class", a[g]) : "classid" != g.toLowerCase() && p.setAttribute(g, a[g]));
for (f in b) b[f] != Object.prototype[f] && "movie" != f.toLowerCase() && (a = p, h = f, g = b[f], c = q.createElement("param"), c.setAttribute("name", h), c.setAttribute("value", g), a.appendChild(c));
e.parentNode.replaceChild(p, e);
d = p
}
return d
}
function Ca(a) {
var b = q.createElement("div");
if (m.win && m.ie) b.innerHTML = a.innerHTML;
else if (a = a.getElementsByTagName("object")[0]) if (a = a.childNodes) for (var c = a.length,
d = 0; d < c; d++) 1 == a[d].nodeType && "PARAM" == a[d].nodeName || 8 == a[d].nodeType || b.appendChild(a[d].cloneNode(!0));
return b
}
function qb(a) {
if (m.ie && m.win && 4 != a.readyState) {
var b = q.createElement("div");
a.parentNode.insertBefore(b, a);
b.parentNode.replaceChild(Ca(a), b);
a.style.display = "none"; (function d() {
4 == a.readyState ? a.parentNode.removeChild(a) : G(d, 10)
})()
} else a.parentNode.replaceChild(Ca(a), a)
}
function Da(a, b, c, d) {
na = !0;
Ea = d || null;
Va = {
id: c,
success: !1
};
var e = J(c);
if (e) {
"OBJECT" == e.nodeName ? (Z = Ca(e), oa = null) : (Z = e, oa = c);
a.id = "SWFObjectExprInst";
if ("undefined" == typeof a.width || !/%$/.test(a.width) && 310 > parseInt(a.width, 10)) a.width = "310";
if ("undefined" == typeof a.height || !/%$/.test(a.height) && 137 > parseInt(a.height, 10)) a.height = "137";
q.title = q.title.slice(0, 47) + " - Flash Player Installation";
d = m.ie && m.win ? "ActiveX": "PlugIn";
d = "MMredirectURL\x3d" + I.location.toString().replace(/&/g, "%26") + "\x26MMplayerType\x3d" + d + "\x26MMdoctitle\x3d" + q.title;
b.flashvars = "undefined" != typeof b.flashvars ? b.flashvars + ("\x26" + d) : d;
m.ie && m.win && 4 != e.readyState && (d = q.createElement("div"), c += "SWFObjectNew", d.setAttribute("id", c), e.parentNode.insertBefore(d, e), e.style.display = "none",
function h() {
4 == e.readyState ? e.parentNode.removeChild(e) : G(h, 10)
} ());
Ba(a, b, c)
}
}
function Fa() {
return ! na && la("6.0.65") && (m.win || m.mac) && !(m.wk && 312 > m.wk)
}
function Ga(a) {
var b = null; (a = J(a)) && "OBJECT" == a.nodeName && ("undefined" != typeof a.SetVariable ? b = a: (a = a.getElementsByTagName("object")[0]) && (b = a));
return b
}
function Ha() {
var a = M.length;
if (0 < a) for (var b = 0; b < a; b++) {
var c = M[b].id,
d = M[b].callbackFn,
e = {
id: c,
success: !1
};
if (0 < m.pv[0]) {
var f = J(c);
if (f) if (!la(M[b].swfVersion) || m.wk && 312 > m.wk) if (M[b].expressInstall && Fa()) {
e = {};
e.data = M[b].expressInstall;
e.width = f.getAttribute("width") || "0";
e.height = f.getAttribute("height") || "0";
f.getAttribute("class") && (e.styleclass = f.getAttribute("class"));
f.getAttribute("align") && (e.align = f.getAttribute("align"));
for (var h = {},
f = f.getElementsByTagName("param"), p = f.length, g = 0; g < p; g++)"movie" != f[g].getAttribute("name").toLowerCase() && (h[f[g].getAttribute("name")] = f[g].getAttribute("value"));
Da(e, h, c, d)
} else qb(f),
d && d(e);
else P(c, !0),
d && (e.success = !0, e.ref = Ga(c), d(e))
} else P(c, !0),
d && ((c = Ga(c)) && "undefined" != typeof c.SetVariable && (e.success = !0, e.ref = c), d(e))
}
}
function Wa(a) {
if ("undefined" != typeof I.addEventListener) I.addEventListener("load", a, !1);
else if ("undefined" != typeof q.addEventListener) q.addEventListener("load", a, !1);
else if ("undefined" != typeof I.attachEvent) {
var b = I;
b.attachEvent("onload", a);
T[T.length] = [b, "onload", a]
} else if ("function" == typeof I.onload) {
var c = I.onload;
I.onload = function() {
c();
a()
}
} else I.onload = a
}
function Xa(a) {
Q ? a() : pa[pa.length] = a
}
function U() {
if (!Q) {
try {
var a = q.getElementsByTagName("body")[0].appendChild(q.createElement("span"));
a.parentNode.removeChild(a)
} catch(c) {
return
}
Q = !0;
for (var a = pa.length,
b = 0; b < a; b++) pa[b]()
}
}
function Ya(a) {
return 4294967296 * (a - (a | 0)) | 0
}
function aa(a) {
if (! (this instanceof aa)) return new aa(a);
this.options = this.extend(a, {
sortPluginsFor: [/palemoon/i],
detectScreenOrientation: !0,
swfPath: "flash/compiled/FontList.swf",
swfContainerId: "fingerprintjs2",
userDefinedFonts: []
});
this.nativeForEach = Array.prototype.forEach;
this.nativeMap = Array.prototype.map
}
function C(a, b, c, d, e, f, h) {
return A(b & d | c & ~d, a, b, e, f, h)
}
function ba(a) {
for (var b = [], c = (1 << ca) - 1, d = 0; d < a.length * ca; d += ca) b[d >> 5] |= (a.charCodeAt(d / ca) & c) << d % 32;
a = a.length * ca;
b[a >> 5] |= 128 << a % 32;
b[(a + 64 >>> 9 << 4) + 14] = a;
a = 1732584193;
for (var c = -271733879,
d = -1732584194,
e = 271733878,
f = 0; f < b.length; f += 16) {
var h = a,
p = c,
g = d,
m = e;
a = D(a, c, d, e, b[f + 0], 7, -680876936);
e = D(e, a, c, d, b[f + 1], 12, -389564586);
d = D(d, e, a, c, b[f + 2], 17, 606105819);
c = D(c, d, e, a, b[f + 3], 22, -1044525330);
a = D(a, c, d, e, b[f + 4], 7, -176418897);
e = D(e, a, c, d, b[f + 5], 12, 1200080426);
d = D(d, e, a, c, b[f + 6], 17, -1473231341);
c = D(c, d, e, a, b[f + 7], 22, -45705983);
a = D(a, c, d, e, b[f + 8], 7, 1770035416);
e = D(e, a, c, d, b[f + 9], 12, -1958414417);
d = D(d, e, a, c, b[f + 10], 17, -42063);
c = D(c, d, e, a, b[f + 11], 22, -1990404162);
a = D(a, c, d, e, b[f + 12], 7, 1804603682);
e = D(e, a, c, d, b[f + 13], 12, -40341101);
d = D(d, e, a, c, b[f + 14], 17, -1502002290);
c = D(c, d, e, a, b[f + 15], 22, 1236535329);
a = C(a, c, d, e, b[f + 1], 5, -165796510);
e = C(e, a, c, d, b[f + 6], 9, -1069501632);
d = C(d, e, a, c, b[f + 11], 14, 643717713);
c = C(c, d, e, a, b[f + 0], 20, -373897302);
a = C(a, c, d, e, b[f + 5], 5, -701558691);
e = C(e, a, c, d, b[f + 10], 9, 38016083);
d = C(d, e, a, c, b[f + 15], 14, -660478335);
c = C(c, d, e, a, b[f + 4], 20, -405537848);
a = C(a, c, d, e, b[f + 9], 5, 568446438);
e = C(e, a, c, d, b[f + 14], 9, -1019803690);
d = C(d, e, a, c, b[f + 3], 14, -187363961);
c = C(c, d, e, a, b[f + 8], 20, 1163531501);
a = C(a, c, d, e, b[f + 13], 5, -1444681467);
e = C(e, a, c, d, b[f + 2], 9, -51403784);
d = C(d, e, a, c, b[f + 7], 14, 1735328473);
c = C(c, d, e, a, b[f + 12], 20, -1926607734);
a = A(c ^ d ^ e, a, c, b[f + 5], 4, -378558);
e = A(a ^ c ^ d, e, a, b[f + 8], 11, -2022574463);
d = A(e ^ a ^ c, d, e, b[f + 11], 16, 1839030562);
c = A(d ^ e ^ a, c, d, b[f + 14], 23, -35309556);
a = A(c ^ d ^ e, a, c, b[f + 1], 4, -1530992060);
e = A(a ^ c ^ d, e, a, b[f + 4], 11, 1272893353);
d = A(e ^ a ^ c, d, e, b[f + 7], 16, -155497632);
c = A(d ^ e ^ a, c, d, b[f + 10], 23, -1094730640);
a = A(c ^ d ^ e, a, c, b[f + 13], 4, 681279174);
e = A(a ^ c ^ d, e, a, b[f + 0], 11, -358537222);
d = A(e ^ a ^ c, d, e, b[f + 3], 16, -722521979);
c = A(d ^ e ^ a, c, d, b[f + 6], 23, 76029189);
a = A(c ^ d ^ e, a, c, b[f + 9], 4, -640364487);
e = A(a ^ c ^ d, e, a, b[f + 12], 11, -421815835);
d = A(e ^ a ^ c, d, e, b[f + 15], 16, 530742520);
c = A(d ^ e ^ a, c, d, b[f + 2], 23, -995338651);
a = E(a, c, d, e, b[f + 0], 6, -198630844);
e = E(e, a, c, d, b[f + 7], 10, 1126891415);
d = E(d, e, a, c, b[f + 14], 15, -1416354905);
c = E(c, d, e, a, b[f + 5], 21, -57434055);
a = E(a, c, d, e, b[f + 12], 6, 1700485571);
e = E(e, a, c, d, b[f + 3], 10, -1894986606);
d = E(d, e, a, c, b[f + 10], 15, -1051523);
c = E(c, d, e, a, b[f + 1], 21, -2054922799);
a = E(a, c, d, e, b[f + 8], 6, 1873313359);
e = E(e, a, c, d, b[f + 15], 10, -30611744);
d = E(d, e, a, c, b[f + 6], 15, -1560198380);
c = E(c, d, e, a, b[f + 13], 21, 1309151649);
a = E(a, c, d, e, b[f + 4], 6, -145523070);
e = E(e, a, c, d, b[f + 11], 10, -1120210379);
d = E(d, e, a, c, b[f + 2], 15, 718787259);
c = E(c, d, e, a, b[f + 9], 21, -343485551);
a = N(a, h);
c = N(c, p);
d = N(d, g);
e = N(e, m)
}
b = [a, c, d, e];
a = "";
for (c = 0; c < 4 * b.length; c++) a += "0123456789abcdef".charAt(b[c >> 2] >> c % 4 * 8 + 4 & 15) + "0123456789abcdef".charAt(b[c >> 2] >> c % 4 * 8 & 15);
return a
}
function D(a, b, c, d, e, f, h) {
return A(b & c | ~b & d, a, b, e, f, h)
}
function N(a, b) {
var c = (a & 65535) + (b & 65535);
return (a >> 16) + (b >> 16) + (c >> 16) << 16 | c & 65535
}
function E(a, b, c, d, e, f, h) {
return A(c ^ (b | ~d), a, b, e, f, h)
}
function A(a, b, c, d, e, f) {
a = N(N(b, a), N(d, f));
return N(a << e | a >>> 32 - e, c)
}
function F(a) {
var b, c, d, e = u.cookie.split(";");
for (b = 0; b < e.length; b++) if (c = e[b].substr(0, e[b].indexOf("\x3d")), d = e[b].substr(e[b].indexOf("\x3d") + 1), c = c.replace(/^\s+|\s+$/g, ""), a = a.replace(/^\s+|\s+$/g, ""), c == a) return unescape(d)
}
function V(a, b, c, d, e, f) {
var h = new Date;
h.setTime(h.getTime()); - 1 != c ? (c *= 864E5, h = new Date(h.getTime() + c), cookieString = a + "\x3d" + escape(b) + (c ? ";expires\x3d" + h.toGMTString() : "") + (d ? ";path\x3d" + d: "") + (e ? ";domain\x3d" + e: "") + (f ? ";secure": "")) : (h = -1, cookieString = a + "\x3d" + escape(b) + (c ? ";expires\x3d" + h: "") + (d ? ";path\x3d" + d: "") + (e ? ";domain\x3d" + e: "") + (f ? ";secure": ""));
u.cookie = cookieString
}
function pb(a) {
a = a.replace(/\s/g, "");
if (/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(a)) {
a = a.split(".");
if (0 == parseInt(parseFloat(a[0])) || 0 == parseInt(parseFloat(a[3]))) return ! 1;
for (var b = 0; b < a.length; b++) if (255 < parseInt(parseFloat(a[b]))) return ! 1;
return ! 0
}
return ! 1
}
function l(a, b) {
this.key = a;
this.value = b
}
function V(a, b, c) {
var d = new Date;
d.setTime(d.getTime() + 864E5 * Number(c));
u.cookie = a + "\x3d" + b + "; path\x3d/;expires \x3d " + d.toGMTString() + ";domain\x3d" + za(r.location.host.split(":")[0])
}
function Ia() {
var a = g.userAgent.toLowerCase();
return 0 <= a.indexOf("windows phone") ? "WindowsPhone": 0 <= a.indexOf("win") ? "Windows": 0 <= a.indexOf("android") ? "Android": 0 <= a.indexOf("linux") ? "Linux": 0 <= a.indexOf("iphone") || 0 <= a.indexOf("ipad") ? "iOS": 0 <= a.indexOf("mac") ? "Mac": "Other"
}
function ja() {
this.ec = new evercookie;
this.deviceEc = new evercookie;
this.cfp = new aa;
this.packageString = "";
this.moreInfoArray = []
}
var u = document,
r = window,
g = navigator,
y = screen,
G = setTimeout,
rb = top,
sb = location,
tb = parent;
Array.prototype.indexOf || (Array.prototype.indexOf = function(a, b) {
var c;
if (null == this) throw new TypeError("'this' is null or undefined");
var d = Object(this),
e = d.length >>> 0;
if (0 === e) return - 1;
c = +b || 0;
Infinity === Math.abs(c) && (c = 0);
if (c >= e) return - 1;
for (c = Math.max(0 <= c ? c: e - Math.abs(c), 0); c < e;) {
if (c in d && d[c] === a) return c;
c++
}
return - 1
});
var Za = {
removeElem: function(a) {
var b = a.parentNode;
if (b) try {
b.removeChild(a)
} catch(c) {}
},
getJSON: function(a, b, c) {
b = u.createElement("script");
b.type = "text/javascript";
b.src = a;
b.id = "id_callbackFunction";
r.callbackFunction = function(a) {
r.callbackFunction = void 0;
var b = u.getElementById("id_callbackFunction");
b && Za.removeElem(b);
c(a)
}; (a = u.getElementsByTagName("head")) && a[0] && a[0].appendChild(b)
},
rand: function() {
return Math.random().toString().substr(2)
},
parseData: function(a) {
var b = "";
if ("string" === typeof a) b = a;
else if ("object" === typeof a) for (var c in a) b += "\x26" + c + "\x3d" + encodeURIComponent(a[c]);
b += "\x26_time\x3d" + this.now();
return b = b.substr(1)
},
now: function() {
return (new Date).getTime()
}
},
$a = ["WEB", "WAP"];
"object" != typeof JSON && (JSON = {}); (function() {
function a(a) {
return 10 > a ? "0" + a: a
}
function b() {
return this.valueOf()
}
function c(a) {
return n.lastIndex = 0,
n.test(a) ? '"' + a.replace(n,
function(a) {
var b = h[a];
return "string" == typeof b ? b: "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice( - 4)
}) + '"': '"' + a + '"'
}
function d(a, b) {
var v, h, z, B, k, g = e,
n = b[a];
switch (n && "object" == typeof n && "function" == typeof n.toJSON && (n = n.toJSON(a)), "function" == typeof p && (n = p.call(b, a, n)), typeof n) {
case "string":
return c(n);
case "number":
return isFinite(n) ? String(n) : "null";
case "boolean":
case "null":
return String(n);
case "object":
if (!n) return "null";
if (e += f, k = [], "[object Array]" === Object.prototype.toString.apply(n)) {
B = n.length;
for (v = 0; B > v; v += 1) k[v] = d(v, n) || "null";
return z = 0 === k.length ? "[]": e ? "[\n" + e + k.join(",\n" + e) + "\n" + g + "]": "[" + k.join(",") + "]",
e = g,
z
}
if (p && "object" == typeof p) for (B = p.length, v = 0; B > v; v += 1)"string" == typeof p[v] && (h = p[v], z = d(h, n), z && k.push(c(h) + (e ? ": ": ":") + z));
else for (h in n) Object.prototype.hasOwnProperty.call(n, h) && (z = d(h, n), z && k.push(c(h) + (e ? ": ": ":") + z));
return z = 0 === k.length ? "{}": e ? "{\n" + e + k.join(",\n" + e) + "\n" + g + "}": "{" + k.join(",") + "}",
e = g,
z
}
}
var e, f, h, p, g = /^[\],:{}\s]*$/,
m = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
K = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
k = /(?:^|:|,)(?:\s*\[)+/g,
n = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
l = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
"function" != typeof Date.prototype.toJSON && (Date.prototype.toJSON = function() {
return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + a(this.getUTCMonth() + 1) + "-" + a(this.getUTCDate()) + "T" + a(this.getUTCHours()) + ":" + a(this.getUTCMinutes()) + ":" + a(this.getUTCSeconds()) + "Z": null
},
Boolean.prototype.toJSON = b, Number.prototype.toJSON = b, String.prototype.toJSON = b);
"function" != typeof JSON.stringify && (h = {
"\r": "\\r",
"\b": "\\b",
'"': '\\"',
"\n": "\\n",
" ": "\\t",
"\f": "\\f",
"\\": "\\\\"
},
JSON.stringify = function(a, b, c) {
var v;
if (e = "", f = "", "number" == typeof c) for (v = 0; c > v; v += 1) f += " ";
else "string" == typeof c && (f = c);
if (p = b, b && "function" != typeof b && ("object" != typeof b || "number" != typeof b.length)) throw Error("JSON.stringify");
return d("", {
"": a
})
});
"function" != typeof JSON.parse && (JSON.parse = function(a, b) {
function c(a, d) {
var e, f, v = a[d];
if (v && "object" == typeof v) for (e in v) Object.prototype.hasOwnProperty.call(v, e) && (f = c(v, e), void 0 !== f ? v[e] = f: delete v[e]);
return b.call(a, d, v)
}
var d;
if (a = String(a), l.lastIndex = 0, l.test(a) && (a = a.replace(l,
function(a) {
return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice( - 4)
})), g.test(a.replace(m, "@").replace(K, "]").replace(k, ""))) return d = eval("(" + a + ")"),
"function" == typeof b ? c({
"": d
},
"") : d;
throw new SyntaxError("JSON.parse");
})
})();
debug = !1;
var Ja;
if (! (Ja = Y)) {
var da = Math,
qa = {},
ra = qa.lib = {},
ab = function() {},
ea = ra.Base = {
clone: function() {
return this.init.prototype.extend(this)
},
init: function() {},
extend: function(a) {
ab.prototype = this;
var b = new ab;
a && b.mixIn(a);
b.hasOwnProperty("init") || (b.init = function() {
b.$super.init.apply(this, arguments)
});
b.init.prototype = b;
b.$super = this;
return b
},
create: function() {
var a = this.extend();
a.init.apply(a, arguments);
return a
},
mixIn: function(a) {
for (var b in a) a.hasOwnProperty(b) && (this[b] = a[b]);
a.hasOwnProperty("toString") && (this.toString = a.toString)
}
},
fa = ra.WordArray = ea.extend({
clamp: function() {
var a = this.words,
b = this.sigBytes;
a[b >>> 2] &= 4294967295 << 32 - b % 4 * 8;
a.length = da.ceil(b / 4)
},
init: function(a, b) {
a = this.words = a || [];
this.sigBytes = void 0 != b ? b: 4 * a.length
},
random: function(a) {
for (var b = [], c = 0; c < a; c += 4) b.push(4294967296 * da.random() | 0);
return new fa.init(b, a)
},
concat: function(a) {
var b = this.words,
c = a.words,
d = this.sigBytes;
a = a.sigBytes;
this.clamp();
if (d % 4) for (var e = 0; e < a; e++) b[d + e >>> 2] |= (c[e >>> 2] >>> 24 - e % 4 * 8 & 255) << 24 - (d + e) % 4 * 8;
else if (65535 < c.length) for (e = 0; e < a; e += 4) b[d + e >>> 2] = c[e >>> 2];
else b.push.apply(b, c);
this.sigBytes += a;
return this
},
toString: function(a) {
return (a || ub).stringify(this)
},
clone: function() {
var a = ea.clone.call(this);
a.words = this.words.slice(0);
return a
}
}),
Ka = qa.enc = {},
ub = Ka.Hex = {
parse: function(a) {
for (var b = a.length,
c = [], d = 0; d < b; d += 2) c[d >>> 3] |= parseInt(a.substr(d, 2), 16) << 24 - d % 8 * 4;
return new fa.init(c, b / 2)
},
stringify: function(a) {
var b = a.words;
a = a.sigBytes;
for (var c = [], d = 0; d < a; d++) {
var e = b[d >>> 2] >>> 24 - d % 4 * 8 & 255;
c.push((e >>> 4).toString(16));
c.push((e & 15).toString(16))
}
return c.join("")
}
},
bb = Ka.Latin1 = {
parse: function(a) {
for (var b = a.length,
c = [], d = 0; d < b; d++) c[d >>> 2] |= (a.charCodeAt(d) & 255) << 24 - d % 4 * 8;
return new fa.init(c, b)
},
stringify: function(a) {
var b = a.words;
a = a.sigBytes;
for (var c = [], d = 0; d < a; d++) c.push(String.fromCharCode(b[d >>> 2] >>> 24 - d % 4 * 8 & 255));
return c.join("")
}
},
vb = Ka.Utf8 = {
stringify: function(a) {
try {
return decodeURIComponent(escape(bb.stringify(a)))
} catch(b) {
throw Error("Malformed UTF-8 data");
}
},
parse: function(a) {
return bb.parse(unescape(encodeURIComponent(a)))
}
},
cb = ra.BufferedBlockAlgorithm = ea.extend({
_minBufferSize: 0,
clone: function() {
var a = ea.clone.call(this);
a._data = this._data.clone();
return a
},
reset: function() {
this._data = new fa.init;
this._nDataBytes = 0
},
_append: function(a) {
"string" == typeof a && (a = vb.parse(a));
this._data.concat(a);
this._nDataBytes += a.sigBytes
},
_process: function(a) {
var b = this._data,
c = b.words,
d = b.sigBytes,
e = this.blockSize,
f = d / (4 * e),
f = a ? da.ceil(f) : da.max((f | 0) - this._minBufferSize, 0);
a = f * e;
d = da.min(4 * a, d);
if (a) {
for (var h = 0; h < a; h += e) this._doProcessBlock(c, h);
h = c.splice(0, a);
b.sigBytes -= d
}
return new fa.init(h, d)
}
});
ra.Hasher = cb.extend({
blockSize: 16,
_createHmacHelper: function(a) {
return function(b, c) {
return (new wb.HMAC.init(a, c)).finalize(b)
}
},
reset: function() {
cb.reset.call(this);
this._doReset()
},
finalize: function(a) {
a && this._append(a);
return this._doFinalize()
},
update: function(a) {
this._append(a);
this._process();
return this
},
cfg: ea.extend(),
_createHelper: function(a) {
return function(b, c) {
return (new a.init(c)).finalize(b)
}
},
init: function(a) {
this.cfg = this.cfg.extend(a);
this.reset()
}
});
var wb = qa.algo = {};
Ja = qa
}
for (var Y = Ja,
sa = Math,
ta = Y,
R = ta.lib,
xb = R.WordArray,
ua = R.Hasher,
R = ta.algo,
db = [], eb = [], va = 2, ga = 0; 64 > ga;) {
var W;
a: {
W = va;
for (var yb = sa.sqrt(W), La = 2; La <= yb; La++) if (! (W % La)) {
W = !1;
break a
}
W = !0
}
W && (8 > ga && (db[ga] = Ya(sa.pow(va, .5))), eb[ga] = Ya(sa.pow(va, 1 / 3)), ga++);
va++
}
var S = [],
R = R.SHA256 = ua.extend({
_doProcessBlock: function(a, b) {
for (var c = this._hash.words,
d = c[0], e = c[1], f = c[2], h = c[3], p = c[4], g = c[5], m = c[6], K = c[7], k = 0; 64 > k; k++) {
if (16 > k) S[k] = a[b + k] | 0;
else {
var n = S[k - 15],
l = S[k - 2];
S[k] = ((n << 25 | n >>> 7) ^ (n << 14 | n >>> 18) ^ n >>> 3) + S[k - 7] + ((l << 15 | l >>> 17) ^ (l << 13 | l >>> 19) ^ l >>> 10) + S[k - 16]
}
n = K + ((p << 26 | p >>> 6) ^ (p << 21 | p >>> 11) ^ (p << 7 | p >>> 25)) + (p & g ^ ~p & m) + eb[k] + S[k];
l = ((d << 30 | d >>> 2) ^ (d << 19 | d >>> 13) ^ (d << 10 | d >>> 22)) + (d & e ^ d & f ^ e & f);
K = m;
m = g;
g = p;
p = h + n | 0;
h = f;
f = e;
e = d;
d = n + l | 0
}
c[0] = c[0] + d | 0;
c[1] = c[1] + e | 0;
c[2] = c[2] + f | 0;
c[3] = c[3] + h | 0;
c[4] = c[4] + p | 0;
c[5] = c[5] + g | 0;
c[6] = c[6] + m | 0;
c[7] = c[7] + K | 0
},
_doFinalize: function() {
var a = this._data,
b = a.words,
c = 8 * this._nDataBytes,
d = 8 * a.sigBytes;
b[d >>> 5] |= 128 << 24 - d % 32;
b[(d + 64 >>> 9 << 4) + 14] = sa.floor(c / 4294967296);
b[(d + 64 >>> 9 << 4) + 15] = c;
a.sigBytes = 4 * b.length;
this._process();
return this._hash
},
_doReset: function() {
this._hash = new xb.init(db.slice(0))
},
clone: function() {
var a = ua.clone.call(this);
a._hash = this._hash.clone();
return a
}
});
ta.SHA256 = ua._createHelper(R);
ta.HmacSHA256 = ua._createHmacHelper(R);
var fb = Y,
zb = fb.lib.WordArray;
fb.enc.Base64 = {
parse: function(a) {
var b = a.length,
c = this._map,
d = c.charAt(64);
d && (d = a.indexOf(d), -1 != d && (b = d));
for (var d = [], e = 0, f = 0; f < b; f++) if (f % 4) {
var h = c.indexOf(a.charAt(f - 1)) << f % 4 * 2,
p = c.indexOf(a.charAt(f)) >>> 6 - f % 4 * 2;
d[e >>> 2] |= (h | p) << 24 - e % 4 * 8;
e++
}
return zb.create(d, e)
},
stringify: function(a) {
var b = a.words,
c = a.sigBytes,
d = this._map;
a.clamp();
a = [];
for (var e = 0; e < c; e += 3) for (var f = (b[e >>> 2] >>> 24 - e % 4 * 8 & 255) << 16 | (b[e + 1 >>> 2] >>> 24 - (e + 1) % 4 * 8 & 255) << 8 | b[e + 2 >>> 2] >>> 24 - (e + 2) % 4 * 8 & 255, h = 0; 4 > h && e + .75 * h < c; h++) a.push(d.charAt(f >>> 6 * (3 - h) & 63));
if (b = d.charAt(64)) for (; a.length % 4;) a.push(b);
return a.join("")
},
_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
};
var gb = {
browserVersion: "d435",
hasLiedLanguages: "j5po",
scrAvailSize: "TeRS",
localStorage: "XM7l",
hasLiedOs: "ci5c",
sessionStorage: "HVia",
indexedDb: "3sw-",
userAgent: "0aew",
userLanguage: "hLzX",
scrAvailHeight: "88tV",
browserName: "-UVA",
scrColorDepth: "qmyu",
hasLiedResolution: "3neK",
scrWidth: "ssI5",
adblock: "FMQw",
historyList: "kU5z",
touchSupport: "wNLf",
os: "hAqN",
scrDeviceXDPI: "3jCe",
doNotTrack: "VEek",
srcScreenSize: "tOHY",
openDatabase: "V8vl",
timeZone: "q5aJ",
appcodeName: "qT7b",
webSmartID: "E3gR",
systemLanguage: "e6OK",
hasLiedBrowser: "2xC5",
cpuClass: "Md7A",
javaEnabled: "yD16",
browserLanguage: "q4f3",
localCode: "lEnu",
cookieEnabled: "VPIf",
online: "9vyE",
appMinorVersion: "qBVW",
flashVersion: "dzuS",
mimeTypes: "jp76",
scrHeight: "5Jwy",
storeDb: "Fvje",
scrAvailWidth: "E-lJ",
jsFonts: "EOQP",
plugins: "ks0Q",
cookieCode: "VySQ"
},
X,
I = r,
q = u,
O = g,
hb = !1,
pa = [function() {
if (hb) {
var a = q.getElementsByTagName("body")[0],
b = q.createElement("object");
b.setAttribute("type", "application/x-shockwave-flash");
var c = a.appendChild(b);
if (c) {
var d = 0; (function f() {
if ("undefined" != typeof c.GetVariable) {
var h = c.GetVariable("$version");
h && (h = h.split(" ")[1].split(","), m.pv = [parseInt(h[0], 10), parseInt(h[1], 10), parseInt(h[2], 10)])
} else if (10 > d) {
d++;
G(f, 10);
return
}
a.removeChild(b);
c = null;
Ha()
})()
} else Ha()
} else Ha()
}],
M = [],
ma = [],
T = [],
Z,
oa,
Ea,
Va,
Q = !1,
na = !1,
L,
Aa,
Sa = !0,
m,
Ab = "undefined" != typeof q.getElementById && "undefined" != typeof q.getElementsByTagName && "undefined" != typeof q.createElement,
wa = O.userAgent.toLowerCase(),
xa = O.platform.toLowerCase(),
Bb = xa ? /win/.test(xa) : /win/.test(wa),
Cb = xa ? /mac/.test(xa) : /mac/.test(wa),
Db = /webkit/.test(wa) ? parseFloat(wa.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : !1,
Ma = !+"\x0B1",
ha = [0, 0, 0],
H = null;
if ("undefined" != typeof O.plugins && "object" == typeof O.plugins["Shockwave Flash"]) ! (H = O.plugins["Shockwave Flash"].description) || "undefined" != typeof O.mimeTypes && O.mimeTypes["application/x-shockwave-flash"] && !O.mimeTypes["application/x-shockwave-flash"].enabledPlugin || (hb = !0, Ma = !1, H = H.replace(/^.*\s+(\S+\s+\S+$)/, "$1"), ha[0] = parseInt(H.replace(/^(.*)\..*$/, "$1"), 10), ha[1] = parseInt(H.replace(/^.*\.(.*)\s.*$/, "$1"), 10), ha[2] = /[a-zA-Z]/.test(H) ? parseInt(H.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0);
else if ("undefined" != typeof I.ActiveXObject) try {
if (H = (new ActiveXObject("ShockwaveFlash.ShockwaveFlash")).GetVariable("$version")) Ma = !0,
H = H.split(" ")[1].split(","),
ha = [parseInt(H[0], 10), parseInt(H[1], 10), parseInt(H[2], 10)]
} catch(a) {}
m = {
pv: ha,
win: Bb,
ie: Ma,
mac: Cb,
wk: Db,
w3: Ab
};
m.w3 && (("undefined" != typeof q.readyState && "complete" == q.readyState || "undefined" == typeof q.readyState && (q.getElementsByTagName("body")[0] || q.body)) && U(), Q || ("undefined" != typeof q.addEventListener && q.addEventListener("DOMContentLoaded", U, !1), m.ie && m.win && (q.attachEvent("onreadystatechange",
function b() {
"complete" == q.readyState && (q.detachEvent("onreadystatechange", b), U())
}), I == rb &&
function c() {
if (!Q) {
try {
q.documentElement.doScroll("left")
} catch(d) {
G(c, 0);
return
}
U()
}
} ()), m.wk &&
function b() {
Q || (/loaded|complete/.test(q.readyState) ? U() : G(b, 0))
} (), Wa(U)));
m.ie && m.win && r.attachEvent("onunload",
function() {
for (var a = T.length,
b = 0; b < a; b++) T[b][0].detachEvent(T[b][1], T[b][2]);
a = ma.length;
for (b = 0; b < a; b++) Ua(ma[b]);
for (var c in m) m[c] = null;
m = null;
for (var d in X) X[d] = null;
X = null
});
X = {
registerObject: function(a, b, c, d) {
if (m.w3 && a && b) {
var e = {};
e.id = a;
e.swfVersion = b;
e.expressInstall = c;
e.callbackFn = d;
M[M.length] = e;
P(a, !1)
} else d && d({
id: a,
success: !1
})
},
getFlashPlayerVersion: function() {
return {
minor: m.pv[1],
release: m.pv[2],
major: m.pv[0]
}
},
getObjectById: function(a) {
if (m.w3) return Ga(a)
},
createCSS: function(a, b, c, d) {
m.w3 && Ta(a, b, c, d)
},
ua: m,
switchOffAutoHideShow: function() {
Sa = !1
},
expressInstallCallback: function() {
if (na) {
var a = J("SWFObjectExprInst");
a && Z && (a.parentNode.replaceChild(Z, a), oa && (P(oa, !0), m.ie && m.win && (Z.style.display = "block")), Ea && Ea(Va));
na = !1
}
},
showExpressInstall: function(a, b, c, d) {
m.w3 && Fa() && Da(a, b, c, d)
},
createSWF: function(a, b, c) {
if (m.w3) return Ba(a, b, c)
},
embedSWF: function(a, b, c, d, e, f, h, p, g, l) {
var K = {
id: b,
success: !1
};
m.w3 && !(m.wk && 312 > m.wk) && a && b && c && d && e ? (P(b, !1), Xa(function() {
c += "";
d += "";
var k = {};
if (g && "object" === typeof g) for (var n in g) k[n] = g[n];
k.data = a;
k.width = c;
k.height = d;
n = {};
if (p && "object" === typeof p) for (var m in p) n[m] = p[m];
if (h && "object" === typeof h) for (var q in h) n.flashvars = "undefined" != typeof n.flashvars ? n.flashvars + ("\x26" + q + "\x3d" + h[q]) : q + "\x3d" + h[q];
if (la(e)) m = Ba(k, n, b),
k.id == b && P(b, !0),
K.success = !0,
K.ref = m;
else {
if (f && Fa()) {
k.data = f;
Da(k, n, b, l);
return
}
P(b, !0)
}
l && l(K)
})) : l && l(K)
},
removeSWF: function(a) {
m.w3 && Ua(a)
},
addLoadEvent: Wa,
hasFlashPlayerVersion: la,
addDomLoadEvent: Xa,
getQueryParamValue: function(a) {
var b = q.location.search || q.location.hash;
if (b) { / \ ? /.test(b)&&(b=b.split("?")[1]);if(null==a)return Ra(b);for(var b=b.split("\x26"),c=0;c<b.length;c++)if(b[c].substring(0,
b[c].indexOf("\x3d"))==a)return Ra(b[c].substring(b[c].indexOf("\x3d")+1))}return""}};var ca=8,Eb=["scrAvailWidth","scrAvailHeight"],Fb=["sessionStorage","localStorage","indexedDb","openDatabase"],Gb="appCodeName appMinorVersion appName cpuClass onLine systemLanguage userLanguage historyList hasLiedLanguages hasLiedResolution hasLiedOs hasLiedBrowser".split(" ");aa.prototype={isCanvasSupported:function(){var a=u.createElement("canvas");return!(!a.getContext||!a.getContext("2d"))},sessionStorageKey:function(a){!this.options.excludeSessionStorage&&
this.hasSessionStorage()&&a.push({key:"session_storage",value:1});return a},x64Rotl:function(a,b){b%=64;if(32===b)return[a[1],a[0]];if(32>b)return[a[0]<<b|a[1]>>>32-b,a[1]<<b|a[0]>>>32-b];b-=32;return[a[1]<<b|a[0]>>>32-b,a[0]<<b|a[1]>>>32-b]},pixelRatioKey:function(a){this.options.excludePixelRatio||a.push({value:this.getPixelRatio(),key:"pixel_ratio"});return a},getHasLiedResolution:function(){return y.width<y.availWidth||y.height<y.availHeight?!0:!1},hasSessionStorage:function(){try{return!!r.sessionStorage}catch(a){return!0}},
getAdBlock:function(){var a=u.createElement("div");a.innerHTML="\x26nbsp;";a.className="adsbox";var b="0";try{u.body.appendChild(a),0===u.getElementsByClassName("adsbox")[0].offsetHeight&&(b="1"),u.body.removeChild(a)}catch(c){b="0"}return b},screenResolutionKey:function(a){return this.options.excludeScreenResolution?a:this.getScreenResolution(a)},getHasLiedBrowser:function(){var a=g.userAgent.toLowerCase(),b=g.productSub,a=0<=a.indexOf("firefox")?"Firefox":0<=a.indexOf("opera")||0<=a.indexOf("opr")?
"Opera":0<=a.indexOf("chrome")?"Chrome":0<=a.indexOf("safari")?"Safari":0<=a.indexOf("trident")?"Internet Explorer":"Other";if(("Chrome"===a||"Safari"===a||"Opera"===a)&&"20030107"!==b)return!0;b=eval.toString().length;if(37===b&&"Safari"!==a&&"Firefox"!==a&&"Other"!==a||39===b&&"Internet Explorer"!==a&&"Other"!==a||33===b&&"Chrome"!==a&&"Opera"!==a&&"Other"!==a)return!0;var c;try{throw"a";}catch(d){try{d.toSource(),c=!0}catch(e){c=!1}}return c&&"Firefox"!==a&&"Other"!==a?!0:!1},map:function(a,b,
c){var d=[];if(null==a)return d;if(this.nativeMap&&a.map===this.nativeMap)return a.map(b,c);this.each(a,function(a,f,h){d[d.length]=b.call(c,a,f,h)});return d},languageKey:function(a){this.options.excludeLanguage||a.push({key:"language",value:g.language||g.userLanguage||g.browserLanguage||g.systemLanguage||""});return a},hasSwfObjectLoaded:function(){return"undefined"!==typeof r.swfobject},extend:function(a,b){if(null==a)return b;for(var c in a)null!=a[c]&&b[c]!==a[c]&&(b[c]=a[c]);return b},touchSupportKey:function(a){this.options.excludeTouchSupport||
a.push({key:"touch_support",value:this.getTouchSupport()});return a},x64hash128:function(a,b){a=a||"";b=b||0;for(var c=a.length%16,d=a.length-c,e=[0,b],f=[0,b],h,p,g=[2277735313,289559509],m=[1291169091,658871167],l=0;l<d;l+=16)h=[a.charCodeAt(l+4)&255|(a.charCodeAt(l+5)&255)<<8|(a.charCodeAt(l+6)&255)<<16|(a.charCodeAt(l+7)&255)<<24,a.charCodeAt(l)&255|(a.charCodeAt(l+1)&255)<<8|(a.charCodeAt(l+2)&255)<<16|(a.charCodeAt(l+3)&255)<<24],p=[a.charCodeAt(l+12)&255|(a.charCodeAt(l+13)&255)<<8|(a.charCodeAt(l+
14)&255)<<16|(a.charCodeAt(l+15)&255)<<24,a.charCodeAt(l+8)&255|(a.charCodeAt(l+9)&255)<<8|(a.charCodeAt(l+10)&255)<<16|(a.charCodeAt(l+11)&255)<<24],h=this.x64Multiply(h,g),h=this.x64Rotl(h,31),h=this.x64Multiply(h,m),e=this.x64Xor(e,h),e=this.x64Rotl(e,27),e=this.x64Add(e,f),e=this.x64Add(this.x64Multiply(e,[0,5]),[0,1390208809]),p=this.x64Multiply(p,m),p=this.x64Rotl(p,33),p=this.x64Multiply(p,g),f=this.x64Xor(f,p),f=this.x64Rotl(f,31),f=this.x64Add(f,e),f=this.x64Add(this.x64Multiply(f,[0,5]),
[0,944331445]);h=[0,0];p=[0,0];switch(c){case 15:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+14)],48));case 14:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+13)],40));case 13:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+12)],32));case 12:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+11)],24));case 11:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+10)],16));case 10:p=this.x64Xor(p,this.x64LeftShift([0,a.charCodeAt(l+9)],8));case 9:p=this.x64Xor(p,[0,a.charCodeAt(l+8)]),
p=this.x64Multiply(p,m),p=this.x64Rotl(p,33),p=this.x64Multiply(p,g),f=this.x64Xor(f,p);case 8:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+7)],56));case 7:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+6)],48));case 6:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+5)],40));case 5:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+4)],32));case 4:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+3)],24));case 3:h=this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+2)],16));case 2:h=
this.x64Xor(h,this.x64LeftShift([0,a.charCodeAt(l+1)],8));case 1:h=this.x64Xor(h,[0,a.charCodeAt(l)]),h=this.x64Multiply(h,g),h=this.x64Rotl(h,31),h=this.x64Multiply(h,m),e=this.x64Xor(e,h)}e=this.x64Xor(e,[0,a.length]);f=this.x64Xor(f,[0,a.length]);e=this.x64Add(e,f);f=this.x64Add(f,e);e=this.x64Fmix(e);f=this.x64Fmix(f);e=this.x64Add(e,f);f=this.x64Add(f,e);return("00000000"+(e[0]>>>0).toString(16)).slice(-8)+("00000000"+(e[1]>>>0).toString(16)).slice(-8)+("00000000"+(f[0]>>>0).toString(16)).slice(-8)+
("00000000"+(f[1]>>>0).toString(16)).slice(-8)},pluginsKey:function(a){this.options.excludePlugins||(this.isIE()?this.options.excludeIEPlugins||a.push({value:this.getIEPlugins(),key:"ie_plugins"}):a.push({value:this.getRegularPlugins(),key:"regular_plugins"}));return a},hasLiedLanguagesKey:function(a){this.options.excludeHasLiedLanguages||a.push({key:"has_lied_languages",value:this.getHasLiedLanguages()});return a},getCanvasFp:function(){var a=[],b=u.createElement("canvas");b.width=2E3;b.height=200;
b.style.display="inline";var c=b.getContext("2d");c.rect(0,0,10,10);c.rect(2,2,6,6);a.push("canvas winding:"+(!1===c.isPointInPath(5,5,"evenodd")?"yes":"no"));c.textBaseline="alphabetic";c.fillStyle="#f60";c.fillRect(125,1,62,20);c.fillStyle="#069";c.font=this.options.dontUseFakeFontInCanvas?"11pt Arial":"11pt no-real-font-123";c.fillText("Cwm fjordbank glyphs vext quiz, \ud83d\ude03",2,15);c.fillStyle="rgba(102, 204, 0, 0.2)";c.font="18pt Arial";c.fillText("Cwm fjordbank glyphs vext quiz, \ud83d\ude03",
4,45);c.globalCompositeOperation="multiply";c.fillStyle="rgb(255,0,255)";c.beginPath();c.arc(50,50,50,0,2*Math.PI,!0);c.closePath();c.fill();c.fillStyle="rgb(0,255,255)";c.beginPath();c.arc(100,50,50,0,2*Math.PI,!0);c.closePath();c.fill();c.fillStyle="rgb(255,255,0)";c.beginPath();c.arc(75,100,50,0,2*Math.PI,!0);c.closePath();c.fill();c.fillStyle="rgb(255,0,255)";c.arc(75,75,75,0,2*Math.PI,!0);c.arc(75,75,25,0,2*Math.PI,!0);c.fill("evenodd");a.push("canvas fp:"+b.toDataURL());return a.join("~")},
platformKey:function(a){this.options.excludePlatform||a.push({value:this.getNavigatorPlatform(),key:"navigator_platform"});return a},getWebglFp:function(){function a(a){b.clearColor(0,0,0,1);b.enable(b.DEPTH_TEST);b.depthFunc(b.LEQUAL);b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);return"["+a[0]+", "+a[1]+"]"}var b;b=this.getWebglCanvas();if(!b)return null;var c=[],d=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,d);var e=new Float32Array([-.2,-.9,0,.4,-.26,0,0,.732134444,0]);b.bufferData(b.ARRAY_BUFFER,
e,b.STATIC_DRAW);d.itemSize=3;d.numItems=3;var e=b.createProgram(),f=b.createShader(b.VERTEX_SHADER);b.shaderSource(f,"attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate\x3dattrVertex+uniformOffset;gl_Position\x3dvec4(attrVertex,0,1);}");b.compileShader(f);var h=b.createShader(b.FRAGMENT_SHADER);b.shaderSource(h,"precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor\x3dvec4(varyinTexCoordinate,0,1);}");
b.compileShader(h);b.attachShader(e,f);b.attachShader(e,h);b.linkProgram(e);b.useProgram(e);e.vertexPosAttrib=b.getAttribLocation(e,"attrVertex");e.offsetUniform=b.getUniformLocation(e,"uniformOffset");b.enableVertexAttribArray(e.vertexPosArray);b.vertexAttribPointer(e.vertexPosAttrib,d.itemSize,b.FLOAT,!1,0,0);b.uniform2f(e.offsetUniform,1,1);b.drawArrays(b.T