// File: dsharlet[P]array/test/readme.cpp
// Function: nda::test_readme_ein_reduce_body()
TEST(readme_ein_reduce) {
  // Name the dimensions we use in Einstein reductions.
  enum { i = 0, j = 1, k = 2, l = 3 };

  // Dot product dot1 = dot2 = x.y:
  vector<float> x({10}, 0.0f);
  vector<float> y({10}, 0.0f);
  float dot1 = make_ein_sum<float>(ein<i>(x) * ein<i>(y));
  float dot2 = 0.0f;
  ein_reduce(ein(dot2) += ein<i>(x) * ein<i>(y));

  // Matrix multiply C1 = C2 = A*B:
  matrix<float> A({10, 10});
  matrix<float> B({10, 15});
  matrix<float> C1({10, 15});
  fill(C1, 0.0f);
  ein_reduce(ein<i, j>(C1) += ein<i, k>(A) * ein<k, j>(B));
  auto C2 = make_ein_sum<float, i, j>(ein<i, k>(A) * ein<k, j>(B));

  // Cross product array crosses_n = x_n x y_n:
  using vector_array = array<float, shape<dim<0, 3>, dense_dim<>>>;
  vector_array xs({3, 100});
  vector_array ys({3, 100});
  vector_array crosses({3, 100});
  auto epsilon3 = [](int i, int j, int k) { return sgn(j - i) * sgn(k - i) * sgn(k - j); };
  ein_reduce(ein<i, l>(crosses) += ein<i, j, k>(epsilon3) * ein<j, l>(xs) * ein<k, l>(ys));

  // Matrix transpose AT = A^T:
  matrix<float> AT({10, 10});
  ein_reduce(ein<i, j>(AT) = ein<j, i>(A));

  // Maximum of each x-y plane of a 3D volume:
  dense_array<float, 3> volume({8, 12, 20});
  dense_array<float, 1> max_xy({20}, 0.0f);
  auto r = ein<k>(max_xy);
  ein_reduce(r = max(r, ein<i, j, k>(volume)));

  const float pi = std::acos(-1.0f);

  // Compute X1 = X2 = DFT[x]:
  using complex = std::complex<float>;
  dense_array<complex, 2> W({10, 10});
  for_all_indices(W.shape(), [&](int j, int k) {
    W(j, k) = exp(-2.0f * pi * complex(0, 1) * (static_cast<float>(j * k) / 10));
  });
  // Using `make_ein_sum`, returning the result:
  auto X1 = make_ein_sum<complex, j>(ein<j, k>(W) * ein<k>(x));
  // Using `ein_reduce`, computing the result in place:
  vector<complex> X2({10}, 0.0f);
  ein_reduce(ein<j>(X2) += ein<j, k>(W) * ein<k>(x));

  assert_used(dot1);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1980, %rsp           # imm = 0x1980
leaq -0x728(%rbp), %rdi
movq %rdi, -0x18e0(%rbp)
movl $0xa, %esi
movl %esi, -0x18d4(%rbp)
callq 0x162d50
movq -0x18e0(%rbp), %rsi
movl $0x0, -0x72c(%rbp)
leaq -0x710(%rbp), %rdi
leaq -0x72c(%rbp), %rdx
callq 0x162d90
movl -0x18d4(%rbp), %esi
leaq -0x780(%rbp), %rdi
callq 0x162d50
jmp 0x151101
movl $0x0, -0x790(%rbp)
leaq -0x768(%rbp), %rdi
leaq -0x780(%rbp), %rsi
leaq -0x790(%rbp), %rdx
callq 0x162d90
jmp 0x151127
leaq -0x820(%rbp), %rdi
leaq -0x710(%rbp), %rsi
callq 0x162e00
jmp 0x15113c
leaq -0x840(%rbp), %rdi
leaq -0x768(%rbp), %rsi
callq 0x162e00
jmp 0x151151
leaq -0x800(%rbp), %rdi
leaq -0x820(%rbp), %rsi
leaq -0x840(%rbp), %rdx
callq 0x162e40
jmp 0x15116d
movl $0x0, -0x844(%rbp)
leaq -0x845(%rbp), %rdi
movq %rdi, -0x18e8(%rbp)
callq 0xf06a0
movq -0x18e8(%rbp), %rax
leaq -0x7c0(%rbp), %rcx
movq %rcx, -0x610(%rbp)
leaq -0x800(%rbp), %rcx
movq %rcx, -0x618(%rbp)
leaq -0x844(%rbp), %rcx
movq %rcx, -0x620(%rbp)
movq %rax, -0x628(%rbp)
movq -0x618(%rbp), %rdi
callq 0x1524f0
jmp 0x1511d0
movq -0x620(%rbp), %rdx
movq -0x628(%rbp), %rcx
leaq -0x658(%rbp), %rdi
leaq -0x629(%rbp), %rsi
callq 0x166190
jmp 0x1511f3
movq -0x618(%rbp), %rax
movq %rax, -0x18f8(%rbp)
leaq -0x658(%rbp), %rdi
callq 0x1661d0
movq %rax, -0x18f0(%rbp)
jmp 0x151216
movq -0x18f8(%rbp), %rdx
movq -0x18f0(%rbp), %rax
movq %rax, -0x6b8(%rbp)
leaq -0x6a8(%rbp), %rdi
leaq -0x6b8(%rbp), %rsi
callq 0x162f40
jmp 0x151240
leaq -0x6a8(%rbp), %rax
movq %rax, -0x5e0(%rbp)
movq $0x1, -0x5e8(%rbp)
movq -0x5e0(%rbp), %rdx
movq %rdx, %r8
addq $0x10, %r8
leaq -0x600(%rbp), %rdi
leaq -0x601(%rbp), %rsi
leaq -0x602(%rbp), %rcx
callq 0x152780
jmp 0x151283
movq -0x5e0(%rbp), %rsi
leaq -0x600(%rbp), %rdi
callq 0x152bf0
jmp 0x151298
movq -0x5e0(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x5d8(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0x5d0(%rbp)
movq -0x5d8(%rbp), %rax
movq %rax, -0x1900(%rbp)
movq -0x1900(%rbp), %rax
movq %rax, -0x6d8(%rbp)
leaq -0x7c0(%rbp), %rdi
leaq -0x658(%rbp), %rsi
callq 0x166200
jmp 0x151322
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x6c0(%rbp)
movl %eax, -0x6c4(%rbp)
leaq -0x658(%rbp), %rdi
callq 0x162eb0
movq -0x6c0(%rbp), %rcx
movl -0x6c4(%rbp), %eax
movq %rcx, -0x1910(%rbp)
movl %eax, -0x1904(%rbp)
jmp 0x152105
leaq -0x658(%rbp), %rdi
callq 0x162eb0
leaq -0x7c0(%rbp), %rdi
callq 0x162e90
movq %rax, -0x1918(%rbp)
jmp 0x151343
movq -0x1918(%rbp), %rax
movss (%rax), %xmm0
movss %xmm0, -0x191c(%rbp)
leaq -0x7c0(%rbp), %rdi
callq 0x162eb0
leaq -0x845(%rbp), %rdi
callq 0xf0800
movss -0x191c(%rbp), %xmm0
movss %xmm0, -0x794(%rbp)
movl $0x0, -0x84c(%rbp)
leaq -0x900(%rbp), %rdi
leaq -0x710(%rbp), %rsi
callq 0x162e00
jmp 0x15139d
leaq -0x920(%rbp), %rdi
leaq -0x768(%rbp), %rsi
callq 0x162e00
jmp 0x1513b2
leaq -0x8e0(%rbp), %rdi
leaq -0x900(%rbp), %rsi
leaq -0x920(%rbp), %rdx
callq 0x162e40
jmp 0x1513ce
leaq -0x84c(%rbp), %rdi
callq 0x162ef0
movq %rax, -0x1928(%rbp)
jmp 0x1513e3
movq -0x1928(%rbp), %rax
movq %rax, -0x930(%rbp)
leaq -0x8a0(%rbp), %rdi
leaq -0x930(%rbp), %rsi
leaq -0x8e0(%rbp), %rdx
callq 0x162f40
jmp 0x15140d
leaq -0x8a0(%rbp), %rax
movq %rax, -0x5a0(%rbp)
movq $0x1, -0x5a8(%rbp)
movq -0x5a0(%rbp), %rdx
movq %rdx, %r8
addq $0x10, %r8
leaq -0x5c0(%rbp), %rdi
leaq -0x5c1(%rbp), %rsi
leaq -0x5c2(%rbp), %rcx
callq 0x152780
jmp 0x151450
movq -0x5a0(%rbp), %rsi
leaq -0x5c0(%rbp), %rdi
callq 0x152bf0
jmp 0x151465
movq -0x5a0(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x598(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0x590(%rbp)
movq -0x598(%rbp), %rax
movq %rax, -0x1930(%rbp)
movq -0x1930(%rbp), %rax
movq %rax, -0x940(%rbp)
leaq -0x9c0(%rbp), %rdi
movl $0xa, %edx
movl %edx, %esi
callq 0x162f80
jmp 0x1514b2
leaq -0x990(%rbp), %rdi
leaq -0x9c0(%rbp), %rsi
callq 0x162fc0
jmp 0x1514c7
leaq -0xa40(%rbp), %rdi
movl $0xa, %esi
movl $0xf, %edx
callq 0x162f80
jmp 0x1514df
leaq -0xa10(%rbp), %rdi
leaq -0xa40(%rbp), %rsi
callq 0x162fc0
jmp 0x1514f4
leaq -0xac0(%rbp), %rdi
movl $0xa, %esi
movl $0xf, %edx
callq 0x162f80
jmp 0x15150c
leaq -0xa90(%rbp), %rdi
leaq -0xac0(%rbp), %rsi
callq 0x162fc0
jmp 0x151521
movl $0x0, -0xac4(%rbp)
leaq -0xa90(%rbp), %rdi
leaq -0xac4(%rbp), %rsi
callq 0x163050
jmp 0x151540
leaq -0xc18(%rbp), %rdi
leaq -0x990(%rbp), %rsi
callq 0x163080
jmp 0x151555
leaq -0xc50(%rbp), %rdi
leaq -0xa10(%rbp), %rsi
callq 0x163110
jmp 0x15156a
leaq -0xbe0(%rbp), %rdi
leaq -0xc18(%rbp), %rsi
leaq -0xc50(%rbp), %rdx
callq 0x1630c0
jmp 0x151586
leaq -0xc88(%rbp), %rdi
leaq -0xa90(%rbp), %rsi
callq 0x163150
jmp 0x15159b
leaq -0xb70(%rbp), %rdi
leaq -0xc88(%rbp), %rsi
leaq -0xbe0(%rbp), %rdx
callq 0x163190
jmp 0x1515b7
leaq -0xcc0(%rbp), %rax
movq %rax, -0x528(%rbp)
leaq -0xb70(%rbp), %rax
movq %rax, -0x530(%rbp)
movq $0x3, -0x538(%rbp)
movq -0x530(%rbp), %rdx
movq %rdx, %r8
addq $0x38, %r8
leaq -0x580(%rbp), %rdi
leaq -0x581(%rbp), %rsi
leaq -0x582(%rbp), %rcx
callq 0x152e30
jmp 0x151608
movq -0x530(%rbp), %rsi
leaq -0x580(%rbp), %rdi
callq 0x153b40
jmp 0x15161d
movq -0x530(%rbp), %rsi
leaq -0xcc0(%rbp), %rdi
movl $0x38, %edx
callq 0x31c0
leaq -0xdb8(%rbp), %rdi
leaq -0x990(%rbp), %rsi
callq 0x163080
jmp 0x15164a
leaq -0xdf0(%rbp), %rdi
leaq -0xa10(%rbp), %rsi
callq 0x163110
jmp 0x15165f
leaq -0xd80(%rbp), %rdi
leaq -0xdb8(%rbp), %rsi
leaq -0xdf0(%rbp), %rdx
callq 0x1630c0
jmp 0x15167b
movl $0x0, -0xdf4(%rbp)
leaq -0xdf5(%rbp), %rdi
movq %rdi, -0x1938(%rbp)
callq 0xf06a0
movq -0x1938(%rbp), %rax
leaq -0xd10(%rbp), %rcx
movq %rcx, -0x360(%rbp)
leaq -0xd80(%rbp), %rcx
movq %rcx, -0x368(%rbp)
leaq -0xdf4(%rbp), %rcx
movq %rcx, -0x370(%rbp)
movq %rax, -0x378(%rbp)
movq -0x368(%rbp), %rsi
leaq -0x3a8(%rbp), %rdi
callq 0x153fa0
jmp 0x1516e5
movq -0x370(%rbp), %rdx
movq -0x378(%rbp), %rcx
leaq -0x3f8(%rbp), %rdi
leaq -0x3a8(%rbp), %rsi
callq 0x168d90
jmp 0x151708
movq -0x368(%rbp), %rax
movq %rax, -0x1940(%rbp)
leaq -0x4d8(%rbp), %rdi
leaq -0x3f8(%rbp), %rsi
callq 0x168dd0
jmp 0x15172b
movq -0x1940(%rbp), %rdx
leaq -0x4a0(%rbp), %rdi
leaq -0x4d8(%rbp), %rsi
callq 0x168e10
jmp 0x151747
leaq -0x520(%rbp), %rax
movq %rax, -0x60(%rbp)
leaq -0x4a0(%rbp), %rax
movq %rax, -0x68(%rbp)
movq $0x3, -0x70(%rbp)
movq -0x68(%rbp), %rdx
movq %rdx, %r8
addq $0x38, %r8
leaq -0xb8(%rbp), %rdi
leaq -0xb9(%rbp), %rsi
leaq -0xba(%rbp), %rcx
callq 0x154db0
jmp 0x15178c
movq -0x68(%rbp), %rsi
leaq -0xb8(%rbp), %rdi
callq 0x155ac0
jmp 0x15179e
movq -0x68(%rbp), %rsi
leaq -0x520(%rbp), %rdi
movl $0x38, %edx
callq 0x31c0
leaq -0xd10(%rbp), %rdi
leaq -0x3f8(%rbp), %rsi
callq 0x168e50
jmp 0x151805
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x4e0(%rbp)
movl %eax, -0x4e4(%rbp)
leaq -0x3f8(%rbp), %rdi
callq 0x163a40
movq -0x4e0(%rbp), %rcx
movl -0x4e4(%rbp), %eax
movq %rcx, -0x1950(%rbp)
movl %eax, -0x1944(%rbp)
jmp 0x1521a9
leaq -0x3f8(%rbp), %rdi
callq 0x163a40
leaq -0xdf5(%rbp), %rdi
callq 0xf0800
leaq -0xe68(%rbp), %rdi
movl $0x3, %esi
movl $0x64, %edx
callq 0x1631d0
jmp 0x151835
leaq -0xe40(%rbp), %rdi
leaq -0xe68(%rbp), %rsi
callq 0x163210
jmp 0x15184a
leaq -0xed8(%rbp), %rdi
movl $0x3, %esi
movl $0x64, %edx
callq 0x1631d0
jmp 0x151862
leaq -0xeb0(%rbp), %rdi
leaq -0xed8(%rbp), %rsi
callq 0x163210
jmp 0x151877
leaq -0xf48(%rbp), %rdi
movl $0x3, %esi
movl $0x64, %edx
callq 0x1631d0
jmp 0x15188f
leaq -0xf20(%rbp), %rdi
leaq -0xf48(%rbp), %rsi
callq 0x163210
jmp 0x1518a4
callq 0x1523b0
jmp 0x1518ab
leaq -0x10c0(%rbp), %rdi
leaq -0xe40(%rbp), %rsi
callq 0x1632a0
jmp 0x1518c0
leaq -0x1088(%rbp), %rdi
leaq -0x1089(%rbp), %rsi
leaq -0x10c0(%rbp), %rdx
callq 0x1523d0
jmp 0x1518dc
leaq -0x10f0(%rbp), %rdi
leaq -0xeb0(%rbp), %rsi
callq 0x1632e0
jmp 0x1518f1
leaq -0x1050(%rbp), %rdi
leaq -0x1088(%rbp), %rsi
leaq -0x10f0(%rbp), %rdx
callq 0x152420
jmp 0x15190d
leaq -0x1120(%rbp), %rdi
leaq -0xf20(%rbp), %rsi
callq 0x163320
jmp 0x151922
leaq -0xfe8(%rbp), %rdi
leaq -0x1120(%rbp), %rsi
leaq -0x1050(%rbp), %rdx
callq 0x152470
jmp 0x15193e
leaq -0x1150(%rbp), %rax
movq %rax, -0x310(%rbp)
leaq -0xfe8(%rbp), %rax
movq %rax, -0x318(%rbp)
movq $0x4, -0x320(%rbp)
movq -0x318(%rbp), %rdx
movq %rdx, %r8
addq $0x30, %r8
leaq -0x350(%rbp), %rdi
leaq -0x351(%rbp), %rsi
leaq -0x352(%rbp), %rcx
callq 0x155f20
jmp 0x15198f
movq -0x318(%rbp), %rsi
leaq -0x350(%rbp), %rdi
callq 0x156d50
jmp 0x1519a4
movq -0x318(%rbp), %rsi
leaq -0x1150(%rbp), %rdi
movl $0x30, %edx
callq 0x31c0
leaq -0x11d0(%rbp), %rdi
movl $0xa, %edx
movl %edx, %esi
callq 0x162f80
jmp 0x1519d1
leaq -0x11a0(%rbp), %rdi
leaq -0x11d0(%rbp), %rsi
callq 0x162fc0
jmp 0x1519e6
leaq -0x1278(%rbp), %rdi
leaq -0x990(%rbp), %rsi
callq 0x163360
jmp 0x1519fb
leaq -0x12b0(%rbp), %rdi
leaq -0x11a0(%rbp), %rsi
callq 0x163150
jmp 0x151a10
leaq -0x1240(%rbp), %rdi
leaq -0x12b0(%rbp), %rsi
leaq -0x1278(%rbp), %rdx
callq 0x1633a0
jmp 0x151a2c
leaq -0x12e8(%rbp), %rax
movq %rax, -0x2c0(%rbp)
leaq -0x1240(%rbp), %rax
movq %rax, -0x2c8(%rbp)
movq $0x2, -0x2d0(%rbp)
movq -0x2c8(%rbp), %rdx
movq %rdx, %r8
addq $0x38, %r8
leaq -0x300(%rbp), %rdi
leaq -0x301(%rbp), %rsi
leaq -0x302(%rbp), %rcx
callq 0x157600
jmp 0x151a7d
movq -0x2c8(%rbp), %rsi
leaq -0x300(%rbp), %rdi
callq 0x157dc0
jmp 0x151a92
movq -0x2c8(%rbp), %rsi
leaq -0x12e8(%rbp), %rdi
movl $0x38, %edx
callq 0x31c0
leaq -0x1398(%rbp), %rdi
movl $0x8, %esi
movl $0xc, %edx
movl $0x14, %ecx
callq 0x34640
jmp 0x151ac7
leaq -0x1350(%rbp), %rdi
leaq -0x1398(%rbp), %rsi
callq 0x1633e0
jmp 0x151adc
leaq -0x13e8(%rbp), %rdi
movl $0x14, %esi
callq 0x34210
jmp 0x151aef
movl $0x0, -0x13ec(%rbp)
leaq -0x13d0(%rbp), %rdi
leaq -0x13e8(%rbp), %rsi
leaq -0x13ec(%rbp), %rdx
callq 0x163480
jmp 0x151b15
leaq -0x1410(%rbp), %rdi
leaq -0x13d0(%rbp), %rsi
callq 0x1634f0
jmp 0x151b2a
leaq -0x1560(%rbp), %rdi
leaq -0x1350(%rbp), %rsi
callq 0x163580
jmp 0x151b3f
leaq -0x1510(%rbp), %rdi
leaq -0x1410(%rbp), %rsi
leaq -0x1560(%rbp), %rdx
callq 0x163530
jmp 0x151b5b
leaq -0x14a0(%rbp), %rdi
leaq -0x1410(%rbp), %rsi
leaq -0x1510(%rbp), %rdx
callq 0x1635c0
jmp 0x151b77
leaq -0x1580(%rbp), %rax
movq %rax, -0x258(%rbp)
leaq -0x14a0(%rbp), %rax
movq %rax, -0x260(%rbp)
movq $0x3, -0x268(%rbp)
movq -0x260(%rbp), %rdx
movq %rdx, %r8
addq $0x20, %r8
leaq -0x2b0(%rbp), %rdi
leaq -0x2b1(%rbp), %rsi
leaq -0x2b2(%rbp), %rcx
callq 0x1580a0
jmp 0x151bc8
movq -0x260(%rbp), %rsi
leaq -0x2b0(%rbp), %rdi
callq 0x158c00
jmp 0x151bdd
movq -0x260(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x1580(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x1578(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x1570(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x1568(%rbp)
movss 0x97c9d(%rip), %xmm0    # 0x1e98b4
callq 0xf2570
movss %xmm0, -0x1954(%rbp)
jmp 0x151c26
movss -0x1954(%rbp), %xmm0
movss %xmm0, -0x1584(%rbp)
leaq -0x1608(%rbp), %rdi
movl $0xa, %edx
movl %edx, %esi
callq 0x343e0
jmp 0x151c4b
leaq -0x15d8(%rbp), %rdi
leaq -0x1608(%rbp), %rsi
callq 0x163600
jmp 0x151c60
leaq -0x15d8(%rbp), %rdi
callq 0x163690
movq %rax, -0x1960(%rbp)
jmp 0x151c75
movq -0x1960(%rbp), %rdi
leaq -0x15d8(%rbp), %rax
movq %rax, -0x1618(%rbp)
leaq -0x1584(%rbp), %rax
movq %rax, -0x1610(%rbp)
leaq -0x1618(%rbp), %rsi
callq 0x1524b0
jmp 0x151ca6
leaq -0x16e0(%rbp), %rdi
leaq -0x15d8(%rbp), %rsi
callq 0x1636b0
jmp 0x151cbb
leaq -0x1700(%rbp), %rdi
leaq -0x710(%rbp), %rsi
callq 0x163740
jmp 0x151cd0
leaq -0x16a8(%rbp), %rdi
leaq -0x16e0(%rbp), %rsi
leaq -0x1700(%rbp), %rdx
callq 0x1636f0
jmp 0x151cec
leaq -0x1708(%rbp), %rdi
xorps %xmm1, %xmm1
movaps %xmm1, %xmm0
callq 0xc8a40
jmp 0x151d00
leaq -0x1709(%rbp), %rdi
movq %rdi, -0x1968(%rbp)
callq 0xf1b50
movq -0x1968(%rbp), %rax
leaq -0x1650(%rbp), %rcx
movq %rcx, -0x120(%rbp)
leaq -0x16a8(%rbp), %rcx
movq %rcx, -0x128(%rbp)
leaq -0x1708(%rbp), %rcx
movq %rcx, -0x130(%rbp)
movq %rax, -0x138(%rbp)
movq -0x128(%rbp), %rsi
leaq -0x150(%rbp), %rdi
callq 0x159040
jmp 0x151d60
movq -0x130(%rbp), %rdx
movq -0x138(%rbp), %rcx
leaq -0x188(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x16e110
jmp 0x151d83
movq -0x128(%rbp), %rax
movq %rax, -0x1970(%rbp)
leaq -0x220(%rbp), %rdi
leaq -0x188(%rbp), %rsi
callq 0x16e150
jmp 0x151da6
movq -0x1970(%rbp), %rdx
leaq -0x200(%rbp), %rdi
leaq -0x220(%rbp), %rsi
callq 0x16e190
jmp 0x151dc2
leaq -0x250(%rbp), %rax
movq %rax, -0x8(%rbp)
leaq -0x200(%rbp), %rax
movq %rax, -0x10(%rbp)
movq $0x3, -0x18(%rbp)
movq -0x10(%rbp), %rdx
movq %rdx, %r8
addq $0x20, %r8
leaq -0x50(%rbp), %rdi
leaq -0x51(%rbp), %rsi
leaq -0x52(%rbp), %rcx
callq 0x159950
jmp 0x151dfe
movq -0x10(%rbp), %rsi
leaq -0x50(%rbp), %rdi
callq 0x15a330
jmp 0x151e0d
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x250(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x248(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x240(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x238(%rbp)
leaq -0x1650(%rbp), %rdi
leaq -0x188(%rbp), %rsi
callq 0x16e1d0
jmp 0x151e8e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x228(%rbp)
movl %eax, -0x22c(%rbp)
leaq -0x188(%rbp), %rdi
callq 0x1638c0
movq -0x228(%rbp), %rcx
movl -0x22c(%rbp), %eax
movq %rcx, -0x1980(%rbp)
movl %eax, -0x1974(%rbp)
jmp 0x15229d
leaq -0x188(%rbp), %rdi
callq 0x1638c0
leaq -0x1709(%rbp), %rdi
callq 0xf1cb0
leaq -0x1760(%rbp), %rdi
movl $0xa, %esi
callq 0x162d50
jmp 0x151eb9
leaq -0x1768(%rbp), %rdi
xorps %xmm1, %xmm1
movaps %xmm1, %xmm0
callq 0xc8a40
jmp 0x151ecd
leaq -0x1748(%rbp), %rdi
leaq -0x1760(%rbp), %rsi
leaq -0x1768(%rbp), %rdx
callq 0x163780
jmp 0x151ee9
leaq -0x1870(%rbp), %rdi
leaq -0x15d8(%rbp), %rsi
callq 0x1636b0
jmp 0x151efe
leaq -0x1890(%rbp), %rdi
leaq -0x710(%rbp), %rsi
callq 0x163740
jmp 0x151f13
leaq -0x1838(%rbp), %rdi
leaq -0x1870(%rbp), %rsi
leaq -0x1890(%rbp), %rdx
callq 0x1636f0
jmp 0x151f2f
leaq -0x18b0(%rbp), %rdi
leaq -0x1748(%rbp), %rsi
callq 0x1637f0
jmp 0x151f44
leaq -0x17e0(%rbp), %rdi
leaq -0x18b0(%rbp), %rsi
leaq -0x1838(%rbp), %rdx
callq 0x163830
jmp 0x151f60
leaq -0x18d0(%rbp), %rax
movq %rax, -0xc8(%rbp)
leaq -0x17e0(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq $0x3, -0xd8(%rbp)
movq -0xd0(%rbp), %rdx
movq %rdx, %r8
addq $0x20, %r8
leaq -0x110(%rbp), %rdi
leaq -0x111(%rbp), %rsi
leaq -0x112(%rbp), %rcx
callq 0x15a790
jmp 0x151fb1
movq -0xd0(%rbp), %rsi
leaq -0x110(%rbp), %rdi
callq 0x15b260
jmp 0x151fc6
movq -0xd0(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x18d0(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x18c8(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x18c0(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x18b8(%rbp)
leaq -0x794(%rbp), %rdi
callq 0x163870
jmp 0x152006
leaq -0x1748(%rbp), %rdi
callq 0x163880
leaq -0x1650(%rbp), %rdi
callq 0x1638c0
leaq -0x15d8(%rbp), %rdi
callq 0x163900
leaq -0x13d0(%rbp), %rdi
callq 0x163940
leaq -0x1350(%rbp), %rdi
callq 0x163980
leaq -0x11a0(%rbp), %rdi
callq 0x1639c0
leaq -0xf20(%rbp), %rdi
callq 0x163a00
leaq -0xeb0(%rbp), %rdi
callq 0x163a00
leaq -0xe40(%rbp), %rdi
callq 0x163a00
leaq -0xd10(%rbp), %rdi
callq 0x163a40
leaq -0xa90(%rbp), %rdi
callq 0x1639c0
leaq -0xa10(%rbp), %rdi
callq 0x1639c0
leaq -0x990(%rbp), %rdi
callq 0x1639c0
leaq -0x768(%rbp), %rdi
callq 0x163a80
leaq -0x710(%rbp), %rdi
callq 0x163a80
addq $0x1980, %rsp           # imm = 0x1980
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x152393
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x152387
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1910(%rbp)
movl %eax, -0x1904(%rbp)
jmp 0x152105
movq -0x1910(%rbp), %rcx
movl -0x1904(%rbp), %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x15213f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
leaq -0x7c0(%rbp), %rdi
callq 0x162eb0
leaq -0x845(%rbp), %rdi
callq 0xf0800
jmp 0x152387
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x15237b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x15236f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x152363
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1950(%rbp)
movl %eax, -0x1944(%rbp)
jmp 0x1521a9
movq -0x1950(%rbp), %rcx
movl -0x1944(%rbp), %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
leaq -0xdf5(%rbp), %rdi
callq 0xf0800
jmp 0x152363
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x152357
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x15234b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x15233f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x152333
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x152327
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x15231b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x15230f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x152303
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1980(%rbp)
movl %eax, -0x1974(%rbp)
jmp 0x15229d
movq -0x1980(%rbp), %rcx
movl -0x1974(%rbp), %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
leaq -0x1709(%rbp), %rdi
callq 0xf1cb0
jmp 0x152303
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
jmp 0x1522f7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x788(%rbp)
movl %eax, -0x78c(%rbp)
leaq -0x1748(%rbp), %rdi
callq 0x163880
leaq -0x1650(%rbp), %rdi
callq 0x1638c0
leaq -0x15d8(%rbp), %rdi
callq 0x163900
leaq -0x13d0(%rbp), %rdi
callq 0x163940
leaq -0x1350(%rbp), %rdi
callq 0x163980
leaq -0x11a0(%rbp), %rdi
callq 0x1639c0
leaq -0xf20(%rbp), %rdi
callq 0x163a00
leaq -0xeb0(%rbp), %rdi
callq 0x163a00
leaq -0xe40(%rbp), %rdi
callq 0x163a00
leaq -0xd10(%rbp), %rdi
callq 0x163a40
leaq -0xa90(%rbp), %rdi
callq 0x1639c0
leaq -0xa10(%rbp), %rdi
callq 0x1639c0
leaq -0x990(%rbp), %rdi
callq 0x1639c0
leaq -0x768(%rbp), %rdi
callq 0x163a80
leaq -0x710(%rbp), %rdi
callq 0x163a80
movq -0x788(%rbp), %rdi
callq 0x33a0
nopl (%rax,%rax)