// File: ArashPartow[P]exprtk-extras/exprtk_miller_rabin_primality_test.cpp
// Function: void miller_rabin_probabilistic_primality_test<double>()
void miller_rabin_probabilistic_primality_test()
{
   typedef exprtk::symbol_table<T>         symbol_table_t;
   typedef exprtk::expression<T>           expression_t;
   typedef exprtk::parser<T>               parser_t;
   typedef exprtk::function_compositor<T>  compositor_t;
   typedef typename compositor_t::function function_t;

   T prime_numbers[] =
   {
      5083823,   5083879,   5083889,   5083909,   5083913,   5083927,   5083931,  5083957,
      5083973,   5083993,   5084017,   5084033,   5084069,   5084099,   5084111,  5084113,
      5084117,   5084129,   5084141,   5084147,   5084171,   5084179,   5084197,  5084213,
      5084221,   5084243,   5084249,   5084263,   5084269,   5084333,   5084371,  5084383,
      5084393,   5084399,   5084407,   5084423,   5084437,   5084447,   5084461,  5084473,
      5084477,   5084489,   5084501,   5084509,   5084531,   5084537,   5084543,  5084549,
      5084551,   5084557,   5084567,   5084593,   5084617,   5084627,   5084641,  5084671,
      5084689,   5084693,   5084711,   5084731,   5084743,   5084749,   5084753,  5084803,
      5084809,   5084813,   5084843,   5084851,   5084867,   5084869,   5084897,  5084903,
      6782807,   6782821,   6782827,   6782833,   6782869,   6782903,   6782911,  6782921,
      6782929,   6782933,   6782939,   6782959,   6782969,   6782977,   6783011,  6783031,
      6783047,   6783067,   6783083,   6783089,   6783097,   6783107,   6783131,  6783143,
      6783149,   6783151,   6783169,   6783193,   6783211,   6783223,   6783239,  6783241,
      6783253,   6783263,   6783299,   6783317,   6783331,   6783353,   6783421,  6783433,
      6783449,   6783457,   6783461,   6783467,   6783481,   6783521,   6783529,  6783533,
      9723667,   9723691,   9723697,   9723709,   9723713,   9723757,   9723761,  9723767,
      9723773,   9723797,   9723799,   9723803,   9723809,   9723821,   9723829,  9723841,
      9723851,   9723853,   9723869,   9723887,   9723893,   9723907,   9723913,  9723937,
      9723941,   9723943,   9723979,   9723997,   9724021,   9724061,   9724079,  9724087,
      9724097,   9724103,   9724129,   9724151,   9724171,   9724201,   9724207,  9724213,
      9724223,   9724241,   9724259,   9724277,   9724279,   9724283,   9724291,  9724327,
     10619129,  10619131,  10619137,  10619159,  10619177,  10619179,  10619209, 10619243,
     10619251,  10619263,  10619291,  10619303,  10619327,  10619341,  10619381, 10619393,
     10619431,  10619489,  10619501,  10619503,  10619513,  10619563,  10619573, 10619591,
     10619599,  10619617,  10619621,  10619641,  10619647,  10619669,  10619681, 10619711,
     10619723,  10619729,  10619731,  10619737,  10619759,  10619773,  10619783, 10619801,
     10619863,  10619893,  10619897,  10619899,  10619911,  10619923,  10619927, 10619957,
     10619971,  10619989,  10620007,  10620023,  10620041,  10620067,  10620131, 10620133,
     10620139,  10620143,  10620149,  10620151,  10620157,  10620163,  10620179, 10620199,
     10748671,  10748687,  10748693,  10748701,  10748707,  10748713,  10748747, 10748767,
     10748779,  10748783,  10748791,  10748807,  10748809,  10748827,  10748849, 10748863,
     10748867,  10748869,  10748873,  10748893,  10748897,  10748917,  10748921, 10748923,
     10748951,  10748953,  10748957,  10748963,  10748987,  10748999,  10749001, 10749023,
     10749029,  10749059,  10749061,  10749071,  10749077,  10749107,  10749121, 10749143,
     10749161,  10749163,  10749173,  10749191,  10749197,  10749199,  10749241, 10749251,
     10749259,  10749283,  10749313,  10749317,  10749337,  10749367,  10749371, 10749373,
     10749379,  10749391,  10749433,  10749437,  10749449,  10749461,  10749493, 10749581,
     10749587,  10749601,  10749617,  10749631,  10749659,  10749677,  10749679, 10749703,
     10749709,  10749719,  10749727,  10749743,  10749773,  10749779,  10749811, 10749821,
     10749833,  10749853,  10749857,  10749863,  10749881,  10749883,  10749889, 10749917,
     10749971,  10749983,  10749989,  10749997,  10750009,  10750021,  10750031, 10750037,
     10750049,  10750057,  10750073,  10750099,  10750127,  10750141,  10750147, 10750189,
     10750193,  10750249,  10750279,  10750303,  10750309,  10750319,  10750349, 10750373,
   };

   T composites[] =
   {
       199203677,  779234623,  843093203,  883543291, 1197162971,
      1282615157, 1552390397, 1765737859, 1878769589, 1993904873,
      2257133471, 2520523529, 2579094799, 2853450949, 2935025369,
      3095780533, 3164132249, 3408963511, 4260042859, 4608613981,
      4654875857, 5085931997, 7278175081, 7289187463, 9206112101
   };

   exprtk::rtl::io::println<T> println;
   random_uint<T>              random;

   symbol_table_t symbol_table;

   symbol_table.add_vector  ("prime_numbers"    , prime_numbers);
   symbol_table.add_vector  ("composite_numbers", composites   );
   symbol_table.add_function("println"          , println      );
   symbol_table.add_function("random"           , random       );

   compositor_t compositor(symbol_table);

   compositor.add(function_t()
      .name("modexp") // (base^exponent) mod m
      .var("b") // base
      .var("e") // exponent
      .var("m") // modulo
      .expression
      (
         " if (m == 1)                       "
         " {                                 "
         "    return [0];                    "
         " };                                "
         "                                   "
         " var result := 1;                  "
         " b %= m;                           "
         "                                   "
         " while (e > 0)                     "
         " {                                 "
         "    if ((e % 2) == 1)              "
         "    {                              "
         "       result := (result * b) % m; "
         "    };                             "
         "                                   "
         "    b := b^2 % m;                  "
         "    e := floor(e / 2);             "
         " };                                "
         "                                   "
         " result                            "
      ));

   compositor.add(function_t()
      .name("is_probable_prime")
      .var("n") // Number to test for primaility
      .var("k") // Number of iterations to perform
      .expression
      (
         " switch                                             "
         " {                                                  "
         "    case n <= 1       : return [false];             "
         "    case frac(n) != 0 : return [false];             "
         "    case n == 2       : return [true ];             "
         " };                                                 "
         "                                                    "
         " if (((n - 1) % 6 != 0) and ((n + 1) % 6 != 0))     "
         " {                                                  "
         "    return [false];                                 "
         " };                                                 "
         "                                                    "
         " var primes[25] :=                                  "
         "     {                                              "
         "        2,  3,  5,  7, 11, 13, 17, 19, 23,          "
         "       29, 31, 37, 41, 43, 47, 53, 59, 61,          "
         "       67, 71, 73, 79, 83, 89, 97                   "
         "     };                                             "
         "                                                    "
         " var upper_bound := min(n - 1, trunc(sqrt(n)) + 1); "
         "                                                    "
         " for (var i := 0; i < primes[]; i += 1)             "
         " {                                                  "
         "    if (primes[i] >= upper_bound)                   "
         "       return [true];                               "
         "    else if ((n % primes[i]) == 0)                  "
         "       return [false];                              "
         " };                                                 "
         "                                                    "
         " var s := n - 1;                                    "
         " var t := 0;                                        "
         "                                                    "
         " while ((s % 2) == 0)                               "
         " {                                                  "
         "    s := floor(s / 2);                              "
         "    t += 1;                                         "
         " };                                                 "
         "                                                    "
         " for (var trials := 0; trials < k; trials += 1)     "
         " {                                                  "
         "    var a := random(2, n - 2);                      "
         "    var x := modexp(a, s, n);                       "
         "                                                    "
         "    if ((x == 1) or (x == (n - 1)))                 "
         "    {                                               "
         "       continue;                                    "
         "    };                                              "
         "                                                    "
         "    for (var r := 1; r < t; r += 1)                 "
         "    {                                               "
         "       x := modexp(x, 2, n);                        "
         "                                                    "
         "       if (x == 1)                                  "
         "          return [false];                           "
         "       else if (x == (n - 1))                       "
         "          break;                                    "
         "    };                                              "
         "                                                    "
         "    if (x != (n - 1))                               "
         "    {                                               "
         "       return [false];                              "
         "    };                                              "
         " };                                                 "
         "                                                    "
         " return [true];                                     "
      ));

   const std::string miller_rabin_primality_test_program =
      "                                                     "
      " println('Testing prime numbers...');                "
      " for (var i := 0; i < prime_numbers[]; i += 1)       "
      " {                                                   "
      "    var n := prime_numbers[i];                       "
      "                                                     "
      "    if (is_probable_prime(n,1000))                   "
      "    {                                                "
      "       println(n, ' is correctly a prime number');   "
      "    }                                                "
      "    else                                             "
      "    {                                                "
      "       println(n, ' is NOT a prime number (error)'); "
      "    }                                                "
      " };                                                  "
      "                                                     "
      " println('Testing composite numbers...');            "
      " for (var i := 0; i < composite_numbers[]; i += 1)   "
      " {                                                   "
      "    var n := composite_numbers[i];                   "
      "                                                     "
      "    if (not(is_probable_prime(n,1000)))              "
      "    {                                                "
      "       println(n, ' is correctly a composite');      "
      "    }                                                "
      "    else                                             "
      "    {                                                "
      "       println(n, ' is a prime number (error)');     "
      "    }                                                "
      " };                                                  "
      "                                                     "
      " for (var i := 0; i < prime_numbers[]; i += 1)       "
      " {                                                   "
      "    for (var j := i; j < prime_numbers[]; j += 1)    "
      "    {                                                "
      "       var n := prime_numbers[i] * prime_numbers[j]; "
      "                                                     "
      "       if (not(is_probable_prime(n,1000)))           "
      "       {                                             "
      "          println(n, ' is correctly a composite');   "
      "       }                                             "
      "       else                                          "
      "       {                                             "
      "          println(n, ' is a prime number (error)');  "
      "       }                                             "
      "    }                                                "
      " };                                                  ";

   expression_t expression;
   expression.register_symbol_table(symbol_table);

   parser_t parser;
   parser.compile(miller_rabin_primality_test_program,expression);

   expression.value();
}

// Assembly:
subq $0x3888, %rsp           # imm = 0x3888
leaq 0x3512a2(%rip), %rsi    # 0x46cb10
leaq 0x2dc0(%rsp), %rdi
movl $0xac0, %edx            # imm = 0xAC0
callq 0x114090
leaq 0x351d49(%rip), %rsi    # 0x46d5d0
leaq 0x2cf0(%rsp), %rdi
movl $0xc8, %edx
callq 0x114090
leaq 0x2c67(%rsp), %rdi
movq %rdi, 0xc0(%rsp)
callq 0x114690
movq 0xc0(%rsp), %rdx
leaq 0x34aca4(%rip), %rsi    # 0x466561
leaq 0x2c68(%rsp), %rdi
callq 0x11b7a0
jmp 0x11b8cc
leaq 0x2c88(%rsp), %rdi
leaq 0x2c68(%rsp), %rsi
callq 0x11c810
jmp 0x11b8e3
leaq 0x2c68(%rsp), %rdi
callq 0x1147d8
leaq 0x2c67(%rsp), %rdi
callq 0x1147c0
leaq 0x18a0(%rsp), %rdi
callq 0x11c920
jmp 0x11b90c
leaq 0x1898(%rsp), %rdi
movl $0x1, %esi
callq 0x11cab0
jmp 0x11b920
leaq 0x1877(%rsp), %rdi
movq %rdi, 0xb8(%rsp)
callq 0x114690
movq 0xb8(%rsp), %rdx
leaq 0x34ac24(%rip), %rsi    # 0x466568
leaq 0x1878(%rsp), %rdi
callq 0x11b7a0
jmp 0x11b953
leaq 0x1898(%rsp), %rdi
leaq 0x1878(%rsp), %rsi
leaq 0x2dc0(%rsp), %rdx
callq 0x11caf0
jmp 0x11b972
leaq 0x1878(%rsp), %rdi
callq 0x1147d8
leaq 0x1877(%rsp), %rdi
callq 0x1147c0
leaq 0x184f(%rsp), %rdi
movq %rdi, 0xb0(%rsp)
callq 0x114690
movq 0xb0(%rsp), %rdx
leaq 0x34abc6(%rip), %rsi    # 0x466576
leaq 0x1850(%rsp), %rdi
callq 0x11b7a0
jmp 0x11b9bf
leaq 0x1898(%rsp), %rdi
leaq 0x1850(%rsp), %rsi
leaq 0x2cf0(%rsp), %rdx
callq 0x11cb90
jmp 0x11b9de
leaq 0x1850(%rsp), %rdi
callq 0x1147d8
leaq 0x184f(%rsp), %rdi
callq 0x1147c0
leaq 0x1827(%rsp), %rdi
movq %rdi, 0xa8(%rsp)
callq 0x114690
movq 0xa8(%rsp), %rdx
leaq 0x34ab6c(%rip), %rsi    # 0x466588
leaq 0x1828(%rsp), %rdi
callq 0x11b7a0
jmp 0x11ba2b
leaq 0x1898(%rsp), %rdi
leaq 0x1828(%rsp), %rsi
leaq 0x2c88(%rsp), %rdx
callq 0x11cc30
jmp 0x11ba4a
leaq 0x1828(%rsp), %rdi
callq 0x1147d8
leaq 0x1827(%rsp), %rdi
callq 0x1147c0
leaq 0x17ff(%rsp), %rdi
movq %rdi, 0xa0(%rsp)
callq 0x114690
movq 0xa0(%rsp), %rdx
leaq 0x34ab08(%rip), %rsi    # 0x466590
leaq 0x1800(%rsp), %rdi
callq 0x11b7a0
jmp 0x11ba97
leaq 0x1898(%rsp), %rdi
leaq 0x1800(%rsp), %rsi
leaq 0x18a0(%rsp), %rdx
callq 0x11ce30
jmp 0x11bab6
leaq 0x1800(%rsp), %rdi
callq 0x1147d8
leaq 0x17ff(%rsp), %rdi
callq 0x1147c0
leaq 0xe10(%rsp), %rdi
leaq 0x1898(%rsp), %rsi
callq 0x11ced0
jmp 0x11bae7
leaq 0xd80(%rsp), %rdi
callq 0x11d0c0
jmp 0x11baf6
leaq 0xd5f(%rsp), %rdi
movq %rdi, 0x98(%rsp)
callq 0x114690
movq 0x98(%rsp), %rdx
leaq 0x34aa7d(%rip), %rsi    # 0x466597
leaq 0xd60(%rsp), %rdi
callq 0x11b7a0
jmp 0x11bb29
leaq 0xd80(%rsp), %rdi
leaq 0xd60(%rsp), %rsi
callq 0x11d130
movq %rax, 0x90(%rsp)
jmp 0x11bb48
leaq 0xd37(%rsp), %rdi
movq %rdi, 0x88(%rsp)
callq 0x114690
movq 0x88(%rsp), %rdx
leaq 0x34aa32(%rip), %rsi    # 0x46659e
leaq 0xd38(%rsp), %rdi
callq 0x11b7a0
jmp 0x11bb7b
movq 0x90(%rsp), %rdi
leaq 0xd38(%rsp), %rsi
callq 0x11d160
movq %rax, 0x80(%rsp)
jmp 0x11bb9a
leaq 0xd0f(%rsp), %rdi
movq %rdi, 0x78(%rsp)
callq 0x114690
movq 0x78(%rsp), %rdx
leaq 0x34d20b(%rip), %rsi    # 0x468dc3
leaq 0xd10(%rsp), %rdi
callq 0x11b7a0
jmp 0x11bbc7
movq 0x80(%rsp), %rdi
leaq 0xd10(%rsp), %rsi
callq 0x11d160
movq %rax, 0x70(%rsp)
jmp 0x11bbe3
leaq 0xce7(%rsp), %rdi
movq %rdi, 0x68(%rsp)
callq 0x114690
movq 0x68(%rsp), %rdx
leaq 0x34a994(%rip), %rsi    # 0x466595
leaq 0xce8(%rsp), %rdi
callq 0x11b7a0
jmp 0x11bc10
movq 0x70(%rsp), %rdi
leaq 0xce8(%rsp), %rsi
callq 0x11d160
movq %rax, 0x60(%rsp)
jmp 0x11bc29
leaq 0xcbf(%rsp), %rdi
movq %rdi, 0x58(%rsp)
callq 0x114690
movq 0x58(%rsp), %rdx
leaq 0x34a959(%rip), %rsi    # 0x4665a0
leaq 0xcc0(%rsp), %rdi
callq 0x11b7a0
jmp 0x11bc56
movq 0x60(%rsp), %rdi
leaq 0xcc0(%rsp), %rsi
callq 0x11d190
movq %rax, 0x50(%rsp)
jmp 0x11bc6f
movq 0x50(%rsp), %rsi
leaq 0xe10(%rsp), %rdi
xorl %edx, %edx
callq 0x11d070
jmp 0x11bc85
leaq 0xcc0(%rsp), %rdi
callq 0x1147d8
leaq 0xcbf(%rsp), %rdi
callq 0x1147c0
leaq 0xce8(%rsp), %rdi
callq 0x1147d8
leaq 0xce7(%rsp), %rdi
callq 0x1147c0
leaq 0xd10(%rsp), %rdi
callq 0x1147d8
leaq 0xd0f(%rsp), %rdi
callq 0x1147c0
leaq 0xd38(%rsp), %rdi
callq 0x1147d8
leaq 0xd37(%rsp), %rdi
callq 0x1147c0
leaq 0xd60(%rsp), %rdi
callq 0x1147d8
leaq 0xd5f(%rsp), %rdi
callq 0x1147c0
leaq 0xd80(%rsp), %rdi
callq 0x11d1c0
leaq 0xc28(%rsp), %rdi
callq 0x11d0c0
jmp 0x11bd23
leaq 0xc07(%rsp), %rdi
movq %rdi, 0x48(%rsp)
callq 0x114690
movq 0x48(%rsp), %rdx
leaq 0x34ab1c(%rip), %rsi    # 0x46685d
leaq 0xc08(%rsp), %rdi
callq 0x11b7a0
jmp 0x11bd50
leaq 0xc28(%rsp), %rdi
leaq 0xc08(%rsp), %rsi
callq 0x11d130
movq %rax, 0x40(%rsp)
jmp 0x11bd6c
leaq 0xbdf(%rsp), %rdi
movq %rdi, 0x38(%rsp)
callq 0x114690
movq 0x38(%rsp), %rdx
leaq 0x34a6a6(%rip), %rsi    # 0x466430
leaq 0xbe0(%rsp), %rdi
callq 0x11b7a0
jmp 0x11bd99
movq 0x40(%rsp), %rdi
leaq 0xbe0(%rsp), %rsi
callq 0x11d160
movq %rax, 0x30(%rsp)
jmp 0x11bdb2
leaq 0xbb7(%rsp), %rdi
movq %rdi, 0x28(%rsp)
callq 0x114690
movq 0x28(%rsp), %rdx
leaq 0x34a5d8(%rip), %rsi    # 0x4663a8
leaq 0xbb8(%rsp), %rdi
callq 0x11b7a0
jmp 0x11bddf
movq 0x30(%rsp), %rdi
leaq 0xbb8(%rsp), %rsi
callq 0x11d160
movq %rax, 0x20(%rsp)
jmp 0x11bdf8
leaq 0xb8f(%rsp), %rdi
movq %rdi, 0x18(%rsp)
callq 0x114690
movq 0x18(%rsp), %rdx
leaq 0x34aa59(%rip), %rsi    # 0x46686f
leaq 0xb90(%rsp), %rdi
callq 0x11b7a0
jmp 0x11be25
movq 0x20(%rsp), %rdi
leaq 0xb90(%rsp), %rsi
callq 0x11d190
movq %rax, 0x10(%rsp)
jmp 0x11be3e
movq 0x10(%rsp), %rsi
leaq 0xe10(%rsp), %rdi
xorl %edx, %edx
callq 0x11d070
jmp 0x11be54
leaq 0xb90(%rsp), %rdi
callq 0x1147d8
leaq 0xb8f(%rsp), %rdi
callq 0x1147c0
leaq 0xbb8(%rsp), %rdi
callq 0x1147d8
leaq 0xbb7(%rsp), %rdi
callq 0x1147c0
leaq 0xbe0(%rsp), %rdi
callq 0x1147d8
leaq 0xbdf(%rsp), %rdi
callq 0x1147c0
leaq 0xc08(%rsp), %rdi
callq 0x1147d8
leaq 0xc07(%rsp), %rdi
callq 0x1147c0
leaq 0xc28(%rsp), %rdi
callq 0x11d1c0
leaq 0xb67(%rsp), %rdi
movq %rdi, 0x8(%rsp)
callq 0x114690
movq 0x8(%rsp), %rdx
leaq 0x34b6bd(%rip), %rsi    # 0x4675a4
leaq 0xb68(%rsp), %rdi
callq 0x11b7a0
jmp 0x11bef6
leaq 0xb67(%rsp), %rdi
callq 0x1147c0
leaq 0xb40(%rsp), %rdi
callq 0x11d200
jmp 0x11bf12
leaq 0xb40(%rsp), %rdi
leaq 0x1898(%rsp), %rsi
callq 0x11d2b0
jmp 0x11bf29
leaq 0xc8(%rsp), %rdi
movl $0x7f, %esi
callq 0x11d360
jmp 0x11bf3d
leaq 0x218(%rsp), %rdi
leaq 0xc8(%rsp), %rsi
callq 0x11d490
jmp 0x11bf54
leaq 0xc8(%rsp), %rdi
callq 0x11dcc0
leaq 0x218(%rsp), %rdi
leaq 0xb68(%rsp), %rsi
leaq 0xb40(%rsp), %rdx
callq 0x11dd30
jmp 0x11bf80
leaq 0xb40(%rsp), %rdi
callq 0x11e5c0
jmp 0x11bf8f
leaq 0x218(%rsp), %rdi
callq 0x11e5e0
leaq 0xb40(%rsp), %rdi
callq 0x11e7e0
leaq 0xb68(%rsp), %rdi
callq 0x1147d8
leaq 0xe10(%rsp), %rdi
callq 0x11e820
leaq 0x1898(%rsp), %rdi
callq 0x11e8b0
leaq 0x18a0(%rsp), %rdi
callq 0x11e930
leaq 0x2c88(%rsp), %rdi
callq 0x11e940
addq $0x3888, %rsp           # imm = 0x3888
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c029
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0x2c68(%rsp), %rdi
callq 0x1147d8
leaq 0x2c67(%rsp), %rdi
callq 0x1147c0
jmp 0x11c55b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c54e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c541
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c0a4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0x1878(%rsp), %rdi
callq 0x1147d8
leaq 0x1877(%rsp), %rdi
callq 0x1147c0
jmp 0x11c534
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c0ed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0x1850(%rsp), %rdi
callq 0x1147d8
leaq 0x184f(%rsp), %rdi
callq 0x1147c0
jmp 0x11c534
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c136
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0x1828(%rsp), %rdi
callq 0x1147d8
leaq 0x1827(%rsp), %rdi
callq 0x1147c0
jmp 0x11c534
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c17f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0x1800(%rsp), %rdi
callq 0x1147d8
leaq 0x17ff(%rsp), %rdi
callq 0x1147c0
jmp 0x11c534
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c534
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c527
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c324
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c317
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c30a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c2fd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c2f0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c2e3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c2d6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c2c9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c2bc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0xcc0(%rsp), %rdi
callq 0x1147d8
leaq 0xcbf(%rsp), %rdi
callq 0x1147c0
leaq 0xce8(%rsp), %rdi
callq 0x1147d8
leaq 0xce7(%rsp), %rdi
callq 0x1147c0
leaq 0xd10(%rsp), %rdi
callq 0x1147d8
leaq 0xd0f(%rsp), %rdi
callq 0x1147c0
leaq 0xd38(%rsp), %rdi
callq 0x1147d8
leaq 0xd37(%rsp), %rdi
callq 0x1147c0
leaq 0xd60(%rsp), %rdi
callq 0x1147d8
leaq 0xd5f(%rsp), %rdi
callq 0x1147c0
leaq 0xd80(%rsp), %rdi
callq 0x11d1c0
jmp 0x11c527
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c458
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c44b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c43e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c431
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c424
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c417
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c40a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0xb90(%rsp), %rdi
callq 0x1147d8
leaq 0xb8f(%rsp), %rdi
callq 0x1147c0
leaq 0xbb8(%rsp), %rdi
callq 0x1147d8
leaq 0xbb7(%rsp), %rdi
callq 0x1147c0
leaq 0xbe0(%rsp), %rdi
callq 0x1147d8
leaq 0xbdf(%rsp), %rdi
callq 0x1147c0
leaq 0xc08(%rsp), %rdi
callq 0x1147d8
leaq 0xc07(%rsp), %rdi
callq 0x1147c0
leaq 0xc28(%rsp), %rdi
callq 0x11d1c0
jmp 0x11c527
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0xb67(%rsp), %rdi
callq 0x1147c0
jmp 0x11c527
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c51a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
jmp 0x11c50d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0xc8(%rsp), %rdi
callq 0x11dcc0
jmp 0x11c50d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x2c58(%rsp)
movl %eax, 0x2c54(%rsp)
leaq 0x218(%rsp), %rdi
callq 0x11e5e0
leaq 0xb40(%rsp), %rdi
callq 0x11e7e0
leaq 0xb68(%rsp), %rdi
callq 0x1147d8
leaq 0xe10(%rsp), %rdi
callq 0x11e820
leaq 0x1898(%rsp), %rdi
callq 0x11e8b0
leaq 0x18a0(%rsp), %rdi
callq 0x11e930
leaq 0x2c88(%rsp), %rdi
callq 0x11e940
movq 0x2c58(%rsp), %rdi
callq 0x114470
nopl (%rax,%rax)