//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

(function() {
var ary = new Array(10);
var obj0 = new Object();
var a;
var b;
var c;
var d;
var e;
var f;
var g;
var h;
a = 22547;
b = -51793;
c = 23102;
d = -22670;
e = -57074;
f = 44602;
g = -46073;
h = 46621;
obj0.a = 7082;
obj0.b = -9706;
obj0.c = 45615;
obj0.d = 47939;
obj0.e = -48969;
ary[0] = -40848;
ary[1] = 64187;
ary[100] = 27986;
if(((((2370 ? obj0.d : -31727) == (-15507 ? obj0.c : obj0.c)) + (b * (47681 * d))) > (((+ 23541) & (-2530 - h)) ^ (obj0.b ^ e)))) {
  if(((((obj0.c <= c) + (h & -52050)) & 9266) <= (obj0.b ^ f))) {
    c = ((g - a) & (((h ^ -11270) + b) + b));
    if(((((b < obj0.a) ? (-17462 + b) : (obj0.d ? -62111 : obj0.b)) * (obj0.b & (39268 | d))) == (-10709 * (obj0.c | c)))) {
      d = (((! (- f)) | (+ (32301 != b))) != (b + -4008));
    } else {
      d = obj0.b;
      a = (((c * (g & obj0.d)) - (f | (-5454 - -7850))) >= ((+ (h + a)) * c));
    }
  } else {
    if((((g - (g & -39464)) + obj0.c) > (obj0.e | (+ obj0.e)))) {
    } else {
      d = ((((- c) & (65432 + obj0.d)) | (g * (-50949 ? -46710 : 24448))) + ((- (1931 & c)) ^ ((g ? -29514 : obj0.a) & c)));
      a = (++ obj0.d);
      obj0.a = (((c + (+ -8635)) & e) ? ((h < 52473) ^ g) : ((obj0.e != (b & obj0.c)) * -16694));
    }
    obj0.b = obj0.e;
    obj0.d = f;
  }
} else {
  if((((! (g ? -36848 : -49338)) | ((34059 | f) ^ (obj0.c + -24384))) >= (b - ((a + c) - (a - b))))) {
    obj0.c = (+ ((+ c) | (e + (d + -31410))));
    if(((((obj0.e >= d) ? (h ? 27617 : e) : (57080 ? -39953 : d)) | (g & (f == -52354))) > (obj0.d - c))) {
      c = obj0.b;
      d = (((obj0.a ^ obj0.a) & ((-2797 > f) ^ (e - h))) & (((1652 + obj0.e) | (11346 <= obj0.c)) + ((+ obj0.a) & (-55246 * f))));
    } else {
      obj0.d = (((d | (d + obj0.e)) & (obj0.d - (-52160 - a))) & (obj0.a | -39946));
      g = obj0.d;
      obj0.e = c;
    }
  } else {
    if(((obj0.a + e) == ((obj0.e++ ) - obj0.e))) {
      g = (! (((obj0.a & -2081) ^ obj0.a) - obj0.e));
      e = ((((-16869 > d) ? (+ -43668) : a) - ((55228 ? obj0.a : -35200) != (-31151 ^ e))) + (a - obj0.a));
    } else {
      e = ((obj0.a | (obj0.b++ )) + (((58071 ? a : obj0.d) & (! g)) | (3392 == f)));
      obj0.a = c;
      obj0.d = ((c | h) <= (((-56747 > 32515) ? (-32283 + f) : f) ^ obj0.d));
    }
    if(((((a & obj0.a) ^ (obj0.c + -33672)) * (-30643 + obj0.e)) > (obj0.d * f))) {
      e = ((d + ((a != -48446) ? (+ obj0.a) : d)) > (((b | 1855) & (38734 - 2470)) & (b - f)));
      obj0.c = ((45683 & (+ obj0.a)) * (f ^ a));
      h = d;
    } else {
    }
    if((((++ b) - (c | (obj0.c & obj0.e))) == (((c <= -18331) ^ (c & 16512)) + obj0.a))) {
      a = ((h | obj0.e) - (((-2223 - -2834) | obj0.e) * e));
    } else {
    }
  }
  if(((42854 * ((d < obj0.e) >= (c * f))) == (d + f))) {
    b = (((a | g) + -64013) * (((obj0.a | 54860) + d) - 25095));
    if(((((-53751 * -63162) - (10945 ^ obj0.c)) ^ c) > ((-53217 <= (++ obj0.e)) & c))) {
      obj0.b = c;
      a = ((-48061 & h) & (((f == obj0.e) ? (a ^ 8993) : (-24864 ^ 38087)) - ((a ? -34732 : -30848) | (-42290 > f))));
      a = (((c & (obj0.b <= a)) * ((b++ ) * (obj0.c | e))) * (-49780 & e));
    } else {
      g = -20998;
      obj0.d = ((((-28865 ? obj0.d : 35786) < h) + (b & obj0.a)) & (30707 + ((b & obj0.d) <= (g - 11362))));
    }
  } else {
    obj0.d = g;
  }
  if((((e & (! b)) + e) >= (41201 + ((60414 - f) + a)))) {
    if(((((obj0.c == 56439) ? obj0.d : (-10053 | c)) * ((44745 * 36599) == (-13826 | b))) != (e + (c++ )))) {
      d = ((f & c) & ((c ^ (6259 ^ 56253)) | obj0.a));
    } else {
      e = ((((c == h) ? obj0.e : (h ? e : 63165)) * d) < ((obj0.e++ ) - b));
    }
    if(((((f | g) == (59134 & d)) * ((-19947 | obj0.c) - (! 36833))) > ((- (e != f)) - g))) {
      g = (((c - (g & 40975)) ^ h) ? ((22766 - obj0.c) ^ 41166) : ((obj0.b & -60467) * ((obj0.d ^ 38493) | (+ 11115))));
      c = obj0.a;
      f = (((obj0.b + c) & (53970 ^ obj0.e)) * (((+ 28312) ^ c) + 37828));
    } else {
      d = 52458;
      g = ((((obj0.a & a) * -60270) | (h++ )) ? (((a == obj0.c) - (h ? a : obj0.a)) ^ ((e + c) != (-39681 * 14391))) : ((b - (-58029 * 15489)) * ((-62583 - e) & (g ? d : obj0.d))));
      obj0.e = ((((g < 7092) ? obj0.e : (b ? -1134 : 10998)) ^ (obj0.b > g)) ^ (((c | f) == c) * (52480 | -23174)));
    }
    obj0.e = obj0.b;
  } else {
    b = ((((-13470 * a) >= (-17464 ? 35993 : obj0.d)) * ((obj0.d ^ b) - (obj0.b & -44636))) ? (((g ^ obj0.e) * d) ^ ((-65098 - -53858) + (+ obj0.a))) : (obj0.b - ((-38738 ? 26098 : obj0.b) < obj0.a)));
    f = f;
    c = (++ a);
  }
}
if(((((a < 14411) ? (++ obj0.e) : (e ? 38820 : e)) ^ ((-35717 & 8635) - (10351 ? -40130 : obj0.a))) >= (obj0.e - 12457))) {
  if(((((43284 < -35051) ? (+ e) : (d + -37651)) | obj0.b) <= (52741 & d))) {
    if(((((-57891 ^ obj0.a) != (e * d)) ^ -24949) != (((f > 9100) < (60386 & h)) * (! (-18409 + 9547))))) {
      obj0.d = ((obj0.b | obj0.b) & (((a++ ) - obj0.e) + ((-50798 > -65089) ? (13572 & obj0.a) : (19115 <= obj0.c))));
      f = 57701;
      c = ((h | ((14234 & a) ^ (obj0.d ^ 34756))) ^ (f * (obj0.c | -58347)));
    } else {
      e = (((+ h) - f) + (obj0.b ^ (e++ )));
      obj0.a = ((((32451 | c) & (-62658 + e)) ^ 32347) > (((g ^ 16486) + (17358 * obj0.a)) ^ c));
      obj0.e = (+ (obj0.e - ((8534 - obj0.b) ^ (f * obj0.b))));
    }
    d = ((((d == obj0.e) * (17971 + -63527)) ^ obj0.b) | (d + obj0.a));
  } else {
    if(((((-15114 <= 63706) ? (-22042 ? e : f) : (+ h)) + ((7728 != h) ? (c & c) : 1073)) <= (((-19673 & h) * g) | ((-52932 == obj0.b) ^ (c | 13549))))) {
      c = obj0.c;
    } else {
      obj0.d = (obj0.c++ );
      d = a;
      b = ((d + ((-36924 & e) > d)) | (b * obj0.d));
    }
    obj0.e = f;
    if(((((1771 - -2934) & g) | (e & (b - d))) == (((obj0.c - c) * (- obj0.c)) - ((8344 != 83) | (- c))))) {
    } else {
      d = ((((-31602 < d) * obj0.a) | obj0.d) ? ((-33232 + obj0.d) + f) : ((+ -28416) | d));
      obj0.b = a;
    }
  }
  g = b;
  obj0.c = ((((-54348 - 52567) * (3454 ^ 24488)) + obj0.d) - (e * ((+ obj0.d) < a)));
} else {
}
g = ((((-7479 ? obj0.d : 2092) - obj0.b) & obj0.e) ^ ((e++ ) | h));
if(((((g >= h) ? (-16277 + -46052) : a) * ((obj0.e != obj0.c) | obj0.b)) != (15010 & 60683))) {
} else {
  obj0.a = obj0.c;
  if(((d & 15596) >= ((obj0.a ^ obj0.c) & (obj0.e | 25161)))) {
    e = ((-52539 - 56962) != (obj0.c & a));
    c = ((((b | c) | (-19481 ^ c)) & ((14586 > g) ? (1975 - 37421) : (-3411 + obj0.c))) | (f | g));
  } else {
  }
  if(((((-34002 == 45860) ? obj0.a : (e - d)) ^ obj0.d) >= (((-8991 ^ g) - (! -55966)) | b))) {
    if(((obj0.d | (! (51645 ^ obj0.a))) > (((obj0.d ^ 30545) & 12937) * ((-16975 != 45859) ? (36382 ? a : 5894) : (-55142 != -54397))))) {
    } else {
      a = ((((+ a) - 20373) ^ ((-31429 > obj0.a) - (7510 | -53637))) - (obj0.c * ((obj0.c ? obj0.a : obj0.d) & obj0.e)));
      c = f;
    }
  } else {
  }
}
WScript.Echo("a = " + (a>>3));
WScript.Echo("b = " + (b>>3));
WScript.Echo("c = " + (c>>3));
WScript.Echo("d = " + (d>>3));
WScript.Echo("e = " + (e>>3));
WScript.Echo("f = " + (f>>3));
WScript.Echo("g = " + (g>>3));
WScript.Echo("h = " + (h>>3));
WScript.Echo("obj0.a = " + (obj0.a>>3));
WScript.Echo("obj0.b = " + (obj0.b>>3));
WScript.Echo("obj0.c = " + (obj0.c>>3));
WScript.Echo("obj0.d = " + (obj0.d>>3));
WScript.Echo("obj0.e = " + (obj0.e>>3));
WScript.Echo("ary[0] = " + (ary[0]>>3));
WScript.Echo("ary[1] = " + (ary[1]>>3));
WScript.Echo("ary[100] = " + (ary[100]>>3));
WScript.Echo('done');
})();
