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

```asm
<sgf_move>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %edi,%r13d
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0xde8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xdd8(%rsp)
  xor    %eax,%eax
  call   <get_board_size@plt>
  mov    %rbx,%rdi
  mov    %eax,%ebp
  call   <strlen@plt>
  test   %eax,%eax
  je     L66
  mov    %rbx,%rdi
  xor    %r12d,%r12d
  call   <strlen@plt>
  cmp    $0x2,%eax
  jg     L136
  movsbl (%rbx),%eax
  sub    $0x61,%eax
  mov    %eax,%r15d
  js     L117
  cmp    %eax,%ebp
  jl     L117
  movsbl 0x1(%rbx),%eax
  mov    %ebp,%r14d
  sub    $0x61,%eax
  sub    %eax,%r14d
  sub    $0x1,%r14d
  js     L117
  cmp    %r14d,%ebp
  jl     L117
  mov    %r13d,%edi
  mov    %r14d,%edx
  mov    %r15d,%esi
  call   <set_vertex@plt>
  xor    %eax,%eax
  call   <scan_board_1@plt>
  mov    %r13d,%edi
  neg    %edi
  call   <remove_stones@plt>
  test   %eax,%eax
  jle    L125
  xor    %eax,%eax
  call   <scan_board_1@plt>
L125:
  mov    %r14d,%esi
  mov    %r15d,%edi
  call   <get_worm_nr@plt>
  mov    %eax,%ebp
  mov    %eax,%edi
  call   <get_nr_of_liberties@plt>
  mov    %ebp,%edi
  mov    %eax,%r12d
  call   <get_size_of_worm@plt>
  mov    %eax,%ebx
  test   %r12d,%r12d
  je     L68
  lea    0x10(%rsp),%rbp
  mov    %rbp,%rdi
  call   <get_captured_now@plt>
  mov    %eax,0xc(%rsp)
  xor    %eax,%eax
  call   <create_next_move@plt>
  mov    %r14d,%edx
  mov    %r15d,%esi
  mov    %r13d,%edi
  call   <set_move_vertex@plt>
  mov    %rbp,%rdi
  call   <set_move_captured_stones@plt>
  cmp    $0x1,%ebx
  sete   %dl
  cmp    $0x1,%r12d
  sete   %al
  test   %al,%dl
  je     L73
  cmpl   $0x1,0xc(%rsp)
  je     L128
L73:
  xor    %eax,%eax
  mov    $0x1,%r12d
  call   <push_move@plt>
  cs nopw 0x0(%rax,%rax,1)
L136:
  mov    0xdd8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L133
  add    $0xde8,%rsp
  mov    %r12d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L117:
  xor    %r12d,%r12d
  jmp    L136
  nopl   (%rax)
L66:
  call   <create_next_move@plt>
  mov    %r13d,%edi
  mov    $0x1,%r12d
  call   <set_move_pass@plt>
  xor    %eax,%eax
  call   <push_move@plt>
  jmp    L136
L128:
  mov    0x14(%rsp),%esi
  mov    0x10(%rsp),%edi
  call   <set_move_ko@plt>
  jmp    L73
  nopl   0x0(%rax,%rax,1)
L68:
  mov    %r14d,%edx
  mov    %r15d,%esi
  xor    %edi,%edi
  call   <set_vertex@plt>
  jmp    L136
L133:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
bool sgf_move(int color, char *value) {
  int i, j;
  int nr_of_removed_stones;
  int group_nr;
  int nr_of_liberties;
  int group_size;
  int captured_now[21 * 21][2];
  int board_size = get_board_size();
  if (strlen(value) == 0) {
    create_next_move();
    set_move_pass(color);
    push_move();
    return true;
  }
  if (strlen(value) > 2) {
    return false;
  }
  i = value[0] - 97;
  j = board_size - (value[1] - 97) - 1;
  if (i < 0 || i > board_size) {
    return false;
  }
  if (j < 0 || j > board_size) {
    return false;
  }
  set_vertex(color, i, j);
  scan_board_1();
  nr_of_removed_stones = remove_stones(color * -1);
  if (nr_of_removed_stones > 0) {
    scan_board_1();
  }
  group_nr = get_worm_nr(i, j);
  nr_of_liberties = get_nr_of_liberties(group_nr);
  group_size = get_size_of_worm(group_nr);
  if (nr_of_liberties == 0) {
    set_vertex(0, i, j);
    return false;
  }
  nr_of_removed_stones = get_captured_now(captured_now);
  create_next_move();
  set_move_vertex(color, i, j);
  set_move_captured_stones(captured_now);
  if (nr_of_removed_stones == 1 && group_size == 1 && nr_of_liberties == 1) {
    set_move_ko(captured_now[0][0], captured_now[0][1]);
  }
  push_move();
  return true;
}
```