////////////////////////////// small_libc.c /////////////////////////////////////
#include "small_libc_conf.h"
#define NULL 0x0
#if _USE_STRCPY_
char *strcpy(char *dst
, const char *src
) { char *dstSave=dst;
int c;
do {
c = *dst++ = *src++;
} while(c);
return dstSave;
}
#endif
#if _USE_STRNCPY_
char *strncpy(char *dst
, const char *src
, int count
) { int c = 1;
char *dstSave = dst;
while(count-- > 0 && c)
c = *dst++ = *src++;
*dst = 0;
return dstSave;
}
#endif
#if _USE_STRCAT_
char *strcat(char *dst
, const char *src
) { int c;
char *dstSave=dst;
while(*dst)
++dst;
do {
c = *dst++ = *src++;
} while(c);
return dstSave;
}
#endif
#if _USE_STRNCAT_
char *strncat(char *dst
, const char *src
, int count
) { int c = 1;
char *dstSave = dst;
while(*dst && --count > 0)
++dst;
while(--count > 0 && c)
c = *dst++ = *src++;
*dst = 0;
return dstSave;
}
#endif
#if _USE_STRCMP_
int strcmp(const char *string1
, const char *string2
) { int diff, c;
for(;;) {
diff = *string1++ - (c = *string2++);
if(diff) return diff;
if(c == 0) return 0;
}
}
#endif
#if _USE_STRNCMP_
int strncmp(const char *string1
, const char *string2
, int count
) { int diff, c;
while(count-- > 0) {
diff = *string1++ - (c = *string2++);
if(diff) return diff;
if(c == 0) return 0;
}
return 0;
}
#endif
#if _USE_STRSTR_
char *strstr(const char *string
, const char *find
) { int i;
for(;;) {
for(i = 0; string[i] == find[i] && find[i]; ++i) ;
if(find[i] == 0) return (char*)string;
if(*string++ == 0) return NULL;
}
}
#endif
#if _USE_STRLEN_
int strlen(const char *string
) { const char *base=string;
while(*string++) ;
return string - base - 1;
}
#endif
#if _USE_MEMCPY_
void *memcpy(void *dst
, const void *src
, unsigned long bytes
) { if(((unsigned long)dst | (unsigned long)src | bytes) & 3) {
unsigned char *Dst = (unsigned char*)dst, *Src = (unsigned char*)src;
while((int)bytes-- > 0)
*Dst++ = *Src++;
} else {
unsigned long *Dst32 = (unsigned long*)dst, *Src32 = (unsigned long*)src;
bytes >>= 2;
while((int)bytes-- > 0)
*Dst32++ = *Src32++;
}
return dst;
}
#endif
#if _USE_MEMMOVE_
void *memmove(void *dst
, const void *src
, unsigned long bytes
) { unsigned char *Dst = (unsigned char*)dst;
unsigned char *Src = (unsigned char*)src;
if(Dst < Src) {
while((int)bytes-- > 0)
*Dst++ = *Src++;
} else {
Dst += bytes;
Src += bytes;
while((int)bytes-- > 0)
*--Dst = *--Src;
}
return dst;
}
#endif
#if _USE_MEMCMP_
int memcmp(const void *cs
, const void *ct
, unsigned long bytes
) { unsigned char *Dst = (unsigned char*)cs;
unsigned char *Src = (unsigned char*)ct;
int diff;
while((int)bytes-- > 0) {
diff = *Dst++ - *Src++;
if(diff) return diff;
}
return 0;
}
#endif
#if _USE_MEMSET_
void *memset(void *dst
, int c
, unsigned long bytes
) { unsigned char *Dst = (unsigned char*)dst;
while((int)bytes-- > 0)
*Dst++ = (unsigned char)c;
return dst;
}
#endif
#if _USE_ABS_
return n>=0 ? n : -n;
}
#endif
#if _USE_RAND_
static unsigned int Rand1=0x1f2bcda3;
Rand1 = 1664525 * Rand1 + 1013904223; //from D.E. Knuth and H.W. Lewis
return Rand1;
}
void srand(unsigned int seed
) { Rand1 = seed;
}
#endif
#if _USE_STRTOL_
long strtol(const char *s
, char **end
, int base
) { int i;
unsigned long ch, value=0, neg=0;
if(s[0] == '-') {
neg = 1;
++s;
}
if(s[0] == '0' && s[1] == 'x') {
base = 16;
s += 2;
}
for(i = 0; i <= 8; ++i) {
ch = *s++;
if('0' <= ch && ch <= '9')
ch -= '0';
else if('A' <= ch && ch <= 'Z')
ch = ch - 'A' + 10;
else if('a' <= ch && ch <= 'z')
ch = ch - 'a' + 10;
else
break;
value = value * base + ch;
}
if(end) *end = (char*)s - 1;
if(neg) value = -(int)value;
return value;
}
#endif
#if _USE_ATOI_
int atoi(const char *s
) { }
#endif
#if _USE_ITOA_
char *itoa(int num
, char *dst
, int base
) { int digit, negate=0, place;
char c, text[20];
if(base == 10 && num < 0) {
num = -num;
negate = 1;
}
text[16] = 0;
for(place = 15; place >= 0; --place) {
digit = (unsigned int)num % (unsigned int)base;
if(num == 0 && place < 15 && base == 10 && negate) {
c = '-';
negate = 0;
} else if(digit < 10)
c = (char)('0' + digit);
else
c = (char)('a' + digit - 10);
text[place] = c;
num = (unsigned int)num / (unsigned int)base;
if(num == 0 && negate == 0)
break;
}
return dst;
}
#endif
#if _USE_ISLOWER_
return (c >= 'a' && c <= 'z');
}
#endif
#if _USE_ISUPPER_
return (c >= 'A' && c <= 'Z');
}
#endif
#if _USE_TOUPPER_
return (c & ~' ');
}
#endif
#if _USE_TOLOWER_
return (c | ' ');
}
#endif
////////////////////////////// small_libc.h /////////////////////////////////////
#ifndef __SMALL_LIBC_H_
#define __SMALL_LIBC_H_
char *strcpy(char *dst
, const char *src
); char *strncpy(char *dst
, const char *src
, int count
); char *strcat(char *dst
, const char *src
); char *strncat(char *dst
, const char *src
, int count
); int strcmp(const char *string1
, const char *string2
); int strncmp(const char *string1
, const char *string2
, int count
); char *strstr(const char *string
, const char *find
); int strlen(const char *string
); void *memcpy(void *dst
, const void *src
, unsigned long bytes
); void *memmove(void *dst
, const void *src
, unsigned long bytes
); int memcmp(const void *cs
, const void *ct
, unsigned long bytes
); void *memset(void *dst
, int c
, unsigned long bytes
); void srand(unsigned int seed
); long strtol(const char *s
, char **end
, int base
); char *itoa(int num
, char *dst
, int base
);
#endif
////////////////////////////// small_libc_conf.h /////////////////////////////////////
#ifndef __SMALL_LIBC_CONF_H__
#define __SMALL_LIBC_CONF_H__
#define _USE_STRCPY_ 1
#define _USE_STRNCPY_ 1
#define _USE_STRNCAT_ 1
#define _USE_STRCMP_ 1
#define _USE_STRNCMP_ 1
#define _USE_STRSTR_ 1
#define _USE_STRLEN_ 1
#define _USE_MEMCPY_ 1
#define _USE_MEMMOVE_ 1
#define _USE_MEMCMP_ 1
#define _USE_MEMSET_ 1
#define _USE_ABS_ 1
#define _USE_RAND_ 1
#define _USE_SRAND_ 1
#define _USE_STRTOL_ 1
#define _USE_ATOI_ 1
#define _USE_ITOA_ 1
#define _USE_ISLOWER_ 1
#define _USE_ISUPPER_ 1
#define _USE_TOUPPER_ 1
#define _USE_TOLOWER_ 1
#endif
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHNtYWxsX2xpYmMuYyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIAojaW5jbHVkZSAic21hbGxfbGliY19jb25mLmgiCiNkZWZpbmUgTlVMTCAgICAgICAgICAgIDB4MAogCiNpZiBfVVNFX1NUUkNQWV8gICAgICAgICAgICAgICAgICAgICAgICAKY2hhciAqc3RyY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKSB7CiAgICAgICAgY2hhciAqZHN0U2F2ZT1kc3Q7CiAgICAgICAgaW50IGM7CiAKICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBjID0gKmRzdCsrID0gKnNyYysrOwogICAgICAgIH0gd2hpbGUoYyk7CiAKICAgICAgICByZXR1cm4gZHN0U2F2ZTsKfQojZW5kaWYKIAojaWYgX1VTRV9TVFJOQ1BZXyAgICAgICAgICAgICAgICAgICAgICAgCmNoYXIgKnN0cm5jcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBjb3VudCkgewogICAgICAgIGludCBjID0gMTsKICAgICAgICBjaGFyICpkc3RTYXZlID0gZHN0OwogCiAgICAgICAgd2hpbGUoY291bnQtLSA+IDAgJiYgYykKICAgICAgICAgICAgICAgIGMgPSAqZHN0KysgPSAqc3JjKys7CiAKICAgICAgICAqZHN0ID0gMDsKICAgICAgICByZXR1cm4gZHN0U2F2ZTsKfQojZW5kaWYKIAogCiNpZiBfVVNFX1NUUkNBVF8gICAgICAgICAgICAgICAgICAgICAgICAKY2hhciAqc3RyY2F0KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKSB7CiAgICAgICAgaW50IGM7CiAgICAgICAgY2hhciAqZHN0U2F2ZT1kc3Q7CiAKICAgICAgICB3aGlsZSgqZHN0KQogICAgICAgICAgICAgICAgKytkc3Q7CiAKICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBjID0gKmRzdCsrID0gKnNyYysrOwogICAgICAgIH0gd2hpbGUoYyk7CiAKICAgICAgICByZXR1cm4gZHN0U2F2ZTsKfQojZW5kaWYKIAogCiNpZiBfVVNFX1NUUk5DQVRfICAgICAgICAgICAgICAgICAgICAgICAKY2hhciAqc3RybmNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgaW50IGNvdW50KSB7CiAgICAgICAgaW50IGMgPSAxOwogICAgICAgIGNoYXIgKmRzdFNhdmUgPSBkc3Q7CiAKICAgICAgICB3aGlsZSgqZHN0ICYmIC0tY291bnQgPiAwKQogICAgICAgICAgICAgICAgKytkc3Q7CiAgICAgICAgd2hpbGUoLS1jb3VudCA+IDAgJiYgYykKICAgICAgICAgICAgICAgIGMgPSAqZHN0KysgPSAqc3JjKys7CiAgICAgICAgKmRzdCA9IDA7CiAgICAgICAgcmV0dXJuIGRzdFNhdmU7Cn0KI2VuZGlmCiAKIAojaWYgX1VTRV9TVFJDTVBfICAgICAgICAgICAgICAgICAgICAgICAgCmludCBzdHJjbXAoY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMikgewogICAgICAgIGludCBkaWZmLCBjOwogICAgICAgIGZvcig7OykgewogICAgICAgICAgICAgICAgZGlmZiA9ICpzdHJpbmcxKysgLSAoYyA9ICpzdHJpbmcyKyspOwogCiAgICAgICAgICAgICAgICBpZihkaWZmKSByZXR1cm4gZGlmZjsKICAgICAgICAgICAgICAgIGlmKGMgPT0gMCkgcmV0dXJuIDA7CiAgICAgICAgfQp9CiNlbmRpZgogCiAKI2lmIF9VU0VfU1RSTkNNUF8gICAgICAgICAgICAgICAgICAgICAgIAppbnQgc3RybmNtcChjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyLCBpbnQgY291bnQpIHsKICAgICAgICBpbnQgZGlmZiwgYzsKICAgICAgICB3aGlsZShjb3VudC0tID4gMCkgewogICAgICAgICAgICAgICAgZGlmZiA9ICpzdHJpbmcxKysgLSAoYyA9ICpzdHJpbmcyKyspOwogCiAgICAgICAgICAgICAgICBpZihkaWZmKSByZXR1cm4gZGlmZjsKICAgICAgICAgICAgICAgIGlmKGMgPT0gMCkgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwp9CiNlbmRpZgogCiAKI2lmIF9VU0VfU1RSU1RSXyAgICAgICAgICAgICAgICAgICAgICAgIApjaGFyICpzdHJzdHIoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpmaW5kKSB7CiAgICAgICAgaW50IGk7CiAgICAgICAgZm9yKDs7KSB7CiAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IHN0cmluZ1tpXSA9PSBmaW5kW2ldICYmIGZpbmRbaV07ICsraSkgOwogCiAgICAgICAgICAgICAgICBpZihmaW5kW2ldID09IDApIHJldHVybiAoY2hhciopc3RyaW5nOwogICAgICAgICAgICAgICAgaWYoKnN0cmluZysrID09IDApIHJldHVybiBOVUxMOwogICAgICAgIH0KfQojZW5kaWYKIAogCiNpZiBfVVNFX1NUUkxFTl8gICAgICAgICAgICAgICAgICAgICAgICAKaW50IHN0cmxlbihjb25zdCBjaGFyICpzdHJpbmcpIHsKICAgICAgICBjb25zdCBjaGFyICpiYXNlPXN0cmluZzsKICAgICAgICB3aGlsZSgqc3RyaW5nKyspIDsKICAgICAgICByZXR1cm4gc3RyaW5nIC0gYmFzZSAtIDE7Cn0KI2VuZGlmCiAKIAojaWYgX1VTRV9NRU1DUFlfICAgICAgICAgICAgICAgICAgICAgICAgCnZvaWQgKm1lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBieXRlcykgewogICAgICAgIGlmKCgodW5zaWduZWQgbG9uZylkc3QgfCAodW5zaWduZWQgbG9uZylzcmMgfCBieXRlcykgJiAzKSB7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpEc3QgPSAodW5zaWduZWQgY2hhciopZHN0LCAqU3JjID0gKHVuc2lnbmVkIGNoYXIqKXNyYzsKICAgICAgICAgICAgICAgIHdoaWxlKChpbnQpYnl0ZXMtLSA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICpEc3QrKyA9ICpTcmMrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqRHN0MzIgPSAodW5zaWduZWQgbG9uZyopZHN0LCAqU3JjMzIgPSAodW5zaWduZWQgbG9uZyopc3JjOwogICAgICAgICAgICAgICAgYnl0ZXMgPj49IDI7CiAgICAgICAgICAgICAgICB3aGlsZSgoaW50KWJ5dGVzLS0gPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAqRHN0MzIrKyA9ICpTcmMzMisrOwogICAgICAgIH0KIAogICAgICAgIHJldHVybiBkc3Q7Cn0KI2VuZGlmCiAKIAojaWYgX1VTRV9NRU1NT1ZFXyAgICAgICAgICAgICAgICAgICAgICAgCnZvaWQgKm1lbW1vdmUodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgYnl0ZXMpIHsKICAgICAgICB1bnNpZ25lZCBjaGFyICpEc3QgPSAodW5zaWduZWQgY2hhciopZHN0OwogICAgICAgIHVuc2lnbmVkIGNoYXIgKlNyYyA9ICh1bnNpZ25lZCBjaGFyKilzcmM7CiAKICAgICAgICBpZihEc3QgPCBTcmMpIHsKICAgICAgICAgICAgICAgIHdoaWxlKChpbnQpYnl0ZXMtLSA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICpEc3QrKyA9ICpTcmMrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgRHN0ICs9IGJ5dGVzOwogICAgICAgICAgICAgICAgU3JjICs9IGJ5dGVzOwogICAgICAgICAgICAgICAgd2hpbGUoKGludClieXRlcy0tID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgKi0tRHN0ID0gKi0tU3JjOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZHN0Owp9CiNlbmRpZgogCiAKI2lmIF9VU0VfTUVNQ01QXyAgICAgICAgICAgICAgICAgICAgICAgIAppbnQgbWVtY21wKGNvbnN0IHZvaWQgKmNzLCBjb25zdCB2b2lkICpjdCwgdW5zaWduZWQgbG9uZyBieXRlcykgewogICAgICAgIHVuc2lnbmVkIGNoYXIgKkRzdCA9ICh1bnNpZ25lZCBjaGFyKiljczsKICAgICAgICB1bnNpZ25lZCBjaGFyICpTcmMgPSAodW5zaWduZWQgY2hhciopY3Q7CiAgICAgICAgaW50IGRpZmY7CiAKICAgICAgICB3aGlsZSgoaW50KWJ5dGVzLS0gPiAwKSB7CiAgICAgICAgICAgICAgICBkaWZmID0gKkRzdCsrIC0gKlNyYysrOwogICAgICAgICAgICAgICAgaWYoZGlmZikgcmV0dXJuIGRpZmY7CiAgICAgICAgfQogCiAgICAgICAgcmV0dXJuIDA7Cn0KI2VuZGlmCiAKIAojaWYgX1VTRV9NRU1TRVRfCnZvaWQgKm1lbXNldCh2b2lkICpkc3QsIGludCBjLCB1bnNpZ25lZCBsb25nIGJ5dGVzKSB7CiAgICAgICAgdW5zaWduZWQgY2hhciAqRHN0ID0gKHVuc2lnbmVkIGNoYXIqKWRzdDsKICAgICAgICB3aGlsZSgoaW50KWJ5dGVzLS0gPiAwKQogICAgICAgICAgICAgICAgKkRzdCsrID0gKHVuc2lnbmVkIGNoYXIpYzsKICAgICAgICByZXR1cm4gZHN0Owp9CiNlbmRpZgogCiAKI2lmIF9VU0VfQUJTXyAgICAgICAgICAgICAgICAgICAgICAgICAgIAppbnQgYWJzKGludCBuKSB7CiAgICAgICAgcmV0dXJuIG4+PTAgPyBuIDogLW47Cn0KI2VuZGlmCiAKIAojaWYgX1VTRV9SQU5EXyAgICAgICAgICAgICAgICAgICAgICAgICAgCnN0YXRpYyB1bnNpZ25lZCBpbnQgUmFuZDE9MHgxZjJiY2RhMzsKaW50IHJhbmQodm9pZCkgewogICAgICAgIFJhbmQxID0gMTY2NDUyNSAqIFJhbmQxICsgMTAxMzkwNDIyMzsgIC8vZnJvbSBELkUuIEtudXRoIGFuZCBILlcuIExld2lzCiAgICAgICAgcmV0dXJuIFJhbmQxOwp9CiAKIAp2b2lkIHNyYW5kKHVuc2lnbmVkIGludCBzZWVkKSB7CiAgICAgICAgUmFuZDEgPSBzZWVkOwp9CiNlbmRpZgogCiAKI2lmIF9VU0VfU1RSVE9MXyAgICAgICAgICAgICAgICAgICAgICAgIApsb25nIHN0cnRvbChjb25zdCBjaGFyICpzLCBjaGFyICoqZW5kLCBpbnQgYmFzZSkgewogICAgICAgIGludCBpOwogICAgICAgIHVuc2lnbmVkIGxvbmcgY2gsIHZhbHVlPTAsIG5lZz0wOwogCiAgICAgICAgaWYoc1swXSA9PSAnLScpIHsKICAgICAgICAgICAgICAgIG5lZyA9IDE7CiAgICAgICAgICAgICAgICArK3M7CiAgICAgICAgfQogCiAgICAgICAgaWYoc1swXSA9PSAnMCcgJiYgc1sxXSA9PSAneCcpIHsKICAgICAgICAgICAgICAgIGJhc2UgPSAxNjsKICAgICAgICAgICAgICAgIHMgKz0gMjsKICAgICAgICB9CiAKICAgICAgICBmb3IoaSA9IDA7IGkgPD0gODsgKytpKSB7CiAgICAgICAgICAgICAgICBjaCA9ICpzKys7CiAgICAgICAgICAgICAgICBpZignMCcgPD0gY2ggJiYgY2ggPD0gJzknKQogICAgICAgICAgICAgICAgICAgICAgICBjaCAtPSAnMCc7CiAgICAgICAgICAgICAgICBlbHNlIGlmKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpCiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gY2ggLSAnQScgKyAxMDsKICAgICAgICAgICAgICAgIGVsc2UgaWYoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykKICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBjaCAtICdhJyArIDEwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiBiYXNlICsgY2g7CiAgICAgICAgfQogCiAgICAgICAgaWYoZW5kKSAqZW5kID0gKGNoYXIqKXMgLSAxOwogICAgICAgIGlmKG5lZykgdmFsdWUgPSAtKGludCl2YWx1ZTsKICAgICAgICByZXR1cm4gdmFsdWU7Cn0KI2VuZGlmCiAKIAojaWYgX1VTRV9BVE9JXyAgICAgICAgICAgICAgICAgICAgICAgICAgCmludCBhdG9pKGNvbnN0IGNoYXIgKnMpIHsKICAgICAgICByZXR1cm4gc3RydG9sKHMsIE5VTEwsIDEwKTsKfQojZW5kaWYKIAogCiNpZiBfVVNFX0lUT0FfICAgICAgICAgICAgICAgICAgICAgICAgICAKY2hhciAqaXRvYShpbnQgbnVtLCBjaGFyICpkc3QsIGludCBiYXNlKSB7CiAgICAgICAgaW50IGRpZ2l0LCBuZWdhdGU9MCwgcGxhY2U7CiAgICAgICAgY2hhciBjLCB0ZXh0WzIwXTsKIAogICAgICAgIGlmKGJhc2UgPT0gMTAgJiYgbnVtIDwgMCkgewogICAgICAgICAgICAgICAgbnVtID0gLW51bTsKICAgICAgICAgICAgICAgIG5lZ2F0ZSA9IDE7CiAgICAgICAgfQogCiAgICAgICAgdGV4dFsxNl0gPSAwOwogCiAgICAgICAgZm9yKHBsYWNlID0gMTU7IHBsYWNlID49IDA7IC0tcGxhY2UpIHsKICAgICAgICAgICAgICAgIGRpZ2l0ID0gKHVuc2lnbmVkIGludCludW0gJSAodW5zaWduZWQgaW50KWJhc2U7CiAKICAgICAgICAgICAgICAgIGlmKG51bSA9PSAwICYmIHBsYWNlIDwgMTUgJiYgYmFzZSA9PSAxMCAmJiBuZWdhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICctJzsKICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRlID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihkaWdpdCA8IDEwKQogICAgICAgICAgICAgICAgICAgICAgICBjID0gKGNoYXIpKCcwJyArIGRpZ2l0KTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChjaGFyKSgnYScgKyBkaWdpdCAtIDEwKTsKICAgICAgICAgICAgICAgIHRleHRbcGxhY2VdID0gYzsKICAgICAgICAgICAgICAgIG51bSA9ICh1bnNpZ25lZCBpbnQpbnVtIC8gKHVuc2lnbmVkIGludCliYXNlOwogICAgICAgICAgICAgICAgaWYobnVtID09IDAgJiYgbmVnYXRlID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHJjcHkoZHN0LCB0ZXh0ICsgcGxhY2UpOwogICAgICAgIHJldHVybiBkc3Q7Cn0KI2VuZGlmCiAKIAojaWYgX1VTRV9JU0xPV0VSXyAgICAgICAgICAgICAgICAgICAgICAgCmludCBpc2xvd2VyKGludCBjKSB7CiAgICAgICAgcmV0dXJuIChjID49ICdhJyAgJiYgIGMgPD0gJ3onKTsKfQojZW5kaWYKIAogCiNpZiBfVVNFX0lTVVBQRVJfICAgICAgICAgICAgICAgICAgICAgICAKaW50IGlzdXBwZXIoaW50IGMpIHsKICAgICAgICByZXR1cm4gKGMgPj0gJ0EnICYmIGMgPD0gJ1onKTsKfQojZW5kaWYKIAogCiNpZiBfVVNFX1RPVVBQRVJfICAgICAgICAgICAgICAgICAgICAgICAKaW50IHRvdXBwZXIoaW50IGMpIHsKICAgICAgICByZXR1cm4gKGMgJiB+JyAnKTsKfQojZW5kaWYKIAogCiNpZiBfVVNFX1RPTE9XRVJfICAgICAgICAgICAgICAgICAgICAgICAKaW50IHRvbG93ZXIoaW50IGMpIHsKICAgICAgICByZXR1cm4gKGMgfCAnICcpOwp9CiNlbmRpZgogCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBzbWFsbF9saWJjLmggLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwojaWZuZGVmIF9fU01BTExfTElCQ19IXwojZGVmaW5lIF9fU01BTExfTElCQ19IXwogCmNoYXIgKnN0cmNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYyk7CmNoYXIgKnN0cm5jcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBjb3VudCk7CmNoYXIgKnN0cmNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYyk7CmNoYXIgKnN0cm5jYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBjb3VudCk7CmludCBzdHJjbXAoY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMik7CmludCBzdHJuY21wKGNvbnN0IGNoYXIgKnN0cmluZzEsIGNvbnN0IGNoYXIgKnN0cmluZzIsIGludCBjb3VudCk7CmNoYXIgKnN0cnN0cihjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmZpbmQpOwppbnQgc3RybGVuKGNvbnN0IGNoYXIgKnN0cmluZyk7CnZvaWQgKm1lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBieXRlcyk7CnZvaWQgKm1lbW1vdmUodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgYnl0ZXMpOwppbnQgbWVtY21wKGNvbnN0IHZvaWQgKmNzLCBjb25zdCB2b2lkICpjdCwgdW5zaWduZWQgbG9uZyBieXRlcyk7CnZvaWQgKm1lbXNldCh2b2lkICpkc3QsIGludCBjLCB1bnNpZ25lZCBsb25nIGJ5dGVzKTsKaW50IGFicyhpbnQgbik7CmludCByYW5kKHZvaWQpOwp2b2lkIHNyYW5kKHVuc2lnbmVkIGludCBzZWVkKTsKbG9uZyBzdHJ0b2woY29uc3QgY2hhciAqcywgY2hhciAqKmVuZCwgaW50IGJhc2UpOwppbnQgYXRvaShjb25zdCBjaGFyICpzKTsKY2hhciAqaXRvYShpbnQgbnVtLCBjaGFyICpkc3QsIGludCBiYXNlKTsKaW50IGlzbG93ZXIoaW50IGMpOwppbnQgaXN1cHBlcihpbnQgYyk7CmludCB0b3VwcGVyKGludCBjKTsKaW50IHRvbG93ZXIoaW50IGMpOwogCiNlbmRpZgogCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBzbWFsbF9saWJjX2NvbmYuaCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiNpZm5kZWYgX19TTUFMTF9MSUJDX0NPTkZfSF9fCiNkZWZpbmUgX19TTUFMTF9MSUJDX0NPTkZfSF9fCiAKI2RlZmluZSBfVVNFX1NUUkNQWV8gICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX1NUUk5DUFlfICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX1NUUk5DQVRfICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX1NUUkNNUF8gICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX1NUUk5DTVBfICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX1NUUlNUUl8gICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX1NUUkxFTl8gICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX01FTUNQWV8gICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX01FTU1PVkVfICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX01FTUNNUF8gICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX01FTVNFVF8gICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX0FCU18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQojZGVmaW5lIF9VU0VfUkFORF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiNkZWZpbmUgX1VTRV9TUkFORF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX1NUUlRPTF8gICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBfVVNFX0FUT0lfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQojZGVmaW5lIF9VU0VfSVRPQV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiNkZWZpbmUgX1VTRV9JU0xPV0VSXyAgICAgICAgICAgICAgICAgICAxCiNkZWZpbmUgX1VTRV9JU1VQUEVSXyAgICAgICAgICAgICAgICAgICAxCiNkZWZpbmUgX1VTRV9UT1VQUEVSXyAgICAgICAgICAgICAgICAgICAxCiNkZWZpbmUgX1VTRV9UT0xPV0VSXyAgICAgICAgICAgICAgICAgICAxCiAKI2VuZGlm