code: def add_or_update(data, item, value):
      
      data = data.splitlines()
  
      # to list of bytearrays (this is useful, because their reference passed to
      # other functions can be changed, and it will change objects in arrays
      # unlike strings)
      data = map(lambda x: bytearray(x), data)
  
      # search for the item in raw (ucommented) values
      conf = filter(lambda x: x.strip() and x.strip().split()[0] == item, data)
  
      if conf:
          conf[0][:] = conf[0].strip().split()[0] + " " + value
      else:
          # search for the item in commented values, if found, uncomment it
          comments = filter(
              lambda x: x.strip().startswith("#")
                        and len(x.split("#")) >= 2
                        and x.split("#")[1].split()
                        and x.split("#")[1].split()[0] == item,
              data
          )
  
          if comments:
              comments[0][:] = comments[0].split("#")[1].split()[0] + " " + value
          else:
              # add item, if not found in raw/commented values
              data.append(item + " " + value + "\n")
  
      return "\n".join(map(lambda x: str(x), data))
docs: Add or update value in configuration file format used by proftpd.
  
      Args:
          data (str): Configuration file as string.
          item (str): What option will be added/updated.
          value (str): Value of option.
  
      Returns:
          str: updated configuration