// File: roberty65[P]bServer/common/src/rbtree.c
// Function: _rb_erase_color
static void __rb_erase_color(struct rb_node *node, struct rb_node *parent,
			     struct rb_root *root)
{
	struct rb_node *other;

	while ((!node || rb_is_black(node)) && node != root->rb_node)
	{
		if (parent->rb_left == node)
		{
			other = parent->rb_right;
			if (rb_is_red(other))
			{
				rb_set_black(other);
				rb_set_red(parent);
				__rb_rotate_left(parent, root);
				other = parent->rb_right;
			}
			if ((!other->rb_left || rb_is_black(other->rb_left)) &&
			    (!other->rb_right || rb_is_black(other->rb_right)))
			{
				rb_set_red(other);
				node = parent;
				parent = rb_parent(node);
			}
			else
			{
				if (!other->rb_right || rb_is_black(other->rb_right))
				{
					struct rb_node *o_left;
					if ((o_left = other->rb_left))
						rb_set_black(o_left);
					rb_set_red(other);
					__rb_rotate_right(other, root);
					other = parent->rb_right;
				}
				rb_set_color(other, rb_color(parent));
				rb_set_black(parent);
				if (other->rb_right)
					rb_set_black(other->rb_right);
				__rb_rotate_left(parent, root);
				node = root->rb_node;
				break;
			}
		}
		else
		{
			other = parent->rb_left;
			if (rb_is_red(other))
			{
				rb_set_black(other);
				rb_set_red(parent);
				__rb_rotate_right(parent, root);
				other = parent->rb_left;
			}
			if ((!other->rb_left || rb_is_black(other->rb_left)) &&
			    (!other->rb_right || rb_is_black(other->rb_right)))
			{
				rb_set_red(other);
				node = parent;
				parent = rb_parent(node);
			}
			else
			{
				if (!other->rb_left || rb_is_black(other->rb_left))
				{
					register struct rb_node *o_right;
					if ((o_right = other->rb_right))
						rb_set_black(o_right);
					rb_set_red(other);
					__rb_rotate_left(other, root);
					other = parent->rb_left;
				}
				rb_set_color(other, rb_color(parent));
				rb_set_black(parent);
				if (other->rb_left)
					rb_set_black(other->rb_left);
				__rb_rotate_right(parent, root);
				node = root->rb_node;
				break;
			}
		}
	}
	if (node)
		rb_set_black(node);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0xd571
movq -0x8(%rbp), %rax
movq (%rax), %rcx
andq $0x1, %rcx
xorl %eax, %eax
cmpq $0x0, %rcx
movb %al, -0x31(%rbp)
je 0xd582
movq -0x8(%rbp), %rax
movq -0x18(%rbp), %rcx
cmpq (%rcx), %rax
setne %al
movb %al, -0x31(%rbp)
movb -0x31(%rbp), %al
testb $0x1, %al
jne 0xd58e
jmp 0xd8cb
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
cmpq -0x8(%rbp), %rax
jne 0xd736
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq (%rax), %rax
andq $0x1, %rax
cmpq $0x0, %rax
jne 0xd5f6
jmp 0xd5bf
movq -0x20(%rbp), %rax
movq (%rax), %rcx
orq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xd5cf
movq -0x10(%rbp), %rax
movq (%rax), %rcx
andq $-0x2, %rcx
movq %rcx, (%rax)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xd160
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xd616
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
andq $0x1, %rax
cmpq $0x0, %rax
je 0xd662
movq -0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0xd636
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
andq $0x1, %rax
cmpq $0x0, %rax
je 0xd662
jmp 0xd638
movq -0x20(%rbp), %rax
movq (%rax), %rcx
andq $-0x2, %rcx
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
andq $-0x4, %rax
movq %rax, -0x10(%rbp)
jmp 0xd731
movq -0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0xd682
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
andq $0x1, %rax
cmpq $0x0, %rax
je 0xd6cf
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, %rax
je 0xd6a6
jmp 0xd696
movq -0x28(%rbp), %rax
movq (%rax), %rcx
orq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xd6a6
jmp 0xd6a8
movq -0x20(%rbp), %rax
movq (%rax), %rcx
andq $-0x2, %rcx
movq %rcx, (%rax)
movq -0x20(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xd220
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rax
andq $0x1, %rax
movl %eax, %esi
callq 0xdb90
movq -0x10(%rbp), %rax
movq (%rax), %rcx
orq $0x1, %rcx
movq %rcx, (%rax)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0xd714
jmp 0xd700
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rcx
orq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xd714
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xd160
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0xd8cb
jmp 0xd8c6
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq (%rax), %rax
andq $0x1, %rax
cmpq $0x0, %rax
jne 0xd78c
jmp 0xd755
movq -0x20(%rbp), %rax
movq (%rax), %rcx
orq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xd765
movq -0x10(%rbp), %rax
movq (%rax), %rcx
andq $-0x2, %rcx
movq %rcx, (%rax)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xd220
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xd7ac
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
andq $0x1, %rax
cmpq $0x0, %rax
je 0xd7f8
movq -0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0xd7cc
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
andq $0x1, %rax
cmpq $0x0, %rax
je 0xd7f8
jmp 0xd7ce
movq -0x20(%rbp), %rax
movq (%rax), %rcx
andq $-0x2, %rcx
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
andq $-0x4, %rax
movq %rax, -0x10(%rbp)
jmp 0xd8c4
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xd818
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
andq $0x1, %rax
cmpq $0x0, %rax
je 0xd865
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, %rax
je 0xd83c
jmp 0xd82c
movq -0x30(%rbp), %rax
movq (%rax), %rcx
orq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xd83c
jmp 0xd83e
movq -0x20(%rbp), %rax
movq (%rax), %rcx
andq $-0x2, %rcx
movq %rcx, (%rax)
movq -0x20(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xd160
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rax
andq $0x1, %rax
movl %eax, %esi
callq 0xdb90
movq -0x10(%rbp), %rax
movq (%rax), %rcx
orq $0x1, %rcx
movq %rcx, (%rax)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xd8aa
jmp 0xd896
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rcx
orq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xd8aa
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xd220
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0xd8cb
jmp 0xd8c6
jmp 0xd554
cmpq $0x0, -0x8(%rbp)
je 0xd8e4
jmp 0xd8d4
movq -0x8(%rbp), %rax
movq (%rax), %rcx
orq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xd8e4
addq $0x40, %rsp
popq %rbp
retq
nopw (%rax,%rax)