code: def _GetKeys(self, top_level, keys, depth=1):
      
      match = {}
      if not isinstance(top_level, dict):
        # Return an empty dict here if top_level is a list object, which happens
        # if the plist file is flat.
        return match
      keys = set(keys)
  
      if depth == 1:
        for key in keys:
          match[key] = top_level.get(key, None)
      else:
        for _, parsed_key, parsed_value in RecurseKey(top_level, depth=depth):
          if parsed_key in keys:
            match[parsed_key] = parsed_value
            if set(match.keys()) == keys:
              return match
      return match
docs: Helper function to return keys nested in a plist dict.
  
      By default this function will return the values for the named keys requested
      by a plugin in match dictionary object. The default setting is to look
      a single layer down from the root (same as the check for plugin
      applicability). This level is suitable for most cases.
  
      For cases where there is variability in the name at the first level
      (e.g. it is the MAC addresses of a device, or a UUID) it is possible to
      override the depth limit and use GetKeys to fetch from a deeper level.
  
      E.g.
      Top_Level (root):                                             # depth = 0
      -- Key_Name_is_UUID_Generated_At_Install 1234-5678-8          # depth = 1
      ---- Interesting_SubKey_with_value_to_Process: [Values, ...]  # depth = 2
  
      Args:
        top_level (dict[str, object]): plist top-level key.
        keys: A list of keys that should be returned.
        depth: Defines how many levels deep to check for a match.
  
      Returns:
        A dictionary with just the keys requested or an empty dict if the plist
        is flat, eg. top_level is a list instead of a dict object.