private Node<K, V> ceilingGroup( G group, V value ) {
        if( value == null ) { return null; }

        GroupNode<K, V> groupNode = findGroupNode( group );
        if( groupNode == null ) { return null; }

        Node<K, V> node = groupNode.mRoot;
        Node<K, V> ret  = null;

        if( mValueComparator != null ) {
            Comparator<? super V> comp = mValueComparator;

            while( node != null ) {
                int c = comp.compare( value, node.mValue );

                if( c <= 0 ) {
                    ret = node;
                    node = node.mGroupLeft;
                } else {
                    node = node.mGroupRight;
                }
            }
        } else {
            Comparable<? super V> comp = (Comparable<? super V>)value;

            while( node != null ) {
                int c = comp.compareTo( node.mValue );

                if( c <= 0 ) {
                    ret = node;
                    node = node.mGroupLeft;
                } else {
                    node = node.mGroupRight;
                }
            }
        }

        return ret;
    }