def remove_nones(d: dict):
    """
    Recurses through dictionary and removes keys with None values,
    empty strings, empty lists, and empty dicts
    """
    _clean: dict = {}
    for k, v in d.items():
        if isinstance(v, dict):
            d2 = remove_nones(v)
            if len(d2) > 0:
                _clean[k] = d2
        elif isinstance(v, list):
            l2 = []
            for item in v:
                if item:
                    l2.append(item)
            if len(l2) > 0:
                _clean[k] = l2
        elif (v is not None) and (v != ""):
            _clean[k] = v

    return _clean