// File: /workspace/github_cpp_makefile_star2_O2/akitsu-sanae[P]adtpp/src/adt.cpp
// Function: operator<<(std::ostream&, Adt const&)
std::ostream& operator<<(std::ostream& os, Adt const& adt) {
    os << format("#ifndef ADT_{}_HPP", adt.struct_name) << std::endl;
    os << format("#define ADT_{}_HPP", adt.struct_name) << std::endl;

    os << std::endl;
    os << "#include <vector>" << std::endl;
    os << "#include <map>" << std::endl;
    os << "#include <string>" << std::endl;
    os << "#include <memory>" << std::endl;
    os << "// this file is generated by adt++ (https://github.com/akitsu-sanae/adtpp)" << std::endl;
    os << std::endl;

    os << format("struct {} {", adt.struct_name) << std::endl;

    // types
    os << "    enum class Type {" << std::endl;
    for (auto const& e : adt.elements)
        os << format("        {},", e.first) << std::endl;
    os << "    };" << std::endl;

    // ctors
    for (auto const& e : adt.elements) {
        os << format("    explicit {}({} const& v) :", adt.struct_name, e.second) << std::endl;
        os << format("        m_type(Type::{})", e.first) << std::endl;
        os << "    {" << std::endl;
        os << "        assign(v);" << std::endl;
        os << "    }" << std::endl;
    }


    // copy ctor
    os << format("    {}({} const& rhs) :", adt.struct_name, adt.struct_name) << std::endl;
    os << "        m_type(rhs.m_type)" << std::endl;
    os << "    {" << std::endl;
    os << "        switch (m_type) {" << std::endl;
    for (auto const& e : adt.elements) {
        os << format("        case Type::{}:", e.first) << std::endl;
        os << format("            assign(rhs.{});", convert_to_label(e.first)) << std::endl;
        os << "            break;" << std::endl;
    }
    os << "        }" << std::endl;
    os << "    }" << std::endl;

    // move ctor
    os << format("    {}({}&& rhs) :", adt.struct_name, adt.struct_name) << std::endl;
    os << "        m_type(rhs.m_type)" << std::endl;
    os << "    {" << std::endl;
    os << "        switch (m_type) {" << std::endl;
    for (auto const& e : adt.elements) {
        os << format("        case Type::{}:", e.first) << std::endl;
        os << format("            assign(std::move(rhs.{}));", convert_to_label(e.first)) << std::endl;
        os << "            break;" << std::endl;
    }
    os << "        }" << std::endl;
    os << "    }" << std::endl;

    os << "    Type type() const { return m_type; }" << std::endl;

    // match
    os << "    template<typename T>" << std::endl;
    os << "    struct match {" << std::endl;
    os << format("        {} const& adt;", adt.struct_name) << std::endl;
    os << "        std::unique_ptr<T> result = nullptr;" << std::endl;
    os << std::endl;
    os << "        using result_t = T;" << std::endl;
    os << std::endl;
    os << format("        explicit match({} const& adt) :", adt.struct_name) << std::endl;
    os << "            adt(adt)" << std::endl;
    os << "        {}" << std::endl;

    for (auto const& e : adt.elements) {
        os << "        template<typename F>" << std::endl;
        os << format("        match& when_{}(F const& f) {", convert_to_label(e.first)) << std::endl;
        os << format("            if (adt.type() == Type::{} && !result)", e.first) << std::endl;
        os << format("                result = std::make_unique<T>(f(adt.{}));", convert_to_label(e.first)) << std::endl;
        os << "            return *this;" << std::endl;
        os << "        }" << std::endl;
    }

    os << "        template<typename F>" << std::endl;
    os << "        match& otherwise(F const& f) {" << std::endl;
    os << "            if (!result)" << std::endl;
    os << "                result = std::make_unique<T>(f());" << std::endl;
    os << "            return *this;" << std::endl;
    os << "        }" << std::endl;

    os << "        struct not_satisfy{};" << std::endl;

    os << "        T operator*() {" << std::endl;
    os << "            if (!result)" << std::endl;
    os << "                throw not_satisfy{};" << std::endl;
    os << "            return *result;" << std::endl;
    os << "        }" << std::endl;

    // end match struct
    os << "    };" << std::endl;

    // dtor
    os << format("    ~{}() {", adt.struct_name) << std::endl;
    os << "        clear();" << std::endl;
    os << "    }" << std::endl;

    // as

    os << "private:" << std::endl;

    os << "    union {" << std::endl;
    for (auto const& e : adt.elements) {
        auto label = convert_to_label(e.first);
        os << format("        {} {};", e.second, label) << std::endl;
    }
    os << "    };" << std::endl;


    // assign
    for (auto const& e : adt.elements) {
        // copy
        os << format("    void assign({} const& src) {", e.second) << std::endl;
        os << format("        new (&{}) {}{src};", convert_to_label(e.first), e.second) << std::endl;
        os << "    }" << std::endl;

        // move
        os << format("    void assign({}&& src) {", e.second) << std::endl;
        os << format("        new (&{}) {}{src};", convert_to_label(e.first), e.second) << std::endl;
        os << "    }" << std::endl;

    }

    // clear
    os << "    void clear() {" << std::endl;
    os << "        switch (m_type) {" << std::endl;
    for (auto const& e : adt.elements) {
        os << format("        case Type::{}:", e.first) << std::endl;
        auto label = convert_to_label(e.first);
        auto type = convert_to_dtor_name(e.second);
        std::vector<std::string> primitives = {
            "int", "double", "nullptr_t", "bool", "size_t", "char"
        };
        auto found = std::find(std::begin(primitives), std::end(primitives), type);
        if (found == std::end(primitives))
            os << format("            {}.~{}();", label, type) << std::endl;
        os << "            break;" << std::endl;
    }
    os << "        }" << std::endl;
    os << "    }" << std::endl;


    os << "    Type m_type;" << std::endl;

    // end struct
    os << "};" << std::endl;

    os << "#endif" << std::endl;
    return os;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x308, %rsp            # imm = 0x308
movq %rsi, %r14
movq %rdi, (%rsp)
leaq 0x3ac7(%rip), %rsi      # 0x6004
leaq 0x10(%rsp), %rdi
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x140(%rsp), %rdi
leaq 0x10(%rsp), %rsi
movq %r14, 0x8(%rsp)
movq %r14, %rdx
callq 0x3bc0
leaq 0x140(%rsp), %rsi
movq (%rsp), %rdi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
leaq 0x140(%rsp), %rdi
callq 0x20d0
leaq 0x10(%rsp), %rdi
callq 0x20d0
leaq 0x3a7a(%rip), %rsi      # 0x6017
leaq 0x10(%rsp), %rdi
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x140(%rsp), %rdi
leaq 0x10(%rsp), %rsi
movq 0x8(%rsp), %rdx
callq 0x3bc0
leaq 0x140(%rsp), %rsi
movq (%rsp), %rdi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
leaq 0x140(%rsp), %rdi
callq 0x20d0
leaq 0x10(%rsp), %rdi
callq 0x20d0
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x20e0
leaq 0x3a24(%rip), %rsi      # 0x602a
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3a1f(%rip), %rsi      # 0x603c
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3a17(%rip), %rsi      # 0x604b
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3a12(%rip), %rsi      # 0x605d
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3a0d(%rip), %rsi      # 0x606f
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %rbx, %rdi
callq 0x20e0
leaq 0x3a39(%rip), %rsi      # 0x60ba
leaq 0x10(%rsp), %rdi
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x140(%rsp), %rdi
leaq 0x10(%rsp), %rsi
movq 0x8(%rsp), %rdx
callq 0x3bc0
leaq 0x140(%rsp), %rsi
movq (%rsp), %rdi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
leaq 0x140(%rsp), %r14
movq %r14, %rdi
callq 0x20d0
leaq 0x10(%rsp), %r15
movq %r15, %rdi
callq 0x20d0
leaq 0x39e2(%rip), %rsi      # 0x60c6
movq (%rsp), %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq 0x8(%rsp), %rax
movq 0x20(%rax), %r12
movq 0x28(%rax), %r13
leaq 0x39d3(%rip), %rbx      # 0x60dc
leaq 0x38(%rsp), %rbp
cmpq %r13, %r12
je 0x2759
movq %r15, %rdi
movq %rbx, %rsi
movq %rbp, %rdx
callq 0x43c4
movq %r14, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x3bc0
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %r15, %rdi
callq 0x20d0
addq $0x40, %r12
jmp 0x270e
leaq 0x3988(%rip), %rsi      # 0x60e8
movq (%rsp), %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq 0x8(%rsp), %rax
movq 0x20(%rax), %r14
movq 0x28(%rax), %r15
leaq 0x10(%rsp), %r12
leaq 0x38(%rsp), %r13
leaq 0x140(%rsp), %rbp
movq (%rsp), %rbx
cmpq %r15, %r14
je 0x2880
movq %r12, %rdi
leaq 0x3948(%rip), %rsi      # 0x60ef
movq %r13, %rdx
callq 0x43c4
addq $0x20, %r14
movq %rbp, %rdi
movq %r12, %rsi
movq 0x8(%rsp), %rdx
movq %r14, %rcx
callq 0x3d53
movq (%rsp), %rdi
movq %rbp, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %rbp, %rdi
callq 0x20d0
movq %r12, %rdi
callq 0x20d0
movq %r12, %rdi
leaq 0x391a(%rip), %rsi      # 0x610e
movq %r13, %rdx
callq 0x43c4
addq $-0x20, %r14
movq %rbp, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x3bc0
movq (%rsp), %rdi
movq %rbp, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %rbp, %rdi
callq 0x20d0
movq %r12, %rdi
callq 0x20d0
movq %rbx, %rdi
leaq 0x38eb(%rip), %rsi      # 0x6127
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %rbx, %rdi
leaq 0x38da(%rip), %rsi      # 0x612d
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %rbx, %rdi
leaq 0x396d(%rip), %rsi      # 0x61d7
callq 0x2190
movq %rax, %rdi
callq 0x20e0
addq $0x40, %r14
jmp 0x2794
leaq 0x38b9(%rip), %rsi      # 0x6140
leaq 0x10(%rsp), %rdi
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x140(%rsp), %rdi
leaq 0x10(%rsp), %rsi
movq 0x8(%rsp), %rcx
movq %rcx, %rdx
callq 0x3d53
leaq 0x140(%rsp), %rsi
movq (%rsp), %rdi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
leaq 0x140(%rsp), %r14
movq %r14, %rdi
callq 0x20d0
leaq 0x10(%rsp), %r15
movq %r15, %rdi
callq 0x20d0
leaq 0x386b(%rip), %rsi      # 0x6158
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x381f(%rip), %rsi      # 0x6127
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3854(%rip), %rsi      # 0x6173
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq 0x8(%rsp), %rax
movq 0x20(%rax), %r12
movq 0x28(%rax), %r13
leaq 0x384a(%rip), %rbx      # 0x618d
leaq 0x38(%rsp), %rbp
cmpq %r13, %r12
je 0x2a0b
movq %r15, %rdi
movq %rbx, %rsi
movq %rbp, %rdx
callq 0x43c4
movq %r14, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x3bc0
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %r15, %rdi
callq 0x20d0
movq %r15, %rdi
leaq 0x3809(%rip), %rsi      # 0x61a4
leaq 0x60(%rsp), %rdx
callq 0x43c4
movq %rbp, %rdi
movq %r12, %rsi
callq 0x243c
movq %r14, %rdi
movq %r15, %rsi
movq %rbp, %rdx
callq 0x3ef8
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %rbp, %rdi
callq 0x20d0
movq %r15, %rdi
callq 0x20d0
movq (%rsp), %rdi
leaq 0x37cb(%rip), %rsi      # 0x61c0
callq 0x2190
movq %rax, %rdi
callq 0x20e0
addq $0x40, %r12
jmp 0x2948
leaq 0x37c1(%rip), %rsi      # 0x61d3
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x37aa(%rip), %rsi      # 0x61d7
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3799(%rip), %rsi      # 0x61dd
leaq 0x10(%rsp), %rdi
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x140(%rsp), %rdi
leaq 0x10(%rsp), %rsi
movq 0x8(%rsp), %rcx
movq %rcx, %rdx
callq 0x3d53
leaq 0x140(%rsp), %rsi
movq (%rsp), %rdi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
leaq 0x140(%rsp), %r14
movq %r14, %rdi
callq 0x20d0
leaq 0x10(%rsp), %r15
movq %r15, %rdi
callq 0x20d0
leaq 0x36ae(%rip), %rsi      # 0x6158
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3662(%rip), %rsi      # 0x6127
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3697(%rip), %rsi      # 0x6173
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq 0x8(%rsp), %rax
movq 0x20(%rax), %r12
movq 0x28(%rax), %r13
leaq 0x368d(%rip), %rbx      # 0x618d
leaq 0x38(%rsp), %rbp
cmpq %r13, %r12
je 0x2bc8
movq %r15, %rdi
movq %rbx, %rsi
movq %rbp, %rdx
callq 0x43c4
movq %r14, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x3bc0
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %r15, %rdi
callq 0x20d0
movq %r15, %rdi
leaq 0x3698(%rip), %rsi      # 0x61f0
leaq 0x60(%rsp), %rdx
callq 0x43c4
movq %rbp, %rdi
movq %r12, %rsi
callq 0x243c
movq %r14, %rdi
movq %r15, %rsi
movq %rbp, %rdx
callq 0x3ef8
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %rbp, %rdi
callq 0x20d0
movq %r15, %rdi
callq 0x20d0
movq (%rsp), %rdi
leaq 0x360e(%rip), %rsi      # 0x61c0
callq 0x2190
movq %rax, %rdi
callq 0x20e0
addq $0x40, %r12
jmp 0x2b05
leaq 0x3604(%rip), %rsi      # 0x61d3
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x35ed(%rip), %rsi      # 0x61d7
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3616(%rip), %rsi      # 0x6217
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3628(%rip), %rsi      # 0x6240
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x362a(%rip), %rsi      # 0x6259
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3626(%rip), %rsi      # 0x626c
leaq 0x10(%rsp), %rdi
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x140(%rsp), %rdi
leaq 0x10(%rsp), %rsi
movq 0x8(%rsp), %rdx
callq 0x3bc0
leaq 0x140(%rsp), %rsi
movq (%rsp), %rdi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
leaq 0x140(%rsp), %rdi
callq 0x20d0
leaq 0x10(%rsp), %rdi
callq 0x20d0
leaq 0x35e0(%rip), %rsi      # 0x6283
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %rbx, %rdi
callq 0x20e0
leaq 0x35ea(%rip), %rsi      # 0x62b0
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %rbx, %rdi
callq 0x20e0
leaq 0x35e7(%rip), %rsi      # 0x62cc
leaq 0x10(%rsp), %rdi
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x140(%rsp), %rdi
leaq 0x10(%rsp), %rsi
movq 0x8(%rsp), %rdx
callq 0x3bc0
leaq 0x140(%rsp), %rsi
movq (%rsp), %rdi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
leaq 0x140(%rsp), %r14
movq %r14, %rdi
callq 0x20d0
leaq 0x10(%rsp), %r15
movq %r15, %rdi
callq 0x20d0
leaq 0x35ac(%rip), %rsi      # 0x62f4
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x35a6(%rip), %rsi      # 0x6309
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq 0x8(%rsp), %rax
movq 0x20(%rax), %r12
movq 0x28(%rax), %rbp
leaq 0x38(%rsp), %r13
movq %rbx, %rdi
leaq 0x3585(%rip), %rsi      # 0x6314
callq 0x2190
movq %rax, %rdi
callq 0x20e0
cmpq %rbp, %r12
je 0x2ed7
movq %r15, %rdi
leaq 0x3582(%rip), %rsi      # 0x6331
leaq 0x60(%rsp), %rbx
movq %rbx, %rdx
callq 0x43c4
movq %r13, %rdi
movq %r12, %rsi
callq 0x243c
movq %r14, %rdi
movq %r15, %rsi
movq %r13, %rdx
callq 0x3ef8
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %r13, %rdi
callq 0x20d0
movq %r15, %rdi
callq 0x20d0
movq %r15, %rdi
leaq 0x354b(%rip), %rsi      # 0x6356
movq %r13, %rdx
callq 0x43c4
movq %r14, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x3bc0
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %r15, %rdi
callq 0x20d0
movq %r15, %rdi
leaq 0x353a(%rip), %rsi      # 0x6389
movq %rbx, %rdx
callq 0x43c4
movq %r13, %rdi
movq %r12, %rsi
callq 0x243c
movq %r14, %rdi
movq %r15, %rsi
movq %r13, %rdx
callq 0x3ef8
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %r13, %rdi
callq 0x20d0
movq %r15, %rdi
callq 0x20d0
movq (%rsp), %rbx
movq %rbx, %rdi
leaq 0x3518(%rip), %rsi      # 0x63c2
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %rbx, %rdi
leaq 0x3312(%rip), %rsi      # 0x61d3
callq 0x2190
movq %rax, %rdi
callq 0x20e0
addq $0x40, %r12
jmp 0x2d85
leaq 0x34fe(%rip), %rsi      # 0x63dc
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x350a(%rip), %r14      # 0x6403
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3509(%rip), %rsi      # 0x641c
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3498(%rip), %rsi      # 0x63c2
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3292(%rip), %r15      # 0x61d3
movq %rbx, %rdi
movq %r15, %rsi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x34f4(%rip), %rsi      # 0x644f
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x34fb(%rip), %rsi      # 0x646d
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x34e9(%rip), %rsi      # 0x6485
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x34f7(%rip), %rsi      # 0x64aa
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %rbx, %rdi
movq %r15, %rsi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x310b(%rip), %rsi      # 0x60e8
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x34d2(%rip), %rsi      # 0x64c6
leaq 0x10(%rsp), %rdi
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x140(%rsp), %rdi
leaq 0x10(%rsp), %rsi
movq 0x8(%rsp), %rdx
callq 0x3bc0
leaq 0x140(%rsp), %rsi
movq (%rsp), %rdi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
leaq 0x140(%rsp), %rdi
callq 0x20d0
leaq 0x10(%rsp), %rdi
callq 0x20d0
leaq 0x3481(%rip), %rsi      # 0x64d2
movq (%rsp), %r14
movq %r14, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x316b(%rip), %rsi      # 0x61d7
movq %r14, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3460(%rip), %rsi      # 0x64e3
movq %r14, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x3452(%rip), %rsi      # 0x64ec
movq %r14, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq 0x8(%rsp), %rax
movq 0x20(%rax), %r12
movq 0x28(%rax), %rax
movq %rax, 0x58(%rsp)
leaq 0xe0(%rsp), %rbp
leaq 0x38(%rsp), %rbx
leaq 0x2c8(%rsp), %r14
leaq 0x100(%rsp), %r15
cmpq 0x58(%rsp), %r12
je 0x3238
leaq 0xa0(%rsp), %rdi
movq %r12, %rsi
callq 0x243c
movq %rbp, %rdi
leaq 0x33fa(%rip), %rsi      # 0x64f8
leaq 0xc0(%rsp), %rdx
callq 0x43c4
movq %rbp, %rdi
leaq 0x31fc(%rip), %rsi      # 0x6311
xorl %edx, %edx
callq 0x22e0
cmpq $-0x1, %rax
je 0x3846
movq %rax, %r13
leaq 0x2(%rax), %rdx
movq 0xe8(%rsp), %rcx
leaq 0x10(%rsp), %rdi
movq %rbp, %rsi
callq 0x21c0
leaq 0x140(%rsp), %rdi
callq 0x2110
addq $0x20, %r12
leaq 0x150(%rsp), %rdi
movq %r12, %rsi
callq 0x2180
leaq 0x60(%rsp), %rdi
movq %rbp, %rsi
xorl %edx, %edx
movq %r13, %rcx
callq 0x21c0
leaq 0x120(%rsp), %r13
movq %r13, %rdi
leaq 0x158(%rsp), %rsi
callq 0x2250
movq %rbx, %rdi
leaq 0x60(%rsp), %rsi
movq %r13, %rdx
callq 0x4466
movq %r14, %rdi
leaq 0x10(%rsp), %rsi
leaq 0xa0(%rsp), %rdx
callq 0x4230
movq %r15, %rdi
movq %rbx, %rsi
movq %r14, %rdx
callq 0x4466
movq %r14, %rdi
callq 0x20d0
movq %rbx, %rdi
callq 0x20d0
leaq 0x120(%rsp), %rdi
callq 0x20d0
leaq 0x60(%rsp), %rdi
callq 0x20d0
leaq 0x140(%rsp), %rdi
callq 0x2140
leaq 0x10(%rsp), %rdi
callq 0x20d0
movq (%rsp), %rdi
movq %r15, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r15, %rdi
callq 0x20d0
movq %rbp, %rdi
callq 0x20d0
leaq 0xa0(%rsp), %rdi
callq 0x20d0
addq $0x20, %r12
jmp 0x30d9
leaq 0x2ea9(%rip), %rsi      # 0x60e8
movq (%rsp), %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq 0x8(%rsp), %rax
movq 0x20(%rax), %r15
movq 0x28(%rax), %r12
leaq 0x32a3(%rip), %rbx      # 0x6507
leaq 0x10(%rsp), %r13
leaq 0x38(%rsp), %rbp
leaq 0x140(%rsp), %r14
cmpq %r12, %r15
je 0x3408
movq %r13, %rdi
movq %rbx, %rsi
movq %rbp, %rdx
callq 0x43c4
addq $0x20, %r15
movq %r14, %rdi
movq %r13, %rsi
movq %r15, %rdx
callq 0x3bc0
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %r13, %rdi
callq 0x20d0
movq %r13, %rdi
leaq 0x325b(%rip), %rsi      # 0x6528
leaq 0x60(%rsp), %rdx
callq 0x43c4
addq $-0x20, %r15
movq %rbp, %rdi
movq %r15, %rsi
callq 0x243c
addq $0x20, %r15
movq %r14, %rdi
movq %r13, %rsi
movq %rbp, %rdx
movq %r15, %rcx
callq 0x408b
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %rbp, %rdi
callq 0x20d0
movq %r13, %rdi
callq 0x20d0
movq (%rsp), %rdi
leaq 0x2ea5(%rip), %rsi      # 0x61d7
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %r13, %rdi
leaq 0x31fa(%rip), %rsi      # 0x6543
movq %rbp, %rdx
callq 0x43c4
movq %r14, %rdi
movq %r13, %rsi
movq %r15, %rdx
callq 0x3bc0
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %r13, %rdi
callq 0x20d0
movq %r13, %rdi
leaq 0x319b(%rip), %rsi      # 0x6528
leaq 0x60(%rsp), %rdx
callq 0x43c4
addq $-0x20, %r15
movq %rbp, %rdi
movq %r15, %rsi
callq 0x243c
addq $0x20, %r15
movq %r14, %rdi
movq %r13, %rsi
movq %rbp, %rdx
movq %r15, %rcx
callq 0x408b
movq (%rsp), %rdi
movq %r14, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
movq %r14, %rdi
callq 0x20d0
movq %rbp, %rdi
callq 0x20d0
movq %r13, %rdi
callq 0x20d0
movq (%rsp), %rdi
leaq 0x2de5(%rip), %rsi      # 0x61d7
callq 0x2190
movq %rax, %rdi
callq 0x20e0
addq $0x20, %r15
jmp 0x3276
leaq 0x3150(%rip), %rsi      # 0x655f
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x2d49(%rip), %rsi      # 0x6173
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq 0x8(%rsp), %rax
movq 0x20(%rax), %rcx
movq 0x28(%rax), %rax
movq %rax, 0x58(%rsp)
leaq 0x160(%rsp), %r12
leaq 0x1e0(%rsp), %rax
movq %rax, 0x80(%rsp)
leaq 0x10(%rsp), %r13
leaq 0x2e8(%rsp), %rbp
cmpq 0x58(%rsp), %rcx
je 0x37ba
movq %rcx, 0x8(%rsp)
movq %r13, %rdi
leaq 0x2d02(%rip), %rsi      # 0x618d
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x140(%rsp), %rbx
movq %rbx, %rdi
movq %r13, %r14
movq %r13, %rsi
movq 0x8(%rsp), %rdx
callq 0x3bc0
movq (%rsp), %rdi
movq %rbx, %rsi
callq 0x2180
movq %rbx, %r13
movq %rax, %rdi
callq 0x20e0
movq %r13, %rdi
callq 0x20d0
movq %r14, %rdi
callq 0x20d0
leaq 0xa0(%rsp), %rdi
movq 0x8(%rsp), %rbx
movq %rbx, %rsi
callq 0x243c
leaq 0x20(%rbx), %rsi
movq %rbp, %rdi
callq 0x2200
leaq 0x100(%rsp), %rdi
movq %rbp, %rsi
callq 0x247d
movq %rbp, %rdi
callq 0x20d0
movq %r13, %rdi
leaq 0x3058(%rip), %rsi      # 0x6572
movq %r14, %rdx
callq 0x43c4
movq %r12, %rdi
leaq 0x304a(%rip), %rsi      # 0x6576
leaq 0x38(%rsp), %rdx
callq 0x43c4
leaq 0x180(%rsp), %rdi
leaq 0x3038(%rip), %rsi      # 0x657d
leaq 0x60(%rsp), %rdx
callq 0x43c4
leaq 0x1a0(%rsp), %rdi
leaq 0x3029(%rip), %rsi      # 0x6587
leaq 0x120(%rsp), %rdx
callq 0x43c4
leaq 0x1c0(%rsp), %rdi
leaq 0x3012(%rip), %rsi      # 0x658c
leaq 0x2c8(%rsp), %rdx
callq 0x43c4
leaq 0x1e0(%rsp), %rdi
leaq 0x2ffd(%rip), %rsi      # 0x6593
leaq 0xe0(%rsp), %rdx
callq 0x43c4
movq %rbp, %r13
leaq 0x88(%rsp), %rdi
leaq 0x140(%rsp), %rsi
pushq $0x6
popq %rdx
leaq 0xc0(%rsp), %rcx
callq 0x4400
movl $0xa0, %ebp
leaq (%rsp,%rbp), %rdi
addq $0x140, %rdi            # imm = 0x140
callq 0x20d0
addq $-0x20, %rbp
cmpq $-0x20, %rbp
jne 0x35cb
movq 0x88(%rsp), %rdi
movq 0x90(%rsp), %rsi
leaq 0x100(%rsp), %rdx
callq 0x46db
movq %r13, %rbp
cmpq 0x90(%rsp), %rax
jne 0x376a
leaq 0xc0(%rsp), %rbx
movq %rbx, %rdi
leaq 0x2f73(%rip), %rsi      # 0x6598
leaq 0x37(%rsp), %rdx
callq 0x43c4
movq %rbx, %rdi
leaq 0x2cd8(%rip), %rsi      # 0x6311
xorl %edx, %edx
callq 0x22e0
cmpq $-0x1, %rax
je 0x385f
movq %rax, %rbp
leaq 0x2(%rax), %rdx
movq 0xc8(%rsp), %rcx
movq %r14, %rdi
movq %rbx, %rsi
callq 0x21c0
leaq 0x140(%rsp), %rdi
callq 0x2110
leaq 0x150(%rsp), %rdi
leaq 0xa0(%rsp), %rsi
callq 0x2180
leaq 0x60(%rsp), %rdi
leaq 0xc0(%rsp), %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x21c0
leaq 0x120(%rsp), %rbx
movq %rbx, %rdi
leaq 0x158(%rsp), %rsi
callq 0x2250
leaq 0x38(%rsp), %rdi
leaq 0x60(%rsp), %rsi
movq %rbx, %rdx
callq 0x4466
leaq 0x2c8(%rsp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
leaq 0x100(%rsp), %rdx
callq 0x4230
leaq 0xe0(%rsp), %r15
movq %r15, %rdi
leaq 0x38(%rsp), %rbp
movq %rbp, %rsi
movq %rbx, %rdx
callq 0x4466
movq %rbx, %rdi
callq 0x20d0
movq %rbp, %rdi
callq 0x20d0
leaq 0x120(%rsp), %rdi
callq 0x20d0
leaq 0x60(%rsp), %rdi
callq 0x20d0
leaq 0x140(%rsp), %rdi
callq 0x2140
movq %r14, %rdi
callq 0x20d0
movq (%rsp), %rdi
movq %r15, %rsi
callq 0x2180
movq %rax, %rdi
callq 0x20e0
leaq 0xe0(%rsp), %rdi
callq 0x20d0
leaq 0xc0(%rsp), %rdi
callq 0x20d0
movq %r13, %rbp
movq (%rsp), %rdi
leaq 0x2a4b(%rip), %rsi      # 0x61c0
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x88(%rsp), %rdi
callq 0x443a
leaq 0x100(%rsp), %rdi
callq 0x20d0
leaq 0xa0(%rsp), %rdi
callq 0x20d0
movq 0x8(%rsp), %rcx
addq $0x40, %rcx
movq %r14, %r13
jmp 0x3471
leaq 0x2a12(%rip), %rsi      # 0x61d3
movq (%rsp), %rbx
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x29fb(%rip), %rsi      # 0x61d7
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x2dbb(%rip), %rsi      # 0x65ae
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x28e2(%rip), %rsi      # 0x60ec
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
leaq 0x2d9e(%rip), %rsi      # 0x65bf
movq %rbx, %rdi
callq 0x2190
movq %rax, %rdi
callq 0x20e0
movq %rbx, %rax
addq $0x308, %rsp            # imm = 0x308
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
pushq $0x1
popq %rdi
callq 0x20f0
leaq 0x5533(%rip), %rsi      # 0x8d88
movq %rax, %rdi
xorl %edx, %edx
callq 0x2280
pushq $0x1
popq %rdi
callq 0x20f0
leaq 0x551a(%rip), %rsi      # 0x8d88
movq %rax, %rdi
xorl %edx, %edx
callq 0x2280
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b77
jmp 0x3b77
jmp 0x3b77
jmp 0x3b77
jmp 0x3b77
jmp 0x3b77
jmp 0x3b77
jmp 0x3b77
movq %rax, %rbx
jmp 0x392c
movq %rax, %rbx
jmp 0x3955
movq %rax, %rbx
jmp 0x3939
jmp 0x3915
movq %rax, %rbx
leaq 0x2c8(%rsp), %rdi
callq 0x20d0
jmp 0x3922
jmp 0x3945
movq %rax, %rbx
jmp 0x396c
jmp 0x3b8e
movq %rax, %rbx
leaq 0x38(%rsp), %rdi
callq 0x20d0
leaq 0x120(%rsp), %rdi
callq 0x20d0
leaq 0x60(%rsp), %rdi
callq 0x20d0
jmp 0x3948
movq %rax, %rbx
leaq 0x140(%rsp), %rdi
callq 0x2140
leaq 0x10(%rsp), %rdi
jmp 0x3967
movq %rax, %rbx
leaq 0xe0(%rsp), %rdi
callq 0x20d0
leaq 0xc0(%rsp), %rdi
callq 0x20d0
jmp 0x3b91
movq %rax, %rbx
xorl %eax, %eax
leaq 0x1a0(%rsp), %r12
jmp 0x3a1b
jmp 0x3b27
movq %rax, %rbx
xorl %eax, %eax
leaq 0x1c0(%rsp), %rcx
movq %rcx, 0x80(%rsp)
jmp 0x39d8
movq %rax, %rbx
xorl %eax, %eax
jmp 0x39d8
movq %rax, %rbx
movl $0xa0, %r15d
leaq (%rsp,%r15), %rdi
addq $0x140, %rdi            # imm = 0x140
callq 0x20d0
addq $-0x20, %r15
cmpq $-0x20, %r15
jne 0x39bc
movb $0x1, %al
movq 0x80(%rsp), %r12
leaq 0x140(%rsp), %r13
jmp 0x3a1b
jmp 0x3a90
movq %rax, %rbx
leaq 0x2e8(%rsp), %rdi
jmp 0x3ba6
movq %rax, %rbx
jmp 0x3b9e
movq %rax, %rbx
xorl %eax, %eax
jmp 0x3a1b
movq %rax, %rbx
xorl %eax, %eax
leaq 0x180(%rsp), %r12
cmpq %r12, %r13
sete %cl
testb %al, %al
jne 0x3b9e
testb %cl, %cl
jne 0x3b9e
addq $-0x20, %r12
movq %r12, %rdi
callq 0x20d0
cmpq %r13, %r12
jne 0x3a31
jmp 0x3b9e
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b0c
jmp 0x3b0c
jmp 0x3b1f
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b1f
jmp 0x3b27
movq %rax, %rbx
leaq 0x2c8(%rsp), %rdi
callq 0x20d0
jmp 0x3abb
movq %rax, %rbx
jmp 0x3bab
jmp 0x3a9f
movq %rax, %rbx
jmp 0x3ae9
movq %rax, %rbx
jmp 0x3b46
jmp 0x3aa9
movq %rax, %rbx
jmp 0x3adc
movq %rax, %rbx
jmp 0x3ad2
movq %rax, %rbx
jmp 0x3ac5
movq %rax, %rbx
leaq 0x38(%rsp), %rdi
callq 0x20d0
leaq 0x120(%rsp), %rdi
callq 0x20d0
leaq 0x60(%rsp), %rdi
callq 0x20d0
leaq 0x140(%rsp), %rdi
callq 0x2140
leaq 0x10(%rsp), %rdi
jmp 0x3b41
jmp 0x3b27
jmp 0x3b0c
jmp 0x3b0c
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b27
jmp 0x3b0c
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b27
movq %rax, %rbx
jmp 0x3b6a
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b1f
jmp 0x3b27
jmp 0x3b1f
jmp 0x3b27
movq %rax, %rbx
jmp 0x3bb8
movq %rax, %rbx
jmp 0x3b87
jmp 0x3b77
jmp 0x3b5a
jmp 0x3b77
jmp 0x3b77
jmp 0x3b5a
movq %rax, %rbx
leaq 0x100(%rsp), %rdi
callq 0x20d0
leaq 0xe0(%rsp), %rdi
jmp 0x3ba6
jmp 0x3b5a
jmp 0x3b77
jmp 0x3b5a
jmp 0x3b5a
jmp 0x3b77
movq %rax, %rbx
leaq 0x140(%rsp), %rdi
callq 0x20d0
leaq 0x38(%rsp), %rdi
jmp 0x3b82
jmp 0x3b77
jmp 0x3b77
jmp 0x3b77
movq %rax, %rbx
leaq 0x140(%rsp), %rdi
callq 0x20d0
leaq 0x10(%rsp), %rdi
jmp 0x3bb3
movq %rax, %rbx
leaq 0x88(%rsp), %rdi
callq 0x443a
leaq 0x100(%rsp), %rdi
callq 0x20d0
leaq 0xa0(%rsp), %rdi
callq 0x20d0
movq %rbx, %rdi
callq 0x2290