user: What is the c source code of the assembly code below:

```asm
<metrohash64_1>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %esi,-0x4c(%rbp)
  mov    %edx,-0x50(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x48(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
  mov    D161(%rip),%edx
  mov    -0x50(%rbp),%eax
  add    %eax,%edx
  mov    D237(%rip),%eax
  imul   %eax,%edx
  mov    -0x4c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x3c(%rbp)
  cmpl   $0x1f,-0x4c(%rbp)
  jle    L2
  mov    -0x3c(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    %eax,-0x14(%rbp)
L7:
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u64@plt>
  mov    D237(%rip),%edx
  imul   %eax,%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x20(%rbp)
  addq   $0x20,-0x30(%rbp)
  mov    -0x20(%rbp),%eax
  mov    $0x1d,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    -0x18(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u64@plt>
  mov    D216(%rip),%edx
  imul   %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  addq   $0x20,-0x30(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    $0x1d,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    -0x14(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u64@plt>
  mov    D161(%rip),%edx
  imul   %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x18(%rbp)
  addq   $0x20,-0x30(%rbp)
  mov    -0x18(%rbp),%eax
  mov    $0x1d,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    -0x20(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u64@plt>
  mov    D277(%rip),%edx
  imul   %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x14(%rbp)
  addq   $0x20,-0x30(%rbp)
  mov    -0x14(%rbp),%eax
  mov    $0x1d,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    -0x1c(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x28(%rbp),%rax
  add    $0xffffffffffffff80,%rax
  cmp    %rax,-0x30(%rbp)
  jbe    L7
  mov    -0x20(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %eax,%edx
  mov    D237(%rip),%eax
  imul   %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    $0x21,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D216(%rip),%edx
  imul   %eax,%edx
  mov    -0x18(%rbp),%eax
  xor    %edx,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    D216(%rip),%eax
  imul   %eax,%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  mov    $0x21,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D237(%rip),%edx
  imul   %eax,%edx
  mov    -0x14(%rbp),%eax
  xor    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    D237(%rip),%eax
  imul   %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    $0x21,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D216(%rip),%edx
  imul   %eax,%edx
  mov    -0x20(%rbp),%eax
  xor    %edx,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %eax,%edx
  mov    D216(%rip),%eax
  imul   %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  mov    $0x21,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D237(%rip),%edx
  imul   %eax,%edx
  mov    -0x1c(%rbp),%eax
  xor    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  xor    %edx,%eax
  add    %eax,-0x3c(%rbp)
L2:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  cmp    $0x3c,%rax
  jle    L48
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u64@plt>
  mov    D237(%rip),%edx
  imul   %eax,%edx
  mov    -0x3c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x38(%rbp)
  addq   $0x20,-0x30(%rbp)
  mov    -0x38(%rbp),%eax
  mov    $0x21,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D216(%rip),%edx
  imul   %edx,%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u64@plt>
  mov    D216(%rip),%edx
  imul   %eax,%edx
  mov    -0x3c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x34(%rbp)
  addq   $0x20,-0x30(%rbp)
  mov    -0x34(%rbp),%eax
  mov    $0x21,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D161(%rip),%edx
  imul   %edx,%eax
  mov    %eax,-0x34(%rbp)
  mov    D237(%rip),%eax
  imul   -0x38(%rbp),%eax
  mov    $0x23,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    -0x34(%rbp),%edx
  add    %edx,%eax
  xor    %eax,-0x38(%rbp)
  mov    D277(%rip),%eax
  imul   -0x34(%rbp),%eax
  mov    $0x23,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    -0x38(%rbp),%edx
  add    %edx,%eax
  xor    %eax,-0x34(%rbp)
  mov    -0x34(%rbp),%eax
  add    %eax,-0x3c(%rbp)
L48:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  cmp    $0x1c,%rax
  jle    L65
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u64@plt>
  mov    D277(%rip),%edx
  imul   %edx,%eax
  add    %eax,-0x3c(%rbp)
  addq   $0x20,-0x30(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    $0x21,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D216(%rip),%edx
  imul   %edx,%eax
  xor    %eax,-0x3c(%rbp)
L65:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  cmp    $0xc,%rax
  jle    L44
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u32@plt>
  mov    D277(%rip),%edx
  imul   %edx,%eax
  add    %eax,-0x3c(%rbp)
  addq   $0x10,-0x30(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    $0xf,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D216(%rip),%edx
  imul   %edx,%eax
  xor    %eax,-0x3c(%rbp)
L44:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  cmp    $0x4,%rax
  jle    L29
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u16@plt>
  mov    D277(%rip),%edx
  imul   %edx,%eax
  add    %eax,-0x3c(%rbp)
  addq   $0x8,-0x30(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    $0xd,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D216(%rip),%edx
  imul   %edx,%eax
  xor    %eax,-0x3c(%rbp)
L29:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  test   %rax,%rax
  jle    L46
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <read_u8@plt>
  mov    D277(%rip),%edx
  imul   %edx,%eax
  add    %eax,-0x3c(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    $0x19,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  mov    D216(%rip),%edx
  imul   %edx,%eax
  xor    %eax,-0x3c(%rbp)
L46:
  mov    -0x3c(%rbp),%eax
  mov    $0x21,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  xor    %eax,-0x3c(%rbp)
  mov    D237(%rip),%eax
  mov    -0x3c(%rbp),%edx
  imul   %edx,%eax
  mov    %eax,-0x3c(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    $0x21,%esi
  mov    %eax,%edi
  call   <rotate_right@plt>
  xor    %eax,-0x3c(%rbp)
  mov    -0x3c(%rbp),%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L70
  call   <__stack_chk_fail@plt>
L70:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D161
type: byte[4]
name: unpack_data
arguments: data_tag: D237
type: byte[4]
name: unpack_data
arguments: data_tag: D216
type: byte[4]
name: unpack_data
arguments: data_tag: D277
type: byte[4]

tool: {"D161": [0x3b,0xc0,0xde,0x7b]}

tool: {"D237": [0xe1,0x91,0x3a,0xc8]}

tool: {"D216": [0xdb,0xdb,0x48,0x86]}

tool: {"D277": [0xa5,0x70,0x58,0x2f]}

assistant: ```c
uint64_t metrohash64_1(const uint8_t *key, uint64_t len, uint64_t seed) {
  static const uint64_t k0 = 0xC83A91E1;
  static const uint64_t k1 = 0x8648DBDB;
  static const uint64_t k2 = 0x7BDEC03B;
  static const uint64_t k3 = 0x2F5870A5;
  const uint8_t *ptr = key;
  const uint8_t *const end = ptr + len;
  uint64_t hash = ((((uint64_t)seed) + k2) * k0) + len;
  if (len >= 32) {
    uint64_t v[4];
    v[0] = hash;
    v[1] = hash;
    v[2] = hash;
    v[3] = hash;
    do {
      v[0] += read_u64(ptr) * k0;
      ptr += 8;
      v[0] = rotate_right(v[0], 29) + v[2];
      v[1] += read_u64(ptr) * k1;
      ptr += 8;
      v[1] = rotate_right(v[1], 29) + v[3];
      v[2] += read_u64(ptr) * k2;
      ptr += 8;
      v[2] = rotate_right(v[2], 29) + v[0];
      v[3] += read_u64(ptr) * k3;
      ptr += 8;
      v[3] = rotate_right(v[3], 29) + v[1];
    } while (ptr <= (end - 32));
    v[2] ^= rotate_right(((v[0] + v[3]) * k0) + v[1], 33) * k1;
    v[3] ^= rotate_right(((v[1] + v[2]) * k1) + v[0], 33) * k0;
    v[0] ^= rotate_right(((v[0] + v[2]) * k0) + v[3], 33) * k1;
    v[1] ^= rotate_right(((v[1] + v[3]) * k1) + v[2], 33) * k0;
    hash += v[0] ^ v[1];
  }
  if ((end - ptr) >= 16) {
    uint64_t v0 = hash + (read_u64(ptr) * k0);
    ptr += 8;
    v0 = rotate_right(v0, 33) * k1;
    uint64_t v1 = hash + (read_u64(ptr) * k1);
    ptr += 8;
    v1 = rotate_right(v1, 33) * k2;
    v0 ^= rotate_right(v0 * k0, 35) + v1;
    v1 ^= rotate_right(v1 * k3, 35) + v0;
    hash += v1;
  }
  if ((end - ptr) >= 8) {
    hash += read_u64(ptr) * k3;
    ptr += 8;
    hash ^= rotate_right(hash, 33) * k1;
  }
  if ((end - ptr) >= 4) {
    hash += read_u32(ptr) * k3;
    ptr += 4;
    hash ^= rotate_right(hash, 15) * k1;
  }
  if ((end - ptr) >= 2) {
    hash += read_u16(ptr) * k3;
    ptr += 2;
    hash ^= rotate_right(hash, 13) * k1;
  }
  if ((end - ptr) >= 1) {
    hash += read_u8(ptr) * k3;
    hash ^= rotate_right(hash, 25) * k1;
  }
  hash ^= rotate_right(hash, 33);
  hash *= k0;
  hash ^= rotate_right(hash, 33);
  return hash;
}
```