code: private Map<Key<?>, String> getAllInvalidKeys(DependencyExplorerOutput output) {
      Map<Key<?>, String> invalidKeys = new LinkedHashMap<Key<?>, String>();
      
      // Look for errors in the nodes, and either report the error (if its required) or remove the
      // node (if its optional).
      for (Entry<Key<?>, String> error : output.getBindingErrors()) {
        invalidKeys.put(error.getKey(), "Unable to create or inherit binding: " + error.getValue());
      }
      
      GinjectorBindings origin = output.getGraph().getOrigin();
      for (Key<?> key : output.getImplicitlyBoundKeys()) {
        if (origin.isBoundLocallyInChild(key)) {
  
          GinjectorBindings child = origin.getChildWhichBindsLocally(key);
          Binding childBinding = child.getBinding(key);
  
          PrettyPrinter.log(logger, TreeLogger.DEBUG,
              "Marking the key %s as bound in the ginjector %s (implicitly), and in the child"
                  + " %s (%s)", key, origin, child, childBinding.getContext());
  
          // TODO(schmitt): Determine path to binding in child ginjector (requires
          // different DependencyExplorerOutput).
          invalidKeys.put(key,
              PrettyPrinter.format("Already bound in child Ginjector %s. Consider exposing it?",
                  child));
        }
      }
      
      return invalidKeys;
    }
docs: Returns a map from keys that are invalid to errors explaining why each key is invalid.