// Path: src/main/java/org/cf/resequencer/Console.java
// public class Console {
//     private static final boolean StackTrace = false;
//     public static int VerboseLevel;
//     public static String LogFile = "console.log";
// 
//     public static void msgln() {
//         System.out.println();
//     }
// 
//     public static void msgln(final String msg) {
//         System.out.println(msg);
//     }
// 
//     public static void msg(final String msg) {
//         System.out.print(msg);
//     }
// 
//     public static void debug(final String msg) {
//         if (VerboseLevel > 0) {
//             System.out.println(msg);
//         }
//     }
// 
//     public static void debug(final String msg, final int verboseLevel) {
//         if (verboseLevel <= VerboseLevel) {
//             debug(msg);
//         }
//     }
// 
//     public static void warn(final String msg) {
//         System.err.println("Warning: " + msg);
//         if (StackTrace) {
//             Thread.dumpStack();
//         }
//     }
// 
//     public static void error(final String msg) {
//         System.err.println("Error: " + msg);
//         if (StackTrace) {
//             Thread.dumpStack();
//         }
//     }
// 
//     public static void die(final Exception ex) {
//         die(ex, -1);
//     }
// 
//     public static void die(final Exception ex, final int exitStatus) {
//         if (StackTrace) {
//             ex.printStackTrace();
//         }
//         System.err.println("" + ex);
//         System.exit(exitStatus);
//     }
// 
//     public static void die(final String msg) {
//         die(msg, -1);
//     }
// 
//     public static void die(final String msg, int exitStatus) {
//         System.err.println("Fatal error: " + msg);
//         if (StackTrace) {
//             Thread.dumpStack();
//         }
//         System.exit(exitStatus);
//     }
// 
//     // run command and return {result, exit status}
//     public static String[] execute(String[] cmd) {
//         debug("Executing: " + Arrays.asList(cmd).toString());
// 
//         StringBuffer output = new StringBuffer();
//         Integer status = null;
// 
//         InputStream in = null;
//         try {
//             Process child = Runtime.getRuntime().exec(cmd);
// 
//             BufferedReader stdInput = new BufferedReader(new InputStreamReader(child.getInputStream()));
// 
//             String s;
//             while ((s = stdInput.readLine()) != null) {
//                 output.append(s).append('\n');
//             }
// 
//             status = child.waitFor();
// 
//             debug("Exit status: " + status, 2);
//         } catch (Exception ex) {
//             error("Run command failed.\n" + ex);
//         } finally {
//             IOUtils.closeQuietly(in);
//         }
// 
//         return new String[] { output.toString(), String.valueOf(status) };
//     }
// 
//     public static boolean deleteBestEffort(File path, String whatIsIt) {
//         return deleteBestEffort(path, whatIsIt, 3, false);
//     }
// 
//     public static boolean deleteBestEffort(File path, String whatIsIt, int maxTries) {
//         return deleteBestEffort(path, whatIsIt, maxTries, false);
//     }
// 
//     public static boolean deleteBestEffort(File path, String whatIsIt, int maxTries, boolean quiet) {
//         System.gc();
// 
//         int tries = 0;
//         while (!FileUtils.deleteQuietly(path) && (tries < maxTries)) {
//             System.gc();
//             tries++;
// 
//             if (!quiet) {
//                 warn("Unable to delete " + whatIsIt + ": " + path + ". Trying again ...");
//             }
// 
//             try {
//                 Thread.sleep(3000);
//             } catch (InterruptedException ex) {
//             }
//         }
// 
//         return !path.exists();
//     }
// }
// 
// Path: src/main/java/org/cf/resequencer/sequence/ResourceItem.java
// public class ResourceItem implements Comparable {
//     public String Type;
//     public String Name;
//     public long ID;
//     public String Value;
// 
//     ResourceItem(String type, String name, String id) {
//         Type = type;
//         Name = name;
//         if (id.startsWith("0x")) {
//             id = id.replaceFirst("0x", "");
//         }
//         ID = Long.parseLong(id, 16);
//     }
// 
//     @Override
//     public String toString() {
//         return Type + " res(" + Name + " / " + ID + ") = " + (Value == null ? "null" : "'" + Value + "'");
//     }
// 
//     public void setValue(String val) {
//         val = val.replace("\n", "\\n");
//         val = val.replace("\r", "\\r");
//         Value = val;
//     }
// 
//     public int compareTo(Object o) {
//         return (int) (this.ID - ((ResourceItem) o).ID);
//     }
// }


import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringEscapeUtils;
import org.cf.resequencer.Console;
import org.cf.resequencer.sequence.ResourceItem;
import com.memetix.mst.detect.Detect;
import com.memetix.mst.language.Language;
import com.memetix.mst.translate.Translate;
package org.cf.resequencer.patch;




/**
 *
 * @author Caleb Fenton
 */
public class SmaliHinter {
    public static long HintsAdded;

    public static boolean ShouldTranslate;
    private static int TranslateBatchSize = 25;

    static private String[] LineArray;

    public static void enableTranslations() {
        // Microsoft Bing API key
        // the developers use this key: 0B4B2CAA973775DBE72569A29C1A08DA55C88441
        // lolololol but we wont use it because we're nice
        String key = "";
        // key = "0B4B2CAA973775DBE72569A29C1A08DA55C88441";
        Translate.setKey(key);
        Detect.setKey(key);

        ShouldTranslate = true;
    }

    /**
     *
     * @param sf
     */
    public static void generateHints(SmaliFile sf) {
        generateHints(sf, null);
    }

    /**
     *
     * @param sf
     * @param appRes
     */
// Path: src/main/java/org/cf/resequencer/Console.java
// public class Console {
//     private static final boolean StackTrace = false;
//     public static int VerboseLevel;
//     public static String LogFile = "console.log";
// 
//     public static void msgln() {
//         System.out.println();
//     }
// 
//     public static void msgln(final String msg) {
//         System.out.println(msg);
//     }
// 
//     public static void msg(final String msg) {
//         System.out.print(msg);
//     }
// 
//     public static void debug(final String msg) {
//         if (VerboseLevel > 0) {
//             System.out.println(msg);
//         }
//     }
// 
//     public static void debug(final String msg, final int verboseLevel) {
//         if (verboseLevel <= VerboseLevel) {
//             debug(msg);
//         }
//     }
// 
//     public static void warn(final String msg) {
//         System.err.println("Warning: " + msg);
//         if (StackTrace) {
//             Thread.dumpStack();
//         }
//     }
// 
//     public static void error(final String msg) {
//         System.err.println("Error: " + msg);
//         if (StackTrace) {
//             Thread.dumpStack();
//         }
//     }
// 
//     public static void die(final Exception ex) {
//         die(ex, -1);
//     }
// 
//     public static void die(final Exception ex, final int exitStatus) {
//         if (StackTrace) {
//             ex.printStackTrace();
//         }
//         System.err.println("" + ex);
//         System.exit(exitStatus);
//     }
// 
//     public static void die(final String msg) {
//         die(msg, -1);
//     }
// 
//     public static void die(final String msg, int exitStatus) {
//         System.err.println("Fatal error: " + msg);
//         if (StackTrace) {
//             Thread.dumpStack();
//         }
//         System.exit(exitStatus);
//     }
// 
//     // run command and return {result, exit status}
//     public static String[] execute(String[] cmd) {
//         debug("Executing: " + Arrays.asList(cmd).toString());
// 
//         StringBuffer output = new StringBuffer();
//         Integer status = null;
// 
//         InputStream in = null;
//         try {
//             Process child = Runtime.getRuntime().exec(cmd);
// 
//             BufferedReader stdInput = new BufferedReader(new InputStreamReader(child.getInputStream()));
// 
//             String s;
//             while ((s = stdInput.readLine()) != null) {
//                 output.append(s).append('\n');
//             }
// 
//             status = child.waitFor();
// 
//             debug("Exit status: " + status, 2);
//         } catch (Exception ex) {
//             error("Run command failed.\n" + ex);
//         } finally {
//             IOUtils.closeQuietly(in);
//         }
// 
//         return new String[] { output.toString(), String.valueOf(status) };
//     }
// 
//     public static boolean deleteBestEffort(File path, String whatIsIt) {
//         return deleteBestEffort(path, whatIsIt, 3, false);
//     }
// 
//     public static boolean deleteBestEffort(File path, String whatIsIt, int maxTries) {
//         return deleteBestEffort(path, whatIsIt, maxTries, false);
//     }
// 
//     public static boolean deleteBestEffort(File path, String whatIsIt, int maxTries, boolean quiet) {
//         System.gc();
// 
//         int tries = 0;
//         while (!FileUtils.deleteQuietly(path) && (tries < maxTries)) {
//             System.gc();
//             tries++;
// 
//             if (!quiet) {
//                 warn("Unable to delete " + whatIsIt + ": " + path + ". Trying again ...");
//             }
// 
//             try {
//                 Thread.sleep(3000);
//             } catch (InterruptedException ex) {
//             }
//         }
// 
//         return !path.exists();
//     }
// }
// 
// Path: src/main/java/org/cf/resequencer/sequence/ResourceItem.java
// public class ResourceItem implements Comparable {
//     public String Type;
//     public String Name;
//     public long ID;
//     public String Value;
// 
//     ResourceItem(String type, String name, String id) {
//         Type = type;
//         Name = name;
//         if (id.startsWith("0x")) {
//             id = id.replaceFirst("0x", "");
//         }
//         ID = Long.parseLong(id, 16);
//     }
// 
//     @Override
//     public String toString() {
//         return Type + " res(" + Name + " / " + ID + ") = " + (Value == null ? "null" : "'" + Value + "'");
//     }
// 
//     public void setValue(String val) {
//         val = val.replace("\n", "\\n");
//         val = val.replace("\r", "\\r");
//         Value = val;
//     }
// 
//     public int compareTo(Object o) {
//         return (int) (this.ID - ((ResourceItem) o).ID);
//     }
// }


// Path: src/main/java/org/cf/resequencer/patch/SmaliHinter.java
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringEscapeUtils;
import org.cf.resequencer.Console;
import org.cf.resequencer.sequence.ResourceItem;
import com.memetix.mst.detect.Detect;
import com.memetix.mst.language.Language;
import com.memetix.mst.translate.Translate;

package org.cf.resequencer.patch;




/**
 *
 * @author Caleb Fenton
 */
public class SmaliHinter {
    public static long HintsAdded;

    public static boolean ShouldTranslate;
    private static int TranslateBatchSize = 25;

    static private String[] LineArray;

    public static void enableTranslations() {
        // Microsoft Bing API key
        // the developers use this key: 0B4B2CAA973775DBE72569A29C1A08DA55C88441
        // lolololol but we wont use it because we're nice
        String key = "";
        // key = "0B4B2CAA973775DBE72569A29C1A08DA55C88441";
        Translate.setKey(key);
        Detect.setKey(key);

        ShouldTranslate = true;
    }

    /**
     *
     * @param sf
     */
    public static void generateHints(SmaliFile sf) {
        generateHints(sf, null);
    }

    /**
     *
     * @param sf
     * @param appRes
     */
    public static void generateHints(SmaliFile sf, List<ResourceItem> appRes) {