user: Translate the below assembly code into C programming language:

```asm
<unlzss>:
  endbr64
  push   %r15
  push   %r14
  mov    %esi,%r14d
  push   %r13
  push   %r12
  mov    %rdi,%r12
  mov    %edx,%edi
  push   %rbp
  lea    0x1(%r12),%rbp
  push   %rbx
  mov    %edx,%ebx
  sub    $0x28,%rsp
  call   <get_word@plt>
  lea    0x14(%rbx),%edi
  mov    %eax,0x18(%rsp)
  lea    0x3(%rbx),%eax
  mov    %eax,0x1c(%rsp)
  lea    0x15(%rbx),%eax
  mov    %eax,0x14(%rsp)
  call   <get_byte@plt>
  mov    %al,(%r12)
L52:
  mov    %r14d,%edi
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    %eax,%r15d
  mov    $0x1f,%eax
  bt     %eax,%r15d
  lea    -0x1(%rax),%r13d
  jb     L337
  cs nopw 0x0(%rax,%rax,1)
L478:
  cmp    $0xffffffff,%r13d
  je     L399
  bt     %r13d,%r15d
  lea    -0x2(%rax),%r12d
  jae    L398
  cmp    $0xffffffff,%r12d
  je     L68
  lea    -0x3(%rax),%ebx
L113:
  mov    %r15d,%esi
  mov    %r12d,%ecx
  sar    %cl,%esi
  and    $0x1,%esi
  mov    %esi,%r13d
  jne    L443
  mov    $0x1,%r9d
  jmp    L234
  nopl   (%rax)
L36:
  bt     %r12d,%r15d
  jb     L188
L234:
  mov    %r9d,%ebx
  lea    -0x1(%r12),%ecx
  add    %r9d,%r9d
  test   %r12d,%r12d
  je     L322
  mov    %r15d,%eax
  add    %r13d,%ebx
  sub    $0x2,%r12d
  sar    %cl,%eax
  test   $0x1,%al
  cmovne %ebx,%r13d
  cmp    $0xffffffff,%r12d
  jne    L36
  mov    %r14d,%edi
  mov    %r9d,0x4(%rsp)
  mov    $0x1f,%r12d
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    0x4(%rsp),%r9d
  mov    %eax,%r15d
  bt     %r12d,%r15d
  jae    L234
L188:
  add    %r9d,%r13d
  cmp    $0x10,%r13d
  je     L121
  lea    -0x1(%r12),%ebx
L443:
  mov    0x1c(%rsp),%eax
  lea    0x0(%r13,%rax,1),%edi
  call   <get_byte@plt>
  mov    0x18(%rsp),%esi
  mov    %r13d,%ecx
L78:
  sar    %cl,%esi
  mov    %eax,%ecx
  or     $0x1,%ch
  and    $0x1,%esi
  cmove  %eax,%ecx
  mov    %ecx,%r12d
  cmp    $0xffffffff,%ebx
  je     L230
  lea    -0x1(%rbx),%eax
L275:
  mov    %r15d,%esi
  mov    %ebx,%ecx
  movslq %r12d,%rdx
  mov    %rbp,%r13
  sar    %cl,%esi
  mov    %rdx,0x8(%rsp)
  sub    %rdx,%r13
  and    $0x1,%esi
  jne    L321
  mov    $0x1,%r12d
  jmp    L267
L425:
  lea    -0x1(%rbx),%eax
L112:
  bt     %ebx,%r15d
  jb     L103
L267:
  mov    %r12d,%r11d
  lea    -0x1(%rbx),%ecx
  add    %r12d,%r12d
  test   %ebx,%ebx
  je     L202
  mov    %r15d,%eax
  sub    $0x2,%ebx
  sar    %cl,%eax
  mov    %eax,%ecx
  lea    (%rsi,%r11,1),%eax
  and    $0x1,%ecx
  cmovne %eax,%esi
  cmp    $0xffffffff,%ebx
  jne    L425
  mov    %r14d,%edi
  mov    %esi,0x4(%rsp)
  mov    $0x1f,%ebx
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    0x4(%rsp),%esi
  mov    %eax,%r15d
  mov    $0x1e,%eax
  bt     %ebx,%r15d
  jae    L267
L103:
  add    %r12d,%esi
  mov    %esi,%edi
  add    $0x1,%edi
  js     L228
  mov    0x8(%rsp),%rdx
  mov    %edi,%r10d
  lea    -0x1(%rdx),%rcx
  cmp    $0xe,%rcx
  jbe    L64
  cmp    $0x6,%edi
  jbe    L64
  add    $0x2,%esi
  cmp    $0xe,%edi
  jbe    L153
  mov    %esi,%r11d
  xor    %ecx,%ecx
  shr    $0x4,%r11d
  shl    $0x4,%r11
L54:
  movdqu 0x0(%r13,%rcx,1),%xmm0
  movups %xmm0,0x0(%rbp,%rcx,1)
  add    $0x10,%rcx
  cmp    %rcx,%r11
  jne    L54
  mov    %esi,%ebx
  and    $0xfffffff0,%ebx
  mov    %ebx,%r11d
  sub    %ebx,%edi
  lea    0x0(%rbp,%r11,1),%rcx
  add    %r11,%r13
  cmp    %esi,%ebx
  je     L170
  mov    %r10d,%esi
  sub    %ebx,%esi
  lea    0x1(%rsi),%ebx
  cmp    $0x6,%esi
  jbe    L452
L21:
  mov    %r11,%rsi
  sub    0x8(%rsp),%rsi
  mov    0x0(%rbp,%rsi,1),%rsi
  mov    %rsi,0x0(%rbp,%r11,1)
  mov    %ebx,%esi
  and    $0xfffffff8,%esi
  mov    %esi,%r11d
  sub    %esi,%edi
  add    %r11,%rcx
  add    %r11,%r13
  cmp    %esi,%ebx
  je     L170
L452:
  movzbl 0x0(%r13),%esi
  mov    %sil,(%rcx)
  test   %edi,%edi
  je     L170
  movzbl 0x1(%r13),%esi
  mov    %sil,0x1(%rcx)
  cmp    $0x1,%edi
  je     L170
  movzbl 0x2(%r13),%esi
  mov    %sil,0x2(%rcx)
  cmp    $0x2,%edi
  je     L170
  movzbl 0x3(%r13),%esi
  mov    %sil,0x3(%rcx)
  cmp    $0x3,%edi
  je     L170
  movzbl 0x4(%r13),%esi
  mov    %sil,0x4(%rcx)
  cmp    $0x4,%edi
  je     L170
  movzbl 0x5(%r13),%esi
  mov    %sil,0x5(%rcx)
  cmp    $0x5,%edi
  je     L170
  movzbl 0x6(%r13),%esi
  mov    %sil,0x6(%rcx)
L170:
  lea    0x1(%r10),%ecx
  add    %rcx,%rbp
L228:
  cmp    $0xffffffff,%eax
  je     L52
  bt     %eax,%r15d
  lea    -0x1(%rax),%r13d
  jae    L478
L337:
  mov    0x14(%rsp),%edi
  add    $0x1,%rbp
  lea    0x1(%rdi),%ebx
  call   <get_byte@plt>
  mov    %ebx,0x14(%rsp)
  mov    %al,-0x1(%rbp)
  mov    %r13d,%eax
  jmp    L228
  nopw   0x0(%rax,%rax,1)
L202:
  mov    %r14d,%edi
  mov    %esi,0x4(%rsp)
  add    $0x4,%r14d
  mov    %r11d,0x10(%rsp)
  call   <get_long@plt>
  mov    0x4(%rsp),%esi
  test   %eax,%eax
  mov    %eax,%r15d
  jns    L149
  mov    0x10(%rsp),%r11d
  mov    $0x1e,%ebx
  add    %r11d,%esi
  jmp    L425
  nopw   0x0(%rax,%rax,1)
L322:
  mov    %r14d,%edi
  mov    %r9d,0x4(%rsp)
  add    %r13d,%ebx
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    $0x1e,%r12d
  mov    0x4(%rsp),%r9d
  mov    %eax,%r15d
  mov    %r13d,%eax
  test   %r15d,%r15d
  cmovs  %ebx,%eax
  mov    %eax,%r13d
  jmp    L36
  nopl   0x0(%rax,%rax,1)
L149:
  mov    $0x1d,%eax
  mov    $0x1e,%ebx
  jmp    L112
  nop
L321:
  mov    $0x2,%r10d
  mov    $0x2,%edi
L64:
  xor    %ecx,%ecx
  nopl   (%rax)
L432:
  movzbl 0x0(%r13,%rcx,1),%esi
  mov    %sil,0x0(%rbp,%rcx,1)
  add    $0x1,%rcx
  cmp    %ecx,%edi
  jns    L432
  jmp    L170
  nopl   0x0(%rax,%rax,1)
L398:
  cmp    $0xffffffff,%r12d
  je     L216
  lea    -0x3(%rax),%ebx
L381:
  mov    0x14(%rsp),%r13d
  mov    %r13d,%edi
  add    $0x1,%r13d
  call   <get_byte@plt>
  mov    %r13d,0x14(%rsp)
  mov    %r15d,%esi
  mov    %r12d,%ecx
  jmp    L78
  xchg   %ax,%ax
L399:
  mov    %r14d,%edi
  mov    $0x1d,%ebx
  add    $0x4,%r14d
  mov    $0x1e,%r12d
  call   <get_long@plt>
  mov    %eax,%r15d
  test   %eax,%eax
  js     L113
  jmp    L381
  nopl   0x0(%rax)
L230:
  mov    %r14d,%edi
  mov    $0x1f,%ebx
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    %eax,%r15d
  mov    $0x1e,%eax
  jmp    L275
  cs nopw 0x0(%rax,%rax,1)
L68:
  mov    %r14d,%edi
  mov    $0x1e,%ebx
  add    $0x4,%r14d
  mov    $0x1f,%r12d
  call   <get_long@plt>
  mov    %eax,%r15d
  jmp    L113
L153:
  mov    %esi,%ebx
  mov    %rbp,%rcx
  xor    %r11d,%r11d
  jmp    L21
L121:
  add    $0x28,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L216:
  mov    %r14d,%edi
  mov    $0x1e,%ebx
  add    $0x4,%r14d
  mov    $0x1f,%r12d
  call   <get_long@plt>
  mov    %eax,%r15d
  jmp    L381
```

assistant: ```c
int unlzss(unsigned char *out, int a2, int a3) {
  int a1;
  int d0, d1, d2, d3, d4, d6;
  int common_distances;
  unsigned char *copy_from;
  a1 = a3 + 20;
  d4 = get_word(a3);
  a3 = a3 + 3;
  common_distances = a3;
  *out++ = get_byte(a1++);
loc_cf6e:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cf7a;
loc_cf74:
  *out++ = get_byte(a1++);
loc_cf76:
  d1--;
  if (d1 < 0) {
    goto loc_cf6e;
  }
loc_cf7a:
  if (d0 & (1 << d1)) {
    goto loc_cf74;
  }
  d1--;
  if (d1 < 0) {
    goto loc_cf98;
  }
loc_cf82:
  if (d0 & (1 << d1)) {
    goto loc_cfa4;
  }
  d1--;
  if (d1 < 0) {
    goto loc_cf9e;
  }
loc_cf8a:
  d3 = get_byte(a1);
  a1++;
  if ((d0 & (1 << d1)) == 0) {
    goto loc_cfe6;
  }
  d3 = d3 | 0x100;
  goto loc_cfe6;
loc_cf98:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cf82;
loc_cf9e:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cf8a;
loc_cfa4:
  d1--;
  if (d1 < 0) {
    goto loc_cfcc;
  }
loc_cfa8:
  d2 = 0;
  d6 = 1;
loc_cfac:
  if (d0 & (1 << d1)) {
    goto loc_cfd2;
  }
  d1--;
  if (d1 < 0) {
    goto loc_cfc6;
  }
loc_cfb4:
  if ((d0 & (1 << d1)) == 0) {
    goto loc_cfba;
  }
  d2 = d2 + d6;
loc_cfba:
  d6 = d6 << 1;
  d1--;
  if (d1 >= 0) {
    goto loc_cfac;
  }
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfac;
loc_cfc6:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfb4;
loc_cfcc:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfa8;
loc_cfd2:
  d2 = d2 + d6;
  if (d2 == 16) {
    goto loc_d026;
  }
  d3 = get_byte(common_distances + d2);
  if (d4 & (1 << d2)) {
    d3 = d3 | 0x100;
  }
loc_cfe6:
  d1--;
  if (d1 < 0) {
    goto loc_d00e;
  }
loc_cfea:
  d2 = 0;
  d6 = 1;
loc_cfee:
  if (d0 & (1 << d1)) {
    goto loc_d014;
  }
  d1 = d1 - 1;
  if (d1 < 0) {
    goto loc_d008;
  }
loc_cff6:
  if ((d0 & (1 << d1))) {
    d2 = d2 + d6;
  }
  d6 = d6 << 1;
  d1--;
  if (d1 >= 0) {
    goto loc_cfee;
  }
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfee;
loc_d008:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cff6;
loc_d00e:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfea;
loc_d014:
  d2 = d2 + d6 + 1;
  copy_from = out - d3;
  while (d2 >= 0) {
    *out++ = *copy_from++;
    d2--;
  }
  goto loc_cf76;
loc_d026:
  return 0;
}
```