//-------------------------------------------------------------------------------------------------------
// 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 = 51927;
b = 2136;
c = 55550;
d = 5231;
e = -25929;
f = -17612;
g = 19839;
h = 51056;
obj0.a = 42569;
obj0.b = 52464;
obj0.c = 64760;
obj0.d = 37919;
obj0.e = 45509;
ary[0] = -12978;
ary[1] = 38031;
ary[100] = -57661;
if((((! obj0.b) | ((f * d) | -26727)) > (((a > obj0.c) ? g : (-22982 ? 18137 : 5291)) | b))) {
  if(((g - d) >= (((f - -63461) - (d <= 28055)) ^ d))) {
    obj0.d = (((- (! e)) * 38184) ? ((h | obj0.b) | (e * (-19874 | 48337))) : (-40348 & ((-18512 ? -46155 : g) <= (- -22706))));
    h = g;
  } else {
    b = ((f | ((g + obj0.c) * (29271 & -24782))) & (e - obj0.d));
    if((((+ -44688) * -58908) < (((-12901 != c) ? d : (-61519 | obj0.b)) * f))) {
      obj0.c = (((obj0.d | e) + d) ^ (h * ((- 64243) - (16271 | 57831))));
      obj0.a = ((d ^ (d * -1726)) ? ((e | -18879) + -15112) : ((f <= (-41356 ? 8411 : e)) * (- obj0.d)));
      obj0.c = (((obj0.b ^ (-47881 - a)) * b) & (((obj0.d ? obj0.a : obj0.b) - e) + ((-13090 >= h) ? (56640 * -18069) : (33472 * obj0.d))));
    } else {
      a = ((((30081 | -47041) + (40266 + -8157)) | (obj0.b ^ d)) * ((! c) & obj0.a));
    }
  }
} else {
}
e = ((((-17900 > f) ? (obj0.a ? 52540 : -54515) : (d ? c : d)) + (g++ )) | (e & ((obj0.c == obj0.e) ? (g * b) : (! d))));
if(((a | ((obj0.d * 25364) * obj0.e)) >= (3691 & ((obj0.a + 22347) | obj0.a)))) {
  g = (((-54011 < (- 16159)) * (f + (-3016 - 21364))) | ((obj0.d == f) & e));
} else {
  obj0.e = ((((+ obj0.d) | 4126) + b) - ((b & (obj0.d & -55676)) | (65260 * (-16504 | c))));
}
if(((obj0.c + obj0.d) <= (((-30806 + -8336) ^ (35728 < a)) + (obj0.a < (18765 - 37810))))) {
  if(((((obj0.d - 35024) - b) ^ (+ obj0.e)) < (((-48170 | -65424) | obj0.c) | ((a | d) + (g | g))))) {
    d = h;
    if(((h * ((obj0.c + obj0.c) == (g - 19806))) >= ((! (c * -3691)) ^ obj0.b))) {
    } else {
      e = obj0.d;
      obj0.b = (((obj0.a + -54855) & (c++ )) <= (obj0.c * 65265));
      f = obj0.c;
    }
  } else {
    c = ((obj0.b + d) - (61542 + f));
  }
} else {
  obj0.b = obj0.a;
}
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');
})();
