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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x78,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movl   $0x1,-0x70(%rbp)
  movl   $0x1,-0x6c(%rbp)
  movl   $0x0,-0x68(%rbp)
  movl   $0x0,-0x74(%rbp)
  movl   $0x0,-0x54(%rbp)
  movl   $0x0,-0x58(%rbp)
  lea    -0x80(%rbp),%rax
  mov    %rax,%rsi
  lea    D19(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  mov    -0x80(%rbp),%eax
  cltq
  shl    $0x2,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x80(%rbp),%eax
  cltq
  shl    $0x3,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x28(%rbp)
  mov    -0x80(%rbp),%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %edx,%eax
  sar    %eax
  cltq
  shl    $0x2,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x38(%rbp)
  mov    -0x80(%rbp),%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %edx,%eax
  sar    %eax
  cltq
  shl    $0x2,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x40(%rbp)
  lea    -0x7c(%rbp),%rax
  mov    %rax,%rsi
  lea    D19(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  movl   $0x0,-0x74(%rbp)
  jmp    L41
L43:
  mov    -0x74(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  lea    (%rdx,%rax,1),%rbx
  mov    $0x8,%edi
  call   <malloc@plt>
  mov    %rax,(%rbx)
  mov    -0x7c(%rbp),%ecx
  mov    -0x80(%rbp),%eax
  sub    $0x1,%eax
  sub    -0x74(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  movslq %ecx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %ecx,%edi
  sar    $0x1f,%edi
  sub    %edi,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  mov    %edx,(%rsi)
  mov    -0x7c(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x7c(%rbp)
  addl   $0x1,-0x74(%rbp)
L41:
  mov    -0x80(%rbp),%eax
  cmp    %eax,-0x74(%rbp)
  jl     L43
  movl   $0x0,-0x74(%rbp)
  jmp    L181
L183:
  movl   $0x1,-0x6c(%rbp)
  mov    -0x74(%rbp),%eax
  mov    %eax,-0x54(%rbp)
  addl   $0x1,-0x74(%rbp)
  jmp    L176
L229:
  addl   $0x1,-0x6c(%rbp)
  mov    -0x74(%rbp),%eax
  add    $0x1,%eax
  mov    -0x80(%rbp),%ecx
  cltd
  idiv   %ecx
  mov    %edx,-0x74(%rbp)
L176:
  mov    -0x54(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x74(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x30(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jne    L277
  mov    -0x74(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jne    L229
L277:
  mov    -0x6c(%rbp),%eax
  cmp    -0x70(%rbp),%eax
  jle    L12
  movl   $0x1,-0x68(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x54(%rbp),%edx
  mov    %edx,(%rax)
  cmpl   $0x0,-0x74(%rbp)
  je     L65
  mov    -0x74(%rbp),%eax
  sub    $0x1,%eax
  jmp    L94
L65:
  mov    -0x80(%rbp),%eax
  sub    $0x1,%eax
L94:
  mov    -0x28(%rbp),%rdx
  mov    (%rdx),%rdx
  add    $0x4,%rdx
  mov    %eax,(%rdx)
  mov    -0x6c(%rbp),%eax
  mov    %eax,-0x70(%rbp)
  jmp    L275
L12:
  mov    -0x6c(%rbp),%eax
  cmp    -0x70(%rbp),%eax
  jne    L275
  mov    -0x68(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    -0x54(%rbp),%edx
  mov    %edx,(%rax)
  cmpl   $0x0,-0x74(%rbp)
  je     L241
  mov    -0x74(%rbp),%eax
  sub    $0x1,%eax
  jmp    L72
L241:
  mov    -0x80(%rbp),%eax
  sub    $0x1,%eax
L72:
  mov    -0x68(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x28(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rdx),%rdx
  add    $0x4,%rdx
  mov    %eax,(%rdx)
  addl   $0x1,-0x68(%rbp)
L275:
  mov    -0x54(%rbp),%edx
  mov    -0x6c(%rbp),%eax
  add    %edx,%eax
  sub    $0x1,%eax
  mov    %eax,-0x74(%rbp)
  addl   $0x1,-0x74(%rbp)
L181:
  mov    -0x80(%rbp),%eax
  cmp    %eax,-0x74(%rbp)
  jl     L183
  mov    -0x68(%rbp),%eax
  mov    %eax,-0x64(%rbp)
  movl   $0x1,-0x60(%rbp)
  movl   $0x0,-0x5c(%rbp)
  movl   $0x0,-0x74(%rbp)
  jmp    L182
L288:
  mov    -0x74(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0x74(%rbp),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x74(%rbp)
L182:
  mov    -0x74(%rbp),%eax
  cmp    -0x64(%rbp),%eax
  jl     L288
  movl   $0x1,-0x74(%rbp)
  jmp    L149
L126:
  movl   $0x1,-0x58(%rbp)
  jmp    L244
L8:
  mov    -0x5c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    $0xa,%edx
  sub    %eax,%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x50(%rbp),%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  sub    %eax,%edx
  mov    %edx,-0x50(%rbp)
  mov    -0x5c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x74(%rbp),%eax
  add    %edx,%eax
  mov    -0x80(%rbp),%ecx
  cltd
  idiv   %ecx
  mov    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x50(%rbp),%eax
  add    %eax,%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x4c(%rbp),%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  sub    %eax,%edx
  mov    %edx,-0x4c(%rbp)
  mov    -0x58(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    $0xa,%edx
  sub    %eax,%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x48(%rbp),%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  sub    %eax,%edx
  mov    %edx,-0x48(%rbp)
  mov    -0x58(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x74(%rbp),%eax
  add    %edx,%eax
  mov    -0x80(%rbp),%ecx
  cltd
  idiv   %ecx
  mov    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x48(%rbp),%eax
  add    %eax,%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x44(%rbp),%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  sub    %eax,%edx
  mov    %edx,-0x44(%rbp)
  mov    -0x44(%rbp),%eax
  cmp    -0x4c(%rbp),%eax
  jge    L272
  mov    -0x58(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,(%rax)
  movl   $0x1,-0x60(%rbp)
  mov    -0x58(%rbp),%eax
  mov    %eax,-0x5c(%rbp)
  jmp    L93
L272:
  mov    -0x44(%rbp),%eax
  cmp    -0x4c(%rbp),%eax
  jne    L93
  mov    -0x60(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rax,%rdx
  mov    -0x58(%rbp),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x60(%rbp)
L93:
  addl   $0x1,-0x58(%rbp)
L244:
  mov    -0x58(%rbp),%eax
  cmp    -0x64(%rbp),%eax
  jl     L8
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x60(%rbp),%eax
  mov    %eax,-0x64(%rbp)
  addl   $0x1,-0x74(%rbp)
L149:
  mov    -0x80(%rbp),%eax
  cmp    %eax,-0x74(%rbp)
  jge    L293
  cmpl   $0x1,-0x64(%rbp)
  jne    L126
L293:
  movl   $0x0,-0x78(%rbp)
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    $0xa,%edx
  sub    %eax,%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x50(%rbp),%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  sub    %eax,%edx
  mov    %edx,-0x50(%rbp)
  movl   $0x0,-0x74(%rbp)
  jmp    L45
L60:
  mov    -0x78(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,-0x78(%rbp)
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    (%rax),%edx
  mov    -0x74(%rbp),%eax
  add    %edx,%eax
  mov    -0x80(%rbp),%ecx
  cltd
  idiv   %ecx
  mov    %edx,-0x58(%rbp)
  mov    -0x58(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x50(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  movslq %ecx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %ecx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  add    %edx,-0x78(%rbp)
  addl   $0x1,-0x74(%rbp)
L45:
  mov    -0x80(%rbp),%eax
  cmp    %eax,-0x74(%rbp)
  jl     L60
  movl   $0x0,-0x74(%rbp)
  jmp    L9
L10:
  mov    $0x30,%edi
  call   <putchar@plt>
  addl   $0x1,-0x74(%rbp)
L9:
  mov    -0x74(%rbp),%eax
  cmp    -0x70(%rbp),%eax
  jl     L10
  mov    -0x78(%rbp),%eax
  mov    %eax,%esi
  lea    D17(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x74(%rbp)
  jmp    L106
L246:
  mov    -0x74(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <free@plt>
  addl   $0x1,-0x74(%rbp)
L106:
  mov    -0x80(%rbp),%eax
  cmp    %eax,-0x74(%rbp)
  jl     L246
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    $0x0,%eax
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L85
  call   <__stack_chk_fail@plt>
L85:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D19
type_guessed: string
name: parse_data
arguments: label: D17
type_guessed: string

tool: D19: %d

tool: D17: %d


assistant: ```c
int main() {
  int n, entrada;
  int tamclustermax = 1, tamclusteratual = 1, nclusters = 0;
  int candidatosvelho, candidatosnovo, rotmelhor, rotcand, melhor;
  int digposimelhor, digposicand;
  int *clustersvelho, *clustersnovo;
  int *numero, **clusters;
  int resposta;
  int *tmp;
  int i = 0, inicio = 0, j = 0;
  scanf("%d", &n);
  numero = (int *)malloc(n * sizeof(int));
  clusters = (int **)malloc(n * sizeof(int *));
  clustersvelho = (int *)malloc(n / 2 * sizeof(int));
  clustersnovo = (int *)malloc(n / 2 * sizeof(int));
  scanf("%d", &entrada);
  for (i = 0; i < n; i++) {
    clusters[i] = (int *)malloc(2 * sizeof(int));
    numero[n - 1 - i] = entrada % 10;
    entrada = entrada / 10;
  }
  if (0) {
    for (i = 0; i < n; i++)
      printf("%d ", numero[i]);
    printf("\n");
  }
  for (i = 0; i < n; i++) {
    tamclusteratual = 1;
    inicio = i;
    i++;
    while (numero[inicio] == numero[i] && i != inicio) {
      tamclusteratual++;
      i = (i + 1) % n;
    }
    if (tamclusteratual > tamclustermax) {
      nclusters = 1;
      clusters[0][0] = inicio;
      clusters[0][1] = (i ? i - 1 : n - 1);
      tamclustermax = tamclusteratual;
    } else if (tamclusteratual == tamclustermax) {
      clusters[nclusters][0] = inicio;
      clusters[nclusters][1] = (i ? i - 1 : n - 1);
      nclusters++;
    }
    i = inicio + tamclusteratual - 1;
  }
  if (0) {
    for (i = 0; i < nclusters; i++)
      printf("%d %d\n", clusters[i][0], clusters[i][1]);
  }
  candidatosvelho = nclusters;
  candidatosnovo = 1;
  melhor = 0;
  for (i = 0; i < candidatosvelho; i++)
    clustersvelho[i] = i;
  i = 1;
  while (i < n && candidatosvelho != 1) {
    for (j = 1; j < candidatosvelho; j++) {
      rotmelhor = (10 - numero[clusters[clustersvelho[melhor]][1]]) % 10;
      digposimelhor = (numero[(clusters[clustersvelho[melhor]][1] + i) % n] + rotmelhor) % 10;
      rotcand = (10 - numero[clusters[clustersvelho[j]][1]]) % 10;
      digposicand = (numero[(clusters[clustersvelho[j]][1] + i) % n] + rotcand) % 10;
      if (0) {
        printf("melhor = %d e candidato =  %d\n", melhor, j);
        printf("deslocamento = %d \n", i);
        printf("teste = %d x %d\n\n", digposicand, digposimelhor);
      }
      if (digposicand < digposimelhor) {
        clustersnovo[0] = clustersvelho[j];
        candidatosnovo = 1;
        melhor = j;
      } else if (digposicand == digposimelhor) {
        clustersnovo[candidatosnovo] = j;
        candidatosnovo++;
      }
    }
    tmp = clustersvelho;
    clustersvelho = clustersnovo;
    clustersnovo = tmp;
    candidatosvelho = candidatosnovo;
    if (0) {
      printf("candidatos velho = %d\n", candidatosvelho);
    }
    i++;
  }
  if (0) {
    printf("melhor = %d\n", clustersvelho[0]);
  }
  resposta = 0;
  rotmelhor = (10 - numero[clusters[clustersvelho[0]][1]]) % 10;
  for (i = 0; i < n; i++) {
    resposta *= 10;
    j = (clusters[clustersvelho[0]][0] + i) % n;
    resposta += (numero[j] + rotmelhor) % 10;
  }
  for (i = 0; i < tamclustermax; i++)
    printf("0");
  printf("%d\n", resposta);
  for (i = 0; i < n; i++)
    free(clusters[i]);
  free(clusters);
  free(numero);
  free(clustersvelho);
  free(clustersnovo);
  return 0;
}
```