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

```asm
<yc_poly_emulator>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %al,-0x9(%rbp)
  movl   $0x0,-0x4(%rbp)
  jmp    L162
L33:
  mov    -0x4(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0xa(%rbp)
  movl   $0x0,-0x8(%rbp)
  jmp    L253
L233:
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x34,%eax
  jg     L157
  cmp    $0xffffffeb,%eax
  jge    L14
  cmp    $0xffffffd2,%eax
  je     L38
  cmp    $0xffffffd2,%eax
  jg     L157
  cmp    $0xffffff90,%eax
  je     L248
  cmp    $0xffffffc0,%eax
  je     L7
  jmp    L157
L14:
  add    $0x15,%eax
  cmp    $0x49,%eax
  ja     L157
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D1(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D1(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  addl   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %eax,-0x8(%rbp)
  jmp    L219
  movzbl -0xa(%rbp),%eax
  sub    $0x1,%eax
  mov    %al,-0xa(%rbp)
  addl   $0x1,-0x8(%rbp)
  jmp    L219
  movzbl -0x9(%rbp),%eax
  sub    %al,-0xa(%rbp)
  addl   $0x1,-0x8(%rbp)
  jmp    L219
  movzbl -0x9(%rbp),%eax
  add    %al,-0xa(%rbp)
  addl   $0x1,-0x8(%rbp)
  jmp    L219
  movzbl -0x9(%rbp),%eax
  xor    %al,-0xa(%rbp)
  addl   $0x1,-0x8(%rbp)
  jmp    L219
  addl   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  add    %al,-0xa(%rbp)
  jmp    L219
  addl   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  movzbl -0xa(%rbp),%eax
  xor    %edx,%eax
  mov    %al,-0xa(%rbp)
  jmp    L219
  addl   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  sub    %al,-0xa(%rbp)
  jmp    L219
L7:
  addl   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xc0,%al
  jne    L193
  addl   $0x1,-0x8(%rbp)
  movzbl -0xa(%rbp),%edx
  mov    -0x8(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  and    $0x7,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,%esi
  movzbl -0xa(%rbp),%edx
  mov    -0x8(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  and    $0x7,%eax
  mov    %eax,%ecx
  mov    $0x8,%eax
  sub    %ecx,%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  or     %esi,%eax
  mov    %al,-0xa(%rbp)
  jmp    L219
L193:
  addl   $0x1,-0x8(%rbp)
  movzbl -0xa(%rbp),%edx
  mov    -0x8(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  and    $0x7,%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  mov    %eax,%esi
  movzbl -0xa(%rbp),%edx
  mov    -0x8(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  and    $0x7,%eax
  mov    %eax,%ecx
  mov    $0x8,%eax
  sub    %ecx,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  or     %esi,%eax
  mov    %al,-0xa(%rbp)
  jmp    L219
L38:
  addl   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xc8,%al
  jne    L137
  addl   $0x1,-0x8(%rbp)
  movzbl -0xa(%rbp),%edx
  movzbl -0x9(%rbp),%eax
  and    $0x7,%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  mov    %eax,%esi
  movzbl -0xa(%rbp),%edx
  movzbl -0x9(%rbp),%eax
  and    $0x7,%eax
  mov    %eax,%ecx
  mov    $0x8,%eax
  sub    %ecx,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  or     %esi,%eax
  mov    %al,-0xa(%rbp)
  jmp    L219
L137:
  addl   $0x1,-0x8(%rbp)
  movzbl -0xa(%rbp),%edx
  movzbl -0x9(%rbp),%eax
  and    $0x7,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,%esi
  movzbl -0xa(%rbp),%edx
  movzbl -0x9(%rbp),%eax
  and    $0x7,%eax
  mov    %eax,%ecx
  mov    $0x8,%eax
  sub    %ecx,%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  or     %esi,%eax
  mov    %al,-0xa(%rbp)
  jmp    L219
L157:
  mov    $0x1,%eax
  jmp    L216
L248:
  nop
L219:
  addl   $0x1,-0x8(%rbp)
L253:
  cmpl   $0x2f,-0x8(%rbp)
  jbe    L233
  movzbl -0x9(%rbp),%eax
  sub    $0x1,%eax
  mov    %al,-0x9(%rbp)
  mov    -0x4(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xa(%rbp),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x4(%rbp)
L162:
  mov    -0x4(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jb     L33
  mov    $0x0,%eax
L216:
  pop    %rbp
  ret
```

assistant: ```c
__attribute__((always_)) int yc_poly_emulator(char *decryptor_offset, char *code, unsigned int ecx) {
  unsigned char al;
  unsigned char cl = ecx & 0xff;
  unsigned int j, i;
  for (i = 0; i < ecx; i++) {
    al = code[i];
    for (j = 0; j < 0x30; j++) {
      switch (decryptor_offset[j]) {
      case '\xEB':
        j++;
        j = j + decryptor_offset[j];
        break;
      case '\xFE':
        al--;
        j++;
        break;
      case '\x2A':
        al = al - cl;
        j++;
        break;
      case '\x02':
        al = al + cl;
        j++;
        break;
      case '\x32':
        al = al ^ cl;
        j++;
        break;
        ;
      case '\x04':
        j++;
        al = al + decryptor_offset[j];
        break;
        ;
      case '\x34':
        j++;
        al = al ^ decryptor_offset[j];
        break;
      case '\x2C':
        j++;
        al = al - decryptor_offset[j];
        break;
      case '\xC0':
        j++;
        if (decryptor_offset[j] == '\xC0') {
          j++;
          al = (al << (decryptor_offset[j] % (sizeof(al) << 3))) | (al >> ((sizeof(al) << 3) - (decryptor_offset[j] % (sizeof(al) << 3))));
        } else {
          j++;
          al = (al >> (decryptor_offset[j] % (sizeof(al) << 3))) | (al << ((sizeof(al) << 3) - (decryptor_offset[j] % (sizeof(al) << 3))));
        }
        break;
      case '\xD2':
        j++;
        if (decryptor_offset[j] == '\xC8') {
          j++;
          al = (al >> (cl % (sizeof(al) << 3))) | (al << ((sizeof(al) << 3) - (cl % (sizeof(al) << 3))));
        } else {
          j++;
          al = (al << (cl % (sizeof(al) << 3))) | (al >> ((sizeof(al) << 3) - (cl % (sizeof(al) << 3))));
        }
        break;
      case '\x90':
      case '\xf8':
      case '\xf9':
        break;
      default:;
        return 1;
      }
    }
    cl--;
    code[i] = al;
  }
  return 0;
}
```