// File: cjc12[P]ezSTL/src/../include/rbtree.h
// Function: ezSTL::rbtree<int, ezSTL::less<int>, ezSTL::allocator<ezSTL::__rbtree_node<int>>>::insert_fixup(ezSTL::__rbtree_node<int>*)
void rbtree<T, Compare, Alloc>::insert_fixup(link_type now) {
		while (now != root() && now->parent->color == __rbtree_red) {
			if (now->parent == now->parent->parent->left) {
				link_type uncle = now->parent->parent->right;
				// if  parent and uncle are both red, case 1
				if (uncle && uncle->color == __rbtree_red) {
					now->parent->color = __rbtree_black;
					uncle->color = __rbtree_black;
					now->parent->parent->color = __rbtree_red;
					now = now->parent->parent;
				}
				// if no uncle or uncle is black
				else {
					// if now is a right child, case 2
					if (now == now->parent->right) {
						now = now->parent;
						left_rotate(now);
					}
					// if now is a left child, case 3
					now->parent->color = __rbtree_black;
					now->parent->parent->color = __rbtree_red;
					right_rotate(now->parent->parent);
				}
			}
			else {
				link_type uncle = now->parent->parent->left;
				// if  parent and uncle are both red
				if (uncle && uncle->color == __rbtree_red) {
					now->parent->color = __rbtree_black;
					uncle->color = __rbtree_black;
					now->parent->parent->color = __rbtree_red;
					now = now->parent->parent;
				}
				// if no uncle or uncle is black
				else {
					// if now is a left child
					if (now == now->parent->left) {
						now = now->parent;
						right_rotate(now);
					}
					now->parent->color = __rbtree_black;
					now->parent->parent->color = __rbtree_red;
					left_rotate(now->parent->parent);
				}
			}
		}
		// root is always black
		root()->color = __rbtree_black;
	}

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x30(%rsp)
movq %rsi, 0x28(%rsp)
movq 0x30(%rsp), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rdi
movq 0x28(%rsp), %rax
movq %rax, (%rsp)
callq 0x12390
movq (%rsp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, 0xf(%rsp)
je 0x125f7
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movb (%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
sete %al
movb %al, 0xf(%rsp)
movb 0xf(%rsp), %al
testb $0x1, %al
jne 0x12604
jmp 0x127c6
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x28(%rsp), %rcx
movq 0x8(%rcx), %rcx
movq 0x8(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jne 0x126f4
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq 0x18(%rax), %rax
movq %rax, 0x20(%rsp)
cmpq $0x0, 0x20(%rsp)
je 0x1268b
movq 0x20(%rsp), %rax
movb (%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x1268b
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movb $0x1, (%rax)
movq 0x20(%rsp), %rax
movb $0x1, (%rax)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movb $0x0, (%rax)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, 0x28(%rsp)
jmp 0x126ef
movq 0x28(%rsp), %rax
movq 0x28(%rsp), %rcx
movq 0x8(%rcx), %rcx
cmpq 0x18(%rcx), %rax
jne 0x126bc
movq 0x10(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rsi
callq 0x12800
movq 0x10(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movb $0x1, (%rax)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movb $0x0, (%rax)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rsi
callq 0x12910
jmp 0x127c1
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, 0x18(%rsp)
cmpq $0x0, 0x18(%rsp)
je 0x1275b
movq 0x18(%rsp), %rax
movb (%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x1275b
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movb $0x1, (%rax)
movq 0x18(%rsp), %rax
movb $0x1, (%rax)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movb $0x0, (%rax)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, 0x28(%rsp)
jmp 0x127bf
movq 0x28(%rsp), %rax
movq 0x28(%rsp), %rcx
movq 0x8(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jne 0x1278c
movq 0x10(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rsi
callq 0x12910
movq 0x10(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movb $0x1, (%rax)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movb $0x0, (%rax)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rsi
callq 0x12800
jmp 0x127c1
jmp 0x125b8
movq 0x10(%rsp), %rdi
callq 0x12390
movb $0x1, (%rax)
addq $0x38, %rsp
retq
nopl (%rax,%rax)