// Path: kawala-common/src/main/java/com/kaching/platform/common/Strings.java
// public static String format(String template, Object... args) {
//   template = String.valueOf(template); // null -> "null"
// 
//   // start substituting the arguments into the '%s' placeholders
//   StringBuilder builder = new StringBuilder(
//       template.length() + 16 * args.length);
//   int templateStart = 0;
//   int i = 0;
//   while (i < args.length) {
//     int placeholderStart = template.indexOf("%s", templateStart);
//     if (placeholderStart == -1) {
//       break;
//     }
//     builder.append(template.substring(templateStart, placeholderStart));
//     builder.append(args[i++]);
//     templateStart = placeholderStart + 2;
//   }
//   builder.append(template.substring(templateStart));
// 
//   // if we run out of placeholders, append the extra args in square braces
//   if (i < args.length) {
//     builder.append(" [");
//     builder.append(args[i++]);
//     while (i < args.length) {
//       builder.append(", ");
//       builder.append(args[i++]);
//     }
//     builder.append("]");
//   }
// 
//   return builder.toString();
// }
// 
// Path: kawala-common/src/main/java/com/kaching/platform/common/Pair.java
// public class Pair<S, T> {
// 
//   public final S left;
//   public final T right;
// 
//   public static <S, T> Pair<S, T> of(S left, T right) {
//     return new Pair<S, T>(left, right);
//   }
// 
//   public Pair(S left, T right) {
//     this.left = left;
//     this.right = right;
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hashCode(left, right);
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (this == obj) {
//       return true;
//     }
//     if (obj == null) {
//       return false;
//     }
//     if (getClass() != obj.getClass()) {
//       return false;
//     }
// 
//     Pair<?, ?> other = (Pair<?, ?>) obj;
//     return Objects.equal(left, other.left) &&
//            Objects.equal(right, other.right);
//   }
// 
//   @Override
//   public String toString() {
//     return "(" + left + "," + right + ")";
//   }
// 
// }


import static com.kaching.platform.common.Strings.format;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.MDC;
import org.perf4j.commonslog.CommonsLogStopWatch;
import com.google.common.annotations.VisibleForTesting;
import com.kaching.platform.common.Pair;
      log.debug(format(format, args), t);
    }
  }

  /**
   * Log throwable with message and stack trace according to the logging level
   * settings, as in log4j and slf4j. This is probably not what you expect.
   *
   * @param msg
   * @param t
   * @deprecated Use {@link #info(Throwable, String, Object...)} to clarify that
   *             you want the stack trace printed according to log severity
   *             settings or explicitly call toString() if you want to use the
   *             Throwable as an argument to
   *             {@link String#format(String, Object...)}.
   */
  @Deprecated
  public void info(String msg, Throwable t) {
    log.info(msg, t);
  }

  public void info(String message) {
    log.info(message);
  }

  public void info(String format, Object... args) {
    log.info(format(format, args));
  }

  public void info(Throwable t) {
// Path: kawala-common/src/main/java/com/kaching/platform/common/Strings.java
// public static String format(String template, Object... args) {
//   template = String.valueOf(template); // null -> "null"
// 
//   // start substituting the arguments into the '%s' placeholders
//   StringBuilder builder = new StringBuilder(
//       template.length() + 16 * args.length);
//   int templateStart = 0;
//   int i = 0;
//   while (i < args.length) {
//     int placeholderStart = template.indexOf("%s", templateStart);
//     if (placeholderStart == -1) {
//       break;
//     }
//     builder.append(template.substring(templateStart, placeholderStart));
//     builder.append(args[i++]);
//     templateStart = placeholderStart + 2;
//   }
//   builder.append(template.substring(templateStart));
// 
//   // if we run out of placeholders, append the extra args in square braces
//   if (i < args.length) {
//     builder.append(" [");
//     builder.append(args[i++]);
//     while (i < args.length) {
//       builder.append(", ");
//       builder.append(args[i++]);
//     }
//     builder.append("]");
//   }
// 
//   return builder.toString();
// }
// 
// Path: kawala-common/src/main/java/com/kaching/platform/common/Pair.java
// public class Pair<S, T> {
// 
//   public final S left;
//   public final T right;
// 
//   public static <S, T> Pair<S, T> of(S left, T right) {
//     return new Pair<S, T>(left, right);
//   }
// 
//   public Pair(S left, T right) {
//     this.left = left;
//     this.right = right;
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hashCode(left, right);
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (this == obj) {
//       return true;
//     }
//     if (obj == null) {
//       return false;
//     }
//     if (getClass() != obj.getClass()) {
//       return false;
//     }
// 
//     Pair<?, ?> other = (Pair<?, ?>) obj;
//     return Objects.equal(left, other.left) &&
//            Objects.equal(right, other.right);
//   }
// 
//   @Override
//   public String toString() {
//     return "(" + left + "," + right + ")";
//   }
// 
// }


// Path: kawala-common/src/main/java/com/kaching/platform/common/logging/Log.java
import static com.kaching.platform.common.Strings.format;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.MDC;
import org.perf4j.commonslog.CommonsLogStopWatch;
import com.google.common.annotations.VisibleForTesting;
import com.kaching.platform.common.Pair;

      log.debug(format(format, args), t);
    }
  }

  /**
   * Log throwable with message and stack trace according to the logging level
   * settings, as in log4j and slf4j. This is probably not what you expect.
   *
   * @param msg
   * @param t
   * @deprecated Use {@link #info(Throwable, String, Object...)} to clarify that
   *             you want the stack trace printed according to log severity
   *             settings or explicitly call toString() if you want to use the
   *             Throwable as an argument to
   *             {@link String#format(String, Object...)}.
   */
  @Deprecated
  public void info(String msg, Throwable t) {
    log.info(msg, t);
  }

  public void info(String message) {
    log.info(message);
  }

  public void info(String format, Object... args) {
    log.info(format(format, args));
  }

  public void info(Throwable t) {
    log.info(t == null ? null : t.getMessage(), t);