Make uppercase some randomly selected characters.

        The characters can be in a (mix of) string, list, tuple or set.

        Keyword arguments:
        lst -- the object to make all chars uppercase, which can be a (mix of)
        list, tuple, string or set.
        uppercase -- Number of characters to be set as uppercase.

def make_chars_uppercase(
            lst: Union[list, tuple, str, set],
            uppercase: int
    ) -> Union[list, tuple, str, set]:
        """Make uppercase some randomly selected characters.

        The characters can be in a (mix of) string, list, tuple or set.

        Keyword arguments:
        lst -- the object to make all chars uppercase, which can be a (mix of)
        list, tuple, string or set.
        uppercase -- Number of characters to be set as uppercase.

        """
        if not isinstance(lst, (list, tuple, str, set)):
            raise TypeError('lst must be a list, a tuple, a set or a string')
        if not isinstance(uppercase, int):
            raise TypeError('uppercase must be an integer')
        if uppercase < 0:
            raise ValueError('uppercase must be bigger than zero')

        lowercase = Aux.lowercase_count(lst)
        if uppercase == 0 or lowercase == 0:
            return lst
        elif uppercase >= lowercase:
            # Make it all uppercase
            return Aux.make_all_uppercase(lst)

        arr = list(lst)

        # Check if at least an element is supported
        # This is required to avoid an infinite loop below
        supported = False
        for element in arr:
            if isinstance(element, (list, tuple, str, set)):
                supported = True
                break

        if supported:
            # Pick a word at random, then make a character uppercase
            count = 0
            while count < uppercase:
                windex = randbelow(len(arr))
                element = arr[windex]
                # Skip unsupported types or empty ones
                if element:
                    aux = element
                    if isinstance(element, str):
                        aux = Aux._make_one_char_uppercase(element)
                    elif isinstance(element, (list, tuple, set)):
                        aux = Aux.make_chars_uppercase(element, 1)

                    if aux != element:
                        arr[windex] = aux
                        count += 1

        if isinstance(lst, set):
            return set(arr)
        elif isinstance(lst, str):
            return ''.join(arr)
        elif isinstance(lst, tuple):
            return tuple(arr)

        return arr