// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::expression_generator<double>::conditional_string(exprtk::details::expression_node<double>*, exprtk::details::expression_node<double>*, exprtk::details::expression_node<double>*) const
inline expression_node_ptr conditional_string(expression_node_ptr condition,
                                                       expression_node_ptr consequent,
                                                       expression_node_ptr alternative) const
         {
            if ((0 == condition) || (0 == consequent))
            {
               details::free_node(*node_allocator_, condition  );
               details::free_node(*node_allocator_, consequent );
               details::free_node(*node_allocator_, alternative);

               const std::string invalid_branches =
                                 ((0 == condition ) ? std::string("condition ") : "") +
                                 ((0 == consequent) ? std::string("consequent") : "") ;

               parser_->set_error(parser_error::make_error(
                  parser_error::e_parser,
                  parser_->current_state().token,
                  "ERR257 - Invalid " + invalid_branches + " for string conditional statement",
                  exprtk_error_location));

               return error_node();
            }
            // Can the condition be immediately evaluated? if so optimise.
            else if (details::is_constant_node(condition))
            {
               // True branch
               if (details::is_true(condition))
               {
                  details::free_node(*node_allocator_, condition  );
                  details::free_node(*node_allocator_, alternative);

                  return consequent;
               }
               // False branch
               else
               {
                  details::free_node(*node_allocator_, condition );
                  details::free_node(*node_allocator_, consequent);

                  if (alternative)
                     return alternative;
                  else
                     return node_allocator_->
                              allocate_c<details::string_literal_node<Type> >("");
               }
            }
            else if ((0 != consequent) && (0 != alternative))
            {
               expression_node_ptr result =
                  node_allocator_->allocate<conditional_string_node_t>(condition, consequent, alternative);

               if (result && result->valid())
               {
                  return result;
               }

               parser_->set_error(parser_error::make_error(
                  parser_error::e_parser,
                  token_t(),
                  "ERR258 - Failed to synthesize node: conditional_string_node_t",
                  exprtk_error_location));

               details::free_node(*node_allocator_, result);
            }

            return error_node();
         }

// Assembly:
subq $0x3a8, %rsp            # imm = 0x3A8
movq %rdi, 0x398(%rsp)
movq %rsi, 0x390(%rsp)
movq %rdx, 0x388(%rsp)
movq %rcx, 0x380(%rsp)
movq 0x398(%rsp), %rax
movq %rax, 0x48(%rsp)
xorl %eax, %eax
cmpq 0x390(%rsp), %rax
je 0x4e1cc0
xorl %eax, %eax
cmpq 0x388(%rsp), %rax
jne 0x4e21f5
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x390(%rsp), %rsi
callq 0x284bd0
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x388(%rsp), %rsi
callq 0x284bd0
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x380(%rsp), %rsi
callq 0x284bd0
movq 0x390(%rsp), %rcx
movb $0x0, 0x33e(%rsp)
movb $0x0, 0x32a(%rsp)
xorl %eax, %eax
cmpq %rcx, %rax
jne 0x4e1d58
leaq 0x33f(%rsp), %rdi
movq %rdi, 0x40(%rsp)
callq 0x11b6f0
movq 0x40(%rsp), %rdx
movb $0x1, 0x33e(%rsp)
leaq 0xc6526(%rip), %rsi     # 0x5a826d
leaq 0x340(%rsp), %rdi
callq 0x134520
jmp 0x4e1d56
jmp 0x4e1d8f
leaq 0x32b(%rsp), %rdi
movq %rdi, 0x38(%rsp)
callq 0x11b6f0
movq 0x38(%rsp), %rdx
movb $0x1, 0x32a(%rsp)
leaq 0xd3eca(%rip), %rsi     # 0x5b5c48
leaq 0x340(%rsp), %rdi
callq 0x134520
jmp 0x4e1d8d
jmp 0x4e1d8f
movq 0x388(%rsp), %rcx
movb $0x0, 0x306(%rsp)
movb $0x0, 0x304(%rsp)
xorl %eax, %eax
cmpq %rcx, %rax
jne 0x4e1de5
leaq 0x307(%rsp), %rdi
movq %rdi, 0x30(%rsp)
callq 0x11b6f0
movq 0x30(%rsp), %rdx
movb $0x1, 0x306(%rsp)
leaq 0xc62f5(%rip), %rsi     # 0x5a80c9
leaq 0x308(%rsp), %rdi
callq 0x134520
jmp 0x4e1de3
jmp 0x4e1e1c
leaq 0x305(%rsp), %rdi
movq %rdi, 0x28(%rsp)
callq 0x11b6f0
movq 0x28(%rsp), %rdx
movb $0x1, 0x304(%rsp)
leaq 0xd3e3d(%rip), %rsi     # 0x5b5c48
leaq 0x308(%rsp), %rdi
callq 0x134520
jmp 0x4e1e1a
jmp 0x4e1e1c
leaq 0x360(%rsp), %rdi
leaq 0x340(%rsp), %rsi
leaq 0x308(%rsp), %rdx
callq 0x29dc80
jmp 0x4e1e3b
leaq 0x308(%rsp), %rdi
callq 0x11b838
testb $0x1, 0x304(%rsp)
jne 0x4e1e54
jmp 0x4e1e61
leaq 0x305(%rsp), %rdi
callq 0x11b820
testb $0x1, 0x306(%rsp)
jne 0x4e1e6d
jmp 0x4e1e7a
leaq 0x307(%rsp), %rdi
callq 0x11b820
leaq 0x340(%rsp), %rdi
callq 0x11b838
testb $0x1, 0x32a(%rsp)
jne 0x4e1e93
jmp 0x4e1ea0
leaq 0x32b(%rsp), %rdi
callq 0x11b820
testb $0x1, 0x33e(%rsp)
jne 0x4e1eac
jmp 0x4e1eb9
leaq 0x33f(%rsp), %rdi
callq 0x11b820
movq 0x48(%rsp), %rax
movq 0x68(%rax), %rsi
movq %rsi, 0x20(%rsp)
leaq 0x218(%rsp), %rdi
callq 0x3dc450
jmp 0x4e1ed6
leaq 0x228(%rsp), %rax
movq %rax, 0x18(%rsp)
leaq 0xc638e(%rip), %rsi     # 0x5a8278
leaq 0x1d8(%rsp), %rdi
leaq 0x360(%rsp), %rdx
callq 0x3784f0
jmp 0x4e1f01
leaq 0xc6382(%rip), %rdx     # 0x5a828a
leaq 0x1f8(%rsp), %rdi
leaq 0x1d8(%rsp), %rsi
callq 0x29dc30
jmp 0x4e1f1f
leaq 0x198(%rsp), %rdi
movl $0x7f7c, %esi           # imm = 0x7F7C
callq 0x371f20
jmp 0x4e1f33
leaq 0xc4fd9(%rip), %rsi     # 0x5a6f13
leaq 0x1b8(%rsp), %rdi
leaq 0x198(%rsp), %rdx
callq 0x29dd70
jmp 0x4e1f51
movq 0x18(%rsp), %rdx
leaq 0x258(%rsp), %rdi
movl $0x9, %esi
leaq 0x1f8(%rsp), %rcx
leaq 0x1b8(%rsp), %r8
callq 0x3741e0
jmp 0x4e1f7a
movq 0x20(%rsp), %rdi
leaq 0x258(%rsp), %rsi
callq 0x371e40
jmp 0x4e1f8e
leaq 0x258(%rsp), %rdi
callq 0x371330
leaq 0x1b8(%rsp), %rdi
callq 0x11b838
leaq 0x198(%rsp), %rdi
callq 0x11b838
leaq 0x1f8(%rsp), %rdi
callq 0x11b838
leaq 0x1d8(%rsp), %rdi
callq 0x11b838
leaq 0x218(%rsp), %rdi
callq 0x3706b0
callq 0x2821f0
movq %rax, 0x3a0(%rsp)
leaq 0x360(%rsp), %rdi
callq 0x11b838
jmp 0x4e252a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e20d6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e20bb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e2095
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e207a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
leaq 0x308(%rsp), %rdi
callq 0x11b838
testb $0x1, 0x304(%rsp)
jne 0x4e2086
jmp 0x4e2093
leaq 0x305(%rsp), %rdi
callq 0x11b820
jmp 0x4e2095
testb $0x1, 0x306(%rsp)
jne 0x4e20a1
jmp 0x4e20ae
leaq 0x307(%rsp), %rdi
callq 0x11b820
leaq 0x340(%rsp), %rdi
callq 0x11b838
testb $0x1, 0x32a(%rsp)
jne 0x4e20c7
jmp 0x4e20d4
leaq 0x32b(%rsp), %rdi
callq 0x11b820
jmp 0x4e20d6
testb $0x1, 0x33e(%rsp)
jne 0x4e20e2
jmp 0x4e20ef
leaq 0x33f(%rsp), %rdi
callq 0x11b820
jmp 0x4e253a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e21e3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e21d6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e21c9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e21bc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e21af
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e21a2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
leaq 0x258(%rsp), %rdi
callq 0x371330
leaq 0x1b8(%rsp), %rdi
callq 0x11b838
leaq 0x198(%rsp), %rdi
callq 0x11b838
leaq 0x1f8(%rsp), %rdi
callq 0x11b838
leaq 0x1d8(%rsp), %rdi
callq 0x11b838
leaq 0x218(%rsp), %rdi
callq 0x3706b0
leaq 0x360(%rsp), %rdi
callq 0x11b838
jmp 0x4e253a
movq 0x390(%rsp), %rdi
callq 0x39cbf0
testb $0x1, %al
jne 0x4e220b
jmp 0x4e22cd
movq 0x390(%rsp), %rdi
callq 0x39d260
testb $0x1, %al
jne 0x4e221e
jmp 0x4e225f
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x390(%rsp), %rsi
callq 0x284bd0
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x380(%rsp), %rsi
callq 0x284bd0
movq 0x388(%rsp), %rax
movq %rax, 0x3a0(%rsp)
jmp 0x4e252a
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x390(%rsp), %rsi
callq 0x284bd0
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x388(%rsp), %rsi
callq 0x284bd0
cmpq $0x0, 0x380(%rsp)
je 0x4e22ab
movq 0x380(%rsp), %rax
movq %rax, 0x3a0(%rsp)
jmp 0x4e252a
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0xd398d(%rip), %rsi     # 0x5b5c48
callq 0x4e35e0
movq %rax, 0x3a0(%rsp)
jmp 0x4e252a
xorl %eax, %eax
cmpq 0x388(%rsp), %rax
je 0x4e2519
xorl %eax, %eax
cmpq 0x380(%rsp), %rax
je 0x4e2519
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x390(%rsp), %rsi
leaq 0x388(%rsp), %rdx
leaq 0x380(%rsp), %rcx
callq 0x4e36e0
movq %rax, 0x190(%rsp)
cmpq $0x0, 0x190(%rsp)
je 0x4e234f
movq 0x190(%rsp), %rdi
movq (%rdi), %rax
callq *0x30(%rax)
testb $0x1, %al
jne 0x4e233a
jmp 0x4e234f
movq 0x190(%rsp), %rax
movq %rax, 0x3a0(%rsp)
jmp 0x4e252a
movq 0x48(%rsp), %rax
movq 0x68(%rax), %rax
movq %rax, 0x8(%rsp)
leaq 0xb8(%rsp), %rdi
callq 0x251250
leaq 0x97(%rsp), %rdi
movq %rdi, 0x10(%rsp)
callq 0x11b6f0
movq 0x10(%rsp), %rdx
leaq 0xc5f24(%rip), %rsi     # 0x5a82ac
leaq 0x98(%rsp), %rdi
callq 0x134520
jmp 0x4e2397
leaq 0x50(%rsp), %rdi
movl $0x7fa6, %esi           # imm = 0x7FA6
callq 0x371f20
jmp 0x4e23a8
leaq 0xc4b64(%rip), %rsi     # 0x5a6f13
leaq 0x70(%rsp), %rdi
leaq 0x50(%rsp), %rdx
callq 0x29dd70
jmp 0x4e23c0
leaq 0xe8(%rsp), %rdi
movl $0x9, %esi
leaq 0xb8(%rsp), %rdx
leaq 0x98(%rsp), %rcx
leaq 0x70(%rsp), %r8
callq 0x3741e0
jmp 0x4e23e9
movq 0x8(%rsp), %rdi
leaq 0xe8(%rsp), %rsi
callq 0x371e40
jmp 0x4e23fd
leaq 0xe8(%rsp), %rdi
callq 0x371330
leaq 0x70(%rsp), %rdi
callq 0x11b838
leaq 0x50(%rsp), %rdi
callq 0x11b838
leaq 0x98(%rsp), %rdi
callq 0x11b838
leaq 0x97(%rsp), %rdi
callq 0x11b820
leaq 0xb8(%rsp), %rdi
callq 0x2512e0
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x190(%rsp), %rsi
callq 0x284bd0
jmp 0x4e2519
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e24fd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e24f0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e24e6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
jmp 0x4e24dc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x330(%rsp)
movl %eax, 0x32c(%rsp)
leaq 0xe8(%rsp), %rdi
callq 0x371330
leaq 0x70(%rsp), %rdi
callq 0x11b838
leaq 0x50(%rsp), %rdi
callq 0x11b838
leaq 0x98(%rsp), %rdi
callq 0x11b838
leaq 0x97(%rsp), %rdi
callq 0x11b820
leaq 0xb8(%rsp), %rdi
callq 0x2512e0
jmp 0x4e253a
jmp 0x4e251b
jmp 0x4e251d
callq 0x2821f0
movq %rax, 0x3a0(%rsp)
movq 0x3a0(%rsp), %rax
addq $0x3a8, %rsp            # imm = 0x3A8
retq
movq 0x330(%rsp), %rdi
callq 0x11b4e0
nopw (%rax,%rax)