// File: benjibc[P]json-universal-container/./json.h
// Function: JSONDecode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, JSON&, unsigned int)
int JSONDecode(const string & JSONString, JSON & root, 
    unsigned int begin = 0)
{
	if(JSONString.size() < begin)
		throw JSONSyntaxError("JSON string size less than index to begin with");
	const unsigned int rootType = root.m_type;
	int i = begin;
	const int stringSize = JSONString.size();
	for(; i < stringSize; i ++)
		if(!isspace(JSONString[i]))
			break;
	//now find the real beginChar
	char beginChar = JSONString[i];

	//now seek for the terminator
	if(beginChar == '"')//within a string
	{
		int curBegin = i;
		//check if the root JSON is an object; if it is, then also get the value
		i++;
		//seek for the end of the current string
		for(;i < stringSize; i++)
			if(JSONString[i] == '"' && JSONString[i-1] != '\\')
				break;
		string curStr (JSONString, curBegin+1, i-curBegin-1);
		//i++;
		switch(rootType)
		{
		case type_array:
			{
				root.push_back(JSON(curStr));
				break;//return the end of the current position
			}
		case type_obj: //need to identify the key as well as the value
			{
				//it needs to be matched with a value:
                i++;
				JSON curArr;
				for(; i < stringSize; i++)
					if(!isspace(JSONString[i]))
						break;
				if(JSONString[i] != ':') 
					throw JSONSyntaxError("key is not mapped to a value!");
				i++;
				i = JSONDecode(JSONString, curArr, i);
				root.push_back(curStr, curArr);
				break;
			}
		case no_type: //just fill the root element and return
			{
				root = curStr;
				break;
			}
		}
		return i;
	}
	else if(isdigit(beginChar)) //exponential or beginChar
	{
		char * endPtr;
		double result = strtod( & JSONString[i], &endPtr);
		switch(rootType)
		{
		case type_array:
			{
				root.push_back(JSON(result));
				break;//return the end of the current position
			}
		case no_type:
			{
				root = result;
				break;
			}
		}
        unsigned int j = i + (endPtr - & JSONString[i]-1);
        for(; j < JSONString.size(); j++)
            if(!isspace(JSONString[j]))
                break;
		return j;
	}
	else if(beginChar == 't' || beginChar == 'n')
	{
		if(beginChar == 't' && JSONString[i+1] == 'r' && JSONString[i+2] == 'u' && JSONString[i+3] == 'e')
		{
			switch(rootType)
			{
			case type_array:
                {
                    JSON temp;
                    temp(true);
					root.push_back(temp);
					break;//return the end of the current position
                }
			case no_type:
					root(true);
					break;
			}
			return i + 3;
		}
		else if(beginChar == 'n' && JSONString[i+1] == 'u' && JSONString[i+2] == 'l' && JSONString[i+3] == 'l')
		{
			if(rootType == type_array)
			{
				root.push_back(JSON());
			}
			//case no_type:  do nothing, because the array would have been initialized to no type anyways.
			return i + 3;
		}
		else
			throw JSONSyntaxError("It is not true and not null");
	}
	else if(beginChar == 'f') //false
	{
		if(JSONString[i+1] == 'a' && JSONString[i+2] == 'l' && JSONString[i+3] == 's'
			 && JSONString[i+4] == 'e')
		{
			switch(rootType)
			{
			case type_array:
            {
                JSON temp;
                temp(false);
				root.push_back(temp);
				break;//return the end of the current position
            }
			case no_type:
				root(false);
				break;
			}
			return i + 4;
		}
		else
			throw JSONSyntaxError("It is not false");
	}
	else if (beginChar == '{') // it is an object
	{
		//proceed until the end has been reached
		JSON curObject = JSON(JSON::Map_t());
		int curEnd = i;
		while(curEnd <stringSize)
		{
			curEnd++;
			curEnd = JSONDecode(JSONString,  curObject, curEnd);
			curEnd++;
			for(; curEnd < stringSize; curEnd++)
				if(!isspace(JSONString[curEnd]))
					break;
			if(stringSize <= curEnd)
				throw JSONSyntaxError("Cannot find the end of the bracket");
			if(JSONString[curEnd] == '}')// that is the end of it, return
			{
				switch(rootType)
				{
				case type_array:
					root.push_back(curObject);
					break;
				case no_type:
					root = curObject;
					break;
				}
				return curEnd;
			}
			if(JSONString[curEnd] == ',')
				continue;//curEnd++; //increase by one and continue;
		}
		//now we have the content, make sure that the content is root
		throw JSONSyntaxError("End bracket of object is not found");
	}
	else if (beginChar == '[') // it is an array
	{
		//proceed until the end has been reached
		JSON curArray = JSON(JSON::Arr_t());
		int curEnd = i;
		while(curEnd <stringSize)
		{
			curEnd++;
			curEnd = JSONDecode(JSONString,  curArray, curEnd);
			curEnd++;
			for(; curEnd < stringSize; curEnd++)
				if(!isspace(JSONString[curEnd]))
					break;
			if(stringSize <= curEnd)
				throw JSONSyntaxError("Cannot find end bracket for the array");
			if(JSONString[curEnd] == ']')// that is the end of it, return
			{
				switch(rootType)
				{
				case type_array:
					root.push_back(curArray);
					break;
				case no_type:
					root = curArray;
					break;
				}
				return curEnd;
			}
			if(JSONString[curEnd] == ',')
				continue;//curEnd++; //increase by one and continue;
		}
		//if reached here, something funny happened
		throw JSONSyntaxError("End bracket of array is not found");
	}
	else
		throw JSONSyntaxError("none of the cases matched", begin, JSONString);
}

// Assembly:
subq $0x778, %rsp            # imm = 0x778
movq %rdi, 0x768(%rsp)
movq %rsi, 0x760(%rsp)
movl %edx, 0x75c(%rsp)
movq 0x768(%rsp), %rdi
callq 0x3190
movl 0x75c(%rsp), %ecx
cmpq %rcx, %rax
jae 0x3828
movb $0x1, 0x6ff(%rsp)
movl $0x50, %edi
callq 0x3110
movq %rax, 0x190(%rsp)
leaq 0x737(%rsp), %rdi
movq %rdi, 0x198(%rsp)
callq 0x33f0
movq 0x198(%rsp), %rdx
leaq 0xe92f(%rip), %rsi      # 0x12078
leaq 0x738(%rsp), %rdi
callq 0x3340
jmp 0x3758
leaq 0x700(%rsp), %rdi
movq %rdi, 0x188(%rsp)
callq 0x3350
movq 0x190(%rsp), %rdi
movq 0x188(%rsp), %rcx
leaq 0x738(%rsp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x5a10
jmp 0x3791
movq 0x190(%rsp), %rdi
movb $0x0, 0x6ff(%rsp)
leaq 0x16420(%rip), %rsi     # 0x19bc8
leaq 0x2321(%rip), %rdx      # 0x5ad0
callq 0x33c0
jmp 0x504e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x37fd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x700(%rsp), %rdi
callq 0x3150
leaq 0x738(%rsp), %rdi
callq 0x3150
leaq 0x737(%rsp), %rdi
callq 0x32c0
testb $0x1, 0x6ff(%rsp)
jne 0x3816
jmp 0x3823
movq 0x190(%rsp), %rdi
callq 0x31b0
jmp 0x5041
movq 0x760(%rsp), %rax
movl 0x28(%rax), %eax
movl %eax, 0x6f8(%rsp)
movl 0x75c(%rsp), %eax
movl %eax, 0x6f4(%rsp)
movq 0x768(%rsp), %rdi
callq 0x3190
movl %eax, 0x6f0(%rsp)
movl 0x6f4(%rsp), %eax
cmpl 0x6f0(%rsp), %eax
jge 0x38a5
movq 0x768(%rsp), %rdi
movslq 0x6f4(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %edi
callq 0x3040
cmpl $0x0, %eax
jne 0x3890
jmp 0x38a5
jmp 0x3892
movl 0x6f4(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x6f4(%rsp)
jmp 0x385c
movq 0x768(%rsp), %rdi
movslq 0x6f4(%rsp), %rsi
callq 0x32e0
movb (%rax), %al
movb %al, 0x6ef(%rsp)
movsbl 0x6ef(%rsp), %eax
cmpl $0x22, %eax
jne 0x3cdc
movl 0x6f4(%rsp), %eax
movl %eax, 0x6e8(%rsp)
movl 0x6f4(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x6f4(%rsp)
movl 0x6f4(%rsp), %eax
cmpl 0x6f0(%rsp), %eax
jge 0x3959
movq 0x768(%rsp), %rdi
movslq 0x6f4(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x22, %eax
jne 0x3944
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
subl $0x1, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x5c, %eax
je 0x3944
jmp 0x3959
jmp 0x3946
movl 0x6f4(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x6f4(%rsp)
jmp 0x38f3
movq 0x768(%rsp), %rsi
movl 0x6e8(%rsp), %eax
movl %eax, %ecx
incl %ecx
movslq %ecx, %rdx
movl 0x6f4(%rsp), %ecx
notl %eax
addl %ecx, %eax
movslq %eax, %rcx
leaq 0x6c8(%rsp), %rdi
callq 0x3330
movl 0x6f8(%rsp), %eax
movl %eax, 0x184(%rsp)
testl %eax, %eax
je 0x3c91
jmp 0x39a2
movl 0x184(%rsp), %eax
subl $0x2, %eax
je 0x3a55
jmp 0x39b4
movl 0x184(%rsp), %eax
subl $0x3, %eax
jne 0x3caa
jmp 0x39c6
movq 0x760(%rsp), %rax
movq %rax, 0x178(%rsp)
leaq 0x698(%rsp), %rdi
leaq 0x6c8(%rsp), %rsi
callq 0x5c20
jmp 0x39ed
movq 0x178(%rsp), %rdi
leaq 0x698(%rsp), %rsi
callq 0x5b20
jmp 0x3a04
leaq 0x698(%rsp), %rdi
callq 0x5c80
jmp 0x3caa
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x3cca
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x698(%rsp), %rdi
callq 0x5c80
jmp 0x3cca
movl 0x6f4(%rsp), %eax
incl %eax
movl %eax, 0x6f4(%rsp)
leaq 0x668(%rsp), %rdi
callq 0x5890
jmp 0x3a74
jmp 0x3a76
movl 0x6f4(%rsp), %eax
cmpl 0x6f0(%rsp), %eax
jge 0x3abf
movq 0x768(%rsp), %rdi
movslq 0x6f4(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %edi
callq 0x3040
cmpl $0x0, %eax
jne 0x3aaa
jmp 0x3abf
jmp 0x3aac
movl 0x6f4(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x6f4(%rsp)
jmp 0x3a76
movq 0x768(%rsp), %rdi
movslq 0x6f4(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x3a, %eax
je 0x3bfd
movb $0x1, 0x61f(%rsp)
movl $0x50, %edi
callq 0x3110
movq %rax, 0x168(%rsp)
leaq 0x647(%rsp), %rdi
movq %rdi, 0x170(%rsp)
callq 0x33f0
movq 0x170(%rsp), %rdx
leaq 0xe589(%rip), %rsi      # 0x120a7
leaq 0x648(%rsp), %rdi
callq 0x3340
jmp 0x3b2d
leaq 0x620(%rsp), %rdi
movq %rdi, 0x160(%rsp)
callq 0x3350
movq 0x168(%rsp), %rdi
movq 0x160(%rsp), %rcx
leaq 0x648(%rsp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x5a10
jmp 0x3b66
movq 0x168(%rsp), %rdi
movb $0x0, 0x61f(%rsp)
leaq 0x1604b(%rip), %rsi     # 0x19bc8
leaq 0x1f4c(%rip), %rdx      # 0x5ad0
callq 0x33c0
jmp 0x504e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x3bd2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x620(%rsp), %rdi
callq 0x3150
leaq 0x648(%rsp), %rdi
callq 0x3150
leaq 0x647(%rsp), %rdi
callq 0x32c0
testb $0x1, 0x61f(%rsp)
jne 0x3beb
jmp 0x3bf8
movq 0x168(%rsp), %rdi
callq 0x31b0
jmp 0x3c82
movl 0x6f4(%rsp), %eax
incl %eax
movl %eax, 0x6f4(%rsp)
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %edx
leaq 0x668(%rsp), %rsi
callq 0x36d0
movl %eax, 0x15c(%rsp)
jmp 0x3c32
movl 0x15c(%rsp), %eax
movl %eax, 0x6f4(%rsp)
movq 0x760(%rsp), %rdi
leaq 0x6c8(%rsp), %rsi
leaq 0x668(%rsp), %rdx
callq 0x5cf0
jmp 0x3c5f
leaq 0x668(%rsp), %rdi
callq 0x5c80
jmp 0x3caa
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x668(%rsp), %rdi
callq 0x5c80
jmp 0x3cca
movq 0x760(%rsp), %rdi
leaq 0x6c8(%rsp), %rsi
callq 0x5e00
jmp 0x3ca8
jmp 0x3caa
movl 0x6f4(%rsp), %eax
movl %eax, 0x774(%rsp)
leaq 0x6c8(%rsp), %rdi
callq 0x3150
jmp 0x5032
leaq 0x6c8(%rsp), %rdi
callq 0x3150
jmp 0x5041
movsbl 0x6ef(%rsp), %edi
callq 0x3230
cmpl $0x0, %eax
je 0x3eac
movq 0x768(%rsp), %rdi
movslq 0x6f4(%rsp), %rsi
callq 0x32e0
movq %rax, %rdi
leaq 0x610(%rsp), %rsi
callq 0x31c0
movsd %xmm0, 0x608(%rsp)
movl 0x6f8(%rsp), %eax
movl %eax, 0x158(%rsp)
testl %eax, %eax
je 0x3dc4
jmp 0x3d38
movl 0x158(%rsp), %eax
subl $0x3, %eax
jne 0x3dda
jmp 0x3d4a
movq 0x760(%rsp), %rax
movq %rax, 0x148(%rsp)
movsd 0x608(%rsp), %xmm0
leaq 0x5d8(%rsp), %rdi
movq %rdi, 0x150(%rsp)
callq 0x5e50
movq 0x148(%rsp), %rdi
movq 0x150(%rsp), %rsi
callq 0x5b20
jmp 0x3d8f
leaq 0x5d8(%rsp), %rdi
callq 0x5c80
jmp 0x3dda
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x5d8(%rsp), %rdi
callq 0x5c80
jmp 0x5041
movsd 0x608(%rsp), %xmm0
movq 0x760(%rsp), %rdi
callq 0x5e90
movslq 0x6f4(%rsp), %rax
movq %rax, 0x140(%rsp)
movq 0x610(%rsp), %rax
movq %rax, 0x138(%rsp)
movq 0x768(%rsp), %rdi
movslq 0x6f4(%rsp), %rsi
callq 0x32e0
movq 0x138(%rsp), %rcx
movq %rax, %rdx
movq 0x140(%rsp), %rax
subq %rdx, %rcx
subq $0x1, %rcx
addq %rcx, %rax
movl %eax, 0x5d4(%rsp)
movl 0x5d4(%rsp), %eax
movq %rax, 0x130(%rsp)
movq 0x768(%rsp), %rdi
callq 0x3190
movq %rax, %rcx
movq 0x130(%rsp), %rax
cmpq %rcx, %rax
jae 0x3e99
movq 0x768(%rsp), %rdi
movl 0x5d4(%rsp), %eax
movl %eax, %esi
callq 0x32e0
movsbl (%rax), %edi
callq 0x3040
cmpl $0x0, %eax
jne 0x3e84
jmp 0x3e99
jmp 0x3e86
movl 0x5d4(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x5d4(%rsp)
jmp 0x3e33
movl 0x5d4(%rsp), %eax
movl %eax, 0x774(%rsp)
jmp 0x5032
movsbl 0x6ef(%rsp), %eax
cmpl $0x74, %eax
je 0x3eca
movsbl 0x6ef(%rsp), %eax
cmpl $0x6e, %eax
jne 0x429c
movsbl 0x6ef(%rsp), %eax
cmpl $0x74, %eax
jne 0x406b
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x1, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x72, %eax
jne 0x406b
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x2, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x75, %eax
jne 0x406b
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x3, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x65, %eax
jne 0x406b
movl 0x6f8(%rsp), %eax
movl %eax, 0x12c(%rsp)
testl %eax, %eax
je 0x4043
jmp 0x3f65
movl 0x12c(%rsp), %eax
subl $0x3, %eax
jne 0x4055
jmp 0x3f77
leaq 0x5a0(%rsp), %rdi
movq %rdi, 0x120(%rsp)
callq 0x5890
movq 0x120(%rsp), %rdi
movl $0x1, %esi
callq 0x3690
jmp 0x3fa0
movq 0x760(%rsp), %rax
movq %rax, 0x118(%rsp)
leaq 0x570(%rsp), %rdi
leaq 0x5a0(%rsp), %rsi
callq 0x5ee0
jmp 0x3fc7
movq 0x118(%rsp), %rdi
leaq 0x570(%rsp), %rsi
callq 0x5b20
jmp 0x3fde
leaq 0x570(%rsp), %rdi
callq 0x5c80
leaq 0x5a0(%rsp), %rdi
callq 0x5c80
jmp 0x4055
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x4031
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x570(%rsp), %rdi
callq 0x5c80
leaq 0x5a0(%rsp), %rdi
callq 0x5c80
jmp 0x5041
movq 0x760(%rsp), %rdi
movl $0x1, %esi
callq 0x3690
movl 0x6f4(%rsp), %eax
addl $0x3, %eax
movl %eax, 0x774(%rsp)
jmp 0x5032
movsbl 0x6ef(%rsp), %eax
cmpl $0x6e, %eax
jne 0x417f
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x1, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x75, %eax
jne 0x417f
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x2, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x6c, %eax
jne 0x417f
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x3, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x6c, %eax
jne 0x417f
cmpl $0x3, 0x6f8(%rsp)
jne 0x4169
movq 0x760(%rsp), %rax
movq %rax, 0x108(%rsp)
leaq 0x540(%rsp), %rdi
movq %rdi, 0x110(%rsp)
callq 0x5890
movq 0x108(%rsp), %rdi
movq 0x110(%rsp), %rsi
callq 0x5b20
jmp 0x4134
leaq 0x540(%rsp), %rdi
callq 0x5c80
jmp 0x4169
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x540(%rsp), %rdi
callq 0x5c80
jmp 0x5041
movl 0x6f4(%rsp), %eax
addl $0x3, %eax
movl %eax, 0x774(%rsp)
jmp 0x5032
movb $0x1, 0x4f7(%rsp)
movl $0x50, %edi
callq 0x3110
movq %rax, 0xf8(%rsp)
leaq 0x51f(%rsp), %rdi
movq %rdi, 0x100(%rsp)
callq 0x33f0
movq 0x100(%rsp), %rdx
leaq 0xdf08(%rip), %rsi      # 0x120c5
leaq 0x520(%rsp), %rdi
callq 0x3340
jmp 0x41cc
leaq 0x4f8(%rsp), %rdi
movq %rdi, 0xf0(%rsp)
callq 0x3350
movq 0xf8(%rsp), %rdi
movq 0xf0(%rsp), %rcx
leaq 0x520(%rsp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x5a10
jmp 0x4205
movq 0xf8(%rsp), %rdi
movb $0x0, 0x4f7(%rsp)
leaq 0x159ac(%rip), %rsi     # 0x19bc8
leaq 0x18ad(%rip), %rdx      # 0x5ad0
callq 0x33c0
jmp 0x504e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x4271
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x4f8(%rsp), %rdi
callq 0x3150
leaq 0x520(%rsp), %rdi
callq 0x3150
leaq 0x51f(%rsp), %rdi
callq 0x32c0
testb $0x1, 0x4f7(%rsp)
jne 0x428a
jmp 0x4297
movq 0xf8(%rsp), %rdi
callq 0x31b0
jmp 0x5041
movsbl 0x6ef(%rsp), %eax
cmpl $0x66, %eax
jne 0x457a
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x1, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x61, %eax
jne 0x445d
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x2, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x6c, %eax
jne 0x445d
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x3, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x73, %eax
jne 0x445d
movq 0x768(%rsp), %rdi
movl 0x6f4(%rsp), %eax
addl $0x4, %eax
movslq %eax, %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x65, %eax
jne 0x445d
movl 0x6f8(%rsp), %eax
movl %eax, 0xec(%rsp)
testl %eax, %eax
je 0x4438
jmp 0x435d
movl 0xec(%rsp), %eax
subl $0x3, %eax
jne 0x4447
jmp 0x436f
leaq 0x4c0(%rsp), %rdi
movq %rdi, 0xe0(%rsp)
callq 0x5890
movq 0xe0(%rsp), %rdi
xorl %esi, %esi
callq 0x3690
jmp 0x4395
movq 0x760(%rsp), %rax
movq %rax, 0xd8(%rsp)
leaq 0x490(%rsp), %rdi
leaq 0x4c0(%rsp), %rsi
callq 0x5ee0
jmp 0x43bc
movq 0xd8(%rsp), %rdi
leaq 0x490(%rsp), %rsi
callq 0x5b20
jmp 0x43d3
leaq 0x490(%rsp), %rdi
callq 0x5c80
leaq 0x4c0(%rsp), %rdi
callq 0x5c80
jmp 0x4447
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x4426
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x490(%rsp), %rdi
callq 0x5c80
leaq 0x4c0(%rsp), %rdi
callq 0x5c80
jmp 0x5041
movq 0x760(%rsp), %rdi
xorl %esi, %esi
callq 0x3690
movl 0x6f4(%rsp), %eax
addl $0x4, %eax
movl %eax, 0x774(%rsp)
jmp 0x5032
movb $0x1, 0x447(%rsp)
movl $0x50, %edi
callq 0x3110
movq %rax, 0xc8(%rsp)
leaq 0x46f(%rsp), %rdi
movq %rdi, 0xd0(%rsp)
callq 0x33f0
movq 0xd0(%rsp), %rdx
leaq 0xdc46(%rip), %rsi      # 0x120e1
leaq 0x470(%rsp), %rdi
callq 0x3340
jmp 0x44aa
leaq 0x448(%rsp), %rdi
movq %rdi, 0xc0(%rsp)
callq 0x3350
movq 0xc8(%rsp), %rdi
movq 0xc0(%rsp), %rcx
leaq 0x470(%rsp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x5a10
jmp 0x44e3
movq 0xc8(%rsp), %rdi
movb $0x0, 0x447(%rsp)
leaq 0x156ce(%rip), %rsi     # 0x19bc8
leaq 0x15cf(%rip), %rdx      # 0x5ad0
callq 0x33c0
jmp 0x504e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x454f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x448(%rsp), %rdi
callq 0x3150
leaq 0x470(%rsp), %rdi
callq 0x3150
leaq 0x46f(%rsp), %rdi
callq 0x32c0
testb $0x1, 0x447(%rsp)
jne 0x4568
jmp 0x4575
movq 0xc8(%rsp), %rdi
callq 0x31b0
jmp 0x5041
movsbl 0x6ef(%rsp), %eax
cmpl $0x7b, %eax
jne 0x4a8e
leaq 0x3e5(%rsp), %rdi
movq %rdi, 0xb8(%rsp)
callq 0x5fc0
movq 0xb8(%rsp), %r8
leaq 0x3e8(%rsp), %rdi
movl $0xb, %esi
leaq 0x3e7(%rsp), %rdx
leaq 0x3e6(%rsp), %rcx
callq 0x5fd0
jmp 0x45cc
leaq 0x410(%rsp), %rdi
leaq 0x3e8(%rsp), %rsi
callq 0x6080
jmp 0x45e3
leaq 0x3e8(%rsp), %rdi
callq 0x60e0
leaq 0x3e5(%rsp), %rdi
callq 0x60f0
movl 0x6f4(%rsp), %eax
movl %eax, 0x3e0(%rsp)
movl 0x3e0(%rsp), %eax
cmpl 0x6f0(%rsp), %eax
jge 0x4974
movl 0x3e0(%rsp), %eax
incl %eax
movl %eax, 0x3e0(%rsp)
movq 0x768(%rsp), %rdi
movl 0x3e0(%rsp), %edx
leaq 0x410(%rsp), %rsi
callq 0x36d0
movl %eax, 0xb4(%rsp)
jmp 0x4654
movl 0xb4(%rsp), %eax
movl %eax, 0x3e0(%rsp)
movl 0x3e0(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x3e0(%rsp)
movl 0x3e0(%rsp), %eax
cmpl 0x6f0(%rsp), %eax
jge 0x4725
movq 0x768(%rsp), %rdi
movslq 0x3e0(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %edi
callq 0x3040
cmpl $0x0, %eax
jne 0x470d
jmp 0x4725
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x46e2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x3e8(%rsp), %rdi
callq 0x60e0
leaq 0x3e5(%rsp), %rdi
callq 0x60f0
jmp 0x5041
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x4a7c
jmp 0x470f
movl 0x3e0(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x3e0(%rsp)
jmp 0x4673
movl 0x6f0(%rsp), %eax
cmpl 0x3e0(%rsp), %eax
jg 0x4856
movb $0x1, 0x397(%rsp)
movl $0x50, %edi
callq 0x3110
movq %rax, 0xa0(%rsp)
leaq 0x3bf(%rsp), %rdi
movq %rdi, 0xa8(%rsp)
callq 0x33f0
movq 0xa8(%rsp), %rdx
leaq 0xd97a(%rip), %rsi      # 0x120f1
leaq 0x3c0(%rsp), %rdi
callq 0x3340
jmp 0x4786
leaq 0x398(%rsp), %rdi
movq %rdi, 0x98(%rsp)
callq 0x3350
movq 0xa0(%rsp), %rdi
movq 0x98(%rsp), %rcx
leaq 0x3c0(%rsp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x5a10
jmp 0x47bf
movq 0xa0(%rsp), %rdi
movb $0x0, 0x397(%rsp)
leaq 0x153f2(%rip), %rsi     # 0x19bc8
leaq 0x12f3(%rip), %rdx      # 0x5ad0
callq 0x33c0
jmp 0x504e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x482b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x398(%rsp), %rdi
callq 0x3150
leaq 0x3c0(%rsp), %rdi
callq 0x3150
leaq 0x3bf(%rsp), %rdi
callq 0x32c0
testb $0x1, 0x397(%rsp)
jne 0x4844
jmp 0x4851
movq 0xa0(%rsp), %rdi
callq 0x31b0
jmp 0x4a7c
movq 0x768(%rsp), %rdi
movslq 0x3e0(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x7d, %eax
jne 0x494d
movl 0x6f8(%rsp), %eax
movl %eax, 0x94(%rsp)
testl %eax, %eax
je 0x4914
jmp 0x488f
movl 0x94(%rsp), %eax
subl $0x3, %eax
jne 0x492d
jmp 0x48a1
movq 0x760(%rsp), %rax
movq %rax, 0x88(%rsp)
leaq 0x360(%rsp), %rdi
leaq 0x410(%rsp), %rsi
callq 0x5ee0
jmp 0x48c8
movq 0x88(%rsp), %rdi
leaq 0x360(%rsp), %rsi
callq 0x5b20
jmp 0x48df
leaq 0x360(%rsp), %rdi
callq 0x5c80
jmp 0x492d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x360(%rsp), %rdi
callq 0x5c80
jmp 0x4a7c
movq 0x760(%rsp), %rdi
leaq 0x410(%rsp), %rsi
callq 0x35d0
jmp 0x492b
jmp 0x492d
movl 0x3e0(%rsp), %eax
movl %eax, 0x774(%rsp)
leaq 0x410(%rsp), %rdi
callq 0x5c80
jmp 0x5032
movq 0x768(%rsp), %rdi
movslq 0x3e0(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x2c, %eax
jne 0x496f
jmp 0x460b
jmp 0x460b
movb $0x1, 0x317(%rsp)
movl $0x50, %edi
callq 0x3110
movq %rax, 0x78(%rsp)
leaq 0x33f(%rsp), %rdi
movq %rdi, 0x80(%rsp)
callq 0x33f0
movq 0x80(%rsp), %rdx
leaq 0xd765(%rip), %rsi      # 0x12114
leaq 0x340(%rsp), %rdi
callq 0x3340
jmp 0x49be
leaq 0x318(%rsp), %rdi
movq %rdi, 0x70(%rsp)
callq 0x3350
movq 0x78(%rsp), %rdi
movq 0x70(%rsp), %rcx
leaq 0x340(%rsp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x5a10
jmp 0x49ee
movq 0x78(%rsp), %rdi
movb $0x0, 0x317(%rsp)
leaq 0x151c6(%rip), %rsi     # 0x19bc8
leaq 0x10c7(%rip), %rdx      # 0x5ad0
callq 0x33c0
jmp 0x504e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x4a57
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x318(%rsp), %rdi
callq 0x3150
leaq 0x340(%rsp), %rdi
callq 0x3150
leaq 0x33f(%rsp), %rdi
callq 0x32c0
testb $0x1, 0x317(%rsp)
jne 0x4a70
jmp 0x4a7a
movq 0x78(%rsp), %rdi
callq 0x31b0
jmp 0x4a7c
leaq 0x410(%rsp), %rdi
callq 0x5c80
jmp 0x5041
movsbl 0x6ef(%rsp), %eax
cmpl $0x5b, %eax
jne 0x4f08
leaq 0x2c8(%rsp), %rdi
movq %rdi, 0x68(%rsp)
callq 0x6100
movq 0x68(%rsp), %rsi
leaq 0x2e0(%rsp), %rdi
callq 0x6110
jmp 0x4ac5
leaq 0x2c8(%rsp), %rdi
callq 0x6170
movl 0x6f4(%rsp), %eax
movl %eax, 0x2c4(%rsp)
movl 0x2c4(%rsp), %eax
cmpl 0x6f0(%rsp), %eax
jge 0x4df4
movl 0x2c4(%rsp), %eax
incl %eax
movl %eax, 0x2c4(%rsp)
movq 0x768(%rsp), %rdi
movl 0x2c4(%rsp), %edx
leaq 0x2e0(%rsp), %rsi
callq 0x36d0
movl %eax, 0x64(%rsp)
jmp 0x4b26
movl 0x64(%rsp), %eax
movl %eax, 0x2c4(%rsp)
movl 0x2c4(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x2c4(%rsp)
movl 0x2c4(%rsp), %eax
cmpl 0x6f0(%rsp), %eax
jge 0x4bcd
movq 0x768(%rsp), %rdi
movslq 0x2c4(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %edi
callq 0x3040
cmpl $0x0, %eax
jne 0x4bb5
jmp 0x4bcd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x2c8(%rsp), %rdi
callq 0x6170
jmp 0x5041
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x4ef6
jmp 0x4bb7
movl 0x2c4(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x2c4(%rsp)
jmp 0x4b42
movl 0x6f0(%rsp), %eax
cmpl 0x2c4(%rsp), %eax
jg 0x4ce6
movb $0x1, 0x277(%rsp)
movl $0x50, %edi
callq 0x3110
movq %rax, 0x50(%rsp)
leaq 0x29f(%rsp), %rdi
movq %rdi, 0x58(%rsp)
callq 0x33f0
movq 0x58(%rsp), %rdx
leaq 0xd521(%rip), %rsi      # 0x12137
leaq 0x2a0(%rsp), %rdi
callq 0x3340
jmp 0x4c25
leaq 0x278(%rsp), %rdi
movq %rdi, 0x48(%rsp)
callq 0x3350
movq 0x50(%rsp), %rdi
movq 0x48(%rsp), %rcx
leaq 0x2a0(%rsp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x5a10
jmp 0x4c55
movq 0x50(%rsp), %rdi
movb $0x0, 0x277(%rsp)
leaq 0x14f5f(%rip), %rsi     # 0x19bc8
leaq 0xe60(%rip), %rdx       # 0x5ad0
callq 0x33c0
jmp 0x504e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x4cbe
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x278(%rsp), %rdi
callq 0x3150
leaq 0x2a0(%rsp), %rdi
callq 0x3150
leaq 0x29f(%rsp), %rdi
callq 0x32c0
testb $0x1, 0x277(%rsp)
jne 0x4cd7
jmp 0x4ce1
movq 0x50(%rsp), %rdi
callq 0x31b0
jmp 0x4ef6
movq 0x768(%rsp), %rdi
movslq 0x2c4(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x5d, %eax
jne 0x4dcd
movl 0x6f8(%rsp), %eax
movl %eax, 0x44(%rsp)
testl %eax, %eax
je 0x4d94
jmp 0x4d18
movl 0x44(%rsp), %eax
subl $0x3, %eax
jne 0x4dad
jmp 0x4d27
movq 0x760(%rsp), %rax
movq %rax, 0x38(%rsp)
leaq 0x240(%rsp), %rdi
leaq 0x2e0(%rsp), %rsi
callq 0x5ee0
jmp 0x4d4b
movq 0x38(%rsp), %rdi
leaq 0x240(%rsp), %rsi
callq 0x5b20
jmp 0x4d5f
leaq 0x240(%rsp), %rdi
callq 0x5c80
jmp 0x4dad
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x240(%rsp), %rdi
callq 0x5c80
jmp 0x4ef6
movq 0x760(%rsp), %rdi
leaq 0x2e0(%rsp), %rsi
callq 0x35d0
jmp 0x4dab
jmp 0x4dad
movl 0x2c4(%rsp), %eax
movl %eax, 0x774(%rsp)
leaq 0x2e0(%rsp), %rdi
callq 0x5c80
jmp 0x5032
movq 0x768(%rsp), %rdi
movslq 0x2c4(%rsp), %rsi
callq 0x32e0
movsbl (%rax), %eax
cmpl $0x2c, %eax
jne 0x4def
jmp 0x4ae0
jmp 0x4ae0
movb $0x1, 0x1f7(%rsp)
movl $0x50, %edi
callq 0x3110
movq %rax, 0x28(%rsp)
leaq 0x21f(%rsp), %rdi
movq %rdi, 0x30(%rsp)
callq 0x33f0
movq 0x30(%rsp), %rdx
leaq 0xd334(%rip), %rsi      # 0x1215d
leaq 0x220(%rsp), %rdi
callq 0x3340
jmp 0x4e38
leaq 0x1f8(%rsp), %rdi
movq %rdi, 0x20(%rsp)
callq 0x3350
movq 0x28(%rsp), %rdi
movq 0x20(%rsp), %rcx
leaq 0x220(%rsp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x5a10
jmp 0x4e68
movq 0x28(%rsp), %rdi
movb $0x0, 0x1f7(%rsp)
leaq 0x14d4c(%rip), %rsi     # 0x19bc8
leaq 0xc4d(%rip), %rdx       # 0x5ad0
callq 0x33c0
jmp 0x504e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x4ed1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x1f8(%rsp), %rdi
callq 0x3150
leaq 0x220(%rsp), %rdi
callq 0x3150
leaq 0x21f(%rsp), %rdi
callq 0x32c0
testb $0x1, 0x1f7(%rsp)
jne 0x4eea
jmp 0x4ef4
movq 0x28(%rsp), %rdi
callq 0x31b0
jmp 0x4ef6
leaq 0x2e0(%rsp), %rdi
callq 0x5c80
jmp 0x5041
movb $0x1, 0x1a7(%rsp)
movl $0x50, %edi
callq 0x3110
movq %rax, 0x10(%rsp)
leaq 0x1cf(%rsp), %rdi
movq %rdi, 0x18(%rsp)
callq 0x33f0
movq 0x18(%rsp), %rdx
leaq 0xd242(%rip), %rsi      # 0x1217f
leaq 0x1d0(%rsp), %rdi
callq 0x3340
jmp 0x4f4c
movl 0x75c(%rsp), %eax
movl %eax, 0xc(%rsp)
movq 0x768(%rsp), %rsi
leaq 0x1a8(%rsp), %rdi
callq 0x30f0
jmp 0x4f6e
movl 0xc(%rsp), %edx
movq 0x10(%rsp), %rdi
leaq 0x1d0(%rsp), %rsi
leaq 0x1a8(%rsp), %rcx
callq 0x5a10
jmp 0x4f8e
movq 0x10(%rsp), %rdi
movb $0x0, 0x1a7(%rsp)
leaq 0x14c26(%rip), %rsi     # 0x19bc8
leaq 0xb27(%rip), %rdx       # 0x5ad0
callq 0x33c0
jmp 0x504e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x500d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
jmp 0x5000
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x728(%rsp)
movl %eax, 0x724(%rsp)
leaq 0x1a8(%rsp), %rdi
callq 0x3150
leaq 0x1d0(%rsp), %rdi
callq 0x3150
leaq 0x1cf(%rsp), %rdi
callq 0x32c0
testb $0x1, 0x1a7(%rsp)
jne 0x5026
jmp 0x5030
movq 0x10(%rsp), %rdi
callq 0x31b0
jmp 0x5041
movl 0x774(%rsp), %eax
addq $0x778, %rsp            # imm = 0x778
retq
movq 0x728(%rsp), %rdi
callq 0x33e0
nop