commit 6b229eae18c28adc2950b58fccd232a2e04c869c Author: alterdekim Date: Sat Dec 21 19:55:31 2024 +0300 Initial 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 0000000..f3742d5 Binary files /dev/null and b/src/res/img/background.jpg differ diff --git a/src/res/img/module_table_bottom.png b/src/res/img/module_table_bottom.png new file mode 100644 index 0000000..536f757 Binary files /dev/null and b/src/res/img/module_table_bottom.png differ diff --git a/src/res/img/module_table_top.png b/src/res/img/module_table_top.png new file mode 100644 index 0000000..5174a22 Binary files /dev/null and b/src/res/img/module_table_top.png differ diff --git a/src/res/img/snow_background.png b/src/res/img/snow_background.png new file mode 100644 index 0000000..f3742d5 Binary files /dev/null and b/src/res/img/snow_background.png differ diff --git a/src/res/items.html b/src/res/items.html new file mode 100644 index 0000000..235e897 --- /dev/null +++ b/src/res/items.html @@ -0,0 +1,36 @@ + + + + + + + + +

HTML Table

+ + + + + + + TEXT_BODY +
IDName
+ + + \ No newline at end of file diff --git a/src/res/log.html b/src/res/log.html new file mode 100644 index 0000000..0c302aa --- /dev/null +++ b/src/res/log.html @@ -0,0 +1,400 @@ + + + + Войти | Unofficial + + + + + + + + + +
+
+
+
+

Войти

+
+
+ + +
+ + +
+
+ + +
+
+ + + + Регистрация + + +

+
+ +
+
+

+
+ + + + + \ No newline at end of file diff --git a/src/res/main.html b/src/res/main.html new file mode 100644 index 0000000..782278f --- /dev/null +++ b/src/res/main.html @@ -0,0 +1,8 @@ + + + Игра | Unofficial + + + + + \ No newline at end of file diff --git a/src/res/reg.html b/src/res/reg.html new file mode 100644 index 0000000..d97f3ef --- /dev/null +++ b/src/res/reg.html @@ -0,0 +1,398 @@ + + + + Войти | Unofficial + + + + + + + + + +
+
+
+
+

Регистрация

+
+
+ + +
+ + +
+
+ + +
+
+ + + + +

+
+ +
+
+

+
+ + + + + \ No newline at end of file