From 6b229eae18c28adc2950b58fccd232a2e04c869c Mon Sep 17 00:00:00 2001 From: alterdekim Date: Sat, 21 Dec 2024 19:55:31 +0300 Subject: [PATCH] Initial --- .gitignore | 6 + .project | 17 + rtmpServer.iml | 47 + src/org/cl0zzzy/http/HttpMain.java | 257 ++ src/org/cl0zzzy/http/RC4.java | 49 + src/org/cl0zzzy/rtmp/AMF.java | 213 ++ src/org/cl0zzzy/rtmp/AMFBuilder.java | 177 + src/org/cl0zzzy/rtmp/AMFEcmaArray.java | 37 + src/org/cl0zzzy/rtmp/AMFObject.java | 92 + src/org/cl0zzzy/rtmp/AMFObjectArray.java | 54 + src/org/cl0zzzy/rtmp/AMFResult.java | 6 + src/org/cl0zzzy/rtmp/Chunk.java | 134 + src/org/cl0zzzy/rtmp/RTMPServer.java | 230 ++ src/org/cl0zzzy/rtmp/Result.java | 6 + src/org/cl0zzzy/rtmp/Util.java | 50 + src/org/cl0zzzy/server/Catalog.java | 35 + src/org/cl0zzzy/server/CatalogItem.java | 39 + .../cl0zzzy/server/CheckUserRightsObject.java | 39 + src/org/cl0zzzy/server/Good.java | 74 + src/org/cl0zzzy/server/Inventory.java | 55 + src/org/cl0zzzy/server/InventoryGroup.java | 57 + src/org/cl0zzzy/server/InventoryItem.java | 101 + src/org/cl0zzzy/server/InventoryList.java | 26 + src/org/cl0zzzy/server/InventoryTab.java | 26 + src/org/cl0zzzy/server/MagicAbility.java | 32 + src/org/cl0zzzy/server/Main.java | 7 + src/org/cl0zzzy/server/ParsableObject.java | 3 + src/org/cl0zzzy/server/Player.java | 92 + src/org/cl0zzzy/server/Profile.java | 24 + src/org/cl0zzzy/server/Server.java | 811 ++++ src/org/cl0zzzy/server/UData.java | 7 + src/org/cl0zzzy/server/UserAccount.java | 32 + src/org/cl0zzzy/server/UserInfo.java | 258 ++ src/org/cl0zzzy/server/UserInitInfo.java | 48 + .../cl0zzzy/server/UserMagicAbilities.java | 20 + src/org/cl0zzzy/server/UserPhone.java | 39 + src/org/cl0zzzy/sqlite/Account.java | 25 + src/org/cl0zzzy/sqlite/DB.java | 1075 ++++++ src/res/css/animate.css | 3334 +++++++++++++++++ src/res/css/font-awesome.css | 2337 ++++++++++++ src/res/css/font-awesome.min.css | 4 + src/res/css/main.css | 39 + src/res/css/style.css | 342 ++ src/res/img/background.jpg | Bin 0 -> 265524 bytes src/res/img/module_table_bottom.png | Bin 0 -> 751 bytes src/res/img/module_table_top.png | Bin 0 -> 337 bytes src/res/img/snow_background.png | Bin 0 -> 265524 bytes src/res/items.html | 36 + src/res/log.html | 400 ++ src/res/main.html | 8 + src/res/reg.html | 398 ++ 51 files changed, 11198 insertions(+) create mode 100644 .gitignore create mode 100644 .project create mode 100644 rtmpServer.iml create mode 100644 src/org/cl0zzzy/http/HttpMain.java create mode 100644 src/org/cl0zzzy/http/RC4.java create mode 100644 src/org/cl0zzzy/rtmp/AMF.java create mode 100644 src/org/cl0zzzy/rtmp/AMFBuilder.java create mode 100644 src/org/cl0zzzy/rtmp/AMFEcmaArray.java create mode 100644 src/org/cl0zzzy/rtmp/AMFObject.java create mode 100644 src/org/cl0zzzy/rtmp/AMFObjectArray.java create mode 100644 src/org/cl0zzzy/rtmp/AMFResult.java create mode 100644 src/org/cl0zzzy/rtmp/Chunk.java create mode 100644 src/org/cl0zzzy/rtmp/RTMPServer.java create mode 100644 src/org/cl0zzzy/rtmp/Result.java create mode 100644 src/org/cl0zzzy/rtmp/Util.java create mode 100644 src/org/cl0zzzy/server/Catalog.java create mode 100644 src/org/cl0zzzy/server/CatalogItem.java create mode 100644 src/org/cl0zzzy/server/CheckUserRightsObject.java create mode 100644 src/org/cl0zzzy/server/Good.java create mode 100644 src/org/cl0zzzy/server/Inventory.java create mode 100644 src/org/cl0zzzy/server/InventoryGroup.java create mode 100644 src/org/cl0zzzy/server/InventoryItem.java create mode 100644 src/org/cl0zzzy/server/InventoryList.java create mode 100644 src/org/cl0zzzy/server/InventoryTab.java create mode 100644 src/org/cl0zzzy/server/MagicAbility.java create mode 100644 src/org/cl0zzzy/server/Main.java create mode 100644 src/org/cl0zzzy/server/ParsableObject.java create mode 100644 src/org/cl0zzzy/server/Player.java create mode 100644 src/org/cl0zzzy/server/Profile.java create mode 100644 src/org/cl0zzzy/server/Server.java create mode 100644 src/org/cl0zzzy/server/UData.java create mode 100644 src/org/cl0zzzy/server/UserAccount.java create mode 100644 src/org/cl0zzzy/server/UserInfo.java create mode 100644 src/org/cl0zzzy/server/UserInitInfo.java create mode 100644 src/org/cl0zzzy/server/UserMagicAbilities.java create mode 100644 src/org/cl0zzzy/server/UserPhone.java create mode 100644 src/org/cl0zzzy/sqlite/Account.java create mode 100644 src/org/cl0zzzy/sqlite/DB.java create mode 100644 src/res/css/animate.css create mode 100644 src/res/css/font-awesome.css create mode 100644 src/res/css/font-awesome.min.css create mode 100644 src/res/css/main.css create mode 100644 src/res/css/style.css create mode 100644 src/res/img/background.jpg create mode 100644 src/res/img/module_table_bottom.png create mode 100644 src/res/img/module_table_top.png create mode 100644 src/res/img/snow_background.png create mode 100644 src/res/items.html create mode 100644 src/res/log.html create mode 100644 src/res/main.html create mode 100644 src/res/reg.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e58fcf --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +swf +png +bin +.idea +.settings +old.zip diff --git a/.project b/.project new file mode 100644 index 0000000..d79a5b6 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + rtmpServer + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/rtmpServer.iml b/rtmpServer.iml new file mode 100644 index 0000000..68deb8a --- /dev/null +++ b/rtmpServer.iml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/org/cl0zzzy/http/HttpMain.java b/src/org/cl0zzzy/http/HttpMain.java new file mode 100644 index 0000000..c8dfafe --- /dev/null +++ b/src/org/cl0zzzy/http/HttpMain.java @@ -0,0 +1,257 @@ +package org.cl0zzzy.http; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.cl0zzzy.sqlite.Account; +import org.cl0zzzy.sqlite.DB; +import org.cl0zzzy.rtmp.Util; + +import fi.iki.elonen.NanoHTTPD; + +public class HttpMain extends NanoHTTPD { + + private int port; + private int rtmp; + private int count = 0; + + public HttpMain(int port, int rtmp) { + super(port); + System.out.println("HTTP daemon started"); + this.port = port; + this.rtmp = rtmp; + try { + this.start(); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public void updatePlayers( int count ) { + this.count = count; + } + + @Override + public Response serve(IHTTPSession session) { + String response = "

404

"; + try { + Map p = session.getParms(); + if (session.getUri().startsWith("/png/")) { + try { + return parsePNG(session.getUri().substring(4)); + } catch (Exception e) { + e.printStackTrace(); + } + } else if (session.getUri().startsWith("/swf/")) { + try { + return parseSWF(session.getUri().substring(4)); + } catch (Exception e) { + e.printStackTrace(); + } + } else if (session.getUri().endsWith(".swf")) { + try { + return parseSWFN(session.getUri().substring(1)); + } catch (Exception e) { + e.printStackTrace(); + } + } else if (session.getUri().startsWith("/css/")) { + return parseCSS(session.getUri().substring(4)); + } else if (session.getUri().startsWith("/async/")) { + if (session.getUri().equals("/async/ServerAction")) { + if (session.getCookies().read("UID") != null && session.getCookies().read("TOKEN") != null) { + if (Util.MD5(DB.getSecureCode() + session.getCookies().read("UID")).equals(session.getCookies().read("TOKEN"))) { + response = this.generateServerAction(Integer.parseInt(session.getCookies().read("UID"))); + return new NanoHTTPD.Response(Response.Status.OK, "text/xml;charset=UTF-8", response); + } + } + response = ""; + return new NanoHTTPD.Response(Response.Status.OK, "text/xml;charset=UTF-8", response); + } else if (session.getUri().equals("/async/Ping")) { + response = ""; + return new NanoHTTPD.Response(Response.Status.OK, "text/xml;charset=UTF-8", response); + } + } else if (session.getUri().startsWith("/img/")) { + return parseImg(session.getUri().substring(4)); + } else { + if (session.getCookies().read("UID") != null && session.getCookies().read("TOKEN") != null) { + if (Util.MD5(DB.getSecureCode() + session.getCookies().read("UID")).equals(session.getCookies().read("TOKEN"))) { + session.getCookies().set(new Cookie("UID", session.getCookies().read("UID"))); + session.getCookies().set(new Cookie("TOKEN", Util.MD5(DB.getSecureCode() + session.getCookies().read("UID")))); + NanoHTTPD.Response nr = new NanoHTTPD.Response(parseMain().replaceAll("REPLACE_FOR_DOMAIN", "localhost:" + port)); + return nr; + } else { + session.getCookies().delete("UID"); + session.getCookies().delete("TOKEN"); + } + } + Map prms = new HashMap(); + try { + session.parseBody(prms); + } catch (IOException e) { + e.printStackTrace(); + } catch (ResponseException e) { + e.printStackTrace(); + } + p = session.getParms(); + if (p.get("username") != null && p.get("password") != null) { + if (p.get("act") != null) { + String regex = "^[a-zA-z а-яА-Я0-9\\_\\-]{3,30}$"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(p.get("username")); + if (matcher.matches() && DB.getUserAccountByName(p.get("username")) == null) { + DB.insertAccount(p.get("username"), p.get("password")); + response = parseLog(); + return new NanoHTTPD.Response(response); + } + } else { + Account acc = DB.getUserAccountByName(p.get("username")); + if (acc != null && acc.getPassword().equals(Util.MD5(p.get("password")))) { + session.getCookies().set(new Cookie("TOKEN", Util.MD5(DB.getSecureCode() + acc.getId()))); + session.getCookies().set(new Cookie("UID", acc.getId() + "")); + NanoHTTPD.Response nr = new NanoHTTPD.Response(parseMain().replaceAll("REPLACE_FOR_DOMAIN", "localhost:" + port)); + return nr; + } + } + } + if (p.get("act") != null) { + response = parseReg(); + } else { + response = parseLog(); + } + } + } catch ( Exception e ) { + e.printStackTrace(); + } + return new NanoHTTPD.Response(response); + } + + private Response parsePNG(String png) throws Exception { + return getRespFromIS("image/png", new FileInputStream(new File("png"+png))); + } + + private Response parseSWF(String swf) throws Exception { + return getRespFromIS("application/x-shockwave-flash", new FileInputStream(new File("swf"+swf))); + } + + private Response parseSWFN(String swf) throws Exception { + return getRespFromIS("application/x-shockwave-flash", new FileInputStream(new File(swf))); + } + + private String parseMain() { + return getStringFromIS(getFileFromResourceAsStream("/res/main.html")); + } + + private String parseReg() { + return getStringFromIS(getFileFromResourceAsStream("/res/reg.html")); + } + + private String parseLog() { + return getStringFromIS(getFileFromResourceAsStream("/res/log.html")); + } + + private NanoHTTPD.Response parseImg( String filename ) { + return getRespFromIS("image/jpeg", (FileInputStream) getFileFromResourceAsStream("/res/img" + filename)); + } + + private NanoHTTPD.Response parseCSS( String filename ) { + return getRespFromIS("text/css", (FileInputStream) getFileFromResourceAsStream("/res/css" + filename)); + } + + private NanoHTTPD.Response getRespFromIS( String mime, FileInputStream fis ) { + NanoHTTPD.Response res = new NanoHTTPD.Response(Response.Status.OK, mime, fis); + return res; + } + + private InputStream getFileFromResourceAsStream(String fileName) { + try { + return new FileInputStream(Paths.get(this.getClass().getResource(fileName).toURI()).toFile()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private String getStringFromIS(InputStream is) { + String data = ""; + try (InputStreamReader streamReader = + new InputStreamReader(is, StandardCharsets.UTF_8); + BufferedReader reader = new BufferedReader(streamReader)) { + + String line; + while ((line = reader.readLine()) != null) { + data += line; + } + + } catch (IOException e) { + e.printStackTrace(); + } + return data; + } + + private String generateServerAction( int UID ) { + String response = "\r\n" + + "\r\n" + + "\r\n" + + "\r\n" + + "\r\n" + + DB.getPreloaders()+ + "\r\n" + + "\r\n" + + "\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + // 1 + " \r\n" + + " \r\n" + + " " + + "\r\n" + + "\r\n" + + "\r\n" + + "\r\n" + + DB.getPromotions()+ + "\r\n" + + "\r\n" + + DB.getPromotionBanners()+ + "\r\n" + + "\r\n" + + " \r\n" + + " "+DB.getPhoneMessages(UID)+"\r\n" + + " \r\n" + + "\r\n" + + "\r\n" + + " \r\n" + + " "+DB.getPostcards(UID)+"\r\n" + + " \r\n" + + "\r\n" + + "\r\n" + + //" \r\n" + + //" " + + "\r\n" + + "".getBytes())).toLowerCase() + "\" />\r\n" + + "").getBytes())).toLowerCase() +"\" />\r\n" + + "").getBytes())).toLowerCase() +"\" />\r\n" + + ""+"").getBytes())).toLowerCase() +"\" />"+"\r\n" + + ""; + + return response; + } + + private String getDate() { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + return format.format(date); + } +} diff --git a/src/org/cl0zzzy/http/RC4.java b/src/org/cl0zzzy/http/RC4.java new file mode 100644 index 0000000..eb6a48b --- /dev/null +++ b/src/org/cl0zzzy/http/RC4.java @@ -0,0 +1,49 @@ +package org.cl0zzzy.http; + +public class RC4 { + private final byte[] S = new byte[256]; + private final byte[] T = new byte[256]; + private final int keylen; + + public RC4(final byte[] key) { + if (key.length < 1 || key.length > 256) { + throw new IllegalArgumentException( + "key must be between 1 and 256 bytes"); + } else { + keylen = key.length; + for (int i = 0; i < 256; i++) { + S[i] = (byte) i; + T[i] = key[i % keylen]; + } + int j = 0; + byte tmp; + for (int i = 0; i < 256; i++) { + j = (j + S[i] + T[i]) & 0xFF; + tmp = S[j]; + S[j] = S[i]; + S[i] = tmp; + } + } + } + + public byte[] encrypt(final byte[] plaintext) { + final byte[] ciphertext = new byte[plaintext.length]; + int i = 0, j = 0, k, t; + byte tmp; + for (int counter = 0; counter < plaintext.length; counter++) { + i = (i + 1) & 0xFF; + j = (j + S[i]) & 0xFF; + tmp = S[j]; + S[j] = S[i]; + S[i] = tmp; + t = (S[i] + S[j]) & 0xFF; + k = S[t]; + ciphertext[counter] = (byte) (plaintext[counter] ^ k); + } + return ciphertext; + } + + public byte[] decrypt(final byte[] ciphertext) { + return encrypt(ciphertext); + } +} \ No newline at end of file diff --git a/src/org/cl0zzzy/rtmp/AMF.java b/src/org/cl0zzzy/rtmp/AMF.java new file mode 100644 index 0000000..b17e50a --- /dev/null +++ b/src/org/cl0zzzy/rtmp/AMF.java @@ -0,0 +1,213 @@ +package org.cl0zzzy.rtmp; + +import java.util.ArrayList; +import java.util.Arrays; + +public class AMF { + + private ArrayList AMFMessage = new ArrayList(); + private byte[] amf; + + public boolean next = false; + public byte[] nextArr; + + public AMF( byte[] amf ) { + this.amf = amf; + this.decodeAMF(); + } + + private AMFResult decodeNumber( int i ) { + byte[] number = new byte[8]; + number[0] = amf[i+1]; + number[1] = amf[i+2]; + number[2] = amf[i+3]; + number[3] = amf[i+4]; + number[4] = amf[i+5]; + number[5] = amf[i+6]; + number[6] = amf[i+7]; + number[7] = amf[i+8]; + AMFResult result = new AMFResult(); + result.value = this.numberToDouble( Util.bytesToHex( number ) ); + result.index = i+8; + return result; + } + + private AMFResult decodeString( int i ) { + byte[] stringLength = new byte[2]; + stringLength[0] = amf[i+1]; + stringLength[1] = amf[i+2]; + int length = Integer.parseInt( Util.bytesToHex(stringLength), 16 ); + ArrayList str = new ArrayList(); + for( int u = (i+3); u < (i+3+length); u++ ) { + str.add( amf[u] ); + } + AMFResult result = new AMFResult(); + byte[] _a = new byte[str.size()]; + int j = 0; + for(Byte b : str) { + _a[j++] = b.byteValue(); + } + try { result.value = new String( _a, "UTF-8" ); } catch( Exception e ) { e.printStackTrace(); } + result.index = i+2+length; + return result; + } + + private AMFResult decodeECMA( int i ) { + AMFEcmaArray ecma = new AMFEcmaArray(); + if( amf[i] == AMFObject.AMF_ECMA_ARRAY_START && + amf[i+1] == 0x00 && + amf[i+2] == 0x00 && + amf[i+3] == 0x00 && + amf[i+4] == 0x00 && + amf[i+5] == 0x00 && + amf[i+6] == 0x00 && + amf[i+7] == AMFObject.AMF_OBJECT_END ) { + i = i + 7; + AMFResult result = new AMFResult(); + result.value = ecma; + result.index = i; + return result; + } + i+=5; + int index = 0; + while( true ) { + if( amf[i] == 0x00 && amf[i+1] == 0x00 && amf[i+2] == 0x09 ) { + i = i + 2; + break; + } + i+=3; + + int __index = index; + __index = __index - ( __index % 10 ); + if( __index > 0 ) { + int len = String.valueOf(__index).substring(1).length(); + i += len; + } + Result res = this.decodeOne(i); + AMFObject value = new AMFObject( amf[i], res.val ); + ecma.add(value); + i = res.i; + i++; + index++; + } + AMFResult result = new AMFResult(); + result.value = ecma; + result.index = i; + return result; + } + + private AMFResult decodeObj( int i ) { + i++; + AMFObjectArray array = new AMFObjectArray(); + while( true ) { + if( amf[i] == 0x00 && amf[i+1] == 0x00 && amf[i+2] == 0x09 ) { + i = i + 2; + break; + } + byte[] length = new byte[2]; + length[0] = amf[i]; + length[1] = amf[i+1]; + + int decimal = Integer.parseInt( Util.bytesToHex(length), 16 ); + String key = ""; + for( int u = i+2; u < (i+2+decimal); u++ ) { + key = key + new String( new byte[] {amf[u]} ); + } + + Result res = this.decodeOne(i+2+decimal); + AMFObject obj = new AMFObject( amf[i+2+decimal], res.val ); + array.add(key, obj); + i = res.i + 1; + } + + + AMFResult result = new AMFResult(); + result.value = array; + result.index = i; + return result; + } + + private Result decodeOne( int i ) { + Object val = null; + if( amf[i] == AMFObject.AMF_NUMBER ) { + AMFResult result = this.decodeNumber(i); + val = result.value; + i = result.index; + } else if( amf[i] == AMFObject.AMF_STRING ) { + AMFResult result = this.decodeString(i); + val = result.value; + i = result.index; + } else if( amf[i] == AMFObject.AMF_BOOLEAN ) { + if( amf[i+1] == 0x00 ) { + val = false; + } else { + val = true; + } + i++; + } else if( amf[i] == AMFObject.AMF_OBJECT_START ) { + AMFResult result = this.decodeObj(i); + val = result.value; + i = result.index; + } else if( amf[i] == AMFObject.AMF_NULL ) { + val = null; + } else if( amf[i] == AMFObject.AMF_ECMA_ARRAY_START ) { + AMFResult result = this.decodeECMA(i); + val = result.value; + i = result.index; + } else if( amf[i] == AMFObject.AMF_DATE ) { + val = "Date"; + i = i + 10; + } else if( amf[i] == (byte) 0x43 || amf[i] == (byte) 0x83 ){ + val = "end"; + next = true; + nextArr = Arrays.copyOfRange(amf, i, amf.length); + } + Result res = new Result(); + res.i = i; + res.val = val; + return res; + } + + private void decodeAMF() { + for( int i = 0; i < amf.length; i++ ) { + Object val = null; + int _i = i; + Result res = this.decodeOne( i ); + i = res.i; + val = res.val; + if( val != null && val.equals("end") ) { + break; + } + if( amf[_i] != AMFObject.AMF_BOOLEAN && + amf[_i] != AMFObject.AMF_ECMA_ARRAY_START && + amf[_i] != AMFObject.AMF_NUMBER && + amf[_i] != AMFObject.AMF_OBJECT_START && + amf[_i] != AMFObject.AMF_STRING ) { + amf[_i] = AMFObject.AMF_NULL; + } + AMFObject value = new AMFObject( amf[_i], val ); + AMFMessage.add(value); + } + } + + public int getLength() { + return this.AMFMessage.size(); + } + + public AMFObject get( int index ) { + return this.AMFMessage.get(index); + } + + private double numberToDouble( String hexString ) { + long longHex = parseUnsignedHex(hexString); + return Double.longBitsToDouble(longHex); + } + + private long parseUnsignedHex(String text) { + if (text.length() == 16) { + return (parseUnsignedHex(text.substring(0, 1)) << 60) + | parseUnsignedHex(text.substring(1)); + } + return Long.parseLong(text, 16); + } +} diff --git a/src/org/cl0zzzy/rtmp/AMFBuilder.java b/src/org/cl0zzzy/rtmp/AMFBuilder.java new file mode 100644 index 0000000..f580c5e --- /dev/null +++ b/src/org/cl0zzzy/rtmp/AMFBuilder.java @@ -0,0 +1,177 @@ +package org.cl0zzzy.rtmp; + +import java.math.BigInteger; +import java.util.ArrayList; + +public class AMFBuilder { + + private ArrayList objs = new ArrayList(); + + private byte[] timestamp = new byte[] { 0x00, 0x00, 0x00 }; + + private byte empty = 0x00; + private byte ver = 0x03; + private byte amf = 0x14; + private byte _true = 0x01; + private byte _false = 0x00; + + public AMFBuilder() {} + + public void setTimestamp( byte[] ts ) { + this.timestamp = ts; + } + + public void addAMFObject( AMFObject obj ) { + this.objs.add(obj); + } + + private ArrayList encodeNumber( String str ) { + ArrayList result = new ArrayList(); + byte[] arr = Util.hexStringToByteArray( this.doubleToNumber( Double.parseDouble(str) ) ); + for( int i = 0; i < arr.length; i++ ) { + result.add(arr[i]); + } + return result; + } + + private ArrayList encodeString( String str ) { + ArrayList result = new ArrayList(); + byte[] data = new byte[2]; + data[1] = (byte) (str.getBytes().length & 0xFF); + data[0] = (byte) ((str.getBytes().length >> 8) & 0xFF); + result.add(data[0]); + result.add(data[1]); + for( int i = 0; i < str.getBytes().length; i++ ) { + result.add(str.getBytes()[i]); + } + return result; + } + + private ArrayList encodeBoolean( Boolean b ) { + ArrayList result = new ArrayList(); + if( b ) { + result.add(this._true); + } else { + result.add(this._false); + } + return result; + } + + private ArrayList encodeECMA( AMFEcmaArray ecma ) { + ArrayList result = new ArrayList(); + result.add((byte)0x00); + result.add((byte)0x00); + result.add((byte)0x00); + result.add((byte)0x00); + for( int i = 0; i < ecma.getLength(); i++ ) { + result.add((byte)0x00); + result.add((byte) (Math.floor(i/10)+1)); + byte[] b = Util.hexStringToByteArray(toHex(String.valueOf(i))); + for( int u = 0; u < b.length; u++ ) { + result.add(b[u]); + } + ArrayList _b = this.encodeAMFObject( ecma.getValueAt(i) ); + for( int u = 0; u < _b.size(); u++ ) { + result.add(_b.get(u)); + } + } + result.add((byte)0x00); + result.add((byte)0x00); + result.add((byte)0x09); + return result; + } + + private ArrayList encodeObj( AMFObjectArray arr ) { + ArrayList result = new ArrayList(); + for( int i = 0; i < arr.getLength(); i++ ) { + ArrayList key = this.encodeString(arr.getKeyAt(i)); + ArrayList body = this.encodeAMFObject(arr.getValueAt(i)); + for( int u = 0; u < key.size(); u++ ) { + result.add(key.get(u)); + } + result.add(arr.getValueAt(i).getType()); + for( int u = 0; u < body.size(); u++ ) { + result.add(body.get(u)); + } + } + result.add((byte)0x00); + result.add((byte)0x00); + result.add(AMFObject.AMF_OBJECT_END); + return result; + } + + private ArrayList encodeAMFObject( AMFObject obj ) { + ArrayList result = new ArrayList(); + if( obj.getType() == AMFObject.AMF_NUMBER ) { + result = this.encodeNumber( obj.getString() ); + } else if( obj.getType() == AMFObject.AMF_STRING ) { + result = this.encodeString( obj.getString() ); + } else if( obj.getType() == AMFObject.AMF_BOOLEAN ) { + result = this.encodeBoolean( obj.getBoolean() ); + } else if( obj.getType() == AMFObject.AMF_OBJECT_START ) { + result = this.encodeObj( obj.getObjectArray() ); + } else if( obj.getType() == AMFObject.AMF_ECMA_ARRAY_START ) { + result = this.encodeECMA( obj.getECMArray() ); + } + return result; + } + + public byte[] build() { + ArrayList array = new ArrayList(); + array.add(ver); + array.add(this.timestamp[0]); + array.add(this.timestamp[1]); + array.add(this.timestamp[2]); + array.add(empty); + array.add(empty); + array.add(empty); + array.add(amf); + array.add(empty); + array.add(empty); + array.add(empty); + array.add(empty); + ArrayList _array = new ArrayList(); + for( int i = 0; i < this.objs.size(); i++ ) { + AMFObject obj = this.objs.get(i); + _array.add(obj.getType()); + ArrayList nb = this.encodeAMFObject( obj ); + for( int u = 0; u < nb.size(); u++ ) { + _array.add(nb.get(u)); + } + } + int cnt = 0; + for( int i = 0; i < _array.size(); i++ ) { + array.add(_array.get(i)); + if( i >= 4095 && ((i+1) % 4096 == 0) && (i+1) < _array.size() ) { + array.add((byte) 0xC3); + cnt++; + } + } + int length = array.size() - 12 - cnt; + byte[] ldata = new byte[3]; + ldata[2] = (byte) (length & 0xFF); + ldata[1] = (byte) ((length >> 8) & 0xFF); + ldata[0] = (byte) ((length >> 16) & 0xFF); + array.set(4, ldata[0]); + array.set(5, ldata[1]); + array.set(6, ldata[2]); + int j=0; + byte[] _a = new byte[array.size()]; + for(Byte b : array) { + _a[j++] = b.byteValue(); + } + return _a; + } + + private String doubleToNumber( double d ) { + long longBits = Double.doubleToLongBits(d); + if( longBits == 0 ) { + return "0000000000000000"; + } + return Long.toHexString(longBits).toUpperCase(); + } + + public String toHex(String arg) { + return String.format("%040x", new BigInteger(1, arg.getBytes())); + } +} diff --git a/src/org/cl0zzzy/rtmp/AMFEcmaArray.java b/src/org/cl0zzzy/rtmp/AMFEcmaArray.java new file mode 100644 index 0000000..f900040 --- /dev/null +++ b/src/org/cl0zzzy/rtmp/AMFEcmaArray.java @@ -0,0 +1,37 @@ +package org.cl0zzzy.rtmp; + +import java.util.ArrayList; + +public class AMFEcmaArray { + + private ArrayList values = new ArrayList(); + + public void add( AMFObject value ) { + this.values.add(value); + } + + public AMFObject getValueAt( int index ) { + return this.values.get(index); + } + + public int getLength() { + return this.values.size(); + } + + public String getString() { + String str = "Array"; + for( int i = 0; i < this.getLength(); i++ ) { + str = str + "\nArray -> " + i + "=" + this.getValueAt(i).getString(); + } + return str; + } + + public String toString() { + String str = "Array"; + for( int i = 0; i < this.getLength(); i++ ) { + str = str + "\nArray -> " + i + "=" + this.getValueAt(i).toString(false); + } + return str; + } + +} diff --git a/src/org/cl0zzzy/rtmp/AMFObject.java b/src/org/cl0zzzy/rtmp/AMFObject.java new file mode 100644 index 0000000..06be743 --- /dev/null +++ b/src/org/cl0zzzy/rtmp/AMFObject.java @@ -0,0 +1,92 @@ +package org.cl0zzzy.rtmp; + +public class AMFObject { + + public static final byte AMF_NUMBER = 0x00; + public static final byte AMF_BOOLEAN = 0x01; + public static final byte AMF_STRING = 0x02; + public static final byte AMF_OBJECT_START = 0x03; + public static final byte AMF_ECMA_ARRAY_START = 0x08; + public static final byte AMF_OBJECT_END = 0x09; + public static final byte AMF_NULL = 0x05; + public static final byte AMF_DATE = (byte) 0x0b; + + private byte type; + private Object body; + + public AMFObject( byte type, Object body ) { + this.type = type; + this.body = body; + } + + + public AMFObjectArray getObjectArray() { + return (AMFObjectArray) this.body; + } + + public AMFEcmaArray getECMArray() { + return (AMFEcmaArray) this.body; + } + + public int getInt() { + return (int) (this.getDouble()); + } + + public double getDouble() { + if( this.body != null ) { + return Double.parseDouble( String.valueOf( this.body ) ); + } else { + return 0.0; + } + } + + public String getString() { + if( this.getType() == AMFObject.AMF_OBJECT_START ) { + String str = "Object"; + AMFObjectArray obj = this.getObjectArray(); + for( int i = 0; i < obj.getLength(); i++ ) { + str = str + "\nObject -> " + obj.getKeyAt(i) + "=" + obj.getValueAt(i).getString(); + } + return str; + } else if( this.getType() == AMFObject.AMF_ECMA_ARRAY_START ) { + String str = "Array"; + AMFEcmaArray obj = this.getECMArray(); + for( int i = 0; i < obj.getLength(); i++ ) { + str = str + "\nArray -> " + i + "=" + obj.getValueAt(i).getString(); + } + return str; + } else { + return String.valueOf( this.body ); + } + } + + public Object get() { + return this.body; + } + + public byte getType() { + return this.type; + } + + public Boolean isNull() { + return ( this.body == null ); + } + + public Boolean getBoolean() { + return Boolean.valueOf( this.getString() ); + } + + public String toString() { + return this.getString(); + } + + public String toString( boolean i ) { + if( this.getType() == AMFObject.AMF_OBJECT_START ) { + return "Object"; + } else if( this.getType() == AMFObject.AMF_ECMA_ARRAY_START ) { + return "Array"; + } else { + return String.valueOf( this.body ); + } + } +} diff --git a/src/org/cl0zzzy/rtmp/AMFObjectArray.java b/src/org/cl0zzzy/rtmp/AMFObjectArray.java new file mode 100644 index 0000000..77a9934 --- /dev/null +++ b/src/org/cl0zzzy/rtmp/AMFObjectArray.java @@ -0,0 +1,54 @@ +package org.cl0zzzy.rtmp; + +import java.util.ArrayList; + +public class AMFObjectArray { + + private ArrayList keys = new ArrayList(); + private ArrayList values = new ArrayList(); + + public AMFObjectArray() {} + + public void add( String key, AMFObject value ) { + this.keys.add(key); + this.values.add(value); + } + + public AMFObject getValueAt( int index ) { + return this.values.get(index); + } + + public String getKeyAt( int index ) { + return this.keys.get(index); + } + + public AMFObject get( String key ) { + for( int i = 0; i < keys.size(); i++ ) { + if( keys.get(i).equals(key) ) { + return values.get(i); + } + } + return null; + } + + public int getLength() { + return keys.size(); + } + + public String getString() { + String str = "Object"; + for( int i = 0; i < this.getLength(); i++ ) { + str = str + "\nObject -> " + this.getKeyAt(i) + "=" + this.getValueAt(i).getString(); + } + return str; + } + + public String toString() { + String str = "Object"; + for( int i = 0; i < this.getLength(); i++ ) { + str = str + "\nObject -> " + this.getKeyAt(i) + "=" + this.getValueAt(i).toString(false); + } + return str; + } + +} diff --git a/src/org/cl0zzzy/rtmp/AMFResult.java b/src/org/cl0zzzy/rtmp/AMFResult.java new file mode 100644 index 0000000..a9ae09a --- /dev/null +++ b/src/org/cl0zzzy/rtmp/AMFResult.java @@ -0,0 +1,6 @@ +package org.cl0zzzy.rtmp; + +public class AMFResult { + public Object value; + public int index; +} diff --git a/src/org/cl0zzzy/rtmp/Chunk.java b/src/org/cl0zzzy/rtmp/Chunk.java new file mode 100644 index 0000000..bbc0973 --- /dev/null +++ b/src/org/cl0zzzy/rtmp/Chunk.java @@ -0,0 +1,134 @@ +package org.cl0zzzy.rtmp; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Chunk { + + private byte[] timestamp = new byte[0]; + private byte[] length = new byte[0]; + private byte[] amf; + + private byte type; + + public Chunk( byte[] array ) { + type = array[0]; + if( array[0] == 0x03 ) { + timestamp = Arrays.copyOfRange( array, 1, 4 ); + length = Arrays.copyOfRange( array, 4, 7 ); + amf = Arrays.copyOfRange( array, 12, 12+getDecimalLength() ); + } else if( array[0] == 0x43 ) { + timestamp = Arrays.copyOfRange( array, 1, 4 ); + length = Arrays.copyOfRange( array, 4, 7 ); + amf = Arrays.copyOfRange( array, 8, 8+getDecimalLength() ); + if( 8+getDecimalLength() < array.length ) { + amf = Arrays.copyOfRange( array, 8, array.length ); + } + } else if( array[0] == (byte) 0x83 ) { + timestamp = Arrays.copyOfRange( array, 1, 4 ); + amf = Arrays.copyOfRange( array, 4, array.length ); + } + this.clearC3(); + } + + public Chunk( byte[] array, boolean ignore ) { + type = array[0]; + if( array[0] == 0x03 ) { + timestamp = Arrays.copyOfRange( array, 1, 4 ); + length = Arrays.copyOfRange( array, 4, 7 ); + amf = Arrays.copyOfRange( array, 12, array.length ); + } else if( array[0] == 0x43 ) { + timestamp = Arrays.copyOfRange( array, 1, 4 ); + length = Arrays.copyOfRange( array, 4, 7 ); + amf = Arrays.copyOfRange( array, 8, array.length ); + } else if( array[0] == (byte) 0x83 ) { + timestamp = Arrays.copyOfRange( array, 1, 4 ); + amf = Arrays.copyOfRange( array, 4, array.length ); + } + this.clearC3(); + } + + public int getPos() { + if( type == 0x03 ) { + return 12; + } else if( type == 0x43 ) { + return 8; + } else if( type == 0x83 ) { + return 4; + } + return 0; + } + + private void clearC3() { + try { + List array = new ArrayList(); + for( int i = 0; i < amf.length; i++ ) { + array.add(amf[i]); + } + int every = 128; + + for( int i = 1; i <= (int) (array.size()/every); i++ ) { + if( Util.bytesToHex( new byte[] {array.get(i*every).byteValue()} ).equals(Util.bytesToHex(new byte[] {(byte) 0xC3})) ) { + array.remove(i*every); + } + } + + int j=0; + amf = new byte[array.size()]; + for(Byte b : array) + amf[j++] = b.byteValue(); + } catch( Exception e ) { + //e.printStackTrace(); + } + } + + public int getDecimalLength() { + return Integer.parseInt( Util.bytesToHex(this.length), 16 ); + } + + public byte[] getByteLength() { + return this.length; + } + + public byte[] getByteTimestamp() { + return this.timestamp; + } + + public byte[] getByteAMF() { + return this.amf; + } + + public static int getChunkLength( byte[] nb ) { + byte[] length = Arrays.copyOfRange( nb, 4, 7 ); + int dl = Integer.parseInt( Util.bytesToHex(length), 16 ); + if( nb[0] == 0x03 ) { + return 12 + dl; + } else if( nb[0] == 0x43 ) { + return 8 + dl; + } + return nb.length; + } + + public static int getChunkLengthW( byte[] nb ) { + byte[] length = Arrays.copyOfRange( nb, 4, 7 ); + int dl = Integer.parseInt( Util.bytesToHex(length), 16 ); + if( nb[0] == 0x03 ) { + return dl; + } else if( nb[0] == 0x43 ) { + return dl; + } + return nb.length; + } + + public static int getC3( int len ) { + int cnt = 0; + for( int i = 0; i < len; i++ ) { + if( i >= 4095 && ((i+1) % 4096 == 0) && (i+1) < len ) { + cnt++; + } + } + return cnt; + } + +} diff --git a/src/org/cl0zzzy/rtmp/RTMPServer.java b/src/org/cl0zzzy/rtmp/RTMPServer.java new file mode 100644 index 0000000..36d6859 --- /dev/null +++ b/src/org/cl0zzzy/rtmp/RTMPServer.java @@ -0,0 +1,230 @@ +package org.cl0zzzy.rtmp; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.Arrays; + +public class RTMPServer extends Thread { + + private int port; + + private ArrayList clients = new ArrayList(); + + private boolean exit = false; + + public RTMPServer( int port ) { + this.port = port; + this.start(); + } + + @Override + public void run() { + try { + System.out.println("RTMP daemon started"); + ServerSocket serverSocket = new ServerSocket(port); + while( !exit ) { + RTMPListener listener = new RTMPListener(serverSocket.accept()); + this.clients.add(listener); + listener.start(); + } + serverSocket.close(); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public void onOpen( int id ) {} + + public void onClose( int id ) {} + + public ArrayList onMessage( int id, String function, ArrayList data ) { + return new ArrayList(); + } + + public void exit() { + this.exit = true; + } + + public void broadcast( String function, AMFObject... args ) { + for( int i = 0; i < clients.size(); i++ ) { + this.call(clients.get(i).id, function, args); + } + } + + public void call( int id, String function, AMFObject... args ) { + try { + OutputStream out = null; + for( int i = 0; i < clients.size(); i++ ) { + if( clients.get(i).id == -1 ) { + clients.get(i).sock.close(); + } + if( clients.get(i).id == id ) { + out = clients.get(i).out; + break; + } + } + if( out != null ) { + AMFBuilder builder = new AMFBuilder(); + builder.addAMFObject( new AMFObject( AMFObject.AMF_STRING, function ) ); + builder.addAMFObject(new AMFObject( AMFObject.AMF_NUMBER, 0.0 )); + for( int i = 0; i < args.length; i++ ) { + builder.addAMFObject(args[i]); + } + outWrite(out, builder.build()); + out.flush(); + } + } catch( Exception e ) { + e.printStackTrace(); + } + } + + + private void outWrite(OutputStream out, byte[] b) throws IOException { + System.out.println("Packet Sent: " + Util.bytesToHex(b)); + out.write(b); + } + + public void close( int id ) { + try { + for( int i = 0; i < clients.size(); i++ ) { + if( clients.get(i).id == (id) ) { + clients.get(i).sock.close(); + clients.remove(i); + break; + } + } + onClose( id ); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + private class RTMPListener extends Thread { + + private Socket sock; + private int id; + private InputStream in; + private OutputStream out; + + public RTMPListener( Socket sock ) { + try { + this.sock = sock; + this.in = sock.getInputStream(); + this.out = sock.getOutputStream(); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + private int read( byte[] buffer ) throws IOException { + int i = in.read(buffer); + System.out.println("Packet received ("+i+"): " + Util.bytesToHex(buffer)); + return i; + } + + @Override + public void run() { + try { + byte[] buffer = new byte[10000]; + int cnt = read( buffer ); + byte[] nb = new byte[cnt]; + for( int i = 0; i < nb.length; i++ ) { + nb[i] = buffer[i]; + } + byte[] hsc1 = Arrays.copyOfRange(nb, 1, nb.length); + outWrite(out, new byte[] {0x03}); + outWrite(out, hsc1); + byte[] b = new byte[1536]; + for( int i = 0; i < b.length; i++ ) { + b[i] = (byte) ((Math.random() * 111)+1); + } + outWrite(out, b); + out.flush(); + in.read(new byte[1536]); + while( true ) { + buffer = new byte[10000]; + cnt = read( buffer ); + nb = new byte[cnt]; + for( int i = 0; i < nb.length; i++ ) { + nb[i] = buffer[i]; + } + while( true ) { + if( nb[0] == 0x03 || nb[0] == 0x43 || nb[0] == (byte) 0x83 ) { + Chunk c; + AMF amf; + if( (nb[0] == 0x03 || nb[0] == 0x43) && Chunk.getChunkLength(nb)+Chunk.getC3(Chunk.getChunkLengthW(nb)) > 10000 ) { + int c3cnt = Chunk.getC3(Chunk.getChunkLengthW(nb)) - Chunk.getC3(nb.length); + int rcnt = Chunk.getChunkLength(nb) - 10000; + byte[] __nb = new byte[ c3cnt+rcnt ]; + read(__nb); + byte[] oldNB = nb; + nb = new byte[Chunk.getChunkLength(nb)+Chunk.getC3(Chunk.getChunkLengthW(nb))]; + for( int i = 0; i < oldNB.length; i++ ) { + nb[i] = oldNB[i]; + } + for( int i = oldNB.length; i < nb.length; i++ ) { + nb[i] = __nb[i-oldNB.length]; + } + } + try { + c = new Chunk( nb ); + amf = new AMF( c.getByteAMF() ); + } catch( Exception e ) { + c = new Chunk( nb, true ); + amf = new AMF( c.getByteAMF() ); + } + if( amf.get(0).getString().equals("connect") ) { + this.id = amf.get(3).getInt(); + outWrite(out, Util.hexStringToByteArray("020000000000040500000000002625A0020000000000050600000000002625A00202000000000004010000000000001000030000000000F214000000000200075F726573756C74003FF0000000000000030006666D7356657202000E464D532F342C302C302C31313231000C6361706162696C697469657300406FE0000000000000046D6F6465003FF00000000000000000090300056C6576656C0200067374617475730004636F646502001D4E6574436F6E6E656374696F6E2E436F6E6E6563742E53756363657373000B6465736372697074696F6E020015436F6E6E656374696F6E207375636365656465642E000E6F626A656374456E636F64696E670000000000000000000004646174610800000000000776657273696F6E02000A342C302C302C31313231000009000009") ); + out.flush(); + synchronized(this) { + onOpen( this.id ); + } + } else { + ArrayList params = new ArrayList(); + for( int i = 2; i < amf.getLength(); i++ ) { + params.add(amf.get(i)); + } + synchronized(this) { + ArrayList objs = onMessage(this.id, amf.get(0).getString(), params ); + if( objs != null ) { + AMFBuilder builder = new AMFBuilder(); + builder.addAMFObject(new AMFObject( AMFObject.AMF_STRING, "_result" )); + builder.addAMFObject(new AMFObject( AMFObject.AMF_NUMBER, amf.get(1).getString() )); + for( int i = 0; i < objs.size(); i++ ) { + builder.addAMFObject(objs.get(i)); + } + outWrite(out, builder.build()); + out.flush(); + } + } + } + if( amf.next ) { + nb = amf.nextArr; + } else { + break; + } + } else { + break; + } + } + } + } catch( Exception e ) { + for( int i = 0; i < clients.size(); i++ ) { + if( clients.get(i).id == (this.id) ) { + clients.remove(i); + break; + } + } + synchronized(this) { + onClose( this.id ); + } + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/src/org/cl0zzzy/rtmp/Result.java b/src/org/cl0zzzy/rtmp/Result.java new file mode 100644 index 0000000..a0a4713 --- /dev/null +++ b/src/org/cl0zzzy/rtmp/Result.java @@ -0,0 +1,6 @@ +package org.cl0zzzy.rtmp; + +public class Result { + public Object val; + public int i; +} diff --git a/src/org/cl0zzzy/rtmp/Util.java b/src/org/cl0zzzy/rtmp/Util.java new file mode 100644 index 0000000..df90ca4 --- /dev/null +++ b/src/org/cl0zzzy/rtmp/Util.java @@ -0,0 +1,50 @@ +package org.cl0zzzy.rtmp; + +public class Util { + + private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); + + public static byte[] hexStringToByteArray(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i+1), 16)); + } + return data; + } + + public static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + for (int j = 0; j < bytes.length; j++) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = HEX_ARRAY[v >>> 4]; + hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; + } + return new String(hexChars); + } + + public static int countChunks( byte[] arr ) { + int cnt = 0; + for( int i = 0; i < arr.length; i++ ) { + if( arr[i] == (byte) 0x43 || arr[i] == (byte) 0x83 ) { + cnt++; + } + } + return cnt; + } + + public static String MD5(String md5) { + try { + java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); + byte[] array = md.digest(md5.getBytes()); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; ++i) { + sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3)); + } + return sb.toString(); + } catch (java.security.NoSuchAlgorithmException e) { + } + return null; + } +} diff --git a/src/org/cl0zzzy/server/Catalog.java b/src/org/cl0zzzy/server/Catalog.java new file mode 100644 index 0000000..289879c --- /dev/null +++ b/src/org/cl0zzzy/server/Catalog.java @@ -0,0 +1,35 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.ElementList; +import org.simpleframework.xml.Root; + +import java.util.ArrayList; + +@Root(name="catalog") +public class Catalog implements ParsableObject { + private int CatalogTypeId; + private int MediaResourceId; + private ArrayList items = new ArrayList(); + + public Catalog(int catalogTypeId, int mediaResourceId, ArrayList items) { + CatalogTypeId = catalogTypeId; + MediaResourceId = mediaResourceId; + this.items = items; + } + + @Attribute(name="CatalogTypeId") + public int getCatalogTypeId() { + return CatalogTypeId; + } + + @Attribute(name="MediaResourceId") + public int getMediaResourceId() { + return MediaResourceId; + } + + @ElementList(inline=true, name="item") + public ArrayList getItems() { + return items; + } +} diff --git a/src/org/cl0zzzy/server/CatalogItem.java b/src/org/cl0zzzy/server/CatalogItem.java new file mode 100644 index 0000000..d66aa06 --- /dev/null +++ b/src/org/cl0zzzy/server/CatalogItem.java @@ -0,0 +1,39 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Root; + +@Root(name="item") +public class CatalogItem implements ParsableObject { + private int Id; + private int TId; + private int UsualTickets; + private int MagicTickets; + + public CatalogItem(int id, int TId, int usualTickets, int magicTickets) { + Id = id; + this.TId = TId; + UsualTickets = usualTickets; + MagicTickets = magicTickets; + } + + @Attribute(name="Id") + public int getId() { + return Id; + } + + @Attribute(name="TId") + public int getTId() { + return TId; + } + + @Attribute(name="UsualTickets") + public int getUsualTickets() { + return UsualTickets; + } + + @Attribute(name="MagicTickets") + public int getMagicTickets() { + return MagicTickets; + } +} diff --git a/src/org/cl0zzzy/server/CheckUserRightsObject.java b/src/org/cl0zzzy/server/CheckUserRightsObject.java new file mode 100644 index 0000000..330e268 --- /dev/null +++ b/src/org/cl0zzzy/server/CheckUserRightsObject.java @@ -0,0 +1,39 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Root; + +@Root(name="CUR") +public class CheckUserRightsObject implements ParsableObject { + public boolean IsNotEnoughRole; + public boolean IsNotEnoughMoney; + public int TextResourceID; + public int MediaResourceID; + + public CheckUserRightsObject( boolean IsNotEnoughRole, boolean IsNotEnoughMoney, int TextResourceID, int MediaResourceID ) { + this.IsNotEnoughMoney = IsNotEnoughMoney; + this.IsNotEnoughRole = IsNotEnoughRole; + this.TextResourceID = TextResourceID; + this.MediaResourceID = MediaResourceID; + } + + @Attribute(name="IsNotEnoughRole") + public boolean getIsNotEnoughRole() { + return this.IsNotEnoughRole; + } + + @Attribute(name="IsNotEnoughMoney") + public boolean getIsNotEnoughMoney() { + return this.IsNotEnoughMoney; + } + + @Attribute(name="TextResourceID") + public int getTextResourceID() { + return this.TextResourceID; + } + + @Attribute(name="MediaResourceID") + public int getMediaResourceID() { + return this.MediaResourceID; + } +} diff --git a/src/org/cl0zzzy/server/Good.java b/src/org/cl0zzzy/server/Good.java new file mode 100644 index 0000000..7891aa6 --- /dev/null +++ b/src/org/cl0zzzy/server/Good.java @@ -0,0 +1,74 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Root; + +@Root(name="good") +public class Good implements ParsableObject { + private int Id; + private int TextResourceID; + private int MediaResourceId; + private int GoodTypeId; + private int RoleFlags; + private int UsualTickets; + private int MagicTickets; + private int IsActive; + private int LayerID; + + public Good(int id, int TRId, int MRId, int goodTypeId, int roleFlags, int usualTickets, int magicTickets, int LayerID, int IsActive ) { + Id = id; + this.TextResourceID = TRId; + this.MediaResourceId = MRId; + GoodTypeId = goodTypeId; + RoleFlags = roleFlags; + UsualTickets = usualTickets; + MagicTickets = magicTickets; + this.IsActive = IsActive; + this.LayerID = LayerID; + } + + @Attribute(name="IsActive") + public int getIsActive() { + return IsActive; + } + + @Attribute(name="LayerID") + public int getLayerID() { + return LayerID; + } + + @Attribute(name="Id") + public int getId() { + return Id; + } + + @Attribute(name="TextResourceId") + public int getTextResourceID() { + return TextResourceID; + } + + @Attribute(name="MediaResourceId") + public int getMediaResourceID() { + return MediaResourceId; + } + + @Attribute(name="GoodTypeId") + public int getGoodTypeId() { + return GoodTypeId; + } + + @Attribute(name="RoleFlags") + public int getRoleFlags() { + return RoleFlags; + } + + @Attribute(name="UsualTickets") + public int getUsualTickets() { + return UsualTickets; + } + + @Attribute(name="MagicTickets") + public int getMagicTickets() { + return MagicTickets; + } +} diff --git a/src/org/cl0zzzy/server/Inventory.java b/src/org/cl0zzzy/server/Inventory.java new file mode 100644 index 0000000..70608d6 --- /dev/null +++ b/src/org/cl0zzzy/server/Inventory.java @@ -0,0 +1,55 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Element; +import org.simpleframework.xml.Order; +import org.simpleframework.xml.Root; + +@Root(name="user_avatar") +@Order(elements = {"Shape", "BodyParts", "Inventory", "Backgrounds", "Phones", "SportInventory"}) +public class Inventory implements ParsableObject { + private InventoryTab shape; + private InventoryTab bodyparts; + private InventoryTab inventory; + private InventoryList backgrounds; + private InventoryList phones; + private InventoryList sportinv; + + public Inventory( InventoryTab shape, InventoryTab bodyparts, InventoryTab inventory, InventoryList backgrounds, InventoryList phones, InventoryList sportinv ) { + this.shape = shape; + this.bodyparts = bodyparts; + this.inventory = inventory; + this.backgrounds = backgrounds; + this.phones = phones; + this.sportinv = sportinv; + } + + @Element(name="Shape") + public InventoryTab getShape() { + return this.shape; + } + + @Element(name="BodyParts") + public InventoryTab getBodyParts() { + return this.bodyparts; + } + + @Element(name="Inventory") + public InventoryTab getInventory() { + return this.inventory; + } + + @Element(name="Backgrounds") + public InventoryList getBackgrounds() { + return this.backgrounds; + } + + @Element(name="Phones") + public InventoryList getPhones() { + return this.phones; + } + + @Element(name="SportInventory") + public InventoryList getSportInventory() { + return this.sportinv; + } +} diff --git a/src/org/cl0zzzy/server/InventoryGroup.java b/src/org/cl0zzzy/server/InventoryGroup.java new file mode 100644 index 0000000..596cbb3 --- /dev/null +++ b/src/org/cl0zzzy/server/InventoryGroup.java @@ -0,0 +1,57 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.ElementList; +import org.simpleframework.xml.Root; + +import java.util.ArrayList; + +@Root(name="tab") +public class InventoryGroup implements ParsableObject { + private int ID; + private int TextResourceID; + private int IsUsed; + private int MediaResourceID; + private int LayerID; + + private ArrayList items = new ArrayList(); + + public InventoryGroup( int ID, int TextResourceID, int IsUsed, int MediaResourceID, int LayerID, ArrayList items ) { + this.ID = ID; + this.TextResourceID = TextResourceID; + this.IsUsed = IsUsed; + this.MediaResourceID = MediaResourceID; + this.LayerID = LayerID; + this.items = items; + } + + @Attribute(name="ID") + public int getID() { + return ID; + } + + @Attribute(name="TextResourceID") + public int getTextResourceID() { + return TextResourceID; + } + + @Attribute(name="IsUsed") + public int getIsUsed() { + return IsUsed; + } + + @Attribute(name="MediaResourceID") + public int getMediaResourceID() { + return MediaResourceID; + } + + @Attribute(name="LayerID") + public int getLayerID() { + return LayerID; + } + + @ElementList(inline = true, name="item") + public ArrayList getItems() { + return this.items; + } +} \ No newline at end of file diff --git a/src/org/cl0zzzy/server/InventoryItem.java b/src/org/cl0zzzy/server/InventoryItem.java new file mode 100644 index 0000000..2460baa --- /dev/null +++ b/src/org/cl0zzzy/server/InventoryItem.java @@ -0,0 +1,101 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Root; + +@Root(name="item") +public class InventoryItem implements ParsableObject { + private Integer TextResourceID; + private Integer ID; + private Integer BodyPartId; + private Integer MediaResourceID; + private Integer IsUsed; + private Integer IsColorable; + private Integer Color; + private Integer IsLimited; + private String Date; + private Integer Pollution; + private Integer IsBodyPart; + + public InventoryItem( Integer ID, Integer IsLimited, Integer IsUsed, String Date, Integer MediaResourceID, Integer TextResourceID, Integer Pollution, Integer BodyPartId, Integer IsColorable, Integer Color, Integer IsBodyPart ) { + this.TextResourceID = TextResourceID; + this.BodyPartId = BodyPartId; + this.ID = ID; + this.Color = Color; + this.Date = Date; + this.IsBodyPart = IsBodyPart; + this.IsColorable = IsColorable; + this.IsLimited = IsLimited; + this.IsUsed = IsUsed; + this.MediaResourceID = MediaResourceID; + this.Pollution = Pollution; + } + + @Attribute(name="ID") + public Integer getID() { + return this.ID; + } + + @Attribute(name="GoodID") + public Integer getGoodID() { + return this.ID; + } + + @Attribute(name="TextResourceID", required=false) + public Integer getTextResourceID() { + return TextResourceID; + } + + @Attribute(name="BodyPartId") + public Integer getBodyPartId() { + return BodyPartId; + } + + @Attribute(name="MediaResourceID") + public Integer getMediaResourceID() { + return MediaResourceID; + } + + @Attribute(name="IsUsed") + public Integer getIsUsed() { + return IsUsed; + } + + @Attribute(name="IsColorable") + public Integer getIsColorable() { + return IsColorable; + } + + @Attribute(name="Color", required=false) + public Integer getColor() { + return Color; + } + + @Attribute(name="IsLimited", required=false) + public Integer getIsLimited() { + return IsLimited; + } + + @Attribute(name="Date", required=false) + public String getDate() { + return Date; + } + + @Attribute(name="Pollution", required=false) + public Integer getPollution() { + return Pollution; + } + + @Attribute(name="IsBodyPart", required=false) + public Integer getIsBodyPart() { + return IsBodyPart; + } + + public void setIsUsed( int IsUsed ) { + this.IsUsed = IsUsed; + } + + public void setColor( int color ) { + this.Color = color; + } +} \ No newline at end of file diff --git a/src/org/cl0zzzy/server/InventoryList.java b/src/org/cl0zzzy/server/InventoryList.java new file mode 100644 index 0000000..51645b6 --- /dev/null +++ b/src/org/cl0zzzy/server/InventoryList.java @@ -0,0 +1,26 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.ElementList; + +import java.util.ArrayList; + +public class InventoryList implements ParsableObject { + private int TextResourceID; + private ArrayList items = new ArrayList(); + + public InventoryList( int TextResourceID, ArrayList items ) { + this.TextResourceID = TextResourceID; + this.items = items; + } + + @Attribute(name="TextResourceID") + public int getTextResourceID() { + return this.TextResourceID; + } + + @ElementList(inline = true, name="item") + public ArrayList getItems() { + return this.items; + } +} diff --git a/src/org/cl0zzzy/server/InventoryTab.java b/src/org/cl0zzzy/server/InventoryTab.java new file mode 100644 index 0000000..7dc629b --- /dev/null +++ b/src/org/cl0zzzy/server/InventoryTab.java @@ -0,0 +1,26 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.ElementList; + +import java.util.ArrayList; + +public class InventoryTab implements ParsableObject { + private int TextResourceID; + private ArrayList items = new ArrayList(); + + public InventoryTab( int TextResourceID, ArrayList items ) { + this.TextResourceID = TextResourceID; + this.items = items; + } + + @Attribute(name="TextResourceID") + public int getTextResourceID() { + return this.TextResourceID; + } + + @ElementList(inline = true, name="tab") + public ArrayList getItems() { + return this.items; + } +} \ No newline at end of file diff --git a/src/org/cl0zzzy/server/MagicAbility.java b/src/org/cl0zzzy/server/MagicAbility.java new file mode 100644 index 0000000..e7409d3 --- /dev/null +++ b/src/org/cl0zzzy/server/MagicAbility.java @@ -0,0 +1,32 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Root; + +@Root(name="ability") +public class MagicAbility { + private int Id; + private String ExpirationDate; + private int IsLimited; + + public MagicAbility(int id, String expirationDate, int isLimited) { + Id = id; + ExpirationDate = expirationDate; + IsLimited = isLimited; + } + + @Attribute(name="Id") + public int getId() { + return Id; + } + + @Attribute(name="ExpirationDate") + public String getExpirationDate() { + return ExpirationDate; + } + + @Attribute(name="IsLimited") + public int getIsLimited() { + return IsLimited; + } +} diff --git a/src/org/cl0zzzy/server/Main.java b/src/org/cl0zzzy/server/Main.java new file mode 100644 index 0000000..4ef30f8 --- /dev/null +++ b/src/org/cl0zzzy/server/Main.java @@ -0,0 +1,7 @@ +package org.cl0zzzy.server; + +public class Main { + public static void main(String[] args) { + new Server(9115, 8888); + } +} \ No newline at end of file diff --git a/src/org/cl0zzzy/server/ParsableObject.java b/src/org/cl0zzzy/server/ParsableObject.java new file mode 100644 index 0000000..20eaf22 --- /dev/null +++ b/src/org/cl0zzzy/server/ParsableObject.java @@ -0,0 +1,3 @@ +package org.cl0zzzy.server; + +public interface ParsableObject {} \ No newline at end of file diff --git a/src/org/cl0zzzy/server/Player.java b/src/org/cl0zzzy/server/Player.java new file mode 100644 index 0000000..21d0ce9 --- /dev/null +++ b/src/org/cl0zzzy/server/Player.java @@ -0,0 +1,92 @@ +package org.cl0zzzy.server; + +public class Player { + + private int id = -1; + private String playerName = ""; + private double x = 480; + private double y = 300; + private double state = 2; + private int location = Integer.MAX_VALUE; + private boolean inLocation = false; + private boolean inMultiplayerGame = false; + private boolean canModifyLocations = false; + + public Player( int id ) { + this.id = id; + } + + public void setX( double x ) { + this.x = x; + } + + public void setY( double y ) { + this.y = y; + } + + public void setCanModifyLocations( boolean canModifyLocations ) { + this.canModifyLocations = canModifyLocations; + } + + public boolean getCanModifyLocations() { + return this.canModifyLocations; + } + + public void setCoords( double x, double y ) { + this.setX(x); + this.setY(y); + } + + public double getX() { + return this.x; + } + + public double getY() { + return this.y; + } + + public void setLocation( int id ) { + this.location = id; + } + + public int getLocation() { + return this.location; + } + + public void setState( double state ) { + this.state = state; + } + + public double getState() { + return this.state; + } + + public void setInMultiplayerGame( boolean inMultiplayerGame ) { + this.inMultiplayerGame = inMultiplayerGame; + } + + public boolean IsInMultiplayerGame() { + return this.inMultiplayerGame; + } + + public void setInLocation( boolean inLocation ) { + this.inLocation = inLocation; + } + + public boolean isInLocation() { + return this.inLocation; + } + + public int getId() { + return this.id; + } + + public void setName( String name ) { + this.playerName = name; + } + + public String getName() { + return this.playerName; + } + +} diff --git a/src/org/cl0zzzy/server/Profile.java b/src/org/cl0zzzy/server/Profile.java new file mode 100644 index 0000000..cccfcda --- /dev/null +++ b/src/org/cl0zzzy/server/Profile.java @@ -0,0 +1,24 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Element; +import org.simpleframework.xml.Root; + +@Root(name="inventory") +public class Profile implements ParsableObject { + private UserInfo ui; + + public Profile( UserInfo ui ) { + this.ui = ui; + } + + @Element(name="user") + public UserInfo getUserInfo() { + return this.ui; + } + + @Element(name="avatar") + public String getAvatar() { + return ""; + } +} diff --git a/src/org/cl0zzzy/server/Server.java b/src/org/cl0zzzy/server/Server.java new file mode 100644 index 0000000..f759af7 --- /dev/null +++ b/src/org/cl0zzzy/server/Server.java @@ -0,0 +1,811 @@ +package org.cl0zzzy.server; + +import java.io.StringWriter; +import java.io.Writer; +import java.util.ArrayList; + +import org.cl0zzzy.http.HttpMain; +import org.cl0zzzy.sqlite.DB; +import org.cl0zzzy.rtmp.AMFEcmaArray; +import org.cl0zzzy.rtmp.AMFObject; +import org.cl0zzzy.rtmp.AMFObjectArray; +import org.cl0zzzy.rtmp.RTMPServer; +import org.simpleframework.xml.Serializer; +import org.simpleframework.xml.core.Persister; + +public class Server extends RTMPServer { + + private final Base Base = new Base(); + private final Avatar Avatar = new Avatar(); + private final Location Location = new Location(); + private final Home Home = new Home(); + + private ArrayList players = new ArrayList(); + + private HttpMain HTTP; + + private String toXML( ParsableObject c ) { + Writer writer = new StringWriter(); + Serializer serializer = new Persister(); + try { + serializer.write(c, writer); + return writer.toString(); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + public Server(int port, int httpPort) { + super(port); + org.cl0zzzy.sqlite.DB.connect(); + this.HTTP = new HttpMain(httpPort, port); + } + + private Player getPlayerById( int id ) { + for( int i = 0; i < players.size(); i++ ) { + if( players.get(i).getId() == id ) { + return players.get(i); + } + } + return null; + } + + private void sendInLoc( int location, String function, AMFObject... args ) { + for( int i = 0; i < players.size(); i++ ) { + if( players.get(i).getLocation() == (location) && players.get(i).isInLocation() ) { + this.call(players.get(i).getId(), function, args); + } + } + } + + public void onOpen( int id ) { + System.out.println( "connection " + id ); + Player p = new Player(id); + players.add(p); + HTTP.updatePlayers( players.size() ); + DB.clearMagicAbilities( id ); + } + + public ArrayList onMessage( int id, String function, ArrayList data ) { + ArrayList result = new ArrayList(); + + if( !function.equals("_LG") && !function.equals("_S") && !data.get(1).getString().equals("_SR") && !function.equals("_SR") && !function.equals("_P") ) { + System.out.println( "onMessage " + id + " " + function + " " + data.get(1).getString()); + + for( int i = 0; i < data.size(); i++ ) { + System.out.println( i + " " + data.get(i).getString() ); + } + } + + if( function.equals("_S") ) { + Base.setState( id, data.get(1).getString() ); + } else if( function.equals("_P") ) { + Base.setPosition( id, data.get(1), data.get(2).getDouble() ); + } else if( function.equals("$") ) { + if( data.get(1).getString().equals("_I") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + System.out.println(Avatar.getUserInitData( this.getPlayerById(id) ) ); + result.add(new AMFObject( AMFObject.AMF_STRING, Avatar.getUserInitData( this.getPlayerById(id) ) )); + } else if( data.get(1).getString().equals("_MC") ) { + int recieverId = data.get(4).getECMArray().getValueAt(0).getInt(); + String cardId = data.get(4).getECMArray().getValueAt(1).getString(); + String pcid = DB.sendPostcard( id, recieverId, cardId ); + call( recieverId, "_MC", new AMFObject(AMFObject.AMF_NULL, null), new AMFObject(AMFObject.AMF_STRING, "") ); + result.add(new AMFObject( AMFObject.AMF_NULL, null)); + } else if( data.get(1).getString().equals("_MP") ) { + int recieverId = data.get(4).getECMArray().getValueAt(0).getInt(); + String message = data.get(4).getECMArray().getValueAt(1).getString(); + String msgId = DB.sendPhoneMessage( id, recieverId, message ); + call( recieverId, "_MP", new AMFObject(AMFObject.AMF_NULL, null), + new AMFObject(AMFObject.AMF_STRING, "") ); + result.add(new AMFObject( AMFObject.AMF_NULL, null)); + } else if( data.get(1).getString().equals("_MCD") ) { + DB.removePostcard(data.get(4).getECMArray().getValueAt(0).getString()); + result.add(new AMFObject( AMFObject.AMF_NULL, null)); + } else if( data.get(1).getString().equals("_MCR") ) { + DB.markPostcardAsRead( data.get(4).getECMArray().getValueAt(0).getString() ); + result.add(new AMFObject( AMFObject.AMF_NULL, null)); + } else if( data.get(1).getString().equals("_MPR") ) { + DB.markMessageAsRead( data.get(4).getECMArray().getValueAt(0).getString() ); + result.add(new AMFObject( AMFObject.AMF_NULL, null)); + } else if( data.get(1).getString().equals("_SNFP") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "" )); + } else if( data.get(1).getString().equals("_D") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + } else if( data.get(1).getString().equals("_CM") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "" )); + } else if( data.get(1).getString().equals("_LDH") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, ""+DB.getFurnitureFromInventory(id)+""+DB.getHousesFromInventory(id)+"" )); + } else if( data.get(1).getString().equals("_LG") ) { + if( data.get(4).getECMArray().getValueAt(1).getDouble() == -1.0 ) { + int owner = data.get(4).getECMArray().getValueAt(0).getInt(); + result = Home.getHome(result, owner, id); + } else if( data.get(4).getECMArray().getValueAt(1).getDouble() == -2.0 ) { + + } else { + result = Location.getLocation( this.getPlayerById(id), data.get(4).getECMArray().getValueAt(1).getDouble(), data.get(4).getECMArray().getValueAt(2).getDouble()); + this.getPlayerById(id).setX(Double.parseDouble(Location.getLocationX(data.get(4).getECMArray().getValueAt(1).getDouble(), data.get(4).getECMArray().getValueAt(2).getDouble()))); + this.getPlayerById(id).setY(Double.parseDouble(Location.getLocationY(data.get(4).getECMArray().getValueAt(1).getDouble(), data.get(4).getECMArray().getValueAt(2).getDouble()))); + Base.updateLocationPlayers(id, Location.getLocationId(data.get(4).getECMArray().getValueAt(1).getDouble(), data.get(4).getECMArray().getValueAt(2).getDouble())); + } + } else if( data.get(1).getString().equals("_LGI") ) { + double nextLocation = data.get(4).getECMArray().getValueAt(0).getDouble(); + double prevLocation = data.get(4).getECMArray().getValueAt(1).getDouble(); + if( nextLocation == -1.0 ) { + nextLocation = 0; + prevLocation = 0; + } + result = Location.getLocation( this.getPlayerById(id), nextLocation, prevLocation); + this.getPlayerById(id).setX(Double.parseDouble(Location.getLocationX(nextLocation, prevLocation))); + this.getPlayerById(id).setY(Double.parseDouble(Location.getLocationY(nextLocation, prevLocation))); + Base.updateLocationPlayers(id, Location.getLocationId(nextLocation, prevLocation)); + } else if( data.get(1).getString().equals("_UFG") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_OBJECT_START, DB.getUserFriends( id, players ) )); + } else if( data.get(1).getString().equals("_UFR") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_OBJECT_START, DB.getUserFriendsRequests( id, players ) )); + } else if( data.get(1).getString().equals("_UFO") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_OBJECT_START, DB.getUserFriends( id, players ) )); + } else if( data.get(1).getString().equals("_UFA") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "" )); + String[] uids = new String[1]; + if( !data.get(4).getECMArray().getValueAt(1).getString().equals("") ) { + uids = data.get(4).getECMArray().getValueAt(1).getString().split(","); + for( int k = 0; k < uids.length; k++ ) { + DB.removeFriend( id, Integer.parseInt(uids[k]) ); + } + } else { + uids = data.get(4).getECMArray().getValueAt(0).getString().split(","); + for( int k = 0; k < uids.length; k++ ) { + DB.addFriend( id, Integer.parseInt(uids[k]) ); + + AMFObjectArray array = new AMFObjectArray(); + AMFObjectArray player = new AMFObjectArray(); + player.add("UserName", new AMFObject( AMFObject.AMF_STRING, DB.getPlayerName(Integer.parseInt(uids[k])) )); + player.add("UserId", new AMFObject( AMFObject.AMF_STRING, uids[k] )); + player.add("SnName", new AMFObject( AMFObject.AMF_STRING, "" )); + boolean is = false; + for( int i = 0; i < players.size(); i++ ) { + if( players.get(i).getId() == Integer.parseInt(uids[k]) ) { + is = true; + break; + } + } + if( is ) { + player.add("IsOnline", new AMFObject( AMFObject.AMF_STRING, "1" ) ); + } else { + player.add("IsOnline", new AMFObject( AMFObject.AMF_STRING, "0" ) ); + } + array.add("1", new AMFObject( AMFObject.AMF_OBJECT_START, player )); + + call( id, "_UFLA", new AMFObject( AMFObject.AMF_NULL, null ), + new AMFObject( AMFObject.AMF_OBJECT_START, array ) ); + + array = new AMFObjectArray(); + player = new AMFObjectArray(); + player.add("UserName", new AMFObject( AMFObject.AMF_STRING, this.getPlayerById(id).getName() )); + player.add("UserId", new AMFObject( AMFObject.AMF_STRING, id )); + player.add("SnName", new AMFObject( AMFObject.AMF_STRING, "" )); + is = false; + for( int i = 0; i < players.size(); i++ ) { + if( players.get(i).getId() == id ) { + is = true; + break; + } + } + if( is ) { + player.add("IsOnline", new AMFObject( AMFObject.AMF_STRING, "1" ) ); + } else { + player.add("IsOnline", new AMFObject( AMFObject.AMF_STRING, "0" ) ); + } + array.add("1", new AMFObject( AMFObject.AMF_OBJECT_START, player )); + + call( Integer.parseInt(uids[k]), "_UFLA", new AMFObject( AMFObject.AMF_NULL, null ), + new AMFObject( AMFObject.AMF_OBJECT_START, array ) ); + } + } + } else if( data.get(1).getString().equals("_UFD") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "" )); + DB.removeFriend( id, data.get(4).getECMArray().getValueAt(0).getInt() ); + } else if( data.get(1).getString().equals("_NUM") ) { + Base.useMagicAbility( data.get(4).getECMArray().getValueAt(0).getInt(), data.get(4).getECMArray().getValueAt(1).getDouble() ); + } else if( data.get(1).getString().equals("_NUS") ) { + if( data.get(2).getString().equals("ROOM") ) { + Base.throwSnowball( data.get(4).getECMArray().getValueAt(0).getInt(), data.get(4).getECMArray().getValueAt(1).getDouble(), data.get(4).getECMArray().getValueAt(2).getDouble() ); + } + } else if( data.get(1).getString().equals("_C") ) { + if( data.get(4).getECMArray().getValueAt(1).getString().startsWith("/give ") ) { + try { + DB.addPlayerCloth(id, Integer.parseInt(data.get(4).getECMArray().getValueAt(1).getString().substring(6)) + ""); + } catch( Exception e ) { + e.printStackTrace(); + } + } + Base.chatMessage( id, data.get(4).getECMArray().getValueAt(1).getString() ); + } else if( data.get(1).getString().equals("_UUG") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "123" )); + } else if( data.get(1).getString().equals("_GG") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, DB.getGameXML(data.get(4).getECMArray().getValueAt(0).getString()) )); + System.out.println( DB.getGameXML(data.get(4).getECMArray().getValueAt(0).getString()) ); + } else if( data.get(1).getString().equals("_GC") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "0" )); + getPlayerById(id).setInLocation(true); + } else if( data.get(1).getString().equals("_GD") ) { + this.getPlayerById(id).setInMultiplayerGame(false); + } else if( data.get(1).getString().equals("_GR") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + + this.getPlayerById(id).setInMultiplayerGame(true); + + AMFObjectArray array = new AMFObjectArray(); + array.add("ID", new AMFObject( AMFObject.AMF_STRING, id )); + array.add("Name", new AMFObject( AMFObject.AMF_STRING, this.getPlayerById(id).getName() )); + + AMFObjectArray ecma = new AMFObjectArray(); + ecma.add("0", new AMFObject(AMFObject.AMF_OBJECT_START, array)); + + array = new AMFObjectArray(); + array.add("ID", new AMFObject( AMFObject.AMF_STRING, "2" )); + array.add("Name", new AMFObject( AMFObject.AMF_STRING, "Натик" )); + + ecma.add("1", new AMFObject(AMFObject.AMF_OBJECT_START, array)); + + AMFObjectArray _arr = new AMFObjectArray(); + _arr.add("0", new AMFObject(AMFObject.AMF_OBJECT_START, ecma)); + + new Thread( () -> { try { Thread.sleep(2000); } catch( Exception e ) { e.printStackTrace(); } call( id, "_GU", new AMFObject( AMFObject.AMF_NULL, null ), new AMFObject( AMFObject.AMF_OBJECT_START, _arr ), + new AMFObject( AMFObject.AMF_NUMBER, 1 ), new AMFObject( AMFObject.AMF_BOOLEAN, false ) ); } ).start(); + + new Thread( () -> { try { Thread.sleep(2500); } catch( Exception e ) { e.printStackTrace(); } call( id, "_GL", new AMFObject( AMFObject.AMF_NULL, null ), new AMFObject( AMFObject.AMF_OBJECT_START, _arr ), + new AMFObject( AMFObject.AMF_STRING, "222" )); } ).start(); + + new Thread( () -> { + try { + Thread.sleep(3000); + int i = 0; + while( i < 100 ) { + call(id, "_G", new AMFObject( AMFObject.AMF_NULL, null ), new AMFObject( AMFObject.AMF_STRING, "OnReady" ), new AMFObject( AMFObject.AMF_NUMBER, 0 ), new AMFObject( AMFObject.AMF_STRING, id )); + i++; + Thread.sleep(500); + } + } catch ( Exception e ) { + e.printStackTrace(); + } + }).start(); + } else if( data.get(1).getString().equals("_GT") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "0" )); + } else if( data.get(1).getString().equals("_GS") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + Base.setMoney(id, DB.getPlayerUsualTickets(id)+data.get(4).getECMArray().getValueAt(1).getInt(), DB.getPlayerMagicTickets(id)); + result.add(new AMFObject( AMFObject.AMF_STRING, "" )); + } else if( data.get(1).getString().equals("_AG") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, Avatar.getAG(id) )); + } else if( data.get(1).getString().equals("_AS") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + Avatar.setAG(id, data.get(4).getECMArray()); + result.add(new AMFObject( AMFObject.AMF_ECMA_ARRAY_START, new AMFEcmaArray() )); + this.sendInLoc(this.getPlayerById(id).getLocation(), "_UL", new AMFObject( AMFObject.AMF_NULL, null ), new AMFObject( AMFObject.AMF_STRING, id )); + this.sendInLoc(this.getPlayerById(id).getLocation(), "_UE", new AMFObject( AMFObject.AMF_NULL, null ), new AMFObject( AMFObject.AMF_STRING, id ), new AMFObject( AMFObject.AMF_OBJECT_START, Avatar.getUE(id) ) ); + } else if( data.get(1).getString().equals("_UI") ) { + AMFObjectArray friends = DB.getUserFriends(id, players); + String isFriend = "0"; + for( int i = 0; i < friends.getLength(); i++ ) { + String user = friends.getValueAt(i).getObjectArray().get("UserId").getString(); + String uid = String.valueOf(((int)Double.parseDouble(data.get(4).getECMArray().getValueAt(0).getString()))); + if( uid.equals(user) ) { + isFriend = "1"; + break; + } + } + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, Avatar.getUI(data.get(4).getECMArray().getValueAt(0).getInt(), isFriend) )); + } else if( data.get(1).getString().equals("_GCI") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, this.toXML(DB.getCatalogById(data.get(4).getECMArray().getValueAt(0).getString())) )); + } else if( data.get(1).getString().equals("_JD") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "")); + } else if( data.get(1).getString().equals("_VC") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_BOOLEAN, true )); + } else if( data.get(1).getString().equals("_BGB") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + AMFObjectArray good = data.get(4).getECMArray().getValueAt(0).getECMArray().getValueAt(0).getObjectArray().get("item").getObjectArray(); + if( good.get("priceSm").getDouble() <= DB.getPlayerUsualTickets(id) && + good.get("priceRu").getDouble() <= DB.getPlayerMagicTickets(id) ) { + AMFObjectArray tags = good.get("tagsHash").getObjectArray(); + if( tags.get("cloth") != null || tags.get("costume") != null || tags.get("back") != null ) { + DB.addPlayerCloth( id, good.get("id").getString() ); + } else if( tags.get("magic") != null ) { + if( good.get("magicAbilityTime").getString().equals("null") ) { + DB.addMagicAbility(id, good.get("magicAbilityId").getString(), "0", "0"); + } else { + DB.addMagicAbility(id, good.get("magicAbilityId").getString(), good.get("magicAbilityTime").getString(), "1"); + } + } else if( tags.get("furniture") != null ) { + DB.addPlayerFurniture( id, good.get("id").getString() ); + } else if( tags.get("house") != null ) { + DB.addPlayerHome( id, good.get("id").getString() ); + } else { + //System.out.println( "cloth == null" ); + //System.out.println( tags.toString() ); + } + Base.setMoney(id, DB.getPlayerUsualTickets(id)-good.get("priceSm").getInt(), DB.getPlayerMagicTickets(id)-good.get("priceRu").getInt()); + AMFObjectArray arr = new AMFObjectArray(); + arr.add("Error", new AMFObject( AMFObject.AMF_BOOLEAN, false )); + arr.add("GoodInfo", new AMFObject( AMFObject.AMF_ECMA_ARRAY_START, new AMFEcmaArray() )); + result.add(new AMFObject( AMFObject.AMF_OBJECT_START, arr )); + } else { + result.add(new AMFObject( AMFObject.AMF_STRING, "0" ) ); + } + } else if( data.get(1).getString().equals("_UFQ") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "" )); + AMFObjectArray player = new AMFObjectArray(); + player.add("UserName", new AMFObject( AMFObject.AMF_STRING, DB.getPlayerName(id) )); + player.add("UserId", new AMFObject( AMFObject.AMF_STRING, id )); + player.add("SnName", new AMFObject( AMFObject.AMF_STRING, "" )); + player.add("IsOnline", new AMFObject( AMFObject.AMF_STRING, "1" ) ); + + call(data.get(4).getECMArray().getValueAt(0).getInt(), "_UFLR", + new AMFObject( AMFObject.AMF_NULL, null ), + new AMFObject( AMFObject.AMF_OBJECT_START, player)); + DB.requestFriend(id, data.get(4).getECMArray().getValueAt(0).getInt()); + } else if( data.get(1).getString().equals("_LM") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, DB.getUserMagicAbilities(id) )); + } else if( data.get(1).getString().equals("_GMB") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + AMFObjectArray array = new AMFObjectArray(); + array.add("Amount", new AMFObject( AMFObject.AMF_NUMBER, 9999 )); + result.add(new AMFObject( AMFObject.AMF_OBJECT_START, array )); + } else if( data.get(1).getString().equals("_MTB") ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + AMFObjectArray array = new AMFObjectArray(); + array.add("Amount", new AMFObject( AMFObject.AMF_NUMBER, 9999 )); + array.add("Success", new AMFObject( AMFObject.AMF_NUMBER, 1 )); + result.add(new AMFObject( AMFObject.AMF_OBJECT_START, array )); + Base.setMoney(id, DB.getPlayerUsualTickets(id),DB.getPlayerMagicTickets(id)+100); + } else if( data.get(1).getString().equals("_TE") ) { + int magic_rem = 0; + int usual_add = 0; + if( data.get(4).getECMArray().getValueAt(0).getDouble() == 1.0 ) { + magic_rem = 2; + usual_add = 100; + } else if( data.get(4).getECMArray().getValueAt(0).getDouble() == 2.0 ) { + magic_rem = 4; + usual_add = 200; + } else if( data.get(4).getECMArray().getValueAt(0).getDouble() == 3.0 ) { + magic_rem = 10; + usual_add = 500; + } else if( data.get(4).getECMArray().getValueAt(0).getDouble() == 4.0 ) { + magic_rem = 20; + usual_add = 1000; + } else if( data.get(4).getECMArray().getValueAt(0).getDouble() == 5.0 ) { + magic_rem = 50; + usual_add = 2500; + } + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + AMFObjectArray array = new AMFObjectArray(); + array.add("Success", new AMFObject( AMFObject.AMF_NUMBER, 1 )); + result.add(new AMFObject( AMFObject.AMF_OBJECT_START, array )); + Base.setMoney(id, DB.getPlayerUsualTickets(id)+usual_add, DB.getPlayerMagicTickets(id)-magic_rem); + } else if( data.get(1).getString().equals("_LC") ) { + if( data.get(2).getString().equals("ROOM") ) { + String type = data.get(4).getECMArray().getValueAt(1).getString(); + if( type.equals("-1.0") ) { + AMFObjectArray object = data.get(4).getECMArray().getValueAt(2).getObjectArray(); + AMFObjectArray Add = object.get("Add").getObjectArray(); + AMFObjectArray Remove = object.get("Remove").getObjectArray(); + //System.out.println("Add + " + Add.toString()); + String xml = ""; + for( int i = 0; i < Add.getLength(); i++ ) { + String key = Add.getKeyAt(i); + AMFObjectArray oa = Add.get(key).getObjectArray(); + xml += " bodyparts = new ArrayList(); + bodyparts.add(new InventoryItem(56, null, 0, null, 56, null, null, 56, 1, 16762375, null)); + bodyparts.add(new InventoryItem(60, null, 0, null, 60, null, null, 60, 1, 16762375, null)); + bodyparts.add(new InventoryItem(64, null, 0, null, 64, null, null, 64, 1, 16762375, null)); + bodyparts.add(new InventoryItem(69, null, 0, null, 69, null, null, 69, 1, 16762375, null)); + bodyparts.add(new InventoryItem(73, null, 0, null, 73, null, null, 73, 1, 16762375, null)); + bodyparts.add(new InventoryItem(77, null, 0, null, 77, null, null, 77, 1, 16762375, null)); + bodyparts.add(new InventoryItem(83, null, 0, null, 83, null, null, 83, 1, 16762375, null)); + bodyparts.add(new InventoryItem(89, null, 1, null, 89, null, null, 89, 1, 16762375, null)); + ArrayList legparts = new ArrayList(); + legparts.add(new InventoryItem(55, 0, 0, "", 55, 0, 0, 55, 1, 16762375, 1)); + legparts.add(new InventoryItem(62, 0, 0, "", 62, 0, 0, 62, 1, 16762375, 1)); + legparts.add(new InventoryItem(66, 0, 0, "", 66, 0, 0, 66, 1, 16762375, 1)); + legparts.add(new InventoryItem(71, 0, 0, "", 71, 0, 0, 71, 1, 16762375, 1)); + legparts.add(new InventoryItem(75, 0, 0, "", 75, 0, 0, 75, 1, 16762375, 1)); + legparts.add(new InventoryItem(80, 0, 1, "", 80, 0, 0, 80, 1, 16762375, 1)); + legparts.add(new InventoryItem(86, 0, 0, "", 86, 0, 0, 86, 1, 16762375, 1)); + legparts.add(new InventoryItem(92, 0, 0, "", 92, 0, 0, 92, 1, 16762375, 1)); + ArrayList earparts = new ArrayList(); + earparts.add(new InventoryItem(78, 0, 1, "", 78, 0, 0, 78, 1, 0, 1)); + earparts.add(new InventoryItem(84, 0, 0, "", 84, 0, 0, 84, 1, 16762375, 1)); + earparts.add(new InventoryItem(90, 0, 0, "", 90, 0, 0, 90, 1, 16762375, 1)); + earparts.add(new InventoryItem(95, 0, 0, "", 95, 0, 0, 95, 1, 16762375, 1)); + earparts.add(new InventoryItem(96, 0, 0, "", 96, 0, 0, 96, 1, 16762375, 1)); + earparts.add(new InventoryItem(97, 0, 0, "", 97, 0, 0, 97, 1, 16762375, 1)); + earparts.add(new InventoryItem(98, 0, 0, "", 98, 0, 0, 98, 1, 16762375, 1)); + ArrayList eyeparts = new ArrayList(); + eyeparts.add(new InventoryItem(59, 0, 1, "", 59, 0, 0, 59, 0, 1, 1)); + eyeparts.add(new InventoryItem(61, 0, 0, "", 61, 0, 0, 61, 0, 1, 1)); + eyeparts.add(new InventoryItem(65, 0, 0, "", 65, 0, 0, 65, 0, 1, 1)); + eyeparts.add(new InventoryItem(70, 0, 0, "", 70, 0, 0, 70, 0, 1, 1)); + eyeparts.add(new InventoryItem(74, 0, 0, "", 74, 0, 0, 74, 0, 1, 1)); + eyeparts.add(new InventoryItem(79, 0, 0, "", 79, 0, 0, 79, 0, 1, 1)); + eyeparts.add(new InventoryItem(85, 0, 0, "", 85, 0, 0, 85, 0, 1, 1)); + eyeparts.add(new InventoryItem(91, 0, 0, "", 91, 0, 0, 91, 0, 1, 1)); + ArrayList noseparts = new ArrayList(); + noseparts.add(new InventoryItem(58, 0, 1, "", 58, 0, 0, 58, 0, 1, 1)); + noseparts.add(new InventoryItem(68, 0, 0, "", 68, 0, 0, 68, 0, 1, 1)); + noseparts.add(new InventoryItem(82, 0, 0, "", 82, 0, 0, 82, 0, 1, 1)); + noseparts.add(new InventoryItem(88, 0, 0, "", 88, 0, 0, 88, 0, 1, 1)); + noseparts.add(new InventoryItem(94, 0, 0, "", 94, 0, 0, 94, 0, 1, 1)); + noseparts.add(new InventoryItem(98, 0, 0, "", 98, 0, 0, 98, 0, 1, 1)); + ArrayList mouthparts = new ArrayList(); + mouthparts.add(new InventoryItem(57, 0, 1, "", 57, 0, 0, 57, 0, 1, 1)); + mouthparts.add(new InventoryItem(67, 0, 0, "", 67, 0, 0, 67, 0, 1, 1)); + mouthparts.add(new InventoryItem(81, 0, 0, "", 81, 0, 0, 81, 0, 1, 1)); + mouthparts.add(new InventoryItem(87, 0, 0, "", 87, 0, 0, 87, 0, 1, 1)); + mouthparts.add(new InventoryItem(93, 0, 0, "", 93, 0, 0, 93, 0, 1, 1)); + ArrayList beakparts = new ArrayList(); + beakparts.add(new InventoryItem(63, 0, 1, "", 63, 0, 0, 63, 0, 1, 1)); + beakparts.add(new InventoryItem(72, 0, 0, "", 72, 0, 0, 72, 0, 1, 1)); + beakparts.add(new InventoryItem(76, 0, 0, "", 76, 0, 0, 76, 0, 1, 1)); + beakparts.add(new InventoryItem(98, 0, 0, "", 98, 0, 0, 98, 0, 1, 1)); + ArrayList hornparts = new ArrayList(); + hornparts.add(new InventoryItem(99, 0, 1, "", 99, 0, 0, 99, 0, 1, 1)); + hornparts.add(new InventoryItem(100, 0, 0, "", 100, 0, 0, 100, 0, 1, 1)); + hornparts.add(new InventoryItem(101, 0, 0, "", 101, 0, 0, 101, 0, 1, 1)); + hornparts.add(new InventoryItem(102, 0, 0, "", 102, 0, 0, 102, 0, 1, 1)); + hornparts.add(new InventoryItem(103, 0, 0, "", 103, 0, 0, 103, 0, 1, 1)); + hornparts.add(new InventoryItem(98, 0, 0, "", 98, 0, 0, 98, 0, 1, 1)); + InventoryGroup body = new InventoryGroup(3, 48, 0, 202, 20, bodyparts); + InventoryGroup legs = new InventoryGroup(2, 47, 0, 201, 10, legparts); + InventoryGroup ears = new InventoryGroup(8, 70, 0, 206, 50, earparts); + InventoryGroup eyes = new InventoryGroup(7, 58, 0, 205, 30, eyeparts); + InventoryGroup nose = new InventoryGroup(6, 57, 0, 204, 40, noseparts); + InventoryGroup mouth = new InventoryGroup(5, 56, 0, 203, 26, mouthparts); + InventoryGroup beak = new InventoryGroup(11, 110, 0, 208, 41, beakparts); + InventoryGroup horn = new InventoryGroup(12, 166, 0, 209, 55, hornparts); + InventoryGroup clothes = new InventoryGroup(1, 120, 0, 212, 36, DB.getGoodsFromInventory(id, "1")); + InventoryGroup hats = new InventoryGroup(4, 21, 0, 211, 45, DB.getGoodsFromInventory(id, "4")); + InventoryGroup glasses = new InventoryGroup(14, 62, 0, 210, 31, DB.getGoodsFromInventory(id, "14")); + InventoryGroup shoes = new InventoryGroup(32, 123, 0, 213, 11, DB.getGoodsFromInventory(id, "32")); + InventoryGroup misc = new InventoryGroup(36, 24, 0, 214, 56, DB.getGoodsFromInventory(id, "36")); + InventoryGroup costumes = new InventoryGroup(40, 697, 0, 429, 27, DB.getGoodsFromInventory(id, "40")); + ArrayList invtab = new ArrayList(); + invtab.add(clothes); + invtab.add(hats); + invtab.add(glasses); + invtab.add(shoes); + invtab.add(misc); + invtab.add(costumes); + ArrayList shape = new ArrayList(); + shape.add(body); + shape.add(legs); + ArrayList bparts = new ArrayList(); + bparts.add(ears); + bparts.add(eyes); + bparts.add(nose); + bparts.add(mouth); + bparts.add(beak); + bparts.add(horn); + for (InventoryGroup inventoryGroup : shape) { + for (int j = 0; j < inventoryGroup.getItems().size(); j++) { + inventoryGroup.getItems().get(j).setIsUsed(DB.getIsUsedGood(id, inventoryGroup.getItems().get(j))); + inventoryGroup.getItems().get(j).setColor(DB.getBodyPartColor(id, inventoryGroup.getItems().get(j))); + } + } + for (InventoryGroup bpart : bparts) { + for (int j = 0; j < bpart.getItems().size(); j++) { + bpart.getItems().get(j).setIsUsed(DB.getIsUsedGood(id, bpart.getItems().get(j))); + bpart.getItems().get(j).setColor(DB.getBodyPartColor(id, bpart.getItems().get(j))); + } + } + for (InventoryGroup bpart : invtab) { + for (int j = 0; j < bpart.getItems().size(); j++) { + bpart.getItems().get(j).setIsUsed(DB.getIsUsedGood(id, bpart.getItems().get(j))); + } + } + Inventory inv = new Inventory( + new InventoryTab( 199, shape ), + new InventoryTab( 205, bparts ), + new InventoryTab( 206, invtab ), + new InventoryList( 230, new ArrayList()), + new InventoryList( 231, new ArrayList()), + new InventoryList( 211, new ArrayList())); + return toXML(inv).replace("", "").replace("", ""); + } + + private void setAG( int id, AMFEcmaArray arr ) { + DB.clearUserdata(id); + AMFObjectArray array = arr.getValueAt(0).getObjectArray(); + for( int i = 0; i < array.get("BodyParts").getECMArray().getLength(); i++ ) { + AMFObjectArray obj = array.get("BodyParts").getECMArray().getValueAt(i).getObjectArray(); + String color = obj.get("Color").getString().equals("NaN") ? "-1" : obj.get("Color").getString(); + if( !obj.get("Id").getString().equals("98.0") ) { + DB.insertUserdata(id, + obj.get("Id").getString(), "1", obj.get("Id").getString(), color, "0"); + } + } + for( int i = 0; i < array.get("Inventory").getECMArray().getLength(); i++ ) { + AMFObjectArray obj = array.get("Inventory").getECMArray().getValueAt(i).getObjectArray(); + DB.insertUserdata(id, + obj.get("Id").getString(), "0", "0", "-1", obj.get("Id").getString()); + } + } + + private String getUserInitData( Player p ) { + p.setName( DB.getPlayerName(p.getId()) ); + UserMagicAbilities ma = DB.getUserMagicAbilities(p.getId()); + UserAccount ua = DB.getUserAccount(p.getId()); + UserInfo ui = DB.getUserInfo(p.getId(), 0); + UserPhone up = DB.getUserPhone(p.getId()); + ArrayList av = DB.getUserAvatar(p.getId()); + UserInitInfo init = new UserInitInfo( ma, ua, ui, up, av ); + return toXML(init); + } + + private AMFObjectArray getUE( int id ) { + AMFObjectArray array = new AMFObjectArray(); + array.add("RoleFlags", new AMFObject( AMFObject.AMF_STRING, "2" )); + AMFObjectArray user = new AMFObjectArray(); + user.add("Level", new AMFObject( AMFObject.AMF_STRING, "99" )); + user.add("Name", new AMFObject( AMFObject.AMF_STRING, getPlayerById(id).getName() )); + user.add("x", new AMFObject( AMFObject.AMF_STRING, getPlayerById(id).getX() )); + user.add("y", new AMFObject( AMFObject.AMF_STRING, getPlayerById(id).getY() )); + user.add("State", new AMFObject( AMFObject.AMF_NUMBER, String.valueOf( getPlayerById(id).getState() ))); + AMFObjectArray body = DB.getUserData(id); + user.add("Body", new AMFObject( AMFObject.AMF_OBJECT_START, body )); + array.add("User", new AMFObject( AMFObject.AMF_OBJECT_START, user )); + return array; + } + + private String getUI( int id, String isFriend ) { + //String avatar = DB.getUserDataXML( id ); + String avatar = ""; + return ""+avatar+""; + } + + } + + private class Home { + public ArrayList getHome( ArrayList result, int owner, int id ) { + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + result.add(new AMFObject( AMFObject.AMF_STRING, "")); + System.out.println( result.get(result.size()-1).getString() ); + Base.updateLocationPlayers(id, -1); + return result; + } + } + + private class Location { + public ArrayList getLocation( Player p, double id, double _id ) { + ArrayList result = new ArrayList(); + result.add(new AMFObject( AMFObject.AMF_NULL, null )); + if( id == 0.0 && _id == 0.0 ) { + if( p.getCanModifyLocations() ) { + result.add(new AMFObject( AMFObject.AMF_STRING, org.cl0zzzy.sqlite.DB.getDefaultLocationXML().replace("IsHome=\"0\"", "IsHome=\"1\"") )); + } else { + result.add(new AMFObject( AMFObject.AMF_STRING, org.cl0zzzy.sqlite.DB.getDefaultLocationXML() )); + } + } else { + if( p.getCanModifyLocations() ) { + result.add(new AMFObject( AMFObject.AMF_STRING, org.cl0zzzy.sqlite.DB.getLocationXML((int)(id)).replace("IsHome=\"0\"", "IsHome=\"1\"") )); + } else { + result.add(new AMFObject( AMFObject.AMF_STRING, org.cl0zzzy.sqlite.DB.getLocationXML((int)(id)) )); + } + } + return result; + } + public int getLocationId( double id, double _id ) { + if( id == 0.0 && _id == 0.0 ) { + return org.cl0zzzy.sqlite.DB.getDefaultLocationId(); + } else { + return org.cl0zzzy.sqlite.DB.getLocationId((int)(id)); + } + } + public String getLocationX( double id, double _id ) { + if( id == 0.0 && _id == 0.0 ) { + return org.cl0zzzy.sqlite.DB.getDefaultLocationX(); + } else { + return org.cl0zzzy.sqlite.DB.getLocationX((int) (id)); + } + } + public String getLocationY( double id, double _id ) { + if( id == 0.0 && _id == 0.0 ) { + return org.cl0zzzy.sqlite.DB.getDefaultLocationY(); + } else { + return org.cl0zzzy.sqlite.DB.getLocationY((int)(id)); + } + } + } + +} diff --git a/src/org/cl0zzzy/server/UData.java b/src/org/cl0zzzy/server/UData.java new file mode 100644 index 0000000..6319580 --- /dev/null +++ b/src/org/cl0zzzy/server/UData.java @@ -0,0 +1,7 @@ +package org.cl0zzzy.server; + +public class UData { + public String id; + public String color = null; + public boolean isBodyPart; +} diff --git a/src/org/cl0zzzy/server/UserAccount.java b/src/org/cl0zzzy/server/UserAccount.java new file mode 100644 index 0000000..3683f62 --- /dev/null +++ b/src/org/cl0zzzy/server/UserAccount.java @@ -0,0 +1,32 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Root; + +@Root(name="account") +public class UserAccount { + private int PhoneCardBalance; + private int WeaponsCount; + private int OxigenUnits; + + public UserAccount(int phoneCardBalance, int weaponsCount, int oxigenUnits) { + PhoneCardBalance = phoneCardBalance; + WeaponsCount = weaponsCount; + OxigenUnits = oxigenUnits; + } + + @Attribute(name="PhoneCardBalance") + public int getPhoneCardBalance() { + return PhoneCardBalance; + } + + @Attribute(name="WeaponsCount") + public int getWeaponsCount() { + return WeaponsCount; + } + + @Attribute(name="OxigenUnits") + public int getOxigenUnits() { + return OxigenUnits; + } +} diff --git a/src/org/cl0zzzy/server/UserInfo.java b/src/org/cl0zzzy/server/UserInfo.java new file mode 100644 index 0000000..4819c3e --- /dev/null +++ b/src/org/cl0zzzy/server/UserInfo.java @@ -0,0 +1,258 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Root; + +@Root(name="user") +public class UserInfo implements ParsableObject { + private int UserId; + private int RoleFlags; + private int IsLimited; + private int IsOnline; + private int IsMinorSecretAgent; + private int IsHomeLocked; + private int IsClubLocked; + private int IsClubPresent; + private int ClubAccessType; + private int IsFriend; + private int Experience; + private int Level; + private int PositiveEnergy; + private int MagicLevel; + private int RaceLevel; + private int PhoneID; + private int BackgroundID; + private int CampId; + private int NiftTotalCount; + private String LocationServerName; + private String DateRegistered; + private int InstructorLevel; + private int UsualTickets; + private int MagicTickets; + private int VisaId; + private int CurrentUseCount; + private int LastNewspaperId; + private int HasSnFriends; + private int MinsLeft; + private int TimesUsed; + private String Name; + + public UserInfo(int userId, + int roleFlags, + int isLimited, + int isOnline, + int isMinorSecretAgent, + int isHomeLocked, + int isClubLocked, + int isClubPresent, + int clubAccessType, + int isFriend, + int experience, + int level, + int positiveEnergy, + int magicLevel, + int raceLevel, + int phoneID, + int backgroundID, + int campId, + int niftTotalCount, + String locationServerName, + String dateRegistered, + int instructorLevel, + int usualTickets, + int magicTickets, + int visaId, + int currentUseCount, + int lastNewspaperId, + int hasSnFriends, + int minsLeft, + int timesUsed, + String name ) { + UserId = userId; + RoleFlags = roleFlags; + IsLimited = isLimited; + IsOnline = isOnline; + IsMinorSecretAgent = isMinorSecretAgent; + IsHomeLocked = isHomeLocked; + IsClubLocked = isClubLocked; + IsClubPresent = isClubPresent; + ClubAccessType = clubAccessType; + IsFriend = isFriend; + Experience = experience; + Level = level; + PositiveEnergy = positiveEnergy; + MagicLevel = magicLevel; + RaceLevel = raceLevel; + PhoneID = phoneID; + BackgroundID = backgroundID; + CampId = campId; + NiftTotalCount = niftTotalCount; + LocationServerName = locationServerName; + DateRegistered = dateRegistered; + InstructorLevel = instructorLevel; + UsualTickets = usualTickets; + MagicTickets = magicTickets; + VisaId = visaId; + CurrentUseCount = currentUseCount; + LastNewspaperId = lastNewspaperId; + HasSnFriends = hasSnFriends; + MinsLeft = minsLeft; + TimesUsed = timesUsed; + Name = name; + } + + @Attribute(name="Name") + public String getName() { + return Name; + } + + @Attribute(name="UserId") + public int getUserId() { + return UserId; + } + + @Attribute(name="RoleFlags") + public int getRoleFlags() { + return RoleFlags; + } + + @Attribute(name="IsLimited") + public int getIsLimited() { + return IsLimited; + } + + @Attribute(name="IsOnline") + public int getIsOnline() { + return IsOnline; + } + + @Attribute(name="IsMinorSecretAgent") + public int getIsMinorSecretAgent() { + return IsMinorSecretAgent; + } + + @Attribute(name="IsHomeLocked") + public int getIsHomeLocked() { + return IsHomeLocked; + } + + @Attribute(name="IsClubLocked") + public int getIsClubLocked() { + return IsClubLocked; + } + + @Attribute(name="IsClubPresent") + public int getIsClubPresent() { + return IsClubPresent; + } + + @Attribute(name="ClubAccessType") + public int getClubAccessType() { + return ClubAccessType; + } + + @Attribute(name="IsFriend") + public int getIsFriend() { + return IsFriend; + } + + @Attribute(name="Experience") + public int getExperience() { + return Experience; + } + + @Attribute(name="Level") + public int getLevel() { + return Level; + } + + @Attribute(name="PositiveEnergy") + public int getPositiveEnergy() { + return PositiveEnergy; + } + + @Attribute(name="MagicLevel") + public int getMagicLevel() { + return MagicLevel; + } + + @Attribute(name="RaceLevel") + public int getRaceLevel() { + return RaceLevel; + } + + @Attribute(name="PhoneID") + public int getPhoneID() { + return PhoneID; + } + + @Attribute(name="BackgroundID") + public int getBackgroundID() { + return BackgroundID; + } + + @Attribute(name="CampId") + public int getCampId() { + return CampId; + } + + @Attribute(name="NiftTotalCount") + public int getNiftTotalCount() { + return NiftTotalCount; + } + + @Attribute(name="LocationServerName") + public String getLocationServerName() { + return LocationServerName; + } + + @Attribute(name="DateRegistered") + public String getDateRegistered() { + return DateRegistered; + } + + @Attribute(name="InstructorLevel") + public int getInstructorLevel() { + return InstructorLevel; + } + + @Attribute(name="UsualTickets") + public int getUsualTickets() { + return UsualTickets; + } + + @Attribute(name="MagicTickets") + public int getMagicTickets() { + return MagicTickets; + } + + @Attribute(name="VisaId") + public int getVisaId() { + return VisaId; + } + + @Attribute(name="CurrentUseCount") + public int getCurrentUseCount() { + return CurrentUseCount; + } + + @Attribute(name="LastNewspaperId") + public int getLastNewspaperId() { + return LastNewspaperId; + } + + @Attribute(name="HasSnFriends") + public int getHasSnFriends() { + return HasSnFriends; + } + + @Attribute(name="MinsLeft") + public int getMinsLeft() { + return MinsLeft; + } + + @Attribute(name="TimesUsed") + public int getTimesUsed() { + return TimesUsed; + } +} diff --git a/src/org/cl0zzzy/server/UserInitInfo.java b/src/org/cl0zzzy/server/UserInitInfo.java new file mode 100644 index 0000000..f394d10 --- /dev/null +++ b/src/org/cl0zzzy/server/UserInitInfo.java @@ -0,0 +1,48 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Element; +import org.simpleframework.xml.ElementList; +import org.simpleframework.xml.Root; +import java.util.ArrayList; + +@Root(name="response") +public class UserInitInfo implements ParsableObject { + private UserMagicAbilities magicAbilities; + private UserAccount userAccount; + private UserInfo userInfo; + private UserPhone userPhone; + private ArrayList avatar; + + @Element(name="user_magic_abilities") + public UserMagicAbilities getMagicAbilities() { + return magicAbilities; + } + + @Element(name="account") + public UserAccount getUserAccount() { + return userAccount; + } + + @Element(name="user") + public UserInfo getUserInfo() { + return userInfo; + } + + @Element(name="user_phone") + public UserPhone getUserPhone() { + return userPhone; + } + + @ElementList(inline = true, name="avatar") + public ArrayList getAvatar() { + return this.avatar; + } + + public UserInitInfo(UserMagicAbilities magicAbilities, UserAccount userAccount, UserInfo userInfo, UserPhone userPhone, ArrayList avatar) { + this.magicAbilities = magicAbilities; + this.userAccount = userAccount; + this.userInfo = userInfo; + this.userPhone = userPhone; + this.avatar = avatar; + } +} diff --git a/src/org/cl0zzzy/server/UserMagicAbilities.java b/src/org/cl0zzzy/server/UserMagicAbilities.java new file mode 100644 index 0000000..303c153 --- /dev/null +++ b/src/org/cl0zzzy/server/UserMagicAbilities.java @@ -0,0 +1,20 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.ElementList; +import org.simpleframework.xml.Root; + +import java.util.ArrayList; + +@Root(name="user_magic_abilities") +public class UserMagicAbilities { + private ArrayList ma; + + public UserMagicAbilities( ArrayList ma ) { + this.ma = ma; + } + + @ElementList(inline = true, name="ability") + public ArrayList getMagicAbilities() { + return this.ma; + } +} diff --git a/src/org/cl0zzzy/server/UserPhone.java b/src/org/cl0zzzy/server/UserPhone.java new file mode 100644 index 0000000..e8ca23e --- /dev/null +++ b/src/org/cl0zzzy/server/UserPhone.java @@ -0,0 +1,39 @@ +package org.cl0zzzy.server; + +import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Root; + +@Root(name="user_phone") +public class UserPhone { + private int BufferSize; + private int SkinMediaResourceID; + private int PhoneId; + private int Balance; + + @Attribute(name="BufferSize") + public int getBufferSize() { + return BufferSize; + } + + @Attribute(name="SkinMediaResourceID") + public int getSkinMediaResourceID() { + return SkinMediaResourceID; + } + + @Attribute(name="PhoneId") + public int getPhoneId() { + return PhoneId; + } + + @Attribute(name="Balance") + public int getBalance() { + return Balance; + } + + public UserPhone(int bufferSize, int skinMediaResourceID, int phoneId, int balance) { + BufferSize = bufferSize; + SkinMediaResourceID = skinMediaResourceID; + PhoneId = phoneId; + Balance = balance; + } +} diff --git a/src/org/cl0zzzy/sqlite/Account.java b/src/org/cl0zzzy/sqlite/Account.java new file mode 100644 index 0000000..352f04a --- /dev/null +++ b/src/org/cl0zzzy/sqlite/Account.java @@ -0,0 +1,25 @@ +package org.cl0zzzy.sqlite; + +public class Account { + private String name; + private String password; + private int id; + + public Account(int id, String name, String password) { + this.name = name; + this.password = password; + this.id = id; + } + + public String getName() { + return this.name; + } + + public String getPassword() { + return this.password; + } + + public int getId() { + return this.id; + } +} diff --git a/src/org/cl0zzzy/sqlite/DB.java b/src/org/cl0zzzy/sqlite/DB.java new file mode 100644 index 0000000..4b6d93f --- /dev/null +++ b/src/org/cl0zzzy/sqlite/DB.java @@ -0,0 +1,1075 @@ +package org.cl0zzzy.sqlite; + +import java.security.MessageDigest; +import java.sql.*; +import java.util.ArrayList; + +import org.cl0zzzy.rtmp.AMFObject; +import org.cl0zzzy.rtmp.AMFObjectArray; +import org.cl0zzzy.rtmp.Util; +import org.cl0zzzy.server.*; + +public class DB { + public static final String URL = "jdbc:sqlite:data.sqlite"; + public static Connection connection; + + public static void connect() { + try { + connection = DriverManager.getConnection(URL); + System.out.println("SQLITE daemon started"); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public static ResultSet execute( String sql ) { + try { + return connection.createStatement().executeQuery(sql); + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + + public static void executeUpdate( String sql ) { + try { + connection.createStatement().executeUpdate(sql); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public static String getSecureCode() { + try { + ResultSet rs = execute( "SELECT CODE FROM secure WHERE ID = '1'" ); + String resp = ""; + while( rs.next() ) { + resp = rs.getString("CODE"); + } + return resp; + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static void insertAccount( String username, String pwd ) { + try { + executeUpdate("INSERT INTO users(Username, Password, RoleFlags, InstructorLevel, MagicLevel, RaceLevel, PhoneID, BackgroundID, UsualTickets, MagicTickets, Experience, Level, PositiveEnergy, VisaId, CurrentUseCount, LastNewspaperId, IsClubPresent, IsMinorSecretAgent, HasSnFriends, CampId, MinsLeft, TimesUsed) VALUES ('"+username+"', '"+Util.MD5(pwd)+"', '2', '10', '10', '10', '2', '10', '100', '100', '1000', '120', '100', '1', '1', '10', '0', '1', '1', '1', '1', '1')"); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static Account getUserAccountByName( String name ) { + try { + ResultSet rs = execute( "SELECT ID, Password, RoleFlags FROM users WHERE Username = '" + name + "';" ); + Account resp = null; + while( rs.next() ) { + resp = new Account(rs.getInt("ID"), name, rs.getString("Password")); + } + return resp; + } catch( Exception e ) { + e.printStackTrace(); + } + return null; + } + + public static String getPreloaders() { + try { + ResultSet result = execute( "SELECT * FROM preloaders WHERE isSelected = 1" ); + String resp = ""; + while( result.next() ) { + resp = resp + ""; + } + return resp; + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static String getPromotions() { + try { + ResultSet result = execute( "SELECT * FROM promotions WHERE isSelected = 1" ); + String resp = ""; + while( result.next() ) { + resp = resp + ""; + } + return resp; + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static String getPromotionBanners() { + try { + ResultSet result = execute( "SELECT * FROM promotion_banners WHERE isSelected = 1" ); + String resp = ""; + while( result.next() ) { + resp = resp + ""; + } + return resp; + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static String getPlayerName( int UID ) { + try { + ResultSet result = execute( "SELECT Username FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getString("Username"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static int getPlayerRoleFlags( int UID ) { + try { + ResultSet result = execute( "SELECT RoleFlags FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("RoleFlags"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerInstructorLevel( int UID ) { + try { + ResultSet result = execute( "SELECT InstructorLevel FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("InstructorLevel"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerMagicLevel( int UID ) { + try { + ResultSet result = execute( "SELECT MagicLevel FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("MagicLevel"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerRaceLevel( int UID ) { + try { + ResultSet result = execute( "SELECT RaceLevel FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("RaceLevel"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerPhoneID( int UID ) { + try { + ResultSet result = execute( "SELECT PhoneID FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("PhoneID"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerBackgroundID( int UID ) { + try { + ResultSet result = execute( "SELECT BackgroundID FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("BackgroundID"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerUsualTickets( int UID ) { + try { + ResultSet result = execute( "SELECT UsualTickets FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("UsualTickets"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerMagicTickets( int UID ) { + try { + ResultSet result = execute( "SELECT MagicTickets FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("MagicTickets"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerExperience( int UID ) { + try { + ResultSet result = execute( "SELECT Experience FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("Experience"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerLevel( int UID ) { + try { + ResultSet result = execute( "SELECT Level FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("Level"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 1; + } + + public static int getPlayerPositiveEnergy( int UID ) { + try { + ResultSet result = execute( "SELECT PositiveEnergy FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("PositiveEnergy"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerVisaId( int UID ) { + try { + ResultSet result = execute( "SELECT VisaId FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("VisaId"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerCurrentUseCount( int UID ) { + try { + ResultSet result = execute( "SELECT CurrentUseCount FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("CurrentUseCount"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerLastNewspaperId( int UID ) { + try { + ResultSet result = execute( "SELECT LastNewspaperId FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("LastNewspaperId"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerIsClubPresent( int UID ) { + try { + ResultSet result = execute( "SELECT IsClubPresent FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("IsClubPresent"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerIsClubLocked( int UID ) { + /*try { + ResultSet result = execute( "SELECT isClubLocked FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getString("isClubLocked"); + } catch ( Exception e ) { + e.printStackTrace(); + }*/ + return 1; + } + + public static int getPlayerIsMinorSecretAgent( int UID ) { + try { + ResultSet result = execute( "SELECT IsMinorSecretAgent FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("IsMinorSecretAgent"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerHasSnFriends( int UID ) { + try { + ResultSet result = execute( "SELECT HasSnFriends FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("HasSnFriends"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static String getPlayerCampId( int UID ) { + try { + ResultSet result = execute( "SELECT CampId FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getString("CampId"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static int getPlayerMinsLeft( int UID ) { + try { + ResultSet result = execute( "SELECT MinsLeft FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("MinsLeft"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getPlayerTimesUsed( int UID ) { + try { + ResultSet result = execute( "SELECT TimesUsed FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("TimesUsed"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getRoleFlags( int UID ) { + try { + ResultSet result = execute( "SELECT RoleFlags FROM users WHERE ID = '"+UID+"'" ); + result.next(); + return result.getInt("RoleFlags"); + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static String getToken( int UID ) { + try { + ResultSet result = execute( "SELECT CODE FROM secure WHERE ID = '1'" ); + result.next(); + return md5( result.getString("CODE") + UID ); + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static String getLocationObjects( int locationId ) { + try { + ResultSet result = execute( "SELECT * FROM objects WHERE LocationId = '"+locationId+"'" ); + String objects = ""; + while( result.next() ) { + objects = objects + ""+result.getString("options")+""; + } + return objects; + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static String getGameXML( String GID ) { + try { + ResultSet result = execute( "SELECT * FROM games WHERE ID = '" + GID + "'" ); + result.next(); + return ""+result.getString("Groups")+""; + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static String getLocationXML( int locationId ) { + try { + String objects = getLocationObjects(locationId); + ResultSet result = execute( "SELECT * FROM locations WHERE ID = '"+locationId+"'" ); + result.next(); + System.out.println("!!!ASD = " + locationId); + return ""+objects+""; + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static int getLocationId( int locationId ) { + try { + ResultSet result = execute( "SELECT * FROM locations WHERE ID = '"+locationId+"'" ); + result.next(); + return result.getInt("ID"); + } catch( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static String getLocationX( int locationId ) { + try { + ResultSet result = execute( "SELECT * FROM locations WHERE ID = '"+locationId+"'" ); + result.next(); + return result.getString("x"); + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static String getDefaultLocationX() { + try { + ResultSet result = execute( "SELECT * FROM locations WHERE isDefault = '1'" ); + result.next(); + return result.getString("x"); + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static String getLocationY( int locationId ) { + try { + ResultSet result = execute( "SELECT * FROM locations WHERE ID = '"+locationId+"'" ); + result.next(); + return result.getString("y"); + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static String getDefaultLocationY() { + try { + ResultSet result = execute( "SELECT * FROM locations WHERE isDefault = '1'" ); + result.next(); + return result.getString("y"); + } catch( Exception e ) { + e.printStackTrace(); + } + return ""; + } + + public static int getDefaultLocationId() { + try { + ResultSet result = execute( "SELECT * FROM locations WHERE isDefault = '1'" ); + result.next(); + return result.getInt("ID"); + } catch( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static String getDefaultLocationXML() { + return getLocationXML( getDefaultLocationId() ); + } + + /*public static String getGoodsFromInventory( int UID, String goodTypeId ) { + try { + ResultSet result = execute( "SELECT a.GoodId, g.GoodTypeId, g.MRId, g.TRId, g.PublishDate FROM avatarinventory as a, goods as g WHERE UserId = '"+UID+"' AND g.Id = a.GoodId AND g.GoodTypeId = '"+goodTypeId+"'" ); + String str = ""; + while( result.next() ) { + str = str + ""; + } + return str; + } catch ( Exception e ) { + e.printStackTrace(); + } + return ""; + }*/ + + public static ArrayList getGoodsFromInventory( int UID, String goodTypeId ) { + try { + ResultSet result = execute( "SELECT a.GoodId, g.GoodTypeId, g.MRId, g.TRId, g.PublishDate FROM avatarinventory as a, goods as g WHERE UserId = '"+UID+"' AND g.Id = a.GoodId AND g.GoodTypeId = '"+goodTypeId+"'" ); + ArrayList items = new ArrayList(); + while( result.next() ) { + items.add(new InventoryItem(result.getInt("GoodId"), 0, 0, result.getString("PublishDate"), result.getInt("MRId"), result.getInt("TRId"), 0, 0, 0, 0, 0)); + } + return items; + } catch ( Exception e ) { + e.printStackTrace(); + } + return new ArrayList(); + } + + public static String sendPostcard( int UID, int recieverId, String cardId ) { + String pcid = ""; + try { + executeUpdate("INSERT INTO postcards (senderId, recieverId, cardId, isNew) VALUES ('"+UID+"', '"+recieverId+"', '"+cardId+"', '1')"); + ResultSet result = execute( "SELECT LAST_INSERT_ID() as ID FROM postcards" ); + result.next(); + pcid = result.getString("ID"); + } catch( Exception e ) { + e.printStackTrace(); + } + return pcid; + } + + public static void removePostcard( String MSGID ) { + try { + executeUpdate("DELETE FROM postcards WHERE ID = '"+MSGID+"'"); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static void markPostcardAsRead( String MSGID ) { + try { + executeUpdate("UPDATE postcards SET isNew='0' WHERE ID = '"+MSGID+"'"); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static void markMessageAsRead( String MSGID ) { + try { + executeUpdate("UPDATE messages SET isNew='0' WHERE ID = '"+MSGID+"'"); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static String getPostcards( int UID ) { + String xml = ""; + try { + ResultSet result = execute("SELECT postcards.ID as ID, senderId, recieverId, cardId, isNew, users.Username as Username FROM postcards, users WHERE recieverId = '"+UID+"' and senderId = users.ID"); + while( result.next() ) { + xml = xml + ""; + } + } catch( Exception e ) { + e.printStackTrace(); + } + return xml; + } + + public static String getPhoneMessages( int UID ) { + String xml = ""; + try { + ResultSet result = execute("SELECT messages.ID as ID, senderId, recieverId, text, isNew, users.Username as Username FROM messages, users WHERE recieverId = '"+UID+"' and senderId = users.ID"); + while( result.next() ) { + xml = xml + ""; + } + } catch( Exception e ) { + e.printStackTrace(); + } + return xml; + } + + public static String sendPhoneMessage( int UID, int recieverId, String message ) { + String msgId = ""; + try { + executeUpdate("INSERT INTO messages (senderId, recieverId, text, isNew) VALUES ('"+UID+"', '"+recieverId+"', '"+message+"', '1')"); + ResultSet result = execute( "SELECT LAST_INSERT_ID() as ID FROM messages" ); + result.next(); + msgId = result.getString("ID"); + } catch( Exception e ) { + e.printStackTrace(); + } + return msgId; + } + + public static ArrayList getUserDataArray( int UID ) { + try { + ArrayList ids = new ArrayList(); + ResultSet result = execute( "SELECT * FROM userdata WHERE UserId='"+UID+"'" ); + while( result.next() ) { + UData index = new UData(); + if( result.getString("IsBodyPart").equals("0") ) { + index.isBodyPart = false; + index.id = result.getString("GoodId"); + } else { + index.isBodyPart = true; + index.id = result.getString("BodyPartId"); + index.color = result.getString("Color"); + } + ids.add(index); + } + return ids; + } catch( Exception e ) { + e.printStackTrace(); + } + return new ArrayList(); + } + + public static void addFriend( int UID, int request ) { + try { + executeUpdate("UPDATE friends SET state='2' WHERE senderId = '"+request+"' AND recieverId = '"+UID+"'"); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static void removeFriend( int UID, int friend ) { + try { + executeUpdate("DELETE FROM friends WHERE ( senderId = '"+UID+"' AND recieverId = '"+friend+"' ) OR ( senderId = '"+friend+"' AND recieverId = '"+UID+"' )"); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static AMFObjectArray getUserFriendsRequests( int UID, ArrayList playersArray ) { + AMFObjectArray array = new AMFObjectArray(); + try { + ResultSet result = execute("SELECT * FROM friends WHERE recieverId = '"+UID+"' AND state = '1'"); + int pos = 1; + while( result.next() ) { + String id = ""; + if( result.getInt("recieverId") == UID ) { + id = result.getString("senderId"); + } else { + id = result.getString("recieverId"); + } + AMFObjectArray player = new AMFObjectArray(); + boolean is = false; + for( int i = 0; i < playersArray.size(); i++ ) { + if( playersArray.get(i).getId() == Integer.parseInt(id) ) { + is = true; + break; + } + } + if( is ) { + player.add("IsOnline", new AMFObject( AMFObject.AMF_STRING, "1" ) ); + } else { + player.add("IsOnline", new AMFObject( AMFObject.AMF_STRING, "0" ) ); + } + ResultSet uname = execute( "SELECT Username FROM users WHERE ID = '"+id+"'" ); + uname.next(); + player.add("UserName", new AMFObject( AMFObject.AMF_STRING, uname.getString("Username") )); + player.add("UserId", new AMFObject( AMFObject.AMF_STRING, id )); + player.add("SnName", new AMFObject( AMFObject.AMF_STRING, "" )); + array.add(String.valueOf(pos), new AMFObject( AMFObject.AMF_OBJECT_START, player )); + pos++; + } + } catch( Exception e ) { + e.printStackTrace(); + } + return array; + } + + public static AMFObjectArray getUserFriends( int UID, ArrayList playersArray ) { + AMFObjectArray array = new AMFObjectArray(); + try { + ResultSet result = execute("SELECT * FROM friends WHERE (recieverId = '"+UID+"' or senderId = '"+UID+"') AND state = '2'"); + int pos = 1; + while( result.next() ) { + int id = 0; + if( result.getInt("recieverId") == UID ) { + id = result.getInt("senderId"); + } else { + id = result.getInt("recieverId"); + } + AMFObjectArray player = new AMFObjectArray(); + boolean is = false; + for( int i = 0; i < playersArray.size(); i++ ) { + if( playersArray.get(i).getId() == id ) { + is = true; + break; + } + } + if( is ) { + player.add("IsOnline", new AMFObject( AMFObject.AMF_STRING, "1" ) ); + } else { + player.add("IsOnline", new AMFObject( AMFObject.AMF_STRING, "0" ) ); + } + ResultSet uname = execute( "SELECT Username FROM users WHERE ID = '"+id+"'" ); + uname.next(); + player.add("UserName", new AMFObject( AMFObject.AMF_STRING, uname.getString("Username") )); + player.add("UserId", new AMFObject( AMFObject.AMF_STRING, id )); + player.add("SnName", new AMFObject( AMFObject.AMF_STRING, "" )); + array.add(String.valueOf(pos), new AMFObject( AMFObject.AMF_OBJECT_START, player )); + pos++; + } + } catch( Exception e ) { + e.printStackTrace(); + } + return array; + } + + public static int getIsHomeLocked( int id ) { + try { + ResultSet rs = execute("SELECT IsLocked FROM home WHERE UserId = '"+id+"'"); + if( rs.next() ) { + return rs.getInt("IsLocked"); + } + } catch ( Exception e ) { + e.printStackTrace(); + } + return 1; + } + + public static UserAccount getUserAccount( int id ) { + try { + ResultSet rs = execute("SELECT Balance FROM users WHERE ID = '"+id+"'"); + return new UserAccount(rs.getInt("Balance"), 3253, 2221); + } catch ( Exception e ) { + e.printStackTrace(); + } + return null; + } + + public static UserPhone getUserPhone( int id ) { + try { + ResultSet rs = execute("SELECT PhoneSkin, PhoneID, Balance FROM users WHERE ID = '"+id+"'"); + int balance = rs.getInt("Balance"); + int pid = rs.getInt("PhoneID"); + return new UserPhone(999, rs.getInt("PhoneSkin"), pid, balance); + } catch ( Exception e ) { + e.printStackTrace(); + } + return null; + } + + public static UserInfo getUserInfo( int id, int isFriend ) { + try { + UserInfo ui = new UserInfo(id, + DB.getPlayerRoleFlags(id), + 0, + 1, + DB.getPlayerIsMinorSecretAgent(id), + DB.getIsHomeLocked(id), + DB.getPlayerIsClubLocked(id), + DB.getPlayerIsClubPresent(id), + 0, + isFriend, + DB.getPlayerExperience(id), + DB.getPlayerLevel(id), + 100, + DB.getPlayerMagicLevel(id), + 0, + DB.getPlayerPhoneID(id), + DB.getPlayerBackgroundID(id), + 0, + 0, + "Неофициальный сервер", + "2008-08-08T12:07:44.927", + DB.getPlayerInstructorLevel(id), + DB.getPlayerUsualTickets(id), + DB.getPlayerMagicTickets(id), + DB.getPlayerVisaId(id), + DB.getPlayerCurrentUseCount(id), + DB.getPlayerLastNewspaperId(id), + DB.getPlayerHasSnFriends(id), + DB.getPlayerMinsLeft(id), + DB.getPlayerTimesUsed(id), + DB.getPlayerName(id)); + return ui; + } catch ( Exception e ) { + e.printStackTrace(); + } + return null; + } + + public static void requestFriend( int senderId, int recieverId ) { + try { + ResultSet result = execute("SELECT * FROM friends WHERE (senderId = '"+senderId+"' AND recieverId = '"+recieverId+"') OR (senderId = '"+recieverId+"' AND recieverId = '"+senderId+"')"); + if( !result.next() ) { + result.close(); + executeUpdate("INSERT INTO friends (senderId, recieverId, state) VALUES ('"+senderId+"', '"+recieverId+"', '1')"); + } else { + if( result.getInt("senderId") == recieverId ) { + addFriend( senderId, recieverId ); + } + } + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static void clearMagicAbilities( int UID ) { + try { + executeUpdate( "DELETE FROM mainventory WHERE UserId = '"+UID+"' AND isexp = 'true' AND exp < ( datetime('now', ('-' || expdays || ' days')) )" ); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + + public static UserMagicAbilities getUserMagicAbilities( int UID ) { + ArrayList ma = new ArrayList(); + try { + ResultSet result = execute( "SELECT MagicAbilityId FROM mainventory WHERE UserId = '"+UID+"'" ); + while( result.next() ) { + ma.add(new MagicAbility(result.getInt("MagicAbilityId"), "2020-04-28T19:50:31.107", 0)); + } + } catch ( Exception e ) { + e.printStackTrace(); + } + return new UserMagicAbilities(ma); + } + + public static void addMagicAbility( int UID, String MAID, String expdays, String isexp ) { + try { + executeUpdate("INSERT INTO mainventory (UserId, MagicAbilityId, exp, expdays, isexp) VALUES ('" + UID + "', '" + MAID + "', date('now'), '" + expdays + "', '" + isexp + "')"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static String calcLayer( String bpid ) { + if( bpid.equals("56") || bpid.equals("60") || bpid.equals("64") || + bpid.equals("69") || bpid.equals("73") || bpid.equals("77") || bpid.equals("83") || bpid.equals("89") ) { + return "20"; + } else if( bpid.equals("55") || bpid.equals("62") || bpid.equals("66") || + bpid.equals("71") || bpid.equals("75") || bpid.equals("80") || bpid.equals("86") || + bpid.equals("92")) { + return "10"; + } else if( bpid.equals("78") || bpid.equals("84") || bpid.equals("90") || bpid.equals("95") || + bpid.equals("96") || bpid.equals("97") ) { + return "50"; + } else if( bpid.equals("59") || bpid.equals("61") || bpid.equals("65") || bpid.equals("70") || + bpid.equals("74") || bpid.equals("79") || bpid.equals("85") || bpid.equals("91") ) { + return "30"; + } else if( bpid.equals("58") || bpid.equals("68") || bpid.equals("82") || bpid.equals("88") || + bpid.equals("94") ) { + return "40"; + } else if( bpid.equals("57") || bpid.equals("67") || bpid.equals("81") || bpid.equals("87") || + bpid.equals("93") ) { + return "26"; + } else if( bpid.equals("63") || bpid.equals("72") || bpid.equals("76") ) { + return "41"; + } else if( bpid.equals("99") || bpid.equals("100") || bpid.equals("101") || bpid.equals("102") || + bpid.equals("103") ) { + return "55"; + } + return "0"; + } + + private static String calcTypeId( String bpid ) { + if( bpid.equals("56") || bpid.equals("60") || bpid.equals("64") || + bpid.equals("69") || bpid.equals("73") || bpid.equals("77") || bpid.equals("83") || bpid.equals("89") ) { + return "3"; + } else if( bpid.equals("55") || bpid.equals("62") || bpid.equals("66") || + bpid.equals("71") || bpid.equals("75") || bpid.equals("80") || bpid.equals("86") || + bpid.equals("92")) { + return "2"; + } else if( bpid.equals("78") || bpid.equals("84") || bpid.equals("90") || bpid.equals("95") || + bpid.equals("96") || bpid.equals("97") ) { + return "8"; + } else if( bpid.equals("59") || bpid.equals("61") || bpid.equals("65") || bpid.equals("70") || + bpid.equals("74") || bpid.equals("79") || bpid.equals("85") || bpid.equals("91") ) { + return "7"; + } else if( bpid.equals("58") || bpid.equals("68") || bpid.equals("82") || bpid.equals("88") || + bpid.equals("94") ) { + return "6"; + } else if( bpid.equals("57") || bpid.equals("67") || bpid.equals("81") || bpid.equals("87") || + bpid.equals("93") ) { + return "5"; + } else if( bpid.equals("63") || bpid.equals("72") || bpid.equals("76") ) { + return "11"; + } else if( bpid.equals("99") || bpid.equals("100") || bpid.equals("101") || bpid.equals("102") || + bpid.equals("103") ) { + return "12"; + } + return "1"; + } + + public static void insertUserdata( int UID, String id, String IsBodyPart, String BodyPartId, String Color, String GoodID ) { + try { + executeUpdate( "INSERT INTO userdata (UserId, Id, IsBodyPart, BodyPartId, Color, GoodID) VALUES ('"+UID+"', '"+id+"', '"+IsBodyPart+"', '"+BodyPartId+"', '"+Color+"', '"+GoodID+"')" ); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static void updateMoney( int UID, int usual, int magic ) { + try { + executeUpdate( "UPDATE users SET UsualTickets = '"+usual+"', MagicTickets = '"+magic+"' WHERE ID = '"+UID+"'" ); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static void clearUserdata( int UID ) { + try { + executeUpdate( "DELETE FROM userdata WHERE UserId = '"+UID+"'" ); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static AMFObjectArray getUserData( int UID ) { + try { + ResultSet result = execute( "SELECT * FROM userdata WHERE UserId = '"+UID+"'" ); + AMFObjectArray body = new AMFObjectArray(); + int i = 1; + while( result.next() ) { + AMFObjectArray item = new AMFObjectArray(); + item.add("BodyPartTypeId", new AMFObject( AMFObject.AMF_STRING, calcTypeId( result.getString("BodyPartId") ) )); + if( !result.getString("Color").equals("-1") ) { + item.add("Color", new AMFObject( AMFObject.AMF_STRING, result.getString("Color") )); + } + item.add("Id", new AMFObject( AMFObject.AMF_STRING, result.getString("Id") )); + item.add("IsBodyPart", new AMFObject( AMFObject.AMF_STRING, result.getString("IsBodyPart") )); + item.add("BodyPartId", new AMFObject( AMFObject.AMF_STRING, result.getString("BodyPartId") )); + item.add("GoodID", new AMFObject( AMFObject.AMF_STRING, result.getString("GoodID") )); + int goodId = result.getInt("GoodID"); + if( result.getString("IsBodyPart").equals("1") ) { + item.add("MediaResourceID", new AMFObject( AMFObject.AMF_STRING, result.getString("BodyPartId") )); + item.add("LayerID", new AMFObject( AMFObject.AMF_STRING, calcLayer( result.getString("BodyPartId") ) )); + } else { + item.add("MediaResourceID", new AMFObject( AMFObject.AMF_STRING, getGoodById(goodId).getMediaResourceID() )); + item.add("LayerID", new AMFObject( AMFObject.AMF_STRING, getGoodById(goodId).getLayerID() )); + item.add("GoodTypeID", new AMFObject( AMFObject.AMF_STRING, getGoodById(goodId).getGoodTypeId() )); + } + body.add(String.valueOf(i), new AMFObject( AMFObject.AMF_OBJECT_START, item )); + i++; + } + return body; + } catch( Exception e ) { + e.printStackTrace(); + } + return new AMFObjectArray(); + } + + public static int getIsUsedGood( int id, InventoryItem item ) { + try { + ResultSet result = execute("SELECT 1 AS IsUsed FROM userdata WHERE userdata.UserId = '"+id+"' AND userdata.Id = '"+item.getID()+"'"); + if( result.next() ) return 1; + } catch ( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static int getBodyPartColor( int id, InventoryItem item ) { + try { + ResultSet result = execute("SELECT Color FROM userdata WHERE userdata.UserId = '"+id+"' AND userdata.Id = '"+item.getID()+"'"); + if( result.next() ) return result.getInt("Color"); + } catch( Exception e ) { + e.printStackTrace(); + } + return 0; + } + + public static ArrayList getUserAvatar( int id ) { + try { + ResultSet result = execute( "SELECT a.Id, g.GoodTypeId, g.MRId, g.TRId, g.PublishDate, a.IsBodyPart, a.Color FROM userdata as a, goods as g WHERE a.UserId = '"+id+"' AND g.Id = a.Id" ); + ArrayList items = new ArrayList(); + while( result.next() ) { + if( result.getInt("IsBodyPart") == 0 ) { + items.add(new InventoryItem(result.getInt("Id"), 0, 0, result.getString("PublishDate"), result.getInt("MRId"), result.getInt("TRId"), 0, 0, 0, 0, 0)); + } else { + items.add(new InventoryItem(result.getInt("Id"), 0, 0, result.getString("PublishDate"), result.getInt("MRId"), result.getInt("TRId"), 0, result.getInt("Id"), 1, result.getInt("Color"), 1)); + } + } + return items; + } catch ( Exception e ) { + e.printStackTrace(); + } + return new ArrayList(); + } + + public static String getHousesFromInventory( int UID ) { + String str = ""; + try { + ResultSet rs = execute("SELECT * FROM goods WHERE `Id` IN (SELECT GoodId FROM houseinventory WHERE UserId = '"+UID+"')"); + while( rs.next() ) { + str += ""; + } + } catch( Exception e ) { + e.printStackTrace(); + } + return str; + } + + public static String getFurnitureFromInventory( int UID ) { + String str = ""; + try { + ResultSet rs = execute("SELECT * FROM `goods` WHERE `Id` IN (SELECT GoodId FROM furnitureinventory WHERE UserId = '"+UID+"')"); + while( rs.next() ) { + str += ""; + } + } catch( Exception e ) { + e.printStackTrace(); + } + return str; + } + + public static void addPlayerCloth( int UID, String goodId ) { + try { + executeUpdate("INSERT INTO avatarinventory (UserId, GoodId) VALUES ('"+UID+"', '"+goodId+"')"); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static void addPlayerFurniture( int UID, String goodId ) { + try { + executeUpdate("INSERT INTO furnitureinventory (UserId, GoodId) VALUES ('"+UID+"', '"+goodId+"')"); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static void addPlayerHome( int UID, String goodId ) { + try { + executeUpdate("INSERT INTO houseinventory (UserId, GoodId) VALUES ('"+UID+"', '"+goodId+"')"); + } catch( Exception e ) { + e.printStackTrace(); + } + } + + public static Catalog getCatalogById(String catalog ) { + try { + ResultSet result = execute( "SELECT CatalogTypeId, MediaResourceId FROM catalogs WHERE ID = '"+catalog+"'" ); + result.next(); + Catalog r = new Catalog( result.getInt("CatalogTypeId"), result.getInt("MediaResourceId"), new ArrayList() ); + result.close(); + result = execute( "SELECT * FROM catalogitems WHERE CId = '"+catalog+"'" ); + while( result.next() ) { + r.getItems().add(new CatalogItem(result.getInt("ID"), result.getInt("TId"), result.getInt("UsualTickets"), result.getInt("MagicTickets") )); + } + return r; + } catch( Exception e ) { + e.printStackTrace(); + } + return null; + } + + public static Good getGoodById(int goodId ) { + try { + ResultSet result = execute( "SELECT * FROM goods WHERE Id = '"+goodId+"'" ); + result.next(); + Good r = new Good( result.getInt("Id"), result.getInt("TRId"), result.getInt("MRId"), result.getInt("GoodTypeId"), result.getInt("RoleFlags"), result.getInt("UsualTickets"), result.getInt("MagicTickets"), result.getInt("LayerId"), result.getInt("IsActive") ); + return r; + } catch( Exception e ) { + e.printStackTrace(); + } + return null; + } + + public static String md5( String str ) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] arr = md.digest(str.getBytes("UTF-8")); + return Util.bytesToHex(arr); + } catch ( Exception e ) { + e.printStackTrace(); + } + return ""; + } +} \ No newline at end of file diff --git a/src/res/css/animate.css b/src/res/css/animate.css new file mode 100644 index 0000000..edbfb34 --- /dev/null +++ b/src/res/css/animate.css @@ -0,0 +1,3334 @@ +@charset "UTF-8"; + + +.animated { + -webkit-animation-duration: 2s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animated.flipOutX, +.animated.flipOutY, +.animated.bounceIn, +.animated.bounceOut { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes bounce { + from, 20%, 53%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +@keyframes bounce { + from, 20%, 53%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} + +@-webkit-keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +@keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +@keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +.headShake { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-name: headShake; + animation-name: headShake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes jello { + from, 11.1%, to { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +@keyframes jello { + from, 11.1%, to { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +.jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center; +} + +@-webkit-keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} + +@-webkit-keyframes bounceInDown { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInDown { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInRight { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInUp { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} + +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-duration: 3s; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} + +@-webkit-keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + to { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + to { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +@-webkit-keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + -webkit-animation-name: hinge; + animation-name: hinge; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} + +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} + +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} + +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} + +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} + +@-webkit-keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +.zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} + +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; +} + +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +.zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; +} + +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +.zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; +} + +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; +} + +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} + +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} diff --git a/src/res/css/font-awesome.css b/src/res/css/font-awesome.css new file mode 100644 index 0000000..17b5dc4 --- /dev/null +++ b/src/res/css/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 2em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/src/res/css/font-awesome.min.css b/src/res/css/font-awesome.min.css new file mode 100644 index 0000000..540440c --- /dev/null +++ b/src/res/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/src/res/css/main.css b/src/res/css/main.css new file mode 100644 index 0000000..b5d2a7b --- /dev/null +++ b/src/res/css/main.css @@ -0,0 +1,39 @@ +/* Possibly the shittiest CSS ever */ +@import url(https://fonts.googleapis.com/css?family=Duru+Sans); + +body { + font-family: 'Duru Sans', sans-serif; +} + +form { + margin-left: 1%; +} + +#title { + margin-left: 1%; + margin-top: 5px; + margin-bottom: 3px; + font-weight: 560; + font-size: 2.3em; +} + +.form-group > input { + width: 25%; +} + +.form-group > select { + width: 15%; +} + +.alert { + margin-left: 1%; + width: 35%; +} + +span { + margin-right: 1%; +} + +.g-recaptcha { + margin-top: 1%; +} \ No newline at end of file diff --git a/src/res/css/style.css b/src/res/css/style.css new file mode 100644 index 0000000..a9f485f --- /dev/null +++ b/src/res/css/style.css @@ -0,0 +1,342 @@ +* { + font-family: 'Montserrat', sans-serif; +} + +body { + width: 100%; + margin: 0px; + background-image: url(/img/background.jpg); + background-repeat: repeat-y no-repeat; + background-size: cover; + background-position: center; + background-attachment: fixed; +} + +.icons>a { + text-decoration: none; + color: darkgray; +} + +.location>a { + text-decoration: none; + color: white; +} + +.location:hover { + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2); +} + +.left { + margin-left: 5%; +} +.left>a { + margin-bottom: 5%; +} + +@media screen and (min-width: 1001px) { + .card { + margin-left: 32%; + margin-top: 2%; + padding: 0px; + background-color: white; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); + transition: 0.3s; + width: 35%; + border-radius: 5px; + } + .card:hover { + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 1); + } + img { + border: 20px solid white; + border-radius: 50%; + margin-top: 8%; + margin-bottom: -15% !important; + width: 30%; + } + .name { + text-align: center; + font-size: 2.8em; + color: gainsboro; + margin-top: 15%; + margin-bottom: auto; + text-transform: capitalize; + } + hr { + width: 93%; + height: 2px; + background-color: gainsboro; + border: 0px; + } + .subtitle { + text-align: center; + font-size: 1.5em; + color: darkgray; + } + .icons { + font-size: 18px; + text-align: center; + margin-right: 0px; + margin-left: 0px; + color: darkgray; + margin-bottom: 40px; + } + .location { + text-align: center; + color: white; + font-size: 1.5em; + display: block; + background-color: cornflowerblue; + padding: 10px; + margin-left: 7%; + margin-right: 7%; + border-radius: 8px; + } +} + +@media (min-width: 100px) and (max-width: 728px) and (orientation:portrait) { + body { + width: 100%; + margin: 0px; + background: url(/img/background.jpg) fixed no; + overflow-x: hidden; + } + hr { + width: 93%; + height: 2px; + background-color: gainsboro; + border: 0px; + } + .card { + margin-top: 10%; + margin-left: 2%; + margin-right: 0px; + background-color: white; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); + transition: 0.3s; + width: 95%; + border-radius: 5px; + } + .card:hover { + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 1); + } + img { + border: 15px solid white; + margin-bottom: -20% !important; + border-radius: 50%; + width: 33%; + } + .name { + padding-right: 4px; + padding-left: 4px; + text-align: center; + font-size: 2.5em; + color: gainsboro; + margin-top: 16%; + margin-bottom: auto; + text-transform: capitalize; + } + .subtitle { + text-align: center; + font-size: 1.2em; + color: darkgray; + } + .icons { + font-size: 11px; + text-align: center; + margin-right: 0px; + margin-left: 0px; + color: darkgray; + margin-bottom: 40px; + } + .location { + text-align: center; + color: white; + font-size: 0.8em; + display: block; + background-color: cornflowerblue; + padding: 10px; + margin-left: 7%; + margin-right: 7%; + border-radius: 8px; + } +} + +@media (min-width: 100px) and (max-width: 728px) and (orientation:landscape) { + body { + width: 100%; + margin: 0px; + background: url(/img/background.png) fixed no; + overflow-x: hidden; + } + hr { + width: 93%; + height: 2px; + background-color: gainsboro; + border: 0px; + } + .card { + margin-top: 6%; + margin-left: 9%; + margin-right: 0px; + background-color: white; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); + transition: 0.3s; + width: 80%; + border-radius: 5px; + } + .card:hover { + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 1); + } + img { + border: 15px solid white; + margin-bottom: -15% !important; + border-radius: 50%; + width: 25%; + } + .name { + padding-right: 4px; + padding-left: 4px; + text-align: center; + font-size: 2.8em; + color: gainsboro; + margin-top: 16%; + margin-bottom: auto; + text-transform: capitalize; + } + .subtitle { + text-align: center; + font-size: 1.9em; + color: darkgray; + } + .icons { + font-size: 18px; + text-align: center; + margin-right: 0px; + margin-left: 0px; + color: darkgray; + margin-bottom: 40px; + } + .location { + text-align: center; + color: white; + font-size: 1.5em; + display: block; + background-color: cornflowerblue; + padding: 10px; + margin-left: 7%; + margin-right: 7%; + border-radius: 8px; + } +} + +@media only screen and (min-width: 728px) and (max-width: 1000px) { + body { + width: 100%; + margin: 0px; + background: url(/img/background.png) fixed no; + overflow-x: hidden; + } + hr { + width: 93%; + height: 2px; + background-color: gainsboro; + border: 0px; + } + .card { + margin-top: 4%; + margin-left: 13%; + align-content: center; + background-color: white; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); + transition: 0.3s; + width: 75%; + border-radius: 5px; + } + .card:hover { + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 1); + } + img { + border: 15px solid white; + margin-bottom: -18% !important; + border-radius: 50%; + width: 30%; + } + .name { + text-align: center; + font-size: 2.5em; + color: gainsboro; + margin-top: 16%; + margin-bottom: auto; + text-transform: capitalize; + } + .subtitle { + text-align: center; + font-size: 2em; + color: darkgray; + } + .icons { + font-size: 15px; + text-align: center; + margin-right: 0px; + margin-left: 0px; + color: darkgray; + margin-bottom: 40px; + } + .location { + text-align: center; + color: white; + font-size: 1.8em; + display: block; + background-color: cornflowerblue; + padding: 10px; + margin-left: 7%; + margin-right: 7%; + border-radius: 8px; + } +} + +.fa-stack:hover { + transition: 0.9s; + transform: rotate(360deg); +} + +.fa-lg { + margin-bottom: 20px; +} + +.fa-twitter:hover { + border-radius: 50%; + color: white; + background-color: #1da1f2; +} + +.fa-facebook:hover { + border-radius: 50%; + color: white; + background-color: #3b5998; +} + +.fa-google-plus:hover { + border-radius: 50%; + color: white; + background-color: #dd4b39; +} + +.fa-github:hover { + border-radius: 50%; + color: white; + background-color: black; +} + +.fa-instagram:hover { + border-radius: 50%; + color: white; + background-color: #5851db; +} + +footer { + text-align: center; + color: white; + font-size: 1.2em +} \ No newline at end of file diff --git a/src/res/img/background.jpg b/src/res/img/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3742d505bac9176e7abfb839f7467aba3477c0e GIT binary patch literal 265524 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 z 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