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

```asm
<main>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    $0x0,%eax
  call   <strdeque_new@plt>
  mov    %rax,%rbx
  lea    D12(%rip),%rbp
  mov    %rbp,%rdx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <strdeque_insert_at@plt>
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_get_at@plt>
  mov    %rax,%rdi
  mov    $0x2,%edx
  mov    %rbp,%rsi
  call   <streq@plt>
  mov    %eax,%edi
  call   <assert@plt>
  lea    D66(%rip),%r12
  mov    %r12,%rdx
  mov    $0x8,%esi
  mov    %rbx,%rdi
  call   <strdeque_insert_at@plt>
  mov    $0x1,%esi
  mov    %rbx,%rdi
  call   <strdeque_get_at@plt>
  mov    %rax,%rdi
  mov    $0x3,%edx
  mov    %r12,%rsi
  call   <streq@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x1,%esi
  mov    %rbx,%rdi
  call   <strdeque_remove_at@plt>
  mov    $0x1,%esi
  mov    %rbx,%rdi
  call   <strdeque_get_at@plt>
  test   %rax,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_get_at@plt>
  mov    %rax,%rdi
  mov    $0x2,%edx
  mov    %rbp,%rsi
  call   <streq@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_insert_at@plt>
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_get_at@plt>
  mov    %rax,%rdi
  mov    $0x2,%edx
  mov    %rbp,%rsi
  call   <streq@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    %rbx,%rdi
  call   <strdeque_size@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%esi
  mov    %rbx,%rdi
  call   <strdeque_remove_at@plt>
  mov    %rbx,%rdi
  call   <strdeque_size@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    %rbx,%rdi
  call   <strdeque_delete@plt>
  lea    D15(%rip),%rdx
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_insert_at@plt>
  mov    %rbx,%rdi
  call   <strdeque_size@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_get_at@plt>
  test   %rax,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <strdeque_new@plt>
  mov    %rax,%rbx
  mov    $0x0,%eax
  call   <strdeque_new@plt>
  mov    %rax,%rbp
  lea    D70(%rip),%r12
  mov    %r12,%rdx
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_insert_at@plt>
  lea    D21(%rip),%r13
  mov    %r13,%rdx
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_insert_at@plt>
  lea    D75(%rip),%r14
  mov    %r14,%rdx
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_insert_at@plt>
  mov    %r14,%rdx
  mov    $0x64,%esi
  mov    %rbp,%rdi
  call   <strdeque_insert_at@plt>
  mov    %r13,%rdx
  mov    $0x3e8,%esi
  mov    %rbp,%rdi
  call   <strdeque_insert_at@plt>
  mov    %r12,%rdx
  mov    $0x2710,%esi
  mov    %rbp,%rdi
  call   <strdeque_insert_at@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <strdeque_comp@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <strdeque_remove_at@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <strdeque_comp@plt>
  cmp    $0xffffffff,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    %rbp,%rdi
  call   <strdeque_delete@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <strdeque_comp@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    %rbx,%rdi
  call   <strdeque_delete@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <strdeque_comp@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rsi
  mov    %rbx,%rdi
  call   <strdeque_comp@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  mov    %rbp,%rsi
  call   <strdeque_comp@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rbx
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  mov    %rbx,%rsi
  call   <strdeque_comp@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  call   <strdeque_size@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  call   <strdeque_delete@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  lea    D42(%rip),%rbx
  mov    %rbx,%rdx
  mov    $0x0,%esi
  call   <strdeque_insert_at@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  call   <strdeque_size@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  mov    %rbx,%rdx
  mov    $0x0,%esi
  call   <strdeque_insert_at@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  lea    D46(%rip),%rdx
  mov    $0x0,%esi
  call   <strdeque_insert_at@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  mov    $0x0,%esi
  call   <strdeque_get_at@plt>
  test   %rax,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  mov    $0x0,%esi
  call   <strdeque_remove_at@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  call   <strdeque_size@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <emptystrdeque@plt>
  mov    %rax,%rdi
  call   <strdeque_clear@plt>
  mov    $0x0,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

tool_calls: name: disassemble_data
arguments: label: D12
datatype: string
name: disassemble_data
arguments: label: D66
datatype: string
name: disassemble_data
arguments: label: D15
datatype: string
name: disassemble_data
arguments: label: D70
datatype: string
name: disassemble_data
arguments: label: D21
datatype: string
name: disassemble_data
arguments: label: D75
datatype: string
name: disassemble_data
arguments: label: D42
datatype: string
name: disassemble_data
arguments: label: D46
datatype: string

tool: D12: a

tool: D66: aa

tool: D15: b

tool: D70: c

tool: D21: cc

tool: D75: ccc

tool: D42: d

tool: D46: dd

assistant: ```c
int main() {
  unsigned long d1, d2, d3;
  d1 = strdeque_new();
  strdeque_insert_at(d1, 0, "a");
  assert(streq(strdeque_get_at(d1, 0), "a", 2));
  strdeque_insert_at(d1, 8, "aa");
  assert(streq(strdeque_get_at(d1, 1), "aa", 3));
  strdeque_remove_at(d1, 1);
  assert(strdeque_get_at(d1, 1) == NULL);
  assert(streq(strdeque_get_at(d1, 0), "a", 2));
  strdeque_insert_at(d1, 0, NULL);
  assert(streq(strdeque_get_at(d1, 0), "a", 2));
  assert(strdeque_size(d1) == 1);
  strdeque_remove_at(d1, 1);
  assert(strdeque_size(d1) == 1);
  strdeque_delete(d1);
  strdeque_insert_at(d1, 0, "b");
  assert(strdeque_size(d1) == 0);
  assert(strdeque_get_at(d1, 0) == NULL);
  d2 = strdeque_new();
  d3 = strdeque_new();
  strdeque_insert_at(d2, 0, "c");
  strdeque_insert_at(d2, 0, "cc");
  strdeque_insert_at(d2, 0, "ccc");
  strdeque_insert_at(d3, 100, "ccc");
  strdeque_insert_at(d3, 1000, "cc");
  strdeque_insert_at(d3, 10000, "c");
  assert(strdeque_comp(d2, d3) == 0);
  strdeque_remove_at(d2, 0);
  assert(strdeque_comp(d2, d3) == -1);
  strdeque_delete(d3);
  assert(strdeque_comp(d2, d3) == 1);
  strdeque_delete(d2);
  assert(strdeque_comp(d2, d3) == 0);
  assert(strdeque_comp(d2, emptystrdeque()) == 0);
  assert(strdeque_comp(emptystrdeque(), d3) == 0);
  assert(strdeque_comp(emptystrdeque(), emptystrdeque()) == 0);
  assert(strdeque_size(emptystrdeque()) == 0);
  strdeque_delete(emptystrdeque());
  strdeque_insert_at(emptystrdeque(), 0, "d");
  assert(strdeque_size(emptystrdeque()) == 0);
  strdeque_insert_at(emptystrdeque(), 0, "d");
  strdeque_insert_at(emptystrdeque(), 0, "dd");
  assert(strdeque_get_at(emptystrdeque(), 0) == NULL);
  strdeque_remove_at(emptystrdeque(), 0);
  assert(strdeque_size(emptystrdeque()) == 0);
  strdeque_clear(emptystrdeque());
  return 0;
}
```