// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::expression_generator<double>::conditional(exprtk::details::expression_node<double>*, exprtk::details::expression_node<double>*, exprtk::details::expression_node<double>*) const
inline expression_node_ptr conditional(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,
                  "ERR255 - Invalid " + invalid_branches + " for 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<details::null_node<T> >();
               }
            }

            expression_node_ptr result = error_node();
            std::string node_name      = "Unknown!";

            if ((0 != consequent) && (0 != alternative))
            {
               result = node_allocator_->allocate<conditional_node_t>(condition, consequent, alternative);
               node_name = "conditional_node_t";
            }
            else
            {
               result = node_allocator_->allocate<cons_conditional_node_t>(condition, consequent);
               node_name = "cons_conditional_node_t";
            }

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

            parser_->set_error(parser_error::make_error(
               parser_error::e_parser,
               token_t(),
               "ERR256 - Failed to synthesize node: " + node_name,
               exprtk_error_location));

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

// Assembly:
subq $0x3d8, %rsp            # imm = 0x3D8
movq %rdi, 0x3c8(%rsp)
movq %rsi, 0x3c0(%rsp)
movq %rdx, 0x3b8(%rsp)
movq %rcx, 0x3b0(%rsp)
movq 0x3c8(%rsp), %rax
movq %rax, 0x58(%rsp)
xorl %eax, %eax
cmpq 0x3c0(%rsp), %rax
je 0x4e2c40
xorl %eax, %eax
cmpq 0x3b8(%rsp), %rax
jne 0x4e3175
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x3c0(%rsp), %rsi
callq 0x284bd0
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x3b8(%rsp), %rsi
callq 0x284bd0
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x3b0(%rsp), %rsi
callq 0x284bd0
movq 0x3c0(%rsp), %rcx
movb $0x0, 0x36e(%rsp)
movb $0x0, 0x35a(%rsp)
xorl %eax, %eax
cmpq %rcx, %rax
jne 0x4e2cd8
leaq 0x36f(%rsp), %rdi
movq %rdi, 0x50(%rsp)
callq 0x11b6f0
movq 0x50(%rsp), %rdx
movb $0x1, 0x36e(%rsp)
leaq 0xc55a6(%rip), %rsi     # 0x5a826d
leaq 0x370(%rsp), %rdi
callq 0x134520
jmp 0x4e2cd6
jmp 0x4e2d0f
leaq 0x35b(%rsp), %rdi
movq %rdi, 0x48(%rsp)
callq 0x11b6f0
movq 0x48(%rsp), %rdx
movb $0x1, 0x35a(%rsp)
leaq 0xd2f4a(%rip), %rsi     # 0x5b5c48
leaq 0x370(%rsp), %rdi
callq 0x134520
jmp 0x4e2d0d
jmp 0x4e2d0f
movq 0x3b8(%rsp), %rcx
movb $0x0, 0x336(%rsp)
movb $0x0, 0x334(%rsp)
xorl %eax, %eax
cmpq %rcx, %rax
jne 0x4e2d65
leaq 0x337(%rsp), %rdi
movq %rdi, 0x40(%rsp)
callq 0x11b6f0
movq 0x40(%rsp), %rdx
movb $0x1, 0x336(%rsp)
leaq 0xc5375(%rip), %rsi     # 0x5a80c9
leaq 0x338(%rsp), %rdi
callq 0x134520
jmp 0x4e2d63
jmp 0x4e2d9c
leaq 0x335(%rsp), %rdi
movq %rdi, 0x38(%rsp)
callq 0x11b6f0
movq 0x38(%rsp), %rdx
movb $0x1, 0x334(%rsp)
leaq 0xd2ebd(%rip), %rsi     # 0x5b5c48
leaq 0x338(%rsp), %rdi
callq 0x134520
jmp 0x4e2d9a
jmp 0x4e2d9c
leaq 0x390(%rsp), %rdi
leaq 0x370(%rsp), %rsi
leaq 0x338(%rsp), %rdx
callq 0x29dc80
jmp 0x4e2dbb
leaq 0x338(%rsp), %rdi
callq 0x11b838
testb $0x1, 0x334(%rsp)
jne 0x4e2dd4
jmp 0x4e2de1
leaq 0x335(%rsp), %rdi
callq 0x11b820
testb $0x1, 0x336(%rsp)
jne 0x4e2ded
jmp 0x4e2dfa
leaq 0x337(%rsp), %rdi
callq 0x11b820
leaq 0x370(%rsp), %rdi
callq 0x11b838
testb $0x1, 0x35a(%rsp)
jne 0x4e2e13
jmp 0x4e2e20
leaq 0x35b(%rsp), %rdi
callq 0x11b820
testb $0x1, 0x36e(%rsp)
jne 0x4e2e2c
jmp 0x4e2e39
leaq 0x36f(%rsp), %rdi
callq 0x11b820
movq 0x58(%rsp), %rax
movq 0x68(%rax), %rsi
movq %rsi, 0x30(%rsp)
leaq 0x248(%rsp), %rdi
callq 0x3dc450
jmp 0x4e2e56
leaq 0x258(%rsp), %rax
movq %rax, 0x28(%rsp)
leaq 0xc54b4(%rip), %rsi     # 0x5a831e
leaq 0x208(%rsp), %rdi
leaq 0x390(%rsp), %rdx
callq 0x3784f0
jmp 0x4e2e81
leaq 0xc54a8(%rip), %rdx     # 0x5a8330
leaq 0x228(%rsp), %rdi
leaq 0x208(%rsp), %rsi
callq 0x29dc30
jmp 0x4e2e9f
leaq 0x1c8(%rsp), %rdi
movl $0x7f30, %esi           # imm = 0x7F30
callq 0x371f20
jmp 0x4e2eb3
leaq 0xc4059(%rip), %rsi     # 0x5a6f13
leaq 0x1e8(%rsp), %rdi
leaq 0x1c8(%rsp), %rdx
callq 0x29dd70
jmp 0x4e2ed1
movq 0x28(%rsp), %rdx
leaq 0x288(%rsp), %rdi
movl $0x9, %esi
leaq 0x228(%rsp), %rcx
leaq 0x1e8(%rsp), %r8
callq 0x3741e0
jmp 0x4e2efa
movq 0x30(%rsp), %rdi
leaq 0x288(%rsp), %rsi
callq 0x371e40
jmp 0x4e2f0e
leaq 0x288(%rsp), %rdi
callq 0x371330
leaq 0x1e8(%rsp), %rdi
callq 0x11b838
leaq 0x1c8(%rsp), %rdi
callq 0x11b838
leaq 0x228(%rsp), %rdi
callq 0x11b838
leaq 0x208(%rsp), %rdi
callq 0x11b838
leaq 0x248(%rsp), %rdi
callq 0x3706b0
callq 0x2821f0
movq %rax, 0x3d0(%rsp)
leaq 0x390(%rsp), %rdi
callq 0x11b838
jmp 0x4e35be
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e3056
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e303b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e3015
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e2ffa
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
leaq 0x338(%rsp), %rdi
callq 0x11b838
testb $0x1, 0x334(%rsp)
jne 0x4e3006
jmp 0x4e3013
leaq 0x335(%rsp), %rdi
callq 0x11b820
jmp 0x4e3015
testb $0x1, 0x336(%rsp)
jne 0x4e3021
jmp 0x4e302e
leaq 0x337(%rsp), %rdi
callq 0x11b820
leaq 0x370(%rsp), %rdi
callq 0x11b838
testb $0x1, 0x35a(%rsp)
jne 0x4e3047
jmp 0x4e3054
leaq 0x35b(%rsp), %rdi
callq 0x11b820
jmp 0x4e3056
testb $0x1, 0x36e(%rsp)
jne 0x4e3062
jmp 0x4e306f
leaq 0x36f(%rsp), %rdi
callq 0x11b820
jmp 0x4e35ce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e3163
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e3156
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e3149
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e313c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e312f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e3122
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
leaq 0x288(%rsp), %rdi
callq 0x371330
leaq 0x1e8(%rsp), %rdi
callq 0x11b838
leaq 0x1c8(%rsp), %rdi
callq 0x11b838
leaq 0x228(%rsp), %rdi
callq 0x11b838
leaq 0x208(%rsp), %rdi
callq 0x11b838
leaq 0x248(%rsp), %rdi
callq 0x3706b0
leaq 0x390(%rsp), %rdi
callq 0x11b838
jmp 0x4e35ce
movq 0x3c0(%rsp), %rdi
callq 0x39cbf0
testb $0x1, %al
jne 0x4e318b
jmp 0x4e3246
movq 0x3c0(%rsp), %rdi
callq 0x39d260
testb $0x1, %al
jne 0x4e319e
jmp 0x4e31df
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x3c0(%rsp), %rsi
callq 0x284bd0
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x3b0(%rsp), %rsi
callq 0x284bd0
movq 0x3b8(%rsp), %rax
movq %rax, 0x3d0(%rsp)
jmp 0x4e35be
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x3c0(%rsp), %rsi
callq 0x284bd0
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x3b8(%rsp), %rsi
callq 0x284bd0
cmpq $0x0, 0x3b0(%rsp)
je 0x4e322b
movq 0x3b0(%rsp), %rax
movq %rax, 0x3d0(%rsp)
jmp 0x4e35be
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x39c7b0
movq %rax, 0x3d0(%rsp)
jmp 0x4e35be
jmp 0x4e3248
callq 0x2821f0
movq %rax, 0x1c0(%rsp)
leaq 0x19f(%rsp), %rdi
movq %rdi, 0x20(%rsp)
callq 0x11b6f0
movq 0x20(%rsp), %rdx
leaq 0xc50d8(%rip), %rsi     # 0x5a834b
leaq 0x1a0(%rsp), %rdi
callq 0x134520
jmp 0x4e3282
leaq 0x19f(%rsp), %rdi
callq 0x11b820
xorl %eax, %eax
cmpq 0x3b8(%rsp), %rax
je 0x4e3343
xorl %eax, %eax
cmpq 0x3b0(%rsp), %rax
je 0x4e3343
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x3c0(%rsp), %rsi
leaq 0x3b8(%rsp), %rdx
leaq 0x3b0(%rsp), %rcx
callq 0x4e4ea0
movq %rax, 0x18(%rsp)
jmp 0x4e32dc
movq 0x18(%rsp), %rax
movq %rax, 0x1c0(%rsp)
leaq 0xc5069(%rip), %rsi     # 0x5a8359
leaq 0x1a0(%rsp), %rdi
callq 0x11b340
jmp 0x4e32ff
jmp 0x4e338d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
leaq 0x19f(%rsp), %rdi
callq 0x11b820
jmp 0x4e35ce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e35af
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x3c0(%rsp), %rsi
leaq 0x3b8(%rsp), %rdx
callq 0x4e4f40
movq %rax, 0x10(%rsp)
jmp 0x4e3368
movq 0x10(%rsp), %rax
movq %rax, 0x1c0(%rsp)
leaq 0xc4fd8(%rip), %rsi     # 0x5a8354
leaq 0x1a0(%rsp), %rdi
callq 0x11b340
jmp 0x4e338b
jmp 0x4e338d
cmpq $0x0, 0x1c0(%rsp)
je 0x4e33d9
movq 0x1c0(%rsp), %rdi
movq (%rdi), %rax
movq 0x30(%rax), %rax
callq *%rax
movb %al, 0xf(%rsp)
jmp 0x4e33af
movb 0xf(%rsp), %al
testb $0x1, %al
jne 0x4e33b9
jmp 0x4e33d9
movq 0x1c0(%rsp), %rax
movq %rax, 0x3d0(%rsp)
movl $0x1, 0x198(%rsp)
jmp 0x4e35a0
movq 0x58(%rsp), %rax
movq 0x68(%rax), %rax
movq %rax, (%rsp)
leaq 0xc0(%rsp), %rdi
callq 0x251250
jmp 0x4e33f5
leaq 0xc4f70(%rip), %rsi     # 0x5a836c
leaq 0xa0(%rsp), %rdi
leaq 0x1a0(%rsp), %rdx
callq 0x3784f0
jmp 0x4e3413
leaq 0x60(%rsp), %rdi
movl $0x7f63, %esi           # imm = 0x7F63
callq 0x371f20
jmp 0x4e3424
leaq 0xc3ae8(%rip), %rsi     # 0x5a6f13
leaq 0x80(%rsp), %rdi
leaq 0x60(%rsp), %rdx
callq 0x29dd70
jmp 0x4e343f
leaq 0xf0(%rsp), %rdi
movl $0x9, %esi
leaq 0xc0(%rsp), %rdx
leaq 0xa0(%rsp), %rcx
leaq 0x80(%rsp), %r8
callq 0x3741e0
jmp 0x4e346b
movq (%rsp), %rdi
leaq 0xf0(%rsp), %rsi
callq 0x371e40
jmp 0x4e347e
leaq 0xf0(%rsp), %rdi
callq 0x371330
leaq 0x80(%rsp), %rdi
callq 0x11b838
leaq 0x60(%rsp), %rdi
callq 0x11b838
leaq 0xa0(%rsp), %rdi
callq 0x11b838
leaq 0xc0(%rsp), %rdi
callq 0x2512e0
movq 0x58(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x1c0(%rsp), %rsi
callq 0x284bd0
jmp 0x4e34d4
callq 0x2821f0
movq %rax, 0x3d0(%rsp)
movl $0x1, 0x198(%rsp)
jmp 0x4e35a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e3591
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e3584
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e357a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
jmp 0x4e356d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x360(%rsp)
movl %eax, 0x35c(%rsp)
leaq 0xf0(%rsp), %rdi
callq 0x371330
leaq 0x80(%rsp), %rdi
callq 0x11b838
leaq 0x60(%rsp), %rdi
callq 0x11b838
leaq 0xa0(%rsp), %rdi
callq 0x11b838
leaq 0xc0(%rsp), %rdi
callq 0x2512e0
jmp 0x4e35af
leaq 0x1a0(%rsp), %rdi
callq 0x11b838
jmp 0x4e35be
leaq 0x1a0(%rsp), %rdi
callq 0x11b838
jmp 0x4e35ce
movq 0x3d0(%rsp), %rax
addq $0x3d8, %rsp            # imm = 0x3D8
retq
movq 0x360(%rsp), %rdi
callq 0x11b4e0
nopl (%rax,%rax)