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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x34(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    0x10(%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x40(%rbp),%rax
  mov    0x8(%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,%rsi
  lea    D26(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x10(%rbp),%rax
  mov    %rax,%rsi
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D37(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x18(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L50
L24:
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L74
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x61,%eax
  mov    %eax,%esi
  lea    D35(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L49
L74:
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x41,%eax
  mov    %eax,%esi
  lea    D35(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L49:
  addl   $0x1,-0x24(%rbp)
L50:
  mov    -0x24(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  jl     L24
  mov    $0xa,%edi
  call   <putchar@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x14(%rbp)
  movl   $0x0,-0x1c(%rbp)
  jmp    L2
L53:
  mov    -0x1c(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %edx,%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L81
  mov    -0x1c(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %edx,%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x61,%eax
  mov    %eax,-0x20(%rbp)
  jmp    L54
L81:
  mov    -0x1c(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %edx,%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x41,%eax
  mov    %eax,-0x20(%rbp)
L54:
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L89
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  sub    $0x61,%eax
  movslq %eax,%rdx
  imul   $0x4ec4ec4f,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x3,%edx
  mov    %eax,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%edx
  imul   $0x1a,%edx,%ecx
  sub    %ecx,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  lea    0x61(%rax),%ecx
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L33
L89:
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  sub    $0x41,%eax
  movslq %eax,%rdx
  imul   $0x4ec4ec4f,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x3,%edx
  mov    %eax,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%edx
  imul   $0x1a,%edx,%ecx
  sub    %ecx,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  lea    0x41(%rax),%ecx
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
L33:
  addl   $0x1,-0x1c(%rbp)
L2:
  mov    -0x1c(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jl     L53
  mov    -0x8(%rbp),%rax
  mov    %rax,%rsi
  lea    D19(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D26
data_type: string
name: extract_symbolic_data
arguments: data_label: D13
data_type: string
name: extract_symbolic_data
arguments: data_label: D37
data_type: string
name: extract_symbolic_data
arguments: data_label: D35
data_type: string
name: extract_symbolic_data
arguments: data_label: D19
data_type: string

tool: D26: Plaintext is %s


tool: D13: Vigenere key is %s


tool: D37: Equivalent k is : 

tool: D35: %i 

tool: D19: Encyphered text is %s


assistant: ```c
int main(int argc, char **argv) {
  char *key = argv[2];
  char *s = argv[1];
  printf("Plaintext is %s\n", s);
  printf("Vigenere key is %s\n", key);
  printf("Equivalent k is : ");
  int l = strlen(key);
  for (int c = 0; c < l; c++) {
    if (key[c] >= 97) {
      printf("%i ", key[c] - 'a');
    } else {
      printf("%i ", key[c] - 'A');
    }
  }
  printf("\n");
  int s_l = strlen(s);
  int k;
  for (int c = 0; c < s_l; c++) {
    if (key[c % l] >= 97) {
      k = key[c % l] - 'a';
    } else {
      k = key[c % l] - 'A';
    }
    if (s[c] >= 97) {
      s[c] = (s[c] + k - 'a') % 26 + 'a';
    } else {
      s[c] = (s[c] + k - 'A') % 26 + 'A';
    }
  }
  printf("Encyphered text is %s\n", s);
  return 0;
}
```