// original code
//
var _calls_ = 10, a = 100, b = 10, c = 0;
c = c + 1;
{var brake2 = 5; while (((a++ + (a--))) && --brake2 > 0)try {try {for (var brake5 = 5; (((--b) + (0 === 1 ? a : b))) && brake5 > 0; --brake5){var parseInt = function f0(NaN){
function f1(c_2, bar_1, b_2){
{var brake7 = 5; while (((c = 1 + c, (((Infinity^3),("number"^this))<<((null||"")||(bar_1^=(({})*null)))))) && --brake7 > 0)(c = 1 + c, ((bar_1=((c_2 && (c_2[(c = 1 + c, (((bar_1[(c = 1 + c, (((this,"b")!=("a"<=([,0].length === 2)))/((false*Infinity)&(([,0].length === 2)|22))))]=(24 .toString()=="object"))!=("number"^2))<(((-3)!=(-1))<=([]^5))))]+=([]>="b")))>=((-3)>>>0)))<<(c = c + 1, (c_2 && (c_2.foo=("function"<<false))))));}
try {(c = 1 + c, (((b_2=(22<=2))==("">="function"))/(((-5)< /[a2][^e]+$/ ) - ( /[a2][^e]+$/ ^ /[a2][^e]+$/ )))); } finally { ; }
}
var a = f1(( /[abc4]/.test((((c = 1 + c, (((null>=1)|(5>>>this))&&((22,"")===(undefined!==(-4)))))) || b || 5).toString()) ));
function f2(Math_2, bar_2, b_1){
{var brake11 = 5; while (((c = 1 + c, ((bar_2[((function Infinity_1(){
;
}))]+=((undefined<<([,0].length === 2))^(([,0].length === 2)>>"function")))/(b_1+=((({}) + NaN)|(4&&([,0].length === 2))))))) && --brake11 > 0)(c = 1 + c, ((b_1 && (b_1[(typeof bar_2 == "function" && --_calls_ >= 0 && bar_2((c = 1 + c, (((4/[,0][1])<=("c">>(-1)))>>(("a" + 1)>>(2*1)))), (c = 1 + c, (-(((1||"foo")^(0x26.toString()<0)))))))]=((bar_2 && (bar_2[(c = 1 + c, ((([]>> /[a2][^e]+$/ )!=(-0<[,0][1]))||((0x26.toString()>>5)|((-4) - false))))]=(NaN,5)))^("c">>>"number"))))>>((bar_2=(1%24 .toString())),( /[a2][^e]+$/ !="a"))));}
{var brake13 = 5; while (((c = 1 + c, (((undefined!==24 .toString())>>>(0|false))>=(((-3)|"foo")<=((-3)/(-5)))))) && --brake13 > 0)(c = 1 + c, (((Math_2 && (Math_2[(c = 1 + c, ((b_1+=(("function"<=(-2)) - (3>(-2))))>>(("c"%"")^((-3)>>"foo"))))]=((-1)>(-5)))) - ("b"<=(-2)))>((0 + undefined)>=(bar_2 && (bar_2.in%=(3||0))))));}
}
var arguments = f2();
}
((a++ + (a)));} } catch (Infinity_2) { switch ((+((Infinity_2 && (Infinity_2[((--b) + (b++))]+=((("" + "b")>=(Infinity_2 && (Infinity_2.undefined=((-5)/"bar"))))==((23..toString()>=0)<=((-1)||({}))))))))) {
default:
case ((c = c + 1) + ((Infinity_2)?((c = c + 1) + (--(b))):((--b) + (Infinity_2)))):
/* fall-through */
case ((--b) + (Infinity_2)):
break;
case (void (((Infinity_2 && (Infinity_2.var=((null%(-3))&(1>>24 .toString()))))===(((-4)>>>"bar")==("a"===25. ))))):
break;
}
{var brake16 = 5; do {{var brake17 = 5; do {try {; } catch (arguments) { ((++a));
for (var brake21 = 5; (((--b) + (!a))) && brake21 > 0; --brake21)if ((Infinity_2))if ((c = 1 + c, ((("number"/-0)>=([,0][1]!=0))!=((+(0x26.toString()))>(undefined>>>"c")))))(c = 1 + c, (((3,0)/("number">null))/((24 .toString() + (-4)) + (Infinity_2&=(24 .toString()*(-1))))));
} finally { ((--b) + ((((25. >"c")==(-("a")))^((0%(-3))>>>((-2)^"number")))));
(~((Infinity_2 && (Infinity_2.c+=((Infinity_2+=((2 - 24 .toString())===(true - -0)))>=(((-5)>>>22)&("number"===([,0].length === 2))))))));
}} while ((((--b) + (Infinity_2 && Infinity_2[(--/* ignore */b)]))) && --brake17 > 0);}} while ((( /[abc4]/.test((((typeof Infinity_2 == "function" && --_calls_ >= 0 && Infinity_2(((c = c + 1) + ([((--b) + (typeof Infinity_2 == "function" && --_calls_ >= 0 && Infinity_2((c = 1 + c, ((Infinity_2 && (Infinity_2[(b/* ignore */--)]=((23..toString()%({})) + (Infinity_2 && (Infinity_2.a<<=(undefined!==-0))))))&((2 - ([,0].length === 2))*(Infinity_2 && (Infinity_2[(c = 1 + c, ((("b"%24 .toString())&(5*"undefined"))>>>(("undefined"/"number") - (c = c + 1, "bar"))))]+=("bar">2)))))), (-1), 0x26.toString()))), ((c = c + 1) + ([(c = 1 + c, ((Infinity_2=((4|"")>=( /[a2][^e]+$/ *undefined)))%((0x26.toString()>>this)!==("function" + "number")))), (c = 1 + c, (Infinity_2+=(((!(2))&&(1/22)) - ((0x26.toString() + "a")>=(c = c + 1, true))))), (c = 1 + c, (((null!="a")<<(c = c + 1, 22))^((false>>"function") + (({})^23..toString())))), (c = 1 + c, ((([]!=="bar")^(23..toString()%(-5)))&((3&&"a"),(Infinity>=(-5))))), ][(c = 1 + c, (((c = c + 1, "a")/(Infinity_2 && (Infinity_2.NaN>>=(false,"object"))))/((true*3)&("c" - 2))))])), ].null)), /[a2][^e]+$/ , (a++)))) || b || 5).toString()) )) && --brake16 > 0);}
} finally { ((c = c + 1) + ("number"));
for (var brake28 = 5; (((--b) + ((((null>(-5))^("bar"*[,0][1]))^((a && (a.a=(([,0].length === 2)%"c")))/(23..toString()>>>24 .toString())))))) && brake28 > 0; --brake28)L24924: for (var brake29 = 5; ((typeof f0 == "function" && --_calls_ >= 0 && f0((( (((void function undefined(){
;
}())) || 0).toString()[(+function (){
;
}())] )?(a && typeof a.b == "function" && --_calls_ >= 0 && a.b(([,0].length === 2))):(new function foo_1(){
this.a=((-(24 .toString()))*(5 + (-2)));
this.undefined=((false*"")&(2%false));
this.var+=((23..toString() + NaN)==(0x26.toString()|22));
(c = 1 + c, (((foo_1 && (foo_1[(c = 1 + c, (((24 .toString() - 24 .toString())>>(2&"function"))||((5||undefined)>=([,0][1]%""))))]|=("c"||(-4))))>>("c",true))%((2&-0)&("object"^ /[a2][^e]+$/ ))));
(c = 1 + c, (foo_1 && (foo_1.a=((("c">>(-4))>>>( /[a2][^e]+$/ ===3)) - (foo_1 && (foo_1.in+=((4!="function")&(4!=="object"))))))));
})), ((--b) + (((("function"<<"number")|("b">"object"))%((1>=-0)&&((-5)>(-4)))))), ((c = c + 1) + (((("b"/"b")==(22&&""))<(a && (a.var|=((-0||false)>("number"==false)))))))))) && brake29 > 0; --brake29)try {L24925: {c = c + 1;
switch ((1 === 1 ? a : b)) {
case ((c = c + 1) + ([(c = 1 + c, (a && (a[(~b)]%=((("b"|3)>=("b"% /[a2][^e]+$/ )) - (("b" - (-4))^( /[a2][^e]+$/ >4)))))), ])):
(c = 1 + c, ((([]===4)%("foo"%-0)) + (c = c + 1, (22!=22))));
(c = 1 + c, (a && (a[(({
1.5:((c = 1 + c, (((a && (a[(c = 1 + c, ((("foo"%(-4))>>(4 + "bar"))/((5 - (-3))/(-0<<"bar"))))]=(25. >>([,0].length === 2))))^("c"&(-5)))%(("function"^[])!==(a && (a.a=("a"%24 .toString()))))))),
}))]|=(((([,0].length === 2)<<1)<<((-3)|-0))/(a && (a[(0x26.toString())]=(("foo" - 22)|( /[a2][^e]+$/ >="undefined"))))))));
break;
case ((--b) + (typeof a == "function" && --_calls_ >= 0 && a((c = 1 + c, (((null - 25. )>=(a-=(false!=this)))&&((Infinity^"object")!=(!("foo"))))), (c = 1 + c, (((-(2)),(24 .toString()<this))>>>((-0%"")!=((-5) - "b")))), ({})))):
(c = 1 + c, (((c = c + 1, "object")===(-0===Infinity))|((null%null)^(-0/23..toString()))));
break;
case ((typeof (c = 1 + c, (-((("number" + this)^(2&"function"))))))):
(c = 1 + c, ((((-5)^25. )>>([] - "b"))/(((-4)&NaN)==((-5)!==(-4)))));
(c = 1 + c, ((~(([,0][1]>>>[])))<((NaN>>>undefined)||(22%null))));
break;
case (a):
(c = 1 + c, ((a && (a[( (((c = 1 + c, ((([,0][1]>>(-3))^(c = c + 1, NaN))|((25. !==22)*((-3)!=(-4)))))) || 3).toString()[(c = 1 + c, ((!(("number"^[])))&(("object">"undefined")&(""*NaN))))] )]+=((5|25. )/(23..toString()===0))))!==(a && (a[(a/=(c = 1 + c, (c = c + 1, (([,0][1]<<(-3))<<("bar">=(-5))))))]=((a && (a[(c = 1 + c, (c = c + 1, (("a"<=this)*( /[a2][^e]+$/ &0x26.toString()))))]>>=([]!==25. )))==([,0][1]&&"undefined"))))));
break;
}
} } catch (b_2) { {var expr42 = (void (((("number",0)%([,0][1]===[,0][1]))>=((Infinity>="undefined"),("a"||"undefined"))))); for (var key42 in expr42) {c = 1 + c; var b = expr42[key42]; switch (((((-0/ /[a2][^e]+$/ ) + (2>>>[]))|(("object" + "foo")/("bar"<=(-2)))))) {
case (0 === 1 ? a : b):
break;
case (({
Infinity:((c = 1 + c, (((delete (({})))<(0x26.toString()>>>(-4)))/(("bar" + "b")>>((-3)^({})))))),
"-2":((c = 1 + c, (((4<"bar")===(c = c + 1, undefined))&&((1>=(-5))==(c = c + 1, Infinity))))),
0:((c = 1 + c, ((delete (("b" + ({})))) + (("b"<22)<<(b_2 && (b_2[(c = 1 + c, ((void (("b"^NaN)))^(c = c + 1, (b_2 && (b_2[(c = 1 + c, ((((-3)||"object")%("number"<=23..toString())),((3>>>"c")&(""==25. ))))]+=("foo" + "number"))))))]=(1==4))))))),
set c(b_2){
;
this.undefined>>=("function"!==true);
},
}).undefined):
(c = 1 + c, ((("undefined"||Infinity)>>>(c = c + 1, 23..toString()))&(("">>"c")>=(0<"foo"))));
break;
default:
case (delete b):
(c = 1 + c, (((b_2 && (b_2.NaN+=(undefined - "a"))),(0&&undefined))%((""^"")<((-1)>>>Infinity))));
(c = 1 + c, (((23..toString()>>"function")^("foo"%([,0].length === 2)))>=(b_2+=((true>=5)>>>(4>>>-0)))));
break;
}}}
(0 === 1 ? a : b);
}
} } finally { try {if (((c = c + 1) + ( (((a++ + ( /[abc4]/g.exec((((a && a.foo)) || b || 5).toString()) ))) || a || 3).toString() ))){for (var brake51 = 5; ((a++ + (a && typeof a.null == "function" && --_calls_ >= 0 && a.null(0, null)))) && brake51 > 0; --brake51){var expr52 = ((--b) + (a && typeof a.null == "function" && --_calls_ >= 0 && a.null())); for (var key52 in expr52) {{var expr53 = (0x26.toString()); for (var key53 in expr53) {c = 1 + c; var Infinity = expr53[key53]; var NaN_2;}}}}
} } catch (a_1) { var a;
;
} finally { var NaN = (b += a), c_1 = ( ((((c = c + 1) + ( /[abc4]/g.exec((((0 === 1 ? a : b)) || b || 5).toString()) ))) || a || 3).toString() );
(a++ + ([(({
set var(undefined_1){
(c = 1 + c, (((([,0].length === 2)^"number")^(c = c + 1, (-1)))^(-(((-5)<"a")))));
this.a=((23..toString()&&22)||(5|(-4)));
},
})[(NaN_2 && typeof NaN_2.in == "function" && --_calls_ >= 0 && NaN_2.in((c = 1 + c, ((([,0][1],24 .toString())||(false*5))==((c = c + 1, [])>=(undefined||false)))), (c = 1 + c, (((c = c + 1, undefined)^(c = c + 1, /[a2][^e]+$/ ))==((([,0].length === 2)%"bar")===(2>=0))))))]), (0 === 1 ? a : b), ]));
}
((c = c + 1) + (void (((([,0][1]&"foo")!=(22>>>(-1)))/((""%"function")>>(true!==[,0][1]))))));
}}
console.log(null, a, b, c, Infinity, NaN, undefined);
// uglified code
//
var _calls_ = 10, a = 100, b = 10, c = 0;
c = c + 1;
{
var brake2 = 5;
while (a++ + a-- && --brake2 > 0) {
try {
try {
for (var brake5 = 5; --b + (0 === 1 ? a : b) && brake5 > 0; --brake5) {
var parseInt = function d(e) {
function f(i, j, k) {
{
var l = 5;
while ((c = 1 + c, (Infinity ^ 3, "number" ^ this) << (null || "" || (j ^= {} * null))) && --l > 0) {
c = 1 + c, (j = (i && (i[c = 1 + c, ((j[c = 1 + c, ((this, "b") != "a" <= ([ , 0 ].length === 2)) / (false * Infinity & ([ , 0 ].length === 2 | 22))] = 24..toString() == "object") != ("number" ^ 2)) < ((-3 != -1) <= ([] ^ 5))] += [] >= "b")) >= -3 >>> 0) << (c = c + 1,
i && (i.foo = "function" << false));
}
}
try {
c = 1 + c, ((k = 22 <= 2) == "" >= "function") / ((-5 < /[a2][^e]+$/) - (/[a2][^e]+$/ ^ /[a2][^e]+$/));
} finally {
}
}
var g = f(/[abc4]/.test(((c = 1 + c, null >= 1 | 5 >>> this && (22, "") === (undefined !== -4)) || b || 5).toString()));
function h(m, n, o) {
{
var p = 5;
while ((c = 1 + c, (n[function r() {
}] += undefined << ([ , 0 ].length === 2) ^ ([ , 0 ].length === 2) >> "function") / (o += {} + e | (4 && [ , 0 ].length === 2))) && --p > 0) {
c = 1 + c, (o && (o[typeof n == "function" && --_calls_ >= 0 && n((c = 1 + c, (4 / [ , 0 ][1] <= "c" >> -1) >> ("a" + 1 >> 2 * 1)), (c = 1 + c,
-((1 || "foo") ^ 38..toString() < 0)))] = (n && (n[c = 1 + c, [] >> /[a2][^e]+$/ != -0 < [ , 0 ][1] || 38..toString() >> 5 | -4 - false] = (e,
5))) ^ "c" >>> "number")) >> (n = 1 % 24..toString(), /[a2][^e]+$/ != "a");
}
}
{
var q = 5;
while ((c = 1 + c, (undefined !== 24..toString()) >>> (0 | false) >= ((-3 | "foo") <= -3 / -5)) && --q > 0) {
c = 1 + c, (m && (m[c = 1 + c, (o += ("function" <= -2) - (3 > -2)) >> ("c" % "" ^ -3 >> "foo")] = -1 > -5)) - ("b" <= -2) > (0 + undefined >= (n && (n.in %= 3 || 0)));
}
}
}
var arguments = h();
}(a++ + a);
}
} catch (s) {
switch (+(s && (s[--b + b++] += "" + "b" >= (s && (s.undefined = -5 / "bar")) == 23..toString() >= 0 <= (-1 || {})))) {
default:
case (c = c + 1) + (s ? (c = c + 1) + --b : --b + s):
case --b + s:
break;
case void ((s && (s.var = null % -3 & 1 >> 24..toString())) === (-4 >>> "bar" == ("a" === 25))):
break;
}
{
var brake16 = 5;
do {
{
var brake17 = 5;
do {
try {
} catch (arguments) {
++a;
for (var brake21 = 5; --b + !a && brake21 > 0; --brake21) {
if (s) {
if (c = 1 + c, "number" / -0 >= ([ , 0 ][1] != 0) != +38..toString() > undefined >>> "c") {
c = 1 + c, (3, 0) / ("number" > null) / (24..toString() + -4 + (s &= 24..toString() * -1));
}
}
}
} finally {
--b + (25 > "c" == -"a" ^ 0 % -3 >>> (-2 ^ "number"));
~(s && (s.c += (s += 2 - 24..toString() === true - -0) >= (-5 >>> 22 & "number" === ([ , 0 ].length === 2))));
}
} while (--b + (s && s[--b]) && --brake17 > 0);
}
} while (/[abc4]/.test((typeof s == "function" && --_calls_ >= 0 && s((c = c + 1) + [ --b + (typeof s == "function" && --_calls_ >= 0 && s((c = 1 + c,
(s && (s[b--] = 23..toString() % {} + (s && (s.a <<= undefined !== -0)))) & (2 - ([ , 0 ].length === 2)) * (s && (s[c = 1 + c,
("b" % 24..toString() & 5 * "undefined") >>> "undefined" / "number" - (c = c + 1,
"bar")] += "bar" > 2))), -1, 38..toString())), (c = c + 1) + [ (c = 1 + c, (s = (4 | "") >= /[a2][^e]+$/ * undefined) % (38..toString() >> this !== "function" + "number")), (c = 1 + c,
s += (!2 && 1 / 22) - (38..toString() + "a" >= (c = c + 1, true))), (c = 1 + c,
(null != "a") << (c = c + 1, 22) ^ (false >> "function") + ({} ^ 23..toString())), (c = 1 + c,
([] !== "bar" ^ 23..toString() % -5) & (3 && "a", Infinity >= -5)) ][c = 1 + c,
(c = c + 1, "a") / (s && (s.NaN >>= (false, "object"))) / (true * 3 & "c" - 2)] ].null, /[a2][^e]+$/, a++) || b || 5).toString()) && --brake16 > 0);
}
} finally {
(c = c + 1) + "number";
for (var brake28 = 5; --b + (null > -5 ^ "bar" * [ , 0 ][1] ^ (a && (a.a = ([ , 0 ].length === 2) % "c")) / (23..toString() >>> 24..toString())) && brake28 > 0; --brake28) {
L24924: for (var brake29 = 5; typeof f0 == "function" && --_calls_ >= 0 && f0((void function t() {
}() || 0).toString()[+function() {
}()] ? a && typeof a.b == "function" && --_calls_ >= 0 && a.b([ , 0 ].length === 2) : new function u() {
this.a = -24..toString() * (5 + -2);
this.undefined = false * "" & 2 % false;
this.var += 23..toString() + NaN == (38..toString() | 22);
c = 1 + c, ((u && (u[c = 1 + c, 24..toString() - 24..toString() >> (2 & "function") || (5 || undefined) >= [ , 0 ][1] % ""] |= "c" || -4)) >> ("c",
true)) % (2 & -0 & ("object" ^ /[a2][^e]+$/));
c = 1 + c, u && (u.a = ("c" >> -4 >>> (/[a2][^e]+$/ === 3)) - (u && (u.in += 4 != "function" & 4 !== "object")));
}(), --b + ("function" << "number" | "b" > "object") % (1 >= -0 && -5 > -4), (c = c + 1) + (("b" / "b" == (22 && "")) < (a && (a.var |= (-0 || false) > ("number" == false))))) && brake29 > 0; --brake29) {
try {
L24925: {
c = c + 1;
switch (1 === 1 ? a : b) {
case (c = c + 1) + [ (c = 1 + c, a && (a[~b] %= (("b" | 3) >= "b" % /[a2][^e]+$/) - ("b" - -4 ^ /[a2][^e]+$/ > 4))) ]:
c = 1 + c, ([] === 4) % ("foo" % -0) + (c = c + 1, 22 != 22);
c = 1 + c, a && (a[{
1.5: (c = 1 + c, ((a && (a[c = 1 + c, ("foo" % -4 >> 4 + "bar") / ((5 - -3) / (-0 << "bar"))] = 25 >> ([ , 0 ].length === 2))) ^ "c" & -5) % (("function" ^ []) !== (a && (a.a = "a" % 24..toString()))))
}] |= (([ , 0 ].length === 2) << 1 << (-3 | -0)) / (a && (a[38..toString()] = "foo" - 22 | /[a2][^e]+$/ >= "undefined")));
break;
case --b + (typeof a == "function" && --_calls_ >= 0 && a((c = 1 + c, null - 25 >= (a -= false != this) && (Infinity ^ "object") != !"foo"), (c = 1 + c,
(-2, 24..toString() < this) >>> (-0 % "" != -5 - "b")), {})):
c = 1 + c, (c = c + 1, "object") === (-0 === Infinity) | null % null ^ -0 / 23..toString();
break;
case typeof (c = 1 + c, -("number" + this ^ 2 & "function")):
c = 1 + c, ((-5 ^ 25) >> [] - "b") / ((-4 & NaN) == (-5 !== -4));
c = 1 + c, ~([ , 0 ][1] >>> []) < (NaN >>> undefined || 22 % null);
break;
case a:
c = 1 + c, (a && (a[((c = 1 + c, [ , 0 ][1] >> -3 ^ (c = c + 1, NaN) | (25 !== 22) * (-3 != -4)) || 3).toString()[c = 1 + c,
!("number" ^ []) & ("object" > "undefined" & "" * NaN)]] += (5 | 25) / (23..toString() === 0))) !== (a && (a[a /= (c = 1 + c,
c = c + 1, [ , 0 ][1] << -3 << ("bar" >= -5))] = (a && (a[c = 1 + c, c = c + 1,
("a" <= this) * (/[a2][^e]+$/ & 38..toString())] >>= [] !== 25)) == ([ , 0 ][1] && "undefined")));
break;
}
}
} catch (v) {
{
var expr42 = void (("number", 0) % ([ , 0 ][1] === [ , 0 ][1]) >= (Infinity >= "undefined",
"a" || "undefined"));
for (var key42 in expr42) {
c = 1 + c;
var b = expr42[key42];
switch (-0 / /[a2][^e]+$/ + (2 >>> []) | ("object" + "foo") / ("bar" <= -2)) {
case 0 === 1 ? a : b:
break;
case {
Infinity: (c = 1 + c, (delete {} < 38..toString() >>> -4) / ("bar" + "b" >> (-3 ^ {}))),
"-2": (c = 1 + c, 4 < "bar" === (c = c + 1, undefined) && 1 >= -5 == (c = c + 1,
Infinity)),
0: (c = 1 + c, delete ("b" + {}) + (("b" < 22) << (v && (v[c = 1 + c, void ("b" ^ NaN) ^ (c = c + 1,
v && (v[c = 1 + c, (-3 || "object") % ("number" <= 23..toString()), 3 >>> "c" & "" == 25] += "foo" + "number"))] = 1 == 4)))),
set c(w) {
this.undefined >>= "function" !== true;
}
}.undefined:
c = 1 + c, ("undefined" || Infinity) >>> (c = c + 1, 23..toString()) & "" >> "c" >= (0 < "foo");
break;
default:
case delete b:
c = 1 + c, (v && (v.NaN += undefined - "a"), 0 && undefined) % (("" ^ "") < -1 >>> Infinity);
c = 1 + c, (23..toString() >> "function" ^ "foo" % ([ , 0 ].length === 2)) >= (v += (true >= 5) >>> (4 >>> -0));
break;
}
}
}
0 === 1 ? a : b;
}
}
}
}
} finally {
try {
if ((c = c + 1) + (a++ + /[abc4]/g.exec((a && a.foo || b || 5).toString()) || a || 3).toString()) {
for (var brake51 = 5; a++ + (a && typeof a.null == "function" && --_calls_ >= 0 && a.null(0, null)) && brake51 > 0; --brake51) {
var expr52 = --b + (a && typeof a.null == "function" && --_calls_ >= 0 && a.null());
for (var key52 in expr52) {
{
var expr53 = 38..toString();
for (var key53 in expr53) {
c = 1 + c;
var Infinity = expr53[key53];
var NaN_2;
}
}
}
}
}
} catch (x) {
var a;
} finally {
var NaN = b += a, c_1 = ((c = c + 1) + /[abc4]/g.exec(((0 === 1 ? a : b) || b || 5).toString()) || a || 3).toString();
a++ + [ {
set var(y) {
c = 1 + c, [ , 0 ].length === 2 ^ "number" ^ (c = c + 1, -1) ^ -(-5 < "a");
this.a = 23..toString() && 22 || 5 | -4;
}
}[NaN_2 && typeof NaN_2.in == "function" && --_calls_ >= 0 && NaN_2.in((c = 1 + c,
(([ , 0 ][1], 24..toString()) || false * 5) == (c = c + 1, []) >= (undefined || false)), (c = 1 + c,
((c = c + 1, undefined) ^ (c = c + 1, /[a2][^e]+$/)) == (([ , 0 ].length === 2) % "bar" === 2 >= 0)))], 0 === 1 ? a : b ];
}
(c = c + 1) + void ((([ , 0 ][1] & "foo") != 22 >>> -1) / ("" % "function" >> (true !== [ , 0 ][1])));
}
}
}
console.log(null, a, b, c, Infinity, NaN, undefined);
md5-b900d15b9efe78ead604bc26b08d102b
original result:
null 136 422 41 Infinity NaN undefined
uglified result:
null 136 410 41 Infinity NaN undefined
md5-83f9ce4e23ab3f9d47b159c8ea3ae680
minify(options):
{
"compress": false,
"mangle": false,
"output": {
"beautify": true,
"braces": true
},
"rename": true
}
Suspicious output options:
beautify
indent_level
```
@kzc --reduce-test seems not to work here.
I can reproduce the test results with just --beautify
By design reduce/test won't work if there's a bug in output, the parser or if Node does not produce deterministic results. So you have to reduce this one the old fashioned way. ;-)
Actually it does work with -b − here's a slightly trimmed test case which --reduce-test is able to deduce the root cause:
$ uglifyjs test.js -b --reduce-test
// Node.js v10.20.0 on win32 x64
// reduce test pass 1, iteration 0: 4573 bytes
// reduce test pass 1, iteration 25: 4573 bytes
// reduce test pass 1, iteration 50: 4573 bytes
// reduce test pass 1, iteration 75: 4573 bytes
// reduce test pass 1, iteration 100: 1402 bytes
// reduce test pass 1, iteration 125: 1027 bytes
// reduce test pass 1: 133 bytes
// reduce test pass 2: 80 bytes
// reduce test pass 3: 55 bytes
function f2(bar_2){bar_2[function Infinity_1(){}]}f2();
// output: TypeError: Cannot read property 'function Infinity_1(){}' of undefined
// minify: TypeError: Cannot read property 'function Infinity_1() {}' of undefined
// options: {
// "compress": false,
// "mangle": false,
// "output": {
// "beautify": true
// }
// }
Looks like the error-tolerant logic is tripping over this.
Actually it does work with -b
Ah, okay. I hadn't considered valid output reformatting influencing how runtime errors are emitted. My last comment is still true though. None of those conditions were met in this case.
I agree that we cannot reduce parser-related bugs, but it does work with output-related ones.
If you did have an output bug that resulted in code that could not be parsed then it wouldn't work. But I suppose if it produced incorrect but parseable code it could work.
For the record, without #3816 the test case can be reduced if we raise max_iteration from 1000 to 2500
That's interesting. Although that limit was chosen rather arbitrarily, I don't think we'd want slow down the general case for future outliers similar to this one. Your workaround in #3816 was quite clever.
It's good to see that test/reduce works 99% of the time - for non-timeout cases anyway.
Some reductions still amuse me. Like the one where it generated case console:. It must have started with case AST_Binary: which morphed to case console.log(AST_Binary): and then got whittled down. Similar to Darwinian natural selection.
You've picked an interesting time to mention Charles Darwin 馃槒
Quite unintentionally.
What a truly crazy time.
I was wrong about output bugs not being able to be reduced:
2020-04-27T02:01:34.5094759Z // reduced test case (output will differ)
2020-04-27T02:01:34.5095643Z
2020-04-27T02:01:34.5096194Z // (beautified)
2020-04-27T02:01:34.5097602Z var a = 0;
2020-04-27T02:01:34.5293642Z
2020-04-27T02:01:34.5757359Z (function undefined_1_1() {
2020-04-27T02:01:34.5758665Z var foo_1_1_2 = {
2020-04-27T02:01:34.5760757Z var: 0,
2020-04-27T02:01:34.5762290Z "": a ? 0 : 1,
2020-04-27T02:01:34.5773542Z null: a++
2020-04-27T02:01:34.5774340Z }.var;
2020-04-27T02:01:34.5774789Z (function c_1_1() {
2020-04-27T02:01:34.5776020Z undefined_1_1;
2020-04-27T02:01:34.5784082Z })[foo_1_1_2[0]];
2020-04-27T02:01:34.5784730Z });
2020-04-27T02:01:34.5785153Z // output:
2020-04-27T02:01:34.5786278Z // minify: SyntaxError: Unexpected token )
2020-04-27T02:01:34.5798844Z // options: {
2020-04-27T02:01:34.5799658Z // "ie8": true,
2020-04-27T02:01:34.5800013Z // "toplevel": true
2020-04-27T02:01:34.5801017Z // }
$ bin/uglifyjs 0.js --toplevel --ie8 -bmc
(function n() {
[ 0, (), 0 ][0][0];
});
$ bin/uglifyjs 0.js --toplevel --ie8 -bmc | node
[ 0, (), 0 ][0][0];
^
SyntaxError: Unexpected token )
Mind you, compress had to produce an invalid AST for the output error to be reduced - an empty AST_Sequence.
In this case, yes − though we could introduce a bug in output.js only to give invalid AST to achieve the same effects 馃懟
(Sorry about the onslaught on reports − that's what happens when I want a good night's sleep...)
Fair enough. All sorts of silent output bugs could be reduced.
Ironically if output.js performed AST validation then it'd merely error out immediately without reducing:
--- a/lib/output.js
+++ b/lib/output.js
@@ -1195,2 +1195,3 @@ function OutputStream(options) {
DEFPRINT(AST_Sequence, function(self, output) {
+ if (!self.expressions.length) throw Error("empty sequence");
self.expressions.forEach(function(node, index) {
Disclaimer: I'm not the cause for the current onslaught of ufuzz job failures on Ubuntu, at least none that I'm aware off 馃槄