// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::expression_generator<double>::synthesize_cob_expression::process(exprtk::parser<double>::expression_generator<double>&, exprtk::details::operator_type const&, exprtk::details::expression_node<double>* (&) [2])
static inline expression_node_ptr process(expression_generator<Type>& expr_gen,
                                                      const details::operator_type& operation,
                                                      expression_node_ptr (&branch)[2])
            {
               const Type c = static_cast<details::literal_node<Type>*>(branch[0])->value();

               details::free_node(*expr_gen.node_allocator_,branch[0]);

               if (std::equal_to<T>()(T(0),c) && (details::e_mul == operation))
               {
                  details::free_node(*expr_gen.node_allocator_,branch[1]);

                  return expr_gen(T(0));
               }
               else if (std::equal_to<T>()(T(0),c) && (details::e_div == operation))
               {
                  details::free_node(*expr_gen.node_allocator_, branch[1]);

                  return expr_gen(T(0));
               }
               else if (std::equal_to<T>()(T(0),c) && (details::e_add == operation))
                  return branch[1];
               else if (std::equal_to<T>()(T(1),c) && (details::e_mul == operation))
                  return branch[1];

               if (details::is_cob_node(branch[1]))
               {
                  // Simplify expressions of the form:
                  // 1. (1 * (2 * (3 * (4 * (5 * (6 * (7 * (8 * (9 + x))))))))) --> 40320 * (9 + x)
                  // 2. (1 + (2 + (3 + (4 + (5 + (6 + (7 + (8 + (9 + x))))))))) --> 45 + x
                  if (
                       (details::e_mul == operation) ||
                       (details::e_add == operation)
                     )
                  {
                     details::cob_base_node<Type>* cobnode = static_cast<details::cob_base_node<Type>*>(branch[1]);

                     if (operation == cobnode->operation())
                     {
                        switch (operation)
                        {
                           case details::e_add : cobnode->set_c(c + cobnode->c()); break;
                           case details::e_mul : cobnode->set_c(c * cobnode->c()); break;
                           default             : return error_node();
                        }

                        return cobnode;
                     }
                  }

                  if (operation == details::e_mul)
                  {
                     details::cob_base_node<Type>* cobnode = static_cast<details::cob_base_node<Type>*>(branch[1]);
                     details::operator_type cob_opr = cobnode->operation();

                     if (
                          (details::e_div == cob_opr) ||
                          (details::e_mul == cob_opr)
                        )
                     {
                        switch (cob_opr)
                        {
                           case details::e_div : cobnode->set_c(c * cobnode->c()); break;
                           case details::e_mul : cobnode->set_c(cobnode->c() / c); break;
                           default             : return error_node();
                        }

                        return cobnode;
                     }
                  }
                  else if (operation == details::e_div)
                  {
                     details::cob_base_node<Type>* cobnode = static_cast<details::cob_base_node<Type>*>(branch[1]);
                     details::operator_type cob_opr = cobnode->operation();

                     if (
                          (details::e_div == cob_opr) ||
                          (details::e_mul == cob_opr)
                        )
                     {
                        details::expression_node<Type>* new_cobnode = error_node();

                        switch (cob_opr)
                        {
                           case details::e_div : new_cobnode = expr_gen.node_allocator_->
                                                    template allocate_tt<typename details::cob_node<Type,details::mul_op<Type> > >
                                                       (c / cobnode->c(), cobnode->move_branch(0));
                                                 break;

                           case details::e_mul : new_cobnode = expr_gen.node_allocator_->
                                                    template allocate_tt<typename details::cob_node<Type,details::div_op<Type> > >
                                                       (c / cobnode->c(), cobnode->move_branch(0));
                                                 break;

                           default             : return error_node();
                        }

                        details::free_node(*expr_gen.node_allocator_,branch[1]);

                        return new_cobnode;
                     }
                  }
               }
               #ifndef exprtk_disable_enhanced_features
               else if (details::is_sf3ext_node(branch[1]))
               {
                  expression_node_ptr result = error_node();

                  const bool synthesis_result =
                     synthesize_sf4ext_expression::template compile_right<ctype>
                        (expr_gen, c, operation, branch[1], result);

                  if (synthesis_result)
                  {
                     details::free_node(*expr_gen.node_allocator_,branch[1]);

                     return result;
                  }
               }
               #endif

               switch (operation)
               {
                  #define case_stmt(op0, op1)                                                      \
                  case op0 : return expr_gen.node_allocator_->                                     \
                                template allocate_tt<typename details::cob_node<Type,op1<Type> > > \
                                   (c,  branch[1]);                                                \

                  basic_opr_switch_statements
                  extended_opr_switch_statements
                  #undef case_stmt
                  default : return error_node();
               }
            }

// Assembly:
subq $0x158, %rsp            # imm = 0x158
movq %rdi, 0x148(%rsp)
movq %rsi, 0x140(%rsp)
movq %rdx, 0x138(%rsp)
movq 0x138(%rsp), %rax
movq (%rax), %rdi
callq 0x284bc0
movsd %xmm0, 0x130(%rsp)
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x138(%rsp), %rsi
callq 0x284bd0
xorps %xmm0, %xmm0
movsd %xmm0, 0x120(%rsp)
leaq 0x12f(%rsp), %rdi
leaq 0x120(%rsp), %rsi
leaq 0x130(%rsp), %rdx
callq 0x266f00
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, 0x96(%rsp)
jne 0x3e51bc
jmp 0x3e51d5
movq 0x140(%rsp), %rcx
movl $0x4, %eax
cmpl (%rcx), %eax
sete %al
movb %al, 0x96(%rsp)
movb 0x96(%rsp), %al
testb $0x1, %al
jne 0x3e51e2
jmp 0x3e522d
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x138(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
movq 0x148(%rsp), %rdi
xorps %xmm0, %xmm0
movsd %xmm0, 0x118(%rsp)
leaq 0x118(%rsp), %rsi
callq 0x284c20
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
xorps %xmm0, %xmm0
movsd %xmm0, 0x108(%rsp)
leaq 0x117(%rsp), %rdi
leaq 0x108(%rsp), %rsi
leaq 0x130(%rsp), %rdx
callq 0x266f00
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, 0x95(%rsp)
jne 0x3e5268
jmp 0x3e5281
movq 0x140(%rsp), %rcx
movl $0x5, %eax
cmpl (%rcx), %eax
sete %al
movb %al, 0x95(%rsp)
movb 0x95(%rsp), %al
testb $0x1, %al
jne 0x3e528e
jmp 0x3e52d9
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x138(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
movq 0x148(%rsp), %rdi
xorps %xmm0, %xmm0
movsd %xmm0, 0x100(%rsp)
leaq 0x100(%rsp), %rsi
callq 0x284c20
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
xorps %xmm0, %xmm0
movsd %xmm0, 0xf0(%rsp)
leaq 0xff(%rsp), %rdi
leaq 0xf0(%rsp), %rsi
leaq 0x130(%rsp), %rdx
callq 0x266f00
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, 0x94(%rsp)
jne 0x3e5314
jmp 0x3e532d
movq 0x140(%rsp), %rcx
movl $0x2, %eax
cmpl (%rcx), %eax
sete %al
movb %al, 0x94(%rsp)
movb 0x94(%rsp), %al
testb $0x1, %al
jne 0x3e533a
jmp 0x3e5353
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movsd 0x1b5ce5(%rip), %xmm0   # 0x59b040
movsd %xmm0, 0xe0(%rsp)
leaq 0xef(%rsp), %rdi
leaq 0xe0(%rsp), %rsi
leaq 0x130(%rsp), %rdx
callq 0x266f00
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, 0x93(%rsp)
jne 0x3e5393
jmp 0x3e53ac
movq 0x140(%rsp), %rcx
movl $0x4, %eax
cmpl (%rcx), %eax
sete %al
movb %al, 0x93(%rsp)
movb 0x93(%rsp), %al
testb $0x1, %al
jne 0x3e53b9
jmp 0x3e53d2
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
jmp 0x3e53d4
jmp 0x3e53d6
jmp 0x3e53d8
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x484260
testb $0x1, %al
jne 0x3e53f2
jmp 0x3e5830
movq 0x140(%rsp), %rcx
movl $0x4, %eax
cmpl (%rcx), %eax
je 0x3e5418
movq 0x140(%rsp), %rcx
movl $0x2, %eax
cmpl (%rcx), %eax
jne 0x3e553c
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0xd8(%rsp)
movq 0x140(%rsp), %rax
movl (%rax), %eax
movl %eax, 0x8c(%rsp)
movq 0xd8(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl 0x8c(%rsp), %eax
cmpl %ecx, %eax
jne 0x3e553a
movq 0x140(%rsp), %rax
movl (%rax), %eax
movl %eax, 0x88(%rsp)
subl $0x2, %eax
je 0x3e5485
jmp 0x3e5474
movl 0x88(%rsp), %eax
subl $0x4, %eax
je 0x3e54cf
jmp 0x3e5513
movq 0xd8(%rsp), %rax
movq %rax, 0x78(%rsp)
movsd 0x130(%rsp), %xmm0
movsd %xmm0, 0x80(%rsp)
movq 0xd8(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x78(%rsp), %rdi
movaps %xmm0, %xmm1
movsd 0x80(%rsp), %xmm0
addsd %xmm1, %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e5525
movq 0xd8(%rsp), %rax
movq %rax, 0x68(%rsp)
movsd 0x130(%rsp), %xmm0
movsd %xmm0, 0x70(%rsp)
movq 0xd8(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x68(%rsp), %rdi
movaps %xmm0, %xmm1
movsd 0x70(%rsp), %xmm0
mulsd %xmm1, %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e5525
callq 0x2821f0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0xd8(%rsp), %rax
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
jmp 0x3e553c
movq 0x140(%rsp), %rax
cmpl $0x4, (%rax)
jne 0x3e5654
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0xd0(%rsp)
movq 0xd0(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, 0xcc(%rsp)
movl $0x5, %eax
cmpl 0xcc(%rsp), %eax
je 0x3e5596
movl $0x4, %eax
cmpl 0xcc(%rsp), %eax
jne 0x3e564f
movl 0xcc(%rsp), %eax
movl %eax, 0x64(%rsp)
subl $0x4, %eax
je 0x3e55f7
jmp 0x3e55a8
movl 0x64(%rsp), %eax
subl $0x5, %eax
jne 0x3e5628
jmp 0x3e55b3
movq 0xd0(%rsp), %rax
movq %rax, 0x50(%rsp)
movsd 0x130(%rsp), %xmm0
movsd %xmm0, 0x58(%rsp)
movq 0xd0(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x50(%rsp), %rdi
movaps %xmm0, %xmm1
movsd 0x58(%rsp), %xmm0
mulsd %xmm1, %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e563a
movq 0xd0(%rsp), %rax
movq %rax, 0x48(%rsp)
movq 0xd0(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x48(%rsp), %rdi
divsd 0x130(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e563a
callq 0x2821f0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0xd0(%rsp), %rax
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
jmp 0x3e582b
movq 0x140(%rsp), %rax
cmpl $0x5, (%rax)
jne 0x3e5829
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0xc0(%rsp)
movq 0xc0(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, 0xbc(%rsp)
movl $0x5, %eax
cmpl 0xbc(%rsp), %eax
je 0x3e56ae
movl $0x4, %eax
cmpl 0xbc(%rsp), %eax
jne 0x3e5827
callq 0x2821f0
movq %rax, 0xb0(%rsp)
movl 0xbc(%rsp), %eax
movl %eax, 0x44(%rsp)
subl $0x4, %eax
je 0x3e5763
jmp 0x3e56d1
movl 0x44(%rsp), %eax
subl $0x5, %eax
jne 0x3e57e3
jmp 0x3e56e0
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x30(%rsp)
movsd 0x130(%rsp), %xmm0
movsd %xmm0, 0x28(%rsp)
movq 0xc0(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movaps %xmm0, %xmm1
movsd 0x28(%rsp), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, 0x38(%rsp)
movq 0xc0(%rsp), %rdi
movq $0x0, 0xa8(%rsp)
movq (%rdi), %rax
leaq 0xa8(%rsp), %rsi
callq *0x50(%rax)
movq 0x30(%rsp), %rdi
movsd 0x38(%rsp), %xmm0
movq %rax, %rsi
callq 0x484470
movq %rax, 0xb0(%rsp)
jmp 0x3e57f5
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movsd 0x130(%rsp), %xmm0
movsd %xmm0, 0x10(%rsp)
movq 0xc0(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movaps %xmm0, %xmm1
movsd 0x10(%rsp), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, 0x20(%rsp)
movq 0xc0(%rsp), %rdi
movq $0x0, 0xa0(%rsp)
movq (%rdi), %rax
leaq 0xa0(%rsp), %rsi
callq *0x50(%rax)
movq 0x18(%rsp), %rdi
movsd 0x20(%rsp), %xmm0
movq %rax, %rsi
callq 0x4842c0
movq %rax, 0xb0(%rsp)
jmp 0x3e57f5
callq 0x2821f0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x138(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
movq 0xb0(%rsp), %rax
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
jmp 0x3e5829
jmp 0x3e582b
jmp 0x3e58d2
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x4858f0
testb $0x1, %al
jne 0x3e584a
jmp 0x3e58d0
callq 0x2821f0
movq %rax, 0x98(%rsp)
movq 0x148(%rsp), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x140(%rsp), %rsi
movq 0x138(%rsp), %rdx
addq $0x8, %rdx
leaq 0x98(%rsp), %rcx
callq 0x48ce80
andb $0x1, %al
movb %al, 0x97(%rsp)
testb $0x1, 0x97(%rsp)
je 0x3e58ce
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x138(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
movq 0x98(%rsp), %rax
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
jmp 0x3e58d0
jmp 0x3e58d2
movq 0x140(%rsp), %rax
movl (%rax), %eax
addl $-0x2, %eax
movl %eax, %ecx
movq %rcx, 0x8(%rsp)
subl $0x19, %eax
ja 0x3e5c91
movq 0x8(%rsp), %rax
leaq 0x1b7a25(%rip), %rcx    # 0x59d320
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x4843e0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x484350
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x484470
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x4842c0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d280
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d310
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d3a0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d430
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d4c0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d550
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d5e0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d670
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d700
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d790
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d820
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d8b0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d940
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
movq 0x148(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x130(%rsp), %xmm0
movq 0x138(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x48d9d0
movq %rax, 0x150(%rsp)
jmp 0x3e5c9e
callq 0x2821f0
movq %rax, 0x150(%rsp)
movq 0x150(%rsp), %rax
addq $0x158, %rsp            # imm = 0x158
retq
nop