// File: mattn[P]wandbox-run/./json.hpp
// Function: nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, bool, long, unsigned long, double, std::allocator, nlohmann::adl_serializer> nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, bool, long, unsigned long, double, std::allocator, nlohmann::adl_serializer>::parse<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, 0>(__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::function<bool (int, nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, bool, long, unsigned long, double, std::allocator, nlohmann::adl_serializer>::parse_event_t, nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, bool, long, unsigned long, double, std::allocator, nlohmann::adl_serializer>&)>)
static basic_json parse(IteratorType first, IteratorType last,
                            const parser_callback_t cb = nullptr)
    {
        // assertion to check that the iterator range is indeed contiguous,
        // see http://stackoverflow.com/a/35008842/266378 for more discussion
        assert(std::accumulate(first, last, std::pair<bool, int>(true, 0),
                               [&first](std::pair<bool, int> res, decltype(*first) val)
        {
            res.first &= (val == *(std::next(std::addressof(*first), res.second++)));
            return res;
        }).first);

        // assertion to check that each element is 1 byte long
        static_assert(sizeof(typename std::iterator_traits<IteratorType>::value_type) == 1,
                      "each element in the iterator range must have the size of 1 byte");

        // if iterator range is empty, create a parser with an empty string
        // to generate "unexpected EOF" error message
        if (std::distance(first, last) <= 0)
        {
            return parser("").parse();
        }

        return parser(first, last, cb).parse();
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x240, %rsp            # imm = 0x240
movq %rcx, -0x228(%rbp)
movq %rdi, -0x220(%rbp)
movq %rdi, %rax
movq %rax, -0x218(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x38(%rbp)
movb $0x1, -0x41(%rbp)
movl $0x0, -0x48(%rbp)
leaq -0x40(%rbp), %rdi
leaq -0x41(%rbp), %rsi
leaq -0x48(%rbp), %rdx
callq 0x181e0
leaq -0x10(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x30(%rbp), %rdi
movq -0x38(%rbp), %rsi
movq -0x40(%rbp), %rdx
movq -0x50(%rbp), %rcx
callq 0x18160
movq %rax, -0x28(%rbp)
testb $0x1, -0x28(%rbp)
je 0x17e78
jmp 0x17e97
leaq 0xbc78c(%rip), %rdi     # 0xd460b
leaq 0xbc85b(%rip), %rsi     # 0xd46e1
movl $0x1b2a, %edx           # imm = 0x1B2A
leaq 0xbc85a(%rip), %rcx     # 0xd46ec
callq 0x13130
movq -0x10(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x58(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x18210
cmpq $0x0, %rax
jg 0x17f66
xorl %eax, %eax
movl %eax, %esi
leaq -0x128(%rbp), %rdi
movq %rdi, -0x230(%rbp)
callq 0x179a0
movq -0x230(%rbp), %rdx
leaq 0xbd7ac(%rip), %rsi     # 0xd568f
leaq -0x108(%rbp), %rdi
callq 0x18250
jmp 0x17ef1
movq -0x220(%rbp), %rdi
leaq -0x108(%rbp), %rsi
callq 0x182c0
jmp 0x17f06
leaq -0x108(%rbp), %rdi
callq 0x18380
leaq -0x128(%rbp), %rdi
callq 0x179e0
jmp 0x18028
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x130(%rbp)
movl %eax, -0x134(%rbp)
jmp 0x17f55
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x130(%rbp)
movl %eax, -0x134(%rbp)
leaq -0x108(%rbp), %rdi
callq 0x18380
leaq -0x128(%rbp), %rdi
callq 0x179e0
jmp 0x18038
movq -0x228(%rbp), %rsi
movq -0x10(%rbp), %rax
movq %rax, -0x1e8(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x1f0(%rbp)
leaq -0x210(%rbp), %rdi
movq %rdi, -0x238(%rbp)
callq 0x180b0
movq -0x238(%rbp), %rcx
movq -0x1e8(%rbp), %rsi
movq -0x1f0(%rbp), %rdx
leaq -0x1e0(%rbp), %rdi
callq 0x183b0
jmp 0x17fb9
movq -0x220(%rbp), %rdi
leaq -0x1e0(%rbp), %rsi
callq 0x182c0
jmp 0x17fce
leaq -0x1e0(%rbp), %rdi
callq 0x18380
leaq -0x210(%rbp), %rdi
callq 0x179e0
jmp 0x18028
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x130(%rbp)
movl %eax, -0x134(%rbp)
jmp 0x1801a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x130(%rbp)
movl %eax, -0x134(%rbp)
leaq -0x1e0(%rbp), %rdi
callq 0x18380
leaq -0x210(%rbp), %rdi
callq 0x179e0
jmp 0x18038
movq -0x218(%rbp), %rax
addq $0x240, %rsp            # imm = 0x240
popq %rbp
retq
movq -0x130(%rbp), %rdi
callq 0xd1250
nopw %cs:(%rax,%rax)
nop