// File: williewillus[P]panda_scratchpad/src/checker/DiskContents.cpp
// Function: DiskContents::compare_disk_contents(DiskContents&, std::basic_ofstream<char, std::char_traits<char>>&)
bool DiskContents::compare_disk_contents(DiskContents &compare_disk, ofstream &diff_file) {
  bool retValue = true;

  if (disk_path.compare(compare_disk.disk_path) == 0) {
    return retValue;
  }

  string base_path = "/mnt/pmem0";
  get_contents(base_path.c_str());

 /* if (compare_disk.mount_disk() != 0) {
    cout << "Mounting " << compare_disk.disk_path << " failed" << endl;
  }*/

  compare_disk.get_contents(compare_disk.get_mount_point().c_str());

  // Compare the size of contents
  if (contents.size() != compare_disk.contents.size()) {
    diff_file << "DIFF: Mismatch" << endl;
    diff_file << "Unequal #entries in " << disk_path << ", " << compare_disk.disk_path;
    diff_file << endl << endl;
    diff_file << disk_path << " contains:" << endl;
    for (auto &i : contents) {
      diff_file << i.first << endl;
    }
    diff_file << endl;

    diff_file << compare_disk.disk_path << " contains:" << endl;
    for (auto &i : compare_disk.contents) {
      diff_file << i.first << endl;
    }
    diff_file << endl;
    retValue = false;
  }

  // entry-wise comparision
  for (auto &i : contents) {
    fileAttributes i_fa = i.second;
    if (compare_disk.contents.find((i.first)) == compare_disk.contents.end()) {
      diff_file << "DIFF: Missing " << i.first << endl;
      diff_file << "Found in " << disk_path << " only" << endl;
      diff_file << i_fa << endl << endl;
      retValue = false;
      continue;
    }
    fileAttributes j_fa = compare_disk.contents[(i.first)];
    if (!(i_fa.compare_dir_attr(j_fa.dir_attr)) ||
          !(i_fa.compare_stat_attr(j_fa.stat_attr))) {
        diff_file << "DIFF: Content Mismatch " << i.first << endl << endl;
        diff_file << disk_path << ":" << endl;
        diff_file << i_fa << endl << endl;
        diff_file << compare_disk.disk_path << ":" << endl;
        diff_file << j_fa << endl << endl;
        retValue = false;
        continue;
    }
    // compare user data if the entry corresponds to a regular files
    if (i_fa.is_regular_file()) {
      // check md5sum of the file contents
      if (i_fa.compare_md5sum(j_fa.md5sum) != 0) {
        diff_file << "DIFF : Data Mismatch of " << (i.first) << endl;
        diff_file << disk_path << " has md5sum " << i_fa.md5sum << endl;
        diff_file << compare_disk.disk_path << " has md5sum " << j_fa.md5sum;
        diff_file << endl << endl;
        retValue = false;
      }
    }
  }
  //compare_disk.unmount_and_delete_mount_point();
  return retValue;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x8d0, %rsp            # imm = 0x8D0
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x658(%rbp)
movb $0x1, -0x21(%rbp)
addq $0x8, %rdi
movq -0x18(%rbp), %rsi
addq $0x8, %rsi
callq 0x6050
cmpl $0x0, %eax
jne 0x1ffc9
movb -0x21(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x20a42
leaq -0x49(%rbp), %rdi
movq %rdi, -0x660(%rbp)
callq 0x68b0
movq -0x660(%rbp), %rdx
leaq 0x53bc(%rip), %rsi      # 0x253a3
leaq -0x48(%rbp), %rdi
callq 0x6670
jmp 0x1fff2
leaq -0x49(%rbp), %rdi
callq 0x6590
leaq -0x48(%rbp), %rdi
callq 0x6220
movq -0x658(%rbp), %rdi
movq %rax, %rsi
callq 0x1f970
jmp 0x20015
movq -0x18(%rbp), %rsi
movq %rsi, -0x668(%rbp)
leaq -0x80(%rbp), %rdi
callq 0x1ff50
jmp 0x2002b
leaq -0x80(%rbp), %rdi
callq 0x6220
movq -0x668(%rbp), %rdi
movq %rax, %rsi
callq 0x1f970
jmp 0x20045
leaq -0x80(%rbp), %rdi
callq 0x69d8
movq -0x658(%rbp), %rdi
addq $0x68, %rdi
callq 0x22850
movq %rax, -0x670(%rbp)
movq -0x18(%rbp), %rdi
addq $0x68, %rdi
callq 0x22850
movq %rax, %rcx
movq -0x670(%rbp), %rax
cmpq %rcx, %rax
je 0x20396
movq -0x20(%rbp), %rdi
leaq 0x57a2(%rip), %rsi      # 0x25832
callq 0x6520
movq %rax, -0x678(%rbp)
jmp 0x2009e
movq -0x678(%rbp), %rdi
movq 0x14eec(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x200b3
movq -0x20(%rbp), %rdi
leaq 0x5783(%rip), %rsi      # 0x25841
callq 0x6520
movq %rax, -0x680(%rbp)
jmp 0x200cc
movq -0x680(%rbp), %rdi
movq -0x658(%rbp), %rsi
addq $0x8, %rsi
callq 0x64a0
movq %rax, -0x688(%rbp)
jmp 0x200ec
movq -0x688(%rbp), %rdi
leaq 0x575c(%rip), %rsi      # 0x25856
callq 0x6520
movq %rax, -0x690(%rbp)
jmp 0x20108
movq -0x690(%rbp), %rdi
movq -0x18(%rbp), %rsi
addq $0x8, %rsi
callq 0x64a0
jmp 0x2011e
movq -0x20(%rbp), %rdi
movq 0x14e6f(%rip), %rsi     # 0x34f98
callq 0x6580
movq %rax, -0x698(%rbp)
jmp 0x20137
movq -0x698(%rbp), %rdi
movq 0x14e53(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x2014c
movq -0x658(%rbp), %rsi
movq -0x20(%rbp), %rdi
addq $0x8, %rsi
callq 0x64a0
movq %rax, -0x6a0(%rbp)
jmp 0x20169
movq -0x6a0(%rbp), %rdi
leaq 0x56e2(%rip), %rsi      # 0x25859
callq 0x6520
movq %rax, -0x6a8(%rbp)
jmp 0x20185
movq -0x6a8(%rbp), %rdi
movq 0x14e05(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x2019a
movq -0x658(%rbp), %rax
addq $0x68, %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rdi
callq 0x22870
movq %rax, -0x90(%rbp)
movq -0x88(%rbp), %rdi
callq 0x228a0
movq %rax, -0x98(%rbp)
leaq -0x90(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x228d0
testb $0x1, %al
jne 0x201ee
jmp 0x20284
leaq -0x90(%rbp), %rdi
callq 0x22900
movq %rax, -0xa0(%rbp)
movq -0x20(%rbp), %rdi
movq -0xa0(%rbp), %rsi
callq 0x64a0
movq %rax, -0x6b0(%rbp)
jmp 0x2021a
movq -0x6b0(%rbp), %rdi
movq 0x14d70(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x2022f
jmp 0x20231
leaq -0x90(%rbp), %rdi
callq 0x22920
jmp 0x201d2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
leaq -0x49(%rbp), %rdi
callq 0x6590
jmp 0x20a50
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x20a37
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
leaq -0x80(%rbp), %rdi
callq 0x69d8
jmp 0x20a37
movq -0x20(%rbp), %rdi
movq 0x14d09(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x20296
movq -0x20(%rbp), %rdi
movq -0x18(%rbp), %rsi
addq $0x8, %rsi
callq 0x64a0
movq %rax, -0x6b8(%rbp)
jmp 0x202b0
movq -0x6b8(%rbp), %rdi
leaq 0x559b(%rip), %rsi      # 0x25859
callq 0x6520
movq %rax, -0x6c0(%rbp)
jmp 0x202cc
movq -0x6c0(%rbp), %rdi
movq 0x14cbe(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x202e1
movq -0x18(%rbp), %rax
addq $0x68, %rax
movq %rax, -0xa8(%rbp)
movq -0xa8(%rbp), %rdi
callq 0x22870
movq %rax, -0xb0(%rbp)
movq -0xa8(%rbp), %rdi
callq 0x228a0
movq %rax, -0xb8(%rbp)
leaq -0xb0(%rbp), %rdi
leaq -0xb8(%rbp), %rsi
callq 0x228d0
testb $0x1, %al
jne 0x2032f
jmp 0x20380
leaq -0xb0(%rbp), %rdi
callq 0x22900
movq %rax, -0xc0(%rbp)
movq -0x20(%rbp), %rdi
movq -0xc0(%rbp), %rsi
callq 0x64a0
movq %rax, -0x6c8(%rbp)
jmp 0x2035b
movq -0x6c8(%rbp), %rdi
movq 0x14c2f(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x20370
jmp 0x20372
leaq -0xb0(%rbp), %rdi
callq 0x22920
jmp 0x20316
movq -0x20(%rbp), %rdi
movq 0x14c0d(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x20392
movb $0x0, -0x21(%rbp)
movq -0x658(%rbp), %rax
addq $0x68, %rax
movq %rax, -0xc8(%rbp)
movq -0xc8(%rbp), %rdi
callq 0x22870
movq %rax, -0xd0(%rbp)
movq -0xc8(%rbp), %rdi
callq 0x228a0
movq %rax, -0xd8(%rbp)
leaq -0xd0(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x228d0
testb $0x1, %al
jne 0x203ea
jmp 0x20a1a
leaq -0xd0(%rbp), %rdi
callq 0x22900
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rsi
addq $0x20, %rsi
leaq -0x2a8(%rbp), %rdi
callq 0x22950
jmp 0x20416
movq -0x18(%rbp), %rdi
addq $0x68, %rdi
movq -0xe0(%rbp), %rsi
callq 0x229d0
movq %rax, -0x6d0(%rbp)
jmp 0x20433
movq -0x6d0(%rbp), %rax
movq %rax, -0x2b0(%rbp)
movq -0x18(%rbp), %rdi
addq $0x68, %rdi
callq 0x228a0
movq %rax, -0x2b8(%rbp)
leaq -0x2b0(%rbp), %rdi
leaq -0x2b8(%rbp), %rsi
callq 0x229a0
testb $0x1, %al
jne 0x20471
jmp 0x20593
movq -0x20(%rbp), %rdi
leaq 0x53e8(%rip), %rsi      # 0x25864
callq 0x6520
movq %rax, -0x6d8(%rbp)
jmp 0x2048a
movq -0x6d8(%rbp), %rdi
movq -0xe0(%rbp), %rsi
callq 0x64a0
movq %rax, -0x6e0(%rbp)
jmp 0x204a6
movq -0x6e0(%rbp), %rdi
movq 0x14ae4(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x204bb
movq -0x20(%rbp), %rdi
leaq 0x53ad(%rip), %rsi      # 0x25873
callq 0x6520
movq %rax, -0x6e8(%rbp)
jmp 0x204d4
movq -0x6e8(%rbp), %rdi
movq -0x658(%rbp), %rsi
addq $0x8, %rsi
callq 0x64a0
movq %rax, -0x6f0(%rbp)
jmp 0x204f4
movq -0x6f0(%rbp), %rdi
leaq 0x537b(%rip), %rsi      # 0x2587d
callq 0x6520
movq %rax, -0x6f8(%rbp)
jmp 0x20510
movq -0x6f8(%rbp), %rdi
movq 0x14a7a(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x20525
movq -0x20(%rbp), %rdi
leaq -0x2a8(%rbp), %rsi
callq 0x1f240
movq %rax, -0x700(%rbp)
jmp 0x2053e
movq -0x700(%rbp), %rdi
movq 0x14a4c(%rip), %rsi     # 0x34f98
callq 0x6580
movq %rax, -0x708(%rbp)
jmp 0x2055a
movq -0x708(%rbp), %rdi
movq 0x14a30(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x2056f
movb $0x0, -0x21(%rbp)
movl $0x7, -0x2bc(%rbp)
jmp 0x209d3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x20a0c
movq -0x18(%rbp), %rdi
addq $0x68, %rdi
movq -0xe0(%rbp), %rsi
callq 0x22720
movq %rax, -0x710(%rbp)
jmp 0x205b0
movq -0x710(%rbp), %rsi
leaq -0x488(%rbp), %rdi
callq 0x22950
jmp 0x205c5
leaq -0x488(%rbp), %rsi
leaq -0x5a0(%rbp), %rdi
movl $0x118, %edx            # imm = 0x118
callq 0x6450
movq %rsp, %rdi
movl $0x23, %ecx
leaq -0x5a0(%rbp), %rsi
rep  movsq (%rsi), %es:(%rdi)
leaq -0x2a8(%rbp), %rdi
callq 0x1f050
testb $0x1, %al
jne 0x20601
jmp 0x20646
leaq -0x488(%rbp), %rsi
addq $0x118, %rsi            # imm = 0x118
leaq -0x630(%rbp), %rdi
movl $0x90, %edx
callq 0x6450
movq %rsp, %rdi
movl $0x12, %ecx
leaq -0x630(%rbp), %rsi
rep  movsq (%rsi), %es:(%rdi)
leaq -0x2a8(%rbp), %rdi
callq 0x1f0f0
testb $0x1, %al
jne 0x207fd
movq -0x20(%rbp), %rdi
leaq 0x5232(%rip), %rsi      # 0x25883
callq 0x6520
movq %rax, -0x718(%rbp)
jmp 0x2065f
movq -0x718(%rbp), %rdi
movq -0xe0(%rbp), %rsi
callq 0x64a0
movq %rax, -0x720(%rbp)
jmp 0x2067b
movq -0x720(%rbp), %rdi
movq 0x1490f(%rip), %rsi     # 0x34f98
callq 0x6580
movq %rax, -0x728(%rbp)
jmp 0x20697
movq -0x728(%rbp), %rdi
movq 0x148f3(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x206ac
movq -0x658(%rbp), %rsi
movq -0x20(%rbp), %rdi
addq $0x8, %rsi
callq 0x64a0
movq %rax, -0x730(%rbp)
jmp 0x206c9
movq -0x730(%rbp), %rdi
leaq 0x518b(%rip), %rsi      # 0x25862
callq 0x6520
movq %rax, -0x738(%rbp)
jmp 0x206e5
movq -0x738(%rbp), %rdi
movq 0x148a5(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x206fa
movq -0x20(%rbp), %rdi
leaq -0x2a8(%rbp), %rsi
callq 0x1f240
movq %rax, -0x740(%rbp)
jmp 0x20713
movq -0x740(%rbp), %rdi
movq 0x14877(%rip), %rsi     # 0x34f98
callq 0x6580
movq %rax, -0x748(%rbp)
jmp 0x2072f
movq -0x748(%rbp), %rdi
movq 0x1485b(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x20744
movq -0x20(%rbp), %rdi
movq -0x18(%rbp), %rsi
addq $0x8, %rsi
callq 0x64a0
movq %rax, -0x750(%rbp)
jmp 0x2075e
movq -0x750(%rbp), %rdi
leaq 0x50f6(%rip), %rsi      # 0x25862
callq 0x6520
movq %rax, -0x758(%rbp)
jmp 0x2077a
movq -0x758(%rbp), %rdi
movq 0x14810(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x2078f
movq -0x20(%rbp), %rdi
leaq -0x488(%rbp), %rsi
callq 0x1f240
movq %rax, -0x760(%rbp)
jmp 0x207a8
movq -0x760(%rbp), %rdi
movq 0x147e2(%rip), %rsi     # 0x34f98
callq 0x6580
movq %rax, -0x768(%rbp)
jmp 0x207c4
movq -0x768(%rbp), %rdi
movq 0x147c6(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x207d9
movb $0x0, -0x21(%rbp)
movl $0x7, -0x2bc(%rbp)
jmp 0x209c7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x20a00
leaq -0x2a8(%rbp), %rdi
callq 0x1f210
testb $0x1, %al
jne 0x20812
jmp 0x209bd
leaq -0x2e0(%rbp), %rsi
leaq -0x650(%rbp), %rdi
callq 0x6240
jmp 0x20827
leaq -0x2a8(%rbp), %rdi
leaq -0x650(%rbp), %rsi
callq 0x1f1e0
movb %al, -0x769(%rbp)
jmp 0x20842
movb -0x769(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x770(%rbp)
leaq -0x650(%rbp), %rdi
callq 0x69d8
movl -0x770(%rbp), %eax
cmpl $0x0, %eax
je 0x209bb
movq -0x20(%rbp), %rdi
leaq 0x5022(%rip), %rsi      # 0x2589b
callq 0x6520
movq %rax, -0x778(%rbp)
jmp 0x20887
movq -0x778(%rbp), %rdi
movq -0xe0(%rbp), %rsi
callq 0x64a0
movq %rax, -0x780(%rbp)
jmp 0x208a3
movq -0x780(%rbp), %rdi
movq 0x146e7(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x208b8
movq -0x658(%rbp), %rsi
movq -0x20(%rbp), %rdi
addq $0x8, %rsi
callq 0x64a0
movq %rax, -0x788(%rbp)
jmp 0x208d5
movq -0x788(%rbp), %rdi
leaq 0x4fd1(%rip), %rsi      # 0x258b4
callq 0x6520
movq %rax, -0x790(%rbp)
jmp 0x208f1
movq -0x790(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0x64a0
movq %rax, -0x798(%rbp)
jmp 0x2090d
movq -0x798(%rbp), %rdi
movq 0x1467d(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x20922
movq -0x20(%rbp), %rdi
movq -0x18(%rbp), %rsi
addq $0x8, %rsi
callq 0x64a0
movq %rax, -0x7a0(%rbp)
jmp 0x2093c
movq -0x7a0(%rbp), %rdi
leaq 0x4f6a(%rip), %rsi      # 0x258b4
callq 0x6520
movq %rax, -0x7a8(%rbp)
jmp 0x20958
movq -0x7a8(%rbp), %rdi
leaq -0x2e0(%rbp), %rsi
callq 0x64a0
jmp 0x2096d
movq -0x20(%rbp), %rdi
movq 0x14620(%rip), %rsi     # 0x34f98
callq 0x6580
movq %rax, -0x7b0(%rbp)
jmp 0x20986
movq -0x7b0(%rbp), %rdi
movq 0x14604(%rip), %rsi     # 0x34f98
callq 0x6580
jmp 0x2099b
movb $0x0, -0x21(%rbp)
jmp 0x209bb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
leaq -0x650(%rbp), %rdi
callq 0x69d8
jmp 0x20a00
jmp 0x209bd
movl $0x0, -0x2bc(%rbp)
leaq -0x488(%rbp), %rdi
callq 0x1edf0
leaq -0x2a8(%rbp), %rdi
callq 0x1edf0
movl -0x2bc(%rbp), %eax
testl %eax, %eax
je 0x209ed
jmp 0x209eb
jmp 0x209ef
jmp 0x209ef
leaq -0xd0(%rbp), %rdi
callq 0x22920
jmp 0x203ce
leaq -0x488(%rbp), %rdi
callq 0x1edf0
leaq -0x2a8(%rbp), %rdi
callq 0x1edf0
jmp 0x20a37
movb -0x21(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
movl $0x1, -0x2bc(%rbp)
leaq -0x48(%rbp), %rdi
callq 0x69d8
jmp 0x20a42
leaq -0x48(%rbp), %rdi
callq 0x69d8
jmp 0x20a50
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x8d0, %rsp            # imm = 0x8D0
popq %rbp
retq
movq -0x58(%rbp), %rdi
callq 0x68a0
nopl (%rax)