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

```asm
<iface_midi_router_set_program>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %edi,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  js     L123
  cmpl   $0x15,-0x4(%rbp)
  jle    L64
L123:
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    D2(%rip),%rax
  mov    %rax,%rdi
  call   <log_error@plt>
  jmp    L224
L64:
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <config_store_set_val@plt>
  cmpl   $0x14,-0x4(%rbp)
  ja     L224
  mov    -0x4(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D10(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D10(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    $0x0,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x3,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x0,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x3,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x0,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x3,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x0,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xfffffffe,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x3,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x0,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x1,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x10,%esi
  mov    $0x3,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x0,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x1,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x10,%esi
  mov    $0x3,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x0,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x10,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x11,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x12,%esi
  mov    $0x3,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x0,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0x1,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x10,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x11,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x12,%esi
  mov    $0x3,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x1,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x1,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x1,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xfffffffe,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x1,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xfffffffe,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x1,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x1,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x1,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x1,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x1,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x1,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x10,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x1,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xfffffffe,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x1,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0x10,%esi
  mov    $0x2,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x2,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xffffffff,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x2,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x2,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xfffffffe,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  mov    $0xfffffffe,%esi
  mov    $0x1,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x3,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  jmp    L224
  mov    $0x3,%edi
  call   <cvproc_set_pairs@plt>
  mov    $0xfffffffe,%esi
  mov    $0x0,%edi
  call   <cvproc_set_pair_mode@plt>
  nop
L224:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D2
type_infered: string

tool: D2: imrsp - prog invalid: %d

assistant: ```c
void iface_midi_router_set_program(int prog) {
  if (prog < 0 || prog > 21) {
    log_error("imrsp - prog invalid: %d", prog);
    return;
  }
  config_store_set_val(1, prog);
  switch (prog) {
  case 0:
    cvproc_set_pairs(0);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -1);
    cvproc_set_pair_mode(2, -1);
    cvproc_set_pair_mode(3, -1);
    break;
  case 1:
    cvproc_set_pairs(0);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -2);
    cvproc_set_pair_mode(2, -1);
    cvproc_set_pair_mode(3, -1);
    break;
  case 2:
    cvproc_set_pairs(0);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -2);
    cvproc_set_pair_mode(2, -1);
    cvproc_set_pair_mode(3, -2);
    break;
  case 3:
    cvproc_set_pairs(0);
    cvproc_set_pair_mode(0, -2);
    cvproc_set_pair_mode(1, -2);
    cvproc_set_pair_mode(2, -2);
    cvproc_set_pair_mode(3, -2);
    break;
  case 4:
    cvproc_set_pairs(0);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -1);
    cvproc_set_pair_mode(2, 1);
    cvproc_set_pair_mode(3, 16);
    break;
  case 5:
    cvproc_set_pairs(0);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -2);
    cvproc_set_pair_mode(2, 1);
    cvproc_set_pair_mode(3, 16);
    break;
  case 6:
    cvproc_set_pairs(0);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, 16);
    cvproc_set_pair_mode(2, 17);
    cvproc_set_pair_mode(3, 18);
    break;
  case 7:
    cvproc_set_pairs(0);
    cvproc_set_pair_mode(0, 1);
    cvproc_set_pair_mode(1, 16);
    cvproc_set_pair_mode(2, 17);
    cvproc_set_pair_mode(3, 18);
    break;
  case 8:
    cvproc_set_pairs(1);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -1);
    cvproc_set_pair_mode(2, -1);
    break;
  case 9:
    cvproc_set_pairs(1);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -1);
    cvproc_set_pair_mode(2, -2);
    break;
  case 10:
    cvproc_set_pairs(1);
    cvproc_set_pair_mode(0, -2);
    cvproc_set_pair_mode(1, -1);
    cvproc_set_pair_mode(2, -1);
    break;
  case 11:
    cvproc_set_pairs(1);
    cvproc_set_pair_mode(0, -2);
    cvproc_set_pair_mode(1, -2);
    cvproc_set_pair_mode(2, -2);
    break;
  case 12:
    cvproc_set_pairs(1);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -1);
    cvproc_set_pair_mode(2, 1);
    break;
  case 13:
    cvproc_set_pairs(1);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -2);
    cvproc_set_pair_mode(2, 1);
    break;
  case 14:
    cvproc_set_pairs(1);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, 1);
    cvproc_set_pair_mode(2, 16);
    break;
  case 15:
    cvproc_set_pairs(1);
    cvproc_set_pair_mode(0, -2);
    cvproc_set_pair_mode(1, 1);
    cvproc_set_pair_mode(2, 16);
    break;
  case 16:
    cvproc_set_pairs(2);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -1);
    break;
  case 17:
    cvproc_set_pairs(2);
    cvproc_set_pair_mode(0, -1);
    cvproc_set_pair_mode(1, -2);
    break;
  case 18:
    cvproc_set_pairs(2);
    cvproc_set_pair_mode(0, -2);
    cvproc_set_pair_mode(1, -2);
    break;
  case 19:
    cvproc_set_pairs(3);
    cvproc_set_pair_mode(0, -1);
    break;
  case 20:
    cvproc_set_pairs(3);
    cvproc_set_pair_mode(0, -2);
    break;
  }
}
```