type script llamar externo elementos div dinamicamente desde crear con archivo javascript obfuscation deobfuscation

llamar - ¿Cómo funciona este Javascript mágico?



llamar javascript desde html (3)

Este es un pequeño javascript que alerta "Hola mundo":

゚ω゚ノ=/`m´)ノ~┻━┻//*´∇`*/[''_''];o=(゚ー゚)=_=3;c=(゚Θ゚)=(゚ー゚)-(゚ー゚);(゚Д゚)=(゚Θ゚)=(o^_^o)/(o^_^o);(゚Д゚)={゚Θ゚:''_'',゚ω゚ノ:((゚ω゚ノ==3)+''_'')[゚Θ゚],゚ー゚ノ:(゚ω゚ノ+''_'')[o^_^o-(゚Θ゚)],゚Д゚ノ:((゚ー゚==3)+''_'')[゚ー゚]};(゚Д゚)[゚Θ゚]=((゚ω゚ノ==3)+''_'')[c^_^o];(゚Д゚)[''c'']=((゚Д゚)+''_'')[(゚ー゚)+(゚ー゚)-(゚Θ゚)];(゚Д゚)[''o'']=((゚Д゚)+''_'')[゚Θ゚];(゚o゚)=(゚Д゚)[''c'']+(゚Д゚)[''o'']+(゚ω゚ノ+''_'')[゚Θ゚]+((゚ω゚ノ==3)+''_'')[゚ー゚]+((゚Д゚)+''_'')[(゚ー゚)+(゚ー゚)]+((゚ー゚==3)+''_'')[゚Θ゚]+((゚ー゚==3)+''_'')[(゚ー゚)-(゚Θ゚)]+(゚Д゚)[''c'']+((゚Д゚)+''_'')[(゚ー゚)+(゚ー゚)]+(゚Д゚)[''o'']+((゚ー゚==3)+''_'')[゚Θ゚];(゚Д゚)[''_'']=(o^_^o)[゚o゚][゚o゚];(゚ε゚)=((゚ー゚==3)+''_'')[゚Θ゚]+(゚Д゚).゚Д゚ノ+((゚Д゚)+''_'')[(゚ー゚)+(゚ー゚)]+((゚ー゚==3)+''_'')[o^_^o-゚Θ゚]+((゚ー゚==3)+''_'')[゚Θ゚]+(゚ω゚ノ+''_'')[゚Θ゚];(゚ー゚)+=(゚Θ゚);(゚Д゚)[゚ε゚]=''//';(゚Д゚).゚Θ゚ノ=(゚Д゚+゚ー゚)[o^_^o-(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ+''_'')[c^_^o];(゚Д゚)[゚o゚]=''/"'';(゚Д゚)[''_'']((゚Д゚)[''_''](゚ε゚+(゚Д゚)[゚o゚]+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+(゚Θ゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+((゚ー゚)+(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o)+(o^_^o))+((o^_^o)-(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o)+(o^_^o))+(゚ー゚)+(゚Д゚)[゚ε゚]+((゚ー゚)+(゚Θ゚))+(c^_^o)+(゚Д゚)[゚ε゚]+(゚ー゚)+((o^_^o)-(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚Θ゚)+(c^_^o)+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+((゚ー゚)+(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+((゚ー゚)+(o^_^o))+(゚Д゚)[゚ε゚]+(゚ー゚)+(c^_^o)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o)-(゚Θ゚))+((゚ー゚)+(o^_^o))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+((゚ー゚)+(o^_^o))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o)+(o^_^o))+((o^_^o)-(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚ー゚)+((o^_^o)-(゚Θ゚))+(゚Д゚)[゚ε゚]+((゚ー゚)+(゚Θ゚))+(゚Θ゚)+(゚Д゚)[゚o゚])(゚Θ゚))(''_'');

Una buena versión:

゚ω゚ノ = /`m´)ノ~┻━┻//*´∇`*/[''_'']; o = (゚ー゚) = _ = 3; c = (゚Θ゚) = (゚ー゚) - (゚ー゚); (゚Д゚) = (゚Θ゚) = (o^_^o)/(o^_^o); (゚Д゚) = { ゚Θ゚: ''_'', ゚ω゚ノ: ((゚ω゚ノ==3)+''_'')[゚Θ゚], ゚ー゚ノ: (゚ω゚ノ+''_'')[o^_^o-(゚Θ゚)], ゚Д゚ノ: ((゚ー゚==3)+''_'')[゚ー゚] }; (゚Д゚)[゚Θ゚] = ((゚ω゚ノ==3)+''_'')[c^_^o]; (゚Д゚)[''c''] = ((゚Д゚)+''_'')[(゚ー゚)+(゚ー゚)-(゚Θ゚)]; (゚Д゚)[''o''] = ((゚Д゚)+''_'')[゚Θ゚]; (゚o゚)=(゚Д゚)[''c''] + (゚Д゚)[''o''] + (゚ω゚ノ + ''_'')[゚Θ゚] + ((゚ω゚ノ==3) + ''_'')[゚ー゚] + ((゚Д゚) + ''_'')[(゚ー゚) + (゚ー゚)] + ((゚ー゚==3) + ''_'')[゚Θ゚] + ((゚ー゚==3) + ''_'')[(゚ー゚) - (゚Θ゚)] + (゚Д゚)[''c''] + ((゚Д゚) + ''_'')[(゚ー゚) + (゚ー゚)] + (゚Д゚)[''o''] + ((゚ー゚==3) + ''_'')[゚Θ゚]; (゚Д゚)[''_''] = (o^_^o)[゚o゚][゚o゚]; (゚ε゚) = ((゚ー゚==3) + ''_'')[゚Θ゚] + (゚Д゚).゚Д゚ノ + ((゚Д゚) + ''_'')[(゚ー゚) + (゚ー゚)] + ((゚ー゚==3) + ''_'')[o^_^o-゚Θ゚] + ((゚ー゚==3) + ''_'')[゚Θ゚] + (゚ω゚ノ+''_'')[゚Θ゚]; (゚ー゚) += (゚Θ゚); (゚Д゚)[゚ε゚] = ''//'; (゚Д゚).゚Θ゚ノ = (゚Д゚+゚ー゚)[o^_^o-(゚Θ゚)]; (o゚ー゚o) = (゚ω゚ノ+''_'')[c^_^o]; (゚Д゚)[゚o゚] = ''/"''; (゚Д゚)[''_'']((゚Д゚)[''_''](゚ε゚+(゚Д゚)[゚o゚]+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+(゚Θ゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+((゚ー゚)+(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o)+(o^_^o))+((o^_^o)-(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o)+(o^_^o))+(゚ー゚)+(゚Д゚)[゚ε゚]+((゚ー゚)+(゚Θ゚))+(c^_^o)+(゚Д゚)[゚ε゚]+(゚ー゚)+((o^_^o)-(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚Θ゚)+(c^_^o)+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+((゚ー゚)+(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+((゚ー゚)+(o^_^o))+(゚Д゚)[゚ε゚]+(゚ー゚)+(c^_^o)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o)-(゚Θ゚))+((゚ー゚)+(o^_^o))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+((゚ー゚)+(o^_^o))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o)+(o^_^o))+((o^_^o)-(゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚)+(゚Θ゚))+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚ー゚)+((o^_^o)-(゚Θ゚))+(゚Д゚)[゚ε゚]+((゚ー゚)+(゚Θ゚))+(゚Θ゚)+(゚Д゚)[゚o゚])(゚Θ゚))(''_'');

JSFiddle

Tomado desde aquí: https://codegolf.stackexchange.com/a/24041/17049

Alguien tiene alguna idea de cómo funciona? Ni siquiera veo la alert en ese código.


Antes de mirar más de cerca el código, debe saberlo ya que los identifiers JavaScript 1.5 pueden contener no solo caracteres ASCII sino también caracteres Unicode.

En este caso, muchas de estas divertidas secuencias son solo identificadores. Después de intercambiar estos identificadores por identificadores más simples y eliminar comentarios innecesarios y paréntesis, el código se ve de la siguiente manera:

a = /`m´)ノ~┻━┻/[''_'']; o = b = _ = 3; c = d = b-b; e = d = o^_^o/o^_^o; e = { d: ''_'', a: ((a==3)+''_'')[d], h: (a+''_'')[o^_^o-d], i: ((b==3)+''_'')[b] }; e[d] = ((a==3)+''_'')[c^_^o]; e[''c''] = (e+''_'')[b+b-d]; e[''o''] = (e+''_'')[d]; f = e[''c'']+e[''o'']+(a+''_'')[d]+((a==3)+''_'')[b]+(e+''_'')[b+b]+((b==3)+''_'')[d]+((b==3)+''_'')[b-d]+e[''c'']+(e+''_'')[b+b]+e[''o'']+((b==3)+''_'')[d]; e[''_''] = (o^_^o)[f][f]; g = ((b==3)+''_'')[d]+e.i+(e+''_'')[b+b]+((b==3)+''_'')[o^_^o-d]+((b==3)+''_'')[d]+(a+''_'')[d]; b += d; e[g] = ''//'; e.j = (e+b)[o^_^o-d]; obo = (a+''_'')[c^_^o]; e[f] = ''/"''; e[''_''](e[''_''](g+e[f]+e[g]+d+b+d+e[g]+d+(b+d)+b+e[g]+d+b+(b+d)+e[g]+d+((o^_^o)+(o^_^o))+((o^_^o)-d)+e[g]+d+((o^_^o)+(o^_^o))+b+e[g]+(b+d)+(c^_^o)+e[g]+b+((o^_^o)-d)+e[g]+d+d+(c^_^o)+e[g]+d+b+(b+d)+e[g]+d+(b+d)+b+e[g]+d+(b+d)+b+e[g]+d+(b+d)+(b+(o^_^o))+e[g]+b+(c^_^o)+e[g]+d+((o^_^o)-d)+(b+(o^_^o))+e[g]+d+(b+d)+(b+(o^_^o))+e[g]+d+((o^_^o)+(o^_^o))+((o^_^o)-d)+e[g]+d+(b+d)+b+e[g]+d+b+b+e[g]+b+((o^_^o)-d)+e[g]+(b+d)+d+e[f])(d))(''_'');

Ahora podemos evaluar cada declaración a la vez:

  • a = /`m´)ノ~┻━┻/[''_''] evalúa como a a = undefined
  • o = b = _ = 3 asigna o , b y _ el número entero 3
  • c = d = bb asigna d el entero 0
  • e = d = o^_^o/o^_^o asigna d el número entero 1 ( o^_^o evalúa a 3 XOR 3 XOR 3, lo que arroja 3)
  • e = { d: ''_'', a: ((a==3)+''_'')[d], h: (a+''_'')[o^_^od], i: ((b==3)+''_'')[b] } asigna e el objeto { d: ''_'', a: ''a'', h: ''d'', i: ''e'' }
  • e[d] = ((a==3)+''_'')[c^_^o] asigna e[1] la cadena ''f''
  • e[''c''] = (e+''_'')[b+bd] asigna e[''c''] la cadena ''c''
  • e[''o''] = (e+''_'')[d] asigna e[''o''] la cadena ''o''

Esto fue solo la configuración y se establecen las siguientes variables:

a = undefined b = 3 c = 0 d = 1 e = { 1: "f", a: "a", c: "c", d: "_", h: "d", i: "e", o: "o" }

La siguiente afirmación es la primera que construye algo:

f = e[''c''] + // => "c" e[''o''] + // => "o" (a+''_'')[d] + // => "undefined_"[1] = "n" ((a==3)+''_'')[b] + // => "false_"[3] = "s" (e+''_'')[b+b] + // => "object_"[6] = "t" ((b==3)+''_'')[d] + // => "true_"[1] = "r" ((b==3)+''_'')[b-d] + // => "true_"[2] = "s" e[''c''] + // => "c" (e+''_'')[b+b] + // => "object_"[6] = "t" e[''o''] + // => "o" ((b==3)+''_'')[d]; // => "true"[1] = "r"

Entonces f = "constructor" . En la siguiente declaración, este "constructor" se usa para recuperar una función:

e[''_''] = (o^_^o)[f][f]

Esto es equivalente a (3).constructor.constructor , que produce la función Function , así que:

e[''_''] = Function

Esta Function función es especial ya que uno puede construir funciones dinámicamente pasándole el código del cuerpo de la función a través de un parámetro:

f = Function("alert(1)") // equivalent to f = function() { alert(1) }

Voy a omitir las siguientes declaraciones y solo escribir las variables y valores resultantes:

a = undefined b = 4 c = 0 d = 1 e = { 1: "f", _: Function, a: "a", c: "c", constructor: "/"", d: "_", h: "d", i: "e", j: "b", o: "o", return: "//" } f = "constructor" obo = "u"

La última declaración hace el trabajo final:

e[''_''](e[''_''](g+e[f]+e[g]+d+b+d+e[g]+d+(b+d)+b+e[g]+d+b+(b+d)+e[g]+d+((o^_^o)+(o^_^o))+((o^_^o)-d)+e[g]+d+((o^_^o)+(o^_^o))+b+e[g]+(b+d)+(c^_^o)+e[g]+b+((o^_^o)-d)+e[g]+d+d+(c^_^o)+e[g]+d+b+(b+d)+e[g]+d+(b+d)+b+e[g]+d+(b+d)+b+e[g]+d+(b+d)+(b+(o^_^o))+e[g]+b+(c^_^o)+e[g]+d+((o^_^o)-d)+(b+(o^_^o))+e[g]+d+(b+d)+(b+(o^_^o))+e[g]+d+((o^_^o)+(o^_^o))+((o^_^o)-d)+e[g]+d+(b+d)+b+e[g]+d+b+b+e[g]+b+((o^_^o)-d)+e[g]+(b+d)+d+e[f])(d))(''_'');

Esto es equivalente a:

Function(Function( … )(1))(''_'')

La expresión larga construye la siguiente cadena:

return"/141/154/145/162/164/50/42/110/145/154/154/157/40/127/157/162/154/144/42/51"

La cadena escapada evalúa:

alert("Hello World")

Este código de return se pasa a la Function , que crea una función anónima como:

function anonymous() { return"/141/154/145/162/164/50/42/110/145/154/154/157/40/127/157/162/154/144/42/51"; }

Lo cual, lo sabemos, es equivalente a:

function anonymous() { return"alert(/"Hello World/")"; }

Esta función se ejecuta con 1 como parámetro, que devuelve la cadena resultante:

alert("Hello World")

Esto se pasa nuevamente a Function , lo que crea una nueva función anónima:

function anonymous() { alert("Hello World"); }

Finalmente, esta función también se invoca con ''_'' como parámetro.


Déjame explicarte los pasos clave:

El código crea un objeto llamado Д y luego agrega una propiedad ''_'' que tiene un valor de mágico constructor de función de JavaScript. En JavaScript, puede ejecutar cualquier cadena como código pasándola al constructor de la función.

¿Cómo contiene (゚Д゚)[''_''] constructor de Funciones? Es una técnica inteligente hecha por la siguiente línea:

(゚Д゚)[''_''] = (o^_^o)[゚o゚][゚o゚];

Aquí oy _ se establece en 3. Entonces o^_^o vuelve a 3. Obviamente, el autor podría haber usado o porque o^_^o devuelve el mismo valor, pero supongo que tiene buen gusto para la ofuscación :). Entonces la expresión anterior ahora se vuelve (3)[゚o゚][゚o゚] .

El valor de ゚o゚ en corchete cuadrado se establece en la cadena "constructor" que se construyó mediante concatenación en la instrucción anterior. Utiliza una forma muy inteligente de construir el "constructor" de cadenas eliminando caracteres individuales de cadenas de JavaScript integradas como "objeto", "verdadero", "falso" y "indefinido" que se generan a partir de expresiones de JavaScript convertidas en cadena. Al parecer, el autor no pudo encontrar el carácter "c" para desprenderse de estas cadenas incorporadas, por lo que tuvo que escribirlo explícitamente. Tenga en cuenta que el carácter entre corchetes es ゚ o ゚, que es un carácter Unicode, no el simple o usado entre corchetes, aunque ambos se ven muy similares. Cuando lo haces (3)("constructor") , devuelve la función del constructor Número . El constructor del constructor Number es el constructor de la función. Así que al hacer (3)("constructor")("constructor") se obtiene el constructor de funciones, que ahora finalmente puede pasar una cadena arbitraria para ejecutarlo.

La última línea crea la cadena "alert(/"Hello World/")" y la pasa al constructor de la Función para ejecutarla.

La pregunta es ¿cómo podemos obtener esa cadena de "alert(/"Hello World/")" sin escribir el alfabeto real? La técnica inteligente es usar /xxx donde xxx es un número octal y se traduce a un personaje. Para obtener esta cadena, los números que necesita son 0, 1, 2, 3, 4, 5, 6, 7 y 8. Pero en realidad no necesita todos estos, en su lugar puede producirlos mediante aritmética simple con tres números 0 , 1 y 4. Entonces, por ejemplo, para producir el carácter ''a'' en "alerta", necesita ASCII decimal 97 o octal 141, es decir, /141 . Si solo tiene 0, 1 y 4 almacenados en alguna propiedad del objeto anterior, puede concatenarlos para producir ''a'' . De esta forma puedes generar cualquier cadena incluso si todo lo que tienes está 0, 1 y 4 almacenado en algunas propiedades del objeto Д. ¿Inteligente? ¡Apuesto!


Hay muchas cosas aquí. Los paréntesis alrededor de las variables no son funcionales.

Básicamente él construye esta cadena:

return"/141/154/145/162/164/50/42/110/145/154/154/157/40/127/157/162/154/144/42/51"

Que es una versión escapada de

return "alert(/"Hello World/")"

Y finalmente hace esto:

Function(Function(''return "alert(//"Hello World//")"'')())()

La doble Function parece una cosa arbitraria, pero no lo es. Function() interpreta barras diagonales inversas en la cadena como caracteres de escape. Entonces la primera llamada se decodifica, y la segunda se ejecuta.

Function("return ''//110//145//154//154//157''")() // => "Hello"

Este es el mismo código, mejor formateado y con nombres de variables "normales";

var1=/`m´)ノ~┻━┻//*´∇`*/[''_'']; three=(threeThenFour)=_=3; c=(one)=(threeThenFour)-(threeThenFour); (anObject)=(one)=(three)/(three); (anObject)={ one:''_'', var1:((var1==3)+''_'')[one], var2ノ:(var1+''_'')[three-(one)], var4ノ:((threeThenFour==3)+''_'')[threeThenFour] }; (anObject)[one]=((var1==3)+''_'')[c ^ _ ^ three]; (anObject)[''c'']=((anObject)+''_'')[(threeThenFour)+(threeThenFour)-(one)]; (anObject)[''three'']=((anObject)+''_'')[one]; (theConstructor)=(anObject)[''c'']+ (anObject)[''three'']+ (var1+''_'')[one]+ ((var1==3)+''_'')[threeThenFour]+ ((anObject)+''_'')[(threeThenFour)+(threeThenFour)]+ ((threeThenFour==3)+''_'')[one]+ ((threeThenFour==3)+''_'')[(threeThenFour)-(one)]+ (anObject)[''c'']+ ((anObject)+''_'')[(threeThenFour)+(threeThenFour)]+ (anObject)[''three'']+ ((threeThenFour==3)+''_'')[one]; // theConstructor => "constructor" (anObject)[''_'']=(three)[theConstructor][theConstructor]; (theReturn)=((threeThenFour==3)+''_'')[one]+ (anObject).var4ノ+ ((anObject)+''_'')[(threeThenFour)+(threeThenFour)]+ ((threeThenFour==3)+''_'')[three-one]+ ((threeThenFour==3)+''_'')[one]+ (var1+''_'')[one]; // theReturn => "return" (threeThenFour)+=(one); (anObject)[theReturn]=''//'; (anObject).var3ノ=(anObject+threeThenFour)[three-(one)]; (ovar2o)=(var1+''_'')[c ^ _ ^ three]; (anObject)[theConstructor]=''/"''; // (anObject)[''_''] => Function (anObject)[''_'']( (anObject)[''_''](theReturn+ (anObject)[theConstructor]+ (anObject)[theReturn]+ (one)+ (threeThenFour)+ (one)+ (anObject)[theReturn]+ (one)+ ((threeThenFour)+(one))+ (threeThenFour)+ (anObject)[theReturn]+ (one)+( threeThenFour)+ ((threeThenFour)+(one))+ (anObject)[theReturn]+ (one)+ ((three)+(three))+ ((three)-(one))+ (anObject)[theReturn]+ (one)+ ((three)+(three))+ (threeThenFour)+ (anObject)[theReturn]+ ((threeThenFour)+(one))+ (c ^ _ ^ three)+ (anObject)[theReturn]+ (threeThenFour)+((three)-(one))+ (anObject)[theReturn]+ (one)+(one)+ (c ^ _ ^ three)+ (anObject)[theReturn]+ (one)+ (threeThenFour)+ ((threeThenFour)+(one))+ (anObject)[theReturn]+ (one)+ ((threeThenFour)+(one))+ (threeThenFour)+ (anObject)[theReturn]+ (one)+ ((threeThenFour)+(one))+ (threeThenFour)+ (anObject)[theReturn]+ (one)+ ((threeThenFour)+(one))+ ((threeThenFour)+(three))+ (anObject)[theReturn]+ (threeThenFour)+ (c ^ _ ^ three)+ (anObject)[theReturn]+ (one)+ ((three)-(one))+ ((threeThenFour)+(three))+ (anObject)[theReturn]+ (one)+ ((threeThenFour)+(one))+ ((threeThenFour)+(three))+ (anObject)[theReturn]+ (one)+ ((three)+(three))+ ((three)-(one))+ (anObject)[theReturn]+ (one)+ ((threeThenFour)+(one))+ (threeThenFour)+ (anObject)[theReturn]+ (one)+ (threeThenFour)+ (threeThenFour)+ (anObject)[theReturn]+ (threeThenFour)+ ((three)-(one))+ (anObject)[theReturn]+ ((threeThenFour)+(one))+ (one)+ (anObject)[theConstructor] ) (one) )(''_'');