http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/fixtures/couch_sample.json
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/fixtures/couch_sample.json 
b/node_modules/JSONStream/test/fixtures/couch_sample.json
new file mode 100644
index 0000000..b154c86
--- /dev/null
+++ b/node_modules/JSONStream/test/fixtures/couch_sample.json
@@ -0,0 +1,18 @@
+{"total_rows":129,"offset":0,"rows":[
+  { "id":"change1_0.6995461115147918"
+  , "key":"change1_0.6995461115147918"
+  , "value":{"rev":"1-e240bae28c7bb3667f02760f6398d508"}
+  , "doc":{
+      "_id":  "change1_0.6995461115147918"
+    , "_rev": "1-e240bae28c7bb3667f02760f6398d508","hello":1}
+  },
+  { "id":"change2_0.6995461115147918"
+  , "key":"change2_0.6995461115147918"
+  , "value":{"rev":"1-13677d36b98c0c075145bb8975105153"}
+  , "doc":{
+      "_id":"change2_0.6995461115147918"
+    , "_rev":"1-13677d36b98c0c075145bb8975105153"
+    , "hello":2
+    }
+  },
+]}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/fixtures/depth.json
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/fixtures/depth.json 
b/node_modules/JSONStream/test/fixtures/depth.json
new file mode 100644
index 0000000..868062f
--- /dev/null
+++ b/node_modules/JSONStream/test/fixtures/depth.json
@@ -0,0 +1,15 @@
+{
+  "total": 5,
+  "docs": [
+    {
+      "key": {
+        "value": 0,
+        "some": "property"
+      }
+    },
+    {"value": 1},
+    {"value": 2},
+    {"blbl": [{}, {"a":0, "b":1, "value":3}, 10]},
+    {"value": 4}
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/fixtures/error.json
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/fixtures/error.json 
b/node_modules/JSONStream/test/fixtures/error.json
new file mode 100644
index 0000000..9736f3e
--- /dev/null
+++ b/node_modules/JSONStream/test/fixtures/error.json
@@ -0,0 +1 @@
+{"error": "error_code", "message": "this is an error message"}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/fixtures/header_footer.json
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/fixtures/header_footer.json 
b/node_modules/JSONStream/test/fixtures/header_footer.json
new file mode 100644
index 0000000..6e4694d
--- /dev/null
+++ b/node_modules/JSONStream/test/fixtures/header_footer.json
@@ -0,0 +1,19 @@
+{"total_rows":129,"offset":0,"rows":[
+  { "id":"change1_0.6995461115147918"
+  , "key":"change1_0.6995461115147918"
+  , "value":{"rev":"1-e240bae28c7bb3667f02760f6398d508"}
+  , "doc":{
+      "_id":  "change1_0.6995461115147918"
+    , "_rev": "1-e240bae28c7bb3667f02760f6398d508","hello":1}
+  },
+  { "id":"change2_0.6995461115147918"
+  , "key":"change2_0.6995461115147918"
+  , "value":{"rev":"1-13677d36b98c0c075145bb8975105153"}
+  , "doc":{
+      "_id":"change2_0.6995461115147918"
+    , "_rev":"1-13677d36b98c0c075145bb8975105153"
+    , "hello":2
+    }
+  }
+],
+"foo": {"bar": "baz"}}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/fn.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/fn.js 
b/node_modules/JSONStream/test/fn.js
new file mode 100644
index 0000000..4acc672
--- /dev/null
+++ b/node_modules/JSONStream/test/fn.js
@@ -0,0 +1,39 @@
+
+
+var fs = require ('fs')
+  , join = require('path').join
+  , file = join(__dirname, 'fixtures','all_npm.json')
+  , JSONStream = require('../')
+  , it = require('it-is')
+
+function fn (s) {
+  return !isNaN(parseInt(s, 10))
+}
+
+var expected = JSON.parse(fs.readFileSync(file))
+  , parser = JSONStream.parse(['rows', fn])
+  , called = 0
+  , ended = false
+  , parsed = []
+
+fs.createReadStream(file).pipe(parser)
+  
+parser.on('data', function (data) {
+  called ++
+  it.has({
+    id: it.typeof('string'),
+    value: {rev: it.typeof('string')},
+    key:it.typeof('string')
+  })
+  parsed.push(data)
+})
+
+parser.on('end', function () {
+  ended = true
+})
+
+process.on('exit', function () {
+  it(called).equal(expected.rows.length)
+  it(parsed).deepEqual(expected.rows)
+  console.error('PASSED')
+})

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/gen.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/gen.js 
b/node_modules/JSONStream/test/gen.js
new file mode 100644
index 0000000..c233722
--- /dev/null
+++ b/node_modules/JSONStream/test/gen.js
@@ -0,0 +1,135 @@
+return // dont run this test for now since tape is weird and broken on 0.10
+
+var fs = require('fs')
+var JSONStream = require('../')
+var file = process.argv[2] || '/tmp/JSONStream-test-large.json'
+var size = Number(process.argv[3] || 100000)
+var tape = require('tape')
+// if (process.title !== 'browser') {
+  tape('out of mem', function (t) {
+    t.plan(1)
+    //////////////////////////////////////////////////////
+    // Produces a random number between arg1 and arg2
+    //////////////////////////////////////////////////////
+    var randomNumber = function (min, max) {
+      var number = Math.floor(Math.random() * (max - min + 1) + min);
+      return number;
+    };
+
+    //////////////////////////////////////////////////////
+    // Produces a random string of a length between arg1 and arg2
+    //////////////////////////////////////////////////////
+    var randomString = function (min, max) {
+
+      // add several spaces to increase chanses of creating 'words'
+      var chars = '      
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+      var result = '';
+
+      var randomLength = randomNumber(min, max);
+
+      for (var i = randomLength; i > 0; --i) {
+        result += chars[Math.round(Math.random() * (chars.length - 1))];
+      }
+      return result;
+    };
+
+    //////////////////////////////////////////////////////
+    // Produces a random JSON document, as a string
+    //////////////////////////////////////////////////////
+    var randomJsonDoc = function () {
+
+      var doc = {
+        "CrashOccurenceID": randomNumber(10000, 50000),
+        "CrashID": randomNumber(1000, 10000),
+        "SiteName": randomString(10, 25),
+        "MachineName": randomString(10, 25),
+        "Date": randomString(26, 26),
+        "ProcessDuration": randomString(18, 18),
+        "ThreadIdentityName": null,
+        "WindowsIdentityName": randomString(15, 40),
+        "OperatingSystemName": randomString(35, 65),
+        "DetailedExceptionInformation": randomString(100, 800)
+      };
+
+      doc = JSON.stringify(doc);
+      doc = doc.replace(/\,/g, ',\n'); // add new lines after each attribute
+      return doc;
+    };
+
+    //////////////////////////////////////////////////////
+    // generates test data
+    //////////////////////////////////////////////////////
+    var generateTestData = function (cb) {
+
+      console.log('generating large data file...');
+
+      var stream = fs.createWriteStream(file, {
+        encoding: 'utf8'
+      });
+
+      var i = 0;
+      var max = size;
+      var writing = false
+      var split = ',\n';
+      var doc = randomJsonDoc();
+      stream.write('[');
+
+      function write () {
+        if(writing) return
+        writing = true
+        while(++i < max) {
+          if(Math.random() < 0.001)
+            console.log('generate..', i + ' / ' + size)
+          if(!stream.write(doc + split)) {
+            writing = false
+            return stream.once('drain', write)
+          }
+        }
+        stream.write(doc + ']')
+        stream.end();
+        console.log('END')
+      }
+      write()
+      stream.on('close', cb)
+    };
+
+    //////////////////////////////////////////////////////
+    // Shows that parsing 100000 instances using JSONStream fails
+    //
+    // After several seconds, you will get this crash
+    //     FATAL ERROR: JS Allocation failed - process out of memory
+    //////////////////////////////////////////////////////
+    var testJSONStreamParse_causesOutOfMem = function (done) {
+      var items = 0
+      console.log('parsing data files using JSONStream...');
+
+      var parser = JSONStream.parse([true]);
+      var stream = fs.createReadStream(file);
+      stream.pipe(parser);
+
+      parser.on('data', function (data) {
+        items++
+        if(Math.random() < 0.01) console.log(items, '...')
+      });
+      
+      parser.on('end', function () {
+        t.equal(items, size)
+      });
+
+    };
+
+    //////////////////////////////////////////////////////
+    // main
+    //////////////////////////////////////////////////////
+
+    fs.stat(file, function (err, stat) {
+      console.log(stat)
+      if(err)
+        generateTestData(testJSONStreamParse_causesOutOfMem);
+      else 
+        testJSONStreamParse_causesOutOfMem()
+    })
+
+  })
+  
+// }

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/header_footer.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/header_footer.js 
b/node_modules/JSONStream/test/header_footer.js
new file mode 100644
index 0000000..f18fc59
--- /dev/null
+++ b/node_modules/JSONStream/test/header_footer.js
@@ -0,0 +1,55 @@
+
+
+var fs = require ('fs')
+  , join = require('path').join
+  , file = join(__dirname, 'fixtures','header_footer.json')
+  , JSONStream = require('../')
+  , it = require('it-is')
+
+var expected = JSON.parse(fs.readFileSync(file))
+  , parser = JSONStream.parse(['rows', /\d+/ /*, 'value'*/])
+  , called = 0
+  , headerCalled = 0
+  , footerCalled = 0
+  , ended = false
+  , parsed = []
+
+fs.createReadStream(file).pipe(parser)
+
+parser.on('header', function (data) {
+  headerCalled ++
+  it(data).deepEqual({
+    total_rows: 129,
+    offset: 0
+  })
+})
+
+parser.on('footer', function (data) {
+  footerCalled ++
+  it(data).deepEqual({
+    foo: { bar: 'baz' }
+  })
+})
+
+parser.on('data', function (data) {
+  called ++
+  it.has({
+    id: it.typeof('string'),
+    value: {rev: it.typeof('string')},
+    key:it.typeof('string')
+  })
+  it(headerCalled).equal(1)
+  parsed.push(data)
+})
+
+parser.on('end', function () {
+  ended = true
+})
+
+process.on('exit', function () {
+  it(called).equal(expected.rows.length)
+  it(headerCalled).equal(1)
+  it(footerCalled).equal(1)
+  it(parsed).deepEqual(expected.rows)
+  console.error('PASSED')
+})

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/issues.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/issues.js 
b/node_modules/JSONStream/test/issues.js
new file mode 100644
index 0000000..ea4c743
--- /dev/null
+++ b/node_modules/JSONStream/test/issues.js
@@ -0,0 +1,34 @@
+var JSONStream = require('../');
+var test = require('tape')
+
+test('#66', function (t) {
+   var error = 0;
+   var stream = JSONStream
+    .parse()
+    .on('error', function (err) {
+        t.ok(err);
+        error++;
+    })
+    .on('end', function () {
+        t.ok(error === 1);
+        t.end();
+    });
+
+    stream.write('["foo":bar[');
+    stream.end();
+
+});
+
+test('#81 - failure to parse nested objects', function (t) {
+  var stream = JSONStream
+    .parse('.bar.foo')
+    .on('error', function (err) {
+      t.error(err);
+    })
+    .on('end', function () {
+      t.end();
+    });
+
+  stream.write('{"bar":{"foo":"baz"}}');
+  stream.end();
+});

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/keys.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/keys.js 
b/node_modules/JSONStream/test/keys.js
new file mode 100644
index 0000000..747723d
--- /dev/null
+++ b/node_modules/JSONStream/test/keys.js
@@ -0,0 +1,105 @@
+var test = require('tape');
+var fs = require ('fs');
+var join = require('path').join;
+var couch_sample_file = join(__dirname, 'fixtures','couch_sample.json');
+var JSONStream = require('../');
+
+var fixture = {
+  obj: {
+    one: 1,
+    two: 2,
+    three: 3
+  }
+};
+
+function assertFixtureKeys(stream, t) {
+    var keys = [];
+    var values = [];
+    stream.on('data', function(data) {
+        keys.push(data.key);
+        values.push(data.value);
+    });
+
+    stream.on('end', function() {
+        t.deepEqual(keys, ['one', 'two', 'three']);
+        t.deepEqual(values, [1,2,3]);
+        t.end();
+    });
+    stream.write(JSON.stringify(fixture));
+    stream.end();
+}
+
+test('keys via string', function(t) {
+    var stream = JSONStream.parse('obj.$*');
+    assertFixtureKeys(stream, t);
+});
+
+test('keys via array', function(t) {
+    var stream = JSONStream.parse(['obj',{emitKey: true}]);
+    assertFixtureKeys(stream, t);
+});
+
+test('path via array', function(t) {
+    var stream = JSONStream.parse(['obj',{emitPath: true}]);
+    
+    var paths = [];
+    var values = [];
+    stream.on('data', function(data) {
+        console.log(JSON.stringify(data));
+        paths.push(data.path);
+        values.push(data.value);
+    });
+
+    stream.on('end', function() {
+        t.deepEqual(paths, [['obj', 'one'], ['obj', 'two'], ['obj', 'three']]);
+        t.deepEqual(values, [1,2,3]);
+        t.end();
+    });
+    stream.write(JSON.stringify(fixture));
+    stream.end();
+});
+
+test('advanced keys', function(t) {
+    var advanced = fs.readFileSync(couch_sample_file);
+    var stream = JSONStream.parse(['rows', true, 'doc', {emitKey: true}]);
+
+    var keys = [];
+    var values = [];
+    stream.on('data', function(data) {
+        keys.push(data.key);
+        values.push(data.value);
+    });
+
+    stream.on('end', function() {
+        t.deepEqual(keys, [
+            '_id', '_rev', 'hello',
+            '_id', '_rev', 'hello'
+        ]);
+        t.deepEqual(values, [
+            "change1_0.6995461115147918", 
"1-e240bae28c7bb3667f02760f6398d508", 1,
+            "change2_0.6995461115147918", 
"1-13677d36b98c0c075145bb8975105153", 2
+        ]);
+        t.end();
+    });
+    stream.write(advanced);
+    stream.end();
+});
+
+test('parent keys', function(t) {
+    var stream = JSONStream.parse('$*');
+    var d = null;
+    stream.on('data', function(data) {
+        if(d) t.fail('should only be called once');
+        d = data;
+    });
+
+    stream.on('end', function() {
+        t.deepEqual(d,{
+            key: 'obj',
+            value: fixture.obj
+        });
+        t.end();
+    });
+    stream.write(JSON.stringify(fixture));
+    stream.end();
+})

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/map.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/map.js 
b/node_modules/JSONStream/test/map.js
new file mode 100644
index 0000000..29b9d89
--- /dev/null
+++ b/node_modules/JSONStream/test/map.js
@@ -0,0 +1,40 @@
+
+var test = require('tape')
+
+var JSONStream = require('../')
+
+test('map function', function (t) {
+
+  var actual = []
+
+  stream = JSONStream.parse([true], function (e) { return e*10 })
+    stream.on('data', function (v) { actual.push(v)})
+    stream.on('end', function () {
+      t.deepEqual(actual, [10,20,30,40,50,60])
+      t.end()
+
+    })
+
+  stream.write(JSON.stringify([1,2,3,4,5,6], null, 2))
+  stream.end()
+
+})
+
+test('filter function', function (t) {
+
+  var actual = []
+
+  stream = JSONStream
+    .parse([true], function (e) { return e%2 ? e : null})
+    .on('data', function (v) { actual.push(v)})
+    .on('end', function () {
+      t.deepEqual(actual, [1,3,5])
+      t.end()
+
+    })
+
+  stream.write(JSON.stringify([1,2,3,4,5,6], null, 2))
+  stream.end()
+
+})
+

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/multiple_objects.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/multiple_objects.js 
b/node_modules/JSONStream/test/multiple_objects.js
new file mode 100644
index 0000000..22f6324
--- /dev/null
+++ b/node_modules/JSONStream/test/multiple_objects.js
@@ -0,0 +1,36 @@
+var fs = require ('fs');
+var net = require('net');
+var join = require('path').join;
+var file = join(__dirname, 'fixtures','all_npm.json');
+var it = require('it-is');
+var JSONStream = require('../');
+
+var str = fs.readFileSync(file);
+
+var datas = {}
+
+var server = net.createServer(function(client) {
+    var data_calls = 0;
+    var parser = JSONStream.parse(['rows', true, 'key']);
+    parser.on('data', function(data) {
+        ++ data_calls;
+        datas[data] = (datas[data] || 0) + 1
+        it(data).typeof('string')
+    });
+
+    parser.on('end', function() {
+        console.log('END')
+        var min = Infinity
+        for (var d in datas)
+          min = min > datas[d] ? datas[d] : min
+        it(min).equal(3);
+        server.close();
+    });
+    client.pipe(parser);
+});
+server.listen(9999);
+
+var client = net.connect({ port : 9999 }, function() {
+    var msgs = str + ' ' + str + '\n\n' + str
+    client.end(msgs);
+});

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/multiple_objects_error.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/multiple_objects_error.js 
b/node_modules/JSONStream/test/multiple_objects_error.js
new file mode 100644
index 0000000..83d113b
--- /dev/null
+++ b/node_modules/JSONStream/test/multiple_objects_error.js
@@ -0,0 +1,29 @@
+var fs = require ('fs');
+var net = require('net');
+var join = require('path').join;
+var file = join(__dirname, 'fixtures','all_npm.json');
+var it = require('it-is');
+var JSONStream = require('../');
+
+var str = fs.readFileSync(file);
+
+var server = net.createServer(function(client) {
+    var data_calls = 0;
+    var parser = JSONStream.parse();
+    parser.on('error', function(err) {
+        console.log(err);
+        server.close();
+    });
+
+    parser.on('end', function() {
+        console.log('END');
+        server.close();
+    });
+    client.pipe(parser);
+});
+server.listen(9999);
+
+var client = net.connect({ port : 9999 }, function() {
+    var msgs = str + '}';
+    client.end(msgs);
+});

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/null.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/null.js 
b/node_modules/JSONStream/test/null.js
new file mode 100644
index 0000000..95dd60c
--- /dev/null
+++ b/node_modules/JSONStream/test/null.js
@@ -0,0 +1,28 @@
+var JSONStream = require('../')
+
+var data = [
+  {ID: 1, optional: null},
+  {ID: 2, optional: null},
+  {ID: 3, optional: 20},
+  {ID: 4, optional: null},
+  {ID: 5, optional: 'hello'},
+  {ID: 6, optional: null}
+]
+
+
+var test = require('tape')
+
+test ('null properties', function (t) {
+  var actual = []
+  var stream = 
+
+  JSONStream.parse('*.optional')
+    .on('data', function (v) { actual.push(v) })
+    .on('end', function () {
+      t.deepEqual(actual, [20, 'hello'])
+      t.end()
+    })
+
+  stream.write(JSON.stringify(data, null, 2))
+  stream.end()
+})

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/parsejson.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/parsejson.js 
b/node_modules/JSONStream/test/parsejson.js
new file mode 100644
index 0000000..a943334
--- /dev/null
+++ b/node_modules/JSONStream/test/parsejson.js
@@ -0,0 +1,25 @@
+
+
+/*
+ sometimes jsonparse changes numbers slightly.
+*/
+
+var r = Math.random()
+  , Parser = require('jsonparse')
+  , p = new Parser()
+  , assert = require('assert')  
+  , times = 20
+while (times --) {
+
+  assert.equal(JSON.parse(JSON.stringify(r)), r, 'core JSON')
+
+  p.onValue = function (v) {
+    console.error('parsed', v)
+    assert.equal(v,r)
+  }
+  console.error('correct', r)
+  p.write (new Buffer(JSON.stringify([r])))
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/stringify.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/stringify.js 
b/node_modules/JSONStream/test/stringify.js
new file mode 100644
index 0000000..b6de85e
--- /dev/null
+++ b/node_modules/JSONStream/test/stringify.js
@@ -0,0 +1,41 @@
+
+var fs = require ('fs')
+  , join = require('path').join
+  , file = join(__dirname, 'fixtures','all_npm.json')
+  , JSONStream = require('../')
+  , it = require('it-is').style('colour')
+
+  function randomObj () {
+    return (
+      Math.random () < 0.4
+      ? {hello: 'eonuhckmqjk',
+          whatever: 236515,
+          lies: true,
+          nothing: [null],
+          stuff: [Math.random(),Math.random(),Math.random()]
+        } 
+      : ['AOREC', 'reoubaor', {ouec: 62642}, [[[], {}, 53]]]
+    )
+  }
+
+var expected =  []
+  , stringify = JSONStream.stringify()
+  , es = require('event-stream')
+  , stringified = ''
+  , called = 0
+  , count = 10
+  , ended = false
+  
+while (count --)
+  expected.push(randomObj())
+
+  es.connect(
+    es.readArray(expected),
+    stringify,
+    //JSONStream.parse([/./]),
+    es.writeArray(function (err, lines) {
+      
+      it(JSON.parse(lines.join(''))).deepEqual(expected)
+      console.error('PASSED')
+    })
+  )

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/stringify_object.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/stringify_object.js 
b/node_modules/JSONStream/test/stringify_object.js
new file mode 100644
index 0000000..9490115
--- /dev/null
+++ b/node_modules/JSONStream/test/stringify_object.js
@@ -0,0 +1,47 @@
+
+var fs = require ('fs')
+  , join = require('path').join
+  , file = join(__dirname, 'fixtures','all_npm.json')
+  , JSONStream = require('../')
+  , it = require('it-is').style('colour')
+  , es = require('event-stream')
+  , pending = 10
+  , passed = true
+
+  function randomObj () {
+    return (
+      Math.random () < 0.4
+      ? {hello: 'eonuhckmqjk',
+          whatever: 236515,
+          lies: true,
+          nothing: [null],
+          stuff: [Math.random(),Math.random(),Math.random()]
+        } 
+      : ['AOREC', 'reoubaor', {ouec: 62642}, [[[], {}, 53]]]
+    )
+  }
+
+for (var ix = 0; ix < pending; ix++) (function (count) {
+  var expected =  {}
+    , stringify = JSONStream.stringifyObject()
+    
+  es.connect(
+    stringify,
+    es.writeArray(function (err, lines) {
+      it(JSON.parse(lines.join(''))).deepEqual(expected)
+      if (--pending === 0) {
+        console.error('PASSED')
+      }
+    })
+  )
+
+  while (count --) {
+    var key = Math.random().toString(16).slice(2)
+    expected[key] = randomObj()
+    stringify.write([ key, expected[key] ])
+  }
+
+  process.nextTick(function () {
+    stringify.end()
+  })
+})(ix)

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/test.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/test.js 
b/node_modules/JSONStream/test/test.js
new file mode 100644
index 0000000..8ea7c2e
--- /dev/null
+++ b/node_modules/JSONStream/test/test.js
@@ -0,0 +1,35 @@
+
+
+var fs = require ('fs')
+  , join = require('path').join
+  , file = join(__dirname, 'fixtures','all_npm.json')
+  , JSONStream = require('../')
+  , it = require('it-is')
+
+var expected = JSON.parse(fs.readFileSync(file))
+  , parser = JSONStream.parse(['rows', /\d+/ /*, 'value'*/])
+  , called = 0
+  , ended = false
+  , parsed = []
+
+fs.createReadStream(file).pipe(parser)
+  
+parser.on('data', function (data) {
+  called ++
+  it.has({
+    id: it.typeof('string'),
+    value: {rev: it.typeof('string')},
+    key:it.typeof('string')
+  })
+  parsed.push(data)
+})
+
+parser.on('end', function () {
+  ended = true
+})
+
+process.on('exit', function () {
+  it(called).equal(expected.rows.length)
+  it(parsed).deepEqual(expected.rows)
+  console.error('PASSED')
+})

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/test2.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/test2.js 
b/node_modules/JSONStream/test/test2.js
new file mode 100644
index 0000000..d09df7b
--- /dev/null
+++ b/node_modules/JSONStream/test/test2.js
@@ -0,0 +1,29 @@
+
+
+var fs = require ('fs')
+  , join = require('path').join
+  , file = join(__dirname, '..','package.json')
+  , JSONStream = require('../')
+  , it = require('it-is')
+
+var expected = JSON.parse(fs.readFileSync(file))
+  , parser = JSONStream.parse([])
+  , called = 0
+  , ended = false
+  , parsed = []
+
+fs.createReadStream(file).pipe(parser)
+  
+parser.on('data', function (data) {
+  called ++
+  it(data).deepEqual(expected)
+})
+
+parser.on('end', function () {
+  ended = true
+})
+
+process.on('exit', function () {
+  it(called).equal(1)
+  console.error('PASSED')
+})
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/JSONStream/test/two-ways.js
----------------------------------------------------------------------
diff --git a/node_modules/JSONStream/test/two-ways.js 
b/node_modules/JSONStream/test/two-ways.js
new file mode 100644
index 0000000..8f3b89c
--- /dev/null
+++ b/node_modules/JSONStream/test/two-ways.js
@@ -0,0 +1,41 @@
+
+var fs = require ('fs')
+  , join = require('path').join
+  , file = join(__dirname, 'fixtures','all_npm.json')
+  , JSONStream = require('../')
+  , it = require('it-is').style('colour')
+
+  function randomObj () {
+    return (
+      Math.random () < 0.4
+      ? {hello: 'eonuhckmqjk',
+          whatever: 236515,
+          lies: true,
+          nothing: [null],
+//          stuff: [Math.random(),Math.random(),Math.random()]
+        } 
+      : ['AOREC', 'reoubaor', {ouec: 62642}, [[[], {}, 53]]]
+    )
+  }
+
+var expected =  []
+  , stringify = JSONStream.stringify()
+  , es = require('event-stream')
+  , stringified = ''
+  , called = 0
+  , count = 10
+  , ended = false
+  
+while (count --)
+  expected.push(randomObj())
+
+  es.connect(
+    es.readArray(expected),
+    stringify,
+    JSONStream.parse([/./]),
+    es.writeArray(function (err, lines) {
+    
+      it(lines).has(expected)
+      console.error('PASSED')
+    })
+  )

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abab/CHANGELOG.md
----------------------------------------------------------------------
diff --git a/node_modules/abab/CHANGELOG.md b/node_modules/abab/CHANGELOG.md
new file mode 100644
index 0000000..3b16719
--- /dev/null
+++ b/node_modules/abab/CHANGELOG.md
@@ -0,0 +1,11 @@
+## 1.0.3
+
+- Replaced `let` with `var` in `lib/btoa.js`
+  - Follow up from `1.0.2`
+  - Resolves https://github.com/jsdom/abab/issues/18
+
+## 1.0.2
+
+- Replaced `const` with `var` in `index.js`
+  - Allows use of `abab` in the browser without a transpilation step
+  - Resolves https://github.com/jsdom/abab/issues/15

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abab/README.md
----------------------------------------------------------------------
diff --git a/node_modules/abab/README.md b/node_modules/abab/README.md
new file mode 100644
index 0000000..2d9c1b5
--- /dev/null
+++ b/node_modules/abab/README.md
@@ -0,0 +1,52 @@
+# abab
+
+[![npm 
version](https://badge.fury.io/js/abab.svg)](https://www.npmjs.com/package/abab)
 [![Build 
Status](https://travis-ci.org/jsdom/abab.svg?branch=master)](https://travis-ci.org/jsdom/abab)
+
+A module that implements `window.atob` and `window.btoa` according to the 
[WHATWG spec](https://html.spec.whatwg.org/multipage/webappapis.html#atob). The 
code is originally from 
[w3c/web-platform-tests](https://github.com/w3c/web-platform-tests/blob/master/html/webappapis/atob/base64.html).
+
+Compatibility: Node.js version 3+ and all major browsers (using browserify or 
webpack)
+
+Install with `npm`:
+
+```sh
+npm install abab
+```
+
+## API
+
+### `btoa` (base64 encode)
+
+```js
+const btoa = require('abab').btoa;
+btoa('Hello, world!'); // 'SGVsbG8sIHdvcmxkIQ=='
+```
+
+### `atob` (base64 decode)
+
+```js 
+const atob = require('abab').atob;
+atob('SGVsbG8sIHdvcmxkIQ=='); // 'Hello, world!'
+```
+
+#### Valid characters
+
+[Per the 
spec](https://html.spec.whatwg.org/multipage/webappapis.html#atob:dom-windowbase64-btoa-3),
 `btoa` will accept strings "containing only characters in the range `U+0000` 
to `U+00FF`." If passed a string with characters above `U+00FF`, `btoa` will 
return `null`. If `atob` is passed a string that is not base64-valid, it will 
also return `null`. In both cases when `null` is returned, the spec calls for 
throwing a `DOMException` of type `InvalidCharacterError`.
+
+## Browsers
+
+If you want to include just one of the methods to save bytes in your 
client-side code, you can `require` the desired module directly.
+
+```js
+var atob = require('abab/lib/atob');
+var btoa = require('abab/lib/btoa');
+```
+
+-----
+
+### Checklists
+
+If you're **submitting a PR** or **deploying to npm**, please use the 
[checklists in 
CONTRIBUTING.md](https://github.com/jsdom/abab/blob/master/CONTRIBUTING.md#checklists)
+
+### Remembering `atob` vs. `btoa`
+
+Here's a mnemonic that might be useful: if you have a plain string and want to 
base64 encode it, then decode it, `btoa` is what you run before (**b**efore - 
**b**toa), and `atob` is what you run after (**a**fter - **a**tob).

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abab/index.js
----------------------------------------------------------------------
diff --git a/node_modules/abab/index.js b/node_modules/abab/index.js
new file mode 100644
index 0000000..16342c4
--- /dev/null
+++ b/node_modules/abab/index.js
@@ -0,0 +1,9 @@
+'use strict';
+
+var atob = require('./lib/atob');
+var btoa = require('./lib/btoa');
+
+module.exports = {
+  atob: atob,
+  btoa: btoa
+};

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abab/lib/atob.js
----------------------------------------------------------------------
diff --git a/node_modules/abab/lib/atob.js b/node_modules/abab/lib/atob.js
new file mode 100644
index 0000000..ba2528f
--- /dev/null
+++ b/node_modules/abab/lib/atob.js
@@ -0,0 +1,109 @@
+'use strict';
+
+/**
+ * Implementation of atob() according to the HTML spec, except that instead of
+ * throwing INVALID_CHARACTER_ERR we return null.
+ */
+function atob(input) {
+  // WebIDL requires DOMStrings to just be converted using ECMAScript
+  // ToString, which in our case amounts to calling String().
+  input = String(input);
+  // "Remove all space characters from input."
+  input = input.replace(/[ \t\n\f\r]/g, '');
+  // "If the length of input divides by 4 leaving no remainder, then: if
+  // input ends with one or two U+003D EQUALS SIGN (=) characters, remove
+  // them from input."
+  if (input.length % 4 == 0 && /==?$/.test(input)) {
+    input = input.replace(/==?$/, '');
+  }
+  // "If the length of input divides by 4 leaving a remainder of 1, throw an
+  // INVALID_CHARACTER_ERR exception and abort these steps."
+  //
+  // "If input contains a character that is not in the following list of
+  // characters and character ranges, throw an INVALID_CHARACTER_ERR
+  // exception and abort these steps:
+  //
+  // U+002B PLUS SIGN (+)
+  // U+002F SOLIDUS (/)
+  // U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9)
+  // U+0041 LATIN CAPITAL LETTER A to U+005A LATIN CAPITAL LETTER Z
+  // U+0061 LATIN SMALL LETTER A to U+007A LATIN SMALL LETTER Z"
+  if (input.length % 4 == 1 || !/^[+/0-9A-Za-z]*$/.test(input)) {
+    return null;
+  }
+  // "Let output be a string, initially empty."
+  var output = '';
+  // "Let buffer be a buffer that can have bits appended to it, initially
+  // empty."
+  //
+  // We append bits via left-shift and or.  accumulatedBits is used to track
+  // when we've gotten to 24 bits.
+  var buffer = 0;
+  var accumulatedBits = 0;
+  // "While position does not point past the end of input, run these
+  // substeps:"
+  for (var i = 0; i < input.length; i++) {
+    // "Find the character pointed to by position in the first column of
+    // the following table. Let n be the number given in the second cell of
+    // the same row."
+    //
+    // "Append to buffer the six bits corresponding to number, most
+    // significant bit first."
+    //
+    // atobLookup() implements the table from the spec.
+    buffer <<= 6;
+    buffer |= atobLookup(input[i]);
+    // "If buffer has accumulated 24 bits, interpret them as three 8-bit
+    // big-endian numbers. Append the three characters with code points
+    // equal to those numbers to output, in the same order, and then empty
+    // buffer."
+    accumulatedBits += 6;
+    if (accumulatedBits == 24) {
+      output += String.fromCharCode((buffer & 0xff0000) >> 16);
+      output += String.fromCharCode((buffer & 0xff00) >> 8);
+      output += String.fromCharCode(buffer & 0xff);
+      buffer = accumulatedBits = 0;
+    }
+    // "Advance position by one character."
+  }
+  // "If buffer is not empty, it contains either 12 or 18 bits. If it
+  // contains 12 bits, discard the last four and interpret the remaining
+  // eight as an 8-bit big-endian number. If it contains 18 bits, discard the
+  // last two and interpret the remaining 16 as two 8-bit big-endian numbers.
+  // Append the one or two characters with code points equal to those one or
+  // two numbers to output, in the same order."
+  if (accumulatedBits == 12) {
+    buffer >>= 4;
+    output += String.fromCharCode(buffer);
+  } else if (accumulatedBits == 18) {
+    buffer >>= 2;
+    output += String.fromCharCode((buffer & 0xff00) >> 8);
+    output += String.fromCharCode(buffer & 0xff);
+  }
+  // "Return output."
+  return output;
+}
+/**
+ * A lookup table for atob(), which converts an ASCII character to the
+ * corresponding six-bit number.
+ */
+function atobLookup(chr) {
+  if (/[A-Z]/.test(chr)) {
+    return chr.charCodeAt(0) - 'A'.charCodeAt(0);
+  }
+  if (/[a-z]/.test(chr)) {
+    return chr.charCodeAt(0) - 'a'.charCodeAt(0) + 26;
+  }
+  if (/[0-9]/.test(chr)) {
+    return chr.charCodeAt(0) - '0'.charCodeAt(0) + 52;
+  }
+  if (chr == '+') {
+    return 62;
+  }
+  if (chr == '/') {
+    return 63;
+  }
+  // Throw exception; should not be hit in tests
+}
+
+module.exports = atob;

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abab/lib/btoa.js
----------------------------------------------------------------------
diff --git a/node_modules/abab/lib/btoa.js b/node_modules/abab/lib/btoa.js
new file mode 100644
index 0000000..bc5b665
--- /dev/null
+++ b/node_modules/abab/lib/btoa.js
@@ -0,0 +1,65 @@
+'use strict';
+
+/**
+ * btoa() as defined by the HTML5 spec, which mostly just references RFC4648.
+ */
+function btoa(s) {
+  var i;
+  // String conversion as required by WebIDL.
+  s = String(s);
+  // "The btoa() method must throw an INVALID_CHARACTER_ERR exception if the
+  // method's first argument contains any character whose code point is
+  // greater than U+00FF."
+  for (i = 0; i < s.length; i++) {
+    if (s.charCodeAt(i) > 255) {
+      return null;
+    }
+  }
+  var out = '';
+  for (i = 0; i < s.length; i += 3) {
+    var groupsOfSix = [undefined, undefined, undefined, undefined];
+    groupsOfSix[0] = s.charCodeAt(i) >> 2;
+    groupsOfSix[1] = (s.charCodeAt(i) & 0x03) << 4;
+    if (s.length > i + 1) {
+      groupsOfSix[1] |= s.charCodeAt(i + 1) >> 4;
+      groupsOfSix[2] = (s.charCodeAt(i + 1) & 0x0f) << 2;
+    }
+    if (s.length > i + 2) {
+      groupsOfSix[2] |= s.charCodeAt(i + 2) >> 6;
+      groupsOfSix[3] = s.charCodeAt(i + 2) & 0x3f;
+    }
+    for (var j = 0; j < groupsOfSix.length; j++) {
+      if (typeof groupsOfSix[j] == 'undefined') {
+        out += '=';
+      } else {
+        out += btoaLookup(groupsOfSix[j]);
+      }
+    }
+  }
+  return out;
+}
+
+/**
+ * Lookup table for btoa(), which converts a six-bit number into the
+ * corresponding ASCII character.
+ */
+function btoaLookup(idx) {
+  if (idx < 26) {
+    return String.fromCharCode(idx + 'A'.charCodeAt(0));
+  }
+  if (idx < 52) {
+    return String.fromCharCode(idx - 26 + 'a'.charCodeAt(0));
+  }
+  if (idx < 62) {
+    return String.fromCharCode(idx - 52 + '0'.charCodeAt(0));
+  }
+  if (idx == 62) {
+    return '+';
+  }
+  if (idx == 63) {
+    return '/';
+  }
+  // Throw INVALID_CHARACTER_ERR exception here -- won't be hit in the tests.
+}
+
+module.exports = btoa;

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abab/package.json
----------------------------------------------------------------------
diff --git a/node_modules/abab/package.json b/node_modules/abab/package.json
new file mode 100644
index 0000000..113fc5c
--- /dev/null
+++ b/node_modules/abab/package.json
@@ -0,0 +1,107 @@
+{
+  "_args": [
+    [
+      {
+        "raw": "abab@^1.0.0",
+        "scope": null,
+        "escapedName": "abab",
+        "name": "abab",
+        "rawSpec": "^1.0.0",
+        "spec": ">=1.0.0 <2.0.0",
+        "type": "range"
+      },
+      "/Users/yueguo/tmp/griffin-site/node_modules/jsdom"
+    ]
+  ],
+  "_from": "abab@>=1.0.0 <2.0.0",
+  "_id": "[email protected]",
+  "_inCache": true,
+  "_installable": true,
+  "_location": "/abab",
+  "_nodeVersion": "4.1.2",
+  "_npmUser": {
+    "name": "jeffcarp",
+    "email": "[email protected]"
+  },
+  "_npmVersion": "2.14.4",
+  "_phantomChildren": {},
+  "_requested": {
+    "raw": "abab@^1.0.0",
+    "scope": null,
+    "escapedName": "abab",
+    "name": "abab",
+    "rawSpec": "^1.0.0",
+    "spec": ">=1.0.0 <2.0.0",
+    "type": "range"
+  },
+  "_requiredBy": [
+    "/jsdom"
+  ],
+  "_resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz";,
+  "_shasum": "b81de5f7274ec4e756d797cd834f303642724e5d",
+  "_shrinkwrap": null,
+  "_spec": "abab@^1.0.0",
+  "_where": "/Users/yueguo/tmp/griffin-site/node_modules/jsdom",
+  "author": {
+    "name": "Jeff Carpenter",
+    "email": "[email protected]"
+  },
+  "bugs": {
+    "url": "https://github.com/jsdom/abab/issues";
+  },
+  "dependencies": {},
+  "description": "WHATWG spec-compliant implementations of window.atob and 
window.btoa.",
+  "devDependencies": {
+    "babel-core": "^6.1.4",
+    "babel-loader": "^6.1.0",
+    "babel-preset-es2015": "^6.1.4",
+    "eslint": "^1.3.1",
+    "jscs": "^2.1.1",
+    "karma": "^0.13.10",
+    "karma-cli": "^0.1.1",
+    "karma-firefox-launcher": "^0.1.6",
+    "karma-mocha": "^0.2.0",
+    "karma-sauce-launcher": "^0.2.14",
+    "karma-webpack": "^1.7.0",
+    "mocha": "^2.2.5",
+    "webpack": "^1.12.2"
+  },
+  "directories": {},
+  "dist": {
+    "shasum": "b81de5f7274ec4e756d797cd834f303642724e5d",
+    "tarball": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz";
+  },
+  "files": [
+    "index.js",
+    "lib/"
+  ],
+  "gitHead": "223c06f29e0e4d4f3bc11164f762898474158c3a",
+  "homepage": "https://github.com/jsdom/abab#readme";,
+  "keywords": [
+    "atob",
+    "btoa",
+    "browser"
+  ],
+  "license": "ISC",
+  "main": "index.js",
+  "maintainers": [
+    {
+      "name": "jeffcarp",
+      "email": "[email protected]"
+    }
+  ],
+  "name": "abab",
+  "optionalDependencies": {},
+  "readme": "ERROR: No README data found!",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jsdom/abab.git";
+  },
+  "scripts": {
+    "karma": "karma start",
+    "lint": "jscs . && eslint .",
+    "mocha": "mocha test/node",
+    "test": "npm run lint && npm run mocha && npm run karma"
+  },
+  "version": "1.0.3"
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abbrev/LICENSE
----------------------------------------------------------------------
diff --git a/node_modules/abbrev/LICENSE b/node_modules/abbrev/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/abbrev/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abbrev/README.md
----------------------------------------------------------------------
diff --git a/node_modules/abbrev/README.md b/node_modules/abbrev/README.md
new file mode 100644
index 0000000..99746fe
--- /dev/null
+++ b/node_modules/abbrev/README.md
@@ -0,0 +1,23 @@
+# abbrev-js
+
+Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).
+
+Usage:
+
+    var abbrev = require("abbrev");
+    abbrev("foo", "fool", "folding", "flop");
+    
+    // returns:
+    { fl: 'flop'
+    , flo: 'flop'
+    , flop: 'flop'
+    , fol: 'folding'
+    , fold: 'folding'
+    , foldi: 'folding'
+    , foldin: 'folding'
+    , folding: 'folding'
+    , foo: 'foo'
+    , fool: 'fool'
+    }
+
+This is handy for command-line scripts, or other cases where you want to be 
able to accept shorthands.

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abbrev/abbrev.js
----------------------------------------------------------------------
diff --git a/node_modules/abbrev/abbrev.js b/node_modules/abbrev/abbrev.js
new file mode 100644
index 0000000..7b1dc5d
--- /dev/null
+++ b/node_modules/abbrev/abbrev.js
@@ -0,0 +1,61 @@
+module.exports = exports = abbrev.abbrev = abbrev
+
+abbrev.monkeyPatch = monkeyPatch
+
+function monkeyPatch () {
+  Object.defineProperty(Array.prototype, 'abbrev', {
+    value: function () { return abbrev(this) },
+    enumerable: false, configurable: true, writable: true
+  })
+
+  Object.defineProperty(Object.prototype, 'abbrev', {
+    value: function () { return abbrev(Object.keys(this)) },
+    enumerable: false, configurable: true, writable: true
+  })
+}
+
+function abbrev (list) {
+  if (arguments.length !== 1 || !Array.isArray(list)) {
+    list = Array.prototype.slice.call(arguments, 0)
+  }
+  for (var i = 0, l = list.length, args = [] ; i < l ; i ++) {
+    args[i] = typeof list[i] === "string" ? list[i] : String(list[i])
+  }
+
+  // sort them lexicographically, so that they're next to their nearest kin
+  args = args.sort(lexSort)
+
+  // walk through each, seeing how much it has in common with the next and 
previous
+  var abbrevs = {}
+    , prev = ""
+  for (var i = 0, l = args.length ; i < l ; i ++) {
+    var current = args[i]
+      , next = args[i + 1] || ""
+      , nextMatches = true
+      , prevMatches = true
+    if (current === next) continue
+    for (var j = 0, cl = current.length ; j < cl ; j ++) {
+      var curChar = current.charAt(j)
+      nextMatches = nextMatches && curChar === next.charAt(j)
+      prevMatches = prevMatches && curChar === prev.charAt(j)
+      if (!nextMatches && !prevMatches) {
+        j ++
+        break
+      }
+    }
+    prev = current
+    if (j === cl) {
+      abbrevs[current] = current
+      continue
+    }
+    for (var a = current.substr(0, j) ; j <= cl ; j ++) {
+      abbrevs[a] = current
+      a += current.charAt(j)
+    }
+  }
+  return abbrevs
+}
+
+function lexSort (a, b) {
+  return a === b ? 0 : a > b ? 1 : -1
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/abbrev/package.json
----------------------------------------------------------------------
diff --git a/node_modules/abbrev/package.json b/node_modules/abbrev/package.json
new file mode 100644
index 0000000..ffe503b
--- /dev/null
+++ b/node_modules/abbrev/package.json
@@ -0,0 +1,95 @@
+{
+  "_args": [
+    [
+      {
+        "raw": "abbrev@^1.0.7",
+        "scope": null,
+        "escapedName": "abbrev",
+        "name": "abbrev",
+        "rawSpec": "^1.0.7",
+        "spec": ">=1.0.7 <2.0.0",
+        "type": "range"
+      },
+      "/Users/yueguo/tmp/griffin-site/node_modules/hexo"
+    ]
+  ],
+  "_from": "abbrev@>=1.0.7 <2.0.0",
+  "_id": "[email protected]",
+  "_inCache": true,
+  "_installable": true,
+  "_location": "/abbrev",
+  "_nodeVersion": "8.0.0-pre",
+  "_npmOperationalInternal": {
+    "host": "packages-12-west.internal.npmjs.com",
+    "tmp": "tmp/abbrev-1.1.0.tgz_1487054000015_0.9229173036292195"
+  },
+  "_npmUser": {
+    "name": "isaacs",
+    "email": "[email protected]"
+  },
+  "_npmVersion": "4.3.0",
+  "_phantomChildren": {},
+  "_requested": {
+    "raw": "abbrev@^1.0.7",
+    "scope": null,
+    "escapedName": "abbrev",
+    "name": "abbrev",
+    "rawSpec": "^1.0.7",
+    "spec": ">=1.0.7 <2.0.0",
+    "type": "range"
+  },
+  "_requiredBy": [
+    "/hexo",
+    "/hexo/hexo-cli",
+    "/nopt"
+  ],
+  "_resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz";,
+  "_shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f",
+  "_shrinkwrap": null,
+  "_spec": "abbrev@^1.0.7",
+  "_where": "/Users/yueguo/tmp/griffin-site/node_modules/hexo",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "[email protected]"
+  },
+  "bugs": {
+    "url": "https://github.com/isaacs/abbrev-js/issues";
+  },
+  "dependencies": {},
+  "description": "Like ruby's abbrev module, but in js",
+  "devDependencies": {
+    "tap": "^10.1"
+  },
+  "directories": {},
+  "dist": {
+    "shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f",
+    "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz";
+  },
+  "files": [
+    "abbrev.js"
+  ],
+  "gitHead": "7136d4d95449dc44115d4f78b80ec907724f64e0",
+  "homepage": "https://github.com/isaacs/abbrev-js#readme";,
+  "license": "ISC",
+  "main": "abbrev.js",
+  "maintainers": [
+    {
+      "name": "isaacs",
+      "email": "[email protected]"
+    }
+  ],
+  "name": "abbrev",
+  "optionalDependencies": {},
+  "readme": "ERROR: No README data found!",
+  "repository": {
+    "type": "git",
+    "url": "git+ssh://[email protected]/isaacs/abbrev-js.git"
+  },
+  "scripts": {
+    "postpublish": "git push origin --all; git push origin --tags",
+    "postversion": "npm publish",
+    "preversion": "npm test",
+    "test": "tap test.js --100"
+  },
+  "version": "1.1.0"
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/accepts/HISTORY.md
----------------------------------------------------------------------
diff --git a/node_modules/accepts/HISTORY.md b/node_modules/accepts/HISTORY.md
new file mode 100644
index 0000000..0477ed7
--- /dev/null
+++ b/node_modules/accepts/HISTORY.md
@@ -0,0 +1,212 @@
+1.3.3 / 2016-05-02
+==================
+
+  * deps: mime-types@~2.1.11
+    - deps: mime-db@~1.23.0
+  * deps: [email protected]
+    - perf: improve `Accept` parsing speed
+    - perf: improve `Accept-Charset` parsing speed
+    - perf: improve `Accept-Encoding` parsing speed
+    - perf: improve `Accept-Language` parsing speed
+
+1.3.2 / 2016-03-08
+==================
+
+  * deps: mime-types@~2.1.10
+    - Fix extension of `application/dash+xml`
+    - Update primary extension for `audio/mp4`
+    - deps: mime-db@~1.22.0
+
+1.3.1 / 2016-01-19
+==================
+
+  * deps: mime-types@~2.1.9
+    - deps: mime-db@~1.21.0
+
+1.3.0 / 2015-09-29
+==================
+
+  * deps: mime-types@~2.1.7
+    - deps: mime-db@~1.19.0
+  * deps: [email protected]
+    - Fix including type extensions in parameters in `Accept` parsing
+    - Fix parsing `Accept` parameters with quoted equals
+    - Fix parsing `Accept` parameters with quoted semicolons
+    - Lazy-load modules from main entry point
+    - perf: delay type concatenation until needed
+    - perf: enable strict mode
+    - perf: hoist regular expressions
+    - perf: remove closures getting spec properties
+    - perf: remove a closure from media type parsing
+    - perf: remove property delete from media type parsing
+
+1.2.13 / 2015-09-06
+===================
+
+  * deps: mime-types@~2.1.6
+    - deps: mime-db@~1.18.0
+
+1.2.12 / 2015-07-30
+===================
+
+  * deps: mime-types@~2.1.4
+    - deps: mime-db@~1.16.0
+
+1.2.11 / 2015-07-16
+===================
+
+  * deps: mime-types@~2.1.3
+    - deps: mime-db@~1.15.0
+
+1.2.10 / 2015-07-01
+===================
+
+  * deps: mime-types@~2.1.2
+    - deps: mime-db@~1.14.0
+
+1.2.9 / 2015-06-08
+==================
+
+  * deps: mime-types@~2.1.1
+    - perf: fix deopt during mapping
+
+1.2.8 / 2015-06-07
+==================
+
+  * deps: mime-types@~2.1.0
+    - deps: mime-db@~1.13.0
+  * perf: avoid argument reassignment & argument slice
+  * perf: avoid negotiator recursive construction
+  * perf: enable strict mode
+  * perf: remove unnecessary bitwise operator
+
+1.2.7 / 2015-05-10
+==================
+
+  * deps: [email protected]
+    - Fix media type parameter matching to be case-insensitive
+
+1.2.6 / 2015-05-07
+==================
+
+  * deps: mime-types@~2.0.11
+    - deps: mime-db@~1.9.1
+  * deps: [email protected]
+    - Fix comparing media types with quoted values
+    - Fix splitting media types with quoted commas
+
+1.2.5 / 2015-03-13
+==================
+
+  * deps: mime-types@~2.0.10
+    - deps: mime-db@~1.8.0
+
+1.2.4 / 2015-02-14
+==================
+
+  * Support Node.js 0.6
+  * deps: mime-types@~2.0.9
+    - deps: mime-db@~1.7.0
+  * deps: [email protected]
+    - Fix preference sorting to be stable for long acceptable lists
+
+1.2.3 / 2015-01-31
+==================
+
+  * deps: mime-types@~2.0.8
+    - deps: mime-db@~1.6.0
+
+1.2.2 / 2014-12-30
+==================
+
+  * deps: mime-types@~2.0.7
+    - deps: mime-db@~1.5.0
+
+1.2.1 / 2014-12-30
+==================
+
+  * deps: mime-types@~2.0.5
+    - deps: mime-db@~1.3.1
+
+1.2.0 / 2014-12-19
+==================
+
+  * deps: [email protected]
+    - Fix list return order when large accepted list
+    - Fix missing identity encoding when q=0 exists
+    - Remove dynamic building of Negotiator class
+
+1.1.4 / 2014-12-10
+==================
+
+  * deps: mime-types@~2.0.4
+    - deps: mime-db@~1.3.0
+
+1.1.3 / 2014-11-09
+==================
+
+  * deps: mime-types@~2.0.3
+    - deps: mime-db@~1.2.0
+
+1.1.2 / 2014-10-14
+==================
+
+  * deps: [email protected]
+    - Fix error when media type has invalid parameter
+
+1.1.1 / 2014-09-28
+==================
+
+  * deps: mime-types@~2.0.2
+    - deps: mime-db@~1.1.0
+  * deps: [email protected]
+    - Fix all negotiations to be case-insensitive
+    - Stable sort preferences of same quality according to client order
+
+1.1.0 / 2014-09-02
+==================
+
+  * update `mime-types`
+
+1.0.7 / 2014-07-04
+==================
+
+  * Fix wrong type returned from `type` when match after unknown extension
+
+1.0.6 / 2014-06-24
+==================
+
+  * deps: [email protected]
+
+1.0.5 / 2014-06-20
+==================
+
+ * fix crash when unknown extension given
+
+1.0.4 / 2014-06-19
+==================
+
+  * use `mime-types`
+
+1.0.3 / 2014-06-11
+==================
+
+  * deps: [email protected]
+    - Order by specificity when quality is the same
+
+1.0.2 / 2014-05-29
+==================
+
+  * Fix interpretation when header not in request
+  * deps: pin [email protected]
+
+1.0.1 / 2014-01-18
+==================
+
+  * Identity encoding isn't always acceptable
+  * deps: negotiator@~0.4.0
+
+1.0.0 / 2013-12-27
+==================
+
+  * Genesis

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/accepts/LICENSE
----------------------------------------------------------------------
diff --git a/node_modules/accepts/LICENSE b/node_modules/accepts/LICENSE
new file mode 100644
index 0000000..0616607
--- /dev/null
+++ b/node_modules/accepts/LICENSE
@@ -0,0 +1,23 @@
+(The MIT License)
+
+Copyright (c) 2014 Jonathan Ong <[email protected]>
+Copyright (c) 2015 Douglas Christopher Wilson <[email protected]>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/accepts/README.md
----------------------------------------------------------------------
diff --git a/node_modules/accepts/README.md b/node_modules/accepts/README.md
new file mode 100644
index 0000000..ae36676
--- /dev/null
+++ b/node_modules/accepts/README.md
@@ -0,0 +1,135 @@
+# accepts
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Node.js Version][node-version-image]][node-version-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+Higher level content negotiation based on 
[negotiator](https://www.npmjs.com/package/negotiator). Extracted from 
[koa](https://www.npmjs.com/package/koa) for general use.
+
+In addition to negotiator, it allows:
+
+- Allows types as an array or arguments list, ie `(['text/html', 
'application/json'])` as well as `('text/html', 'application/json')`.
+- Allows type shorthands such as `json`.
+- Returns `false` when no types match
+- Treats non-existent headers as `*`
+
+## Installation
+
+```sh
+npm install accepts
+```
+
+## API
+
+```js
+var accepts = require('accepts')
+```
+
+### accepts(req)
+
+Create a new `Accepts` object for the given `req`.
+
+#### .charset(charsets)
+
+Return the first accepted charset. If nothing in `charsets` is accepted,
+then `false` is returned.
+
+#### .charsets()
+
+Return the charsets that the request accepts, in the order of the client's
+preference (most preferred first).
+
+#### .encoding(encodings)
+
+Return the first accepted encoding. If nothing in `encodings` is accepted,
+then `false` is returned.
+
+#### .encodings()
+
+Return the encodings that the request accepts, in the order of the client's
+preference (most preferred first).
+
+#### .language(languages)
+
+Return the first accepted language. If nothing in `languages` is accepted,
+then `false` is returned.
+
+#### .languages()
+
+Return the languages that the request accepts, in the order of the client's
+preference (most preferred first).
+
+#### .type(types)
+
+Return the first accepted type (and it is returned as the same text as what
+appears in the `types` array). If nothing in `types` is accepted, then `false`
+is returned.
+
+The `types` array can contain full MIME types or file extensions. Any value
+that is not a full MIME types is passed to `require('mime-types').lookup`.
+
+#### .types()
+
+Return the types that the request accepts, in the order of the client's
+preference (most preferred first).
+
+## Examples
+
+### Simple type negotiation
+
+This simple example shows how to use `accepts` to return a different typed
+respond body based on what the client wants to accept. The server lists it's
+preferences in order and will get back the best match between the client and
+server.
+
+```js
+var accepts = require('accepts')
+var http = require('http')
+
+function app(req, res) {
+  var accept = accepts(req)
+
+  // the order of this list is significant; should be server preferred order
+  switch(accept.type(['json', 'html'])) {
+    case 'json':
+      res.setHeader('Content-Type', 'application/json')
+      res.write('{"hello":"world!"}')
+      break
+    case 'html':
+      res.setHeader('Content-Type', 'text/html')
+      res.write('<b>hello, world!</b>')
+      break
+    default:
+      // the fallback is text/plain, so no need to specify it above
+      res.setHeader('Content-Type', 'text/plain')
+      res.write('hello, world!')
+      break
+  }
+
+  res.end()
+}
+
+http.createServer(app).listen(3000)
+```
+
+You can test this out with the cURL program:
+```sh
+curl -I -H'Accept: text/html' http://localhost:3000/
+```
+
+## License
+
+[MIT](LICENSE)
+
+[npm-image]: https://img.shields.io/npm/v/accepts.svg
+[npm-url]: https://npmjs.org/package/accepts
+[node-version-image]: https://img.shields.io/node/v/accepts.svg
+[node-version-url]: http://nodejs.org/download/
+[travis-image]: https://img.shields.io/travis/jshttp/accepts/master.svg
+[travis-url]: https://travis-ci.org/jshttp/accepts
+[coveralls-image]: https://img.shields.io/coveralls/jshttp/accepts/master.svg
+[coveralls-url]: https://coveralls.io/r/jshttp/accepts
+[downloads-image]: https://img.shields.io/npm/dm/accepts.svg
+[downloads-url]: https://npmjs.org/package/accepts

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/accepts/index.js
----------------------------------------------------------------------
diff --git a/node_modules/accepts/index.js b/node_modules/accepts/index.js
new file mode 100644
index 0000000..e80192a
--- /dev/null
+++ b/node_modules/accepts/index.js
@@ -0,0 +1,231 @@
+/*!
+ * accepts
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var Negotiator = require('negotiator')
+var mime = require('mime-types')
+
+/**
+ * Module exports.
+ * @public
+ */
+
+module.exports = Accepts
+
+/**
+ * Create a new Accepts object for the given req.
+ *
+ * @param {object} req
+ * @public
+ */
+
+function Accepts(req) {
+  if (!(this instanceof Accepts))
+    return new Accepts(req)
+
+  this.headers = req.headers
+  this.negotiator = new Negotiator(req)
+}
+
+/**
+ * Check if the given `type(s)` is acceptable, returning
+ * the best match when true, otherwise `undefined`, in which
+ * case you should respond with 406 "Not Acceptable".
+ *
+ * The `type` value may be a single mime type string
+ * such as "application/json", the extension name
+ * such as "json" or an array `["json", "html", "text/plain"]`. When a list
+ * or array is given the _best_ match, if any is returned.
+ *
+ * Examples:
+ *
+ *     // Accept: text/html
+ *     this.types('html');
+ *     // => "html"
+ *
+ *     // Accept: text/*, application/json
+ *     this.types('html');
+ *     // => "html"
+ *     this.types('text/html');
+ *     // => "text/html"
+ *     this.types('json', 'text');
+ *     // => "json"
+ *     this.types('application/json');
+ *     // => "application/json"
+ *
+ *     // Accept: text/*, application/json
+ *     this.types('image/png');
+ *     this.types('png');
+ *     // => undefined
+ *
+ *     // Accept: text/*;q=.5, application/json
+ *     this.types(['html', 'json']);
+ *     this.types('html', 'json');
+ *     // => "json"
+ *
+ * @param {String|Array} types...
+ * @return {String|Array|Boolean}
+ * @public
+ */
+
+Accepts.prototype.type =
+Accepts.prototype.types = function (types_) {
+  var types = types_
+
+  // support flattened arguments
+  if (types && !Array.isArray(types)) {
+    types = new Array(arguments.length)
+    for (var i = 0; i < types.length; i++) {
+      types[i] = arguments[i]
+    }
+  }
+
+  // no types, return all requested types
+  if (!types || types.length === 0) {
+    return this.negotiator.mediaTypes()
+  }
+
+  if (!this.headers.accept) return types[0];
+  var mimes = types.map(extToMime);
+  var accepts = this.negotiator.mediaTypes(mimes.filter(validMime));
+  var first = accepts[0];
+  if (!first) return false;
+  return types[mimes.indexOf(first)];
+}
+
+/**
+ * Return accepted encodings or best fit based on `encodings`.
+ *
+ * Given `Accept-Encoding: gzip, deflate`
+ * an array sorted by quality is returned:
+ *
+ *     ['gzip', 'deflate']
+ *
+ * @param {String|Array} encodings...
+ * @return {String|Array}
+ * @public
+ */
+
+Accepts.prototype.encoding =
+Accepts.prototype.encodings = function (encodings_) {
+  var encodings = encodings_
+
+  // support flattened arguments
+  if (encodings && !Array.isArray(encodings)) {
+    encodings = new Array(arguments.length)
+    for (var i = 0; i < encodings.length; i++) {
+      encodings[i] = arguments[i]
+    }
+  }
+
+  // no encodings, return all requested encodings
+  if (!encodings || encodings.length === 0) {
+    return this.negotiator.encodings()
+  }
+
+  return this.negotiator.encodings(encodings)[0] || false
+}
+
+/**
+ * Return accepted charsets or best fit based on `charsets`.
+ *
+ * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
+ * an array sorted by quality is returned:
+ *
+ *     ['utf-8', 'utf-7', 'iso-8859-1']
+ *
+ * @param {String|Array} charsets...
+ * @return {String|Array}
+ * @public
+ */
+
+Accepts.prototype.charset =
+Accepts.prototype.charsets = function (charsets_) {
+  var charsets = charsets_
+
+  // support flattened arguments
+  if (charsets && !Array.isArray(charsets)) {
+    charsets = new Array(arguments.length)
+    for (var i = 0; i < charsets.length; i++) {
+      charsets[i] = arguments[i]
+    }
+  }
+
+  // no charsets, return all requested charsets
+  if (!charsets || charsets.length === 0) {
+    return this.negotiator.charsets()
+  }
+
+  return this.negotiator.charsets(charsets)[0] || false
+}
+
+/**
+ * Return accepted languages or best fit based on `langs`.
+ *
+ * Given `Accept-Language: en;q=0.8, es, pt`
+ * an array sorted by quality is returned:
+ *
+ *     ['es', 'pt', 'en']
+ *
+ * @param {String|Array} langs...
+ * @return {Array|String}
+ * @public
+ */
+
+Accepts.prototype.lang =
+Accepts.prototype.langs =
+Accepts.prototype.language =
+Accepts.prototype.languages = function (languages_) {
+  var languages = languages_
+
+  // support flattened arguments
+  if (languages && !Array.isArray(languages)) {
+    languages = new Array(arguments.length)
+    for (var i = 0; i < languages.length; i++) {
+      languages[i] = arguments[i]
+    }
+  }
+
+  // no languages, return all requested languages
+  if (!languages || languages.length === 0) {
+    return this.negotiator.languages()
+  }
+
+  return this.negotiator.languages(languages)[0] || false
+}
+
+/**
+ * Convert extnames to mime.
+ *
+ * @param {String} type
+ * @return {String}
+ * @private
+ */
+
+function extToMime(type) {
+  return type.indexOf('/') === -1
+    ? mime.lookup(type)
+    : type
+}
+
+/**
+ * Check if mime is valid.
+ *
+ * @param {String} type
+ * @return {String}
+ * @private
+ */
+
+function validMime(type) {
+  return typeof type === 'string';
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/accepts/package.json
----------------------------------------------------------------------
diff --git a/node_modules/accepts/package.json 
b/node_modules/accepts/package.json
new file mode 100644
index 0000000..395c24d
--- /dev/null
+++ b/node_modules/accepts/package.json
@@ -0,0 +1,113 @@
+{
+  "_args": [
+    [
+      {
+        "raw": "accepts@~1.3.3",
+        "scope": null,
+        "escapedName": "accepts",
+        "name": "accepts",
+        "rawSpec": "~1.3.3",
+        "spec": ">=1.3.3 <1.4.0",
+        "type": "range"
+      },
+      "/Users/yueguo/tmp/griffin-site/node_modules/compression"
+    ]
+  ],
+  "_from": "accepts@>=1.3.3 <1.4.0",
+  "_id": "[email protected]",
+  "_inCache": true,
+  "_installable": true,
+  "_location": "/accepts",
+  "_nodeVersion": "4.4.3",
+  "_npmOperationalInternal": {
+    "host": "packages-16-east.internal.npmjs.com",
+    "tmp": "tmp/accepts-1.3.3.tgz_1462251932032_0.7092335098423064"
+  },
+  "_npmUser": {
+    "name": "dougwilson",
+    "email": "[email protected]"
+  },
+  "_npmVersion": "2.15.1",
+  "_phantomChildren": {},
+  "_requested": {
+    "raw": "accepts@~1.3.3",
+    "scope": null,
+    "escapedName": "accepts",
+    "name": "accepts",
+    "rawSpec": "~1.3.3",
+    "spec": ">=1.3.3 <1.4.0",
+    "type": "range"
+  },
+  "_requiredBy": [
+    "/compression"
+  ],
+  "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz";,
+  "_shasum": "c3ca7434938648c3e0d9c1e328dd68b622c284ca",
+  "_shrinkwrap": null,
+  "_spec": "accepts@~1.3.3",
+  "_where": "/Users/yueguo/tmp/griffin-site/node_modules/compression",
+  "bugs": {
+    "url": "https://github.com/jshttp/accepts/issues";
+  },
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "[email protected]"
+    },
+    {
+      "name": "Jonathan Ong",
+      "email": "[email protected]",
+      "url": "http://jongleberry.com";
+    }
+  ],
+  "dependencies": {
+    "mime-types": "~2.1.11",
+    "negotiator": "0.6.1"
+  },
+  "description": "Higher-level content negotiation",
+  "devDependencies": {
+    "istanbul": "0.4.3",
+    "mocha": "~1.21.5"
+  },
+  "directories": {},
+  "dist": {
+    "shasum": "c3ca7434938648c3e0d9c1e328dd68b622c284ca",
+    "tarball": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz";
+  },
+  "engines": {
+    "node": ">= 0.6"
+  },
+  "files": [
+    "LICENSE",
+    "HISTORY.md",
+    "index.js"
+  ],
+  "gitHead": "3e925b1e65ed7da2798849683d49814680dfa426",
+  "homepage": "https://github.com/jshttp/accepts#readme";,
+  "keywords": [
+    "content",
+    "negotiation",
+    "accept",
+    "accepts"
+  ],
+  "license": "MIT",
+  "maintainers": [
+    {
+      "name": "dougwilson",
+      "email": "[email protected]"
+    }
+  ],
+  "name": "accepts",
+  "optionalDependencies": {},
+  "readme": "ERROR: No README data found!",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jshttp/accepts.git";
+  },
+  "scripts": {
+    "test": "mocha --reporter spec --check-leaks --bail test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter 
dot --check-leaks test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report 
lcovonly -- --reporter spec --check-leaks test/"
+  },
+  "version": "1.3.3"
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn-globals/LICENSE
----------------------------------------------------------------------
diff --git a/node_modules/acorn-globals/LICENSE 
b/node_modules/acorn-globals/LICENSE
new file mode 100644
index 0000000..27cc9f3
--- /dev/null
+++ b/node_modules/acorn-globals/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 Forbes Lindesay
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn-globals/README.md
----------------------------------------------------------------------
diff --git a/node_modules/acorn-globals/README.md 
b/node_modules/acorn-globals/README.md
new file mode 100644
index 0000000..d8cd372
--- /dev/null
+++ b/node_modules/acorn-globals/README.md
@@ -0,0 +1,76 @@
+# acorn-globals
+
+Detect global variables in JavaScript using acorn
+
+[![Build 
Status](https://img.shields.io/travis/ForbesLindesay/acorn-globals/master.svg)](https://travis-ci.org/ForbesLindesay/acorn-globals)
+[![Dependency 
Status](https://img.shields.io/david/ForbesLindesay/acorn-globals.svg)](https://david-dm.org/ForbesLindesay/acorn-globals)
+[![NPM 
version](https://img.shields.io/npm/v/acorn-globals.svg)](https://www.npmjs.org/package/acorn-globals)
+
+## Installation
+
+    npm install acorn-globals
+
+## Usage
+
+detect.js
+
+```js
+var fs = require('fs');
+var detect = require('acorn-globals');
+
+var src = fs.readFileSync(__dirname + '/input.js', 'utf8');
+
+var scope = detect(src);
+console.dir(scope);
+```
+
+input.js
+
+```js
+var x = 5;
+var y = 3, z = 2;
+
+w.foo();
+w = 2;
+
+RAWR=444;
+RAWR.foo();
+
+BLARG=3;
+
+foo(function () {
+    var BAR = 3;
+    process.nextTick(function (ZZZZZZZZZZZZ) {
+        console.log('beep boop');
+        var xyz = 4;
+        x += 10;
+        x.zzzzzz;
+        ZZZ=6;
+    });
+    function doom () {
+    }
+    ZZZ.foo();
+
+});
+
+console.log(xyz);
+```
+
+output:
+
+```
+$ node example/detect.js
+[ { name: 'BLARG', nodes: [ [Object] ] },
+  { name: 'RAWR', nodes: [ [Object], [Object] ] },
+  { name: 'ZZZ', nodes: [ [Object], [Object] ] },
+  { name: 'console', nodes: [ [Object], [Object] ] },
+  { name: 'foo', nodes: [ [Object] ] },
+  { name: 'process', nodes: [ [Object] ] },
+  { name: 'w', nodes: [ [Object], [Object] ] },
+  { name: 'xyz', nodes: [ [Object] ] } ]
+```
+
+
+## License
+
+  MIT

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn-globals/index.js
----------------------------------------------------------------------
diff --git a/node_modules/acorn-globals/index.js 
b/node_modules/acorn-globals/index.js
new file mode 100644
index 0000000..ff924c9
--- /dev/null
+++ b/node_modules/acorn-globals/index.js
@@ -0,0 +1,180 @@
+'use strict';
+
+var acorn = require('acorn');
+var walk = require('acorn/dist/walk');
+
+function isScope(node) {
+  return node.type === 'FunctionExpression' || node.type === 
'FunctionDeclaration' || node.type === 'ArrowFunctionExpression' || node.type 
=== 'Program';
+}
+function isBlockScope(node) {
+  return node.type === 'BlockStatement' || isScope(node);
+}
+
+function declaresArguments(node) {
+  return node.type === 'FunctionExpression' || node.type === 
'FunctionDeclaration';
+}
+
+function declaresThis(node) {
+  return node.type === 'FunctionExpression' || node.type === 
'FunctionDeclaration';
+}
+
+function reallyParse(source) {
+  try {
+    return acorn.parse(source, {
+      ecmaVersion: 6,
+      allowReturnOutsideFunction: true,
+      allowImportExportEverywhere: true,
+      allowHashBang: true
+    });
+  } catch (ex) {
+    return acorn.parse(source, {
+      ecmaVersion: 5,
+      allowReturnOutsideFunction: true,
+      allowImportExportEverywhere: true,
+      allowHashBang: true
+    });
+  }
+}
+module.exports = findGlobals;
+module.exports.parse = reallyParse;
+function findGlobals(source) {
+  var globals = [];
+  var ast;
+  // istanbul ignore else
+  if (typeof source === 'string') {
+    ast = reallyParse(source);
+  } else {
+    ast = source;
+  }
+  // istanbul ignore if
+  if (!(ast && typeof ast === 'object' && ast.type === 'Program')) {
+    throw new TypeError('Source must be either a string of JavaScript or an 
acorn AST');
+  }
+  var declareFunction = function (node) {
+    var fn = node;
+    fn.locals = fn.locals || {};
+    node.params.forEach(function (node) {
+      declarePattern(node, fn);
+    });
+    if (node.id) {
+      fn.locals[node.id.name] = true;
+    }
+  }
+  var declarePattern = function (node, parent) {
+    switch (node.type) {
+      case 'Identifier':
+        parent.locals[node.name] = true;
+        break;
+      case 'ObjectPattern':
+        node.properties.forEach(function (node) {
+          declarePattern(node.value, parent);
+        });
+        break;
+      case 'ArrayPattern':
+        node.elements.forEach(function (node) {
+          if (node) declarePattern(node, parent);
+        });
+        break;
+      case 'RestElement':
+        declarePattern(node.argument, parent);
+        break;
+      case 'AssignmentPattern':
+        declarePattern(node.left, parent);
+        break;
+      // istanbul ignore next
+      default:
+        throw new Error('Unrecognized pattern type: ' + node.type);
+    }
+  }
+  var declareModuleSpecifier = function (node, parents) {
+    ast.locals = ast.locals || {};
+    ast.locals[node.local.name] = true;
+  }
+  walk.ancestor(ast, {
+    'VariableDeclaration': function (node, parents) {
+      var parent = null;
+      for (var i = parents.length - 1; i >= 0 && parent === null; i--) {
+        if (node.kind === 'var' ? isScope(parents[i]) : 
isBlockScope(parents[i])) {
+          parent = parents[i];
+        }
+      }
+      parent.locals = parent.locals || {};
+      node.declarations.forEach(function (declaration) {
+        declarePattern(declaration.id, parent);
+      });
+    },
+    'FunctionDeclaration': function (node, parents) {
+      var parent = null;
+      for (var i = parents.length - 2; i >= 0 && parent === null; i--) {
+        if (isScope(parents[i])) {
+          parent = parents[i];
+        }
+      }
+      parent.locals = parent.locals || {};
+      parent.locals[node.id.name] = true;
+      declareFunction(node);
+    },
+    'Function': declareFunction,
+    'ClassDeclaration': function (node, parents) {
+      var parent = null;
+      for (var i = parents.length - 2; i >= 0 && parent === null; i--) {
+        if (isScope(parents[i])) {
+          parent = parents[i];
+        }
+      }
+      parent.locals = parent.locals || {};
+      parent.locals[node.id.name] = true;
+    },
+    'TryStatement': function (node) {
+      if (node.handler === null) return;
+      node.handler.body.locals = node.handler.body.locals || {};
+      node.handler.body.locals[node.handler.param.name] = true;
+    },
+    'ImportDefaultSpecifier': declareModuleSpecifier,
+    'ImportSpecifier': declareModuleSpecifier,
+    'ImportNamespaceSpecifier': declareModuleSpecifier
+  });
+  function identifier(node, parents) {
+    var name = node.name;
+    if (name === 'undefined') return;
+    for (var i = 0; i < parents.length; i++) {
+      if (name === 'arguments' && declaresArguments(parents[i])) {
+        return;
+      }
+      if (parents[i].locals && name in parents[i].locals) {
+        return;
+      }
+    }
+    if (
+      parents[parents.length - 2] &&
+      parents[parents.length - 2].type === 'TryStatement' &&
+      parents[parents.length - 2].handler &&
+      node === parents[parents.length - 2].handler.param
+    ) {
+      return;
+    }
+    node.parents = parents;
+    globals.push(node);
+  }
+  walk.ancestor(ast, {
+    'VariablePattern': identifier,
+    'Identifier': identifier,
+    'ThisExpression': function (node, parents) {
+      for (var i = 0; i < parents.length; i++) {
+        if (declaresThis(parents[i])) {
+          return;
+        }
+      }
+      node.parents = parents;
+      globals.push(node);
+    }
+  });
+  var groupedGlobals = {};
+  globals.forEach(function (node) {
+    groupedGlobals[node.name] = (groupedGlobals[node.name] || []);
+    groupedGlobals[node.name].push(node);
+  });
+  return Object.keys(groupedGlobals).sort().map(function (name) {
+    return {name: name, nodes: groupedGlobals[name]};
+  });
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn-globals/package.json
----------------------------------------------------------------------
diff --git a/node_modules/acorn-globals/package.json 
b/node_modules/acorn-globals/package.json
new file mode 100644
index 0000000..9b1532b
--- /dev/null
+++ b/node_modules/acorn-globals/package.json
@@ -0,0 +1,101 @@
+{
+  "_args": [
+    [
+      {
+        "raw": "acorn-globals@^1.0.4",
+        "scope": null,
+        "escapedName": "acorn-globals",
+        "name": "acorn-globals",
+        "rawSpec": "^1.0.4",
+        "spec": ">=1.0.4 <2.0.0",
+        "type": "range"
+      },
+      "/Users/yueguo/tmp/griffin-site/node_modules/jsdom"
+    ]
+  ],
+  "_from": "acorn-globals@>=1.0.4 <2.0.0",
+  "_id": "[email protected]",
+  "_inCache": true,
+  "_installable": true,
+  "_location": "/acorn-globals",
+  "_nodeVersion": "1.6.2",
+  "_npmUser": {
+    "name": "forbeslindesay",
+    "email": "[email protected]"
+  },
+  "_npmVersion": "2.7.1",
+  "_phantomChildren": {},
+  "_requested": {
+    "raw": "acorn-globals@^1.0.4",
+    "scope": null,
+    "escapedName": "acorn-globals",
+    "name": "acorn-globals",
+    "rawSpec": "^1.0.4",
+    "spec": ">=1.0.4 <2.0.0",
+    "type": "range"
+  },
+  "_requiredBy": [
+    "/jsdom"
+  ],
+  "_resolved": 
"https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz";,
+  "_shasum": "55bb5e98691507b74579d0513413217c380c54cf",
+  "_shrinkwrap": null,
+  "_spec": "acorn-globals@^1.0.4",
+  "_where": "/Users/yueguo/tmp/griffin-site/node_modules/jsdom",
+  "author": {
+    "name": "ForbesLindesay"
+  },
+  "bugs": {
+    "url": "https://github.com/ForbesLindesay/acorn-globals/issues";
+  },
+  "dependencies": {
+    "acorn": "^2.1.0"
+  },
+  "description": "Detect global variables in JavaScript using acorn",
+  "devDependencies": {
+    "testit": "^2.0.2"
+  },
+  "directories": {},
+  "dist": {
+    "shasum": "55bb5e98691507b74579d0513413217c380c54cf",
+    "tarball": 
"https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz";
+  },
+  "files": [
+    "index.js",
+    "LICENSE"
+  ],
+  "gitHead": "808cab09764b63679138b012602ca1bb51657f97",
+  "homepage": "https://github.com/ForbesLindesay/acorn-globals";,
+  "keywords": [
+    "ast",
+    "variable",
+    "name",
+    "lexical",
+    "scope",
+    "local",
+    "global",
+    "implicit"
+  ],
+  "license": "MIT",
+  "maintainers": [
+    {
+      "name": "forbeslindesay",
+      "email": "[email protected]"
+    },
+    {
+      "name": "timothygu",
+      "email": "[email protected]"
+    }
+  ],
+  "name": "acorn-globals",
+  "optionalDependencies": {},
+  "readme": "ERROR: No README data found!",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/ForbesLindesay/acorn-globals.git";
+  },
+  "scripts": {
+    "test": "node test"
+  },
+  "version": "1.0.9"
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn/.editorconfig
----------------------------------------------------------------------
diff --git a/node_modules/acorn/.editorconfig b/node_modules/acorn/.editorconfig
new file mode 100644
index 0000000..c14d5c6
--- /dev/null
+++ b/node_modules/acorn/.editorconfig
@@ -0,0 +1,7 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn/.gitattributes
----------------------------------------------------------------------
diff --git a/node_modules/acorn/.gitattributes 
b/node_modules/acorn/.gitattributes
new file mode 100644
index 0000000..fcadb2c
--- /dev/null
+++ b/node_modules/acorn/.gitattributes
@@ -0,0 +1 @@
+* text eol=lf

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn/.npmignore
----------------------------------------------------------------------
diff --git a/node_modules/acorn/.npmignore b/node_modules/acorn/.npmignore
new file mode 100644
index 0000000..ecba291
--- /dev/null
+++ b/node_modules/acorn/.npmignore
@@ -0,0 +1,3 @@
+/.tern-port
+/test
+/local

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn/.tern-project
----------------------------------------------------------------------
diff --git a/node_modules/acorn/.tern-project b/node_modules/acorn/.tern-project
new file mode 100644
index 0000000..6718ce0
--- /dev/null
+++ b/node_modules/acorn/.tern-project
@@ -0,0 +1,6 @@
+{
+  "plugins": {
+    "node": true,
+    "es_modules": true
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn/.travis.yml
----------------------------------------------------------------------
diff --git a/node_modules/acorn/.travis.yml b/node_modules/acorn/.travis.yml
new file mode 100644
index 0000000..f50c379
--- /dev/null
+++ b/node_modules/acorn/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+sudo: false
+node_js:
+  - '0.10'
+  - '0.12'
+  - '4'

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn/AUTHORS
----------------------------------------------------------------------
diff --git a/node_modules/acorn/AUTHORS b/node_modules/acorn/AUTHORS
new file mode 100644
index 0000000..0e8f48b
--- /dev/null
+++ b/node_modules/acorn/AUTHORS
@@ -0,0 +1,43 @@
+List of Acorn contributors. Updated before every release.
+
+Adrian Rakovsky
+Alistair Braidwood
+Andres Suarez
+Aparajita Fishman
+Arian Stolwijk
+Artem Govorov
+Brandon Mills
+Charles Hughes
+Conrad Irwin
+David Bonnet
+ForbesLindesay
+Forbes Lindesay
+Gilad Peleg
+impinball
+Ingvar Stepanyan
+Jesse McCarthy
+Jiaxing Wang
+Joel Kemp
+Johannes Herr
+Jürg Lehni
+keeyipchan
+Kevin Kwok
+krator
+Marijn Haverbeke
+Martin Carlberg
+Mathias Bynens
+Mathieu 'p01' Henri
+Max Schaefer
+Max Zerzouri
+Mihai Bazon
+Mike Rennie
+Nick Fitzgerald
+Oskar Schöldström
+Paul Harper
+Peter Rust
+PlNG
+r-e-d
+Rich Harris
+Sebastian McKenzie
+Timothy Gu
+zsjforcn

http://git-wip-us.apache.org/repos/asf/incubator-griffin-site/blob/4f8fa326/node_modules/acorn/LICENSE
----------------------------------------------------------------------
diff --git a/node_modules/acorn/LICENSE b/node_modules/acorn/LICENSE
new file mode 100644
index 0000000..d4c7fc5
--- /dev/null
+++ b/node_modules/acorn/LICENSE
@@ -0,0 +1,19 @@
+Copyright (C) 2012-2014 by various contributors (see AUTHORS)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

Reply via email to