This commit is contained in:
Mark Nadal
2014-09-12 19:36:30 -07:00
parent 5e2768c1c2
commit cc0e231a4d
18 changed files with 381 additions and 35 deletions

View File

@@ -1,4 +1,4 @@
gun
gun [![Build Status](https://travis-ci.org/amark/gun.svg?branch=master)](https://travis-ci.org/amark/gun)
===
Quick getting started guide.
@@ -60,5 +60,6 @@ Now fire up your browser and hit that URL - you'll see your data, plus some gun
- Authorization callbacks
- Graph manipulation
- Server to server communication
- Test more
- Bug fixes
- More via additional module hooks (schema, queries, etc.)

View File

@@ -47,7 +47,7 @@
</li>
</ul>
<script>
gun = Gun(['http://localhost:8888/gun', 'http://gunjs.herokuapp.com/gun']);
gun = Gun(['http://localhost:8888/gun']); //, 'http://gunjs.herokuapp.com/gun']);
angular.module('admin', [
]).controller('editor', function($scope){

29
gun.js
View File

@@ -125,7 +125,6 @@
var gun = this;
Gun.log("GET stack trace", gun._.events.trace + 1);
gun._.events.on(gun._.events.trace += 1).event(function(node){
Gun.log("GOT", node);
cb(Gun.obj.copy(node));
});
return this;
@@ -160,7 +159,7 @@
gun._.node = gun.__.nodes[cb.root._[own.sym.id]] || cb.root; // TODO? Maybe BUG! if val is a new node on a field, _.node should now be that! Or will that happen automatically?
if(Gun.fns.is(gun.__.opt.hook.set)){
gun.__.opt.hook.set(set.nodes, function(err, data){ // now iterate through those nodes to S3 and get a callback once all are saved
Gun.log("gun set hook callback called");
//Gun.log("gun set hook callback called");
if(err){ return cb(err) }
return cb(null);
});
@@ -198,7 +197,6 @@
if(set.err){ return context.err = set.err }
Gun.obj.map(set.nodes, function(node, id){
context.nodes[id] = node;
console.log("Gun set.now.union ----->", node);
});
});
if(context.err){ return context }
@@ -410,7 +408,7 @@
var serverState = Gun.time.is();
// add more checks?
var state = HAM(serverState, deltaStates[field], states[field], deltaValue, current[field]);
console.log("HAM:", field, deltaValue, deltaStates[field], current[field], 'the', state, (deltaStates[field] - serverState));
// console.log("HAM:", field, deltaValue, deltaStates[field], current[field], 'the', state, (deltaStates[field] - serverState));
if(state.err){
Gun.log(".!HYPOTHETICAL AMNESIA MACHINE ERR!.", state.err);
return;
@@ -623,6 +621,8 @@
Gun.log('via', url, key, data);
// alert(data + data.hello + data.from + data._);
cb(null, data);
if(!data || !data._){ return }
Page.subscribe(data._[Gun.sym.id]);
});
});
}
@@ -636,6 +636,25 @@
});
});
}
Page.query = function(params){
var s = '?'
, uri = encodeURIComponent;
Gun.obj.map(params, function(val, field){
s += uri(field) + '=' + uri(val || '') + '&';
});
return s;
}
Page.subscribe = function(id){
Page.subscribe.to = Page.subscribe.to || {};
Page.subscribe.to[id] = 1;
var query = Page.query(Page.subscribe.to) || '';
Gun.obj.map(gun.__.opt.peers, function(peer, url){
Page.ajax(url + query, null, function(data){
console.log("subscribe reply!", data);
});
});
console.log("live", query);
}
Page.ajax =
window.ajax =
function(url, data, cb, opt){
@@ -657,7 +676,7 @@
opt.headers["Content-Type"] = "application/json;charset=utf-8";
}catch(e){}
}
opt.method = (data? 'POST' : 'GET');
opt.method = opt.method || (data? 'POST' : 'GET');
// unload?
opt.close = function(){
opt.done(true);

View File

@@ -9,13 +9,12 @@
"mime": "~>1.2.11",
"aws-sdk": "~>2.0.0",
"request": "~>2.39.0"
,"express": "~>4.9.0","body-parser": "~>1.8.1"
}
, "devDependencies": {
"chance": "~>2.39.0"
}
, "scripts": {
"start": "node init.js"
"start": "node init.js",
"test": "mocha"
}
}

View File

@@ -4,13 +4,7 @@
, url = require('url')
, meta = {};
Gun.on('init').event(function(gun, opt){
gun.server = gun.server || function(req, res, next){ // where is the data? is it JSON? declare contentType=JSON from client?
/*meta.CORS(req, res);
res.emit('data', {way: 'cool'});
res.emit('data', {shish: 'kabob'});
res.emit('data', {I: 'love'});
res.end();
return;*/
gun.server = gun.server || function(req, res, next){ // this whole function needs refactoring and modularization
next = next || function(){};
if(!req || !res){ return next() }
if(!req.url){ return next() }
@@ -21,19 +15,35 @@
tmp.key = tmp.url.pathname.replace(gun.server.regex,'') || '';
if(tmp.key.toLowerCase() === '.js'){
res.writeHead(200, {'Content-Type': 'text/javascript'});
res.end(gun.server.js = gun.server.js || require('fs').readFileSync(__dirname + '/gun.js'));
res.end(gun.server.js = gun.server.js || require('fs').readFileSync(__dirname + '/gun.js')); // gun server is caching the gun library for the client
return;
}
console.log("\ngun server has requests!", req.method, req.url, req.headers, req.body);
tmp.key = tmp.key.replace(/^\//i,'') || ''; // strip the base
tmp.method = (req.method||'').toLowerCase();
if('get' === tmp.method){ // get is used as subscribe
console.log("URL?", tmp.url);
if(tmp.url && tmp.url.query){
/*
long polling! Idea: On data-flush or res.end, issue a timeout token,
that keeps the 'connection' alive even while disconnected.
Subsequent requests use the timeout token and thus continue off as before, seamlessly.
If after the timeout no follow up has been made, we assume the client has dropped / disconnected.
*/
Gun.obj.map(tmp.url.query, function(){
tmp.query = true;
// subscribe this req/res to the ids, then make POSTS publish to them and reply!
// MARK! COME BACK HERE
});
if(tmp.query){
return; // we'll wait until we get updates before we reply. Long polling (should probably be implemented as a hook itself! so websockets can replace it)
}
}
if(!tmp.key){
return meta.JSON(res, {gun: true});
}
// raw test for now, no auth:
gun.load(tmp.key, function(err, data){
console.log("gun subscribed!", err, data);
meta.CORS(req, res);
return meta.JSON(res, data || err);
})
@@ -48,7 +58,7 @@
if(context.err){
return meta.JSON(res, context.err); // need to standardize errors more
}
console.log("-------- union ---------");Gun.obj.map(gun.__.nodes, function(node){ console.log(node); });console.log("------------------------");
// console.log("-------- union ---------");Gun.obj.map(gun.__.nodes, function(node){ console.log(node); });console.log("------------------------");
/*
WARNING! TODO: BUG! Do not send OK confirmation if amnesiaQuaratine is activated! Not until after it has actually been processed!!!
*/
@@ -83,7 +93,7 @@
key = s3.prefix + s3.prekey + key;
}
s3.get(key, function(err, data, text, meta){
console.log('via s3', key, (err || data));
console.log('via s3', key, err);
if(meta && (key = meta[Gun.sym.id])){
return s3.load(key, cb, {id: true});
}
@@ -104,10 +114,10 @@
Gun.obj.map(nodes, function(node, id){
cb.count += 1;
batch[id] = (batch[id] || 0) + 1;
console.log("set listener for", next + ':' + id, batch[id], cb.count);
//console.log("set listener for", next + ':' + id, batch[id], cb.count);
s3.event.on(next + ':' + id).event(function(){
cb.count -= 1;
console.log("transaction", cb.count);
//console.log("transaction", cb.count);
if(!cb.count){
s3.event.on(ack).emit();
this.off(); // MEMORY LEAKS EVERYWHERE!!!!!!!!!!!!!!!! FIX THIS!!!!!!!!!
@@ -164,7 +174,12 @@
}, {Metadata: {'#': id}});
}
gun.init({hook: {load: s3.load, set: s3.set, key: s3.key}}, true);
opt.hook = opt.hook || {};
gun.init({hook: {
load: opt.hook.load || s3.load
,set: opt.hook.set || s3.set
,key: opt.hook.key || s3.key
}}, true);
});
meta.json = 'application/json';
meta.JSON = function(res, data){

6
test/.travis.yml Normal file
View File

@@ -0,0 +1,6 @@
language: node_js
node_js:
- 0.6
- 0.8
- 0.10
- 0.11

View File

@@ -61,6 +61,9 @@ describe('Gun', function(){
});
it('path', function(done){
console.log("fix path!");
return done(); // TODO: FIX! This is broken because of API changes, fix it!
this.timeout(9000);
var gun = require('gun')({
s3: require('./shotgun') // replace this with your own keys!

View File

@@ -2,7 +2,7 @@ var keys;
if(process.env.LIVE || (process.env.NODE_ENV === 'production')){
// Keys are provided by environment configs on the server
} else {
// Keys are hosted outside this folder, you must provide your own with environment variables.
// Keys are hosted outside this public repo folder, you must provide your own with environment variables.
if((require('fs').existsSync||require('path').existsSync)(keys = __dirname + '/../../../linux/.ssh/keys-gun.js')){
keys = require(keys);
}
@@ -11,13 +11,4 @@ if(process.env.LIVE || (process.env.NODE_ENV === 'production')){
keys = keys || {};
keys.bucket = keys.bucket || 'gunjs.herokuapp.com';
module.exports = keys || {};
/*
var Gun = require('../shots');
var gun = Gun({
peers: 'http://localhost:8888/gun'
,s3: keys
});
module.exports = gun;
*/
module.exports = keys || {};

BIN
web/deck/boi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
web/deck/graph.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

201
web/deck/index.html Normal file
View File

@@ -0,0 +1,201 @@
<html>
<head>
<title>gun</title>
<meta name="viewport" content="width=device-width, minimum-scale=0.1">
</head>
<body>
<style>
html, body {
margin: 0;
padding: 0;
font-family: 'Segoe UI', Tahoma;
font-size: 20pt;
color: #222;
}
@media (max-width: 1000px){
html, body {
font-size: 20pt;
}
}
@media (max-width: 700px) {
html, body {
font-size: 10pt;
}
}
.screen {
top: 0; left: 0;
right: 0; bottom: 0;
height: 100%;
width: 100%;
text-align: center;
-webkit-animation: fade 7s;
-moz-animation: fade 7s;
animation: fade 7s;
}
.big {
font-size: 300%;
}
.small {
font-size: 75%;
}
.break {
border: none;
border-bottom: dashed 5px gainsboro;
}
.bump {
height: 20%;
}
@-webkit-keyframes fade {
0% { opacity: 0; }
100% { opacity: 1; }
} @-moz-keyframes fade {
0% { opacity: 0; }
100% { opacity: 1; }
} @keyframes fade {
0% { opacity: 0; }
100% { opacity: 1; }
}
</style>
<div class="screen break"><div style="height: 20%"></div>
<img src="../../img/gun-logo.png" width="40%">
<div><b>raising $1m</b></div>
<div>Realtime Distributed Graph Database</div>
<br>
<div>
<i>$12k fulfilled by</i>
</div>
<div>
<i>Adam Draper, Boost;</i>
</div>
</div>
<div id="team" class="screen break"><div style="height: 12%"></div>
<div class="big">Team</div>
<div><i>Here are the people powering the<br>"Open Source Firebase", "Dropbox for Developers", or "Bitcoin for Data".</i></div>
<br>
<div>
<div>
<img src="prudential.gif" style="height: 2.5em">
<img src="ucla.png" style="height: 2.5em">
<img src="thiel.svg" style="height: 2.3em">
</div>
<b>Mark Nadal</b>
CEO, 4 years experience in Synchronization Systems.
<div class="small">
Consulting clientele include a Thiel Fellow,
prototyped Prudential Retirement's SuperBowl advert's online interactive,
startup UCLA alumni.
</div>
</div>
<br>
<div>
<div>
<img src="stackoverflow.png" style="height: 3em">
<img src="boi.png" style="height: 3em">
<img src="nodejs.png" style="height: 2.7em">
</div>
<b>AJ ONeal</b>
CIO, 8 years experience with Software and Database Architecture.
<div class="small">
Core contributor to NodeJS,
in the top 1 percentile rank of all StackOverflow users,
built a Billboard Hot 100 rap artist's Twitter feed client.
</div>
</div>
</div>
<div id="problem" class="screen break"><div style="height: 10%"></div>
<div class="big">Problem</div>
<div>Businesses struggle with "sharding" data.</div>
<div>Concurrency is infamous within software, and we solve it.</div>
<img src="jargon.png" height="50%" title="via http://tagul.com">
<div class="small">The amount of academic jargon invented for the topic is absurd.</div>
<div>"<i>There are only two hard things in Computer Science: cache invalidation and naming things.</i>" ~ Phil Karlton</div>
</div>
<div class="screen break"><div style="height: 10%"></div>
<div id="how" class="big">How</div>
<div>
<i>Speed of light</i> is the <b>scientific barrier</b> to <u>the problem</u>.
</div>
<div>
The <u>crazy idea</u> was <i>what if</i> we modeled <b>data as light</b>?
</div>
<div>
We could then exploit the quantum behavior of photons.
</div>
<div>
Such <b>algorithms always collapse</b> to <u>the same answer</u> eventually, even over <i>significant latency</i>.
</div>
<br>
<div id="why" class="big">Why</div>
<div>
<u>Instant load times</u>, because <i>everything is a cache</i> in a <b>Named Data Network</b><sup><small>1</small></sup>.
</div>
<div>
Combined with <b>graphs</b>, the <u>mathematical superset</u> of <i>SQL and NoSQL</i>,
</div>
<div>
Developers can now run Turing Complete queries on their data.
</div>
<div>
<i>Big Data</i> turns into <b>meaningful data</b><sup><small>2</small></sup>, in <u>fast and affordable</u> ways.
</div>
<div class="small">
<div class="small">
[1] Van Jacobsen,
<a href="http://www.youtube.com/watch?v=oCZMoY3q2uM">
A New Way to look at Networking</a>
- Google Tech Talk.
<br>
[2] Alan Kay,
<a href="https://www.youtube.com/watch?v=gTAghAJcO1o">
The Future Doesn't Have to Be Incremental</a>
- Tech Talk</a>.
</div>
</div>
</div>
<div class="screen break"><div style="height: 10%"></div>
<div id="how" class="big">Now</div>
<div>Market interest in javascript and graphs is exploding.</div>
<div class="small">At accelerated rates never seen before in the software world.</div>
<img src="graph.png" width="44%">
<img src="npm.png" width="37%">
<div>Gun is the union of these two niches.</div>
<div><b>The facts predict they are the buzzwords of the future.</b></div>
</div>
<div style="text-align: center; padding: 2.5em 0 4em;">
<div id="how" class="big">You?</div>
<div>
Gun is the <b style="color: gold">first</b> company in this space, but it is going to fill up fast.
</div>
<div><br>
Without any marketing, we already have <b style="color: crimson"><u>250</u>+</b> developers interested.
<div class="small">
With <b style="color: crimson"><u>1600</u></b> demo video views in less than <b style="color: crimson"><u>24</u></b> hours.
</div>
</div>
<div><br>
Our <b style="color: green"><u>value proposition</u></b> for developers,
<span class="small" style="color: darkorange">slashing operational time and costs while making things faster and easier</span>,
<br>is convincing enough that some are likely to even leave established non-javascript databases.
</div>
<div><br>
By being <b style="color: skyblue"><i>open source</i></b>, we maintain trust with developers and get their contributions back.
</div>
<div><br>
Together, this effectively <b style="color: violetred">highgrades all the talent for us</b>, away from new competitors.
<div class="small">
Leaving them fighting to compete with "free".
</div>
</div>
<div><br>
Gun becomes the <b><i>de facto</i></b>,
like <span class="small" style="color: MidnightBlue">MySQL</span>
and <span class="small" style="color: SaddleBrown">MongoDB</span> did for their hype niche,
<br>and <b style="color: limegreen">profits</b> from enterprise licenses and consulting.
</div><br>
<div><b>
An established revenue model that you, as an investor, share in. Your choice.
</b></div>
</div>
</body>
</html>

BIN
web/deck/jargon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

BIN
web/deck/nodejs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

BIN
web/deck/npm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
web/deck/prudential.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
web/deck/stackoverflow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

111
web/deck/thiel.svg Normal file
View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Isolation_Mode" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" width="549.693px" height="166.442px" viewBox="0 0 549.693 166.442" enable-background="new 0 0 549.693 166.442"
xml:space="preserve">
<g>
<g>
<path d="M156.21,79.881V0.037H69.236l17.892-0.033H0.147v79.841c0,0-4.679,23.033,38.795,56.3
c32.896,25.178,38.472,29.553,39.239,30.192c0.79-0.648,6.422-5.046,39.234-30.156C160.888,102.911,156.21,79.881,156.21,79.881z
M113.121,127.801c-29.219,21.883-34.236,25.72-34.94,26.286c0.219,0.179-0.003,0.023-0.003,0.023s-0.226,0.161,0.003-0.023
c-0.683-0.558-5.648-4.374-34.943-26.319C4.521,98.774,8.689,78.7,8.689,78.7V9.111h77.459L70.215,9.141h77.453v69.593
C147.668,78.733,151.833,98.804,113.121,127.801z"/>
<g>
<rect x="56.269" y="108.486" fill="#FFFFFF" width="45.354" height="3.808"/>
<g>
<path d="M57.109,43.013c0-6.719,2.986-10.078,9.799-10.078c6.16,0,9.239,3.827,9.239,9.985v6.533c0,2.52-0.56,6.16-1.493,8.866
L61.682,95.644h14.557v5.229h-19.97v-6.254l12.599-36.953c1.121-3.173,1.493-5.972,1.493-9.237v-5.321
c0-3.731-1.212-5.507-3.732-5.507c-2.519,0-3.731,1.775-3.731,5.507v7.746h-5.787V43.013z"/>
<path d="M82.399,42.92c0-8.489,5.412-9.985,9.612-9.985c4.198,0,9.611,1.496,9.611,9.985v48.527
c0,8.492-5.413,9.985-9.611,9.985c-4.2,0-9.612-1.493-9.612-9.985V42.92z M95.838,42.268c0-1.68,0-4.668-3.827-4.668
c-3.826,0-3.826,2.988-3.826,4.668V92.1c0,1.683,0,4.667,3.826,4.667c3.827,0,3.827-2.984,3.827-4.667V42.268z"/>
</g>
</g>
</g>
<g>
<path d="M209.396,65.962c-5.494,0-7.8-2.571-7.711-8.421l0.355-24.375c-2.04,0-4.787,0-5.673,0.09
c-0.354,0-0.443-0.977-0.266-1.064c4.342-3.014,8.065-6.736,11.788-10.902c0.089-0.089,0.709,0.177,0.709,0.443
c-0.177,1.773-0.62,6.471-0.709,8.242h4.787c3.724,0,6.56-0.088,7.71-0.442c0.71-0.179,0.266,3.989-0.708,3.9
c-0.976-0.089-2.571-0.177-5.851-0.267h-5.939l-0.354,22.337c-0.088,5.406,2.481,7.09,6.382,7.09c1.86,0,4.254-0.354,6.38-0.887
c0.089,0,0.445,0.71,0.178,0.799C216.841,64.81,211.877,65.962,209.396,65.962z"/>
<path d="M260,64.721c-3.458,0-6.116,0.089-8.598,0.442c-0.354,0.089-0.177-1.063,0-1.063c4.609-0.443,5.584-1.063,5.584-7.8
V43.004c0-7.8-1.861-11.078-6.472-11.078c-2.835,0-4.962,0.709-11.609,4.787V56.3c0,6.293,0.797,7.356,5.583,7.8
c0.176,0,0.354,1.152,0,1.063c-1.771-0.266-5.672-0.442-8.155-0.442c-3.367,0-7.533,0.089-9.925,0.442
c-0.355,0.089-0.179-1.063-0.09-1.063c6.115-0.622,6.736-0.886,6.736-7.8V13.578c0-5.85-1.063-6.913-5.673-5.407
c-0.177,0.089-0.532-0.62-0.177-0.797c3.545-1.95,8.774-4.698,11.612-7.356c0.089-0.089,0.797,0.178,0.709,0.443
c-0.445,1.684-0.62,9.484-0.533,12.764l-0.087,22.068c6.913-5.406,11.434-6.912,15.51-6.912c6.206,0,8.42,3.988,8.42,10.724V56.3
c0,6.382,0.356,7.356,6.648,7.8c0.177,0,0.265,1.152,0,1.063C267.71,64.897,262.481,64.721,260,64.721z"/>
<path d="M283.567,64.721c-3.367,0-7.268,0.089-9.75,0.442c-0.264,0.089-0.176-0.974,0-0.974c6.028-0.712,6.649-0.976,6.649-7.89
V41.32c0-5.85-1.064-6.912-5.673-5.317c-0.178,0-0.443-0.622-0.178-0.799c3.546-2.038,8.775-4.963,11.612-7.71
c0.087-0.09,0.797,0.177,0.797,0.443c-0.442,1.771-0.71,9.838-0.621,13.028V56.3c0,6.914,0.621,7.178,6.647,7.89
c0.177,0,0.267,1.062,0,0.974C290.569,64.81,286.936,64.721,283.567,64.721z M284.542,16.061c-1.95,0-3.545-1.772-3.545-3.724
c0-2.038,1.595-3.899,3.722-3.899c2.04,0,3.635,1.772,3.635,3.723C288.354,14.198,286.759,16.061,284.542,16.061z"/>
<path d="M330.096,42.119l-24.817,0.531c-0.089,0.975-0.177,2.039-0.177,3.103c0,11.966,6.736,16.752,13.206,16.752
c4.077,0,8.155-1.507,11.257-3.812c0.089-0.088,0.62,0.622,0.442,0.799c-3.102,3.635-9.04,6.471-14.624,6.471
c-9.838,0-16.573-7.27-16.573-17.551c0-10.636,9.395-20.03,18.523-20.03c8.687,0,13.03,6.469,13.03,11.61
C330.363,40.699,330.274,41.41,330.096,42.119z M315.028,30.507c-4.608,0-8.42,3.989-9.572,10.725l18.702-0.444
C324.069,36.18,320.79,30.507,315.028,30.507z"/>
<path d="M343.384,64.721c-3.368,0-7.002,0.089-9.482,0.442c-0.268,0.089-0.178-0.974,0-0.974c6.027-0.712,6.646-0.976,6.646-7.89
V13.578c0-5.85-1.063-6.913-5.672-5.407c-0.179,0.089-0.444-0.62-0.179-0.797c3.546-1.95,8.776-4.698,11.612-7.356
c0.088-0.089,0.798,0.178,0.798,0.443c-0.443,1.684-0.71,9.484-0.62,12.764V56.3c0,6.914,0.62,7.178,6.646,7.89
c0.179,0,0.267,1.062,0,0.974C350.652,64.81,346.841,64.721,343.384,64.721z"/>
<path d="M225.617,87.11c-2.216,0-5.497-3.724-9.483-3.724c-6.117,0-7.888,4.255-7.888,19.5v5.495h4.785
c3.723,0,6.206-0.089,7.267-0.354c0.533-0.177,0.533,3.279,0,3.192c-0.974-0.09-2.835-0.178-6.114-0.178h-5.938v23.662
c0,6.206,1.063,7.536,8.95,7.891c0.176,0,0.355,1.063,0,0.976c-1.86-0.267-9.04-0.443-11.521-0.443
c-3.368,0-7.445,0.088-9.927,0.443c-0.356,0.088-0.179-0.976,0-0.976c6.028-0.711,6.648-0.977,6.648-7.891v-23.662
c-2.04,0-6.294-0.089-7.179-0.089c-0.355,0.089-0.445-1.508-0.268-1.508c3.368-0.177,5.762-0.442,7.447-1.33v-3.544
c0-14.979,9.039-25.792,19.588-25.792c3.455,0,6.913,2.214,6.913,3.367C228.896,83.83,226.856,87.11,225.617,87.11z"/>
<path d="M257.519,120.525l-24.817,0.531c-0.089,0.977-0.177,2.04-0.177,3.104c0,11.964,6.734,16.75,13.205,16.75
c4.079,0,8.155-1.504,11.257-3.812c0.089-0.086,0.621,0.622,0.443,0.8c-3.104,3.635-9.041,6.47-14.625,6.47
c-9.837,0-16.575-7.27-16.575-17.55c0-10.636,9.396-20.03,18.525-20.03c8.686,0,13.031,6.47,13.031,11.609
C257.786,119.105,257.696,119.816,257.519,120.525z M242.45,108.914c-4.607,0-8.419,3.988-9.571,10.725l18.7-0.443
C251.491,114.587,248.212,108.914,242.45,108.914z"/>
<path d="M272.579,143.127c-3.37,0-7.002,0.088-9.483,0.443c-0.266,0.088-0.177-0.976,0-0.976c6.027-0.711,6.646-0.977,6.646-7.891
V91.985c0-5.851-1.063-6.914-5.672-5.408c-0.177,0.09-0.444-0.62-0.177-0.797c3.544-1.95,8.774-4.697,11.611-7.356
c0.088-0.089,0.797,0.178,0.797,0.443c-0.442,1.685-0.709,9.482-0.62,12.763v43.074c0,6.914,0.62,7.18,6.648,7.891
c0.177,0,0.265,1.063,0,0.976C279.847,143.215,276.035,143.127,272.579,143.127z"/>
<path d="M299.341,143.127c-3.369,0-7.001,0.088-9.482,0.443c-0.268,0.088-0.178-0.976,0-0.976
c6.026-0.711,6.646-0.977,6.646-7.891V91.985c0-5.851-1.063-6.914-5.674-5.408c-0.177,0.09-0.442-0.62-0.177-0.797
c3.546-1.95,8.775-4.697,11.61-7.356c0.089-0.089,0.799,0.178,0.799,0.443c-0.442,1.685-0.71,9.482-0.621,12.763v43.074
c0,6.914,0.621,7.18,6.647,7.891c0.179,0,0.267,1.063,0,0.976C306.609,143.215,302.798,143.127,299.341,143.127z"/>
<path d="M331.335,144.367c-11.081,0-18.172-8.687-18.172-18.17c0-10.016,7.269-19.41,19.146-19.41
c11.078,0,18.17,8.687,18.17,18.167C350.479,134.972,343.21,144.367,331.335,144.367z M330.358,108.735
c-7.18,0-10.813,6.56-10.813,13.918c0,12.318,5.495,19.765,13.738,19.765c7.18,0,10.726-6.561,10.726-13.915
C344.009,116.182,338.513,108.735,330.358,108.735z"/>
<path d="M405.336,116.182l-11.168,28.099c-0.177,0.44-1.064,0.44-1.241,0.087l-9.396-26.415l-10.369,26.328
c-0.179,0.44-1.064,0.44-1.241,0.087l-11.168-28.186c-2.395-6.026-4.166-7.446-8.687-7.8c-0.177,0-0.266-1.062,0.088-0.974
c1.686,0.264,6.382,0.354,8.863,0.354c3.458,0,6.472-0.09,8.953-0.354c0.266-0.088,0.089,0.974,0,0.974
c-4.698,0.532-5.583,1.597-3.103,7.8l7.711,19.499l7.978-20.474c-1.95-5.229-3.723-6.472-7.978-6.825
c-0.177,0-0.266-1.062,0.089-0.974c1.773,0.264,6.47,0.354,8.952,0.354c3.367,0,6.381-0.09,8.861-0.354
c0.268-0.088,0.18,0.974,0,0.974c-4.695,0.532-5.672,1.597-3.455,7.8l6.736,19.145l7.355-19.145
c2.395-6.026,1.685-7.268-3.102-7.8c-0.087,0-0.264-1.062,0-0.974c2.483,0.264,3.724,0.354,7.091,0.354
c2.48,0,5.052-0.09,6.825-0.354c0.267-0.088,0.178,0.974,0.089,0.974C409.147,108.735,407.462,110.599,405.336,116.182z"/>
<path d="M425.533,144.367c-3.812,0-7.532-1.063-10.189-2.572c-0.354-0.263-0.446-6.026-0.446-9.835
c0-0.269,0.887-0.177,0.976-0.091c2.128,7.891,6.56,10.902,11.169,10.902c4.432,0,6.292-2.571,6.292-6.471
c0-8.598-17.104-9.307-17.104-19.409c0-5.229,4.343-10.104,12.053-10.104c3.191,0,5.405,0.442,7.532,1.506
c0.445,0.266,0.891,5.229,0.891,8.865c0,0.177-0.978,0.177-0.978,0.088c-1.594-5.317-5.496-8.953-9.306-8.953
c-3.278,0-5.053,2.306-5.053,5.849c0,8.246,16.842,8.155,16.842,18.882C438.211,139.049,433.156,144.367,425.533,144.367z"/>
<path d="M475.96,143.127c-3.456,0-6.114,0.088-8.595,0.443c-0.356,0.088-0.177-1.063,0-1.063c4.606-0.443,5.583-1.066,5.583-7.803
v-13.293c0-7.801-1.862-11.079-6.472-11.079c-2.837,0-4.963,0.71-11.608,4.786v19.586c0,6.294,0.794,7.359,5.583,7.803
c0.177,0,0.354,1.151,0,1.063c-1.771-0.267-5.675-0.443-8.154-0.443c-3.37,0-7.533,0.088-9.927,0.443
c-0.355,0.088-0.178-1.063-0.089-1.063c6.114-0.623,6.735-0.889,6.735-7.803V91.985c0-5.851-1.063-6.914-5.673-5.408
c-0.179,0.09-0.531-0.62-0.179-0.797c3.548-1.95,8.776-4.697,11.611-7.356c0.092-0.089,0.8,0.178,0.712,0.443
c-0.443,1.685-0.62,9.482-0.535,12.763l-0.085,22.069c6.913-5.406,11.432-6.912,15.509-6.912c6.206,0,8.421,3.988,8.421,10.725
v17.192c0,6.383,0.356,7.359,6.646,7.803c0.18,0,0.267,1.151,0,1.063C483.672,143.304,478.443,143.127,475.96,143.127z"/>
<path d="M497.758,143.127c-3.367,0-7.269,0.088-9.749,0.443c-0.27,0.088-0.178-0.976,0-0.976c6.028-0.711,6.646-0.977,6.646-7.891
v-14.976c0-5.852-1.062-6.915-5.669-5.319c-0.18,0-0.445-0.621-0.18-0.799c3.546-2.037,8.775-4.963,11.612-7.71
c0.088-0.089,0.797,0.177,0.797,0.443c-0.442,1.771-0.709,9.838-0.62,13.028v15.332c0,6.914,0.62,7.18,6.646,7.891
c0.18,0,0.266,1.063,0,0.976C504.758,143.215,501.126,143.127,497.758,143.127z M498.734,94.467c-1.951,0-3.546-1.772-3.546-3.724
c0-2.038,1.595-3.898,3.724-3.898c2.04,0,3.634,1.771,3.634,3.722C502.546,92.604,500.952,94.467,498.734,94.467z"/>
<path d="M527.979,144.367c-1.95,0-3.901-0.177-5.938-0.797v13.648c0,6.735,0.887,7.27,9.04,7.532c0.178,0,0.354,1.066,0,1.066
c-2.482-0.178-9.132-0.178-11.611-0.089c-3.457,0.089-6.561,0.266-9.041,0.708c-0.266,0.092-0.177-0.975,0-0.975
c5.584-0.797,5.672-1.242,5.672-8.065v-16.31c-0.886-0.443-1.86-1.063-2.923-1.681l2.923-4.522v-15.067
c0-5.85-1.063-7.003-5.672-5.407c-0.088,0-0.531-0.621-0.177-0.799c3.546-2.037,7.889-5.229,10.726-7.888
c0.087-0.089,0.709,0.266,0.709,0.532c0.263,1.507,0.178,4.875,0.263,6.913c4.435-3.812,9.044-5.584,12.676-5.584
c8.601,0,15.069,7.534,15.069,16.396C549.693,133.644,540.298,144.367,527.979,144.367z M530.903,111.751
c-3.014,0-5.761,0.974-8.863,2.836v23.399c3.721,2.129,7.798,3.101,11.078,3.101c6.026,0,10.106-5.672,10.106-15.155
C543.225,116.537,537.106,111.751,530.903,111.751z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

BIN
web/deck/ucla.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB