// File: /workspace/github_c_makefile_star2_O0/qq-smart[P]qq_sh_server/core/qq_rbtree.c
// Function: qq_rbtree_delete
void
qq_rbtree_delete(qq_rbtree_t *tree, qq_rbtree_node_t *node)
{
    qq_uint_t           red;
    qq_rbtree_node_t  **root, *sentinel, *subst, *temp, *w;

    root = &tree->root;
    sentinel = tree->sentinel;

    if (node->left == sentinel) {
        temp = node->right;
        subst = node;
    } else if (node->right == sentinel) {
        temp = node->left;
        subst = node;
    } else {
        subst = qq_rbtree_min(node->right, sentinel);

        if (subst->left != sentinel) {
            temp = subst->left;
        } else {
            temp = subst->right;
        }
    }

    if (subst == *root) {
        *root = temp;
        qq_rbt_black(temp);

        /* DEBUG stuff */
        node->left = NULL;
        node->right = NULL;
        node->parent = NULL;
        node->key = 0;

        return;
    }

    red = qq_rbt_is_red(subst);

    if (subst == subst->parent->left) {
        subst->parent->left = temp;
    } else {
        subst->parent->right = temp;
    }

    if (subst == node) {
        temp->parent = subst->parent;
    } else {
        if (subst->parent == node) {
            temp->parent = subst;
        } else {
            temp->parent = subst->parent;
        }

        subst->left = node->left;
        subst->right = node->right;
        subst->parent = node->parent;
        qq_rbt_copy_color(subst, node);

        if (node == *root) {
            *root = subst;
        } else {
            if (node == node->parent->left) {
                node->parent->left = subst;
            } else {
                node->parent->right = subst;
            }
        }

        if (subst->left != sentinel) {
            subst->left->parent = subst;
        }

        if (subst->right != sentinel) {
            subst->right->parent = subst;
        }
    }

    /* DEBUG stuff */
    node->left = NULL;
    node->right = NULL;
    node->parent = NULL;
    node->key = 0;

    if (red) {
        return;
    }

    /* a delete fixup */

    while (temp != *root && qq_rbt_is_black(temp)) {
        if (temp == temp->parent->left) {
            w = temp->parent->right;

            if (qq_rbt_is_red(w)) {
                qq_rbt_black(w);
                qq_rbt_red(temp->parent);
                qq_rbtree_left_rotate(root, sentinel, temp->parent);
                w = temp->parent->right;
            }

            if (qq_rbt_is_black(w->left) && qq_rbt_is_black(w->right)) {
                qq_rbt_red(w);
                temp = temp->parent;
            } else {
                if (qq_rbt_is_black(w->right)) {
                    qq_rbt_black(w->left);
                    qq_rbt_red(w);
                    qq_rbtree_right_rotate(root, sentinel, w);
                    w = temp->parent->right;
                }

                qq_rbt_copy_color(w, temp->parent);
                qq_rbt_black(temp->parent);
                qq_rbt_black(w->right);
                qq_rbtree_left_rotate(root, sentinel, temp->parent);
                temp = *root;
            }
        } else {
            w = temp->parent->left;

            if (qq_rbt_is_red(w)) {
                qq_rbt_black(w);
                qq_rbt_red(temp->parent);
                qq_rbtree_right_rotate(root, sentinel, temp->parent);
                w = temp->parent->left;
            }

            if (qq_rbt_is_black(w->left) && qq_rbt_is_black(w->right)) {
                qq_rbt_red(w);
                temp = temp->parent;
            } else {
                if (qq_rbt_is_black(w->left)) {
                    qq_rbt_black(w->right);
                    qq_rbt_red(w);
                    qq_rbtree_left_rotate(root, sentinel, w);
                    w = temp->parent->left;
                }

                qq_rbt_copy_color(w, temp->parent);
                qq_rbt_black(temp->parent);
                qq_rbt_black(w->left);
                qq_rbtree_right_rotate(root, sentinel, temp->parent);
                temp = *root;
            }
        }
    }

    qq_rbt_black(temp);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
cmpq -0x28(%rbp), %rax
jne 0xc4a8
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
jmp 0xc50d
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
cmpq -0x28(%rbp), %rax
jne 0xc4cc
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
jmp 0xc50b
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x28(%rbp), %rsi
callq 0xc980
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
cmpq -0x28(%rbp), %rax
je 0xc4fd
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0xc509
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0xc50b
jmp 0xc50d
movq -0x30(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq (%rcx), %rax
jne 0xc561
movq -0x38(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x38(%rbp), %rax
movb $0x0, 0x20(%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x10(%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x18(%rax)
movq -0x10(%rbp), %rax
movq $0x0, (%rax)
jmp 0xc977
movq -0x30(%rbp), %rax
movzbl 0x20(%rax), %eax
movq %rax, -0x18(%rbp)
movq -0x30(%rbp), %rax
movq -0x30(%rbp), %rcx
movq 0x18(%rcx), %rcx
cmpq 0x8(%rcx), %rax
jne 0xc591
movq -0x38(%rbp), %rcx
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x8(%rax)
jmp 0xc5a1
movq -0x38(%rbp), %rcx
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x10(%rax)
movq -0x30(%rbp), %rax
cmpq -0x10(%rbp), %rax
jne 0xc5c0
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x18(%rax)
jmp 0xc6b8
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rax
cmpq -0x10(%rbp), %rax
jne 0xc5dc
movq -0x30(%rbp), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x18(%rax)
jmp 0xc5ec
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x10(%rbp), %rax
movb 0x20(%rax), %cl
movq -0x30(%rbp), %rax
movb %cl, 0x20(%rax)
movq -0x10(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq (%rcx), %rax
jne 0xc644
movq -0x30(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
jmp 0xc67a
movq -0x10(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x18(%rcx), %rcx
cmpq 0x8(%rcx), %rax
jne 0xc668
movq -0x30(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x8(%rax)
jmp 0xc678
movq -0x30(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x10(%rax)
jmp 0xc67a
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
cmpq -0x28(%rbp), %rax
je 0xc698
movq -0x30(%rbp), %rcx
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, 0x18(%rax)
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
cmpq -0x28(%rbp), %rax
je 0xc6b6
movq -0x30(%rbp), %rcx
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x18(%rax)
jmp 0xc6b8
movq -0x10(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x10(%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x18(%rax)
movq -0x10(%rbp), %rax
movq $0x0, (%rax)
cmpq $0x0, -0x18(%rbp)
je 0xc6f3
jmp 0xc977
jmp 0xc6f5
movq -0x38(%rbp), %rcx
movq -0x20(%rbp), %rdx
xorl %eax, %eax
cmpq (%rdx), %rcx
movb %al, -0x41(%rbp)
je 0xc717
movq -0x38(%rbp), %rax
cmpb $0x0, 0x20(%rax)
setne %al
xorb $-0x1, %al
movb %al, -0x41(%rbp)
movb -0x41(%rbp), %al
testb $0x1, %al
jne 0xc723
jmp 0xc96f
movq -0x38(%rbp), %rax
movq -0x38(%rbp), %rcx
movq 0x18(%rcx), %rcx
cmpq 0x8(%rcx), %rax
jne 0xc853
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
cmpb $0x0, 0x20(%rax)
je 0xc78c
movq -0x40(%rbp), %rax
movb $0x0, 0x20(%rax)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movb $0x1, 0x20(%rax)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0xc180
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
cmpb $0x0, 0x20(%rax)
jne 0xc7c1
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
cmpb $0x0, 0x20(%rax)
jne 0xc7c1
movq -0x40(%rbp), %rax
movb $0x1, 0x20(%rax)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0xc84e
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
cmpb $0x0, 0x20(%rax)
jne 0xc804
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
movb $0x0, 0x20(%rax)
movq -0x40(%rbp), %rax
movb $0x1, 0x20(%rax)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x40(%rbp), %rdx
callq 0xc250
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movb 0x20(%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x20(%rax)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movb $0x0, 0x20(%rax)
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movb $0x0, 0x20(%rax)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0xc180
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0xc96a
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
cmpb $0x0, 0x20(%rax)
je 0xc8a6
movq -0x40(%rbp), %rax
movb $0x0, 0x20(%rax)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movb $0x1, 0x20(%rax)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0xc250
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
cmpb $0x0, 0x20(%rax)
jne 0xc8db
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
cmpb $0x0, 0x20(%rax)
jne 0xc8db
movq -0x40(%rbp), %rax
movb $0x1, 0x20(%rax)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0xc968
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
cmpb $0x0, 0x20(%rax)
jne 0xc91e
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movb $0x0, 0x20(%rax)
movq -0x40(%rbp), %rax
movb $0x1, 0x20(%rax)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x40(%rbp), %rdx
callq 0xc180
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movb 0x20(%rax), %cl
movq -0x40(%rbp), %rax
movb %cl, 0x20(%rax)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
movb $0x0, 0x20(%rax)
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
movb $0x0, 0x20(%rax)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0xc250
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0xc96a
jmp 0xc6f5
movq -0x38(%rbp), %rax
movb $0x0, 0x20(%rax)
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax)