You can try jsnice
which always does a fantastic job.
'use strict';
/**
* @param {!Object} value
* @param {string} s
* @param {string} name
* @return {?}
*/
var f = function(value, s, name) {
if (s = typeof value, "object" == s) {
if (value) {
if (value instanceof Array) {
return "array";
}
if (value instanceof Object) {
return s;
}
if (name = Object.prototype.toString.call(value), "[object Window]" == name) {
return "object";
}
if ("[object Array]" == name || "number" == typeof value.length && "undefined" != typeof value.splice && "undefined" != typeof value.propertyIsEnumerable && !value.propertyIsEnumerable("splice")) {
return "array";
}
if ("[object Function]" == name || "undefined" != typeof value.call && "undefined" != typeof value.propertyIsEnumerable && !value.propertyIsEnumerable("call")) {
return "function";
}
} else {
return "null";
}
} else {
if ("function" == s && "undefined" == typeof value.call) {
return "object";
}
}
return s;
};
/**
* @param {string} n
* @param {string} v
* @param {string} d
* @param {!Object} a
* @param {string} i
* @return {undefined}
*/
var n = function(n, v, d, a, i) {
d = n.split(".");
a = g;
if (!(d[0] in a || !a.execScript)) {
a.execScript("var " + d[0]);
}
for (; d.length && (i = d.shift());) {
if (d.length || v === k) {
a = a[i] ? a[i] : a[i] = {};
} else {
/** @type {string} */
a[i] = v;
}
}
};
/** @type {function(): number} */
var p = Date.now || function() {
return +new Date;
};
/** @type {!RegExp} */
var r = /&/g;
/** @type {!RegExp} */
var t = /</g;
/** @type {!RegExp} */
var u = />/g;
/** @type {!RegExp} */
var w = /"/g;
/** @type {!RegExp} */
var x = /'/g;
var k = void 0;
/** @type {!global this} */
var g = this;
var z;
var A = "".oa ? "".ma() : "";
/** @type {function(number, string, string, number, number, number): undefined} */
var E = (/[&<>"']/.test(A) && (-1 != A.indexOf("&") && (A = A.replace(r, "&")), -1 != A.indexOf("<") && (A = A.replace(t, "<")), -1 != A.indexOf(">") && (A = A.replace(u, ">")), -1 != A.indexOf('"') && (A = A.replace(w, """)), -1 != A.indexOf("'") && (A = A.replace(x, "'"))), new function() {
p();
}, function(val, orig, c, len, i, d) {
try {
if (this.j = 2048, this.c = [], B(this, this.b, 0), B(this, this.l, 0), B(this, this.p, 0), B(this, this.h, []), B(this, this.d, []), B(this, this.H, "object" == typeof window ? window : g), B(this, this.I, this), B(this, this.r, 0), B(this, this.F, 0), B(this, this.G, 0), B(this, this.f, C(4)), B(this, this.o, []), B(this, this.k, {}), this.q = true, val && "," == val[0]) {
/** @type {number} */
this.m = val;
} else {
if (window.atob) {
c = window.atob(val);
/** @type {!Array} */
val = [];
/** @type {number} */
i = len = 0;
for (; i < c.length; i++) {
d = c.charCodeAt(i);
for (; 255 < d;) {
/** @type {number} */
val[len++] = d & 255;
/** @type {number} */
d = d >> 8;
}
/** @type {number} */
val[len++] = d;
}
/** @type {number} */
orig = val;
} else {
/** @type {null} */
orig = null;
}
if ((this.e = orig) && this.e.length) {
/** @type {!Array} */
this.K = [];
this.s();
} else {
this.g(this.U);
}
}
} catch (item) {
D(this, item);
}
});
/** @type {function(!Object, !Function, !NodeList, number, !NodeList, number): undefined} */
var G = (E.prototype.g = function(e, d, s, index) {
index = this.a(this.l);
/** @type {!Array} */
e = [e, index >> 8 & 255, index & 255];
if (s != k) {
e.push(s);
}
if (0 == this.a(this.h).length) {
this.c[this.h] = k;
B(this, this.h, e);
}
/** @type {string} */
s = "";
if (d) {
if (d.message) {
/** @type {string} */
s = s + d.message;
}
if (d.stack) {
/** @type {string} */
s = s + (":" + d.stack);
}
}
if (3 < this.j) {
/** @type {string} */
s = s.slice(0, this.j - 3);
this.j -= s.length + 3;
s = F(s);
G(this, this.f, H(s.length, 2).concat(s), this.$);
}
}, function(data, type, b, len, c, p) {
c = data.a(type);
/** @type {!Function} */
type = type == data.f ? function(b, j, x, d) {
if (j = c.length, x = j - 4 >> 3, c.ba != x) {
/** @type {number} */
c.ba = x;
/** @type {number} */
x = (x << 3) - 4;
/** @type {!Array} */
d = [0, 0, 0, data.a(data.G)];
try {
c.aa = I(J(c, x), J(c, x + 4), d);
} catch (s) {
throw s;
}
}
c.push(c.aa[j & 7] ^ b);
} : function(block) {
c.push(block);
};
if (len) {
type(len & 255);
}
len = b.length;
/** @type {number} */
p = 0;
for (; p < len; p++) {
type(b[p]);
}
});
/**
* @param {!Array} value
* @param {string} b
* @param {!Function} x
* @param {!Function} v
* @param {!Object} self
* @param {string} root
* @param {string} string
* @param {!Array} n
* @param {string} fn
* @return {?}
*/
var K = function(value, b, x, v, self, root, string, n, fn) {
return x = function(o, a, f) {
o = v[self.D];
/** @type {boolean} */
a = o === b;
o = o && o[self.D];
/** @type {number} */
f = 0;
for (; o && o != root && o != string && o != n && o != fn && 20 > f;) {
f++;
o = o[self.D];
}
return x[self.ga + a + !(!o + (f >> 2))];
}, v = function() {
return x();
}, self = E.prototype, root = self.s, string = self.Q, fn = self.g, n = E, v[self.J] = self, x[self.fa] = value, value = k, v;
};
/**
* @param {!Object} data
* @param {string} key
* @param {!Array} options
* @return {?}
*/
var L = function(data, key, options) {
if (key = data.a(data.b), !(key in data.e)) {
throw data.g(data.Y), data.u;
}
return data.t == k && (data.t = J(data.e, key - 4), data.B = k), data.B != key >> 3 && (data.B = key >> 3, options = [0, 0, 0, data.a(data.p)], data.Z = I(data.t, data.B, options)), B(data, data.b, key + 1), data.e[key] ^ data.Z[key % 8];
};
/**
* @param {string} a
* @param {!Object} b
* @param {number} i
* @param {number} n
* @param {number} c
* @return {?}
*/
var F = function(a, b, i, n, c) {
a = a.replace(/\\r\\n/g, "\\n");
/** @type {!Array} */
b = [];
/** @type {number} */
n = i = 0;
for (; n < a.length; n++) {
c = a.charCodeAt(n);
if (128 > c) {
/** @type {number} */
b[i++] = c;
} else {
if (2048 > c) {
/** @type {number} */
b[i++] = c >> 6 | 192;
} else {
/** @type {number} */
b[i++] = c >> 12 | 224;
/** @type {number} */
b[i++] = c >> 6 & 63 | 128;
}
/** @type {number} */
b[i++] = c & 63 | 128;
}
}
return b;
};
/**
* @param {!Object} a
* @param {!Function} b
* @param {?} c
* @return {undefined}
*/
var B = function(a, b, c) {
if (b == a.b || b == a.l) {
if (a.c[b]) {
a.c[b].V(c);
} else {
a.c[b] = M(c);
}
} else {
if (b != a.d && b != a.f && b != a.h || !a.c[b]) {
a.c[b] = K(c, a.a);
}
}
if (b == a.p) {
a.t = k;
B(a, a.b, a.a(a.b) + 4);
}
};
/**
* @param {number} b
* @param {number} c
* @param {!Array} d
* @param {number} a
* @return {?}
*/
var I = function(b, c, d, a) {
try {
/** @type {number} */
a = 0;
for (; 76138654016 != a;) {
b = b + ((c << 4 ^ c >>> 5) + c ^ a + d[a & 3]);
/** @type {number} */
a = a + 2379332938;
c = c + ((b << 4 ^ b >>> 5) + b ^ a + d[a >>> 11 & 3]);
}
return [b >>> 24, b >> 16 & 255, b >> 8 & 255, b & 255, c >>> 24, c >> 16 & 255, c >> 8 & 255, c & 255];
} catch (e) {
throw e;
}
};
/**
* @param {!Object} item
* @param {!Object} val
* @return {?}
*/
var N = function(item, val) {
return val <= item.ca ? val == item.h || val == item.d || val == item.f || val == item.o ? item.n : val == item.P || val == item.H || val == item.I || val == item.k ? item.v : val == item.w ? item.i : 4 : [1, 2, 4, item.n, item.v, item.i][val % item.da];
};
/** @type {function(!Object, !Object, number, !Function): ?} */
var O = (E.prototype.la = function(results, expr) {
expr.push(results[0] << 24 | results[1] << 16 | results[2] << 8 | results[3]);
expr.push(results[4] << 24 | results[5] << 16 | results[6] << 8 | results[7]);
expr.push(results[8] << 24 | results[9] << 16 | results[10] << 8 | results[11]);
}, function(d, options, canCreateDiscussions, data) {
options = {};
options.N = d.a(L(d));
options.O = L(d);
/** @type {number} */
canCreateDiscussions = L(d) - 1;
data = L(d);
options.self = d.a(data);
/** @type {!Array} */
options.C = [];
for (; canCreateDiscussions--;) {
data = L(d);
options.C.push(d.a(data));
}
return options;
});
/** @type {function(!Object, ?, number, ?): ?} */
var Q = (E.prototype.ja = function(b, a, field, value) {
if (3 == b.length) {
/** @type {number} */
field = 0;
for (; 3 > field; field++) {
a[field] += b[field];
}
/** @type {!Array} */
value = [13, 8, 13, 12, 16, 5, 3, 10, 15];
/** @type {number} */
field = 0;
for (; 9 > field; field++) {
a[3](a, field % 3, value[field]);
}
}
}, function(d, e, i, canCreateDiscussions) {
return i = d.a(d.b), d.e && i < d.e.length ? (B(d, d.b, d.e.length), P(d, e)) : B(d, d.b, e), canCreateDiscussions = d.s(), B(d, d.b, i), canCreateDiscussions;
});
/** @type {function(number, number, !Array, number): ?} */
var H = (E.prototype.ka = function(b, sort, aVal, bVal) {
bVal = b[(sort + 2) % 3];
/** @type {number} */
b[sort] = b[sort] - b[(sort + 1) % 3] - bVal ^ (1 == sort ? bVal << aVal : bVal >>> aVal);
}, function(bitmask, k, options, n) {
/** @type {number} */
n = k - 1;
/** @type {!Array} */
options = [];
for (; 0 <= n; n--) {
/** @type {number} */
options[k - 1 - n] = bitmask >> 8 * n & 255;
}
return options;
});
/**
* @param {!Array} b
* @param {!Function} o
* @param {!Function} s
* @return {?}
*/
var M = function(b, o, s) {
return o = function() {
return s();
}, o.V = function(instance) {
/** @type {!Array} */
b = instance;
}, s = function() {
return b;
}, o;
};
/**
* @param {!Object} a
* @param {?} b
* @param {?} X
* @param {boolean} n
* @return {?}
*/
var R = function(a, b, X, n) {
return function() {
if (!n || a.q) {
return B(a, a.P, arguments), B(a, a.k, X), Q(a, b);
}
};
};
/** @type {function(!Object, ?): undefined} */
var P = (E.prototype.a = function(type, n) {
if (n = this.c[type], n === k) {
throw this.g(this.ea, 0, type), this.u;
}
return n();
}, function(o, e) {
o.K.push(o.c.slice());
o.c[o.b] = k;
B(o, o.b, e);
});
/**
* @param {!NodeList} a
* @param {number} p
* @return {?}
*/
var J = function(a, p) {
return a[p] << 24 | a[p + 1] << 16 | a[p + 2] << 8 | a[p + 3];
};
/**
* @param {number} name
* @param {!Array} left
* @return {?}
*/
var C = function(name, left) {
/** @type {!Array} */
left = Array(name);
for (; name--;) {
/** @type {number} */
left[name] = 255 * Math.random() | 0;
}
return left;
};
/**
* @param {!Object} a
* @param {!Error} b
* @return {undefined}
*/
var D = function(a, b) {
/** @type {string} */
a.m = ("E:" + b.message + ":" + b.stack).slice(0, 2048);
};
z = E.prototype;
/** @type {!Array} */
z.M = [function() {
}, function(x, a, y, value, p) {
a = L(x);
y = L(x);
value = x.a(a);
a = N(x, a);
p = N(x, y);
if (p == x.i || p == x.n) {
/** @type {string} */
value = "" + value;
} else {
if (0 < a) {
if (1 == a) {
/** @type {number} */
value = value & 255;
} else {
if (2 == a) {
/** @type {number} */
value = value & 65535;
} else {
if (4 == a) {
/** @type {number} */
value = value & 4294967295;
}
}
}
}
}
B(x, y, value);
}, function(d, e, x, s, i, j, c, a, shotsGroup) {
if (e = L(d), x = N(d, e), 0 < x) {
/** @type {number} */
s = 0;
for (; x--;) {
/** @type {number} */
s = s << 8 | L(d);
}
B(d, e, s);
} else {
if (x != d.v) {
if (s = L(d) << 8 | L(d), x == d.i) {
if (x = "", d.c[d.w] != k) {
i = d.a(d.w);
for (; s--;) {
j = i[L(d) << 8 | L(d)];
/** @type {string} */
x = x + j;
}
} else {
/** @type {!Array} */
x = Array(s);
/** @type {number} */
i = 0;
for (; i < s; i++) {
x[i] = L(d);
}
/** @type {string} */
s = x;
/** @type {!Array} */
x = [];
/** @type {number} */
j = i = 0;
for (; i < s.length;) {
c = s[i++];
if (128 > c) {
/** @type {string} */
x[j++] = String.fromCharCode(c);
} else {
if (191 < c && 224 > c) {
a = s[i++];
/** @type {string} */
x[j++] = String.fromCharCode((c & 31) << 6 | a & 63);
} else {
a = s[i++];
shotsGroup = s[i++];
/** @type {string} */
x[j++] = String.fromCharCode((c & 15) << 12 | (a & 63) << 6 | shotsGroup & 63);
}
}
}
/** @type {string} */
x = x.join("");
}
} else {
/** @type {!Array} */
x = Array(s);
/** @type {number} */
i = 0;
for (; i < s; i++) {
x[i] = L(d);
}
}
B(d, e, x);
}
}
}, function(message) {
L(message);
}, function(args, message, msg, selector) {
message = L(args);
msg = L(args);
selector = L(args);
msg = args.a(msg);
message = args.a(message);
B(args, selector, message[msg]);
}, function(a, b, c) {
b = L(a);
c = L(a);
b = a.a(b);
B(a, c, f(b));
}, function(a, x, i, c, d) {
x = L(a);
i = L(a);
c = N(a, x);
d = N(a, i);
if (i != a.h) {
if (c == a.i && d == a.i) {
if (a.c[i] == k) {
B(a, i, "");
}
B(a, i, a.a(i) + a.a(x));
} else {
if (d == a.n) {
if (0 > c) {
x = a.a(x);
if (c == a.i) {
x = F("" + x);
}
if (!(i != a.d && i != a.f && i != a.o)) {
G(a, i, H(x.length, 2));
}
G(a, i, x);
} else {
if (0 < c) {
G(a, i, H(a.a(x), c));
}
}
}
}
}
}, function(a$jscomp$32, b$jscomp$31, c$jscomp$23) {
b$jscomp$31 = L(a$jscomp$32);
c$jscomp$23 = L(a$jscomp$32);
B(a$jscomp$32, c$jscomp$23, function(a$jscomp$33) {
return eval(a$jscomp$33);
}(a$jscomp$32.a(b$jscomp$31)));
}, function(a, link, c) {
link = L(a);
c = L(a);
B(a, c, a.a(c) - a.a(link));
}, function(b, options) {
options = O(b);
B(b, options.O, options.N.apply(options.self, options.C));
}, function(x, s, y) {
s = L(x);
y = L(x);
B(x, y, x.a(y) % x.a(s));
}, function(x, s, stdEvent, a, c) {
s = L(x);
stdEvent = x.a(L(x));
a = x.a(L(x));
c = x.a(L(x));
x.a(s).addEventListener(stdEvent, R(x, a, c, true), false);
}, function(a, link, s, type) {
link = L(a);
s = L(a);
type = L(a);
a.a(link)[a.a(s)] = a.a(type);
}, function() {
}, function(x, s, a) {
s = L(x);
a = L(x);
B(x, a, x.a(a) + x.a(s));
}, function(a, link, b) {
link = L(a);
b = L(a);
if (0 != a.a(link)) {
B(a, a.b, a.a(b));
}
}, function(a, s, link, c) {
s = L(a);
link = L(a);
c = L(a);
if (a.a(s) == a.a(link)) {
B(a, c, a.a(c) + 1);
}
}, function(a, link, s, c) {
link = L(a);
s = L(a);
c = L(a);
if (a.a(link) > a.a(s)) {
B(a, c, a.a(c) + 1);
}
}, function(args, message, msg, selector) {
message = L(args);
msg = L(args);
selector = L(args);
B(args, selector, args.a(message) << msg);
}, function(a, link, s, c) {
link = L(a);
s = L(a);
c = L(a);
B(a, c, a.a(link) | a.a(s));
}, function(d, e) {
e = d.a(L(d));
P(d, e);
}, function(t, comments, title, i) {
if (comments = t.K.pop()) {
title = L(t);
for (; 0 < title; title--) {
i = L(t);
comments[i] = t.c[i];
}
/** @type {string} */
t.c = comments;
} else {
B(t, t.b, t.e.length);
}
}, function(a, link, s, c) {
link = L(a);
s = L(a);
c = L(a);
B(a, c, (a.a(link) in a.a(s)) + 0);
}, function(x, y, a, T) {
y = L(x);
a = x.a(L(x));
T = x.a(L(x));
B(x, y, R(x, a, T));
}, function(a, link, c) {
link = L(a);
c = L(a);
B(a, c, a.a(c) * a.a(link));
}, function(args, message, msg, selector) {
message = L(args);
msg = L(args);
selector = L(args);
B(args, selector, args.a(message) >> msg);
}, function(a, type, n, c) {
type = L(a);
n = L(a);
c = L(a);
B(a, c, a.a(type) || a.a(n));
}, function(a, options, args, fn_obj, dir) {
options = O(a);
args = options.C;
fn_obj = options.self;
dir = options.N;
switch(args.length) {
case 0:
args = new fn_obj[dir];
break;
case 1:
args = new fn_obj[dir](args[0]);
break;
case 2:
args = new fn_obj[dir](args[0], args[1]);
break;
case 3:
args = new fn_obj[dir](args[0], args[1], args[2]);
break;
case 4:
args = new fn_obj[dir](args[0], args[1], args[2], args[3]);
break;
default:
a.g(a.A);
return;
}
B(a, options.O, args);
}, function(c, t, n, i, s, size) {
if (t = L(c), n = L(c), i = L(c), s = L(c), t = c.a(t), n = c.a(n), i = c.a(i), c = c.a(s), "object" == f(t)) {
for (size in s = [], t) {
s.push(size);
}
/** @type {number} */
t = s;
}
size = t.length;
/** @type {number} */
s = 0;
for (; s < size; s = s + i) {
n(t.slice(s, s + i), c);
}
}];
/** @type {number} */
z.b = 0;
/** @type {number} */
z.p = 1;
/** @type {number} */
z.h = 2;
/** @type {number} */
z.l = 3;
/** @type {number} */
z.d = 4;
/** @type {number} */
z.w = 5;
/** @type {number} */
z.P = 6;
/** @type {number} */
z.L = 8;
/** @type {number} */
z.H = 9;
/** @type {number} */
z.I = 10;
/** @type {number} */
z.r = 11;
/** @type {number} */
z.F = 12;
/** @type {number} */
z.G = 13;
/** @type {number} */
z.f = 14;
/** @type {number} */
z.o = 15;
/** @type {number} */
z.k = 16;
/** @type {number} */
z.ca = 17;
/** @type {number} */
z.R = 253;
/** @type {number} */
z.$ = 254;
/** @type {number} */
z.S = 248;
/** @type {number} */
z.T = 216;
/** @type {number} */
z.da = 6;
/** @type {number} */
z.i = -1;
/** @type {number} */
z.n = -2;
/** @type {number} */
z.v = -3;
/** @type {number} */
z.U = 17;
/** @type {number} */
z.W = 21;
/** @type {number} */
z.A = 22;
/** @type {number} */
z.ea = 30;
/** @type {number} */
z.Y = 31;
/** @type {number} */
z.X = 33;
z.u = {};
/** @type {string} */
z.D = "caller";
/** @type {string} */
z.J = "toString";
/** @type {number} */
z.ga = 34;
/** @type {number} */
z.fa = 36;
E.prototype.ia = function(ref) {
return (ref = window.performance) && ref.now ? function() {
return ref.now() | 0;
} : function() {
return +new Date;
};
}();
/**
* @param {number} target
* @param {number} pos
* @param {number} len
* @param {number} value
* @param {number} i
* @param {number} b
* @param {!Array} m
* @param {number} e
* @param {string} t
* @param {string} x
* @param {string} n
* @return {?}
*/
E.prototype.Q = function(target, pos, len, value, i, b, m, e, t, x, n) {
if (this.m) {
return this.m;
}
try {
if (this.q = false, pos = this.a(this.d).length, len = this.a(this.f).length, value = this.j, this.c[this.L] && Q(this, this.a(this.L)), i = this.a(this.h), 0 < i.length && G(this, this.d, H(i.length, 2).concat(i), this.R), b = this.a(this.F) & 255, b = b - (this.a(this.d).length + 4), m = this.a(this.f), 4 < m.length && (b = b - (m.length + 3)), 0 < b && G(this, this.d, H(b, 2).concat(C(b)), this.S), 4 < m.length && G(this, this.d, H(m.length, 2).concat(m), this.T), e = [241].concat(this.a(this.d)),
window.btoa ? (x = window.btoa(String.fromCharCode.apply(null, e)), t = x.replace(/\\+/g, "-").replace(/\\/ / g, "_").replace(/=/g, "")) : t = k, t) {
/** @type {string} */
t = "," + t;
} else {
/** @type {string} */
t = "";
/** @type {number} */
i = 0;
for (; i < e.length; i++) {
n = e[i][this.J](16);
if (1 == n.length) {
/** @type {string} */
n = "0" + n;
}
/** @type {string} */
t = t + n;
}
}
/** @type {number} */
this.a(this.d).length = pos;
/** @type {number} */
this.a(this.f).length = len;
/** @type {number} */
this.j = value;
/** @type {boolean} */
this.q = true;
/** @type {string} */
target = t;
} catch (item) {
D(this, item);
target = this.m;
}
return target;
};
/**
* @param {number} y
* @param {number} r
* @param {undefined} n
* @param {number} len
* @param {string} msg
* @param {!Function} selector
* @return {?}
*/
E.prototype.s = function(y, r, n, len, msg, selector) {
try {
y = this.e.length;
/** @type {number} */
r = 2001;
n = k;
/** @type {number} */
len = 0;
for (; --r && (len = this.a(this.b)) < y;) {
try {
B(this, this.l, len);
/** @type {number} */
msg = L(this) % this.M.length;
if (n = this.M[msg]) {
n(this);
} else {
this.g(this.W, 0, msg);
}
} catch (b) {
if (b != this.u) {
if (selector = this.a(this.r)) {
B(this, selector, b);
B(this, this.r, 0);
} else {
this.g(this.A, b);
}
}
}
}
if (!r) {
this.g(this.X);
}
} catch (b) {
try {
this.g(this.A, b);
} catch (item) {
D(this, item);
}
}
return this.a(this.k);
};
/**
* @param {?} callback
* @param {?} error
* @return {?}
*/
E.prototype.ha = function(callback, error) {
return error = this.Q(), callback && callback(error), error;
};
try {
window.addEventListener("unload", function() {
}, false);
} catch (S) {
}
n("thintinel.th", E);
n("thintinel.th.prototype.exec", E.prototype.ha);
Or you can use an open source unuglify
.