#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ isdigit(char);
char *strchr(char *, char);
scalar_t__ strncmp(char *, char *, int);
scalar_t__ strstr(char *, char *);
int getdatatype(char *partformat) {
  if (strstr(partformat, "%p"))
    return 7;
  if (strstr(partformat, "%%"))
    return 8;
  char *cp = partformat;
  cp = strchr(cp, '%');
  if (!cp)
    return 0;
  cp++;
  while (isdigit(*cp))
    cp++;
  if (*cp == '.')
    cp++;
  while (isdigit(*cp))
    cp++;
  if (*cp == 'd')
    return 1;
  if (*cp == 'u')
    return 1;
  if (*cp == 'c')
    return 1;
  if (*cp == 'o')
    return 1;
  if (*cp == 'x')
    return 1;
  if (*cp == 'X')
    return 1;
  if (strncmp(cp, "ld", 2) == 0)
    return 2;
  if (strncmp(cp, "lu", 2) == 0)
    return 2;
  if (strncmp(cp, "lo", 2) == 0)
    return 2;
  if (strncmp(cp, "lx", 2) == 0)
    return 2;
  if (strncmp(cp, "lX", 2) == 0)
    return 2;
  if (strncmp(cp, "lld", 3) == 0)
    return 3;
  if (strncmp(cp, "llu", 3) == 0)
    return 3;
  if (strncmp(cp, "llo", 3) == 0)
    return 3;
  if (strncmp(cp, "llx", 3) == 0)
    return 3;
  if (strncmp(cp, "llX", 3) == 0)
    return 3;
  if (strncmp(cp, "e", 1) == 0)
    return 4;
  if (strncmp(cp, "f", 1) == 0)
    return 4;
  if (strncmp(cp, "g", 1) == 0)
    return 4;
  if (strncmp(cp, "le", 2) == 0)
    return 4;
  if (strncmp(cp, "lE", 2) == 0)
    return 4;
  if (strncmp(cp, "lf", 2) == 0)
    return 4;
  if (strncmp(cp, "lg", 2) == 0)
    return 4;
  if (strncmp(cp, "lG", 2) == 0)
    return 4;
  if (strncmp(cp, "lle", 3) == 0)
    return 5;
  if (strncmp(cp, "llE", 3) == 0)
    return 5;
  if (strncmp(cp, "llf", 3) == 0)
    return 5;
  if (strncmp(cp, "llg", 3) == 0)
    return 5;
  if (strncmp(cp, "llG", 3) == 0)
    return 5;
  if (strncmp(cp, "s", 1) == 0)
    return 6;
  if (strncmp(cp, "ls", 2) == 0)
    return 6;
  return 0;
}


x86 assembly (clang, -O0):
<getdatatype>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
lea    0xea9(%rip),%rsi
call   1060 <strstr@plt>
cmp    $0x0,%rax
je     1172 <getdatatype+0x32>
movl   $0x7,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x10(%rbp),%rdi
lea    0xe86(%rip),%rsi
call   1060 <strstr@plt>
cmp    $0x0,%rax
je     1198 <getdatatype+0x58>
movl   $0x8,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x25,%esi
call   1050 <strchr@plt>
mov    %rax,-0x18(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    11c9 <getdatatype+0x89>
movl   $0x0,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     11fc <getdatatype+0xbc>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    11d5 <getdatatype+0x95>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1218 <getdatatype+0xd8>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    121d <getdatatype+0xdd>
mov    -0x18(%rbp),%rax
movsbl (%rax),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     1244 <getdatatype+0x104>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    121d <getdatatype+0xdd>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x64,%eax
jne    1260 <getdatatype+0x120>
movl   $0x1,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x75,%eax
jne    127c <getdatatype+0x13c>
movl   $0x1,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x63,%eax
jne    1298 <getdatatype+0x158>
movl   $0x1,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x6f,%eax
jne    12b4 <getdatatype+0x174>
movl   $0x1,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x78,%eax
jne    12d0 <getdatatype+0x190>
movl   $0x1,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x58,%eax
jne    12ec <getdatatype+0x1ac>
movl   $0x1,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xd10(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    1317 <getdatatype+0x1d7>
movl   $0x2,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xce9(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    1342 <getdatatype+0x202>
movl   $0x2,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xcc2(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    136d <getdatatype+0x22d>
movl   $0x2,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xc9b(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    1398 <getdatatype+0x258>
movl   $0x2,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xc74(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    13c3 <getdatatype+0x283>
movl   $0x2,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xc38(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    13ee <getdatatype+0x2ae>
movl   $0x3,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xc11(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    1419 <getdatatype+0x2d9>
movl   $0x3,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xbea(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    1444 <getdatatype+0x304>
movl   $0x3,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xbc3(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    146f <getdatatype+0x32f>
movl   $0x3,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xb9c(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    149a <getdatatype+0x35a>
movl   $0x3,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xb77(%rip),%rsi
mov    $0x1,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    14c5 <getdatatype+0x385>
movl   $0x4,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xb54(%rip),%rsi
mov    $0x1,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    14f0 <getdatatype+0x3b0>
movl   $0x4,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xb2d(%rip),%rsi
mov    $0x1,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    151b <getdatatype+0x3db>
movl   $0x4,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xaf5(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    1546 <getdatatype+0x406>
movl   $0x4,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xace(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    1571 <getdatatype+0x431>
movl   $0x4,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xaa7(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    159c <getdatatype+0x45c>
movl   $0x4,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xa80(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    15c7 <getdatatype+0x487>
movl   $0x4,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xa59(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    15f2 <getdatatype+0x4b2>
movl   $0x4,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0xa1d(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    161d <getdatatype+0x4dd>
movl   $0x5,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0x9f6(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    1648 <getdatatype+0x508>
movl   $0x5,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0x9cf(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    1673 <getdatatype+0x533>
movl   $0x5,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0x9a8(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    169e <getdatatype+0x55e>
movl   $0x5,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0x981(%rip),%rsi
mov    $0x3,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    16c9 <getdatatype+0x589>
movl   $0x5,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0x95b(%rip),%rsi
mov    $0x1,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    16f4 <getdatatype+0x5b4>
movl   $0x6,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
mov    -0x18(%rbp),%rdi
lea    0x92f(%rip),%rsi
mov    $0x2,%edx
call   1030 <strncmp@plt>
cmp    $0x0,%rax
jne    171f <getdatatype+0x5df>
movl   $0x6,-0x4(%rbp)
jmp    1726 <getdatatype+0x5e6>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<getdatatype>:
push   %rbp
push   %rbx
push   %rax
mov    %rdi,%rbx
lea    0xeb3(%rip),%rsi
call   1060 <strstr@plt>
mov    $0x7,%ebp
test   %rax,%rax
jne    150f <getdatatype+0x3cf>
lea    0xe9c(%rip),%rsi
mov    %rbx,%rdi
call   1060 <strstr@plt>
mov    $0x8,%ebp
test   %rax,%rax
jne    150f <getdatatype+0x3cf>
mov    %rbx,%rdi
mov    $0x25,%esi
call   1050 <strchr@plt>
test   %rax,%rax
je     150d <getdatatype+0x3cd>
mov    %rax,%rbp
add    $0x1,%rbp
nopw   0x0(%rax,%rax,1)
movsbl 0x0(%rbp),%edi
call   1040 <isdigit@plt>
add    $0x1,%rbp
test   %rax,%rax
jne    11a0 <getdatatype+0x60>
cmpb   $0x2e,-0x1(%rbp)
lea    -0x1(%rbp),%rbx
cmove  %rbp,%rbx
add    $0xffffffffffffffff,%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsbl 0x1(%rbx),%edi
add    $0x1,%rbx
call   1040 <isdigit@plt>
test   %rax,%rax
jne    11d0 <getdatatype+0x90>
mov    (%rbx),%al
add    $0xa8,%al
cmp    $0x20,%al
ja     1206 <getdatatype+0xc6>
mov    $0x1,%ebp
movzbl %al,%eax
movabs $0x120801801,%rcx
bt     %rax,%rcx
jb     150f <getdatatype+0x3cf>
lea    0xdfa(%rip),%rsi
mov    $0x2,%ebp
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xddc(%rip),%rsi
mov    $0x2,%ebp
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xdbe(%rip),%rsi
mov    $0x2,%ebp
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xda0(%rip),%rsi
mov    $0x2,%ebp
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xd82(%rip),%rsi
mov    $0x2,%ebp
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xd4f(%rip),%rsi
mov    $0x3,%ebp
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xd31(%rip),%rsi
mov    $0x3,%ebp
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xd13(%rip),%rsi
mov    $0x3,%ebp
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xcf5(%rip),%rsi
mov    $0x3,%ebp
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xcd7(%rip),%rsi
mov    $0x3,%ebp
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xcbb(%rip),%rsi
mov    %rbx,%rdi
mov    $0x1,%edx
call   1030 <strncmp@plt>
mov    $0x4,%ebp
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xca1(%rip),%rsi
mov    %rbx,%rdi
mov    $0x1,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xc88(%rip),%rsi
mov    %rbx,%rdi
mov    $0x1,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xc5e(%rip),%rsi
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xc45(%rip),%rsi
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xc2c(%rip),%rsi
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xc13(%rip),%rsi
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xbfa(%rip),%rsi
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xbcc(%rip),%rsi
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
mov    $0x5,%ebp
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xbae(%rip),%rsi
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xb95(%rip),%rsi
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xb80(%rip),%rsi
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xb6b(%rip),%rsi
mov    %rbx,%rdi
mov    $0x3,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     150f <getdatatype+0x3cf>
lea    0xb57(%rip),%rsi
mov    %rbx,%rdi
mov    $0x1,%edx
call   1030 <strncmp@plt>
test   %rax,%rax
je     1518 <getdatatype+0x3d8>
lea    0xb3d(%rip),%rsi
mov    %rbx,%rdi
mov    $0x2,%edx
call   1030 <strncmp@plt>
xor    %ecx,%ecx
test   %rax,%rax
mov    $0x6,%ebp
cmovne %ecx,%ebp
jmp    150f <getdatatype+0x3cf>
xor    %ebp,%ebp
mov    %ebp,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret
mov    $0x6,%ebp
jmp    150f <getdatatype+0x3cf>

LLVM IR (-O0):
@.str = [3 x i8] c"%p\00"
@.str.1 = [3 x i8] c"%%\00"
@.str.2 = [3 x i8] c"ld\00"
@.str.3 = [3 x i8] c"lu\00"
@.str.4 = [3 x i8] c"lo\00"
@.str.5 = [3 x i8] c"lx\00"
@.str.6 = [3 x i8] c"lX\00"
@.str.7 = [4 x i8] c"lld\00"
@.str.8 = [4 x i8] c"llu\00"
@.str.9 = [4 x i8] c"llo\00"
@.str.10 = [4 x i8] c"llx\00"
@.str.11 = [4 x i8] c"llX\00"
@.str.12 = [2 x i8] c"e\00"
@.str.13 = [2 x i8] c"f\00"
@.str.14 = [2 x i8] c"g\00"
@.str.15 = [3 x i8] c"le\00"
@.str.16 = [3 x i8] c"lE\00"
@.str.17 = [3 x i8] c"lf\00"
@.str.18 = [3 x i8] c"lg\00"
@.str.19 = [3 x i8] c"lG\00"
@.str.20 = [4 x i8] c"lle\00"
@.str.21 = [4 x i8] c"llE\00"
@.str.22 = [4 x i8] c"llf\00"
@.str.23 = [4 x i8] c"llg\00"
@.str.24 = [4 x i8] c"llG\00"
@.str.25 = [2 x i8] c"s\00"
@.str.26 = [3 x i8] c"ls\00"
define i32 @getdatatype(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i8*
store i8* %0, i8** %3
%5 = load i8*, i8** %3
%6 = call i64 @strstr(i8* %5, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0))
%7 = icmp ne i64 %6, 0
br i1 %7, label %8, label %9
8: ; preds = %1
store i32 7, i32* %2
br label %211
9: ; preds = %1
%10 = load i8*, i8** %3
%11 = call i64 @strstr(i8* %10, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i64 0, i64 0))
%12 = icmp ne i64 %11, 0
br i1 %12, label %13, label %14
13: ; preds = %9
store i32 8, i32* %2
br label %211
14: ; preds = %9
%15 = load i8*, i8** %3
store i8* %15, i8** %4
%16 = load i8*, i8** %4
%17 = call i8* @strchr(i8* %16, i8 signext 37)
store i8* %17, i8** %4
%18 = load i8*, i8** %4
%19 = icmp ne i8* %18, null
br i1 %19, label %21, label %20
20: ; preds = %14
store i32 0, i32* %2
br label %211
21: ; preds = %14
%22 = load i8*, i8** %4
%23 = getelementptr inbounds i8, i8* %22, i32 1
store i8* %23, i8** %4
br label %24
24: ; preds = %29, %21
%25 = load i8*, i8** %4
%26 = load i8, i8* %25
%27 = call i64 @isdigit(i8 signext %26)
%28 = icmp ne i64 %27, 0
br i1 %28, label %29, label %32
29: ; preds = %24
%30 = load i8*, i8** %4
%31 = getelementptr inbounds i8, i8* %30, i32 1
store i8* %31, i8** %4
br label %24
32: ; preds = %24
%33 = load i8*, i8** %4
%34 = load i8, i8* %33
%35 = sext i8 %34 to i32
%36 = icmp eq i32 %35, 46
br i1 %36, label %37, label %40
37: ; preds = %32
%38 = load i8*, i8** %4
%39 = getelementptr inbounds i8, i8* %38, i32 1
store i8* %39, i8** %4
br label %40
40: ; preds = %37, %32
br label %41
41: ; preds = %46, %40
%42 = load i8*, i8** %4
%43 = load i8, i8* %42
%44 = call i64 @isdigit(i8 signext %43)
%45 = icmp ne i64 %44, 0
br i1 %45, label %46, label %49
46: ; preds = %41
%47 = load i8*, i8** %4
%48 = getelementptr inbounds i8, i8* %47, i32 1
store i8* %48, i8** %4
br label %41
49: ; preds = %41
%50 = load i8*, i8** %4
%51 = load i8, i8* %50
%52 = sext i8 %51 to i32
%53 = icmp eq i32 %52, 100
br i1 %53, label %54, label %55
54: ; preds = %49
store i32 1, i32* %2
br label %211
55: ; preds = %49
%56 = load i8*, i8** %4
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp eq i32 %58, 117
br i1 %59, label %60, label %61
60: ; preds = %55
store i32 1, i32* %2
br label %211
61: ; preds = %55
%62 = load i8*, i8** %4
%63 = load i8, i8* %62
%64 = sext i8 %63 to i32
%65 = icmp eq i32 %64, 99
br i1 %65, label %66, label %67
66: ; preds = %61
store i32 1, i32* %2
br label %211
67: ; preds = %61
%68 = load i8*, i8** %4
%69 = load i8, i8* %68
%70 = sext i8 %69 to i32
%71 = icmp eq i32 %70, 111
br i1 %71, label %72, label %73
72: ; preds = %67
store i32 1, i32* %2
br label %211
73: ; preds = %67
%74 = load i8*, i8** %4
%75 = load i8, i8* %74
%76 = sext i8 %75 to i32
%77 = icmp eq i32 %76, 120
br i1 %77, label %78, label %79
78: ; preds = %73
store i32 1, i32* %2
br label %211
79: ; preds = %73
%80 = load i8*, i8** %4
%81 = load i8, i8* %80
%82 = sext i8 %81 to i32
%83 = icmp eq i32 %82, 88
br i1 %83, label %84, label %85
84: ; preds = %79
store i32 1, i32* %2
br label %211
85: ; preds = %79
%86 = load i8*, i8** %4
%87 = call i64 @strncmp(i8* %86, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32 2)
%88 = icmp eq i64 %87, 0
br i1 %88, label %89, label %90
89: ; preds = %85
store i32 2, i32* %2
br label %211
90: ; preds = %85
%91 = load i8*, i8** %4
%92 = call i64 @strncmp(i8* %91, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i64 0, i64 0), i32 2)
%93 = icmp eq i64 %92, 0
br i1 %93, label %94, label %95
94: ; preds = %90
store i32 2, i32* %2
br label %211
95: ; preds = %90
%96 = load i8*, i8** %4
%97 = call i64 @strncmp(i8* %96, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i64 0, i64 0), i32 2)
%98 = icmp eq i64 %97, 0
br i1 %98, label %99, label %100
99: ; preds = %95
store i32 2, i32* %2
br label %211
100: ; preds = %95
%101 = load i8*, i8** %4
%102 = call i64 @strncmp(i8* %101, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.5, i64 0, i64 0), i32 2)
%103 = icmp eq i64 %102, 0
br i1 %103, label %104, label %105
104: ; preds = %100
store i32 2, i32* %2
br label %211
105: ; preds = %100
%106 = load i8*, i8** %4
%107 = call i64 @strncmp(i8* %106, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.6, i64 0, i64 0), i32 2)
%108 = icmp eq i64 %107, 0
br i1 %108, label %109, label %110
109: ; preds = %105
store i32 2, i32* %2
br label %211
110: ; preds = %105
%111 = load i8*, i8** %4
%112 = call i64 @strncmp(i8* %111, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0), i32 3)
%113 = icmp eq i64 %112, 0
br i1 %113, label %114, label %115
114: ; preds = %110
store i32 3, i32* %2
br label %211
115: ; preds = %110
%116 = load i8*, i8** %4
%117 = call i64 @strncmp(i8* %116, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.8, i64 0, i64 0), i32 3)
%118 = icmp eq i64 %117, 0
br i1 %118, label %119, label %120
119: ; preds = %115
store i32 3, i32* %2
br label %211
120: ; preds = %115
%121 = load i8*, i8** %4
%122 = call i64 @strncmp(i8* %121, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.9, i64 0, i64 0), i32 3)
%123 = icmp eq i64 %122, 0
br i1 %123, label %124, label %125
124: ; preds = %120
store i32 3, i32* %2
br label %211
125: ; preds = %120
%126 = load i8*, i8** %4
%127 = call i64 @strncmp(i8* %126, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.10, i64 0, i64 0), i32 3)
%128 = icmp eq i64 %127, 0
br i1 %128, label %129, label %130
129: ; preds = %125
store i32 3, i32* %2
br label %211
130: ; preds = %125
%131 = load i8*, i8** %4
%132 = call i64 @strncmp(i8* %131, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i64 0, i64 0), i32 3)
%133 = icmp eq i64 %132, 0
br i1 %133, label %134, label %135
134: ; preds = %130
store i32 3, i32* %2
br label %211
135: ; preds = %130
%136 = load i8*, i8** %4
%137 = call i64 @strncmp(i8* %136, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.12, i64 0, i64 0), i32 1)
%138 = icmp eq i64 %137, 0
br i1 %138, label %139, label %140
139: ; preds = %135
store i32 4, i32* %2
br label %211
140: ; preds = %135
%141 = load i8*, i8** %4
%142 = call i64 @strncmp(i8* %141, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.13, i64 0, i64 0), i32 1)
%143 = icmp eq i64 %142, 0
br i1 %143, label %144, label %145
144: ; preds = %140
store i32 4, i32* %2
br label %211
145: ; preds = %140
%146 = load i8*, i8** %4
%147 = call i64 @strncmp(i8* %146, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i64 0, i64 0), i32 1)
%148 = icmp eq i64 %147, 0
br i1 %148, label %149, label %150
149: ; preds = %145
store i32 4, i32* %2
br label %211
150: ; preds = %145
%151 = load i8*, i8** %4
%152 = call i64 @strncmp(i8* %151, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.15, i64 0, i64 0), i32 2)
%153 = icmp eq i64 %152, 0
br i1 %153, label %154, label %155
154: ; preds = %150
store i32 4, i32* %2
br label %211
155: ; preds = %150
%156 = load i8*, i8** %4
%157 = call i64 @strncmp(i8* %156, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.16, i64 0, i64 0), i32 2)
%158 = icmp eq i64 %157, 0
br i1 %158, label %159, label %160
159: ; preds = %155
store i32 4, i32* %2
br label %211
160: ; preds = %155
%161 = load i8*, i8** %4
%162 = call i64 @strncmp(i8* %161, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.17, i64 0, i64 0), i32 2)
%163 = icmp eq i64 %162, 0
br i1 %163, label %164, label %165
164: ; preds = %160
store i32 4, i32* %2
br label %211
165: ; preds = %160
%166 = load i8*, i8** %4
%167 = call i64 @strncmp(i8* %166, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.18, i64 0, i64 0), i32 2)
%168 = icmp eq i64 %167, 0
br i1 %168, label %169, label %170
169: ; preds = %165
store i32 4, i32* %2
br label %211
170: ; preds = %165
%171 = load i8*, i8** %4
%172 = call i64 @strncmp(i8* %171, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.19, i64 0, i64 0), i32 2)
%173 = icmp eq i64 %172, 0
br i1 %173, label %174, label %175
174: ; preds = %170
store i32 4, i32* %2
br label %211
175: ; preds = %170
%176 = load i8*, i8** %4
%177 = call i64 @strncmp(i8* %176, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.20, i64 0, i64 0), i32 3)
%178 = icmp eq i64 %177, 0
br i1 %178, label %179, label %180
179: ; preds = %175
store i32 5, i32* %2
br label %211
180: ; preds = %175
%181 = load i8*, i8** %4
%182 = call i64 @strncmp(i8* %181, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.21, i64 0, i64 0), i32 3)
%183 = icmp eq i64 %182, 0
br i1 %183, label %184, label %185
184: ; preds = %180
store i32 5, i32* %2
br label %211
185: ; preds = %180
%186 = load i8*, i8** %4
%187 = call i64 @strncmp(i8* %186, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.22, i64 0, i64 0), i32 3)
%188 = icmp eq i64 %187, 0
br i1 %188, label %189, label %190
189: ; preds = %185
store i32 5, i32* %2
br label %211
190: ; preds = %185
%191 = load i8*, i8** %4
%192 = call i64 @strncmp(i8* %191, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.23, i64 0, i64 0), i32 3)
%193 = icmp eq i64 %192, 0
br i1 %193, label %194, label %195
194: ; preds = %190
store i32 5, i32* %2
br label %211
195: ; preds = %190
%196 = load i8*, i8** %4
%197 = call i64 @strncmp(i8* %196, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.24, i64 0, i64 0), i32 3)
%198 = icmp eq i64 %197, 0
br i1 %198, label %199, label %200
199: ; preds = %195
store i32 5, i32* %2
br label %211
200: ; preds = %195
%201 = load i8*, i8** %4
%202 = call i64 @strncmp(i8* %201, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.25, i64 0, i64 0), i32 1)
%203 = icmp eq i64 %202, 0
br i1 %203, label %204, label %205
204: ; preds = %200
store i32 6, i32* %2
br label %211
205: ; preds = %200
%206 = load i8*, i8** %4
%207 = call i64 @strncmp(i8* %206, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.26, i64 0, i64 0), i32 2)
%208 = icmp eq i64 %207, 0
br i1 %208, label %209, label %210
209: ; preds = %205
store i32 6, i32* %2
br label %211
210: ; preds = %205
store i32 0, i32* %2
br label %211
211: ; preds = %210, %209, %204, %199, %194, %189, %184, %179, %174, %169, %164, %159, %154, %149, %144, %139, %134, %129, %124, %119, %114, %109, %104, %99, %94, %89, %84, %78, %72, %66, %60, %54, %20, %13, %8
%212 = load i32, i32* %2
ret i32 %212
}

LLVM IR (-O2):
@.str = [3 x i8] c"%p\00"
@.str.1 = [3 x i8] c"%%\00"
@.str.2 = [3 x i8] c"ld\00"
@.str.3 = [3 x i8] c"lu\00"
@.str.4 = [3 x i8] c"lo\00"
@.str.5 = [3 x i8] c"lx\00"
@.str.6 = [3 x i8] c"lX\00"
@.str.7 = [4 x i8] c"lld\00"
@.str.8 = [4 x i8] c"llu\00"
@.str.9 = [4 x i8] c"llo\00"
@.str.10 = [4 x i8] c"llx\00"
@.str.11 = [4 x i8] c"llX\00"
@.str.12 = [2 x i8] c"e\00"
@.str.13 = [2 x i8] c"f\00"
@.str.14 = [2 x i8] c"g\00"
@.str.15 = [3 x i8] c"le\00"
@.str.16 = [3 x i8] c"lE\00"
@.str.17 = [3 x i8] c"lf\00"
@.str.18 = [3 x i8] c"lg\00"
@.str.19 = [3 x i8] c"lG\00"
@.str.20 = [4 x i8] c"lle\00"
@.str.21 = [4 x i8] c"llE\00"
@.str.22 = [4 x i8] c"llf\00"
@.str.23 = [4 x i8] c"llg\00"
@.str.24 = [4 x i8] c"llG\00"
@.str.25 = [2 x i8] c"s\00"
@.str.26 = [3 x i8] c"ls\00"
define i32 @getdatatype(i8* %0) {
%2 = tail call i64 @strstr(i8* %0, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0))
%3 = icmp eq i64 %2, 0
br i1 %3, label %4, label %105
4: ; preds = %1
%5 = tail call i64 @strstr(i8* %0, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i64 0, i64 0))
%6 = icmp eq i64 %5, 0
br i1 %6, label %7, label %105
7: ; preds = %4
%8 = tail call i8* @strchr(i8* dereferenceable(1) %0, i8 signext 37)
%9 = icmp eq i8* %8, null
br i1 %9, label %105, label %10
10: ; preds = %7, %10
%11 = phi i8* [ %12, %10 ], [ %8, %7 ]
%12 = getelementptr inbounds i8, i8* %11, i64 1
%13 = load i8, i8* %12
%14 = tail call i64 @isdigit(i8 signext %13)
%15 = icmp eq i64 %14, 0
br i1 %15, label %16, label %10
16: ; preds = %10
%17 = load i8, i8* %12
%18 = icmp eq i8 %17, 46
%19 = getelementptr inbounds i8, i8* %11, i64 2
%20 = select i1 %18, i8* %19, i8* %12
br label %21
21: ; preds = %21, %16
%22 = phi i8* [ %20, %16 ], [ %26, %21 ]
%23 = load i8, i8* %22
%24 = tail call i64 @isdigit(i8 signext %23)
%25 = icmp eq i64 %24, 0
%26 = getelementptr inbounds i8, i8* %22, i64 1
br i1 %25, label %27, label %21
27: ; preds = %21
%28 = load i8, i8* %22
switch i8 %28, label %29 [
i8 100, label %105
i8 117, label %105
i8 99, label %105
i8 111, label %105
i8 120, label %105
i8 88, label %105
]
29: ; preds = %27
%30 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i32 2)
%31 = icmp eq i64 %30, 0
br i1 %31, label %105, label %32
32: ; preds = %29
%33 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i64 0, i64 0), i32 2)
%34 = icmp eq i64 %33, 0
br i1 %34, label %105, label %35
35: ; preds = %32
%36 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i64 0, i64 0), i32 2)
%37 = icmp eq i64 %36, 0
br i1 %37, label %105, label %38
38: ; preds = %35
%39 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.5, i64 0, i64 0), i32 2)
%40 = icmp eq i64 %39, 0
br i1 %40, label %105, label %41
41: ; preds = %38
%42 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.6, i64 0, i64 0), i32 2)
%43 = icmp eq i64 %42, 0
br i1 %43, label %105, label %44
44: ; preds = %41
%45 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0), i32 3)
%46 = icmp eq i64 %45, 0
br i1 %46, label %105, label %47
47: ; preds = %44
%48 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.8, i64 0, i64 0), i32 3)
%49 = icmp eq i64 %48, 0
br i1 %49, label %105, label %50
50: ; preds = %47
%51 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.9, i64 0, i64 0), i32 3)
%52 = icmp eq i64 %51, 0
br i1 %52, label %105, label %53
53: ; preds = %50
%54 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.10, i64 0, i64 0), i32 3)
%55 = icmp eq i64 %54, 0
br i1 %55, label %105, label %56
56: ; preds = %53
%57 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i64 0, i64 0), i32 3)
%58 = icmp eq i64 %57, 0
br i1 %58, label %105, label %59
59: ; preds = %56
%60 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.12, i64 0, i64 0), i32 1)
%61 = icmp eq i64 %60, 0
br i1 %61, label %105, label %62
62: ; preds = %59
%63 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.13, i64 0, i64 0), i32 1)
%64 = icmp eq i64 %63, 0
br i1 %64, label %105, label %65
65: ; preds = %62
%66 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i64 0, i64 0), i32 1)
%67 = icmp eq i64 %66, 0
br i1 %67, label %105, label %68
68: ; preds = %65
%69 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.15, i64 0, i64 0), i32 2)
%70 = icmp eq i64 %69, 0
br i1 %70, label %105, label %71
71: ; preds = %68
%72 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.16, i64 0, i64 0), i32 2)
%73 = icmp eq i64 %72, 0
br i1 %73, label %105, label %74
74: ; preds = %71
%75 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.17, i64 0, i64 0), i32 2)
%76 = icmp eq i64 %75, 0
br i1 %76, label %105, label %77
77: ; preds = %74
%78 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.18, i64 0, i64 0), i32 2)
%79 = icmp eq i64 %78, 0
br i1 %79, label %105, label %80
80: ; preds = %77
%81 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.19, i64 0, i64 0), i32 2)
%82 = icmp eq i64 %81, 0
br i1 %82, label %105, label %83
83: ; preds = %80
%84 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.20, i64 0, i64 0), i32 3)
%85 = icmp eq i64 %84, 0
br i1 %85, label %105, label %86
86: ; preds = %83
%87 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.21, i64 0, i64 0), i32 3)
%88 = icmp eq i64 %87, 0
br i1 %88, label %105, label %89
89: ; preds = %86
%90 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.22, i64 0, i64 0), i32 3)
%91 = icmp eq i64 %90, 0
br i1 %91, label %105, label %92
92: ; preds = %89
%93 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.23, i64 0, i64 0), i32 3)
%94 = icmp eq i64 %93, 0
br i1 %94, label %105, label %95
95: ; preds = %92
%96 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.24, i64 0, i64 0), i32 3)
%97 = icmp eq i64 %96, 0
br i1 %97, label %105, label %98
98: ; preds = %95
%99 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.25, i64 0, i64 0), i32 1)
%100 = icmp eq i64 %99, 0
br i1 %100, label %105, label %101
101: ; preds = %98
%102 = tail call i64 @strncmp(i8* %22, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.26, i64 0, i64 0), i32 2)
%103 = icmp eq i64 %102, 0
%104 = select i1 %103, i32 6, i32 0
br label %105
105: ; preds = %7, %27, %27, %27, %27, %27, %27, %29, %32, %35, %38, %41, %44, %47, %50, %53, %56, %59, %62, %65, %68, %71, %74, %77, %80, %83, %86, %89, %92, %95, %98, %101, %4, %1
%106 = phi i32 [ 7, %1 ], [ 8, %4 ], [ 0, %7 ], [ 1, %27 ], [ 1, %27 ], [ 1, %27 ], [ 1, %27 ], [ 1, %27 ], [ 1, %27 ], [ 2, %29 ], [ 2, %32 ], [ 2, %35 ], [ 2, %38 ], [ 2, %41 ], [ 3, %44 ], [ 3, %47 ], [ 3, %50 ], [ 3, %53 ], [ 3, %56 ], [ 4, %59 ], [ 4, %62 ], [ 4, %65 ], [ 4, %68 ], [ 4, %71 ], [ 4, %74 ], [ 4, %77 ], [ 4, %80 ], [ 5, %83 ], [ 5, %86 ], [ 5, %89 ], [ 5, %92 ], [ 5, %95 ], [ 6, %98 ], [ %104, %101 ]
ret i32 %106
}