user: Demonstrate the C code that generates the assembly output below:

```asm
<set_filter_flags>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x18(%rbp)
  movl   $0x0,-0x1c(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  je     L600
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    $0x1,%eax
  jg     L237
L600:
  mov    $0xffffffff,%eax
  jmp    L354
L237:
  lea    -0x18(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  lea    D97(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strtok_r@plt>
  mov    %rax,-0x10(%rbp)
  jmp    L584
L43:
  mov    -0x18(%rbp),%rax
  test   %rax,%rax
  je     L363
  mov    -0x10(%rbp),%rax
  sub    $0x1,%rax
  movb   $0x2c,(%rax)
L363:
  mov    -0x10(%rbp),%rax
  lea    D135(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L440
  orl    $0x1,-0x1c(%rbp)
  jmp    L551
L440:
  mov    -0x10(%rbp),%rax
  lea    D264(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L557
  orl    $0x2,-0x1c(%rbp)
  jmp    L551
L557:
  mov    -0x10(%rbp),%rax
  lea    D53(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L425
  orl    $0x4,-0x1c(%rbp)
  jmp    L551
L425:
  mov    -0x10(%rbp),%rax
  lea    D314(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L491
  orl    $0x8,-0x1c(%rbp)
  jmp    L551
L491:
  mov    -0x10(%rbp),%rax
  lea    D139(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L521
  orl    $0x10,-0x1c(%rbp)
  jmp    L551
L521:
  mov    -0x10(%rbp),%rax
  lea    D184(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L58
  orl    $0x20,-0x1c(%rbp)
  jmp    L551
L58:
  mov    -0x10(%rbp),%rax
  lea    D8(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L582
  orl    $0x2000,-0x1c(%rbp)
  jmp    L551
L582:
  mov    -0x10(%rbp),%rax
  lea    D32(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L199
  orl    $0x4000,-0x1c(%rbp)
  jmp    L551
L199:
  mov    -0x10(%rbp),%rax
  lea    D171(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L40
  orl    $0x4000,-0x1c(%rbp)
  orl    $0x8000,-0x1c(%rbp)
  jmp    L551
L40:
  mov    -0x10(%rbp),%rax
  lea    D246(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L188
  orl    $0x10000,-0x1c(%rbp)
  jmp    L551
L188:
  mov    -0x10(%rbp),%rax
  lea    D256(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L16
  orl    $0x20000,-0x1c(%rbp)
  jmp    L551
L16:
  mov    -0x10(%rbp),%rax
  lea    D64(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L579
  orl    $0x40000,-0x1c(%rbp)
  jmp    L551
L579:
  mov    -0x10(%rbp),%rax
  lea    D103(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L92
  orl    $0x80000,-0x1c(%rbp)
  jmp    L551
L92:
  mov    -0x10(%rbp),%rax
  lea    D168(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L493
  orl    $0x40,-0x1c(%rbp)
  jmp    L551
L493:
  mov    -0x10(%rbp),%rax
  lea    D169(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L564
  mov    -0x10(%rbp),%rax
  lea    D196(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L564
  mov    -0x10(%rbp),%rax
  lea    D273(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L140
  mov    -0x1c(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L140
L564:
  orl    $0x40,-0x1c(%rbp)
  orl    $0x80,-0x1c(%rbp)
  jmp    L551
L140:
  mov    -0x10(%rbp),%rax
  lea    D16(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L215
  mov    -0x10(%rbp),%rax
  lea    D18(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L215
  mov    -0x10(%rbp),%rax
  lea    D98(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L204
  mov    -0x1c(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L204
L215:
  orl    $0x40,-0x1c(%rbp)
  orl    $0x100,-0x1c(%rbp)
  jmp    L551
L204:
  mov    -0x10(%rbp),%rax
  lea    D9(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L35
  mov    -0x10(%rbp),%rax
  lea    D293(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L35
  mov    -0x10(%rbp),%rax
  lea    D131(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L26
  mov    -0x1c(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L26
L35:
  orl    $0x40,-0x1c(%rbp)
  orl    $0x200,-0x1c(%rbp)
  jmp    L551
L26:
  mov    -0x10(%rbp),%rax
  lea    D13(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L316
  mov    -0x10(%rbp),%rax
  lea    D177(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L316
  mov    -0x10(%rbp),%rax
  lea    D62(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L485
  mov    -0x1c(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L485
L316:
  orl    $0x40,-0x1c(%rbp)
  orl    $0x400,-0x1c(%rbp)
  jmp    L551
L485:
  mov    -0x10(%rbp),%rax
  lea    D81(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L236
  mov    -0x10(%rbp),%rax
  lea    D159(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L236
  mov    -0x10(%rbp),%rax
  lea    D52(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L305
  mov    -0x1c(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L305
L236:
  orl    $0x40,-0x1c(%rbp)
  orl    $0x800,-0x1c(%rbp)
  jmp    L551
L305:
  mov    -0x10(%rbp),%rax
  lea    D243(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L206
  mov    -0x10(%rbp),%rax
  lea    D239(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L206
  mov    -0x10(%rbp),%rax
  lea    D305(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L551
L206:
  orl    $0x40,-0x1c(%rbp)
  orl    $0x1000,-0x1c(%rbp)
L551:
  lea    -0x18(%rbp),%rax
  mov    %rax,%rdx
  lea    D97(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok_r@plt>
  mov    %rax,-0x10(%rbp)
L584:
  cmpq   $0x0,-0x10(%rbp)
  jne    L43
  mov    -0x1c(%rbp),%eax
L354:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L269
  call   <__stack_chk_fail@plt>
L269:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_tag: D97
type_guessed: string
name: read_data
arguments: data_tag: D135
type_guessed: string
name: read_data
arguments: data_tag: D264
type_guessed: string
name: read_data
arguments: data_tag: D53
type_guessed: string
name: read_data
arguments: data_tag: D314
type_guessed: string
name: read_data
arguments: data_tag: D139
type_guessed: string
name: read_data
arguments: data_tag: D184
type_guessed: string
name: read_data
arguments: data_tag: D8
type_guessed: string
name: read_data
arguments: data_tag: D32
type_guessed: string
name: read_data
arguments: data_tag: D171
type_guessed: string
name: read_data
arguments: data_tag: D246
type_guessed: string
name: read_data
arguments: data_tag: D256
type_guessed: string
name: read_data
arguments: data_tag: D64
type_guessed: string
name: read_data
arguments: data_tag: D103
type_guessed: string
name: read_data
arguments: data_tag: D168
type_guessed: string
name: read_data
arguments: data_tag: D169
type_guessed: string
name: read_data
arguments: data_tag: D196
type_guessed: string
name: read_data
arguments: data_tag: D273
type_guessed: string
name: read_data
arguments: data_tag: D16
type_guessed: string
name: read_data
arguments: data_tag: D18
type_guessed: string
name: read_data
arguments: data_tag: D98
type_guessed: string
name: read_data
arguments: data_tag: D9
type_guessed: string
name: read_data
arguments: data_tag: D293
type_guessed: string
name: read_data
arguments: data_tag: D131
type_guessed: string
name: read_data
arguments: data_tag: D13
type_guessed: string
name: read_data
arguments: data_tag: D177
type_guessed: string
name: read_data
arguments: data_tag: D62
type_guessed: string
name: read_data
arguments: data_tag: D81
type_guessed: string
name: read_data
arguments: data_tag: D159
type_guessed: string
name: read_data
arguments: data_tag: D52
type_guessed: string
name: read_data
arguments: data_tag: D243
type_guessed: string
name: read_data
arguments: data_tag: D239
type_guessed: string
name: read_data
arguments: data_tag: D305
type_guessed: string

tool: D97: ,

tool: D135: @childCount

tool: D264: dc:creator

tool: D53: dc:date

tool: D314: dc:description

tool: D139: dlna

tool: D184: @refID

tool: D8: upnp:album

tool: D32: upnp:albumArtURI

tool: D171: upnp:albumArtURI@dlna:profileID

tool: D246: upnp:artist

tool: D256: upnp:genre

tool: D64: upnp:originalTrackNumber

tool: D103: upnp:searchClass

tool: D168: res

tool: D169: res@bitrate

tool: D196: @bitrate

tool: D273: bitrate

tool: D16: res@duration

tool: D18: @duration

tool: D98: duration

tool: D9: res@nrAudioChannels

tool: D293: @nrAudioChannels

tool: D131: nrAudioChannels

tool: D13: res@resolution

tool: D177: @resolution

tool: D62: resolution

tool: D81: res@sampleFrequency

tool: D159: @sampleFrequency

tool: D52: sampleFrequency

tool: D243: res@size

tool: D239: @size

tool: D305: size

assistant: ```c
u_int32_t set_filter_flags(char *filter) {
  char *item, *saveptr = NULL;
  u_int32_t flags = 0;
  if (!filter || (strlen(filter) <= 1))
    return 0xFFFFFFFF;
  item = strtok_r(filter, ",", &saveptr);
  while (item != NULL) {
    if (saveptr)
      *(item - 1) = ',';
    if (strcmp(item, "@childCount") == 0) {
      flags |= 0x00000001;
    } else if (strcmp(item, "dc:creator") == 0) {
      flags |= 0x00000002;
    } else if (strcmp(item, "dc:date") == 0) {
      flags |= 0x00000004;
    } else if (strcmp(item, "dc:description") == 0) {
      flags |= 0x00000008;
    } else if (strcmp(item, "dlna") == 0) {
      flags |= 0x00000010;
    } else if (strcmp(item, "@refID") == 0) {
      flags |= 0x00000020;
    } else if (strcmp(item, "upnp:album") == 0) {
      flags |= 0x00002000;
    } else if (strcmp(item, "upnp:albumArtURI") == 0) {
      flags |= 0x00004000;
    } else if (strcmp(item, "upnp:albumArtURI@dlna:profileID") == 0) {
      flags |= 0x00004000;
      flags |= 0x00008000;
    } else if (strcmp(item, "upnp:artist") == 0) {
      flags |= 0x00010000;
    } else if (strcmp(item, "upnp:genre") == 0) {
      flags |= 0x00020000;
    } else if (strcmp(item, "upnp:originalTrackNumber") == 0) {
      flags |= 0x00040000;
    } else if (strcmp(item, "upnp:searchClass") == 0) {
      flags |= 0x00080000;
    } else if (strcmp(item, "res") == 0) {
      flags |= 0x00000040;
    } else if ((strcmp(item, "res@bitrate") == 0) || (strcmp(item, "@bitrate") == 0) || ((strcmp(item, "bitrate") == 0) && (flags & 0x00000040))) {
      flags |= 0x00000040;
      flags |= 0x00000080;
    } else if ((strcmp(item, "res@duration") == 0) || (strcmp(item, "@duration") == 0) || ((strcmp(item, "duration") == 0) && (flags & 0x00000040))) {
      flags |= 0x00000040;
      flags |= 0x00000100;
    } else if ((strcmp(item, "res@nrAudioChannels") == 0) || (strcmp(item, "@nrAudioChannels") == 0) || ((strcmp(item, "nrAudioChannels") == 0) && (flags & 0x00000040))) {
      flags |= 0x00000040;
      flags |= 0x00000200;
    } else if ((strcmp(item, "res@resolution") == 0) || (strcmp(item, "@resolution") == 0) || ((strcmp(item, "resolution") == 0) && (flags & 0x00000040))) {
      flags |= 0x00000040;
      flags |= 0x00000400;
    } else if ((strcmp(item, "res@sampleFrequency") == 0) || (strcmp(item, "@sampleFrequency") == 0) || ((strcmp(item, "sampleFrequency") == 0) && (flags & 0x00000040))) {
      flags |= 0x00000040;
      flags |= 0x00000800;
    } else if ((strcmp(item, "res@size") == 0) || (strcmp(item, "@size") == 0) || (strcmp(item, "size") == 0)) {
      flags |= 0x00000040;
      flags |= 0x00001000;
    }
    item = strtok_r(NULL, ",", &saveptr);
  }
  return flags;
}
```