From 06869f5facc9dfe104faab388d06cfc7c07b5e46 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Mon, 13 Jul 2020 11:06:26 -0500 Subject: [PATCH] Added bStats Plugin Metrics Title reference --- .idea/workspace.xml | 32 +- pom.xml | 16 +- src/main/java/dev/coomware/Chainmail.java | 9 +- src/main/java/org/bstats/Metrics.java | 703 ++++++++++++++++++ src/main/resources/plugin.yml | 2 +- target/Chainmail-1.1.0.jar | Bin 4891 -> 0 bytes target/Chainmail-1.2.0.jar | Bin 0 -> 23156 bytes target/classes/dev/coomware/Chainmail.class | Bin 3165 -> 3432 bytes .../classes/dev/coomware/CheaperChains.class | Bin 2255 -> 2394 bytes target/classes/org/bstats/Metrics$1.class | Bin 0 -> 1712 bytes .../org/bstats/Metrics$AdvancedBarChart.class | Bin 0 -> 2498 bytes .../org/bstats/Metrics$AdvancedPie.class | Bin 0 -> 2261 bytes .../org/bstats/Metrics$CustomChart.class | Bin 0 -> 2126 bytes .../org/bstats/Metrics$DrilldownPie.class | Bin 0 -> 2687 bytes .../org/bstats/Metrics$MultiLineChart.class | Bin 0 -> 2270 bytes .../org/bstats/Metrics$SimpleBarChart.class | Bin 0 -> 2298 bytes .../org/bstats/Metrics$SimplePie.class | Bin 0 -> 1353 bytes .../org/bstats/Metrics$SingleLineChart.class | Bin 0 -> 1417 bytes target/classes/org/bstats/Metrics.class | Bin 0 -> 14557 bytes target/classes/plugin.yml | 2 +- target/maven-archiver/pom.properties | 4 +- .../compile/default-compile/createdFiles.lst | 10 + .../compile/default-compile/inputFiles.lst | 1 + 23 files changed, 760 insertions(+), 19 deletions(-) create mode 100644 src/main/java/org/bstats/Metrics.java delete mode 100644 target/Chainmail-1.1.0.jar create mode 100644 target/Chainmail-1.2.0.jar create mode 100644 target/classes/org/bstats/Metrics$1.class create mode 100644 target/classes/org/bstats/Metrics$AdvancedBarChart.class create mode 100644 target/classes/org/bstats/Metrics$AdvancedPie.class create mode 100644 target/classes/org/bstats/Metrics$CustomChart.class create mode 100644 target/classes/org/bstats/Metrics$DrilldownPie.class create mode 100644 target/classes/org/bstats/Metrics$MultiLineChart.class create mode 100644 target/classes/org/bstats/Metrics$SimpleBarChart.class create mode 100644 target/classes/org/bstats/Metrics$SimplePie.class create mode 100644 target/classes/org/bstats/Metrics$SingleLineChart.class create mode 100644 target/classes/org/bstats/Metrics.class diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 9c63e87..7696197 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,11 +2,16 @@ + - - + + + + + + \ No newline at end of file diff --git a/src/main/java/dev/coomware/Chainmail.java b/src/main/java/dev/coomware/Chainmail.java index 5b0498e..3aba171 100644 --- a/src/main/java/dev/coomware/Chainmail.java +++ b/src/main/java/dev/coomware/Chainmail.java @@ -1,5 +1,6 @@ package dev.coomware; +import org.bstats.Metrics; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -11,6 +12,7 @@ import org.bukkit.plugin.java.JavaPlugin; public class Chainmail extends JavaPlugin { public static Chainmail plugin; public Server server; + private int pluginId = 8177; @Override public void onLoad() { @@ -20,10 +22,13 @@ public class Chainmail extends JavaPlugin { @Override public void onEnable() { + Metrics metrics = new Metrics(this, pluginId); + Bukkit.getLogger().info("[Chainmail] Successfully loaded bStats plugin metrics."); + new CheaperChains(this); newRecipes(); - Bukkit.getLogger().info("Successfully added new recipes for chainmail armor."); - Bukkit.getLogger().info("This plugin was made by CoomWare."); + Bukkit.getLogger().info("[Chainmail] Successfully added new recipes for chainmail armor."); + Bukkit.getLogger().info("[Chainmail] This plugin was made by CoomWare."); } @Override diff --git a/src/main/java/org/bstats/Metrics.java b/src/main/java/org/bstats/Metrics.java new file mode 100644 index 0000000..9a9defa --- /dev/null +++ b/src/main/java/org/bstats/Metrics.java @@ -0,0 +1,703 @@ +package org.bstats; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.JsonPrimitive; + +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.ServicePriority; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.logging.Level; +import java.util.zip.GZIPOutputStream; + +@SuppressWarnings({"WeakerAccess", "unused"}) +public class Metrics { + // The version of this bStats class + public static final int B_STATS_VERSION = 1; + + // The url to which the data is sent + private static final String URL = "https://bStats.org/submitData/bukkit"; + + // Is bStats enabled on this server? + private boolean enabled; + + // Should failed requests be logged? + private static boolean logFailedRequests; + + // Should the sent data be logged? + private static boolean logSentData; + + // Should the response text be logged? + private static boolean logResponseStatusText; + + // The uuid of the server + private static String serverUUID; + + // The plugin + private final Plugin plugin; + + // The plugin id + private final int pluginId; + + // A list with all custom charts + private final List charts = new ArrayList<>(); + + /** + * Class constructor. + * + * @param plugin The plugin which stats should be submitted. + * @param pluginId The id of the plugin. + * It can be found at What is my plugin id? + */ + public Metrics(@NotNull Plugin plugin, int pluginId) { + this.plugin = plugin; + this.pluginId = pluginId; + + // Get the config file + File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); + File configFile = new File(bStatsFolder, "config.yml"); + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + + // Check if the config file exists + if (!config.isSet("serverUuid")) { + + // Add default values + config.addDefault("enabled", true); + // Every server gets it's unique random id. + config.addDefault("serverUuid", UUID.randomUUID().toString()); + // Should failed request be logged? + config.addDefault("logFailedRequests", false); + // Should the sent data be logged? + config.addDefault("logSentData", false); + // Should the response text be logged? + config.addDefault("logResponseStatusText", false); + + // Inform the server owners about bStats + config.options().header( + "bStats collects some data for plugin authors like how many servers are using their plugins.\n" + + "To honor their work, you should not disable it.\n" + + "This has nearly no effect on the server performance!\n" + + "Check out https://bStats.org/ to learn more :)" + ).copyDefaults(true); + try { + config.save(configFile); + } catch (IOException ignored) { } + } + + // Load the data + enabled = config.getBoolean("enabled", true); + serverUUID = config.getString("serverUuid"); + logFailedRequests = config.getBoolean("logFailedRequests", false); + logSentData = config.getBoolean("logSentData", false); + logResponseStatusText = config.getBoolean("logResponseStatusText", false); + + if (enabled) { + boolean found = false; + // Search for all other bStats Metrics classes to see if we are the first one + for (Class service : Bukkit.getServicesManager().getKnownServices()) { + try { + service.getField("B_STATS_VERSION"); // Our identifier :) + found = true; // We aren't the first + break; + } catch (NoSuchFieldException ignored) { } + } + // Register our service + Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal); + if (!found) { + // We are the first! + startSubmitting(); + } + } + } + + /** + * Checks if bStats is enabled. + * + * @return Whether bStats is enabled or not. + */ + public boolean isEnabled() { + return enabled; + } + + /** + * Adds a custom chart. + * + * @param chart The chart to add. + */ + public void addCustomChart(CustomChart chart) { + if (chart == null) { + throw new IllegalArgumentException("Chart cannot be null!"); + } + charts.add(chart); + } + + /** + * Starts the Scheduler which submits our data every 30 minutes. + */ + private void startSubmitting() { + final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + if (!plugin.isEnabled()) { // Plugin was disabled + timer.cancel(); + return; + } + // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler + // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) + Bukkit.getScheduler().runTask(plugin, () -> submitData()); + } + }, 1000 * 60 * 5, 1000 * 60 * 30); + // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start + // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! + // WARNING: Just don't do it! + } + + /** + * Gets the plugin specific data. + * This method is called using Reflection. + * + * @return The plugin specific data. + */ + public JsonObject getPluginData() { + JsonObject data = new JsonObject(); + + String pluginName = plugin.getDescription().getName(); + String pluginVersion = plugin.getDescription().getVersion(); + + data.addProperty("pluginName", pluginName); // Append the name of the plugin + data.addProperty("id", pluginId); // Append the id of the plugin + data.addProperty("pluginVersion", pluginVersion); // Append the version of the plugin + JsonArray customCharts = new JsonArray(); + for (CustomChart customChart : charts) { + // Add the data of the custom charts + JsonObject chart = customChart.getRequestJsonObject(); + if (chart == null) { // If the chart is null, we skip it + continue; + } + customCharts.add(chart); + } + data.add("customCharts", customCharts); + + return data; + } + + /** + * Gets the server specific data. + * + * @return The server specific data. + */ + @NotNull + private JsonObject getServerData() { + // Minecraft specific data + int playerAmount; + try { + // Around MC 1.8 the return type was changed to a collection from an array, + // This fixes java.lang.NoSuchMethodError: org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; + Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); + playerAmount = onlinePlayersMethod.getReturnType().equals(Collection.class) + ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() + : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; + } catch (Exception e) { + playerAmount = Bukkit.getOnlinePlayers().size(); // Just use the new method if the Reflection failed + } + int onlineMode = Bukkit.getOnlineMode() ? 1 : 0; + String bukkitVersion = Bukkit.getVersion(); + String bukkitName = Bukkit.getName(); + + // OS/Java specific data + String javaVersion = System.getProperty("java.version"); + String osName = System.getProperty("os.name"); + String osArch = System.getProperty("os.arch"); + String osVersion = System.getProperty("os.version"); + int coreCount = Runtime.getRuntime().availableProcessors(); + + JsonObject data = new JsonObject(); + + data.addProperty("serverUUID", serverUUID); + + data.addProperty("playerAmount", playerAmount); + data.addProperty("onlineMode", onlineMode); + data.addProperty("bukkitVersion", bukkitVersion); + data.addProperty("bukkitName", bukkitName); + + data.addProperty("javaVersion", javaVersion); + data.addProperty("osName", osName); + data.addProperty("osArch", osArch); + data.addProperty("osVersion", osVersion); + data.addProperty("coreCount", coreCount); + + return data; + } + + /** + * Collects the data and sends it afterwards. + */ + private void submitData() { + final JsonObject data = getServerData(); + + JsonArray pluginData = new JsonArray(); + // Search for all other bStats Metrics classes to get their plugin data + for (Class service : Bukkit.getServicesManager().getKnownServices()) { + try { + service.getField("B_STATS_VERSION"); // Our identifier :) + + for (RegisteredServiceProvider provider : Bukkit.getServicesManager().getRegistrations(service)) { + try { + Object plugin = provider.getService().getMethod("getPluginData").invoke(provider.getProvider()); + if (plugin instanceof JsonObject) { + pluginData.add((JsonObject) plugin); + } else { // old bstats version compatibility + try { + Class jsonObjectJsonSimple = Class.forName("org.json.simple.JSONObject"); + if (plugin.getClass().isAssignableFrom(jsonObjectJsonSimple)) { + Method jsonStringGetter = jsonObjectJsonSimple.getDeclaredMethod("toJSONString"); + jsonStringGetter.setAccessible(true); + String jsonString = (String) jsonStringGetter.invoke(plugin); + JsonObject object = new JsonParser().parse(jsonString).getAsJsonObject(); + pluginData.add(object); + } + } catch (ClassNotFoundException e) { + // minecraft version 1.14+ + if (logFailedRequests) { + this.plugin.getLogger().log(Level.SEVERE, "Encountered unexpected exception", e); + } + } + } + } catch (NullPointerException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { } + } + } catch (NoSuchFieldException ignored) { } + } + + data.add("plugins", pluginData); + + // Create a new thread for the connection to the bStats server + new Thread(() -> { + try { + // Send the data + sendData(plugin, data); + } catch (Exception e) { + // Something went wrong! :( + if (logFailedRequests) { + plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); + } + } + }).start(); + } + + /** + * Sends the data to the bStats server. + * + * @param plugin Any plugin. It's just used to get a logger instance. + * @param data The data to send. + * @throws Exception If the request failed. + */ + private static void sendData(Plugin plugin, JsonObject data) throws Exception { + if (data == null) { + throw new IllegalArgumentException("Data cannot be null!"); + } + if (Bukkit.isPrimaryThread()) { + throw new IllegalAccessException("This method must not be called from the main thread!"); + } + if (logSentData) { + plugin.getLogger().info("Sending data to bStats: " + data); + } + HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); + + // Compress the data to save bandwidth + byte[] compressedData = compress(data.toString()); + + // Add headers + connection.setRequestMethod("POST"); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request + connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); + connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format + connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); + + // Send data + connection.setDoOutput(true); + try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { + outputStream.write(compressedData); + } + + StringBuilder builder = new StringBuilder(); + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String line; + while ((line = bufferedReader.readLine()) != null) { + builder.append(line); + } + } + + if (logResponseStatusText) { + plugin.getLogger().info("Sent data to bStats and received response: " + builder); + } + } + + /** + * Gzips the given String. + * + * @param str The string to gzip. + * @return The gzipped String. + * @throws IOException If the compression failed. + */ + private static byte[] compress(final String str) throws IOException { + if (str == null) { + return null; + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { + gzip.write(str.getBytes(StandardCharsets.UTF_8)); + } + return outputStream.toByteArray(); + } + + /** + * Represents a custom chart. + */ + public static abstract class CustomChart { + + // The id of the chart + final String chartId; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + CustomChart(String chartId) { + if (chartId == null || chartId.isEmpty()) { + throw new IllegalArgumentException("ChartId cannot be null or empty!"); + } + this.chartId = chartId; + } + + @Nullable + private JsonObject getRequestJsonObject() { + JsonObject chart = new JsonObject(); + chart.addProperty("chartId", chartId); + try { + JsonObject data = getChartData(); + if (data == null) { + // If the data is null we don't send the chart. + return null; + } + chart.add("data", data); + } catch (Throwable t) { + if (logFailedRequests) { + Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t); + } + return null; + } + return chart; + } + + protected abstract JsonObject getChartData() throws Exception; + + } + + /** + * Represents a custom simple pie. + */ + public static class SimplePie extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimplePie(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + String value = callable.call(); + if (value == null || value.isEmpty()) { + // Null = skip the chart + return null; + } + data.addProperty("value", value); + return data; + } + } + + /** + * Represents a custom advanced pie. + */ + public static class AdvancedPie extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedPie(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + continue; // Skip this invalid + } + allSkipped = false; + values.addProperty(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.add("values", values); + return data; + } + } + + /** + * Represents a custom drilldown pie. + */ + public static class DrilldownPie extends CustomChart { + + private final Callable>> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public DrilldownPie(String chartId, Callable>> callable) { + super(chartId); + this.callable = callable; + } + + @Override + public JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map> map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean reallyAllSkipped = true; + for (Map.Entry> entryValues : map.entrySet()) { + JsonObject value = new JsonObject(); + boolean allSkipped = true; + for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { + value.addProperty(valueEntry.getKey(), valueEntry.getValue()); + allSkipped = false; + } + if (!allSkipped) { + reallyAllSkipped = false; + values.add(entryValues.getKey(), value); + } + } + if (reallyAllSkipped) { + // Null = skip the chart + return null; + } + data.add("values", values); + return data; + } + } + + /** + * Represents a custom single line chart. + */ + public static class SingleLineChart extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SingleLineChart(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + int value = callable.call(); + if (value == 0) { + // Null = skip the chart + return null; + } + data.addProperty("value", value); + return data; + } + + } + + /** + * Represents a custom multi line chart. + */ + public static class MultiLineChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public MultiLineChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + continue; // Skip this invalid + } + allSkipped = false; + values.addProperty(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.add("values", values); + return data; + } + + } + + /** + * Represents a custom simple bar chart. + */ + public static class SimpleBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimpleBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + for (Map.Entry entry : map.entrySet()) { + JsonArray categoryValues = new JsonArray(); + categoryValues.add(new JsonPrimitive(entry.getValue())); + values.add(entry.getKey(), categoryValues); + } + data.add("values", values); + return data; + } + + } + + /** + * Represents a custom advanced bar chart. + */ + public static class AdvancedBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().length == 0) { + continue; // Skip this invalid + } + allSkipped = false; + JsonArray categoryValues = new JsonArray(); + for (int categoryValue : entry.getValue()) { + categoryValues.add(new JsonPrimitive(categoryValue)); + } + values.add(entry.getKey(), categoryValues); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.add("values", values); + return data; + } + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b12a29f..1a69dc8 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: Chainmail main: dev.coomware.Chainmail -version: 1.1.0 +version: 1.2.0 description: Plugin which adds a recipe for chainmail armor using chains. author: CoomWare api-version: 1.16 \ No newline at end of file diff --git a/target/Chainmail-1.1.0.jar b/target/Chainmail-1.1.0.jar deleted file mode 100644 index 534eeed6df4dbf1214965f2bbb7f90fd7e4c745c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4891 zcmb7I2UJtb+Kqrp)zFJUQEEaGAs`(Q5C}cAJc{&QB{ZcdQlyATM??WZKtP%lr3i## zQ0bwgARVL=iYN$wxL(00_pSH-$(nO!t$cf*DQot8dr+#RWR!sYf-#*({nhyUK|y@0 zE9lC?lr|!AZq^5(oKEtn&#GN%EH08<33mpRj2Zb3;wxq%adP=rVz&{m3VvL1h5D0V@N zLYYG{y!4v(Sh6lgMT-&1afSQs`2=}*?gyCoWRm;?kXt6f*APh>hRxdE*sC+$`}SjR z`P;@wK^nlRVdi{(eL4r4lRm@z&a-;JsnF3zTDUk{gP;{R^<7s`Bb_4G6LJpTF)MP~ zC$TGm!QFHw@dA*sEI6~%>&tsFV6SDP;G_!GfjnG_04DVpPr?1Lu)@d7Pbu{RO zh8jzPRUfU}2E0)i;>%)4=NQWR2Fzb1RAxi1b1pv-=i!TF=a0>VS=u{b^vh{#3n^+6 zFwfLLiH~0PNCjCvve(H8OsxFOM+HJ`e6g&uQJb?`Na?f{5rlg93gslO6EgF@e3So9 zEj~3Nl2<$o&4yVFLE?>+zntrj;I3(ST9Hfbt|H2xC>^&@G@Iq5(90v1E>igLeUE5v zGNW6AsEt8;K87xYu?<`@F_)RjT)3t$-X{&}+1fFT>@4bKAti~{;&aqjKvKEEYpH=?Tefd!$Hd(NY3(FwXnQ}pg8(;1Sam{o|0#dB!CRk;mS^CqN@+`XX0vJP#w&&h9PI)?TYZ zh&;=D7eMP~#wp*QTlMkzFvR-FLbJ!PE@Aw^n$@S(3aYFg_fIU0%p#DT3Db2R`E622 zxqg?kPQgm>#65ft{p?U;awo_$aJRTK+}Bv_Gt8sQYuCS!Y$fsjS_QVo*9a#Gs%Z)R z>Kb6N*#sTi9(2c+({+L=lSMW4;!6jFy)mWF3jwo4b)$IhwRhCZ=l zN4rhtd#=8b&-WiRS{Vl1@uI+ ziQ*y3LKFDHGiIM9&cq6TXE$f*=;Wg!^(j5xHvN6N#;VOTrqFT4!_!!)JSF(}}`gD1oqgJeD zo9boo2muF9+0c2_r}?F@5;Pf1APqjB9FP_Lv;rA;iSD#N2bppUlwCUXD!&V7?7Tz7 z$WtX_EKB{dV>3VyLviHjsUobq_$Gx^l;xgtYlpGIHVt%u7FZEvsXQvyEE~Y=2C9lw zsPtUL(m+ROr*GC^5zS}D>6&RDOpM%&zL?S8zwDXu|f2t6KHFss5LN z@*5De1j+?D6(Wp}R%FB5$+I~ljn3fvLWKLGadY^><lO(oNm}3_%vcW9>nc~Z zQAHnPFT5Q$V=v^xaIbEGnJ*NQMj~|=w^xef+a*dKkSDSo4wbu8YiY(3#uS1(+Oa8;4v@ypaoly zP2CvzHod{7Xvlyu$o8wi0)=@~_XGOWsdwVJdy&Xx!?{ptc8}Yl-2T?E*uBY8P zE*&f<)=}GVIg?MKbb)GtmurHq8X2Rkh%i zcHHOr=D3E+US-=;UkYF%KV~_!z7{At327~clN#4{{1;d3(WqNxISh`tI&YEW2)C1+~zfj}`O{lxX=a;EkXy@^dfDVZoX!_Q3fH zW~^;R5ju^(F$gHKA`r&a*Ryh^nOQ=_QwlHOp{d_cS!6DeIyeR^b^2JI_Gr?Ez(|jd z44?bH^Xh~@eq@XdZXNvAz0EMZ1%}SUD~nk^H1K?^oW8jzU$>?rEPPF}?VUl2>cfhc z8tL=BHVXP|g_{xiV~Xka;u*MZw5l*!%*-RJOG~bm<_51CLFPsb;N+LqZ$C|GC_~)h zQdruaEKVltDQub;6C@OnDx3I0CrnG1tLRcyVzRGqgJ7kE@ZBsPqov2*9p@KUhQi~F zfRXrXl@H z-8z)(raaQ<33dWM`JwYt0{cxQu+szRH@h{dSV$ub zeu=tCZ=Aj+P0H9es3ox>(lar8_H3T0-*hyYZbjS;UvLW)t)it7HdXEmU2@$s zNl_JV&OV-R?j5x5?@&TH0w?-v$5R)kTM&?RvpG)Tz6t$CGemhzyFJVD1f!j+?K2xu zJ*}P9GRSk;db|=u7`onqEqGoGY1Yq(s5yg=@YQ{0x8uyMT{8W-GJW+Jyz4V-js5rQ zXP%1R7u<5a>!oSG{LI^L?4n(`%$Q^oAS+2M*dI{zezZ|6@);Rv%vSg`WtUo~OM`n8 zS0Tv~BoKTdExTOfv-7oQ$8X)jq&(5fH+^5Px#lnq2&${!OP)?&7_Tccl+uM)W|30w z1z?xSFVe7cAU8Yl=c!FYW5ubv#gr|{I2riW%r7L#GL(ktWbl`1&oRA0HP4|bgjC%W zft)>{m*8@(PaGK0_m|~fvHWnsWIU2dX(FLp50kQ7q?ygRr zw)QS?Z)Yd<2hx;{0@R8(f|j3B^$4qm=GR<#-7bf=l-&se@%BgAfvsr$G{=1*N!}s0 za$r{Ljdq(y=Lu(X`uv`{RXE+~gZG}w7Pwn|BStc}Y_Y{;UOy8X6HI4zpB)&l%+~lE z(ph%`RXWv`1(g{Jx*_&TxA(T-;>R+@!_DFP3+}?mvA=svUWMhvX2Ju zXW4%Q6Ek@Dk^KB9lIOo557PC6uag5DjOJ10FW!GIJO%(L5Zwaof97z#?hL=_>=YSq ze0@lOA!PX*qt=pTqlh{^qA)MqK5o`9!E30%F)g6Fskua*WbZaEfUDDsn>l9ZyR@n1 zLh%b{J)28nMP01~3f37`mT;BFy-Aj~wh^c7zhTtH&s9gu;m9m!Ea1n=F{Gn&IZLg_BjRhVehnGc{71;sWwqN zV~F90R;VEIdIzU*34R?oC9#vtUC6KR?b257ymLuafq|cG=hPykFG{1dqY84cfm*8q zDVxLZXKtONP{|J?IR{$u!`4Z1<#q`*84my)2#gJL4|61aqx=Yu)b4F#{AvPsxp1mw z*a^m*a+0@p)n@_T&e>m2M$W`Y$=`Hay|YDyqsN&cMX{y=qd)uv>rC4BWOS^YJt>&) z3!{dvOIfV1=#1_iI7RZm{O(oL=p0Ytf_o9G@c(P!UEQt|PhJmuYj+(l%{En-3RGEL z3z?_8q7GGUo0!r*r2*AifwXA}2$Nml*HPuSv^;M65O|!El#|q?u%strymd#)NM4$B z*i5GRj@juwph@9+#txpOgW+R*529vrXXg{4DMQz!uqh+9wXA89?rE^QqJ@o#i-pap zi_FAf93x>M{m;goI2K|70v2WW-v_(t5cbbTem{7>WCrjOp9iqtZ2cj_Q766cwSSiV z595f?3B0&3(jgJN*~*pS}1maAp8Kargck^kA$1Op6Y?{m*ID zAye$hBTPqst-zJwk!mHro|gIOjD>MzcJmegOYnE_w_XU@L`_IK+2OR7IN?IHEbsUx%Y gZv#Kz@1H@84^6cdhPc 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 Ys+KAV*3Wj_Imb+}fPLq!bNuOl0Op1zApigX literal 0 HcmV?d00001 diff --git a/target/classes/dev/coomware/Chainmail.class b/target/classes/dev/coomware/Chainmail.class index 8784587bec5d2af3724a0f38455145476ad0c876..ea348a1ad26e4c62351c2efceb27d76a659ca5a0 100644 GIT binary patch literal 3432 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 BPp1F? delta 426 zcmb7pio(RgSlifB zY2tGjFVVu*VooM=&U}-}mAn^Ibe|Bpk*V_mQMOF9~5nm=vZm={qy78cc)%*<`&<`mGnS)o@NDQG#~#huB2(FY(&kcw?6M;_XX@Xt5g}%ljefe-K;k H0T*rGuV*?m diff --git a/target/classes/org/bstats/Metrics$1.class b/target/classes/org/bstats/Metrics$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f8aca3fa03220475b7f7f326588610b402937d1f GIT binary patch literal 1712 zcmbVM*>clL5Itj?D6t3Z1W3TF7Yx`YLFGJA`*e@K{rK_~z;WCkLk|1Yus;iqQWkr0AcuoE zltmepEUGv>L7uZY%;BioJ*MHfh7$~9E5a^Gt8aP?*{S^3hC>Mrt~bsSNrEI$C4Kq%H<@7HHeiZhD_bH?F9~vWks~HDTUEn6oVLw+oIp@ zh!VM|l(J1X@C@^crMP*V(~Q!9f?IG5+x0D{OZH{Aqv0gSDHJ*KC~$1VCXR8nJdHCN z&T`anPQ!VQ3n*&1$Z-jm84B~RD}CvSL4@MxM=)PNF|VP{u^s#;TWb(-8FF@VmPoykfeMVcCYV8U&9=IG=Ws1pzbw5GhK4Br0GA73D6Cs zw>naxC0{-K9;`b39;xa_q~EHe*h1q7IRekImBvZ3fnX-Fjb`!0-$?TBbf=5OXGp!ONV@u*g)?u2>B)PyuuV-;|Sh_ z{5(RA`FDh8*i<2vI!T6#w0uGiC$!M;V{!@G6~Q7@cuO{TCen1V8gZspoFerjejHlkBiU3j(j9^sYNCY7qm5*m57(+UOV|Y$J#s!{_K*I|H#|2KPXhKS0 zLdA=CNkt1@mYi24;-r8sRZc3{Bajg=85Bd$<@CuMEjOi3=`(twTVq(N3pN(S2KTnbS!jQ+48HVVc?lZL3 zIx$yRc4XpzM|-a+l}XXErsv0XK=*Wpjh$U7!^tPIj+4!qiEPoa6Nl(=Wb%}0cofAN zL-)+AU44#JG*Gj+b3}*BG`6aC)Bznnn{dI5@6v|4 z%2pf-%}7VcXdtf_WOb{(Ny(akBG`xwoG`ubKHv1-5jja@(5qO7T>pct+wPzjFP^suS z`O0iYYIf0Th)K_MbS~}e2ikP_}*FrUyg~+h-tkzYR;0zpzRZd z=DISXEmfD2HVv;yNf7?j9GRkfr!%?Q=?a2W)?}o7Uk>;g(K9qin>*`{<#5i-Q*=Hs zL@pdQDe7Hya{HgBqj#1XTj+JyMz24*LgjD}ZKoZ_M*7oh37d&-A&x;bKs3_ba}}(+ z_cHi*v<=_^dNxWC{}2uQBdGjiY$e|2G8`Rvkalzso#-N!awQFMbkkZ};YfpJ(>(~H z7dy&^*&npi2>I(G0>`f+n5xi`?n~ecXkfUB(CChzpzT{Q_Y$M$ zB83z56E}u+l(eF zfnUNkei@7W3U2ai_<>)?&wSBO{umUTqwkNMNKm>RB=Ha)hM;ekDeR(8osdjur8EkD z#G~k=LNsF$duSyK@eLls<5a=~K0rSP$X{8mR+5!<>?Iv#)DwgnB-t>O+vpZ}(*Hfh z{z4NI*!L&43+!K_R*DD=RmCJCzQ6&2Mn-LM3mvx*4Urm|9Qwu~Q%}>H;~8ux+D2yL V)P~y-rhW+Fkx-a;2Bw1HzX8PVgC+m~ literal 0 HcmV?d00001 diff --git a/target/classes/org/bstats/Metrics$AdvancedPie.class b/target/classes/org/bstats/Metrics$AdvancedPie.class new file mode 100644 index 0000000000000000000000000000000000000000..956f2fc22c129ed44d795e923f22c410f04bda0b GIT binary patch literal 2261 zcmbVO+fN)-82=r1*jd=&Qd+2Bp{QuNc51DtfY^3Rb=!p^Tfx@rFne4Ec4yYvS<=3l z^u_3t>688geXWVopvL&*gNgd!C8lb;#OU8(qOHF(!)+}k)d1%^=evL3`F&^j?8XNl z12}@99(!@L4sAH5<9Iz{NF{Ls6FN>N5yz8ic`AuCP9<>~8MRF6m`cLH86DI0XvEX% zFry=@I`qZTdicVB zuJM0&R`tfn%OIsPJz)iwKv!>H#`cP4-t+PWY39qGYo6kAW`0rH0n4f-0{n}l6A^8# zzSf?QO+76a`rEg&xA?MEsHld)ui#lF1@G^KQ4OLw+Fb~^64pPS}2J%>79tIr6TvY12tJI?o8CX)H zU7={}h#4rLXuws{=1pldTve=SatwGV8F&@G4&GbW&U3K6LaI^@ykdwt&RNx|Wi$75 zAbl(F{PlvutT#F>(7Mf_C`8A4)!Mn~Xq%^t_*BoFz#ig#v+50$>rQ#1SPF=9dL!x* zA?mX-U<=nR!Y79;qIAmzg*pjmBlor{_4S%)qc2$HDS3e&H8&&)PU5T@2ZnRp^)2J4 z`2tdQS~8uamCH^0UP<~YxdYp@U`sjCjg5v)p`F0t?ew>U;Y2|eS#oIFa_bf29)5!M z@{`2JO@W!TgQptY%|Ai#c9M3HW0S^6ll=qNAo>U2N6ouD#;~7jqY{bFQ7gVcz4#K{ zGp`j1`QD9M|ADx<)KSb=@HE5YNI@$jo zYE~H%pCCRp^eK#?RpeC3R(xQGA%7^z;QIQ0beoV*EIbG zo#I>ci|;TfuEP}HV@CXddGRBp_z4T*XS^nU!6or4UKhXN4e>kP5`TnE8|P<#1_v>K zA?{f8TKf`slU$R{YQ`lT;;x1_vy2CEnC&t7ggnH5DzvbrZInem9;S~-YnWP(&|f#= zH_)%+(eU>%@i&@;j*-96t7G&}bjC3j)+F#ay^M2TgC}qwX$L*DVGj4Aj+Yk4V7!jF JnZtRl?jK-xN_PMN literal 0 HcmV?d00001 diff --git a/target/classes/org/bstats/Metrics$CustomChart.class b/target/classes/org/bstats/Metrics$CustomChart.class new file mode 100644 index 0000000000000000000000000000000000000000..0cb46122bb780ea0bc026c1d0f383cde9a8aef74 GIT binary patch literal 2126 zcmah~>r)$56#w0@u*r52no=mQcH3e}31yMiClv(>H8s!**q8OO+1xG*o87p(q3uU? z^g|sT$H!>@0>4&A(~ivOH=XfMa@2b6O-h2$c9PxuIOm>oe!p|h-9P{Rbs z=X{@svz`@2oPrP%blcIXqtC?^k#f zpNj(jd|{2-Wd300c-{_5rV|8?$4!SsW;>T`@=ll&fa!F&__X9%X20pXbfV%4gJ#(_kD{T8@o|Q!%#%oc0!N9PWJOyJDxuBiU6EhC zo|-XHH9C%CM8_bms<^Du7SrNs%c#mOU!~0gIR8XJ=TvK7|D1xiFuEW79 zLr+7yR{Ap)*DLanVRYUixJ4rl4C31mrD9yC=xkZRhD^M1!;M!Bw`k~av8H1ko{EwV z9|4u$iMUG$vAkJgRX}mHYt+Efk%Z+j1mrp*}BV}(NFG7MAObz;S$BlVY=!2=o>)=Bf5cR z3O&>uv~!4Nx6pzFjfY0=A(8zZTDFRoJ80j8awXk*4{g7VWPgVG1F5vYpm#S~$=U}{ z*oWv~AEB3hjDzeG9F{U^3P^lsz zuaIG1V~l-+MfNQ&usagv2*uiic4RS1wlnlQfiX$qQXP4cKBp#0YsiP7{DVOiOcDh6d3>j literal 0 HcmV?d00001 diff --git a/target/classes/org/bstats/Metrics$DrilldownPie.class b/target/classes/org/bstats/Metrics$DrilldownPie.class new file mode 100644 index 0000000000000000000000000000000000000000..28679c1a5963752daa7fb063812b493a74522039 GIT binary patch literal 2687 zcmcImTXR!Y6#n+kX-+Puv;v>tBN3w%RY*7cm}T6xw9PStae%KA*mj2*a&ZZM5-&aDbqhXc1%D)?8t6E2ml zNzZeF@seGwI=tPU^@Cz&wi?=DH8bV#jrr=1W)0@g%+J|DI9U)#Jsh?`Ppk9!%2EIy z{p(l$pXpZ#w2DqRt{!vP4sC(0eY>-Hznm%hezD|aidEms9OZI+_M(#y`SQeNyHs-~ zyfBy-=xFTeRtW6SYzlX1VS&w$u}NU&F1eM8!-R@60!hL(n4eLeSP-M2LyKx-q$6d! zqDsC3a^jNSx&w!X<_|R)dmwxDz*dFu0|*tk(CXtc>bl<^)glkrA7jj?TRp5A+JCX# znG5awB?hF?&#A*%W8%CX7$;fDiK}_161u)uHF1G-&aVY|=ZLFDh}8i89+hMZPvBh( z8?aGe)9UC@Vz!A{3wf}Roh|jT;NU$AMa-FSEnLJUhGLe`JS~c{`x-kgH7Amz8=w#>wcIXF7 z(d+1z(<+c|)9$M2B7JJzvSO&scq8uBL>E}kmRx!JawD2q$0zy>x)08W1pZWGHeVs3@a(~ z7S>%~tfdVdh_I;jE0~yiDMl zOyW~%;d9xEFXS5BlwG(jyYYie;jUbVpJW<8%MJKdZq)TShd8dWoc$O?0%tjJhOh^m zJ#dl1vxwm&YIu&fQI+jR-D3C!dnw29g1gwqlY+yy{2li^>yp7|7^beFYpE(;_wWKe z)UCZpYjydTcsoMNhY-7ueiNhmb3pusE@9%}A`T*9Vr=DtOcO7YR@cBi?Ef7b?t!Uz lMJG(ql*Fq%ON`?w?wjZ$jWfh_oWP1=AQ~sO&)^*+{x|$Bxex#V literal 0 HcmV?d00001 diff --git a/target/classes/org/bstats/Metrics$MultiLineChart.class b/target/classes/org/bstats/Metrics$MultiLineChart.class new file mode 100644 index 0000000000000000000000000000000000000000..c8509445170fa5c9fbb8d01493028fe176d917b7 GIT binary patch literal 2270 zcmbVO+fy4=82_DzH-V6OONE8wweQc)=<=hF|wc zd*%7sQwPNJMzwLY4X3OZe9v;qnNT6%nX`$%gm6D5MxBns0bY2Eh9XQ2B?uLtXeeWy;?Q78=7v;1)TAC(NW-QSbqAt@gQmeo zMS~-yUHj5-#F|*){Ah4d)$l1i71XyA|2hhUsTMlfdd+t$jrmG8ol^VZ=X~KAzU%Gg z6a>CkY=)i|vm!wq8J6q7zM~dz7(rCNcMOLK^81PJ0bR9fGnJ}OP$zE$yjTGIf}r=H zd)Fd(dx%9qJqc!s+#!#O6Ob4U=?>xqeT$CJw~5|2 ziD#nybmDlK{utqRfao#em_#E)lj+e%VCk{%!M~+r1jlLZkRm>dHa>?0&ts5ygP}TI zFhnOZ#H)CXT*{rih~pIPwLOl!FuZyg3Pz9)FJ=|;qmt(R9}!u71SQ{~^Xc!vchJW0 z3!)3-zd{?|fy(eTu^uWD3Y}sMJBTw(w)M5`AR%Sv~+bO-Hn-?5F(ZxDU( z3Fu zz9gPpe_$YrsURnYcgf2%?K$4VNuvGap%*K71#xOx6l2ji;bsMEO8jpt CRz%GJ literal 0 HcmV?d00001 diff --git a/target/classes/org/bstats/Metrics$SimpleBarChart.class b/target/classes/org/bstats/Metrics$SimpleBarChart.class new file mode 100644 index 0000000000000000000000000000000000000000..1c5d9fb168f23cda7cd054578827b38890611f35 GIT binary patch literal 2298 zcmbVO>r)$56#w1LCY#6dXj+ia(o%~R0yIjoDj-S&t+WBEsTAt-vaDh0W;gEMAUI>S z9UpD~gZ>46tutB%nQ{E&2md6;sh+zV9-*nNPLe(Mp7T5Bp6A{C@#vRd0SrSVk-6Ej>zR}fKi4-(JDDy zR6Rmp`*-x%KJg5%)V4NvO1Yx&ET=RY0s_voBg~TNjgHfYAvR_?mKbLk?%ju}(|V$h zee(=z-d!dKTMCwA&Q{Ayrgt?AFkNsd+Ij9-a$jSrV#V?qnu}JsVw>l=mtWzYV9=)> z$Mo_x_kEM(rwXoD$}RbV3qLnwQV53MQ?Em=Ylc*wUS>!??m9zzy#pJS9VhJn9O?hg zugs8MGDQ&PBp00FcyC|9aLc)p>y~UYSMpsacZnWzORJ_KD6D3KQ-NG>W1ibpnT?|j z@e`iMHwYf3w(&NIPKC6sz887|HsRFe;P_(=jqM&DTdN%!Df5af>t2^qW09EysR+$K zYr`>|t2g-UicLkqjT_`c&`C6@G@lwiWJpe}8)ijVuH$R?i1tOd>KWz*OHP?yYo0SQ z3?0Yuv5rn0W$1iz2_)=t+Hzd=R@WXZRFg*;J zM#lveWaw%nyW&}8OIT}Uwk*xI24;i#4W~?c>F97#(ec>+ z$ya^hmTM!Ls@tXa!kiYS$A#649Xav_6v8Z|X)iS`utzF;S>)<;vk&d>){aJIJ zEUHdG;xx~}XdVbHtjlN+8egVcsk^t~tWDWwncNJ3F|u{pB=?6JBBnn^lk_6X z(2I>OMcL^@kI_y+7yYQpI6<_VI0n%O(Nwm76D&LMGn5}`8zBQgvlJS7ApEN5FX45w9^QAZyS-tO{j$$oyqM}{2lt>7Bq(Y#Ckx>IKvha3?phr-9l0dCgdt574(tlHk!y>^GGZc+eXV` zCc1@IDLS-?^g|pTkc=ae(UyrlMEehaZ}+F48=zJH1M)@<;vORZp?rzBaucn}SLjl{ zMpn6v0p%OaDc@p2`3{cqJ#H#@a7($1JIcKvH{aBLykT#BPye;wx+QSq&q>ca;4FUBlR) pxQI6b-x=H=kLRB0Os*nMI7lERAdxnRfLg?<2q&( z=qfsKBZ_h9ys2PL!8}9M;Euyfj>#}u*yLMWuL;}H4bL@dzHhoh&o==J46&kZxm?tI zLeI5FFE+vscP+greA~4amMBB#qV3vZiD5o<9?(AHLVBGclK09)-czt$^F^&vGW}N# z@ri;*m8^5$mUhz_5gT?;mtCnk=9*0>wH4Pj{k+42z@*Sf!SgM>6bLQ?ebpqPMle;h zn{X1W7#rLdD`kendBF^WXKA;qf2p7ScYQ58CTrF#Q{<(JCtPrnoJtoAucBL?XE~;B z1)i%vr_amMrfCS094XgvL+w!=TimHpL%NEB8*f*6wcazD8JZLZb@`oPR)y`kfr8s) z7rmNqm``mvC|a{oGjd)u^x}>N4P6Y$f9sO4y9(}UxDV3UTOYMk)1hGz4>T;{p@K&Y zL+!4Gde9=AuLZ)Z)EmVRKV$WsupQUMFwo+PWWU2H`5kWi7^utg;V|^mZJcC3z5~S$ zmMc}UUC;K0^zd?d&G)LNFMZQ3m``PCz89$?alTND)8mfQW2dNWJFVShh0sGk>MSnM znjnusYnaw}CVK#u$?YNZnanWy=-Vwr>?1nZC#Y-({p1^Kz%hVJWYIxfMv_v>og@n3 z3hlLHk0fkR4=0>obV_8lDKd&ljFND=O$<_Jk|bfGE;95BV+tk} iOfg&~PlPbnC^}915K_2EYl3zvX6a;%N}R>5NbC<#L{2#X literal 0 HcmV?d00001 diff --git a/target/classes/org/bstats/Metrics$SingleLineChart.class b/target/classes/org/bstats/Metrics$SingleLineChart.class new file mode 100644 index 0000000000000000000000000000000000000000..ff9940bd96e7dfca807f0e6eef8a0748e10f9b78 GIT binary patch literal 1417 zcmb7E>rN9v6#iyg*j^TpauKnBAWCVG1w>E_cqy3F6fvnG@#l2AE{n@rad^ow8O92`e4p!8VLQ6vxklCZO;_l-1|Z82E!vjL zMb#(tVte#TecR!#rRQB?TBe^}qY#}dwrh(u@=rA(io&;DE89L~c6ys3ob$?*y{BNi z=CkTv$@E{;*(VAf9c7#QwzM0IVXMR~Z<@r$2qynjHadw zhPS6%o<}Ftt-y2jr}Wz@?V5%l&f#(mmu!#f*ym1_bY*#luA<<^>rGy%iAb%)5ZicT zm=$4rZlK~W*+sAF8|D*R_KnsMY*x09hF;v$(1mV>;lC4;u=^^q8dk8%&|B-g=4R2b zh6frR;*o~O$f;OonD}>*NRSqwTs08hUZeE!b5`G3=F>AW474bi6hD-b|B<%$gd~@D zilLuMa~A!yAQ9UY+jX@m9Od5L0F_Kx^0Pa17!KS>%XeT&0k5CKD-0(p)=TkqPUmM-av+#u|y=QXH8${S~2? z#|RhFAE10j2g7%C9zk7Az9Zu>lZYfgA$o*Z=8({JUc>ajL778Dna7Z_fTXgBQDq4! zWx0uCy1|iNL}EQojE3mg6Sz(cCMi}F>?cN5++es#W|#m|w3VW{f@uPyrc#_9-OB{l JXj~3Qe*?CVT_OMg literal 0 HcmV?d00001 diff --git a/target/classes/org/bstats/Metrics.class b/target/classes/org/bstats/Metrics.class new file mode 100644 index 0000000000000000000000000000000000000000..e1cb82ad61e1357d8f31b41176520cc50a6bfee0 GIT binary patch literal 14557 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 L#`-h=h5!6NzBtY- literal 0 HcmV?d00001 diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml index b12a29f..1a69dc8 100644 --- a/target/classes/plugin.yml +++ b/target/classes/plugin.yml @@ -1,6 +1,6 @@ name: Chainmail main: dev.coomware.Chainmail -version: 1.1.0 +version: 1.2.0 description: Plugin which adds a recipe for chainmail armor using chains. author: CoomWare api-version: 1.16 \ No newline at end of file diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties index 25b7cc9..6fee238 100644 --- a/target/maven-archiver/pom.properties +++ b/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Sat Jul 11 11:59:33 CDT 2020 -version=1.0-SNAPSHOT +#Mon Jul 13 11:04:22 CDT 2020 +version=1.2.0 groupId=dev.coomware artifactId=Chainmail diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 0e7e51e..869c640 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,2 +1,12 @@ dev\coomware\Chainmail.class +org\bstats\Metrics$SimpleBarChart.class +org\bstats\Metrics$1.class +org\bstats\Metrics.class +org\bstats\Metrics$AdvancedPie.class +org\bstats\Metrics$SimplePie.class +org\bstats\Metrics$DrilldownPie.class +org\bstats\Metrics$MultiLineChart.class +org\bstats\Metrics$AdvancedBarChart.class +org\bstats\Metrics$CustomChart.class dev\coomware\CheaperChains.class +org\bstats\Metrics$SingleLineChart.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 97f1038..452d526 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,2 +1,3 @@ +C:\Users\Nilbog\Documents\NetBeansProjects\Chainmail\src\main\java\org\bstats\Metrics.java C:\Users\Nilbog\Documents\NetBeansProjects\Chainmail\src\main\java\dev\coomware\Chainmail.java C:\Users\Nilbog\Documents\NetBeansProjects\Chainmail\src\main\java\dev\coomware\CheaperChains.java