diff --git a/ClientMain.class b/ClientMain.class index 250637acb0fc3986e4b8af3524b3940bd8e03e7f..0718a90f548d9eaebf0d35de7656a22ea70bea63 100644 Binary files a/ClientMain.class and b/ClientMain.class differ diff --git a/ClientMain.java b/ClientMain.java index ec60cc538c7373d7ea8261f3a4f97a9990875e0f..8645bd682e707662cb6b3dafbffaad6d205d8f18 100644 --- a/ClientMain.java +++ b/ClientMain.java @@ -37,7 +37,6 @@ public class ClientMain { Client client = null; try { - client = new Client(cport, timeout, Logger.LoggingType.ON_FILE_AND_TERMINAL); try { client.connect(); } catch(IOException e) { e.printStackTrace(); return; } @@ -74,7 +73,6 @@ public class ClientMain { try { list(client); } catch(IOException e) { e.printStackTrace(); } */ - } finally { if (client != null) try { client.disconnect(); } catch(Exception e) { e.printStackTrace(); } diff --git a/Controller$1AcksReceived.class b/Controller$1AcksReceived.class index 006d665a491cd54080fef1132fe21d339e435a9f..de2954fe46168c4914df9082fb7b12d7647ea5ed 100644 Binary files a/Controller$1AcksReceived.class and b/Controller$1AcksReceived.class differ diff --git a/Controller$IndexEntry$Status.class b/Controller$IndexEntry$Status.class new file mode 100644 index 0000000000000000000000000000000000000000..538373f672d4086f88c7da4147a9b795369b667b Binary files /dev/null and b/Controller$IndexEntry$Status.class differ diff --git a/Controller$IndexEntry.class b/Controller$IndexEntry.class index 64003c3c96a02e9e921e9d6eb5a319357ddc74dc..dff648ecf50c78eda664bec5691882c2ca402a68 100644 Binary files a/Controller$IndexEntry.class and b/Controller$IndexEntry.class differ diff --git a/Controller$RebalanceMessages.class b/Controller$RebalanceMessages.class index 80d167489f739ee9eba94387b9449faf8167dd0c..8f171388f336657f23cacef98aa5d8958240084c 100644 Binary files a/Controller$RebalanceMessages.class and b/Controller$RebalanceMessages.class differ diff --git a/Controller$RebalanceThread.class b/Controller$RebalanceThread.class index 33a49d5601312bef9a9513a5464c7a61da1c5024..25e1c787e72efd4e87508bd8fff5ab539839fb1a 100644 Binary files a/Controller$RebalanceThread.class and b/Controller$RebalanceThread.class differ diff --git a/Controller$Reloader.class b/Controller$Reloader.class index 506b3988a3dbd4a35223a628cb012c5b5a9b92c7..fe4456dcdad54991ba96e5ef3e7972b65c43e9ab 100644 Binary files a/Controller$Reloader.class and b/Controller$Reloader.class differ diff --git a/Controller.class b/Controller.class index 514327fe08525b5aa27de405c9c8ade4f55b05cd..f8f4f7fba84db7c0c456b8882bec45b194ed4beb 100644 Binary files a/Controller.class and b/Controller.class differ diff --git a/Controller.java b/Controller.java index edcfa3892321be7d6b49d38e22f43e598e2e07b1..de3651a37cee5e217346e0e781f6def63ef82d9b 100644 --- a/Controller.java +++ b/Controller.java @@ -16,17 +16,24 @@ public class Controller { protected int timeout; //in milliseconds protected int rebalancePeriod; //How long to wait to start the next rebalance operation, in milliseconds - protected class IndexEntry { + protected static class IndexEntry { + public static enum Status { + STORE_IN_PROGRESS, + STORE_COMPLETE, + REMOVE_IN_PROGRESS, + REMOVE_COMPLETE + } + protected long filesize; protected List<Integer> storedBy; protected int numberToStore; - protected String status; + protected Status status; public IndexEntry() { filesize = -1; storedBy = Collections.synchronizedList(new ArrayList<Integer>()); numberToStore = 0; - status = "store in progress"; + status = Status.STORE_IN_PROGRESS; } public synchronized void setFilesize(long filesize) { @@ -74,11 +81,11 @@ public class Controller { numberToStore = i; } - public synchronized void setStatus(String status) { + public synchronized void setStatus(Status status) { this.status = status; } - public synchronized String getStatus() { + public synchronized Status getStatus() { return status; } } @@ -148,7 +155,7 @@ public class Controller { BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); String[] message = in.readLine().split(" "); if(message[0].equals("JOIN")) { - dstores.put(Integer.parseInt(message[1]), new DstoreConnection(client)); + dstores.put(Integer.parseInt(message[1]), new DstoreConnection(client, timeout)); System.out.println("Dstore at " + message[1] + " joined"); try {rebalanceThread.interrupt();} catch(SecurityException e) {e.printStackTrace();} } @@ -250,22 +257,33 @@ public class Controller { } try { - if(index.containsKey(filename)) { - PrintWriter out = new PrintWriter(client.getOutputStream()); - out.println("ERROR_FILE_ALREADY_EXISTS " + filename); - out.flush(); - return; + //Create a new entry in the index + IndexEntry entry; + synchronized(index) { + if(!index.containsKey(filename)) { + entry = new IndexEntry(); + } + else { + entry = index.get(filename); + if(entry.getStatus() == IndexEntry.Status.REMOVE_IN_PROGRESS || entry.getStatus() == IndexEntry.Status.REMOVE_COMPLETE) { + index.remove(filename); + entry = new IndexEntry(); + } + else { + PrintWriter out = new PrintWriter(client.getOutputStream()); + out.println("ERROR_FILE_ALREADY_EXISTS " + filename); + out.flush(); + return; + } + } + index.put(filename, entry); } - - //Update index to "store in progress" - IndexEntry entry = new IndexEntry(); - index.put(filename, entry); entry.setFilesize(filesize); //Select Dstores Integer[] storesToStore = new Integer[rFactor]; synchronized(dstores) { - Iterator<Integer> it = dstores.keySet().iterator(); + Iterator<Integer> it = reshuffle(dstores.keySet()).iterator(); for(int i=0; i<rFactor; i++) { storesToStore[i] = it.next(); } @@ -294,9 +312,9 @@ public class Controller { System.out.println("Dstore " + thisStore + " should have sent STORE_ACK but Controller received " + receivedMessage[0]); } } - catch(NullPointerException e) { + catch(DstoreDisconnectException e) { e.printStackTrace(); - //removeDstore(thisStore); + removeDstore(thisStore); } }).start(); } @@ -319,7 +337,7 @@ public class Controller { } //Update index to "store complete" - entry.status = "store complete"; + entry.status = IndexEntry.Status.STORE_COMPLETE; //Send STORE_COMPLETE message out.println("STORE_COMPLETE"); @@ -342,7 +360,7 @@ public class Controller { void load(Socket client, String filename) throws Exception { try { - if(!index.containsKey(filename)) { + if(!index.containsKey(filename) || index.get(filename).status != IndexEntry.Status.STORE_COMPLETE) { PrintWriter out = new PrintWriter(client.getOutputStream()); out.println("ERROR DOES_NOT_EXIST"); out.flush(); @@ -391,7 +409,7 @@ public class Controller { void remove(Socket client, String filename) throws Exception { try { - if(!index.containsKey(filename)) { + if(!index.containsKey(filename) || index.get(filename).status != IndexEntry.Status.STORE_COMPLETE) { PrintWriter clientOut = new PrintWriter(client.getOutputStream()); clientOut.println("ERROR DOES_NOT_EXIST"); clientOut.flush(); @@ -400,7 +418,7 @@ public class Controller { //Update index to "remove in progress" IndexEntry entry = index.get(filename); - entry.status = "remove in progress"; + entry.status = IndexEntry.Status.REMOVE_IN_PROGRESS; //Send REMOVE message to all Dstores storing the file for(Integer dstore : entry.getStoredBy()) { @@ -415,9 +433,9 @@ public class Controller { System.out.println("Dstore " + dstore + " should have sent REMOVE_ACK but Controller received " + message[0]); } } - catch(NullPointerException e) { + catch(DstoreDisconnectException e) { e.printStackTrace(); - //removeDstore(dstore); + removeDstore(dstore); } }).start(); } @@ -438,8 +456,10 @@ public class Controller { } //Update index to "remove complete" - entry.status = "remove complete"; - index.remove(filename); + entry.status = IndexEntry.Status.REMOVE_COMPLETE; + synchronized(index) { + if(index.get(filename) == entry) index.remove(filename); + } //Send REMOVE_COMPLETE to client PrintWriter clientOut = new PrintWriter(client.getOutputStream()); @@ -457,7 +477,7 @@ public class Controller { //Send file list to client String message = "LIST "; for(String name : index.keySet()) { - message = message + name + " "; + if(index.get(name).status == IndexEntry.Status.STORE_COMPLETE) message = message + name + " "; } PrintWriter out = new PrintWriter(client.getOutputStream()); System.out.println("Sending..."); @@ -484,9 +504,9 @@ public class Controller { String[] message = dstores.get(dstore).sendAndReceive("LIST").split(" "); receiveDstoreList(dstore.intValue(), message); } - catch(NullPointerException e) { + catch(DstoreDisconnectException e) { e.printStackTrace(); - //removeDstore(dstore); + removeDstore(dstore); } }).start(); } @@ -503,7 +523,7 @@ public class Controller { //Files are evenly distributed (Dstores differ in capacity by at most 1, no 2 datastores have identical file lists) List<Integer> storeOrder = reshuffle(dstoreFiles.keySet()); List<String> fileList = new ArrayList<String>(); - for(Integer i : reshuffle(dstoreFiles.keySet())) { + for(Integer i : storeOrder) { for(String s : dstoreFiles.get(i)) { if(!fileList.contains(s)) { fileList.add(s); @@ -523,7 +543,7 @@ public class Controller { for(String file : fileList) { for(int j=0; j<rFactor; j++) { if(it == null || !it.hasNext()) { - it = dstoreFiles.keySet().iterator(); + it = storeOrder.iterator(); } //If indexed dstore does not have the file, add it to its requireIndex entry Integer thisStore = it.next(); @@ -534,7 +554,7 @@ public class Controller { //Dstores not chosen in the above loop must have an entry added to removeIndex, if they have the file for(int j=0; j<(requireIndex.size() - rFactor); j++) { if(it == null || !it.hasNext()) { - it = dstoreFiles.keySet().iterator(); + it = storeOrder.iterator(); } Integer thisStore = it.next(); @@ -573,6 +593,7 @@ public class Controller { } } } + if(fileMessage.equals("")) continue; fileMessage = file + " " + (fileMessage.trim().split(" ").length) + fileMessage; sendMessages.add(fileMessage); } @@ -603,9 +624,9 @@ public class Controller { } } } - catch(NullPointerException e) { + catch(DstoreDisconnectException e) { e.printStackTrace(); - //removeDstore(thisStore); + removeDstore(thisStore); } }).start(); } @@ -666,9 +687,7 @@ public class Controller { for(String file : list) { if(!index.containsKey(file)) { //Log error - //return; //Throw exception? - //Ignore those, there might be new resources a joining Dstore wants to contribute - //Then again, there might be malformed messages. Think about this. + return; //Throw exception? } toList.add(file); } @@ -692,11 +711,13 @@ public class Controller { } } - List<Integer> reshuffle(Collection<Integer> col) { - List<Integer> list = new ArrayList<Integer>(); - for(Integer i : col) { - list.add(0, i); + <T> List<T> reshuffle(Collection<T> col) { + List<T> list = new ArrayList<T>(); + Iterator<T> it = col.iterator(); + while(it.hasNext()) { + list.add(it.next()); } + Collections.shuffle(list); return list; } diff --git a/Dstore.class b/Dstore.class index 5a496f658f3927ece60f8eebab9b968dd8e10c43..ff1e5b46bfd884be9e7581f53b80d4c57d1bce07 100644 Binary files a/Dstore.class and b/Dstore.class differ diff --git a/Dstore.java b/Dstore.java index 9332ba933872b1578e1e2333d3c72b6997170c1c..f9c67703844d390cfb9b4c8e245a6873ae7bb093 100644 --- a/Dstore.java +++ b/Dstore.java @@ -35,7 +35,7 @@ public class Dstore { fileSizes = new HashMap<String,Long>(); for(File file : fileFolder.listFiles()) { - fileSizes.put(file.getName(), Long.valueOf(file.length())); + if(!file.delete()) throw new Exception("Directory specified has undeletable files; please try a different directory"); } } @@ -247,7 +247,11 @@ public class Dstore { String[] filesToRemove; int index; - System.out.println("Interpreting message..."); + String tmessage = ""; + for(String s : message) { + tmessage = tmessage + " " + s; + } + System.out.println("Interpreting message:" + tmessage); int numberToSend = Integer.parseInt(message[1]); index = 2; filesToSend = new HashMap<Integer,List<String>>(); diff --git a/DstoreConnection$ReceiveContext.class b/DstoreConnection$ReceiveContext.class new file mode 100644 index 0000000000000000000000000000000000000000..29a6f8871a554ee11deeab64ee52990e0810f08f Binary files /dev/null and b/DstoreConnection$ReceiveContext.class differ diff --git a/DstoreConnection.class b/DstoreConnection.class index 4cd5bbd5bd6e2a239616b6ab9228d2a0898566e7..78bdda2b66cc70e62e1b5a96c7af9d389228ec03 100644 Binary files a/DstoreConnection.class and b/DstoreConnection.class differ diff --git a/DstoreConnection.java b/DstoreConnection.java index bdd3bc17f7293521ca347c0046075dc118554799..4778e9921fcc9a78d81dfa445f046bb585380266 100644 --- a/DstoreConnection.java +++ b/DstoreConnection.java @@ -15,9 +15,11 @@ public class DstoreConnection { protected PrintWriter writer; protected boolean available; protected List<String> queue; + protected int timeout; - public DstoreConnection(Socket socket) { + public DstoreConnection(Socket socket, int timeout) { this.socket = socket; + this.timeout = timeout; try { reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream()); @@ -34,7 +36,7 @@ public class DstoreConnection { } } - public String sendAndReceive(String message, String expectedMessage) throws NullPointerException { + public String sendAndReceive(String message, String expectedMessage) throws DstoreDisconnectException { System.out.println("Getting lock..."); synchronized(this) { try { @@ -48,16 +50,16 @@ public class DstoreConnection { catch(NullPointerException e) { System.out.println("Dstore disconnected"); available = false; - throw new NullPointerException(); + throw new DstoreDisconnectException(); } } } - public String sendAndReceive(String message) throws NullPointerException { + public String sendAndReceive(String message) throws DstoreDisconnectException { return sendAndReceive(message, null); } - public String receive(String expectedMessage) throws NullPointerException { + public String receive(String expectedMessage) throws DstoreDisconnectException { System.out.println("Getting lock..."); synchronized(this) { System.out.println("Lock acquired"); @@ -76,19 +78,34 @@ public class DstoreConnection { } } - public String receive() throws NullPointerException { + public String receive() throws DstoreDisconnectException { return receive(null); } - protected String localReceive(String expectedMessage) throws NullPointerException { + protected String localReceive(String expectedMessage) throws DstoreDisconnectException { try { + ReceiveContext rc = new ReceiveContext(expectedMessage); + synchronized(rc.lock) { + rc.start(); + rc.lock.wait(timeout); + rc.end(); + } + String returnMessage = rc.getReturnMessage(); + if(returnMessage == null) throw new DstoreDisconnectException(); + else return returnMessage; + } + catch(InterruptedException e) { + e.printStackTrace(); + } + + /* String returnMessage = null; do { returnMessage = reader.readLine(); if(returnMessage == null) { System.out.println("Dstore disconnected"); available = false; - throw new NullPointerException(); + throw new DstoreDisconnectException(); } if(expectedMessage != null && !expectedMessage.equals(returnMessage.split(" ")[0])) { queue.add(returnMessage); @@ -104,5 +121,69 @@ public class DstoreConnection { e.printStackTrace(); return ""; } + */ + return ""; + } + + //Seperate class for enabling timeouts while receiving messages + protected class ReceiveContext { + protected String expectedMessage; + protected String returnMessage; + protected Thread thread; + public Object lock; + + public ReceiveContext(String expectedMessage) { + this.expectedMessage = expectedMessage; + returnMessage = ""; + lock = new Object(); + } + + public String getReturnMessage() { + synchronized(lock) { + return returnMessage; + } + } + + public void start() { + thread = new Thread(() -> { + try { + String message = null; + do { + message = reader.readLine(); + if(message == null) { + System.out.println("Dstore disconnected"); + available = false; + throw new DstoreDisconnectException(); + } + if(expectedMessage != null && !expectedMessage.equals(message.split(" ")[0])) { + queue.add(message); + if(queue.size() > MAX_QUEUE_SIZE) queue.remove(0); + message = null; + } + } + while(message == null); + System.out.println("Controller received " + message); + returnMessage = message; + } + catch(IOException e) { + e.printStackTrace(); + returnMessage = ""; + } + catch(DstoreDisconnectException e) { + e.printStackTrace(); + returnMessage = null; + } + finally { + synchronized(lock) { + lock.notify(); + } + } + }); + thread.start(); + } + + public void end() { + if(thread.isAlive()) thread.interrupt(); + } } } diff --git a/DstoreDisconnectException.class b/DstoreDisconnectException.class new file mode 100644 index 0000000000000000000000000000000000000000..f1a70dafe9f2cfe9e9879cbf5b4fc17a31599470 Binary files /dev/null and b/DstoreDisconnectException.class differ diff --git a/DstoreDisconnectException.java b/DstoreDisconnectException.java new file mode 100644 index 0000000000000000000000000000000000000000..085512f94676526c5f35c1125e86d51051dcabbd --- /dev/null +++ b/DstoreDisconnectException.java @@ -0,0 +1,7 @@ +import java.lang.Throwable; + +public class DstoreDisconnectException extends Exception { + public DstoreDisconnectException() { + super("Dstore has been disconnected"); + } +} diff --git a/downloads/AllStar.txt b/downloads/AllStar.txt deleted file mode 100644 index 26e7fef6a612a37a14b5c714eb89e0db758c453f..0000000000000000000000000000000000000000 --- a/downloads/AllStar.txt +++ /dev/null @@ -1,68 +0,0 @@ -Somebody once told me the world is gonna roll me -I ain't the sharpest tool in the shed -She was looking kind of dumb with her finger and her thumb -In the shape of an "L" on her forehead - -Well, the years start coming and they don't stop coming -Fed to the rules and I hit the ground running -Didn't make sense not to live for fun -Your brain gets smart but your head gets dumb - -So much to do, so much to see -So what's wrong with taking the back streets? -You'll never know if you don't go -You'll never shine if you don't glow - -Hey, now, you're an all-star, get your game on, go play -Hey, now, you're a rock star, get the show on, get paid -And all that glitters is gold -Only shooting stars break the mold - -It's a cool place and they say it gets colder -You're bundled up now wait 'til you get older -But the meteor men beg to differ -Judging by the hole in the satellite picture - -The ice we skate is getting pretty thin -The water's getting warm so you might as well swim -My world's on fire. How about yours? -That's the way I like it and I'll never get bored - -Hey, now, you're an all-star, get your game on, go play -Hey, now, you're a rock star, get the show on, get paid -And all that glitters is gold -Only shooting stars break the mold - -Go for the moon -Go for the moon -Go for the moon -Go for the moon - -Hey, now, you're an all-star, get your game on, go play -Hey, now, you're a rock star, get the show on, get paid -And all that glitters is gold -Only shooting stars - -Somebody once asked could I spare some change for gas -I need to get myself away from this place -I said yep, what a concept -I could use a little fuel myself -And we could all use a little change - -Well, the years start coming and they don't stop coming -Fed to the rules and I hit the ground running -Didn't make sense not to live for fun -Your brain gets smart but your head gets dumb - -So much to do, so much to see -So what's wrong with taking the back streets? -You'll never know if you don't go -You'll never shine if you don't glow - -Hey, now, you're an all star, get your game on, go play -Hey, now, you're a rock star, get the show on, get paid -And all that glitters is gold -Only shooting stars break the mold - -And all that glitters is gold -Only shooting stars break the mold diff --git a/downloads/Grandad.txt b/downloads/Grandad.txt deleted file mode 100644 index 4891fefac0cf249710bf741d61da79973e52b19b..0000000000000000000000000000000000000000 --- a/downloads/Grandad.txt +++ /dev/null @@ -1,14 +0,0 @@ -(Yabba Dabba Doo!) - -Flintstones. Meet the Flintstones. -They're the modern stone age family. -From the town of Bedrock, -They're a page right out of history. - -Let's ride with the family down the street. -Through the courtesy of Fred's two feet. - -When you're with the Flintstones -Have a yabba dabba doo time. -A dabba doo time. -We'll have a gay old time. diff --git a/downloads/PumpkinHill.txt b/downloads/PumpkinHill.txt deleted file mode 100644 index e2458051c174c0173e4758ece47fe05f97fa6425..0000000000000000000000000000000000000000 --- a/downloads/PumpkinHill.txt +++ /dev/null @@ -1,68 +0,0 @@ -You know me, the fighting freak Knuckles, -And we're at Pumpkin Hill, -You ready? - -I ain't gonna let it get to me, I'm just gonna creep, -Down in Pumpkin Hill I gots to find my lost piece. -I know that it's here, I can sense it in my feet, -The great Emerald's power allows me to feel. -I can't see a thing but it's around somewhere, -I'm gonna hold my head 'cause I have no fear. -This probably seems crazy, crazy, a graveyard theory, -A ghost tried to approach me and got leery. - -Asked him a question and he vanished in a second, -I'm walkin' through valleys cryin' pumpkin in the alley. -Didn't seem happy but they sure tried to get me, -Had to back 'em up with the fist, metal crack 'em. -I'm hearing someone sayin' "You a chicken, don't be scared!" -It had to be the wind, 'cause nobody wasn't there. -I searched and I searched as I climbed up the wall, -And then I started to fly, I went in deeper! - -Let it get to me? I'm just gonna creep, -Down in Pumpkin Hill I gots to find my lost piece. -I know that it's here, I sense it in my feet, -The great Emerald's power allows me to feel. -I can't see a thing but it's around somewhere, -I gotta hold my head, I have no fear. -It probably seems crazy, crazy, a graveyard theory, -A ghost tried to approach me, he got leery. - -(This is Knuckles, who fears none.) -(It's real deal when it comes to my name, kid!) - -I ain't gonna let it get to me, I'm just gonna creep, -Down in Pumpkin Hill I gots to find my lost piece. -I know that it's here, I can sense it in my feet, -The great Emerald's power allows me to feel. -I can't see a thing but it's around somewhere, -I'm gonna hold my head 'cause I have no fear. -This probably seems crazy, crazy, a graveyard theory, -A ghost tried to approach me and got leery. - -Asked him a question and he vanished in a second, -I'm walkin' through valleys cryin' pumpkin in the alley. -Didn't seem happy but they sure tried to get me, -Had to back 'em up with the fist, metal crack 'em. -I'm hearing someone sayin' "You a chicken, don't be scared!" -It had to be the wind, 'cause nobody wasn't there. -I searched and I searched as I climbed up the wall, -And then I started to fly, I went in deeper! - -Let it get to me? I'm just gonna creep, -Down in Pumpkin Hill I gots to find my lost piece. -I know that it's here, I sense it in my feet, -The great Emerald's power allows me to feel. -I can't see a thing but it's around somewhere, -I gotta hold my head, I have no fear. -It probably seems crazy, crazy, a graveyard theory, -A ghost tried to approach me, he got leery. - -(Spooky up in here, it's crazy in here,) -(We still gon' keep it goin', I'm Knuckles.) -(Nobody scares me,) -(Whoever want it, bring it!) -(I don't care, we 'ka do this.) -(Then come step up to the plate, and meet your match,) -(It ain't no thang.) diff --git a/downloads/SnowHalation.txt b/downloads/SnowHalation.txt deleted file mode 100644 index 09add47583fb1f43d001d762e3e5240b05dfd2f9..0000000000000000000000000000000000000000 --- a/downloads/SnowHalation.txt +++ /dev/null @@ -1,36 +0,0 @@ -Fushigi da ne ima no kimochi -Sora kara futte kita mitai -Tokubetsu na kisetsu no iro ga tokimeki o miseru yo - -Hajimete deatta toki kara -Yokan ni sawagu kokoro no Melody -Tomerarenai tomaranai na・ze - -Todokete -Setsunasa ni wa namae o tsukeyou ka "Snow halation" -Omoi ga kasanaru made matezu ni -Kuyashii kedo suki tte junjou -Binetsu no naka tameratte mo dame da ne -Tobikomu yuuki ni sansei mamonaku Start!! - -Oto mo naku kehai mo naku -Shizuka ni unmei wa kawaru -Korekara no mirai ni mune no kodou ga hayaku naru - -Tatoeba komatta toki ni wa -Sugu kaketsukete dakishimetakute -Doko ni ite mo dokodemo Fly high - -Isoide -Itsu no ma ni ka ookiku nari sugita "True emotion" -Yume dake miteru you ja tsurai yo -Koibito wa kimi tte iitai -Yasashii me ga tomadotteru iya da yo -Kono mama ikki ni aijou azukete Please!! - -Todokete -Setsunasa ni wa namae o tsukeyou ka "Snow halation" -Omoi ga kasanaru made matezu ni -Kuyashii kedo suki tte junjou -Binetsu no naka tameratte mo dame da ne -Tobikomu yuuki ni sansei mamonaku Start!! diff --git a/downloads/Unknown.txt b/downloads/Unknown.txt deleted file mode 100644 index bc6fa8e0659ed9ceac67a549318061a700ef5180..0000000000000000000000000000000000000000 --- a/downloads/Unknown.txt +++ /dev/null @@ -1,74 +0,0 @@ -Here I come, rougher than the rest of them -The best of them, tougher than leather -You can call me Knuckles, unlike Sonic I don't chuckle -I'd rather flex my muscles - -I'm hard as nails, it ain't hard to tell -I break 'em down whether they're solid or frail -Unlike the rest I'm independent since my first breath -First test, feel the right, than the worst's left - -Born on an island in the heavens -The blood of my ancestors flows inside me -My duty is to save the flower -From evil deterioration - -I will be the one to set your heart free, true -Cleanse yourself of them evil spirits that's in you - -Streaking lights, loud sounds, and instincts -Are the elements that keep me going -I am fighting my own mission -Nothing's gonna stand in my way - -I will be the one to set your heart free, true -Cleanse yourself of them evil spirits that's in you - -Won't be frightened, I'll stand up to all the pain and turmoil -Just believe in myself, won't rely on others -Get this power to wipe out the havoc and anarchy -This is my planet, gonna fight for my destiny - -Here I come, rougher than the rest of them -The best of them, tougher than leather -You can call me Knuckles, unlike Sonic I don't chuckle -I'd rather flex my muscles - -I'm hard as nails, it ain't hard to tell -I break 'em down whether they're solid or frail -Unlike the rest I'm independent since my first breath -First test, feel the right, than the worst's left - -I have no such things as weak spots -Don't approve of him but gotta trust him -This alliance has a purpose -This partnership is only temporary - -I will be the one to set your heart free, true -Cleanse yourself of evil spirits that got in you - -Won't be frightened, I'll stand up to all the pain and turmoil -Just believe in myself, won't rely on others -Freedom will be waiting when serenity is restored -This is my planet, I shall not surrender - -Won't be frightened, I'll stand up to all the pain and turmoil -Just believe in myself, won't rely on others -Get this power to wipe out the havoc and anarchy -This is my planet, gonna fight - -Won't be frightened, I'll stand up to all the pain and turmoil -Just believe in myself, won't rely on others -Freedom will be waiting when serenity is restored -This is my planet, I shall not surrender - -The new porcupine on the block with the buff chest -In the wilderness with the ruggedness -Knock, knock, it's Knuckles, the bloat thrower -Independent flower, Magical Emerald holder -I'll give you the coldest shoulder -My spikes go through boulders, that's why I stay a loner -I was born by myself, I don't need a posse -I get it on by myself, adversaries get shelved - -Right on!