// Path: src/main/java/org/fest/util/ToString.java
// public static @Nullable String toStringOf(@Nullable Object o) {
//   if (isArray(o)) {
//     return Arrays.format(o);
//   }
//   if (o instanceof Calendar) {
//     return toStringOf(o);
//   }
//   if (o instanceof Class<?>) {
//     return toStringOf((Class<?>) o);
//   }
//   if (o instanceof Collection<?>) {
//     return toStringOf((Collection<?>) o);
//   }
//   if (o instanceof Date) {
//     return toStringOf(o);
//   }
//   if (o instanceof Float) {
//     return toStringOf((Float) o);
//   }
//   if (o instanceof Long) {
//     return toStringOf((Long) o);
//   }
//   if (o instanceof File) {
//     return toStringOf((File) o);
//   }
//   if (o instanceof Map<?, ?>) {
//     return toStringOf((Map<?, ?>) o);
//   }
//   if (o instanceof String) {
//     return quote((String) o);
//   }
//   if (o instanceof Comparator) {
//     return toStringOf((Comparator<?>) o);
//   }
//   return o == null ? null : o.toString();
// }


import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import static org.fest.util.ToString.toStringOf;

  /**
   * Returns the {@code String} representation of the given map, or {@code null} if the given map is {@code null}.
   *
   * @param map the map to format.
   * @return the {@code String} representation of the given map.
   */
  public static @Nullable String format(@Nullable Map<?, ?> map) {
    if (map == null) {
      return null;
    }
    Iterator<?> i = map.entrySet().iterator();
    if (!i.hasNext()) {
      return "{}";
    }
    StringBuilder buffer = new StringBuilder();
    buffer.append("{");
    for (; ; ) {
      Entry<?, ?> e = (Entry<?, ?>) i.next();
      buffer.append(format(map, e.getKey()));
      buffer.append('=');
      buffer.append(format(map, e.getValue()));
      if (!i.hasNext()) {
        return buffer.append("}").toString();
      }
      buffer.append(", ");
    }
  }

  private static @Nullable Object format(@NotNull Map<?, ?> map, @Nullable Object o) {
// Path: src/main/java/org/fest/util/ToString.java
// public static @Nullable String toStringOf(@Nullable Object o) {
//   if (isArray(o)) {
//     return Arrays.format(o);
//   }
//   if (o instanceof Calendar) {
//     return toStringOf(o);
//   }
//   if (o instanceof Class<?>) {
//     return toStringOf((Class<?>) o);
//   }
//   if (o instanceof Collection<?>) {
//     return toStringOf((Collection<?>) o);
//   }
//   if (o instanceof Date) {
//     return toStringOf(o);
//   }
//   if (o instanceof Float) {
//     return toStringOf((Float) o);
//   }
//   if (o instanceof Long) {
//     return toStringOf((Long) o);
//   }
//   if (o instanceof File) {
//     return toStringOf((File) o);
//   }
//   if (o instanceof Map<?, ?>) {
//     return toStringOf((Map<?, ?>) o);
//   }
//   if (o instanceof String) {
//     return quote((String) o);
//   }
//   if (o instanceof Comparator) {
//     return toStringOf((Comparator<?>) o);
//   }
//   return o == null ? null : o.toString();
// }


// Path: src/main/java/org/fest/util/Maps.java
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import static org.fest.util.ToString.toStringOf;


  /**
   * Returns the {@code String} representation of the given map, or {@code null} if the given map is {@code null}.
   *
   * @param map the map to format.
   * @return the {@code String} representation of the given map.
   */
  public static @Nullable String format(@Nullable Map<?, ?> map) {
    if (map == null) {
      return null;
    }
    Iterator<?> i = map.entrySet().iterator();
    if (!i.hasNext()) {
      return "{}";
    }
    StringBuilder buffer = new StringBuilder();
    buffer.append("{");
    for (; ; ) {
      Entry<?, ?> e = (Entry<?, ?>) i.next();
      buffer.append(format(map, e.getKey()));
      buffer.append('=');
      buffer.append(format(map, e.getValue()));
      if (!i.hasNext()) {
        return buffer.append("}").toString();
      }
      buffer.append(", ");
    }
  }

  private static @Nullable Object format(@NotNull Map<?, ?> map, @Nullable Object o) {
    return o == map ? "(this Map)" : toStringOf(o);