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

```asm
<Base64Encode>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %rdi,-0x88(%rbp)
  mov    %rsi,-0x90(%rbp)
  mov    %rdx,-0x98(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movabs $0x4847464544434241,%rax
  movabs $0x504f4e4d4c4b4a49,%rdx
  mov    %rax,-0x50(%rbp)
  mov    %rdx,-0x48(%rbp)
  movabs $0x5857565554535251,%rax
  movabs $0x6665646362615a59,%rdx
  mov    %rax,-0x40(%rbp)
  mov    %rdx,-0x38(%rbp)
  movabs $0x6e6d6c6b6a696867,%rax
  movabs $0x767574737271706f,%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
  movabs $0x333231307a797877,%rax
  movabs $0x2f2b393837363534,%rdx
  mov    %rax,-0x20(%rbp)
  mov    %rdx,-0x18(%rbp)
  movb   $0x0,-0x10(%rbp)
  mov    -0x90(%rbp),%rax
  mov    %rax,-0x60(%rbp)
  movq   $0x0,-0x78(%rbp)
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x58(%rbp)
  cmpq   $0x0,-0x58(%rbp)
  je     L192
  movl   $0x0,-0x7c(%rbp)
  mov    -0x88(%rbp),%rax
  mov    %rax,-0x78(%rbp)
  movq   $0x0,-0x68(%rbp)
  jmp    L63
L197:
  mov    -0x68(%rbp),%rcx
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mov    %rcx,%rax
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  mov    %rax,%rdx
  add    %rdx,%rdx
  add    %rax,%rdx
  mov    %rcx,%rax
  sub    %rdx,%rax
  test   %rax,%rax
  jne    L145
  mov    -0x60(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x7c(%rbp)
  jmp    L128
L145:
  mov    -0x68(%rbp),%rcx
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mov    %rcx,%rax
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  mov    %rax,%rdx
  add    %rdx,%rdx
  add    %rax,%rdx
  mov    %rcx,%rax
  sub    %rdx,%rax
  cmp    $0x1,%rax
  jne    L52
  shll   $0x8,-0x7c(%rbp)
  mov    -0x60(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %eax,-0x7c(%rbp)
  jmp    L128
L52:
  shll   $0x8,-0x7c(%rbp)
  mov    -0x60(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %eax,-0x7c(%rbp)
  mov    -0x7c(%rbp),%eax
  shr    $0x12,%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    %ecx,%edx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
  mov    -0x7c(%rbp),%eax
  shr    $0xc,%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    %ecx,%edx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
  mov    -0x7c(%rbp),%eax
  shr    $0x6,%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    %ecx,%edx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
  mov    -0x7c(%rbp),%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    %ecx,%edx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
L128:
  addq   $0x1,-0x68(%rbp)
L63:
  mov    -0x68(%rbp),%rax
  cmp    -0x58(%rbp),%rax
  jb     L197
  mov    -0x68(%rbp),%rcx
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mov    %rcx,%rax
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  mov    %rax,%rdx
  add    %rdx,%rdx
  add    %rax,%rdx
  mov    %rcx,%rax
  sub    %rdx,%rax
  test   %rax,%rax
  jne    L74
  movq   $0x0,-0x70(%rbp)
  jmp    L129
L74:
  mov    -0x68(%rbp),%rcx
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mov    %rcx,%rax
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  mov    %rax,%rdx
  add    %rdx,%rdx
  add    %rax,%rdx
  mov    %rcx,%rax
  sub    %rdx,%rax
  cmp    $0x1,%rax
  jne    L164
  movq   $0x2,-0x70(%rbp)
  jmp    L129
L164:
  movq   $0x1,-0x70(%rbp)
  jmp    L129
L85:
  shll   $0x8,-0x7c(%rbp)
  addq   $0x1,-0x68(%rbp)
L129:
  mov    -0x68(%rbp),%rcx
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mov    %rcx,%rax
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  mov    %rax,%rdx
  add    %rdx,%rdx
  add    %rax,%rdx
  mov    %rcx,%rax
  sub    %rdx,%rax
  test   %rax,%rax
  jne    L85
  cmpq   $0x0,-0x70(%rbp)
  je     L192
  mov    -0x7c(%rbp),%eax
  shr    $0x12,%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    %ecx,%edx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
  mov    -0x7c(%rbp),%eax
  shr    $0xc,%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    %ecx,%edx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
  cmpq   $0x1,-0x70(%rbp)
  ja     L186
  mov    -0x7c(%rbp),%eax
  shr    $0x6,%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    %ecx,%edx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
L186:
  cmpq   $0x0,-0x70(%rbp)
  jne    L201
  mov    -0x7c(%rbp),%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    %ecx,%edx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
  jmp    L201
L121:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x3d,(%rax)
L201:
  mov    -0x70(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0x70(%rbp)
  test   %rax,%rax
  jne    L121
L192:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x0,(%rax)
  mov    -0x88(%rbp),%rax
  mov    %rax,-0x78(%rbp)
  jmp    L142
L148:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  test   %al,%al
  jns    L142
  mov    $0x0,%eax
  call   <abort@plt>
L142:
  mov    -0x78(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L148
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L7
  call   <__stack_chk_fail@plt>
L7:
  leave
  ret
```

assistant: ```c
void Base64Encode(char *outbuf, const void *inbuf, size_t inlen) {
  const unsigned char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  const unsigned char *inb = inbuf;
  unsigned char *out = NULL;
  size_t numb;
  size_t endcnt;
  size_t i;
  numb = inlen;
  if (numb > 0) {
    unsigned int acc = 0;
    out = (unsigned char *)outbuf;
    for (i = 0; i < numb; i++) {
      if (i % 3 == 0) {
        acc = inb[i];
      } else if (i % 3 == 1) {
        acc <<= 8;
        acc |= inb[i];
      } else {
        acc <<= 8;
        acc |= inb[i];
        *out++ = b64[(acc >> 18) & 0x3f];
        *out++ = b64[(acc >> 12) & 0x3f];
        *out++ = b64[(acc >> 6) & 0x3f];
        *out++ = b64[acc & 0x3f];
      }
    }
    if (i % 3 == 0) {
      endcnt = 0;
    } else if (i % 3 == 1) {
      endcnt = 2;
    } else {
      endcnt = 1;
    }
    for (; i % 3; i++) {
      acc <<= 8;
    }
    if (endcnt > 0) {
      *out++ = b64[(acc >> 18) & 0x3f];
      *out++ = b64[(acc >> 12) & 0x3f];
      if (endcnt < 2)
        *out++ = b64[(acc >> 6) & 0x3f];
      if (endcnt < 1)
        *out++ = b64[acc & 0x3f];
      while (endcnt-- > 0)
        *out++ = '=';
    }
  }
  *out++ = '\0';
  out = (unsigned char *)outbuf;
  while (*out) {
    if (*out++ > 127)
      abort();
  }
}
```