def reconcile(info_a, info_b):
    """
    Returns a tuple with the changes that must be applied between info_a and info_b
    How reconciliation works:
    > "ADDED" (+): a file should be added
    > "UNCHANGED" (=): a file is common in both directories (same name, hash, size and modified date)
    > "CONFLICT" (!): files in the same path have different hashes, modified dates, but same name
    """
    paths_a = set(info_a.keys())
    paths_b = set(info_b.keys())

    suspected_conflicts = paths_a & paths_b
    # paths_c = (paths_a | paths_b) - suspected_conflicts 
    unchanged_paths = set([x for x in suspected_conflicts if info_a[x] == info_b[x]])
    conflicts = suspected_conflicts - unchanged_paths
    
    patch_info_a = {}
    patch_info_a["ADD"] = [info_b[x] for x in (paths_b - paths_a)]
    patch_info_a["UNCHANGED"] = [info_a[x] for x in unchanged_paths]
    patch_info_a["CONFLICT"] = [info_a[x] for x in conflicts]
    
    patch_info_b = {}
    patch_info_b["ADD"] = [info_a[x] for x in (paths_a - paths_b)]
    patch_info_b["UNCHANGED"] = [info_b[x] for x in unchanged_paths]
    patch_info_b["CONFLICT"] = [info_b[x] for x in conflicts]

    return (patch_info_a,patch_info_b)