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

```asm
<fastBlur4>:
  endbr64
  push   %r15
  mov    %edx,%r9d
  mov    %esi,%r15d
  mov    %ecx,%esi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  cmp    $0x1,%ecx
  je     L130
  mov    $0x2,%ecx
  cmp    $0x3,%esi
  jne    L325
L161:
  lea    -0x2(%r15),%eax
  mov    %r15d,%ebx
  lea    0x0(,%r15,4),%r8d
  movl   $0x0,-0x18(%rsp)
  mov    %eax,-0x14(%rsp)
  lea    -0x2(%r9),%eax
  mov    %eax,-0x10(%rsp)
  mov    %r15d,%eax
  shl    $0x1e,%eax
  sub    %eax,%ebx
  lea    -0x1(%r9),%eax
  imul   %r15d,%eax
  mov    %ebx,-0x8(%rsp)
  shl    $0x2,%eax
  mov    %eax,-0xc(%rsp)
  lea    -0x4(%r8),%eax
  mov    %eax,-0x4(%rsp)
L318:
  cmp    $0x1,%r15d
  jle    L54
  mov    -0x18(%rsp),%ebp
  mov    $0x1,%ebx
  cs nopw 0x0(%rax,%rax,1)
L133:
  mov    %ebp,%r10d
  xor    %r11d,%r11d
  test   %r9d,%r9d
  jle    L176
  nopl   0x0(%rax,%rax,1)
L357:
  movslq %r10d,%rax
  lea    0x4(%r10),%edx
  add    $0x1,%r11d
  add    %r8d,%r10d
  movzbl (%rdi,%rax,1),%eax
  movslq %edx,%rdx
  add    %rdi,%rdx
  imul   %esi,%eax
  movzbl (%rdx),%r12d
  add    %r12d,%eax
  sar    %cl,%eax
  mov    %al,(%rdx)
  cmp    %r11d,%r9d
  jne    L357
L176:
  add    $0x1,%ebx
  add    $0x4,%ebp
  cmp    %ebx,%r15d
  jne    L133
L436:
  mov    -0x14(%rsp),%ebx
  mov    -0x4(%rsp),%ebp
  add    -0x18(%rsp),%ebp
  nopw   0x0(%rax,%rax,1)
L208:
  mov    %ebp,%r10d
  xor    %r11d,%r11d
  test   %r9d,%r9d
  jle    L182
  nopl   0x0(%rax,%rax,1)
L70:
  movslq %r10d,%rax
  lea    -0x4(%r10),%edx
  add    $0x1,%r11d
  add    %r8d,%r10d
  movzbl (%rdi,%rax,1),%eax
  movslq %edx,%rdx
  add    %rdi,%rdx
  imul   %esi,%eax
  movzbl (%rdx),%r12d
  add    %r12d,%eax
  sar    %cl,%eax
  mov    %al,(%rdx)
  cmp    %r11d,%r9d
  jne    L70
L182:
  sub    $0x1,%ebx
  sub    $0x4,%ebp
  cmp    $0xffffffff,%ebx
  jne    L208
L172:
  test   %r15d,%r15d
  jle    L401
  mov    %r15d,%r12d
  mov    -0x18(%rsp),%r13d
  mov    -0x8(%rsp),%ebp
  neg    %r12d
  nopw   0x0(%rax,%rax,1)
L149:
  lea    0x0(,%rbp,4),%ebx
  mov    %r13d,%r10d
  mov    $0x1,%r11d
  cmp    $0x1,%r9d
  jle    L386
  xchg   %ax,%ax
L354:
  movslq %r10d,%rax
  lea    (%rbx,%r10,1),%edx
  add    $0x1,%r11d
  add    %r8d,%r10d
  movzbl (%rdi,%rax,1),%eax
  movslq %edx,%rdx
  add    %rdi,%rdx
  imul   %esi,%eax
  movzbl (%rdx),%r14d
  add    %r14d,%eax
  sar    %cl,%eax
  mov    %al,(%rdx)
  cmp    %r11d,%r9d
  jne    L354
L386:
  add    $0x4,%r13d
  add    $0x40000000,%ebp
  add    $0x1,%r12d
  jne    L149
L401:
  mov    -0x10(%rsp),%ebx
  test   %ebx,%ebx
  js     L488
  mov    -0x18(%rsp),%ebp
  add    -0xc(%rsp),%ebp
  nopl   0x0(%rax,%rax,1)
L421:
  mov    %ebp,%r10d
  xor    %r11d,%r11d
  test   %r15d,%r15d
  jle    L400
  nopl   0x0(%rax,%rax,1)
L381:
  mov    %r10d,%edx
  movslq %r10d,%rax
  add    $0x1,%r11d
  add    $0x4,%r10d
  movzbl (%rdi,%rax,1),%eax
  sub    %r8d,%edx
  movslq %edx,%rdx
  add    %rdi,%rdx
  imul   %esi,%eax
  movzbl (%rdx),%r12d
  add    %r12d,%eax
  sar    %cl,%eax
  mov    %al,(%rdx)
  cmp    %r11d,%r15d
  jne    L381
L400:
  sub    $0x1,%ebx
  sub    %r8d,%ebp
  cmp    $0xffffffff,%ebx
  jne    L421
L488:
  addl   $0x1,-0x18(%rsp)
  mov    -0x18(%rsp),%eax
  cmp    $0x3,%eax
  jne    L318
L235:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L325:
  cmp    $0x7,%esi
  jne    L237
  mov    $0x3,%ecx
  jmp    L161
L130:
  mov    $0x1,%ecx
  jmp    L161
L237:
  cmp    $0xf,%esi
  jne    L79
  mov    $0x4,%ecx
  jmp    L161
L79:
  cmp    $0x1f,%esi
  jne    L267
  mov    $0x5,%ecx
  jmp    L161
L54:
  mov    -0x14(%rsp),%edx
  test   %edx,%edx
  js     L172
  jmp    L436
L267:
  cmp    $0x3f,%esi
  je     L167
  cmp    $0x7f,%esi
  je     L307
  lea    -0x2(%r15),%eax
  mov    %r15d,%ecx
  lea    0x0(,%r15,4),%r10d
  movl   $0x0,-0x18(%rsp)
  mov    %eax,-0x14(%rsp)
  lea    -0x2(%rdx),%eax
  mov    %eax,-0x10(%rsp)
  mov    %r15d,%eax
  shl    $0x1e,%eax
  sub    %eax,%ecx
  lea    -0x1(%rdx),%eax
  imul   %r15d,%eax
  mov    %ecx,-0x8(%rsp)
  lea    0x1(%rsi),%ecx
  shl    $0x2,%eax
  mov    %eax,-0xc(%rsp)
  lea    -0x4(%r10),%eax
  mov    %eax,-0x4(%rsp)
  cmp    $0x1,%r15d
  jle    L24
L173:
  mov    -0x18(%rsp),%r12d
  mov    $0x1,%ebp
  nopl   0x0(%rax,%rax,1)
L475:
  mov    %r12d,%r11d
  xor    %ebx,%ebx
  test   %r9d,%r9d
  jle    L289
  nopw   0x0(%rax,%rax,1)
L139:
  movslq %r11d,%rax
  lea    0x4(%r11),%r8d
  add    $0x1,%ebx
  add    %r10d,%r11d
  movzbl (%rdi,%rax,1),%eax
  movslq %r8d,%r8
  add    %rdi,%r8
  imul   %esi,%eax
  movzbl (%r8),%edx
  add    %edx,%eax
  cltd
  idiv   %ecx
  mov    %al,(%r8)
  cmp    %ebx,%r9d
  jne    L139
L289:
  add    $0x1,%ebp
  add    $0x4,%r12d
  cmp    %ebp,%r15d
  jne    L475
L340:
  mov    -0x14(%rsp),%ebp
  mov    -0x4(%rsp),%r12d
  add    -0x18(%rsp),%r12d
  nopl   (%rax)
L165:
  mov    %r12d,%r11d
  xor    %ebx,%ebx
  test   %r9d,%r9d
  jle    L306
  nopw   0x0(%rax,%rax,1)
L427:
  movslq %r11d,%rax
  lea    -0x4(%r11),%r8d
  add    $0x1,%ebx
  add    %r10d,%r11d
  movzbl (%rdi,%rax,1),%eax
  movslq %r8d,%r8
  add    %rdi,%r8
  imul   %esi,%eax
  movzbl (%r8),%edx
  add    %edx,%eax
  cltd
  idiv   %ecx
  mov    %al,(%r8)
  cmp    %ebx,%r9d
  jne    L427
L306:
  sub    $0x1,%ebp
  sub    $0x4,%r12d
  cmp    $0xffffffff,%ebp
  jne    L165
L42:
  test   %r15d,%r15d
  jle    L242
  mov    %r15d,%r13d
  mov    -0x18(%rsp),%r14d
  mov    -0x8(%rsp),%r12d
  neg    %r13d
  nopl   0x0(%rax)
L372:
  lea    0x0(,%r12,4),%ebp
  mov    %r14d,%r11d
  mov    $0x1,%ebx
  cmp    $0x1,%r9d
  jle    L63
  xchg   %ax,%ax
L373:
  movslq %r11d,%rax
  lea    0x0(%rbp,%r11,1),%r8d
  add    $0x1,%ebx
  add    %r10d,%r11d
  movzbl (%rdi,%rax,1),%eax
  movslq %r8d,%r8
  add    %rdi,%r8
  imul   %esi,%eax
  movzbl (%r8),%edx
  add    %edx,%eax
  cltd
  idiv   %ecx
  mov    %al,(%r8)
  cmp    %ebx,%r9d
  jne    L373
L63:
  add    $0x4,%r14d
  add    $0x40000000,%r12d
  add    $0x1,%r13d
  jne    L372
L242:
  mov    -0x10(%rsp),%ebp
  test   %ebp,%ebp
  js     L494
  mov    -0x18(%rsp),%r12d
  add    -0xc(%rsp),%r12d
  nop
L365:
  mov    %r12d,%r11d
  xor    %ebx,%ebx
  test   %r15d,%r15d
  jle    L148
  nopw   0x0(%rax,%rax,1)
L160:
  mov    %r11d,%r8d
  movslq %r11d,%rax
  add    $0x1,%ebx
  add    $0x4,%r11d
  movzbl (%rdi,%rax,1),%eax
  sub    %r10d,%r8d
  movslq %r8d,%r8
  add    %rdi,%r8
  imul   %esi,%eax
  movzbl (%r8),%edx
  add    %edx,%eax
  cltd
  idiv   %ecx
  mov    %al,(%r8)
  cmp    %ebx,%r15d
  jne    L160
L148:
  sub    $0x1,%ebp
  sub    %r10d,%r12d
  cmp    $0xffffffff,%ebp
  jne    L365
L494:
  addl   $0x1,-0x18(%rsp)
  mov    -0x18(%rsp),%eax
  cmp    $0x3,%eax
  je     L235
  cmp    $0x1,%r15d
  jg     L173
L24:
  mov    -0x14(%rsp),%eax
  test   %eax,%eax
  js     L42
  jmp    L340
L307:
  mov    $0x7,%ecx
  jmp    L161
L167:
  mov    $0x6,%ecx
  jmp    L161
```

assistant: ```c
void fastBlur4(unsigned char *img, int w, int h, int size) {
  int x, y;
  int m = size;
  int divZ = 0;
  int canFastDiv = 0;
  if (size == 1)
    divZ = 1, canFastDiv = 1;
  if (size == 3)
    divZ = 2, canFastDiv = 1;
  if (size == 7)
    divZ = 3, canFastDiv = 1;
  if (size == 15)
    divZ = 4, canFastDiv = 1;
  if (size == 31)
    divZ = 5, canFastDiv = 1;
  if (size == 63)
    divZ = 6, canFastDiv = 1;
  if (size == 127)
    divZ = 7, canFastDiv = 1;
  if (canFastDiv) {
    for (int N = 0; N < 3; ++N) {
      for (x = 1; x < w; x++)
        for (y = 0; y < h; y++)
          img[((x + w * y) << 2) + N] = (m * img[((x - 1 + w * y) << 2) + N] + img[((x + w * y) << 2) + N]) >> divZ;
      for (x = w - 2; x >= 0; x--)
        for (y = 0; y < h; y++)
          img[((x + w * y) << 2) + N] = (m * img[((x + 1 + w * y) << 2) + N] + img[((x + w * y) << 2) + N]) >> divZ;
      for (x = 0; x < w; x++)
        for (y = 1; y < h; y++)
          img[((x + w * y) << 2) + N] = (m * img[((x - w + w * y) << 2) + N] + img[((x + w * y) << 2) + N]) >> divZ;
      for (y = h - 2; y >= 0; y--)
        for (x = 0; x < w; x++)
          img[((x + w * y) << 2) + N] = (m * img[((x + w + w * y) << 2) + N] + img[((x + w * y) << 2) + N]) >> divZ;
    }
    return;
  }
  for (int N = 0; N < 3; ++N) {
    for (x = 1; x < w; x++)
      for (y = 0; y < h; y++)
        img[((x + w * y) << 2) + N] = (m * img[((x - 1 + w * y) << 2) + N] + img[((x + w * y) << 2) + N]) / (m + 1);
    for (x = w - 2; x >= 0; x--)
      for (y = 0; y < h; y++)
        img[((x + w * y) << 2) + N] = (m * img[((x + 1 + w * y) << 2) + N] + img[((x + w * y) << 2) + N]) / (m + 1);
    for (x = 0; x < w; x++)
      for (y = 1; y < h; y++)
        img[((x + w * y) << 2) + N] = (m * img[((x - w + w * y) << 2) + N] + img[((x + w * y) << 2) + N]) / (m + 1);
    for (y = h - 2; y >= 0; y--)
      for (x = 0; x < w; x++)
        img[((x + w * y) << 2) + N] = (m * img[((x + w + w * y) << 2) + N] + img[((x + w * y) << 2) + N]) / (m + 1);
  }
}
```