user: What would the C source look like for the assembly code provided here:

```asm
<First_Pass>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    %rsi,0x10(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  mov    D12(%rip),%rax
  movl   $0x3,0x50(%rsp)
  mov    %rax,0x48(%rsp)
  movslq %edi,%rax
  movb   $0x43,(%rdx,%rax,1)
  movb   $0x43,0x1(%rdx)
  test   %edi,%edi
  jle    L180
  mov    %edi,%r12d
  mov    %rdx,%rbp
  mov    $0x1,%r14d
  xor    %r15d,%r15d
  jmp    L68
  nop
L46:
  test   %r15d,%r15d
  jne    L140
  mov    %r14d,0x28(%rsp)
  mov    $0x1,%r15d
L140:
  add    $0x1,%r14
  cmp    %r14d,%r12d
  jl     L180
L68:
  cmpb   $0x43,0x0(%rbp,%r14,1)
  mov    %r14d,0x4(%rsp)
  jne    L46
  test   %r15d,%r15d
  je     L140
  movslq 0x28(%rsp),%rax
  lea    0x0(%rbp,%rax,1),%rcx
  mov    %rax,%r13
  mov    %rax,0x18(%rsp)
  movsbl (%rcx),%edi
  mov    %rcx,0x20(%rsp)
  call   <obs_indx@plt>
  mov    D18(%rip),%rcx
  lea    -0x1(%r14),%edx
  lea    0x1(%r13),%esi
  mov    %edx,0x2c(%rsp)
  movslq %eax,%rbx
  mov    %rcx,0x3c(%rsp)
  mov    %r13d,%ecx
  cmp    %esi,%edx
  jl     L137
  mov    0x18(%rsp),%rax
  movslq %esi,%rsi
  lea    0x0(%rbp,%rsi,1),%r13
  lea    0x2(%rbp,%rax,1),%rdx
  mov    %r14d,%eax
  sub    %ecx,%eax
  sub    $0x2,%eax
  add    %rdx,%rax
  mov    %rax,0x8(%rsp)
  nopw   0x0(%rax,%rax,1)
L25:
  movsbl 0x0(%r13),%edi
  call   <obs_indx@plt>
  cmp    %rbx,%rax
  setne  %al
  movzbl %al,%eax
  add    %eax,%r15d
  cmp    $0x2,%r15d
  jg     L23
  movsbl 0x0(%r13),%edi
  movslq %r15d,%rax
  add    $0x1,%r13
  addl   $0x1,0x38(%rsp,%rax,4)
  call   <obs_indx@plt>
  movslq %eax,%rbx
  cmp    0x8(%rsp),%r13
  jne    L25
  mov    0x3c(%rsp),%r15d
L137:
  mov    0x20(%rsp),%rax
  movsbl (%rax),%edi
  call   <obs_indx@plt>
  cmp    %r15d,0x48(%rsp,%rax,4)
  jg     L53
  movsbl -0x1(%rbp,%r14,1),%edi
  mov    0x40(%rsp),%ebx
  call   <obs_indx@plt>
  cmp    0x48(%rsp,%rax,4),%ebx
  jl     L53
L74:
  xor    %r15d,%r15d
L47:
  add    $0x1,%r14
  cmp    %r14d,%r12d
  jge    L68
  cs nopw 0x0(%rax,%rax,1)
L180:
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L116
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L23:
  movsbl 0x0(%r13),%edi
  add    $0x1,%r13
  call   <obs_indx@plt>
  movslq %eax,%rbx
  cmp    %r13,0x8(%rsp)
  jne    L25
L53:
  mov    0x28(%rsp),%ecx
  cmp    %ecx,0x2c(%rsp)
  jl     L74
  mov    0x18(%rsp),%rsi
  mov    0x4(%rsp),%edx
  sub    0x28(%rsp),%edx
  mov    0x10(%rsp),%rcx
  movsd  D20(%rip),%xmm0
  lea    -0x1(%rdx),%edi
  lea    (%rsi,%rdi,1),%rdx
  lea    (%rcx,%rsi,8),%rax
  movapd %xmm0,%xmm1
  lea    0x8(%rcx,%rdx,8),%rsi
  nopl   0x0(%rax)
L82:
  mov    (%rax),%rdx
  pxor   %xmm2,%xmm2
  add    $0x8,%rax
  cvtss2sd 0x4(%rdx),%xmm2
  mulsd  %xmm2,%xmm1
  pxor   %xmm2,%xmm2
  cvtss2sd 0x8(%rdx),%xmm2
  mulsd  %xmm2,%xmm0
  cmp    %rax,%rsi
  jne    L82
  comisd %xmm0,%xmm1
  jbe    L111
  lea    0x1(%rdi),%rdx
  mov    0x20(%rsp),%rdi
  mov    $0x48,%esi
  xor    %r15d,%r15d
  call   <memset@plt>
  jmp    L47
  nopw   0x0(%rax,%rax,1)
L111:
  mov    0x4(%rsp),%r13d
  sub    0x28(%rsp),%r13d
  mov    $0x45,%esi
  xor    %r15d,%r15d
  mov    0x20(%rsp),%rdi
  lea    -0x1(%r13),%edx
  add    $0x1,%rdx
  call   <memset@plt>
  jmp    L47
L116:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_label: D12
datatype: byte[8]
name: parse_data
arguments: data_label: D18
datatype: byte[8]
name: parse_data
arguments: data_label: D20
datatype: f64

tool: {"D12": [0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00]}

tool: {"D18": [0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: D20: 1

assistant: ```c
void First_Pass(int nres, float **proba, char *pred) {
  int ires;
  int lim1, lim2;
  int open;
  int kk;
  int type;
  int block[3];
  int nseg;
  int size[3] = {0, 4, 3};
  double ptot[3];
  pred[1] = pred[nres] = 'C';
  open = 0;
  for (ires = 1; ires <= nres; ires++) {
    if (pred[ires] != 'C') {
      if (!open) {
        open = 1;
        lim1 = ires;
      }
    } else {
      if (open) {
        open = 0;
        lim2 = ires - 1;
        type = obs_indx(pred[lim1]);
        block[1] = block[2] = 0;
        nseg = 1;
        block[nseg]++;
        for (kk = lim1 + 1; kk <= lim2; kk++) {
          if (obs_indx(pred[kk]) != type)
            nseg++;
          if (nseg <= 2)
            block[nseg]++;
          type = obs_indx(pred[kk]);
        }
        if (nseg > 2 || block[1] < size[obs_indx(pred[lim1])] || block[2] < size[obs_indx(pred[lim2])]) {
          ptot[1] = ptot[2] = 1.0;
          for (kk = lim1; kk <= lim2; kk++) {
            ptot[1] = ptot[1] * proba[kk][1];
            ptot[2] = ptot[2] * proba[kk][2];
          }
          if (ptot[1] > ptot[2]) {
            for (kk = lim1; kk <= lim2; kk++)
              pred[kk] = 'H';
          } else {
            for (kk = lim1; kk <= lim2; kk++)
              pred[kk] = 'E';
          }
        }
      }
    }
  }
}
```