user: What is the c source code of the assembly code below:

```asm
<lin_solve>:
  endbr64
  lea    0x2(%rdi),%eax
  push   %r15
  movaps %xmm0,%xmm2
  push   %r14
  push   %r13
  push   %r12
  movslq %eax,%r12
  imul   %eax,%eax
  push   %rbp
  push   %rbx
  movslq %eax,%r15
  lea    0x1(%r12),%rax
  lea    0x0(,%r15,4),%r14
  sub    $0x78,%rsp
  mov    %r14,%r13
  mov    %rax,0x40(%rsp)
  add    %r15,%rax
  neg    %r13
  shl    $0x2,%rax
  mov    %edi,0x5c(%rsp)
  mov    %r13,%rbp
  mov    %r12,%r13
  mov    %rax,0x60(%rsp)
  lea    0x0(,%r12,4),%rax
  mov    %rax,0x20(%rsp)
  lea    -0x1(%rdi),%eax
  lea    0x1(%r12,%rax,1),%rax
  mov    %esi,0x6c(%rsp)
  mov    %r15,%r12
  mov    %rdx,0x18(%rsp)
  mov    %rcx,0x28(%rsp)
  movl   $0xa,0x68(%rsp)
  mov    %rax,0x50(%rsp)
L40:
  mov    0x5c(%rsp),%eax
  test   %eax,%eax
  jle    L15
  mov    0x60(%rsp),%rbx
  lea    0x1(%rax),%r15d
  mov    $0x1,%eax
  mov    %r13,0x30(%rsp)
  sub    %r13,%rax
  mov    %rbx,0x38(%rsp)
  mov    %rax,0x48(%rsp)
  xchg   %ax,%ax
L33:
  mov    0x30(%rsp),%r10
  movl   $0x1,0x58(%rsp)
  mov    0x38(%rsp),%r11
  mov    %r10,%rbx
  add    $0x1,%r10
  lea    0x2(%rbx),%rax
  mov    %r10,0x30(%rsp)
  mov    %rax,0x10(%rsp)
  mov    0x48(%rsp),%rax
  add    %rbx,%rax
  mov    %rax,0x8(%rsp)
  mov    0x40(%rsp),%rax
  add    %rbx,%rax
  mov    %rax,(%rsp)
L23:
  mov    0x28(%rsp),%rax
  addl   $0x1,0x58(%rsp)
  mov    %rbx,%r9
  mov    $0x1,%edx
  mov    0x10(%rsp),%r8
  mov    0x8(%rsp),%rdi
  sub    %r10,%r9
  mov    (%rsp),%rsi
  lea    (%rax,%r11,1),%rcx
  mov    0x18(%rsp),%rax
  sub    %r10,%r8
  sub    %r10,%rdi
  add    %r11,%rax
  sub    %r10,%rsi
  nopl   0x0(%rax,%rax,1)
L18:
  movss  (%rax,%r9,4),%xmm0
  addss  (%rax,%r8,4),%xmm0
  add    $0x1,%edx
  addss  (%rax,%rdi,4),%xmm0
  addss  (%rax,%rsi,4),%xmm0
  addss  (%rax,%rbp,1),%xmm0
  addss  (%rax,%r12,4),%xmm0
  mulss  %xmm2,%xmm0
  addss  (%rcx),%xmm0
  add    %r14,%rcx
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  add    %r14,%rax
  cmp    %r15d,%edx
  jne    L18
  add    %r13,0x10(%rsp)
  add    %r13,%rbx
  add    %r13,%r10
  add    0x20(%rsp),%r11
  add    %r13,0x8(%rsp)
  add    %r13,(%rsp)
  cmp    %r15d,0x58(%rsp)
  jne    L23
  addq   $0x4,0x38(%rsp)
  mov    0x30(%rsp),%rbx
  cmp    %rbx,0x50(%rsp)
  jne    L33
L15:
  mov    0x6c(%rsp),%edx
  mov    0x18(%rsp),%rsi
  movss  %xmm1,(%rsp)
  mov    0x5c(%rsp),%edi
  movss  %xmm2,0x58(%rsp)
  call   <boundary_condition@plt>
  subl   $0x1,0x68(%rsp)
  movss  0x58(%rsp),%xmm2
  movss  (%rsp),%xmm1
  jne    L40
  add    $0x78,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void lin_solve(int N, int b, float *value, float *value_prev, float a, float c) {
  int count;
  int count_x;
  int count_y;
  int count_z;
  for (count = 0; count < 10; count++) {
    for (count_x = 1; count_x <= N; count_x++) {
      for (count_y = 1; count_y <= N; count_y++) {
        for (count_z = 1; count_z <= N; count_z++) {
          value[((count_x) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z))] = (value_prev[((count_x) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z))] + a * (value[((count_x - 1) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z))] + value[((count_x + 1) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z))] + value[((count_x) + (N + 2) * (count_y - 1) + (N + 2) * (N + 2) * (count_z))] + value[((count_x) + (N + 2) * (count_y + 1) + (N + 2) * (N + 2) * (count_z))] + value[((count_x) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z - 1))] + value[((count_x) + (N + 2) * (count_y) + (N + 2) * (N + 2) * (count_z + 1))])) / c;
        }
      }
    }
    boundary_condition(N, value, b);
  }
}
```