private void insertNodeGroup( GroupNode<K, V> group, Node<K, V> node, Node<K, V> parent, boolean left ) {
        mModCount++;
        group.mSize++;

        if( parent == null ) {
            group.mRoot = node;
            node.mGroupColor = BLACK;
            return;
        }

        node.mGroupParent = parent;

        if( left ) {
            parent.mGroupLeft = node;
        } else {
            parent.mGroupRight = node;
        }

        while( true ) {
            if( parent == null ) {
                node.mGroupColor = BLACK;
                return;
            }

            node.mGroupColor = RED;

            if( parent.mGroupColor == BLACK ) {
                return;
            }

            Node<K, V> grandParent = parent.mGroupParent;
            Node<K, V> uncle       = (grandParent.mGroupLeft == parent ? grandParent.mGroupRight : grandParent.mGroupLeft);

            if( uncle != null && uncle.mGroupColor == RED ) {
                parent.mGroupColor = BLACK;
                uncle.mGroupColor = BLACK;
                grandParent.mGroupColor = RED;

                node = grandParent;
                parent = grandParent.mGroupParent;
                left = (parent == null || parent.mGroupLeft == node);

                continue;
            }


            if( !left && parent == grandParent.mGroupLeft ) {
                rotateLeftGroup( group, parent );
                parent = node;
                node = parent.mGroupLeft;
                left = true;

            } else if( left && parent == grandParent.mGroupRight ) {
                rotateRightGroup( group, parent );
                parent = node;
                node = parent.mGroupRight;
                left = false;
            }

            parent.mGroupColor = BLACK;
            grandParent.mGroupColor = RED;

            if( left ) {
                rotateRightGroup( group, grandParent );
            } else {
                rotateLeftGroup( group, grandParent );
            }

            break;
        }
    }