// Path: SeleniumGridExtras/src/main/java/com/groupon/seleniumgridextras/utilities/HttpUtility.java
// public class HttpUtility {
// 
//     private static Logger logger = Logger.getLogger(HttpUtility.class);
// 
// 
//     public static String getRequestAsString(URI uri) throws IOException, URISyntaxException {
//         return getRequestAsString(uri.toURL());
//     }
// 
//     public static String getRequestAsString(URL url) throws IOException {
//         return getRequestAsString(url, RuntimeConfig.getConfig() != null ?
//                 RuntimeConfig.getConfig().getHttpRequestTimeout() :
//                 DefaultConfig.HTTP_REQUEST_TIMEOUT);
//     }
// 
//     public static String getRequestAsString(URL url, int timeout) throws IOException {
//         HttpURLConnection conn = getRequest(url, timeout);
// 
//         if (conn.getResponseCode() == 200) {
//             return StreamUtility.inputStreamToString(conn.getInputStream());
//         } else {
//             return "";
//         }
//     }
// 
//     public static HttpURLConnection getRequest(URI uri) throws IOException {
//         return getRequest(uri.toURL());
//     }
// 
//     public static HttpURLConnection getRequest(URL url) throws IOException {
//         return getRequest(url, RuntimeConfig.getConfig() != null ?
//                 RuntimeConfig.getConfig().getHttpRequestTimeout() :
//                 DefaultConfig.HTTP_REQUEST_TIMEOUT);
//     }
// 
//     public static HttpURLConnection getRequest(URL url, int timeout) throws IOException {
//         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//         conn.setRequestMethod("GET");
//         conn.setConnectTimeout(timeout);
//         conn.setReadTimeout(timeout);
// 
//         logger.debug("Response code is " + conn.getResponseCode());
//         return conn;
//     }
// 
//     public static File downloadVideoFromUri(URI uri) {
//         //Don't modify this without running the comment out tests!
// 
//         File destinationDir;
//         if (RuntimeConfig.getConfig() != null) {
//             destinationDir = RuntimeConfig.getConfig().getVideoRecording().getOutputDir();
//         } else {
//             destinationDir = new File(DefaultConfig.VIDEO_OUTPUT_DIRECTORY);
//         }
// 
//         if (!destinationDir.exists()) {
//             destinationDir.mkdir();
//         }
// 
//         // Delete old movies
//         VideoRecorderCallable.deleteOldMovies(destinationDir);
// 
//         File destFile = new File(
//                 destinationDir.getAbsolutePath(),
//                 uri.getRawPath().replaceAll(
//                         VideoHttpExecutor.GET_VIDEO_FILE_ENDPOINT,
//                         "").replaceAll(
//                         "/",
//                         ""));
// 
//         try {
//             FileUtils.copyURLToFile(uri.toURL(), destFile);
//         } catch (Exception e) {
//             logger.error(
//                     String.format(
//                             "Exception happened while downloading video. file: %s, dest dir: %s, source url: %s",
//                             destFile.getAbsolutePath(),
//                             destinationDir.getAbsolutePath(),
//                             uri.toString()),
//                     e);
//             return null;
//         }
// 
//         return destFile;
//     }
// 
//     public static int checkIfUrlStatusCode(URL u) {
// 
//         HttpURLConnection huc = null;
//         try {
// 
//             huc = (HttpURLConnection) u.openConnection();
//             huc.setRequestMethod("GET");
//             huc.setInstanceFollowRedirects(true);
//             huc.connect();
// //            OutputStream os = huc.getOutputStream();
//             return huc.getResponseCode();
//         } catch (IOException e) {
//             String message = String.format("URL: %s, \n %s", u, Throwables.getStackTraceAsString(e));
//             System.out.println(message);
//             logger.warn(message);
//         }
// 
//         return -1;
//     }
// 
// 
// }
// 
// Path: SeleniumGridExtras/src/main/java/com/groupon/seleniumgridextras/utilities/json/JsonParserWrapper.java
// public class JsonParserWrapper {
// 
//     public static List toList(String input) throws JsonSyntaxException {
//         return new Gson().fromJson(input, LinkedList.class);
//     }
// 
// 
//     public static JsonObject toJsonObject(Map input) {
//         return new Gson().toJsonTree(input).getAsJsonObject();
//     }
// 
//     public static Map toHashMap(String input) {
//         return new Gson().fromJson(input, HashMap.class);
//     }
// 
//     public static Map toHashMap(JsonObject input) {
//         return new Gson().fromJson(input, HashMap.class);
//     }
// 
//     public static String prettyPrintString(Object input) {
//         return new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(input);
//     }
// 
//     public static String prettyPrintString(JsonObject input) {
//         return new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(input);
//     }
// }


import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.google.gson.internal.LinkedTreeMap;
import com.groupon.seleniumgridextras.utilities.HttpUtility;
import com.groupon.seleniumgridextras.utilities.json.JsonParserWrapper;
package com.groupon.seleniumgridextras.downloader;




public class GitHubDownloader {
    public static final String ASSETS_KEY = "assets";
    public static final String NAME_KEY = "name";
// Path: SeleniumGridExtras/src/main/java/com/groupon/seleniumgridextras/utilities/HttpUtility.java
// public class HttpUtility {
// 
//     private static Logger logger = Logger.getLogger(HttpUtility.class);
// 
// 
//     public static String getRequestAsString(URI uri) throws IOException, URISyntaxException {
//         return getRequestAsString(uri.toURL());
//     }
// 
//     public static String getRequestAsString(URL url) throws IOException {
//         return getRequestAsString(url, RuntimeConfig.getConfig() != null ?
//                 RuntimeConfig.getConfig().getHttpRequestTimeout() :
//                 DefaultConfig.HTTP_REQUEST_TIMEOUT);
//     }
// 
//     public static String getRequestAsString(URL url, int timeout) throws IOException {
//         HttpURLConnection conn = getRequest(url, timeout);
// 
//         if (conn.getResponseCode() == 200) {
//             return StreamUtility.inputStreamToString(conn.getInputStream());
//         } else {
//             return "";
//         }
//     }
// 
//     public static HttpURLConnection getRequest(URI uri) throws IOException {
//         return getRequest(uri.toURL());
//     }
// 
//     public static HttpURLConnection getRequest(URL url) throws IOException {
//         return getRequest(url, RuntimeConfig.getConfig() != null ?
//                 RuntimeConfig.getConfig().getHttpRequestTimeout() :
//                 DefaultConfig.HTTP_REQUEST_TIMEOUT);
//     }
// 
//     public static HttpURLConnection getRequest(URL url, int timeout) throws IOException {
//         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//         conn.setRequestMethod("GET");
//         conn.setConnectTimeout(timeout);
//         conn.setReadTimeout(timeout);
// 
//         logger.debug("Response code is " + conn.getResponseCode());
//         return conn;
//     }
// 
//     public static File downloadVideoFromUri(URI uri) {
//         //Don't modify this without running the comment out tests!
// 
//         File destinationDir;
//         if (RuntimeConfig.getConfig() != null) {
//             destinationDir = RuntimeConfig.getConfig().getVideoRecording().getOutputDir();
//         } else {
//             destinationDir = new File(DefaultConfig.VIDEO_OUTPUT_DIRECTORY);
//         }
// 
//         if (!destinationDir.exists()) {
//             destinationDir.mkdir();
//         }
// 
//         // Delete old movies
//         VideoRecorderCallable.deleteOldMovies(destinationDir);
// 
//         File destFile = new File(
//                 destinationDir.getAbsolutePath(),
//                 uri.getRawPath().replaceAll(
//                         VideoHttpExecutor.GET_VIDEO_FILE_ENDPOINT,
//                         "").replaceAll(
//                         "/",
//                         ""));
// 
//         try {
//             FileUtils.copyURLToFile(uri.toURL(), destFile);
//         } catch (Exception e) {
//             logger.error(
//                     String.format(
//                             "Exception happened while downloading video. file: %s, dest dir: %s, source url: %s",
//                             destFile.getAbsolutePath(),
//                             destinationDir.getAbsolutePath(),
//                             uri.toString()),
//                     e);
//             return null;
//         }
// 
//         return destFile;
//     }
// 
//     public static int checkIfUrlStatusCode(URL u) {
// 
//         HttpURLConnection huc = null;
//         try {
// 
//             huc = (HttpURLConnection) u.openConnection();
//             huc.setRequestMethod("GET");
//             huc.setInstanceFollowRedirects(true);
//             huc.connect();
// //            OutputStream os = huc.getOutputStream();
//             return huc.getResponseCode();
//         } catch (IOException e) {
//             String message = String.format("URL: %s, \n %s", u, Throwables.getStackTraceAsString(e));
//             System.out.println(message);
//             logger.warn(message);
//         }
// 
//         return -1;
//     }
// 
// 
// }
// 
// Path: SeleniumGridExtras/src/main/java/com/groupon/seleniumgridextras/utilities/json/JsonParserWrapper.java
// public class JsonParserWrapper {
// 
//     public static List toList(String input) throws JsonSyntaxException {
//         return new Gson().fromJson(input, LinkedList.class);
//     }
// 
// 
//     public static JsonObject toJsonObject(Map input) {
//         return new Gson().toJsonTree(input).getAsJsonObject();
//     }
// 
//     public static Map toHashMap(String input) {
//         return new Gson().fromJson(input, HashMap.class);
//     }
// 
//     public static Map toHashMap(JsonObject input) {
//         return new Gson().fromJson(input, HashMap.class);
//     }
// 
//     public static String prettyPrintString(Object input) {
//         return new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(input);
//     }
// 
//     public static String prettyPrintString(JsonObject input) {
//         return new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(input);
//     }
// }


// Path: SeleniumGridExtras/src/main/java/com/groupon/seleniumgridextras/downloader/GitHubDownloader.java
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.google.gson.internal.LinkedTreeMap;
import com.groupon.seleniumgridextras.utilities.HttpUtility;
import com.groupon.seleniumgridextras.utilities.json.JsonParserWrapper;

package com.groupon.seleniumgridextras.downloader;




public class GitHubDownloader {
    public static final String ASSETS_KEY = "assets";
    public static final String NAME_KEY = "name";
    public static final String BROWSER_DOWNLOAD_URL = "browser_download_url";