user: Translate the below assembly code into C programming language:

```asm
<bpm>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x108,%rsp
  mov    %edi,0xb4(%rsp)
  test   %r8d,%r8d
  jle    L166
  movslq 0xb4(%rsp),%rax
  movq   $0x0,0x80(%rsp)
  mov    (%rsi,%rax,8),%rax
  mov    %rax,0xa0(%rsp)
  movslq %r8d,%rax
  shl    $0x2,%rax
  mov    %rax,0x60(%rsp)
  jmp    L24
L316:
  addq   $0x4,0x80(%rsp)
  mov    0x80(%rsp),%rax
  cmp    0x60(%rsp),%rax
  je     L166
L24:
  mov    0xa0(%rsp),%rax
  mov    0x80(%rsp),%rdi
  mov    (%rax,%rdi,1),%eax
  mov    %eax,0x9c(%rsp)
  cmp    $0x1,%eax
  jne    L316
  cmpl   $0x1,(%rdx,%rdi,1)
  mov    %rdi,%rax
  je     L316
  movl   $0x1,(%rdx,%rdi,1)
  movslq (%rcx,%rax,1),%rax
  lea    (%rdi,%rcx,1),%rdi
  mov    %rdi,0xc8(%rsp)
  mov    %eax,0xb8(%rsp)
  cmp    $0xffffffff,%eax
  je     L420
  movq   $0x0,0x50(%rsp)
  mov    (%rsi,%rax,8),%rax
  mov    %rax,0x90(%rsp)
  jmp    L250
L261:
  addq   $0x4,0x50(%rsp)
  mov    0x50(%rsp),%rax
  cmp    0x60(%rsp),%rax
  je     L316
L250:
  mov    0x90(%rsp),%rax
  mov    0x50(%rsp),%rdi
  cmpl   $0x1,(%rax,%rdi,1)
  jne    L261
  cmpl   $0x1,(%rdx,%rdi,1)
  mov    %rdi,%rax
  je     L261
  movl   $0x1,(%rdx,%rdi,1)
  movslq (%rcx,%rax,1),%rax
  lea    (%rcx,%rdi,1),%rdi
  mov    %rdi,0xc0(%rsp)
  mov    %eax,0xbc(%rsp)
  cmp    $0xffffffff,%eax
  je     L59
  movq   $0x0,0x30(%rsp)
  mov    (%rsi,%rax,8),%rax
  mov    %rax,0x78(%rsp)
  jmp    L204
L469:
  addq   $0x4,0x30(%rsp)
  mov    0x30(%rsp),%rax
  cmp    0x60(%rsp),%rax
  je     L261
L204:
  mov    0x78(%rsp),%rax
  mov    0x30(%rsp),%rdi
  cmpl   $0x1,(%rax,%rdi,1)
  jne    L469
  cmpl   $0x1,(%rdx,%rdi,1)
  mov    %rdi,%rax
  je     L469
  movl   $0x1,(%rdx,%rdi,1)
  movslq (%rcx,%rax,1),%rax
  lea    (%rcx,%rdi,1),%rdi
  mov    %rdi,0xa8(%rsp)
  mov    %eax,0xb0(%rsp)
  cmp    $0xffffffff,%eax
  je     L216
  movq   $0x0,0x18(%rsp)
  mov    (%rsi,%rax,8),%rax
  mov    %rax,0x48(%rsp)
  jmp    L463
  nopl   0x0(%rax,%rax,1)
L446:
  addq   $0x1,0x18(%rsp)
  mov    0x18(%rsp),%rax
  cmp    %eax,%r8d
  jle    L469
L463:
  mov    0x48(%rsp),%rax
  mov    0x18(%rsp),%rdi
  cmpl   $0x1,(%rax,%rdi,4)
  jne    L446
  cmpl   $0x1,(%rdx,%rdi,4)
  mov    %rdi,%rax
  je     L446
  movl   $0x1,(%rdx,%rdi,4)
  movslq (%rcx,%rax,4),%rax
  lea    (%rcx,%rdi,4),%rdi
  mov    %rdi,0x88(%rsp)
  mov    %eax,0x98(%rsp)
  cmp    $0xffffffff,%eax
  je     L436
  mov    (%rsi,%rax,8),%rax
  xor    %r9d,%r9d
  mov    %rax,0x28(%rsp)
  jmp    L372
  xchg   %ax,%ax
L21:
  add    $0x1,%r9
  cmp    %r9d,%r8d
  jle    L446
L372:
  mov    0x28(%rsp),%rax
  cmpl   $0x1,(%rax,%r9,4)
  jne    L21
  cmpl   $0x1,(%rdx,%r9,4)
  je     L21
  lea    (%rcx,%r9,4),%rax
  movl   $0x1,(%rdx,%r9,4)
  mov    %rax,0x70(%rsp)
  movslq (%rcx,%r9,4),%rax
  mov    %eax,0x6c(%rsp)
  cmp    $0xffffffff,%eax
  je     L157
  mov    (%rsi,%rax,8),%rax
  mov    %r9,0x58(%rsp)
  xor    %r13d,%r13d
  mov    %rax,0x8(%rsp)
  jmp    L456
  nopl   0x0(%rax)
L108:
  add    $0x1,%r13
  cmp    %r13d,%r8d
  jle    L81
L456:
  mov    0x8(%rsp),%rax
  cmpl   $0x1,(%rax,%r13,4)
  jne    L108
  cmpl   $0x1,(%rdx,%r13,4)
  je     L108
  lea    (%rcx,%r13,4),%rax
  movl   $0x1,(%rdx,%r13,4)
  mov    %rax,0x40(%rsp)
  movslq (%rcx,%r13,4),%rax
  mov    %eax,0x68(%rsp)
  cmp    $0xffffffff,%eax
  je     L160
  mov    %r13,0x38(%rsp)
  mov    (%rsi,%rax,8),%r9
  xor    %ebp,%ebp
  jmp    L363
  nopw   0x0(%rax,%rax,1)
L275:
  add    $0x1,%rbp
  cmp    %ebp,%r8d
  jle    L309
L363:
  cmpl   $0x1,(%r9,%rbp,4)
  jne    L275
  cmpl   $0x1,(%rdx,%rbp,4)
  je     L275
  movl   $0x1,(%rdx,%rbp,4)
  mov    (%rcx,%rbp,4),%r15d
  lea    (%rcx,%rbp,4),%rax
  mov    %rax,0x20(%rsp)
  cmp    $0xffffffff,%r15d
  je     L215
  movslq %r15d,%rax
  mov    %r15d,0x14(%rsp)
  xor    %ebx,%ebx
  mov    %rbp,%r14
  mov    (%rsi,%rax,8),%r13
  jmp    L145
  nopl   0x0(%rax,%rax,1)
L78:
  add    $0x1,%rbx
  cmp    %ebx,%r8d
  jle    L135
L145:
  cmpl   $0x1,0x0(%r13,%rbx,4)
  jne    L78
  cmpl   $0x1,(%rdx,%rbx,4)
  je     L78
  movl   $0x1,(%rdx,%rbx,4)
  mov    (%rcx,%rbx,4),%r11d
  lea    (%rcx,%rbx,4),%r15
  cmp    $0xffffffff,%r11d
  je     L307
  movslq %r11d,%rax
  mov    %rcx,%r10
  xor    %ebp,%ebp
  mov    (%rsi,%rax,8),%r12
  jmp    L152
  nopw   0x0(%rax,%rax,1)
L223:
  add    $0x1,%rbp
  add    $0x4,%r10
  cmp    %ebp,%r8d
  jle    L78
L152:
  cmpl   $0x1,(%r12,%rbp,4)
  jne    L223
  cmpl   $0x1,(%rdx,%rbp,4)
  je     L223
  movl   $0x1,(%rdx,%rbp,4)
  mov    (%r10),%edi
  cmp    $0xffffffff,%edi
  je     L219
  mov    %r10,0xf8(%rsp)
  mov    %r9,0xf0(%rsp)
  mov    %r11d,0xec(%rsp)
  mov    %r8d,0xe8(%rsp)
  mov    %rcx,0xe0(%rsp)
  mov    %rdx,0xd8(%rsp)
  mov    %rsi,0xd0(%rsp)
  call   <bpm>
  mov    0xd0(%rsp),%rsi
  mov    0xd8(%rsp),%rdx
  test   %eax,%eax
  mov    0xe0(%rsp),%rcx
  mov    0xe8(%rsp),%r8d
  mov    0xec(%rsp),%r11d
  mov    0xf0(%rsp),%r9
  mov    0xf8(%rsp),%r10
  je     L223
  xchg   %ax,%ax
L219:
  mov    %r10,%rax
  mov    0x14(%rsp),%edi
  mov    %r15,%rsi
  mov    %r11d,(%rax)
L65:
  mov    %edi,(%rsi)
L215:
  mov    0x20(%rsp),%rax
  mov    0x68(%rsp),%edi
  mov    %edi,(%rax)
L160:
  mov    0x40(%rsp),%rax
  mov    0x6c(%rsp),%edi
  mov    %edi,(%rax)
L157:
  mov    0x70(%rsp),%rax
  mov    0x98(%rsp),%edi
  mov    %edi,(%rax)
L436:
  mov    0x88(%rsp),%rax
  mov    0xb0(%rsp),%edi
  mov    %edi,(%rax)
L216:
  mov    0xa8(%rsp),%rax
  mov    0xbc(%rsp),%edi
  mov    %edi,(%rax)
L59:
  mov    0xc0(%rsp),%rax
  mov    0xb8(%rsp),%edi
  mov    %edi,(%rax)
L420:
  mov    0xc8(%rsp),%rax
  mov    0xb4(%rsp),%edi
  mov    %edi,(%rax)
L289:
  mov    0x9c(%rsp),%eax
  add    $0x108,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L135:
  mov    %r14,%rbp
  add    $0x1,%rbp
  cmp    %ebp,%r8d
  jg     L363
L309:
  mov    0x38(%rsp),%r13
  add    $0x1,%r13
  cmp    %r13d,%r8d
  jg     L456
L81:
  mov    0x58(%rsp),%r9
  jmp    L21
L307:
  mov    0x14(%rsp),%edi
  mov    %r15,%rsi
  jmp    L65
L166:
  movl   $0x0,0x9c(%rsp)
  jmp    L289
```

assistant: ```c
int bpm(int u, int **graph, int *seen, int *match, int n) {
  int v;
  for (v = 0; v < n; v++) {
    if (graph[u][v] == 1) {
      if (seen[v] == 1)
        continue;
      seen[v] = 1;
      if (match[v] == -1 || bpm(match[v], graph, seen, match, n)) {
        match[v] = u;
        return 1;
      }
    }
  }
  return 0;
}
```