user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %rbx
  lea    D45(%rip),%rdi
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  call   <puts@plt>
  lea    0x10(%rsp),%rdx
  lea    0xc(%rsp),%rsi
  xor    %eax,%eax
  lea    D86(%rip),%rdi
  call   <scanf@plt>
  lea    D108(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D96(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  xor    %eax,%eax
  lea    0x14(%rsp),%rsi
  lea    D44(%rip),%rdi
  call   <scanf@plt>
  cmpl   $0x5,0x14(%rsp)
  ja     L23
  mov    0x14(%rsp),%eax
  lea    D73(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  mov    0xc(%rsp),%esi
  imul   0x10(%rsp),%esi
  lea    D91(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  xor    %edi,%edi
  call   <exit@plt>
L23:
  lea    D39(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L21:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L42
  add    $0x20,%rsp
  xor    %eax,%eax
  pop    %rbx
  ret
  mov    0xc(%rsp),%edi
  mov    $0x2,%esi
  call   <pow@plt>
  mov    0x10(%rsp),%edi
  mov    $0x2,%esi
  mov    %eax,%ebx
  call   <pow@plt>
  lea    D97(%rip),%rdi
  lea    (%rbx,%rax,1),%esi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L21
  mov    0x10(%rsp),%esi
  lea    D61(%rip),%rdi
  add    0xc(%rsp),%esi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L21
  mov    0xc(%rsp),%edi
  mov    $0x3,%esi
  call   <pow@plt>
  mov    0x10(%rsp),%edi
  mov    $0x3,%esi
  mov    %eax,%ebx
  call   <pow@plt>
  lea    D29(%rip),%rdi
  lea    (%rbx,%rax,1),%esi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L21
L42:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_tag: D45
type: string
name: retrieve_data
arguments: data_tag: D86
type: string
name: retrieve_data
arguments: data_tag: D108
type: string
name: retrieve_data
arguments: data_tag: D96
type: string
name: retrieve_data
arguments: data_tag: D44
type: string
name: retrieve_data
arguments: data_tag: D91
type: string
name: retrieve_data
arguments: data_tag: D39
type: string
name: retrieve_data
arguments: data_tag: D97
type: string
name: retrieve_data
arguments: data_tag: D61
type: string
name: retrieve_data
arguments: data_tag: D29
type: string

tool: D45: Enter two numbers: 

tool: D86: %d %d

tool: D108: 
---------------- MENU -------------- 

tool: D96: 
	 1. Summation 
	 2. Sum of squares 
	 3. Sum of cubes 
	 4. Product 
	 5. Exit 
 Your choice: 

tool: D44: %d

tool: D91: 
The product is %d

tool: D39: 
Wrong choice

tool: D97: 
The sum of squares is %d

tool: D61: 
The sum is %d

tool: D29: 
The sum of cubes is %d

assistant: ```c
int main(void) {
  int a, b, sum, sq_sum, cu_sum, product, choice;
  printf("Enter two numbers: \n");
  scanf("%d %d", &a, &b);
  printf("\n---------------- MENU -------------- ");
  printf("\n\t 1. Summation \n\t 2. Sum of squares \n\t 3. Sum of cubes \n\t 4. Product \n\t 5. Exit \n Your choice: ");
  scanf("%d", &choice);
  switch (choice) {
  case 1:
    sum = a + b;
    printf("\nThe sum is %d", sum);
    break;
  case 2:
    sq_sum = pow(a, 2) + pow(b, 2);
    printf("\nThe sum of squares is %d", sq_sum);
    break;
  case 3:
    cu_sum = pow(a, 3) + pow(b, 3);
    printf("\nThe sum of cubes is %d", cu_sum);
    break;
  case 4:
    product = a * b;
    printf("\nThe product is %d", product);
  case 5:
    exit(0);
  default:
    printf("\nWrong choice");
  }
}
```